feat(traefik): actualizar stack y añadir dashboard dinámico

- docker-compose.yml y stack.env: ajustes generales del stack
- traefik-dashboard.yml: nueva config dinámica para exponer el dashboard
  vía Traefik con autenticación Authentik
- README.md: documentación actualizada

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Eduardo David Paredes Vara
2026-05-25 05:47:19 +00:00
parent 5e220591e7
commit 97512178db
4 changed files with 43 additions and 8 deletions
+3 -3
View File
@@ -37,12 +37,12 @@ Este stack despliega Traefik configurado para:
- Repository URL: `<tu-repositorio>`
- Repository reference: `main`
- Compose path: `Traefik/docker-compose.yml`
5. Carga el archivo de variables de entorno: `Traefik/stack.env`
5. Copia `Traefik/stack.env` a `Traefik/.env` y carga `Traefik/.env` como archivo de variables de entorno
6. Haz clic en **Deploy the stack**
### Variables de Entorno
Edita el archivo `stack.env`:
Edita el archivo `.env`:
```env
# Imagen de Traefik
@@ -297,7 +297,7 @@ sudo tar -xzf traefik-backup-YYYYMMDD.tar.gz -C /
Para actualizar Traefik:
1. En Portainer, ve al stack de Traefik
2. Edita el archivo `stack.env` y cambia la versión:
2. Edita el archivo `.env` y cambia la versión:
```env
TRAEFIK_IMAGE=traefik:v3.3
```
+25 -2
View File
@@ -7,10 +7,15 @@ services:
- "host.docker.internal:host-gateway"
command:
- "--ping=true"
# Logs
- "--log.level=${TRAEFIK_LOG_LEVEL}"
- "--accesslog=true"
- "--accesslog.filepath=/var/log/traefik/access.log"
- "--accesslog.format=json"
# Dashboard (por ahora solo interno)
# Dashboard
- "--api.dashboard=true"
- "--api.insecure=false"
@@ -27,10 +32,22 @@ services:
- "--providers.docker.exposedbydefault=false"
- "--providers.docker.network=${TRAEFIK_DOCKER_NETWORK}"
# Permite backend HTTPS con certificado interno/sin SAN de IP
- "--serverstransport.insecureskipverify=true"
# Proveedor de ficheros dinámicos
- "--providers.file.directory=/dynamic"
- "--providers.file.watch=true"
# Cloudflare forwardedHeaders desactivado intencionalmente:
# con CGNAT el bouncer de CrowdSec vería la IP real del usuario y la banearía
# aunque el tráfico llegue por el tunnel. El bouncer ve la IP del contenedor
# cloudflared (red Docker privada, en allowlist) y nunca bloquea tráfico CF.
# Plugin CrowdSec Bouncer (middleware de seguridad L7)
- "--experimental.plugins.crowdsec-bouncer.modulename=github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin"
- "--experimental.plugins.crowdsec-bouncer.version=v1.6.0"
# ACME / Let's Encrypt (resolver "letsencrypt")
- "--certificatesresolvers.letsencrypt.acme.email=${TRAEFIK_ACME_EMAIL}"
- "--certificatesresolvers.letsencrypt.acme.storage=${TRAEFIK_ACME_STORAGE}"
@@ -45,11 +62,17 @@ services:
- /var/run/docker.sock:/var/run/docker.sock:ro,Z
- ${TRAEFIK_DYNAMIC_DIR}:/dynamic:Z
- ${TRAEFIK_LETSENCRYPT_DIR}:/letsencrypt:Z
- ${TRAEFIK_LOG_DIR}:/var/log/traefik:Z
networks:
- proxy
healthcheck:
test: ["CMD", "traefik", "healthcheck", "--ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
proxy:
external: true
+3 -3
View File
@@ -1,11 +1,11 @@
##### Traefik #####
TRAEFIK_IMAGE=traefik:v3.1
TRAEFIK_IMAGE=traefik:v3.6.13
TRAEFIK_LOG_LEVEL=INFO
TRAEFIK_DOCKER_NETWORK=proxy
TRAEFIK_ACME_EMAIL=lets.encrypt@example.com
TRAEFIK_ACME_EMAIL=admin@example.com
TRAEFIK_ACME_STORAGE=/letsencrypt/acme.json
TRAEFIK_HTTP_PORT=80
TRAEFIK_HTTPS_PORT=443
TRAEFIK_DYNAMIC_DIR=/opt/traefik/dynamic
TRAEFIK_LETSENCRYPT_DIR=/opt/traefik/letsencrypt
TRAEFIK_LOG_DIR=/opt/traefik/logs
+12
View File
@@ -0,0 +1,12 @@
http:
routers:
traefik-dashboard:
rule: Host(`traefik.sherlockhomeless.net`)
entryPoints:
- websecure
tls:
certResolver: letsencrypt
middlewares:
- crowdsec-bouncer@file
- ths-authentik@docker
service: api@internal