- Complete ngrok setup with automated scripts - One-click internet exposure with setup-complete.sh - Dynamic URL management and Docker reconfiguration - Multi-tunnel configuration for free ngrok accounts - Comprehensive documentation and verification tools - Organized in dedicated ngrok/ folder for easy management
178 lines
5.4 KiB
Bash
Executable File
178 lines
5.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# SnatchGame - Setup completo para ngrok
|
|
set -e
|
|
|
|
echo "🚀 Configurando SnatchGame para exposición con ngrok..."
|
|
|
|
# Verificar ngrok
|
|
if ! command -v /tmp/ngrok &> /dev/null; then
|
|
echo "❌ ngrok no encontrado. Instalando..."
|
|
wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz -O /tmp/ngrok.tgz
|
|
tar -xzf /tmp/ngrok.tgz -C /tmp/
|
|
chmod +x /tmp/ngrok
|
|
echo "✅ ngrok instalado"
|
|
fi
|
|
|
|
# Verificar autenticación
|
|
echo "🔐 Verificando autenticación ngrok..."
|
|
if ! /tmp/ngrok config check &>/dev/null; then
|
|
echo "⚠️ ngrok no está autenticado."
|
|
echo "📋 Para obtener túneles estables:"
|
|
echo " 1. Regístrate gratis en: https://dashboard.ngrok.com/signup"
|
|
echo " 2. Copia tu authtoken de: https://dashboard.ngrok.com/get-started/your-authtoken"
|
|
echo " 3. Pégalo aquí (o Enter para usar túneles temporales):"
|
|
read -r TOKEN
|
|
|
|
if [[ -n "$TOKEN" ]]; then
|
|
/tmp/ngrok config add-authtoken "$TOKEN"
|
|
echo "✅ Token configurado - tendrás túneles estables"
|
|
else
|
|
echo "⚠️ Usando túneles temporales (se renuevan cada 2 horas)"
|
|
fi
|
|
fi
|
|
|
|
# Parar servicios existentes
|
|
echo "🛑 Parando servicios existentes..."
|
|
docker compose down 2>/dev/null || true
|
|
pkill -f ngrok 2>/dev/null || true
|
|
|
|
# Iniciar servicios Docker
|
|
echo "🐳 Iniciando servicios Docker..."
|
|
docker compose -f docker-compose.ngrok.yml up -d
|
|
|
|
# Esperar a que estén healthy
|
|
echo "⏳ Esperando a que los servicios estén listos..."
|
|
sleep 10
|
|
|
|
# Verificar health
|
|
for port in 3010 3011 3067; do
|
|
if ! curl -f http://localhost:$port/health &>/dev/null; then
|
|
echo "❌ Servicio en puerto $port no está respondiendo"
|
|
exit 1
|
|
fi
|
|
done
|
|
echo "✅ Todos los servicios están listos"
|
|
|
|
# Función para iniciar ngrok y obtener URL
|
|
start_ngrok_tunnel() {
|
|
local port=$1
|
|
local service=$2
|
|
local log_file="/tmp/ngrok-$service.log"
|
|
|
|
echo "🌐 Iniciando túnel para $service (puerto $port)..."
|
|
|
|
# Iniciar ngrok en background
|
|
/tmp/ngrok http $port --log=stdout > "$log_file" 2>&1 &
|
|
local pid=$!
|
|
|
|
# Esperar a que la URL esté disponible
|
|
local url=""
|
|
local attempts=0
|
|
while [[ -z "$url" && $attempts -lt 30 ]]; do
|
|
sleep 2
|
|
if [[ -f "$log_file" ]]; then
|
|
url=$(grep -o 'url=https://[^[:space:]]*' "$log_file" | head -1 | cut -d'=' -f2)
|
|
fi
|
|
((attempts++))
|
|
done
|
|
|
|
if [[ -n "$url" ]]; then
|
|
echo "✅ $service: $url"
|
|
echo "$url"
|
|
else
|
|
echo "❌ No se pudo obtener URL para $service"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Iniciar túneles
|
|
echo ""
|
|
echo "🌐 Iniciando túneles ngrok..."
|
|
SERVER_URL=$(start_ngrok_tunnel 3067 "server")
|
|
CLIENT_URL=$(start_ngrok_tunnel 3010 "client")
|
|
ADMIN_URL=$(start_ngrok_tunnel 3011 "admin")
|
|
|
|
# Verificar que todas las URLs se obtuvieron
|
|
if [[ -z "$SERVER_URL" || -z "$CLIENT_URL" || -z "$ADMIN_URL" ]]; then
|
|
echo "❌ Error obteniendo URLs de ngrok"
|
|
exit 1
|
|
fi
|
|
|
|
# Parar servicios para reconfigurar
|
|
echo ""
|
|
echo "🔄 Reconfigurando servicios con URLs públicas..."
|
|
docker compose -f docker-compose.ngrok.yml down
|
|
|
|
# Actualizar docker-compose con URLs reales
|
|
sed "s|NGROK_SERVER_URL|$SERVER_URL|g" docker-compose.ngrok.yml > /tmp/docker-compose-configured.yml
|
|
|
|
# Reiniciar servicios con nueva configuración
|
|
echo "🐳 Reiniciando servicios con configuración ngrok..."
|
|
docker compose -f /tmp/docker-compose-configured.yml up -d
|
|
|
|
# Esperar a que estén listos nuevamente
|
|
echo "⏳ Esperando servicios reconfigurados..."
|
|
sleep 15
|
|
|
|
# Mostrar resultado final
|
|
echo ""
|
|
echo "🎉 ¡SnatchGame está disponible en internet!"
|
|
echo "========================================"
|
|
echo ""
|
|
echo "🎮 CLIENTE (Jugadores): $CLIENT_URL"
|
|
echo "📊 ADMIN (Administración): $ADMIN_URL"
|
|
echo "🎯 SERVIDOR (API): $SERVER_URL"
|
|
echo ""
|
|
echo "📋 Instrucciones:"
|
|
echo " • Comparte la URL del CLIENTE con los jugadores"
|
|
echo " • Usa la URL del ADMIN para controlar el juego"
|
|
echo " • Los jugadores pueden unirse desde cualquier lugar del mundo"
|
|
echo ""
|
|
echo "⚠️ Importante:"
|
|
if /tmp/ngrok config check &>/dev/null; then
|
|
echo " • Túneles ESTABLES (con cuenta ngrok)"
|
|
echo " • URLs permanentes mientras el script esté corriendo"
|
|
else
|
|
echo " • Túneles TEMPORALES (sin cuenta ngrok)"
|
|
echo " • URLs válidas por 2 horas máximo"
|
|
fi
|
|
echo " • No cerrar esta terminal para mantener túneles activos"
|
|
echo " • Presionar Ctrl+C para cerrar todos los túneles"
|
|
echo ""
|
|
|
|
# Función de cleanup
|
|
cleanup() {
|
|
echo ""
|
|
echo "🛑 Cerrando túneles y servicios..."
|
|
pkill -f ngrok 2>/dev/null || true
|
|
docker compose -f /tmp/docker-compose-configured.yml down 2>/dev/null || true
|
|
rm -f /tmp/docker-compose-configured.yml 2>/dev/null || true
|
|
echo "✅ Limpieza completada"
|
|
exit 0
|
|
}
|
|
|
|
# Configurar trap
|
|
trap cleanup SIGINT SIGTERM
|
|
|
|
# Mantener script corriendo
|
|
echo "🔄 Túneles activos. Para cerrar presiona Ctrl+C"
|
|
echo "💡 Tip: Prueba abrir $CLIENT_URL en tu navegador"
|
|
echo ""
|
|
|
|
# Loop principal
|
|
while true; do
|
|
# Verificar que ngrok siga corriendo
|
|
if ! pgrep ngrok > /dev/null; then
|
|
echo "❌ Procesos ngrok terminaron inesperadamente"
|
|
cleanup
|
|
fi
|
|
|
|
# Verificar que Docker siga corriendo
|
|
if ! docker compose -f /tmp/docker-compose-configured.yml ps | grep -q "Up"; then
|
|
echo "❌ Servicios Docker se cerraron inesperadamente"
|
|
cleanup
|
|
fi
|
|
|
|
sleep 30
|
|
done |