File size: 6,188 Bytes
3718c84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#!/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