diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 2923891..8ae21ec 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -9,19 +9,38 @@ jobs: deploy: runs-on: docker env: - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + TUNNEL_ID: ${{ secrets.TUNNEL_ID }} + TUNNEL_CREDENTIALS: ${{ secrets.TUNNEL_CREDENTIALS }} steps: - uses: actions/checkout@v3 - - name: Check and setup tunnel if needed - run: ./setup-ci.sh + - name: Create .env file from secrets + run: | + cat > .env << EOF + TUNNEL_ID=${{ secrets.TUNNEL_ID }} + EOF + + - name: Create credentials.json from secret + run: | + echo '${{ secrets.TUNNEL_CREDENTIALS }}' > credentials.json + + - name: Verify tunnel configuration + run: | + if [ ! -f credentials.json ] || [ ! -f .env ]; then + echo "❌ Error: credentials.json o .env no se crearon correctamente" + exit 1 + fi + echo "✓ Archivos de configuración creados desde secrets" + + - name: Ensure external docker network exists + run: | + docker network inspect principal >/dev/null 2>&1 || docker network create principal - name: Pull fresh cloudflared image run: docker compose pull - name: Clean up stack - run: docker compose --project-name cloudflared-tunnel down + run: docker compose --project-name cloudflared-tunnel down || true - name: Update stack run: docker compose --project-name cloudflared-tunnel up -d --remove-orphans --wait diff --git a/README.md b/README.md index 75ba07a..c1bce3a 100644 --- a/README.md +++ b/README.md @@ -150,44 +150,63 @@ El contenedor se conecta a la red `principal` para poder comunicarse con Traefik Este repositorio incluye un workflow de Gitea Actions (`.gitea/workflows/deploy.yml`) que automáticamente despliega el tunnel cuando haces push a `main`. **¿Qué hace el workflow?** -1. Ejecuta `setup-ci.sh` para verificar que existan `credentials.json` y `.env` -2. Descarga la última imagen de `cloudflare/cloudflared` -3. Detiene el stack actual -4. Levanta el stack actualizado -5. Muestra los logs del tunnel +1. Crea `.env` y `credentials.json` desde Gitea Secrets +2. Verifica que la red Docker `principal` exista (la crea si no) +3. Descarga la última imagen de `cloudflare/cloudflared` +4. Detiene el stack actual +5. Levanta el stack actualizado +6. Muestra los logs del tunnel -### Setup inicial para CI/CD +### Configurar Secrets en Gitea -**Primera vez en el servidor donde corre el gitea-runner:** +**Paso 1: Crear el tunnel y obtener las credenciales** + +En tu PC local (o donde prefieras): ```bash -# 1. El runner clonará el repo automáticamente en su workspace -# 2. SSH al servidor y navega al workspace del runner -cd /ruta/donde/runner/clona/el/repo +# Clonar el repo +git clone https://gitea.nucleoriofrio.com/nucleo000/cloudflareTunnel.git +cd cloudflareTunnel -# 3. Ejecuta setup.sh UNA SOLA VEZ (requiere login interactivo) +# Ejecutar setup para crear el tunnel ./setup.sh ``` -El script creará `credentials.json` y `.env` que **persisten** en el workspace del runner entre ejecuciones. +Esto genera: +- `credentials.json` - Contiene las credenciales del tunnel +- `.env` - Contiene el TUNNEL_ID -**De ahí en adelante:** -- Cada `git push` ejecuta el workflow automáticamente -- `setup-ci.sh` verifica que los archivos existan -- Si existen, continúa con el deploy -- Si no existen, el workflow falla con instrucciones - -### (Opcional) Variables de entorno en Gitea Secrets - -Puedes configurar secrets en Gitea para el workflow (aunque actualmente no son necesarios con el enfoque de setup manual): +**Paso 2: Configurar los secrets en Gitea** +Ve a tu repositorio en Gitea: ``` -Settings > Secrets > Actions: -- CLOUDFLARE_ACCOUNT_ID: tu-account-id -- CLOUDFLARE_API_TOKEN: tu-api-token +Settings > Secrets > Actions ``` -**Nota**: `credentials.json` y `.env` se generan localmente y NO se commitean al repo (están en `.gitignore`), por seguridad. +Agrega estos **2 secrets**: + +1. **`TUNNEL_ID`** (tipo: Secret) + ```bash + # Obtén el valor de .env + cat .env + # Copia el valor después de TUNNEL_ID= + ``` + +2. **`TUNNEL_CREDENTIALS`** (tipo: Secret) + ```bash + # Copia TODO el contenido de credentials.json + cat credentials.json + # Debe ser un JSON válido que empiece con { y termine con } + ``` + +**Paso 3: ¡Listo!** + +Ahora cada `git push` a `main` desplegará automáticamente el tunnel usando los secrets configurados. + +**Importante:** +- No necesitas ejecutar nada manualmente en el servidor +- Los secrets están seguros en Gitea +- `credentials.json` y `.env` NUNCA se commitean al repo (están en `.gitignore`) ## ✅ Verificación diff --git a/setup-ci.sh b/setup-ci.sh deleted file mode 100755 index 9c10959..0000000 --- a/setup-ci.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -# Setup no interactivo para CI/CD (Gitea Actions) -# Usa Cloudflare API Token en vez de login interactivo - -set -e - -TUNNEL_NAME="nucleorio-tunnel" -DOMAIN="nucleoriofrio.com" -ACCOUNT_ID="${CLOUDFLARE_ACCOUNT_ID}" -API_TOKEN="${CLOUDFLARE_API_TOKEN}" - -echo "🤖 Cloudflare Tunnel CI Setup" -echo "==============================" -echo "" - -# Verificar variables de entorno -if [ -z "$ACCOUNT_ID" ]; then - echo "❌ CLOUDFLARE_ACCOUNT_ID no está configurado" - echo " Configúralo en Gitea: Settings > Secrets" - exit 1 -fi - -if [ -z "$API_TOKEN" ]; then - echo "❌ CLOUDFLARE_API_TOKEN no está configurado" - echo " Configúralo en Gitea: Settings > Secrets" - exit 1 -fi - -# Verificar si ya existen los archivos -if [ -f "credentials.json" ] && [ -f ".env" ]; then - echo "✓ credentials.json y .env ya existen" - TUNNEL_ID=$(jq -r '.TunnelID' credentials.json 2>/dev/null || echo "") - - if [ -n "$TUNNEL_ID" ]; then - echo "✓ TUNNEL_ID: $TUNNEL_ID" - echo "✓ Setup ya está completo, no se requiere acción" - exit 0 - fi -fi - -echo "⚠️ Archivos de configuración no encontrados" -echo "" -echo "Para CI/CD automatizado necesitas:" -echo "1. Ejecutar ./setup.sh manualmente UNA VEZ en el servidor" -echo "2. Esto genera credentials.json y .env" -echo "3. Estos archivos persisten entre deploys del runner" -echo "" -echo "El workflow automáticamente los usará en futuros deploys." -echo "" -exit 1