hue-portal-backend / fix_ngrok_postgres.sh
Davidtran99
chore: sync with main repo
3718c84
#!/bin/bash
# Script để fix và test ngrok tunnel với PostgreSQL
# Sử dụng: ./fix_ngrok_postgres.sh
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"
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
log() {
echo -e "${GREEN}[FIX-NGROK]${NC} $1"
}
warn() {
echo -e "${YELLOW}[FIX-NGROK]${NC} $1"
}
error() {
echo -e "${RED}[FIX-NGROK]${NC} $1"
}
# Default values
POSTGRES_PORT=${POSTGRES_PORT:-5543}
POSTGRES_USER=${POSTGRES_USER:-hue_remote}
POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-huepass123}
POSTGRES_DB=${POSTGRES_DB:-hue_portal}
NGROK_REGION=${NGROK_REGION:-ap}
log "============================================================"
log "Fix và test ngrok tunnel với PostgreSQL"
log "============================================================"
# Step 1: Check PostgreSQL
log "Bước 1: Kiểm tra PostgreSQL..."
export PGPASSWORD="$POSTGRES_PASSWORD"
if psql -h localhost -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "SELECT 1;" &>/dev/null; then
log "✅ PostgreSQL đang chạy trên localhost:$POSTGRES_PORT"
else
error "❌ PostgreSQL không chạy trên localhost:$POSTGRES_PORT"
exit 1
fi
# Step 2: Check PostgreSQL listen addresses
log "Bước 2: Kiểm tra PostgreSQL config..."
LISTEN_ADDR=$(psql -h localhost -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -t -c "SHOW listen_addresses;" 2>/dev/null | xargs)
if [ "$LISTEN_ADDR" = "*" ]; then
log "✅ PostgreSQL đang listen trên tất cả interfaces (*)"
else
warn "⚠️ PostgreSQL listen trên: $LISTEN_ADDR (cần là *)"
fi
# Step 3: Check Docker container
log "Bước 3: Kiểm tra Docker container..."
if docker ps | grep -q "tryhardemnayproject-db-1\|postgres.*5543"; then
CONTAINER_NAME=$(docker ps | grep -E "tryhardemnayproject-db-1|postgres.*5543" | awk '{print $NF}' | head -1)
log "✅ Tìm thấy PostgreSQL container: $CONTAINER_NAME"
# Check pg_hba.conf
log "Bước 4: Kiểm tra pg_hba.conf..."
if docker exec "$CONTAINER_NAME" grep -q "0.0.0.0/0" /var/lib/postgresql/data/pg_hba.conf 2>/dev/null; then
log "✅ pg_hba.conf đã có rule cho 0.0.0.0/0"
else
warn "⚠️ pg_hba.conf chưa có rule cho 0.0.0.0/0, đang thêm..."
docker exec "$CONTAINER_NAME" bash -c "echo 'host all all 0.0.0.0/0 md5' >> /var/lib/postgresql/data/pg_hba.conf" 2>/dev/null || true
log "✅ Đã thêm rule vào pg_hba.conf (cần restart container để apply)"
fi
else
warn "⚠️ Không tìm thấy PostgreSQL container"
fi
# Step 5: Restart ngrok
log "Bước 5: Khởi động lại ngrok tunnel..."
pkill -f "ngrok tcp" 2>/dev/null || true
sleep 2
# Start ngrok
nohup ngrok tcp "$POSTGRES_PORT" --region "$NGROK_REGION" --log=stdout > "$OPS_DIR/ngrok.log" 2>&1 &
NGROK_PID=$!
# Wait for ngrok
for i in {1..10}; do
sleep 1
if curl -s http://127.0.0.1:4040/api/tunnels &>/dev/null; then
NGROK_URL=$(curl -s http://127.0.0.1:4040/api/tunnels | python3 -c "
import sys, json
try:
data = json.load(sys.stdin)
for tunnel in data.get('tunnels', []):
if tunnel.get('proto') == 'tcp':
print(tunnel.get('public_url', '').replace('tcp://', ''))
sys.exit(0)
except:
pass
" 2>/dev/null)
if [ -n "$NGROK_URL" ]; then
NGROK_HOST=$(echo "$NGROK_URL" | cut -d':' -f1)
NGROK_PORT=$(echo "$NGROK_URL" | cut -d':' -f2)
log "✅ Ngrok đã sẵn sàng: tcp://$NGROK_HOST:$NGROK_PORT"
break
fi
fi
done
if [ -z "$NGROK_HOST" ] || [ -z "$NGROK_PORT" ]; then
error "❌ Không thể khởi động ngrok"
exit 1
fi
# Step 6: Test connection
log "Bước 6: Test kết nối PostgreSQL qua ngrok..."
sleep 3
# Test với psql
if timeout 10 psql -h "$NGROK_HOST" -p "$NGROK_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "SELECT 1;" &>/dev/null; then
log "✅✅✅ KẾT NỐI THÀNH CÔNG QUA NGROK!"
# Get document count
DOC_COUNT=$(psql -h "$NGROK_HOST" -p "$NGROK_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -t -c "SELECT COUNT(*) FROM core_legaldocument;" 2>/dev/null | xargs)
log " Số lượng documents: $DOC_COUNT"
# Save tunnel info
log "Bước 7: Lưu thông tin tunnel..."
mkdir -p "$OPS_DIR"
cat > "$ENV_TUNNEL" << EOF
# Ngrok tunnel info - Generated by fix_ngrok_postgres.sh
# Last updated: $(date -u +"%Y-%m-%dT%H:%M:%S")
PG_TUNNEL_HOST=$NGROK_HOST
PG_TUNNEL_PORT=$NGROK_PORT
PG_TUNNEL_LOCAL_PORT=$POSTGRES_PORT
PG_TUNNEL_USER=$POSTGRES_USER
PG_TUNNEL_PASSWORD=$POSTGRES_PASSWORD
PG_TUNNEL_DB=$POSTGRES_DB
DATABASE_URL=postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@$NGROK_HOST:$NGROK_PORT/$POSTGRES_DB
HF_SPACE_ID=${HF_SPACE_ID:-davidtran999/hue-portal-backend}
POSTGRES_HOST=${POSTGRES_HOST:-localhost}
POSTGRES_PORT=$POSTGRES_PORT
POSTGRES_USER=$POSTGRES_USER
POSTGRES_PASSWORD=$POSTGRES_PASSWORD
POSTGRES_DB=$POSTGRES_DB
PG_TUNNEL_LAST_UPDATED=$(date -u +"%Y-%m-%dT%H:%M:%S")
EOF
log "✅ Đã lưu tunnel info vào $ENV_TUNNEL"
# Update Hugging Face Space
log "Bước 8: 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
fi
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:***@$NGROK_HOST:$NGROK_PORT/$POSTGRES_DB"
log "============================================================"
else
error "❌ Vẫn không kết nối được qua ngrok"
error " Có thể cần:"
error " 1. Restart PostgreSQL container để apply pg_hba.conf"
error " 2. Hoặc dùng SSH tunnel thay vì ngrok"
error " 3. Hoặc expose PostgreSQL với network_mode: host"
exit 1
fi