Estos días he estado “cacharreando” un poco, y he preparado un pequeño stack para ejecutar un WordPress en Docker con Traefik.
¿Qué es Traefik?
Traefik es un enrutador que actúa como proxy inverso (entre otras cosas, puesto que puede hacer de balanceador de carga, etc), esto es, redirecciona tu dominio a determinados servicios que le indiques (en este caso tus contenedores).
No voy a entrar en su funcionamiento interno, pero vamos a ver un ejemplo claro de cómo utilizarlo para enlazar tu dominio con tu contenedor de WordPress y aplicar un certificado SSL automático.
Requisitos previos
Esta pila ha sido probada en Ubuntu Server 22.04 LTS.
Docker y el plugin docker-compose han sido instalados como siempre. Si no sabes como instalar o utilizar Docker, puedes pasarte por el post donde te explico su manejo básico.
Obviamente necesitas un dominio apuntando con un registro A a la IP de tu máquina.
Cómo utilizar el stack
Es bastante sencillo la verdad, una vez conectado a tu máquina por SSH, siempre y cuando tengas Docker instalado, podrás subir el contenido de este stack.
Lo primero, necesitas cambiar los valores comentados como variables (los que llevan ${}) (email, dominio, campos de la base de datos, etc.).
Para conseguirlo puedes añadir variables de entorno (.env). Edita /etc/environment y rellénalo con tus propias variables.
Crea un directorio en la home de tu usuario llamado ‘traefik’ y carga el archivo traefik.yml. Lo puedes encontrar en mi GitHub.
global:
checkNewVersion: true
sendAnonymousUsage: false # default is true
# Useful, but optional logs
# log:
# level: ERROR
# format: common
# filePath: /var/log/traefik/traefik.log
# Useful, but optional accesslog
# accesslog:
# format: common
# filePath: /var/log/traefik/access.log
api:
dashboard: false # default is true
insecure: false # Be careful if you use this in production
# Entry Points
entryPoints:
web:
address: :80
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: :443
traefik:
address: :8080
# Certificates
certificatesResolvers:
# Used for letsencrypt
staging:
acme:
email: ${MY_EMAIL} # Place your email here
storage: /ssl-certs/acme.json
caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"
httpChallenge:
entryPoint: web
production:
acme:
email: ${MY_EMAIL} # Place your email here
storage: /ssl-certs/acme.json
caServer: "https://acme-v02.api.letsencrypt.org/directory"
httpChallenge:
entryPoint: web
# Providers
providers:
docker:
exposedByDefault: false # default is true
Crea otro directorio llamado ‘letsencrypt’ vacío en la home (para los certificados SSL).
Sube el siguiente archivo de configuración (docker-compose.yml) de nuevo a la home y despliega la pila con docker-compose (docker compose up -d).
version: '3.3'
# Define environment variables (.env) where ${variable}
services:
traefik:
image: traefik:v2.9
restart: always
container_name: traefik
command:
#- "--log.level=ERROR"
- "--api.insecure=false"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
#- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
- "--certificatesresolvers.myresolver.acme.email=${MY_EMAIL}" # Place your email here
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "443:443"
#- "8080:8080"
volumes:
- ./letsencrypt:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
wordpress:
image: wordpress:latest
depends_on:
- db
restart: always
ports:
- 80:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: ${exampleuser}
WORDPRESS_DB_PASSWORD: ${examplepass}
WORDPRESS_DB_NAME: ${exampledb}
volumes:
- wordpress:/var/www/html
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.wordpress.entrypoints=websecure'
- 'traefik.http.routers.wordpress.rule=Host("${MYDOMAIN}")' # Place your right domain here
- 'traefik.http.routers.wordpress.tls=true'
- 'traefik.http.routers.wordpress.tls.certresolver=myresolver'
db:
image: mariadb:latest
restart: always
environment:
MYSQL_DATABASE: ${exampledb}
MYSQL_USER: ${exampleuser}
MYSQL_PASSWORD: ${examplepass}
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
labels:
- 'traefik.enable=false'
volumes:
wordpress:
db:
traefik-ssl-certs:
driver: local
Si todo ha ido bien, WordPress, MariaDB y Traefik deberían estar en funcionamiento.
¿Dónde se encuentran mis archivos?
Los archivos de WordPress y otros volúmenes persistentes se encuentran en /var/lib/docker/volumes/ en tu servidor. Podrás acceder a ellos por SSH o SFTP.
Y esto ha sido todo. Si quieres ponerte manos a la obra, puedes descargarte el stack.