Configuración de Traefik en un VPS para el proxy automático de contenedores Docker con SSL
TL;DR
En esta guía, configuraremos Traefik v3 en un servidor privado virtual (VPS) para la detección y el proxy automático de contenedores Docker, garantizando la emisión y renovación automática de certificados SSL de Let's Encrypt. Esto le permitirá desplegar fácilmente nuevos servicios web en Docker, que estarán disponibles a través de un nombre de dominio con HTTPS sin la configuración manual de proxy y certificados para cada nuevo servicio.
- Configuramos Traefik v3 como proxy inverso y balanceador de carga.
- Integramos Traefik con Docker para la detección automática de servicios mediante etiquetas.
- Automatizamos la obtención y renovación de certificados SSL a través de Let's Encrypt.
- Utilizamos Docker Compose para una gestión cómoda de la infraestructura.
- Garantizamos la seguridad básica del servidor y de Traefik.
Qué configuramos y por qué
Configuraremos Traefik, un moderno proxy inverso y balanceador de carga nativo de la nube que se integra perfectamente con entornos dinámicos como Docker. La tarea principal es automatizar el proceso de publicación de servicios web ejecutados en contenedores Docker, haciéndolos accesibles desde Internet mediante nombres de dominio y con una conexión HTTPS segura.
Al final, obtendrá una infraestructura flexible y escalable, donde cada nuevo contenedor Docker destinado al acceso público se registrará automáticamente en Traefik. No tendrá que editar manualmente los archivos de configuración de Nginx o Apache, ni preocuparse por la obtención y renovación de certificados SSL; Traefik lo hará por usted, utilizando Let's Encrypt. Esto simplifica significativamente el despliegue y la gestión de múltiples microservicios o aplicaciones web en un solo VPS.
¿Qué alternativas existen? Para publicar servicios web, se pueden utilizar proxies inversos tradicionales como Nginx o Apache, que requieren configuración manual para cada nuevo servicio. En entornos de nube (AWS, GCP, Azure), se suelen utilizar balanceadores de carga gestionados y API Gateway. Sin embargo, para el autoalojamiento en un VPS, Traefik ofrece una combinación única de facilidad de configuración, automatización y profunda integración con Docker. Al elegir una solución self-hosted en un VPS, obtiene control total sobre su infraestructura, ahorra en pagos mensuales por servicios gestionados y puede adaptar todo a sus necesidades específicas, lo que es ideal para desarrolladores, fundadores individuales y entusiastas.
Qué configuración de VPS se necesita para esta tarea
La elección de la configuración del VPS depende de la cantidad y la carga de los contenedores Docker que planea proxy a través de Traefik. Traefik en sí es relativamente ligero, pero los servicios proxy pueden ser exigentes.
Requisitos mínimos
- CPU: 1 núcleo (por ejemplo, Intel Xeon E3/E5).
- RAM: 2 GB (para Traefik y varios contenedores Docker ligeros).
- Disco: 40 GB SSD (para el sistema operativo, imágenes Docker, registros y datos de contenedores).
- Red: Puerto de 100 Mbps con tráfico ilimitado o un volumen suficiente (a partir de 1 TB/mes) para sus necesidades.
- Sistema operativo: Ubuntu 24.04 LTS (recomendado) o Debian 12.
Plan de VPS recomendado para la mayoría de las tareas
Para proyectos más serios, que incluyen varias aplicaciones web, bases de datos, o si espera una carga moderada, se recomienda la siguiente configuración:
- CPU: 2 núcleos (por ejemplo, Intel Xeon E5).
- RAM: 4 GB.
- Disco: 80-120 GB SSD (para alojar cómodamente varias aplicaciones y sus datos).
- Red: Puerto de 1 Gbps con tráfico ilimitado.
Puede adquirir un VPS con las características indicadas para empezar. Esta configuración garantizará un funcionamiento estable de Traefik y permitirá alojar hasta 5-10 contenedores Docker medianos sin ralentizaciones significativas.
Cuándo se necesita un servidor dedicado y no un VPS
Un servidor dedicado (dedicated) es preferible cuando:
- Necesita el máximo rendimiento y estabilidad sin el efecto "vecino ruidoso" característico de los VPS.
- Planea alojar aplicaciones de alta carga que requieren más de 8-16 GB de RAM y más de 4 núcleos de CPU.
- Necesita una gran cantidad de espacio en disco (varios TB) o configuraciones de disco específicas (RAID).
- Se requieren componentes de hardware específicos (GPU, tarjetas de red especiales).
- Es necesario cumplir con estrictos requisitos regulatorios, que pueden ser más fáciles de cumplir en hardware totalmente controlado.
Para la mayoría de las tareas relacionadas con Traefik y contenedores Docker para pequeñas y medianas empresas o proyectos personales, un VPS es más que suficiente.
Ubicación: en qué influye
La elección de la ubicación del VPS influye en:
- Latencia: Cuanto más cerca esté el servidor de su audiencia principal, más rápido se cargarán las páginas y responderán los servicios.
- Cumplimiento legal: En algunos casos, el almacenamiento de datos en una jurisdicción específica es obligatorio.
- Disponibilidad: Diferentes ubicaciones pueden tener diferente estabilidad y disponibilidad de red.
Elija una ubicación que esté geográficamente más cerca de sus usuarios principales para un rendimiento óptimo.
Preparación del servidor
Después de obtener acceso a su nuevo VPS, es necesario realizar algunos pasos básicos para su preparación y seguridad.
1. Conexión por SSH y creación de usuario
Conéctese al servidor como root (o el usuario proporcionado por el hoster) y cree un nuevo usuario con derechos limitados. Reemplace ваш_пользователь por el nombre de usuario deseado.
ssh root@ВАШ_IP_АДРЕС # Conectarse como root
adduser ваш_пользователь # Crear un nuevo usuario
usermod -aG sudo ваш_пользователь # Añadir el usuario al grupo sudo
Ahora, salga de la sesión root y conéctese con el nuevo usuario:
exit # Salir de la sesión root
ssh ваш_пользователь@ВАШ_IP_АДРЕС # Conectarse con el nuevo usuario
2. Configuración de claves SSH (recomendado)
Para mejorar la seguridad, se recomienda utilizar claves SSH en lugar de contraseñas. Si aún no tiene una clave SSH, genérela en su máquina local:
ssh-keygen -t rsa -b 4096 # Generar una nueva clave SSH (en la máquina local)
Copie la clave pública al servidor:
ssh-copy-id ваш_пользователь@ВАШ_IP_АДРЕС # Copiar la clave pública al servidor
Después de verificar el inicio de sesión con la clave, desactive la autenticación por contraseña para root y su usuario en el archivo /etc/ssh/sshd_config. Busque las siguientes líneas y modifíquelas:
sudo nano /etc/ssh/sshd_config # Abrir la configuración del servidor SSH
Cambie o añada:
PermitRootLogin no
PasswordAuthentication no
Reinicie el servicio SSH:
sudo systemctl restart sshd # Reiniciar el servicio SSH
3. Actualización del sistema
Asegúrese de que todos los paquetes del servidor estén actualizados a las últimas versiones.
sudo apt update && sudo apt upgrade -y # Actualizar la lista de paquetes y todos los paquetes instalados
4. Instalación y configuración de Firewall (UFW)
Configuraremos un firewall UFW (Uncomplicated Firewall) sencillo pero eficaz.
sudo apt install ufw -y # Instalar UFW
sudo ufw default deny incoming # Denegar todas las conexiones entrantes por defecto
sudo ufw default allow outgoing # Permitir todas las conexiones salientes por defecto
sudo ufw allow ssh # Permitir conexiones entrantes por SSH (puerto 22)
sudo ufw allow http # Permitir conexiones entrantes por HTTP (puerto 80)
sudo ufw allow https # Permitir conexiones entrantes por HTTPS (puerto 443)
sudo ufw enable # Habilitar UFW (confirmar 'y')
sudo ufw status # Comprobar el estado de UFW
5. Instalación de Fail2Ban
Fail2Ban ayuda a protegerse contra ataques de fuerza bruta, bloqueando las direcciones IP desde las cuales se realizan intentos fallidos de inicio de sesión.
sudo apt install fail2ban -y # Instalar Fail2Ban
sudo systemctl enable fail2ban # Habilitar el inicio automático de Fail2Ban
sudo systemctl start fail2ban # Iniciar Fail2Ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Crear una copia local de la configuración
sudo nano /etc/fail2ban/jail.local # Editar la configuración
En el archivo jail.local, asegúrese de que la sección [sshd] esté activa (enabled = true) y, si lo desea, puede configurar bantime (tiempo de bloqueo) y findtime (período para detectar intentos).
# Dentro de /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
sudo systemctl restart fail2ban # Reiniciar Fail2Ban para aplicar los cambios
sudo fail2ban-client status # Comprobar el estado de Fail2Ban
Instalación de software — paso a paso
Instalación de software — paso a paso
Ahora que el servidor está preparado, instalaremos el software necesario: Docker y Docker Compose.
1. Instalación de Docker Engine
Eliminaremos todas las versiones antiguas de Docker, si las hay, e instalaremos la última versión estable de Docker Engine (actual para 2026, suponemos la versión 26.x o posterior).
# Eliminamos versiones antiguas de Docker
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done
# Actualizamos la lista de paquetes e instalamos dependencias
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release -y
# Añadimos la clave GPG oficial de Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Añadimos el repositorio de Docker a APT
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instalamos Docker Engine, containerd y Docker Compose (v2)
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
2. Añadir usuario al grupo Docker
Para no usar sudo cada vez que trabaje con Docker, añada su usuario al grupo docker.
sudo usermod -aG docker su_usuario # Añadimos el usuario actual al grupo docker
newgrp docker # Aplicamos los cambios para la sesión actual (o reconéctese por SSH)
3. Verificación de la instalación de Docker
Verifique que Docker esté instalado y funcionando correctamente.
docker run hello-world # Iniciamos el contenedor de prueba hello-world
Debería ver un mensaje de bienvenida de Docker.
4. Verificación de la instalación de Docker Compose
Asegúrese de que Docker Compose (v2) esté instalado y disponible.
docker compose version # Verificamos la versión de Docker Compose
La salida esperada será similar a: Docker Compose version v2.26.x (o posterior).
Configuración
En este paso, configuraremos Traefik y lo ejecutaremos junto con una aplicación de demostración. Para gestionar Traefik y otros servicios, utilizaremos Docker Compose.
1. Creación de la estructura de directorios
Cree un directorio para la configuración de Traefik y el archivo docker-compose.yml.
mkdir -p ~/traefik # Creamos el directorio principal para Traefik
cd ~/traefik # Nos movemos al directorio creado
touch docker-compose.yml # Creamos el archivo Docker Compose
touch traefik.yml # Creamos el archivo de configuración principal de Traefik
touch acme.json # Creamos el archivo para almacenar los certificados SSL de Let's Encrypt
chmod 600 acme.json # Establecemos permisos estrictos para el archivo de certificados
2. Configuración de DNS
Antes de iniciar Traefik con Let's Encrypt, debe configurar los registros DNS para sus dominios. Para cada dominio (o subdominio) que planee usar, cree un registro A que apunte a la dirección IP de su VPS.
Por ejemplo, si su VPS tiene IP 192.0.2.1, y desea usar el dominio example.com y el subdominio whoami.example.com, añada los siguientes registros en el panel de control de su proveedor de DNS:
example.comA192.0.2.1.example.comA192.0.2.1(para facilitar el uso de subdominios)whoami.example.comA192.0.2.1
3. Archivo traefik.yml (configuración principal de Traefik)
Este archivo define la configuración global de Traefik, incluyendo los puntos de entrada (entrypoints), los proveedores (Docker) y la configuración de los certificados Let's Encrypt.
# traefik.yml
# Configuración global de Traefik
# Definimos los puntos de entrada para el tráfico entrante
entryPoints:
http:
address: ":80" # Tráfico HTTP entrante
http:
redirections:
entryPoint:
to: "https" # Redirigimos todo el HTTP a HTTPS
scheme: "https"
https:
address: ":443" # Tráfico HTTPS entrante
# Configuración de la API y el panel de control de Traefik
api:
dashboard: true # Habilitamos el panel de control de Traefik
insecure: false # No permitimos acceso inseguro a la API (usamos autenticación)
# Configuración de logs
log:
level: INFO # Nivel de registro (DEBUG, INFO, WARN, ERROR)
accessLog: {} # Habilitamos los logs de acceso
# Configuración del proveedor Docker
providers:
docker:
endpoint: "unix:///var/run/docker.sock" # Ruta al socket de Docker
exposedByDefault: false # Por defecto, no hacemos proxy de contenedores si no hay etiquetas
network: "web" # Especificamos la red en la que Traefik buscará contenedores
# Configuración de certificados Let's Encrypt
certificatesResolvers:
letsencrypt:
acme:
email: "[email protected]" # Especifique su email para notificaciones de Let's Encrypt
storage: "acme.json" # Archivo para almacenar certificados
httpChallenge:
entryPoint: "http" # Usamos el desafío HTTP a través del punto de entrada http
4. Archivo docker-compose.yml
Este archivo define los servicios de Traefik y la aplicación de prueba whoami.
# docker-compose.yml
# Iniciamos Traefik y la aplicación de prueba
version: '3.8'
services:
traefik:
image: traefik:v3.0 # Usamos la última versión estable de Traefik (para 2026 v3.0+)
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- "80:80" # Abrimos el puerto 80 para HTTP
- "443:443" # Abrimos el puerto 443 para HTTPS
# - "8080:8080" # Puerto para el panel de control de Traefik (no se recomienda abrir públicamente sin autenticación)
volumes:
- /etc/localtime:/etc/localtime:ro # Sincronización de la hora
- /var/run/docker.sock:/var/run/docker.sock:ro # Acceso al socket de Docker
- ./traefik.yml:/etc/traefik/traefik.yml:ro # Configuración principal de Traefik
- ./acme.json:/acme.json # Archivo para certificados Let's Encrypt
networks:
- web # Conectamos Traefik a la red 'web'
labels:
# Etiquetas para el propio Traefik (para que pueda hacer proxy de su panel de control)
- "traefik.enable=true"
- "traefik.http.routers.traefik-dashboard.rule=Host(traefik.example.com)" # Dominio para el panel de control
- "traefik.http.routers.traefik-dashboard.entrypoints=https"
- "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik-dashboard.service=api@internal"
- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$HASH_DE_LA_CONTRASEÑA" # Reemplace HASH_DE_LA_CONTRASEÑA
- "traefik.http.routers.traefik-dashboard.middlewares=traefik-auth"
# Opcional: redirección de HTTP a HTTPS para el panel de control
- "traefik.http.routers.traefik-dashboard.middlewares=redirect-to-https@docker"
whoami:
image: traefik/whoami # Aplicación de prueba que muestra información sobre la solicitud
container_name: whoami
restart: unless-stopped
networks:
- web # Conectamos a la misma red que Traefik
labels:
- "traefik.enable=true" # Habilitamos Traefik para este contenedor
- "traefik.http.routers.whoami.rule=Host(whoami.example.com)" # Dominio para whoami
- "traefik.http.routers.whoami.entrypoints=https" # Usamos HTTPS
- "traefik.http.routers.whoami.tls.certresolver=letsencrypt" # Permitimos certificados Let's Encrypt
- "traefik.http.services.whoami.loadbalancer.server.port=80" # Puerto de la aplicación dentro del contenedor
networks:
web:
external: true # Usamos una red externa (se creará manualmente)
Importante:
- Reemplace
[email protected]por su email real. - Reemplace
traefik.example.comywhoami.example.compor sus dominios. - Para
admin:$$apr1$$HASH_DE_LA_CONTRASEÑA, genere el hash de la contraseña usando la utilidadhtpasswden su máquina local. Por ejemplo,echo $(htpasswd -nb admin mi_contraseña_secreta) | sed -e s/\\$/\\$\\$/g. Copie el resultado (por ejemplo,admin:$$apr1$$abcdefghijklmnopqrs) e insértelo endocker-compose.yml.
5. Creación de la red Docker
Traefik y todos los contenedores que proxyará deben estar en la misma red Docker.
docker network create web # Creamos una red Docker externa con el nombre 'web'
6. Inicio de Traefik y los servicios
Inicie Traefik y el contenedor whoami usando Docker Compose.
docker compose up -d # Iniciamos los contenedores en segundo plano
7. Verificación del funcionamiento
Después de unos minutos (Traefik necesita tiempo para obtener los certificados), verifique la disponibilidad de sus servicios.
- Abra en el navegador
https://whoami.example.com(reemplace por su dominio). Debería ver una página con información sobre la solicitud, confirmando que Traefik ha proxyado la solicitud con éxito y ha emitido un certificado SSL. - Abra en el navegador
https://traefik.example.com(reemplace por su dominio). Debería ver una solicitud de usuario/contraseña y luego el panel de control de Traefik, mostrando el estado de sus servicios.
También puede verificar los logs de Traefik:
docker compose logs -f traefik # Ver logs del contenedor Traefik
En los logs verá mensajes sobre la obtención de certificados de Let's Encrypt.
Copias de seguridad y mantenimiento
Las copias de seguridad regulares y el mantenimiento oportuno son clave para la estabilidad y seguridad de su infraestructura.
1. Qué respaldar
- Archivos de configuración de Traefik:
traefik.yml,acme.json. El archivoacme.jsoncontiene información sobre los certificados SSL emitidos. - Datos de contenedores Docker: Todos los volúmenes persistentes que utilizan sus aplicaciones (por ejemplo, bases de datos, cargas de usuario, configuraciones de aplicaciones).
- Configuraciones del servidor: Archivos SSH (
/etc/ssh/sshd_config), UFW (/etc/ufw/), Fail2Ban (/etc/fail2ban/).
2. Script simple de copia de seguridad automática
Para las copias de seguridad, puede usar rsync o herramientas especializadas como Restic/Borg. Consideremos un ejemplo simple con rsync para archivos clave y volúmenes Docker.
Cree un directorio para las copias de seguridad y el script backup.sh:
mkdir -p ~/backups
nano ~/backups/backup.sh
Contenido de backup.sh:
#!/bin/bash
# Directorio para copias de seguridad en el servidor
BACKUP_DIR="/home/ваш_пользователь/backups/data"
TIMESTAMP=$(date +%Y%m%d%H%M%S)
FULL_BACKUP_PATH="${BACKUP_DIR}/${TIMESTAMP}"
# Directorio de Traefik
TRAEFIK_CONFIG_PATH="/home/ваш_пользователь/traefik"
# Directorio donde Docker almacena sus volúmenes
DOCKER_VOLUMES_PATH="/var/lib/docker/volumes"
# Creamos el directorio para la copia de seguridad actual
mkdir -p "${FULL_BACKUP_PATH}/traefik"
mkdir -p "${FULL_BACKUP_PATH}/docker_volumes"
echo "Iniciando copia de seguridad en ${FULL_BACKUP_PATH}"
# Copiando configuración de Traefik
cp -r "${TRAEFIK_CONFIG_PATH}/traefik.yml" "${FULL_BACKUP_PATH}/traefik/"
cp -r "${TRAEFIK_CONFIG_PATH}/acme.json" "${FULL_BACKUP_PATH}/traefik/"
cp -r "${TRAEFIK_CONFIG_PATH}/docker-compose.yml" "${FULL_BACKUP_PATH}/traefik/"
# Copiando volúmenes Docker (ejemplo: para whoami, si tuviera un volumen)
# Para aplicaciones reales, deberá definir volúmenes específicos
# docker volume inspect -f '{{ .Mountpoint }}'
# Por ejemplo, para una aplicación con el volumen 'my_app_data':
# rsync -av "${DOCKER_VOLUMES_PATH}/my_app_data/_data/" "${FULL_BACKUP_PATH}/docker_volumes/my_app_data/"
# Ejemplo de copia de seguridad de todos los volúmenes Docker (puede ser muy grande)
# Es mejor respaldar solo aquellos que contienen datos importantes
rsync -av --exclude '/_data/cache/' "${DOCKER_VOLUMES_PATH}/" "${FULL_BACKUP_PATH}/docker_volumes/"
echo "Copia de seguridad completada. Archivando..."
tar -czf "${BACKUP_DIR}/backup_${TIMESTAMP}.tar.gz" -C "${FULL_BACKUP_PATH}" .
rm -rf "${FULL_BACKUP_PATH}" # Eliminando directorio temporal
# Eliminando copias de seguridad antiguas (por ejemplo, con más de 7 días)
find "${BACKUP_DIR}" -type f -name "backup_.tar.gz" -mtime +7 -delete
echo "Archivado y limpieza completados."
Haga el script ejecutable:
chmod +x ~/backups/backup.sh
Configure cron para ejecutar el script diariamente (por ejemplo, a las 3:00 de la madrugada):
crontab -e # Abriendo crontab
Añada la línea:
0 3 * /home/ваш_пользователь/backups/backup.sh >> /home/ваш_пользователь/backups/backup.log 2>&1
3. Dónde almacenar las copias de seguridad
Almacenar las copias de seguridad en el mismo servidor que los datos originales es arriesgado. Se recomienda utilizar:
- Almacenamiento de objetos externo compatible con S3: Barato, fiable, escalable (por ejemplo, MinIO, Wasabi, Backblaze B2). Para el envío automático se puede usar
s3cmdorclone. - VPS separado: Más caro, pero ofrece control total. Se puede configurar
rsyncpor SSH a otro servidor. - Almacenamiento local (para uso doméstico): Si es un proyecto personal, se pueden copiar las copias de seguridad a un NAS o PC doméstico.
4. Actualizaciones: rolling vs. ventana de mantenimiento
- Actualización del SO: Ejecute regularmente
sudo apt update && sudo apt upgrade -y. Para las versiones LTS de Ubuntu, esto es seguro. - Actualización de Docker y Traefik:
- Ventana de mantenimiento: Para servicios críticos, planifique una ventana de mantenimiento. Detenga los servicios, actualice Docker, Traefik, pruebe.
- Actualizaciones continuas (para clústeres): Si tiene varias instancias de Traefik, puede actualizarlas una por una, minimizando el tiempo de inactividad. En un solo VPS, esto no es aplicable.
Para Traefik y los contenedores Docker, simplemente actualice las versiones de las imágenes en docker-compose.yml y reinicie los servicios:
cd ~/traefik
docker compose pull # Descargar nuevas versiones de imágenes
docker compose up -d # Recrear contenedores con las nuevas imágenes
Solución de problemas + Preguntas frecuentes
¿Qué hacer si Traefik no arranca?
Verifique los logs del contenedor Traefik. La mayoría de las veces, el problema está relacionado con errores en los archivos traefik.yml o docker-compose.yml. Use el comando docker compose logs traefik, para ver mensajes de error detallados. Asegúrese de que los puertos 80 y 443 no estén ocupados por otra aplicación y de que el socket de Docker esté disponible.
¿Por qué Let's Encrypt no emite certificados?
Las causas más comunes son:
- Registros DNS incorrectos: Asegúrese de que los registros A para su dominio (y subdominios) apunten a la dirección IP correcta de su VPS. Verifique con
dig yourdomain.com. - Problemas con el firewall: Asegúrese de que los puertos 80 y 443 estén abiertos en UFW (u otro firewall) y sean accesibles desde internet.
- Correo electrónico o ruta incorrectos a
acme.json: Verifique estos parámetros entraefik.yml. - Límites de Let's Encrypt: Si ha solicitado certificados con frecuencia para un mismo dominio, podría haber alcanzado los límites. Use el servidor de staging de Let's Encrypt para pruebas (añada
caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"en la secciónacme).
¿Cómo añadir un nuevo contenedor Docker y proxyficarlo a través de Traefik?
Simplemente añada un nuevo servicio a su docker-compose.yml e indique las etiquetas Traefik necesarias (labels). Asegúrese de que el contenedor esté conectado a la red web. Traefik detectará automáticamente el nuevo contenedor y configurará el proxy y SSL.
my_new_app:
image: my/app:latest
container_name: my_new_app
restart: unless-stopped
networks:
- web
labels:
- "traefik.enable=true"
- "traefik.http.routers.my_new_app.rule=Host(app.example.com)"
- "traefik.http.routers.my_new_app.entrypoints=https"
- "traefik.http.routers.my_new_app.tls.certresolver=letsencrypt"
- "traefik.http.services.my_new_app.loadbalancer.server.port=8000" # Puerto en el que escucha su aplicación
Después de guardar el archivo, ejecute docker compose up -d.
¿Qué configuración mínima de VPS es adecuada para Traefik con un par o tres de servicios?
Para Traefik y 2-3 servicios Docker ligeros (por ejemplo, un servidor web, una pequeña API, un blog), un VPS con 1 núcleo de CPU, 2 GB de RAM y 40-60 GB de SSD será suficiente. Esto será adecuado para el funcionamiento básico y las pruebas. Sin embargo, para un funcionamiento estable y la posibilidad de escalar, se recomiendan 2 núcleos de CPU y 4 GB de RAM.
¿Qué elegir: VPS o dedicado para esta tarea?
Para la mayoría de los usuarios que configuran Traefik para proyectos personales, startups o equipos pequeños, un VPS es la opción óptima. Es más económico, más fácil de gestionar y ofrece un rendimiento suficiente. Un servidor dedicado debe considerarse si tiene una carga muy alta (miles de solicitudes por segundo), requiere recursos de hardware específicos o si desea evitar cualquier posible efecto de "vecindario" inherente a la virtualización. Comience con un VPS y escale a un dedicado si surge una necesidad real.
¿Cómo proteger el dashboard de Traefik?
En nuestro docker-compose.yml, ya hemos añadido autenticación básica (Basic Auth) para el dashboard de Traefik a través de un middleware. Asegúrese de haber generado un hash de contraseña seguro usando htpasswd. Para mayor seguridad, también puede restringir el acceso al dashboard por dirección IP, usando el middleware Traefik IPWhitelisting, o usar métodos de autenticación más complejos, como OAuth.
Conclusiones y próximos pasos
¡Felicidades! Ha configurado Traefik con éxito en su VPS, creando una plataforma potente y flexible para el despliegue automático de contenedores Docker con HTTPS. Ahora puede añadir fácilmente nuevos servicios web, simplemente describiéndolos en el archivo docker-compose.yml con las etiquetas correspondientes, y Traefik se encargará automáticamente del proxy y la gestión de certificados SSL.
Aquí hay algunos pasos para seguir adelante:
- Añadir más servicios: Despliegue aplicaciones reales en su VPS: GitLab, Mattermost, Nextcloud, WordPress, o su propio proyecto SaaS, utilizando Traefik para su publicación.
- Monitorización y registro: Integre Traefik con sistemas de monitorización como Prometheus y Grafana para rastrear el rendimiento y el estado de sus servicios. Configure el registro centralizado (ELK Stack o Loki/Grafana) para un análisis de logs conveniente.
- Seguridad avanzada: Explore funciones de seguridad adicionales de Traefik, como IP Whitelisting, Rate Limiting, CORS, y la integración con sistemas de autenticación externos para proteger sus aplicaciones.
- Automatización del despliegue: Utilice pipelines de CI/CD (por ejemplo, GitLab CI/CD, GitHub Actions) para el despliegue automático de nuevas versiones de sus contenedores Docker en el VPS.