Add automated setup script for tunnel management
Some checks failed
deploy-tunnel / deploy (push) Failing after 1s
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:
@@ -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
152
README.md
@@ -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
173
setup.sh
Executable 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)"
|
||||||
Reference in New Issue
Block a user