Bad Gateway for WordPress containers behind Traefik reverse proxy in docker-compose

Well, It's up to you to prefer including a webserver on your stack or outside (in it's own stack). Both will work.

Personaly, i prefer include all the stuff in one docker-compose file (although the database in it's own stack is a better practice).

There is my functionnal docker-compose file for a wordpress site (PHP-FPM) :

version: '3.7'
services:
  database:
    image: mariadb:${MARIADB_VERSION}
    container_name: ${PROJECT_NAME}_database
    restart: unless-stopped
    volumes:
      - ./conf/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_USER_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
    networks:
      - net

  phpmyadmin:
    image: phpmyadmin:latest
    container_name: ${PROJECT_NAME}_phpmyadmin
    restart: unless-stopped
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    depends_on:
      - database
    environment:
      PMA_HOST: database
      UPLOAD_LIMIT: 1G
      PMA_PORT: 3306
      PMA_ABSOLUTE_URI: "https://${HOST_NAME}/_phpmyadmin/"
    labels:
      - traefik.enable=true
      - traefik.docker.network=proxy
      - traefik.http.routers.${PROJECT_NAME}-phpmyadmin.rule=Host(`${HOST_NAME}`) && PathPrefix(`/_phpmyadmin/`)
      - traefik.http.routers.${PROJECT_NAME}-phpmyadmin.tls=true
      - traefik.http.routers.${PROJECT_NAME}-phpmyadmin.entrypoints=http,https
      - traefik.http.routers.${PROJECT_NAME}-phpmyadmin.middlewares=stripprefix-phpmyadmin
      - traefik.http.routers.${PROJECT_NAME}-phpmyadmin.service=${PROJECT_NAME}-phpmyadmin
      - traefik.http.middlewares.stripprefix-phpmyadmin.stripprefix.prefixes=/_phpmyadmin
      - traefik.http.services.${PROJECT_NAME}-phpmyadmin.loadbalancer.server.port=80
    networks:
      - net
      - proxy


  nginx:
    image: nginx:${NGINX_VERSION}
    container_name: ${PROJECT_NAME}_nginx
    restart: unless-stopped
    volumes:
      - ./conf/nginx:/etc/nginx:ro
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./logs/nginx:/var/log/nginx
      - ./www:/var/www/html
    depends_on:
      - wordpress
    labels:
      - traefik.enable=true
      - traefik.docker.network=proxy
      - traefik.http.routers.${PROJECT_NAME}.rule=Host(`${HOST_NAME}`, `www.${HOST_NAME}`)
      - traefik.http.routers.${PROJECT_NAME}.entrypoints=http,https
      - traefik.http.routers.${PROJECT_NAME}.middlewares=compression@file,security@file
      - traefik.http.routers.${PROJECT_NAME}.service=${PROJECT_NAME}
      - traefik.http.services.${PROJECT_NAME}.loadbalancer.server.port=80
      - traefik.http.routers.${PROJECT_NAME}-admin.rule=Host(`${HOST_NAME}`) && (Path(`/wp-admin`) || Path(`/wp-login.php`))
      - traefik.http.routers.${PROJECT_NAME}-admin.entrypoints=http,https
      - traefik.http.routers.${PROJECT_NAME}-admin.middlewares=whitelist@file
      - traefik.http.routers.${PROJECT_NAME}-admin.service=${PROJECT_NAME}-admin
      - traefik.http.services.${PROJECT_NAME}-admin.loadbalancer.server.port=80
    networks:
      - proxy
      - net

  wordpress:
    image: wordpress:${PHP_VERSION}
    container_name: ${PROJECT_NAME}_wordpress
    restart: unless-stopped
    volumes:
      - ./conf/php/php-fpm.conf:/usr/local/etc/php-fpm.d/zzz-custom.conf:ro
      - ./conf/php/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./www:/var/www/html
    depends_on:
      - database
    environment:
      WORDPRESS_DB_HOST: database
      WORDPRESS_DB_USER: ${MYSQL_USER}
      WORDPRESS_DB_PASSWORD: ${MYSQL_USER_PASSWORD}
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
      WORDPRESS_TABLE_PREFIX: ${MYSQL_TABLE_PREFIX}
    mem_limit: 1G
    extra_hosts:
      - ${HOST_NAME}:${DOCKER_GATEWAY_TRAEFIK_PROXY}
    networks:
      - net

volumes:
  db:

networks:
  net:
    driver: bridge
  proxy:
    external: true

There is a lots of tweak in my docker-compose file (php .ini, database config, middleware, etc), you don't have to use all of them (you can ignore them) :wink:

Maybe your problem come from your traefik's config...

Hope this help !

Bye

1 Like