Saltar al contenido
Inicio » WordPress en Docker con Traefik

WordPress en Docker con Traefik

    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.