Add automated setup script for tunnel management
Some checks failed
deploy-tunnel / deploy (push) Failing after 1s

- setup.sh: Script interactivo que verifica/crea el tunnel automáticamente
- Detecta si ya existe el tunnel nucleorio-tunnel
- Instala cloudflared si no está presente
- Genera credentials.json y .env automáticamente
- Configura DNS opcionalmente
- Actualizado README con instrucciones de setup rápido
- Workflow actualizado con mejores mensajes de error
This commit is contained in:
2025-10-05 02:22:23 -06:00
parent 8351ee1e86
commit 2c245ea531
3 changed files with 272 additions and 77 deletions

View File

@@ -11,24 +11,18 @@ jobs:
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Verify credentials.json exists - name: Setup tunnel if needed
run: | run: |
if [ ! -f credentials.json ]; then if [ ! -f credentials.json ] || [ ! -f .env ]; then
echo "⚠️ credentials.json not found!" echo "⚠️ credentials.json o .env no encontrados"
echo " Make sure to copy it to the repo root before deploying" echo " Ejecuta './setup.sh' manualmente en el servidor para configurar el tunnel"
echo " cp ~/.cloudflared/<TUNNEL_ID>.json ./credentials.json" echo ""
echo " O copia manualmente:"
echo " - credentials.json desde ~/.cloudflared/<TUNNEL_ID>.json"
echo " - .env con TUNNEL_ID configurado"
exit 1 exit 1
fi fi
echo "✓ credentials.json found" echo "✓ credentials.json y .env encontrados"
- name: Verify .env exists
run: |
if [ ! -f .env ]; then
echo "⚠️ .env file not found!"
echo " Copy .env.example to .env and configure TUNNEL_ID"
exit 1
fi
echo "✓ .env file found"
- name: Pull fresh cloudflared image - name: Pull fresh cloudflared image
run: docker compose pull run: docker compose pull

152
README.md
View File

