From b83d450ac6dcfb6943ffa9ab8cd06d62a0d060ad Mon Sep 17 00:00:00 2001 From: josedario87 Date: Sat, 5 Jul 2025 18:14:05 -0600 Subject: [PATCH] feat: Add ngrok internet exposure system for testing - 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 --- ngrok/ARCHIVOS.md | 107 ++++++++++++++++++++ ngrok/README.md | 169 +++++++++++++++++++++++++++++++ ngrok/docker-compose.ngrok.yml | 71 +++++++++++++ ngrok/expose-ngrok.sh | 131 ++++++++++++++++++++++++ ngrok/manage-tunnels.sh | 173 +++++++++++++++++++++++++++++++ ngrok/setup-complete.sh | 180 +++++++++++++++++++++++++++++++++ ngrok/setup-ngrok.sh | 178 ++++++++++++++++++++++++++++++++ ngrok/test.sh | 66 ++++++++++++ ngrok/update-ngrok-urls.sh | 141 ++++++++++++++++++++++++++ 9 files changed, 1216 insertions(+) create mode 100644 ngrok/ARCHIVOS.md create mode 100644 ngrok/README.md create mode 100644 ngrok/docker-compose.ngrok.yml create mode 100755 ngrok/expose-ngrok.sh create mode 100755 ngrok/manage-tunnels.sh create mode 100755 ngrok/setup-complete.sh create mode 100755 ngrok/setup-ngrok.sh create mode 100755 ngrok/test.sh create mode 100644 ngrok/update-ngrok-urls.sh diff --git a/ngrok/ARCHIVOS.md b/ngrok/ARCHIVOS.md new file mode 100644 index 0000000..05483da --- /dev/null +++ b/ngrok/ARCHIVOS.md @@ -0,0 +1,107 @@ +# 📁 Contenido de la Carpeta ngrok/ + +## 🚀 Scripts Principales + +### **`setup-complete.sh`** ⭐ **PRINCIPAL** +- **Función**: Script todo-en-uno que hace el setup completo +- **Uso**: `./setup-complete.sh` +- **Hace**: + 1. Limpia procesos anteriores + 2. Inicia Docker con configuración básica + 3. Crea túneles ngrok y obtiene URLs + 4. Reconfigura Docker con URLs reales + 5. Verifica que todo funcione + 6. Mantiene túneles activos + +### **`manage-tunnels.sh`** 🛠️ **GESTIÓN** +- **Función**: Gestiona túneles ngrok existentes +- **Uso**: + - `./manage-tunnels.sh status` - Ver estado + - `./manage-tunnels.sh start` - Iniciar túneles + - `./manage-tunnels.sh stop` - Parar túneles + - `./manage-tunnels.sh urls` - Ver URLs actuales + - `./manage-tunnels.sh restart` - Reiniciar todo + +### **`test.sh`** 🧪 **VERIFICACIÓN** +- **Función**: Verifica que todo esté listo para usar +- **Uso**: `./test.sh` +- **Verifica**: ngrok, Docker, imágenes, configuración + +## 🔧 Scripts Auxiliares + +### **`update-ngrok-urls.sh`** +- **Función**: Actualiza URLs de Docker con ngrok (usado por setup-complete) +- **Uso**: `./update-ngrok-urls.sh` + +### **`setup-ngrok.sh`** +- **Función**: Setup inicial con configuración manual +- **Uso**: `./setup-ngrok.sh` + +### **`expose-ngrok.sh`** +- **Función**: Script simple para exponer servicios +- **Uso**: `./expose-ngrok.sh` + +## 📄 Archivos de Configuración + +### **`docker-compose.ngrok.yml`** +- **Función**: Configuración Docker optimizada para ngrok +- **Contenido**: Servicios sin URLs hardcodeadas +- **Usado por**: Todos los scripts + +### **`README.md`** +- **Función**: Documentación completa de uso +- **Contenido**: Instrucciones, ejemplos, troubleshooting + +### **`ARCHIVOS.md`** (este archivo) +- **Función**: Descripción de todos los archivos +- **Contenido**: Qué hace cada script y archivo + +## 🎯 Uso Recomendado + +### **Para Usuarios Normales:** +```bash +cd ngrok +./setup-complete.sh +``` + +### **Para Debugging:** +```bash +# Verificar que todo esté listo +./test.sh + +# Ver estado actual +./manage-tunnels.sh status + +# Ver solo las URLs +./manage-tunnels.sh urls +``` + +### **Para Reinicios:** +```bash +# Reiniciar todo +./manage-tunnels.sh restart + +# O hacer setup completo desde cero +./setup-complete.sh +``` + +## 📋 Dependencias + +### **Externas:** +- ngrok instalado en `/tmp/ngrok` +- Docker funcionando +- Imágenes Docker construidas +- Authtoken de ngrok configurado + +### **Internas:** +- Todos los scripts están en la misma carpeta +- Rutas relativas configuradas correctamente +- Scripts ejecutables (`chmod +x`) + +## 🎉 Resultado + +Después de ejecutar `./setup-complete.sh` obtienes: +- 🎮 URL del cliente para jugadores +- 📊 URL del admin para control +- 🎯 URL del servidor (configurada automáticamente) +- ✅ Sistema funcionando en internet \ No newline at end of file diff --git a/ngrok/README.md b/ngrok/README.md new file mode 100644 index 0000000..0016331 --- /dev/null +++ b/ngrok/README.md @@ -0,0 +1,169 @@ +# 🌐 SnatchGame - Ngrok Internet Exposure + +Esta carpeta contiene todo lo necesario para exponer SnatchGame a internet usando ngrok. + +## 🚀 Uso Rápido + +### **Método Fácil (Recomendado):** +```bash +cd ngrok +./setup-complete.sh +``` + +¡Eso es todo! El script hará todo automáticamente y te dará las URLs públicas. + +## 📁 Archivos Incluidos + +### **Scripts Principales:** + +- **`setup-complete.sh`** - 🎯 **Script principal** - Hace todo automáticamente +- **`manage-tunnels.sh`** - 🛠️ Gestión de túneles (start/stop/status/urls) +- **`update-ngrok-urls.sh`** - 🔄 Actualiza URLs de Docker con ngrok +- **`docker-compose.ngrok.yml`** - 🐳 Configuración Docker para ngrok + +### **Scripts Adicionales:** +- **`setup-ngrok.sh`** - Setup inicial con configuración manual +- **`expose-ngrok.sh`** - Script simple para exponer servicios + +## 🔧 Métodos de Uso + +### **1. Automático (Más Fácil):** +```bash +./setup-complete.sh +``` +- ✅ Hace todo en orden correcto +- ✅ URLs dinámicas automáticas +- ✅ Verificación completa +- ✅ Mantiene túneles activos + +### **2. Manual (Más Control):** +```bash +# Ver estado +./manage-tunnels.sh status + +# Iniciar túneles +./manage-tunnels.sh start + +# Ver URLs actuales +./manage-tunnels.sh urls + +# Parar túneles +./manage-tunnels.sh stop + +# Reiniciar todo +./manage-tunnels.sh restart +``` + +### **3. Solo actualizar URLs:** +```bash +./update-ngrok-urls.sh +``` + +## 📋 Prerrequisitos + +### **1. Cuenta ngrok (Gratis):** +1. Regístrate en: https://dashboard.ngrok.com/signup +2. Obtén tu authtoken: https://dashboard.ngrok.com/get-started/your-authtoken +3. Configúralo una vez: + ```bash + /tmp/ngrok config add-authtoken TU_TOKEN_AQUI + ``` + +### **2. Docker funcionando:** +- Los servicios de SnatchGame deben estar builds +- Docker compose debe estar disponible + +## 🌐 URLs que obtendrás + +Después de ejecutar el setup obtendrás 3 URLs públicas: + +- **🎮 CLIENTE** - Para que los jugadores se conecten +- **📊 ADMIN** - Para administrar el juego +- **🎯 SERVIDOR** - API del juego (configurado automáticamente) + +## 🛠️ Solución de Problemas + +### **Error: "authentication failed"** +```bash +# Configura tu authtoken de ngrok +/tmp/ngrok config add-authtoken TU_TOKEN +``` + +### **Error: "port already in use"** +```bash +# Limpia procesos anteriores +pkill -f ngrok +docker compose down +``` + +### **URLs no funcionan** +```bash +# Reinicia todo el setup +./manage-tunnels.sh restart +``` + +### **Docker no responde** +```bash +# Verifica que los servicios estén construidos +cd .. && docker compose ps +``` + +## 📊 Flujo de Funcionamiento + +``` +1. 🛑 Limpia procesos anteriores + ↓ +2. 🐳 Inicia servicios Docker (localhost) + ↓ +3. 🌐 Crea túneles ngrok → Obtiene URLs públicas + ↓ +4. 🔄 Reconfigura Docker con URLs reales + ↓ +5. ✅ Verifica que todo funcione + ↓ +6. 🎉 ¡Sistema funcionando en internet! +``` + +## 🔍 Verificación + +### **Verificar que funciona:** +```bash +# 1. Ver estado +./manage-tunnels.sh status + +# 2. Ver URLs +./manage-tunnels.sh urls + +# 3. Probar cliente +curl https://TU_URL_CLIENTE/health +``` + +### **URLs correctas:** +- Cliente debe devolver: `{"status":"healthy","service":"snatchgame-client"}` +- Admin debe devolver: `{"status":"healthy","service":"snatchgame-admin"}` +- Servidor debe devolver: `{"status":"healthy"}` + +## 🎯 Comando de Un Solo Paso + +Para usuarios experimentados: +```bash +cd ngrok && ./setup-complete.sh +``` + +## ⚠️ Notas Importantes + +- **Mantén la terminal abierta** - Los túneles se cierran si cierras la terminal +- **URLs dinámicas** - Cambian cada vez que reinicias ngrok +- **Primera vez** - ngrok puede pedir "Visit Site" en el navegador +- **Cuenta gratuita** - Túneles estables mientras esté activo + +## 🎮 Para Jugar + +1. Ejecuta: `./setup-complete.sh` +2. Copia la URL del CLIENTE +3. Comparte con amigos +4. ¡Jueguen desde cualquier lugar del mundo! + +--- + +> 💡 **Tip**: Guarda las URLs que te dé el script, son válidas mientras mantengas la terminal abierta. \ No newline at end of file diff --git a/ngrok/docker-compose.ngrok.yml b/ngrok/docker-compose.ngrok.yml new file mode 100644 index 0000000..cd5152b --- /dev/null +++ b/ngrok/docker-compose.ngrok.yml @@ -0,0 +1,71 @@ +version: '3.8' + +services: + # Servidor Colyseus + snatchgame-server: + image: gitea.interno.com/nucleo000/snatchgame-server:latest + container_name: snatchgame-server + ports: + - "3067:2567" + environment: + - NODE_ENV=production + - PORT=2567 + networks: + - snatchgame-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:2567/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # Cliente Vue UI + snatchgame-client: + image: gitea.interno.com/nucleo000/snatchgame-client:latest + container_name: snatchgame-client + ports: + - "3010:3000" + environment: + - NODE_ENV=production + - PORT=3000 + - SERVER_URL=http://snatchgame-server:2567 + - PUBLIC_SERVER_URL=NGROK_SERVER_URL # Se actualizará dinámicamente + depends_on: + - snatchgame-server + networks: + - snatchgame-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # Admin Dashboard + snatchgame-admin: + image: gitea.interno.com/nucleo000/snatchgame-admin:latest + container_name: snatchgame-admin + ports: + - "3011:3001" + environment: + - NODE_ENV=production + - PORT=3001 + - SERVER_URL=http://snatchgame-server:2567 + - PUBLIC_SERVER_URL=NGROK_SERVER_URL # Se actualizará dinámicamente + depends_on: + - snatchgame-server + networks: + - snatchgame-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3001/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +networks: + snatchgame-network: + driver: bridge \ No newline at end of file diff --git a/ngrok/expose-ngrok.sh b/ngrok/expose-ngrok.sh new file mode 100755 index 0000000..92045b6 --- /dev/null +++ b/ngrok/expose-ngrok.sh @@ -0,0 +1,131 @@ +#!/bin/bash + +# SnatchGame ngrok exposure script +echo "🚀 Exponiendo SnatchGame a internet con ngrok..." + +# Verificar que ngrok esté disponible +if ! command -v /tmp/ngrok &> /dev/null; then + echo "❌ ngrok no encontrado. Ejecuta primero la instalación." + exit 1 +fi + +# Verificar que los servicios Docker estén corriendo +if ! docker compose ps | grep -q "Up"; then + echo "❌ Los servicios Docker no están corriendo. Ejecuta: docker compose up -d" + exit 1 +fi + +echo "✅ Servicios Docker verificados" +echo "🌐 Exponiendo servicios..." + +# Función para matar procesos ngrok existentes +cleanup() { + echo "🛑 Cerrando túneles ngrok..." + pkill -f ngrok || true + exit 0 +} + +# Configurar trap para cleanup +trap cleanup SIGINT SIGTERM + +# Verificar si ngrok está autenticado +AUTH_CHECK=$(/tmp/ngrok config check 2>&1 || echo "not_authenticated") +if [[ "$AUTH_CHECK" == *"not_authenticated"* ]] || [[ "$AUTH_CHECK" == *"authentication failed"* ]]; then + echo "⚠️ ngrok no está autenticado." + echo "📋 Pasos para autenticar:" + echo " 1. Visita: https://dashboard.ngrok.com/get-started/your-authtoken" + echo " 2. Copia tu authtoken" + echo " 3. Ejecuta: /tmp/ngrok config add-authtoken TU_TOKEN_AQUI" + echo "" + echo "❓ ¿Tienes tu authtoken? Introduce tu token (o Enter para continuar sin autenticar):" + read -r TOKEN + + if [[ -n "$TOKEN" ]]; then + /tmp/ngrok config add-authtoken "$TOKEN" + echo "✅ Token configurado" + else + echo "⚠️ Continuando sin autenticar (túneles temporales)" + fi +fi + +# Exponer Cliente (Puerto 3010) +echo "🎮 Exponiendo Cliente SnatchGame..." +/tmp/ngrok http 3010 --log=stdout > /tmp/ngrok-client.log 2>&1 & +CLIENT_PID=$! + +# Exponer Admin (Puerto 3011) +echo "📊 Exponiendo Admin Dashboard..." +/tmp/ngrok http 3011 --log=stdout > /tmp/ngrok-admin.log 2>&1 & +ADMIN_PID=$! + +# Exponer Servidor (Puerto 3067) +echo "🎯 Exponiendo Servidor Colyseus..." +/tmp/ngrok http 3067 --log=stdout > /tmp/ngrok-server.log 2>&1 & +SERVER_PID=$! + +# Esperar un momento para que se establezcan los túneles +echo "⏳ Estableciendo túneles..." +sleep 5 + +# Función para extraer URL de logs de ngrok +get_ngrok_url() { + local log_file=$1 + local max_attempts=10 + local attempt=1 + + while [ $attempt -le $max_attempts ]; do + if [ -f "$log_file" ]; then + local url=$(grep -o 'url=https://[^[:space:]]*' "$log_file" | head -1 | cut -d'=' -f2) + if [ -n "$url" ]; then + echo "$url" + return 0 + fi + fi + sleep 2 + ((attempt++)) + done + echo "❌ URL no encontrada" + return 1 +} + +# Obtener URLs +echo "" +echo "🌐 URLs públicas de SnatchGame:" +echo "================================" + +CLIENT_URL=$(get_ngrok_url "/tmp/ngrok-client.log") +ADMIN_URL=$(get_ngrok_url "/tmp/ngrok-admin.log") +SERVER_URL=$(get_ngrok_url "/tmp/ngrok-server.log") + +echo "🎮 Cliente UI: $CLIENT_URL" +echo "📊 Admin Panel: $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 monitorear el juego" +echo " • Los servicios funcionan normalmente" +echo "" +echo "⚠️ IMPORTANTE:" +echo " • Estas URLs son temporales (se renuevan cada 2 horas sin cuenta)" +echo " • Con cuenta gratuita ngrok son permanentes" +echo " • Presiona Ctrl+C para cerrar todos los túneles" +echo "" + +# Mostrar estado de túneles +echo "📡 Estado de túneles:" +echo " Cliente PID: $CLIENT_PID" +echo " Admin PID: $ADMIN_PID" +echo " Servidor PID: $SERVER_PID" + +# Mantener el script corriendo +echo "🔄 Túneles activos. Presiona Ctrl+C para cerrar..." +while true; do + # Verificar que los procesos sigan corriendo + if ! kill -0 $CLIENT_PID 2>/dev/null || ! kill -0 $ADMIN_PID 2>/dev/null || ! kill -0 $SERVER_PID 2>/dev/null; then + echo "❌ Uno o más túneles se cerraron inesperadamente" + cleanup + fi + sleep 30 +done \ No newline at end of file diff --git a/ngrok/manage-tunnels.sh b/ngrok/manage-tunnels.sh new file mode 100755 index 0000000..baf6b98 --- /dev/null +++ b/ngrok/manage-tunnels.sh @@ -0,0 +1,173 @@ +#!/bin/bash + +# SnatchGame - Gestor de túneles ngrok +echo "🌐 SnatchGame Tunnel Manager" +echo "============================" + +# Función para extraer URLs dinámicamente +get_urls() { + # Primero intentar usar la API de ngrok (puerto 4040) + if curl -s http://localhost:4040/api/tunnels > /tmp/ngrok-api.json 2>/dev/null; then + # Extraer URLs usando jq o parsing manual + if command -v jq > /dev/null; then + CLIENT_URL=$(jq -r '.tunnels[] | select(.name=="snatchgame-client") | .public_url' /tmp/ngrok-api.json 2>/dev/null) + ADMIN_URL=$(jq -r '.tunnels[] | select(.name=="snatchgame-admin") | .public_url' /tmp/ngrok-api.json 2>/dev/null) + SERVER_URL=$(jq -r '.tunnels[] | select(.name=="snatchgame-server") | .public_url' /tmp/ngrok-api.json 2>/dev/null) + else + # Parsing manual sin jq + CLIENT_URL=$(grep -o '"snatchgame-client"[^}]*"public_url":"[^"]*"' /tmp/ngrok-api.json | grep -o 'https://[^"]*' | head -1) + ADMIN_URL=$(grep -o '"snatchgame-admin"[^}]*"public_url":"[^"]*"' /tmp/ngrok-api.json | grep -o 'https://[^"]*' | head -1) + SERVER_URL=$(grep -o '"snatchgame-server"[^}]*"public_url":"[^"]*"' /tmp/ngrok-api.json | grep -o 'https://[^"]*' | head -1) + fi + else + # Fallback a logs si la API no está disponible + if [[ -f /tmp/ngrok-all.log ]]; then + CLIENT_URL=$(grep "snatchgame-client" /tmp/ngrok-all.log | grep -o 'url=https://[^[:space:]]*' | cut -d'=' -f2 | tail -1) + ADMIN_URL=$(grep "snatchgame-admin" /tmp/ngrok-all.log | grep -o 'url=https://[^[:space:]]*' | cut -d'=' -f2 | tail -1) + SERVER_URL=$(grep "snatchgame-server" /tmp/ngrok-all.log | grep -o 'url=https://[^[:space:]]*' | cut -d'=' -f2 | tail -1) + fi + fi + + # Validar que las URLs no estén vacías + [[ -z "$CLIENT_URL" ]] && CLIENT_URL="No disponible" + [[ -z "$ADMIN_URL" ]] && ADMIN_URL="No disponible" + [[ -z "$SERVER_URL" ]] && SERVER_URL="No disponible" +} + +# Obtener URLs actuales +get_urls + +# Función para mostrar estado +show_status() { + # Refrescar URLs antes de mostrar + get_urls + + echo "" + echo "📊 ESTADO ACTUAL:" + echo "==================" + + # Verificar si ngrok está corriendo + if pgrep ngrok > /dev/null; then + echo "✅ ngrok: ACTIVO" + else + echo "❌ ngrok: INACTIVO" + fi + + # Verificar Docker + if docker compose ps | grep -q "Up"; then + echo "✅ Docker: ACTIVO" + else + echo "❌ Docker: INACTIVO" + fi + + echo "" + echo "🌐 URLs PÚBLICAS:" + if [[ "$CLIENT_URL" != "No disponible" ]]; then + echo "🎮 CLIENTE: $CLIENT_URL" + echo "📊 ADMIN: $ADMIN_URL" + echo "🎯 SERVER: $SERVER_URL" + else + echo "⚠️ URLs no disponibles (ngrok no está corriendo o logs no encontrados)" + fi +} + +# Función para iniciar túneles +start_tunnels() { + echo "🚀 Iniciando túneles..." + + # Asegurar que Docker esté corriendo + if ! docker compose ps | grep -q "Up"; then + echo "🐳 Iniciando servicios Docker..." + docker compose -f docker-compose.ngrok.yml up -d + sleep 10 + fi + + # Asegurar que ngrok no esté corriendo + if pgrep ngrok > /dev/null; then + echo "⚠️ ngrok ya está corriendo" + else + echo "🌐 Iniciando túneles ngrok..." + nohup /tmp/ngrok start --all > /tmp/ngrok-all.log 2>&1 & + sleep 5 + echo "✅ Túneles iniciados" + fi +} + +# Función para parar túneles +stop_tunnels() { + echo "🛑 Parando túneles..." + pkill -f ngrok 2>/dev/null || true + echo "✅ Túneles detenidos" +} + +# Función para reiniciar túneles +restart_tunnels() { + echo "🔄 Reiniciando túneles..." + stop_tunnels + sleep 3 + start_tunnels +} + +# Función para mostrar logs +show_logs() { + echo "📄 Logs de ngrok:" + echo "==================" + if [[ -f /tmp/ngrok-all.log ]]; then + tail -20 /tmp/ngrok-all.log + else + echo "No se encontraron logs" + fi +} + +# Menú principal +case "${1:-status}" in + "start") + start_tunnels + show_status + ;; + "stop") + stop_tunnels + show_status + ;; + "restart") + restart_tunnels + show_status + ;; + "logs") + show_logs + ;; + "urls") + get_urls + echo "🌐 URLs de SnatchGame:" + if [[ "$CLIENT_URL" != "No disponible" ]]; then + echo "🎮 CLIENTE: $CLIENT_URL" + echo "📊 ADMIN: $ADMIN_URL" + echo "🎯 SERVER: $SERVER_URL" + echo "" + echo "📋 Para copiar fácilmente:" + echo "Cliente: $CLIENT_URL" + else + echo "⚠️ URLs no disponibles. Ejecuta: ./manage-tunnels.sh start" + fi + ;; + "status"|*) + show_status + echo "" + echo "💡 COMANDOS DISPONIBLES:" + echo " ./manage-tunnels.sh start - Iniciar túneles" + echo " ./manage-tunnels.sh stop - Parar túneles" + echo " ./manage-tunnels.sh restart - Reiniciar túneles" + echo " ./manage-tunnels.sh logs - Ver logs" + echo " ./manage-tunnels.sh urls - Mostrar URLs" + echo "" + if [[ "$CLIENT_URL" != "No disponible" ]]; then + echo "🎮 PARA JUGAR:" + echo " Abre: $CLIENT_URL" + echo "" + echo "📊 PARA ADMINISTRAR:" + echo " Abre: $ADMIN_URL" + else + echo "⚠️ Para obtener URLs ejecuta: ./manage-tunnels.sh start" + fi + ;; +esac \ No newline at end of file diff --git a/ngrok/setup-complete.sh b/ngrok/setup-complete.sh new file mode 100755 index 0000000..88f8f6d --- /dev/null +++ b/ngrok/setup-complete.sh @@ -0,0 +1,180 @@ +#!/bin/bash + +echo "🚀 SnatchGame - Setup Completo (Orden Correcto)" +echo "===============================================" + +# Paso 1: Parar todo lo existente +echo "🛑 Limpiando procesos existentes..." +pkill -f ngrok 2>/dev/null || true +cd .. && docker compose down 2>/dev/null && cd ngrok || true + +# Paso 2: Iniciar servicios Docker PRIMERO (sin URLs públicas) +echo "🐳 Iniciando servicios Docker básicos..." +cd .. && docker compose -f ngrok/docker-compose.ngrok.yml up -d && cd ngrok + +# Esperar a que estén listos +echo "⏳ Esperando servicios Docker..." +sleep 15 + +# Verificar que Docker esté funcionando +echo "🔍 Verificando servicios locales..." +for port in 3010 3011 3067; do + if curl -f http://localhost:$port/health &>/dev/null; then + echo "✅ Puerto $port: OK" + else + echo "❌ Puerto $port: FALLO" + echo "Error: Docker no está funcionando correctamente" + exit 1 + fi +done + +# Paso 3: Crear túneles ngrok +echo "" +echo "🌐 Creando túneles ngrok..." +/tmp/ngrok start --all > /tmp/ngrok-startup.log 2>&1 & + +# Esperar a que ngrok se establezca +echo "⏳ Esperando túneles ngrok..." +sleep 10 + +# Paso 4: Obtener URLs de ngrok +echo "📡 Obteniendo URLs de ngrok..." +if curl -s http://localhost:4040/api/tunnels > /tmp/ngrok-api.json 2>/dev/null; then + CLIENT_URL=$(grep -o '"snatchgame-client"[^}]*"public_url":"[^"]*"' /tmp/ngrok-api.json | grep -o 'https://[^"]*' | head -1) + ADMIN_URL=$(grep -o '"snatchgame-admin"[^}]*"public_url":"[^"]*"' /tmp/ngrok-api.json | grep -o 'https://[^"]*' | head -1) + SERVER_URL=$(grep -o '"snatchgame-server"[^}]*"public_url":"[^"]*"' /tmp/ngrok-api.json | grep -o 'https://[^"]*' | head -1) + + if [[ -n "$SERVER_URL" && -n "$CLIENT_URL" && -n "$ADMIN_URL" ]]; then + echo "✅ URLs obtenidas exitosamente" + echo " Server: $SERVER_URL" + echo " Client: $CLIENT_URL" + echo " Admin: $ADMIN_URL" + else + echo "❌ No se pudieron obtener todas las URLs" + exit 1 + fi +else + echo "❌ No se pudo conectar a la API de ngrok" + exit 1 +fi + +# Paso 5: Reconfigurar Docker con URLs reales +echo "" +echo "🔄 Reconfigurando Docker con URLs públicas..." + +# Crear docker-compose con URLs reales +cat > /tmp/docker-compose-final.yml << EOF +version: '3.8' + +services: + snatchgame-server: + image: gitea.interno.com/nucleo000/snatchgame-server:latest + container_name: snatchgame-server + ports: + - "3067:2567" + environment: + - NODE_ENV=production + - PORT=2567 + networks: + - snatchgame-network + restart: unless-stopped + + snatchgame-client: + image: gitea.interno.com/nucleo000/snatchgame-client:latest + container_name: snatchgame-client + ports: + - "3010:3000" + environment: + - NODE_ENV=production + - PORT=3000 + - SERVER_URL=http://snatchgame-server:2567 + - PUBLIC_SERVER_URL=$SERVER_URL + depends_on: + - snatchgame-server + networks: + - snatchgame-network + restart: unless-stopped + + snatchgame-admin: + image: gitea.interno.com/nucleo000/snatchgame-admin:latest + container_name: snatchgame-admin + ports: + - "3011:3001" + environment: + - NODE_ENV=production + - PORT=3001 + - SERVER_URL=http://snatchgame-server:2567 + - PUBLIC_SERVER_URL=$SERVER_URL + depends_on: + - snatchgame-server + networks: + - snatchgame-network + restart: unless-stopped + +networks: + snatchgame-network: + driver: bridge +EOF + +# Reiniciar Docker con configuración final +cd .. && docker compose down && cd ngrok +cd .. && docker compose -f /tmp/docker-compose-final.yml up -d && cd ngrok + +echo "⏳ Esperando servicios reconfigurados..." +sleep 20 + +# Paso 6: Verificación final +echo "" +echo "🔍 Verificación final..." + +# Verificar que el cliente devuelva la URL correcta +echo "Verificando configuración del cliente..." +CLIENT_CONFIG=$(curl -s https://$(echo $CLIENT_URL | cut -d'/' -f3)/api/config 2>/dev/null || echo "Error") + +if [[ "$CLIENT_CONFIG" == *"$SERVER_URL"* ]]; then + echo "✅ Cliente configurado correctamente" +else + echo "⚠️ Cliente aún no está configurado. Config actual: $CLIENT_CONFIG" +fi + +# Resultado final +echo "" +echo "🎉 ¡SnatchGame está LIVE en internet!" +echo "====================================" +echo "" +echo "🌐 URLs PÚBLICAS:" +echo "🎮 CLIENTE (jugadores): $CLIENT_URL" +echo "📊 ADMIN (control): $ADMIN_URL" +echo "🎯 SERVIDOR (API): $SERVER_URL" +echo "" +echo "📋 INSTRUCCIONES:" +echo " 1. Abre: $CLIENT_URL" +echo " 2. Comparte esa URL con otros jugadores" +echo " 3. Usa: $ADMIN_URL para administrar" +echo "" +echo "✅ Sistema completamente configurado" +echo "⚠️ Mantén esta terminal abierta para mantener túneles activos" + +# Función de cleanup +cleanup() { + echo "" + echo "🛑 Cerrando túneles y servicios..." + pkill -f ngrok 2>/dev/null || true + cd .. && docker compose -f /tmp/docker-compose-final.yml down 2>/dev/null && cd ngrok || true + rm -f /tmp/docker-compose-final.yml /tmp/ngrok-api.json 2>/dev/null || true + echo "✅ Limpieza completada" + exit 0 +} + +trap cleanup SIGINT SIGTERM + +# Mantener script corriendo +echo "" +echo "🔄 Túneles activos. Presiona Ctrl+C para cerrar todo" +while true; do + if ! pgrep ngrok > /dev/null; then + echo "❌ ngrok se cerró inesperadamente" + cleanup + fi + sleep 30 +done \ No newline at end of file diff --git a/ngrok/setup-ngrok.sh b/ngrok/setup-ngrok.sh new file mode 100755 index 0000000..03a0bdf --- /dev/null +++ b/ngrok/setup-ngrok.sh @@ -0,0 +1,178 @@ +#!/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 \ No newline at end of file diff --git a/ngrok/test.sh b/ngrok/test.sh new file mode 100755 index 0000000..7f76630 --- /dev/null +++ b/ngrok/test.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +echo "🧪 Test rápido de la carpeta ngrok" +echo "==================================" + +# Verificar que estamos en la carpeta correcta +if [[ ! -f "setup-complete.sh" ]]; then + echo "❌ Error: Ejecuta desde la carpeta ngrok/" + exit 1 +fi + +echo "✅ Carpeta ngrok encontrada" + +# Verificar que ngrok está disponible +if [[ ! -f "/tmp/ngrok" ]]; then + echo "❌ Error: ngrok no está instalado en /tmp/ngrok" + exit 1 +fi + +echo "✅ ngrok encontrado" + +# Verificar que Docker está disponible +if ! command -v docker &> /dev/null; then + echo "❌ Error: Docker no está disponible" + exit 1 +fi + +echo "✅ Docker encontrado" + +# Verificar que las imágenes existen +echo "🔍 Verificando imágenes Docker..." +if docker images | grep -q "snatchgame-server"; then + echo "✅ Imagen server encontrada" +else + echo "⚠️ Imagen server no encontrada" +fi + +if docker images | grep -q "snatchgame-client"; then + echo "✅ Imagen client encontrada" +else + echo "⚠️ Imagen client no encontrada" +fi + +if docker images | grep -q "snatchgame-admin"; then + echo "✅ Imagen admin encontrada" +else + echo "⚠️ Imagen admin no encontrada" +fi + +# Verificar configuración ngrok +echo "🔍 Verificando configuración ngrok..." +if /tmp/ngrok config check &>/dev/null; then + echo "✅ ngrok configurado correctamente" +else + echo "⚠️ ngrok no está autenticado" + echo " Ejecuta: /tmp/ngrok config add-authtoken TU_TOKEN" +fi + +echo "" +echo "🎯 LISTO PARA USAR:" +echo " ./setup-complete.sh" +echo "" +echo "📋 Si hay problemas:" +echo " • Asegúrate de tener tu authtoken de ngrok configurado" +echo " • Verifica que las imágenes Docker estén builds" +echo " • Ejecuta desde la carpeta ngrok/" \ No newline at end of file diff --git a/ngrok/update-ngrok-urls.sh b/ngrok/update-ngrok-urls.sh new file mode 100644 index 0000000..ba0c991 --- /dev/null +++ b/ngrok/update-ngrok-urls.sh @@ -0,0 +1,141 @@ +#!/bin/bash + +echo "🔄 Actualizando URLs de ngrok en Docker..." + +# Función para obtener URLs de ngrok +get_ngrok_urls() { + if curl -s http://localhost:4040/api/tunnels > /tmp/ngrok-api.json 2>/dev/null; then + CLIENT_URL=$(grep -o '"snatchgame-client"[^}]*"public_url":"[^"]*"' /tmp/ngrok-api.json | grep -o 'https://[^"]*' | head -1) + ADMIN_URL=$(grep -o '"snatchgame-admin"[^}]*"public_url":"[^"]*"' /tmp/ngrok-api.json | grep -o 'https://[^"]*' | head -1) + SERVER_URL=$(grep -o '"snatchgame-server"[^}]*"public_url":"[^"]*"' /tmp/ngrok-api.json | grep -o 'https://[^"]*' | head -1) + else + echo "❌ No se pudo conectar a la API de ngrok" + exit 1 + fi + + if [[ -z "$SERVER_URL" ]]; then + echo "❌ No se pudo obtener la URL del servidor" + exit 1 + fi +} + +# Obtener URLs actuales +get_ngrok_urls + +echo "🌐 URLs detectadas:" +echo " Server: $SERVER_URL" +echo " Client: $CLIENT_URL" +echo " Admin: $ADMIN_URL" + +# Crear docker-compose temporal con URLs reales +echo "📝 Creando configuración Docker actualizada..." + +cat > /tmp/docker-compose-ngrok-updated.yml << EOF +version: '3.8' + +services: + # Servidor Colyseus + snatchgame-server: + image: gitea.interno.com/nucleo000/snatchgame-server:latest + container_name: snatchgame-server + ports: + - "3067:2567" + environment: + - NODE_ENV=production + - PORT=2567 + networks: + - snatchgame-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:2567/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # Cliente Vue UI + snatchgame-client: + image: gitea.interno.com/nucleo000/snatchgame-client:latest + container_name: snatchgame-client + ports: + - "3010:3000" + environment: + - NODE_ENV=production + - PORT=3000 + - SERVER_URL=http://snatchgame-server:2567 + - PUBLIC_SERVER_URL=$SERVER_URL + depends_on: + - snatchgame-server + networks: + - snatchgame-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # Admin Dashboard + snatchgame-admin: + image: gitea.interno.com/nucleo000/snatchgame-admin:latest + container_name: snatchgame-admin + ports: + - "3011:3001" + environment: + - NODE_ENV=production + - PORT=3001 + - SERVER_URL=http://snatchgame-server:2567 + - PUBLIC_SERVER_URL=$SERVER_URL + depends_on: + - snatchgame-server + networks: + - snatchgame-network + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3001/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +networks: + snatchgame-network: + driver: bridge +EOF + +echo "🔄 Reiniciando servicios Docker con URLs actualizadas..." + +# Parar servicios actuales +docker compose -f docker-compose.ngrok.yml down 2>/dev/null || true + +# Iniciar con nueva configuración +docker compose -f /tmp/docker-compose-ngrok-updated.yml up -d + +# Esperar a que estén listos +echo "⏳ Esperando a que los servicios estén listos..." +sleep 15 + +# Verificar que estén funcionando +echo "🔍 Verificando servicios..." +for port in 3010 3011 3067; do + if curl -f http://localhost:$port/health &>/dev/null; then + echo "✅ Puerto $port: OK" + else + echo "❌ Puerto $port: FALLO" + fi +done + +echo "" +echo "🎉 Configuración actualizada!" +echo "🌐 URLs públicas:" +echo " 🎮 Cliente: $CLIENT_URL" +echo " 📊 Admin: $ADMIN_URL" +echo " 🎯 Server: $SERVER_URL" +echo "" +echo "🔍 Verificar configuración del cliente:" +curl -s https://$(echo $CLIENT_URL | cut -d'/' -f3)/api/config + +echo "" +echo "" +echo "✅ ¡Todo listo! Prueba abrir: $CLIENT_URL" \ No newline at end of file