|
|
#!/bin/bash |
|
|
|
|
|
|
|
|
|
|
|
set -e |
|
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" |
|
|
OPS_DIR="$PROJECT_ROOT/ops" |
|
|
ENV_TUNNEL="$OPS_DIR/.env.tunnel" |
|
|
|
|
|
|
|
|
GREEN='\033[0;32m' |
|
|
YELLOW='\033[1;33m' |
|
|
RED='\033[0;31m' |
|
|
NC='\033[0m' |
|
|
|
|
|
log() { |
|
|
echo -e "${GREEN}[DB-START]${NC} $1" |
|
|
} |
|
|
|
|
|
warn() { |
|
|
echo -e "${YELLOW}[DB-START]${NC} $1" |
|
|
} |
|
|
|
|
|
error() { |
|
|
echo -e "${RED}[DB-START]${NC} $1" |
|
|
} |
|
|
|
|
|
|
|
|
if [ -f "$PROJECT_ROOT/.env" ]; then |
|
|
source "$PROJECT_ROOT/.env" |
|
|
fi |
|
|
|
|
|
|
|
|
POSTGRES_PORT=${POSTGRES_PORT:-5543} |
|
|
NGROK_REGION=${NGROK_REGION:-ap} |
|
|
NGROK_API_URL="http://127.0.0.1:4040" |
|
|
|
|
|
|
|
|
mkdir -p "$OPS_DIR" |
|
|
|
|
|
|
|
|
check_postgres() { |
|
|
log "Kiểm tra PostgreSQL trên port $POSTGRES_PORT..." |
|
|
|
|
|
if command -v psql &> /dev/null; then |
|
|
if PGPASSWORD="${POSTGRES_PASSWORD:-huepass123}" psql -h localhost -p "$POSTGRES_PORT" -U "${POSTGRES_USER:-hue_remote}" -d "${POSTGRES_DB:-hue_portal}" -c "SELECT 1;" &> /dev/null; then |
|
|
log "✅ PostgreSQL đang chạy trên port $POSTGRES_PORT" |
|
|
return 0 |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
if [ -f "$PROJECT_ROOT/backend/venv/bin/python" ]; then |
|
|
if "$PROJECT_ROOT/backend/venv/bin/python" -c " |
|
|
import psycopg2 |
|
|
try: |
|
|
conn = psycopg2.connect( |
|
|
host='localhost', |
|
|
port=$POSTGRES_PORT, |
|
|
database='${POSTGRES_DB:-hue_portal}', |
|
|
user='${POSTGRES_USER:-hue_remote}', |
|
|
password='${POSTGRES_PASSWORD:-huepass123}', |
|
|
connect_timeout=2 |
|
|
) |
|
|
conn.close() |
|
|
exit(0) |
|
|
except: |
|
|
exit(1) |
|
|
" 2>/dev/null; then |
|
|
log "✅ PostgreSQL đang chạy trên port $POSTGRES_PORT" |
|
|
return 0 |
|
|
fi |
|
|
fi |
|
|
|
|
|
warn "⚠️ PostgreSQL không chạy trên port $POSTGRES_PORT" |
|
|
return 1 |
|
|
} |
|
|
|
|
|
|
|
|
get_ngrok_url() { |
|
|
local host port |
|
|
if command -v curl &> /dev/null && command -v python3 &> /dev/null; then |
|
|
response=$(curl -s "$NGROK_API_URL/api/tunnels" 2>/dev/null || echo "") |
|
|
if [ -n "$response" ]; then |
|
|
|
|
|
ngrok_url=$(echo "$response" | python3 -c " |
|
|
import sys, json |
|
|
try: |
|
|
data = json.load(sys.stdin) |
|
|
for tunnel in data.get('tunnels', []): |
|
|
if tunnel.get('proto') == 'tcp': |
|
|
public_url = tunnel.get('public_url', '') |
|
|
if public_url.startswith('tcp://'): |
|
|
url = public_url.replace('tcp://', '') |
|
|
print(url) |
|
|
sys.exit(0) |
|
|
except: |
|
|
pass |
|
|
" 2>/dev/null) |
|
|
if [ -n "$ngrok_url" ]; then |
|
|
echo "$ngrok_url" |
|
|
return 0 |
|
|
fi |
|
|
fi |
|
|
fi |
|
|
return 1 |
|
|
} |
|
|
|
|
|
|
|
|
start_ngrok() { |
|
|
log "Khởi động ngrok tunnel..." >&2 |
|
|
|
|
|
|
|
|
if curl -s "$NGROK_API_URL/api/tunnels" &> /dev/null; then |
|
|
ngrok_url=$(get_ngrok_url) |
|
|
if [ -n "$ngrok_url" ]; then |
|
|
log "✅ Ngrok đã chạy sẵn: tcp://$ngrok_url" >&2 |
|
|
echo "$ngrok_url" |
|
|
return 0 |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
pkill -f "ngrok tcp" 2>/dev/null || true |
|
|
sleep 1 |
|
|
|
|
|
|
|
|
log "Đang start ngrok (ngrok tcp $POSTGRES_PORT --region $NGROK_REGION)..." >&2 |
|
|
nohup ngrok tcp "$POSTGRES_PORT" --region "$NGROK_REGION" --log=stdout > "$OPS_DIR/ngrok.log" 2>&1 & |
|
|
NGROK_PID=$! |
|
|
|
|
|
|
|
|
for i in {1..10}; do |
|
|
sleep 1 |
|
|
if curl -s "$NGROK_API_URL/api/tunnels" &> /dev/null; then |
|
|
ngrok_url=$(get_ngrok_url) |
|
|
if [ -n "$ngrok_url" ]; then |
|
|
log "✅ Ngrok đã sẵn sàng: tcp://$ngrok_url" >&2 |
|
|
echo "$ngrok_url" |
|
|
return 0 |
|
|
fi |
|
|
fi |
|
|
done |
|
|
|
|
|
error "❌ Không thể khởi động ngrok" >&2 |
|
|
return 1 |
|
|
} |
|
|
|
|
|
|
|
|
update_hf_space() { |
|
|
local host=$1 |
|
|
local port=$2 |
|
|
|
|
|
if [ -z "$host" ] || [ -z "$port" ]; then |
|
|
warn "⚠️ Không có ngrok URL, bỏ qua cập nhật HF Space" |
|
|
return 1 |
|
|
fi |
|
|
|
|
|
log "Cập nhật DATABASE_URL lên Hugging Face Space..." |
|
|
|
|
|
if [ -f "$PROJECT_ROOT/backend/venv/bin/python" ]; then |
|
|
"$PROJECT_ROOT/backend/venv/bin/python" "$SCRIPT_DIR/start_ngrok_and_set_db.py" 2>&1 | grep -E "(✅|❌|📌)" || true |
|
|
else |
|
|
warn "⚠️ Không tìm thấy Python venv, bỏ qua cập nhật HF Space" |
|
|
fi |
|
|
} |
|
|
|
|
|
|
|
|
save_tunnel_info() { |
|
|
local host=$1 |
|
|
local port=$2 |
|
|
|
|
|
if [ -z "$host" ] || [ -z "$port" ]; then |
|
|
return 1 |
|
|
fi |
|
|
|
|
|
log "Lưu thông tin tunnel..." |
|
|
|
|
|
cat > "$ENV_TUNNEL" << EOF |
|
|
# Ngrok tunnel info - Generated by khoidongDB.sh |
|
|
# Last updated: $(date -u +"%Y-%m-%dT%H:%M:%S") |
|
|
|
|
|
PG_TUNNEL_HOST=$host |
|
|
PG_TUNNEL_PORT=$port |
|
|
PG_TUNNEL_LOCAL_PORT=$POSTGRES_PORT |
|
|
PG_TUNNEL_USER=${POSTGRES_USER:-hue_remote} |
|
|
PG_TUNNEL_PASSWORD=${POSTGRES_PASSWORD:-huepass123} |
|
|
PG_TUNNEL_DB=${POSTGRES_DB:-hue_portal} |
|
|
DATABASE_URL=postgres://${POSTGRES_USER:-hue_remote}:${POSTGRES_PASSWORD:-huepass123}@$host:$port/${POSTGRES_DB:-hue_portal} |
|
|
HF_SPACE_ID=${HF_SPACE_ID:-davidtran999/hue-portal-backend} |
|
|
POSTGRES_HOST=${POSTGRES_HOST:-localhost} |
|
|
POSTGRES_PORT=$POSTGRES_PORT |
|
|
POSTGRES_USER=${POSTGRES_USER:-hue_remote} |
|
|
POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-huepass123} |
|
|
POSTGRES_DB=${POSTGRES_DB:-hue_portal} |
|
|
PG_TUNNEL_LAST_UPDATED=$(date -u +"%Y-%m-%dT%H:%M:%S") |
|
|
EOF |
|
|
|
|
|
log "✅ Đã lưu tunnel info vào $ENV_TUNNEL" |
|
|
} |
|
|
|
|
|
|
|
|
main() { |
|
|
log "============================================================" |
|
|
log "Khởi động PostgreSQL và ngrok tunnel" |
|
|
log "============================================================" |
|
|
|
|
|
|
|
|
if ! check_postgres; then |
|
|
error "❌ PostgreSQL không chạy trên port $POSTGRES_PORT" |
|
|
error " Vui lòng khởi động PostgreSQL trước" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
|
|
|
ngrok_url=$(start_ngrok) |
|
|
if [ $? -ne 0 ] || [ -z "$ngrok_url" ]; then |
|
|
error "❌ Không thể khởi động ngrok" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
ngrok_host=$(echo "$ngrok_url" | cut -d':' -f1) |
|
|
ngrok_port=$(echo "$ngrok_url" | cut -d':' -f2) |
|
|
|
|
|
|
|
|
save_tunnel_info "$ngrok_host" "$ngrok_port" |
|
|
|
|
|
|
|
|
update_hf_space "$ngrok_host" "$ngrok_port" |
|
|
|
|
|
log "============================================================" |
|
|
log "✅ Hoàn tất!" |
|
|
log " PostgreSQL: localhost:$POSTGRES_PORT" |
|
|
log " Ngrok tunnel: tcp://$ngrok_host:$ngrok_port" |
|
|
log " DATABASE_URL: postgres://${POSTGRES_USER:-hue_remote}:***@$ngrok_host:$ngrok_port/${POSTGRES_DB:-hue_portal}" |
|
|
log "============================================================" |
|
|
} |
|
|
|
|
|
|
|
|
main "$@" |
|
|
|
|
|
|