feat: Add ngrok internet exposure system for testing
All checks were successful
build-and-deploy / filter (push) Successful in 2s
build-and-deploy / build (push) Successful in 6s
build-and-deploy / deploy (push) Successful in 10s

- 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
This commit is contained in:
2025-07-05 18:14:05 -06:00
parent 87f5b09f4d
commit b83d450ac6
9 changed files with 1216 additions and 0 deletions

107
ngrok/ARCHIVOS.md Normal file
View File

@@ -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

169
ngrok/README.md Normal file
View File

@@ -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.

View File

@@ -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

131
ngrok/expose-ngrok.sh Executable file
View File

@@ -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

173
ngrok/manage-tunnels.sh Executable file
View File

@@ -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

180
ngrok/setup-complete.sh Executable file
View File

@@ -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

178
ngrok/setup-ngrok.sh Executable file
View File

@@ -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

66
ngrok/test.sh Executable file
View File

@@ -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/"

141
ngrok/update-ngrok-urls.sh Normal file
View File

@@ -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"