Cómo servir múltiples dominios con Traefik y Let's Encrypt
- traefik
- dominios
- ssl
- let's encrypt
- docker
Si gestionas varios proyectos web o microservicios, la tarea de configurar un proxy inverso para cada uno, sumado a la gestión de certificados SSL con Let’s Encrypt, se vuelve tediosa y propensa a errores. Traefik simplifica esto al actuar como un proxy inverso dinámico que se integra directamente con Docker. Detecta tus servicios automáticamente y les asigna dominios y certificados SSL.
Mi regla es clara: si tienes más de un servicio web en tu servidor, Traefik es la solución más limpia. Evitas configurar Nginx o Apache para cada nuevo dominio, y la gestión de SSL se convierte en un proceso transparente.
Por qué Traefik es la elección para múltiples dominios
Traefik elimina la configuración manual del proxy inverso cada vez que añades un nuevo servicio o dominio. Su capacidad de descubrimiento automático —integrándose con Docker— significa que solo necesitas añadir unas etiquetas a tus contenedores. Él se encarga del resto.
Además, la integración con Let’s Encrypt para obtener certificados SSL es nativa y completamente automatizada. No hay scripts que mantener ni crons que verificar. Traefik renueva los certificados antes de que caduquen sin intervención manual, garantizando que tus dominios siempre estén protegidos con HTTPS.
Configurando Traefik como orquestador de dominios y SSL
Para empezar, necesitamos un docker-compose.yml que defina el servicio de Traefik. Este archivo define el servicio de Traefik, conectándolo al socket de Docker para descubrir servicios y configurar Let’s Encrypt.
Este es un ejemplo básico de cómo se vería la configuración de Traefik en tu docker-compose.yml:
version: '3.8'
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik-dynamic.yml:/etc/traefik/dynamic.yml:ro
- ./acme.json:/acme.json # Almacenar certificados Let's Encrypt
command:
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.letsencrypt.acme.email=tu-email@dominio.com
- --certificatesresolvers.letsencrypt.acme.storage=/acme.json
- --certificatesresolvers.letsencrypt.acme.tlschallenge=true
- --log.level=INFO
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.tudominio.com`)"
- "traefik.http.routers.traefik-dashboard.service=api@internal"
- "traefik.http.routers.traefik-dashboard.middlewares=auth@file" # Protege el dashboard
- "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
- "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
- "traefik.http.middlewares.auth.basicauth.users=usuario:$$apr1$$HASH_DE_TU_PASSWORD" # Genera un hash con htpasswd
Necesitas crear un archivo traefik-dynamic.yml para configuraciones dinámicas, como el middleware de autenticación para el dashboard:
http:
middlewares:
auth:
basicAuth:
users:
- "usuario:$$apr1$$HASH_DE_TU_PASSWORD"
El acme.json es donde Traefik guarda los certificados. Asegúrate de que los permisos de este archivo sean restrictivos (por ejemplo, chmod 600 acme.json) para proteger tus claves privadas.
Añadiendo nuevos dominios a tus servicios Docker
Una vez que Traefik está en marcha, añadir un nuevo servicio con su propio dominio es tan sencillo como añadir etiquetas a tu contenedor Docker. Traefik lee estas etiquetas y configura automáticamente el enrutamiento y el certificado SSL.
Por ejemplo, si tienes una aplicación web llamada mi-app que quieres exponer en mi-app.tudominio.com:
services:
mi-app:
image: nginx:latest
container_name: mi-app
restart: unless-stopped
labels:
- "traefik.enable=true"
- "traefik.http.routers.mi-app.rule=Host(`mi-app.tudominio.com`)"
- "traefik.http.routers.mi-app.entrypoints=websecure"
- "traefik.http.routers.mi-app.tls.certresolver=letsencrypt"
- "traefik.http.services.mi-app.loadbalancer.server.port=80" # Puerto interno de la app
Con estas etiquetas, Traefik detectará mi-app, la hará accesible desde mi-app.tudominio.com y solicitará automáticamente un certificado Let’s Encrypt. Es la forma más eficiente de gestionar múltiples webs en un VPS con Docker.
Ventajas y desventajas de usar Traefik
Lo que ganas:
- Automatización completa de SSL y enrutamiento: Olvídate de la configuración manual de certificados y de los archivos de host.
- Escalabilidad: Añadir nuevos servicios y dominios es cuestión de unas pocas etiquetas Docker, sin reiniciar Traefik.
- Observabilidad: El dashboard de Traefik ofrece una visión clara de todos tus servicios y rutas configuradas.
Lo que complicas:
- Curva de aprendizaje inicial: La configuración de Traefik y sus etiquetas requiere entender su lógica.
- Punto único de fallo: Si Traefik falla, todos tus servicios web dejan de ser accesibles. Es crítico monitorizarlo y configurarlo con
restart: unless-stopped. - Dependencia de Docker: Traefik está diseñado para entornos orquestados con Docker, Kubernetes, etc. No es la solución ideal para máquinas virtuales con servicios instalados directamente.
Traefik resuelve un problema real de infraestructura. La inversión inicial en aprenderlo se amortiza rápidamente al desplegar más servicios.
Si quieres profundizar en cómo Traefik maneja la redirección HTTP a HTTPS, tengo un artículo que explica los detalles. Para ver un caso de uso real, puedes revisar cómo se configura n8n en producción con Docker y Traefik. Y si todavía no usas Docker para tus proyectos, te recomiendo empezar con una guía para principiantes de Docker Compose.
Técnico freelance especializado en desarrollo a medida, automatizaciones con IA y gestión técnica para negocios en España. Más sobre mí →
¿Necesitas que alguien se ocupe de tu web?
Me encargo de que tu web funcione, esté segura y actualizada. Backups, actualizaciones y soporte directo. Planes desde 49 €/mes.