From 2c245ea5319811c2eb926cdf0e2c323f49cffe5b Mon Sep 17 00:00:00 2001 From: josedario87 Date: Sun, 5 Oct 2025 02:22:23 -0600 Subject: [PATCH] Add automated setup script for tunnel management MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .gitea/workflows/deploy.yml | 24 ++--- README.md | 152 ++++++++++++++++++------------- setup.sh | 173 ++++++++++++++++++++++++++++++++++++ 3 files changed, 272 insertions(+), 77 deletions(-) create mode 100755 setup.sh diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index ce05622..9feded1 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -11,24 +11,18 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Verify credentials.json exists + - name: Setup tunnel if needed run: | - if [ ! -f credentials.json ]; then - echo "⚠️ credentials.json not found!" - echo " Make sure to copy it to the repo root before deploying" - echo " cp ~/.cloudflared/.json ./credentials.json" + if [ ! -f credentials.json ] || [ ! -f .env ]; then + echo "⚠️ credentials.json o .env no encontrados" + echo " Ejecuta './setup.sh' manualmente en el servidor para configurar el tunnel" + echo "" + echo " O copia manualmente:" + echo " - credentials.json desde ~/.cloudflared/.json" + echo " - .env con TUNNEL_ID configurado" exit 1 fi - echo "✓ credentials.json found" - - - 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" + echo "✓ credentials.json y .env encontrados" - name: Pull fresh cloudflared image run: docker compose pull diff --git a/README.md b/README.md index 5b57306..ee8524d 100644 --- a/README.md +++ b/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 - 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 -# Login a Cloudflare -cloudflared tunnel login +# Clonar el repositorio +git clone https://gitea.nucleoriofrio.com/nucleo000/cloudflareTunnel.git +cd cloudflareTunnel -# Crear el tunnel (guarda el TUNNEL_ID que te devuelve) -cloudflared tunnel create nucleorio-tunnel - -# Esto genera el archivo credentials.json en ~/.cloudflared/ +# Ejecutar setup (verifica si existe el tunnel, si no lo crea) +./setup.sh ``` -### 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: - -``` -Type: CNAME -Name: *.nucleoriofrio.com (o solo *) -Target: .cfargotunnel.com -Proxy: Activado (nube naranja) -``` - -Opcionalmente, también para el dominio raíz: - -``` -Type: CNAME -Name: @ (o nucleoriofrio.com) -Target: .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/.json ./credentials.json -``` - -### 5. Levantar el servicio +### Levantar el servicio ```bash docker-compose up -d ``` -### 6. Verificar logs +### Verificar logs ```bash docker-compose logs -f ``` -Deberías ver algo como: - +Deberías ver: ``` INF Connection registered connIndex=0 INF Registered tunnel connection ``` +--- + +## 🔧 Setup Manual (Alternativo) + +
+Click para expandir instrucciones manuales + +### 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/.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 *.nucleoriofrio.com +cloudflared tunnel route dns nucleoriofrio.com + +# Opción B: Manual en dashboard de Cloudflare +# Crea registros CNAME: +# - Name: * +# Target: .cfargotunnel.com +# Proxy: ON +``` + +### 5. Levantar servicio + +```bash +docker-compose up -d +``` + +
+ ## 🔧 Configuración ### config.yml @@ -132,16 +156,20 @@ Este repositorio incluye un workflow de Gitea Actions (`.gitea/workflows/deploy. 4. Levanta el stack actualizado 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 -# En el servidor donde corre el gitea-runner, copia los archivos necesarios -cd /ruta/donde/clona/el/runner -cp ~/.cloudflared/.json ./credentials.json -cp .env.example .env -nano .env # Configura TUNNEL_ID +# El gitea-runner clonará el repo automáticamente +# Solo necesitas ejecutar setup.sh la primera vez +cd /ruta/donde/runner/clona/el/repo +./setup.sh ``` -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 diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..c56fdb8 --- /dev/null +++ b/setup.sh @@ -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)"