Initial commit: Cloudflare Tunnel → Traefik configuration

Configuración de Cloudflare Tunnel con wildcard *.nucleoriofrio.com
que apunta a Traefik para mantener autenticación con Authentik.

Componentes:
- config.yml: Configuración del tunnel con wildcard
- docker-compose.yml: Servicio cloudflared
- .env.example: Template para variables de entorno
- README.md: Documentación completa de setup
- .gitignore: Protección de credenciales
This commit is contained in:
2025-10-05 02:13:19 -06:00
commit ed49ee79d4
5 changed files with 251 additions and 0 deletions

3
.env.example Normal file
View File

@@ -0,0 +1,3 @@
# Cloudflare Tunnel ID
# Obtén este ID cuando crees el tunnel con: cloudflared tunnel create <nombre>
TUNNEL_ID=your-tunnel-id-here

20
.gitignore vendored Normal file
View File

@@ -0,0 +1,20 @@
# Archivos sensibles - NO commitear
credentials.json
.env
# Logs
*.log
# Docker
.docker/
# Sistema operativo
.DS_Store
Thumbs.db
# Editors
.vscode/
.idea/
*.swp
*.swo
*~

180
README.md Normal file
View File

@@ -0,0 +1,180 @@
# Cloudflare Tunnel → Traefik + Authentik
Configuración de Cloudflare Tunnel para exponer servicios a través de Traefik manteniendo la autenticación de Authentik.
## 🎯 Arquitectura
```
Internet → Cloudflare Tunnel → Traefik → Authentik Forward Auth → Apps
```
El wildcard `*.nucleoriofrio.com` apunta todo el tráfico a Traefik, que se encarga de:
- Enrutamiento correcto según el hostname
- Autenticación con Authentik
- Certificados SSL/TLS
- Redirecciones HTTP → HTTPS
## 📋 Requisitos previos
- Docker y Docker Compose instalados
- Cuenta de Cloudflare con dominio configurado
- Traefik corriendo en la red `traefik_network`
- Authentik configurado con Forward Auth en Traefik
## 🚀 Setup
### 1. Crear el tunnel en Cloudflare
```bash
# Login a Cloudflare
cloudflared tunnel login
# Crear el tunnel (guarda el TUNNEL_ID que te devuelve)
cloudflared tunnel create nucleorio-tunnel
# Esto genera el archivo credentials.json en ~/.cloudflared/
```
### 2. Configurar DNS en Cloudflare
En el dashboard de Cloudflare, crea un registro CNAME:
```
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
docker-compose up -d
```
### 6. Verificar logs
```bash
docker-compose logs -f
```
Deberías ver algo como:
```
INF Connection registered connIndex=0
INF Registered tunnel connection
```
## 🔧 Configuración
### config.yml
El archivo `config.yml` usa wildcard para capturar todo `*.nucleoriofrio.com` y redirigirlo a Traefik:
```yaml
ingress:
- hostname: "*.nucleoriofrio.com"
service: http://traefik:80
```
Traefik recibe el tráfico y:
1. Lee el `Host` header
2. Aplica las reglas de enrutamiento
3. Ejecuta Authentik Forward Auth si está configurado
4. Redirige al servicio correcto
### docker-compose.yml
El contenedor se conecta a la red `traefik_network` para poder comunicarse con Traefik.
## ✅ Verificación
Prueba acceder a tus servicios:
- https://amigos.nucleoriofrio.com → Debería redirigir a Authentik
- https://wifi.nucleoriofrio.com → Debería redirigir a Authentik
- https://portainer.nucleoriofrio.com → Debería redirigir a Authentik
## 🐛 Troubleshooting
### El tunnel no conecta
```bash
# Verificar logs
docker-compose logs -f
# Verificar que credentials.json existe y es válido
cat credentials.json
```
### Traefik no recibe el tráfico
```bash
# Verificar que el contenedor está en la red correcta
docker network inspect traefik_network
# Debería aparecer 'cloudflared-tunnel' en la lista
```
### Authentik no intercepta
Verifica que Traefik tiene configurado el middleware de Authentik Forward Auth para tus servicios.
### El wildcard no funciona
Asegúrate de que:
1. El registro DNS CNAME en Cloudflare está configurado como `*` o `*.nucleoriofrio.com`
2. El proxy (nube naranja) está activado
3. El tunnel está corriendo sin errores
## 📝 Notas importantes
- **No expongas servicios directamente**: Todo debe pasar por Traefik para mantener Authentik
- **Wildcard DNS**: Con `*.nucleoriofrio.com` no necesitas reconfigurar el tunnel para nuevos subdominios
- **Multiple WAN**: Cloudflare Tunnel maneja automáticamente las reconexiones si tu conexión se cae
- **Credenciales**: Nunca commitees `credentials.json` o `.env` al repositorio
## 🔐 Seguridad
Este setup mantiene toda la seguridad de Authentik porque:
- El tunnel termina en Traefik, no en las apps
- Traefik aplica Forward Auth antes de permitir acceso
- Las apps nunca están expuestas directamente a Internet
## 📚 Referencias
- [Cloudflare Tunnel Docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/)
- [Wildcard DNS](https://developers.cloudflare.com/dns/manage-dns-records/reference/wildcard-dns-records/)

28
config.yml Normal file
View File

@@ -0,0 +1,28 @@
# Cloudflare Tunnel Configuration
# Apunta a Traefik para mantener Authentik Forward Auth
tunnel: ${TUNNEL_ID}
credentials-file: /etc/cloudflared/credentials.json
# Configuración de ingress - wildcard apunta todo a Traefik
ingress:
# Wildcard - todo *.nucleoriofrio.com pasa por Traefik
- hostname: "*.nucleoriofrio.com"
service: http://traefik:80
originRequest:
noTLSVerify: false
# Preserve el Host header para que Traefik pueda enrutar correctamente
httpHostHeader: ""
# Dominio raíz (opcional)
- hostname: nucleoriofrio.com
service: http://traefik:80
originRequest:
noTLSVerify: false
httpHostHeader: ""
# Catch-all - rechaza todo lo demás
- service: http_status:404
# Logging
loglevel: info

20
docker-compose.yml Normal file
View File

@@ -0,0 +1,20 @@
version: '3.8'
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared-tunnel
restart: unless-stopped
command: tunnel --config /etc/cloudflared/config.yml run
volumes:
- ./config.yml:/etc/cloudflared/config.yml:ro
- ./credentials.json:/etc/cloudflared/credentials.json:ro
environment:
- TUNNEL_ID=${TUNNEL_ID}
networks:
- traefik_network
networks:
traefik_network:
external: true
name: traefik_network