@@ -22,83 +22,107 @@ El wildcard `*.nucleoriofrio.com` apunta todo el tráfico a Traefik, que se enca
- Authentik configurado con Forward Auth en Traefik - Authentik configurado con Forward Auth en Traefik
- Gitea Runner configurado (para auto-deploy con Gitea Actions) - Gitea Runner configurado (para auto-deploy con Gitea Actions)
## 🚀 Setup ## 🚀 Setup Rápido (Recomendado)
### 1. Crear el tunnel en Cloudflare ### Setup Automático con Script
En una PC nueva, solo necesitas clonar el repo y ejecutar el script de setup:
```bash ```bash
# Login a Cloudflare # Clonar el repositorio
cloudflared tunnel login git clone https://gitea.nucleoriofrio.com/nucleo000/cloudflareTunnel.git
cd cloudflareTunnel
# Crear el tunnel (guarda el TUNNEL_ID que te devuelve) # Ejecutar setup (verifica si existe el tunnel, si no lo crea)
cloudflared tunnel create nucleorio-tunnel ./setup.sh
# Esto genera el archivo credentials.json en ~/.cloudflared/
``` ```
### 2. Configurar DNS en Cloudflare El script automáticamente:
1. ✅ Instala `cloudflared` si no está instalado
2. ✅ Te autentica con Cloudflare (abre el navegador)
3. ✅ Verifica si ya existe el tunnel `nucleorio-tunnel`
4. ✅ Si no existe, lo crea
5. ✅ Genera `credentials.json` y `.env`
6. ✅ Opcionalmente configura DNS automáticamente
En el dashboard de Cloudflare, crea un registro CNAME: ### Levantar el servicio
```
Type: CNAME
Name: *.nucleoriofrio.com (o solo *)
Target: <TUNNEL_ID>.cfargotunnel.com
Proxy: Activado (nube naranja)
```
Opcionalmente, también para el dominio raíz:
```
Type: CNAME
Name: @ (o nucleoriofrio.com)
Target: <TUNNEL_ID>.cfargotunnel.com
Proxy: Activado
```
### 3. Configurar este repositorio
```bash
# Copiar el archivo de ejemplo
cp .env.example .env
# Editar con tu TUNNEL_ID
nano .env
```
Pega tu `TUNNEL_ID` en el archivo `.env`:
```env
TUNNEL_ID=tu-tunnel-id-aqui
```
### 4. Copiar credentials.json
Copia el archivo de credenciales generado por Cloudflare:
```bash
cp ~/.cloudflared/<TUNNEL_ID>.json ./credentials.json
```
### 5. Levantar el servicio
```bash ```bash
docker-compose up -d docker-compose up -d
``` ```
### 6. Verificar logs ### Verificar logs
```bash ```bash
docker-compose logs -f docker-compose logs -f
``` ```
Deberías ver algo como: Deberías ver:
``` ```
INF Connection registered connIndex=0 INF Connection registered connIndex=0
INF Registered tunnel connection INF Registered tunnel connection
``` ```
---
## 🔧 Setup Manual (Alternativo)
<details>
<summary>Click para expandir instrucciones manuales</summary>
### 1. Instalar cloudflared
```bash
# Debian/Ubuntu
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
```
### 2. Crear/Verificar el tunnel
```bash
# Login a Cloudflare
cloudflared tunnel login
# Listar tunnels existentes
cloudflared tunnel list
# Si no existe, crear uno nuevo
cloudflared tunnel create nucleorio-tunnel
# Copiar credentials
cp ~/.cloudflared/<TUNNEL_ID>.json ./credentials.json
```
### 3. Configurar .env
```bash
cp .env.example .env
nano .env # Agregar TUNNEL_ID
```
### 4. Configurar DNS
```bash
# Opción A: Automático
cloudflared tunnel route dns <TUNNEL_ID> *.nucleoriofrio.com
cloudflared tunnel route dns <TUNNEL_ID> nucleoriofrio.com
# Opción B: Manual en dashboard de Cloudflare
# Crea registros CNAME:
# - Name: *
# Target: <TUNNEL_ID>.cfargotunnel.com
# Proxy: ON
```
### 5. Levantar servicio
```bash
docker-compose up -d
```
</details>
## 🔧 Configuración ## 🔧 Configuración
### config.yml ### config.yml
@@ -132,16 +156,20 @@ Este repositorio incluye un workflow de Gitea Actions (`.gitea/workflows/deploy.
4. Levanta el stack actualizado 4. Levanta el stack actualizado
5. Muestra los logs del tunnel 5. Muestra los logs del tunnel
**Importante antes del primer deploy:** **Setup inicial en el servidor:**
En el servidor donde corre el gitea-runner, ejecuta el setup una sola vez:
```bash ```bash
# En el servidor donde corre el gitea-runner, copia los archivos necesarios # El gitea-runner clonará el repo automáticamente
cd /ruta/donde/clona/el/runner # Solo necesitas ejecutar setup.sh la primera vez
cp ~/.cloudflared/<TUNNEL_ID>.json ./credentials.json cd /ruta/donde/runner/clona/el/repo
cp .env.example .env ./setup.sh
nano .env # Configura TUNNEL_ID
``` ```
Una vez configurado, cada `git push` al repo actualizará automáticamente el tunnel. Una vez configurado, cada `git push` actualizará automáticamente el tunnel.
**Nota**: `credentials.json` y `.env` se generan localmente y NO se commitean al repo (están en `.gitignore`), por seguridad.
## ✅ Verificación ## ✅ Verificación

173
setup.sh Executable file
View File

@@ -0,0 +1,173 @@
#!/bin/bash
set -e
TUNNEL_NAME="nucleorio-tunnel"
DOMAIN="nucleoriofrio.com"
WILDCARD_SUBDOMAIN="*"
echo "🚀 Cloudflare Tunnel Setup Script"
echo "=================================="
echo ""
# Verificar si cloudflared está instalado
if ! command -v cloudflared &> /dev/null; then
echo "⚠️ cloudflared no está instalado"
echo "Instalando cloudflared..."
if [ -f /etc/debian_version ]; then
# Debian/Ubuntu
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
rm cloudflared-linux-amd64.deb
else
echo "❌ Sistema operativo no soportado. Instala cloudflared manualmente:"
echo " https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation/"
exit 1
fi
echo "✓ cloudflared instalado"
fi
# Verificar si ya existe credentials.json
if [ -f "credentials.json" ]; then
echo "✓ credentials.json ya existe"
# Extraer TUNNEL_ID del credentials.json
TUNNEL_ID=$(jq -r '.TunnelID' credentials.json 2>/dev/null || echo "")
if [ -z "$TUNNEL_ID" ]; then
echo "⚠️ No se pudo leer TUNNEL_ID de credentials.json"
echo " Verifica que el archivo sea válido"
exit 1
fi
echo "✓ TUNNEL_ID encontrado: $TUNNEL_ID"
# Verificar si el tunnel existe en Cloudflare
echo "Verificando si el tunnel existe en Cloudflare..."
if cloudflared tunnel info "$TUNNEL_ID" &> /dev/null; then
echo "✓ Tunnel '$TUNNEL_NAME' existe en Cloudflare"
else
echo "⚠️ El credentials.json existe pero el tunnel no está en Cloudflare"
echo " Esto puede pasar si el tunnel fue eliminado"
echo " ¿Quieres crear uno nuevo? (s/n)"
read -r response
if [[ "$response" =~ ^[Ss]$ ]]; then
rm credentials.json
rm .env 2>/dev/null || true
else
exit 1
fi
fi
fi
# Si no existe credentials.json, crear el tunnel
if [ ! -f "credentials.json" ]; then
echo ""
echo "📝 Necesitamos crear un nuevo tunnel"
echo ""
# Login a Cloudflare
echo "1⃣ Autenticando con Cloudflare..."
echo " Se abrirá tu navegador para autorizar"
cloudflared tunnel login
# Verificar si ya existe un tunnel con este nombre
echo ""
echo "2⃣ Verificando si existe el tunnel '$TUNNEL_NAME'..."
EXISTING_TUNNEL=$(cloudflared tunnel list --output json 2>/dev/null | jq -r ".[] | select(.name==\"$TUNNEL_NAME\") | .id" || echo "")
if [ -n "$EXISTING_TUNNEL" ]; then
echo "✓ Tunnel '$TUNNEL_NAME' ya existe con ID: $EXISTING_TUNNEL"
TUNNEL_ID="$EXISTING_TUNNEL"
# Copiar credentials del directorio de cloudflared
CRED_FILE="$HOME/.cloudflared/$TUNNEL_ID.json"
if [ -f "$CRED_FILE" ]; then
cp "$CRED_FILE" ./credentials.json
echo "✓ credentials.json copiado"
else
echo "⚠️ No se encontró el archivo de credenciales en $CRED_FILE"
echo " Creando un nuevo tunnel..."
cloudflared tunnel delete "$TUNNEL_NAME" --force
EXISTING_TUNNEL=""
fi
fi
if [ -z "$EXISTING_TUNNEL" ]; then
echo "Creando nuevo tunnel '$TUNNEL_NAME'..."
cloudflared tunnel create "$TUNNEL_NAME"
# Obtener el TUNNEL_ID del nuevo tunnel
TUNNEL_ID=$(cloudflared tunnel list --output json 2>/dev/null | jq -r ".[] | select(.name==\"$TUNNEL_NAME\") | .id")
if [ -z "$TUNNEL_ID" ]; then
echo "❌ Error al crear el tunnel"
exit 1
fi
echo "✓ Tunnel creado con ID: $TUNNEL_ID"
# Copiar credentials
cp "$HOME/.cloudflared/$TUNNEL_ID.json" ./credentials.json
echo "✓ credentials.json creado"
fi
fi
# Crear/actualizar .env
if [ ! -f ".env" ] || ! grep -q "TUNNEL_ID=" .env 2>/dev/null; then
echo ""
echo "3⃣ Creando archivo .env..."
echo "TUNNEL_ID=$TUNNEL_ID" > .env
echo "✓ .env creado con TUNNEL_ID=$TUNNEL_ID"
else
echo "✓ .env ya existe"
fi
# Configurar DNS en Cloudflare
echo ""
echo "4⃣ Configurando DNS en Cloudflare..."
echo ""
echo "Para que el tunnel funcione, necesitas configurar DNS:"
echo ""
echo "Opción A: Usando cloudflared CLI (RECOMENDADO)"
echo "----------------------------------------------"
echo "cloudflared tunnel route dns $TUNNEL_ID $WILDCARD_SUBDOMAIN.$DOMAIN"
echo "cloudflared tunnel route dns $TUNNEL_ID $DOMAIN"
echo ""
echo "Opción B: Manualmente en el Dashboard de Cloudflare"
echo "---------------------------------------------------"
echo "1. Ve a https://dash.cloudflare.com"
echo "2. Selecciona tu dominio: $DOMAIN"
echo "3. Ve a DNS > Records"
echo "4. Crea estos registros CNAME:"
echo " - Name: $WILDCARD_SUBDOMAIN"
echo " Target: $TUNNEL_ID.cfargotunnel.com"
echo " Proxy: ON (nube naranja)"
echo ""
echo " - Name: @"
echo " Target: $TUNNEL_ID.cfargotunnel.com"
echo " Proxy: ON (nube naranja)"
echo ""
echo "¿Quieres configurar DNS automáticamente? (s/n)"
read -r dns_response
if [[ "$dns_response" =~ ^[Ss]$ ]]; then
echo "Configurando DNS..."
cloudflared tunnel route dns "$TUNNEL_ID" "$WILDCARD_SUBDOMAIN.$DOMAIN" || echo "⚠️ Error configurando wildcard, puede que ya exista"
cloudflared tunnel route dns "$TUNNEL_ID" "$DOMAIN" || echo "⚠️ Error configurando dominio raíz, puede que ya exista"
echo "✓ DNS configurado"
fi
echo ""
echo "✅ Setup completado!"
echo ""
echo "Archivos generados:"
echo " - credentials.json (TUNNEL_ID: $TUNNEL_ID)"
echo " - .env"
echo ""
echo "Próximos pasos:"
echo " 1. Levanta el tunnel: docker-compose up -d"
echo " 2. Verifica logs: docker-compose logs -f"
echo " 3. Prueba acceder a: https://amigos.$DOMAIN"
echo ""
echo "Nota: credentials.json y .env NO se commitean al repo (están en .gitignore)"