Multiple Hosts wordpress docker with Traefik

Viewed 1818

Hello !

I have a question about Traefik using Docker and docker-compose,

Indeed, I want to use traefik as a reverse proxy to redirect several services (in my case, several wordpress instances).

Traefik works and I can access to a wordress instance (Wordpress, Mysql, PhpMyadmin) without any problem (with automatic https redirection),

However, when I launch another Wordpress stack at the same time (WP, Mysql, PhpMyadmin), I can't access any service, I get a 404 error.

Here is my traefik.yaml :

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https

  websecure:
    address: ":443"
    http:
      tls:
        certResolver: myresolver
      middlewares:
        - SecHeaders@file

api:
  dashboard: true

accessLog: {}

providers:
  docker:
    exposedByDefault: false

  file:
    directory: /etc/traefik/custom/
    watch: true

certificatesResolvers:
  myresolver:
    acme:
      email: "mail@domain"
      storage: "/letsencrypt/acme.json"
      tlsChallenge: {}

Here is my docker-compose.yaml for traefik :

version: "3.7"
services:
  reverse_proxy:
    image: traefik:2.2
    restart: unless-stopped
    command:
      --api.insecure=true
      --providers.docker
      --entrypoints.web.address=:80
    ports:
      # The HTTP port
      - "80:80"
      # The HTTPS port
      - "443:443"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
      # traefik static configuration
      - ./traefik.yaml:/etc/traefik/traefik.yaml:ro
      # custom folder with dynamic configuration
      - ./custom:/etc/traefik/custom:ro
      # ssl volumes to store acme.json
      - certs:/letsencrypt

    labels:
      - "traefik.enable=true" 
      - "traefik.http.routers.traefik-api.rule=Host(`traefik.DOMAIN`)" 
      - "traefik.http.routers.traefik-api.service=api@internal" 

    networks:
      - default

volumes:
  certs:

networks:
  default:
    external:
      name: gateway

Here is my docker-compose.yaml for wordpress:

version: '3'
services:

  database:
    image: mysql:5.7
    container_name: bdd
    volumes:
      - ./BDD/file.sql:/docker-entrypoint-initdb.d/init.sql
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: passwd
      MYSQL_DATABASE: db
      MYSQL_USER: user-db
      MYSQL_PASSWORD: passwd-bdd
    networks:
      - network1
    labels:
      - traefik.enable=false

  phpmyadmin:
    depends_on:
      - database
    image: phpmyadmin
    container_name: pma
    restart: always
    environment:
      PMA_HOST: database
      MYSQL_PASSWORD: passwd-bdd
      MYSQL_ROOT_PASSWORD: passwd
    networks:
      - default
      - network1
    labels:
      traefik.enable: true
      traefik.http.routers.phpmyadmin.entrypoints: websecure
      traefik.http.routers.phpmyadmin.rule: 'Host(`pma.MY_DOMAIN`)'

  wordpress:
    depends_on:
      - database
    image: wordpress:5.7.1-php7.3
    container_name: wordpress
    restart: always
    volumes:
      - ./WORDPRESS:/var/www/html
    environment:
      WORDPRESS_DB_HOST: database:3306
      WORDPRESS_DB_USER: user-db
      WORDPRESS_DB_PASSWORD: passwd-bdd
      WORDPRESS_DB_NAME: db
      WORDPRESS_TABLE_PREFIX: wp_
    networks:
      - default
      - network1
    labels:
      traefik.enable: true
      traefik.docker.network: default
      traefik.http.routers.wordpress.entrypoints: websecure
      traefik.http.routers.wordpress.rule: 'Host(`mas.MY_DOMAIN`)'
networks:
  default:
    external:
      name: gateway
  network1:
    internal: true
volumes:
  db_data:

Here is my docker-compose.yaml for the 2nd wordpress:

version: '3'
services:
  database2:
    image: mysql:5.7
    container_name: bdd2
    volumes:
      - ./SQL/file2.sql:/docker-entrypoint-initdb.d/init.sql
      - db_data2:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: passwd2
      MYSQL_DATABASE: db2
      MYSQL_USER: user-db2
      MYSQL_PASSWORD: passwd-bdd2
    networks:
      - network2
  phpmyadmin2:
    depends_on:
      - database2
    image: phpmyadmin
    container_name: pma2
    restart: always
    environment:
      PMA_HOST: database2
      MYSQL_PASSWORD: passwd-bdd2
      MYSQL_ROOT_PASSWORD: passwd2
    networks:
      - default
      - network2
    labels:
      traefik.enable: true
      traefik.http.routers.phpmyadmin.entrypoints: websecure
      traefik.http.routers.phpmyadmin.rule: 'Host(`pma.MY_DOMAIN2`)'

  wordpress2:
    depends_on:
      - database2
    image: wordpress:5.7.1-php7.3
    container_name: wordpress2
    restart: always
    volumes:
      - ./WP:/var/www/html
    environment:
      WORDPRESS_DB_HOST: database2:3306
      WORDPRESS_DB_USER: user-db2
      WORDPRESS_DB_PASSWORD: passwd-bdd2
      WORDPRESS_DB_NAME: db2
      WORDPRESS_TABLE_PREFIX: wp_
    networks:
      - default
      - network2
    labels:
      traefik.enable: true
      traefik.docker.network: default
      traefik.http.routers.wordpress.entrypoints: websecure
      traefik.http.routers.wordpress.rule: 'Host(`wordpress.MY_DOMAIN2`)'

networks:
  default:
    external:
      name: gateway
  network2:
    internal: true

volumes:
  db_data2:

Thanks for your help !

1 Answers

You are using the same router names for both the stacks i.e. phpmyadmin and wordpress. The router names should be unique for each stack.

So, if your docker-compose.yaml for first word press is like this

version: '3'
services:

  database:
    image: mysql:5.7
    container_name: bdd
    volumes:
      - ./BDD/file.sql:/docker-entrypoint-initdb.d/init.sql
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: passwd
      MYSQL_DATABASE: db
      MYSQL_USER: user-db
      MYSQL_PASSWORD: passwd-bdd
    networks:
      - network1
    labels:
      - traefik.enable=false

  phpmyadmin:
    depends_on:
      - database
    image: phpmyadmin
    container_name: pma
    restart: always
    environment:
      PMA_HOST: database
      MYSQL_PASSWORD: passwd-bdd
      MYSQL_ROOT_PASSWORD: passwd
    networks:
      - default
      - network1
    labels:
      traefik.enable: true
      traefik.http.routers.phpmyadmin.entrypoints: websecure
      traefik.http.routers.phpmyadmin.rule: 'Host(`pma.MY_DOMAIN`)'

  wordpress:
    depends_on:
      - database
    image: wordpress:5.7.1-php7.3
    container_name: wordpress
    restart: always
    volumes:
      - ./WORDPRESS:/var/www/html
    environment:
      WORDPRESS_DB_HOST: database:3306
      WORDPRESS_DB_USER: user-db
      WORDPRESS_DB_PASSWORD: passwd-bdd
      WORDPRESS_DB_NAME: db
      WORDPRESS_TABLE_PREFIX: wp_
    networks:
      - default
      - network1
    labels:
      traefik.enable: true
      traefik.docker.network: default
      traefik.http.routers.wordpress.entrypoints: websecure
      traefik.http.routers.wordpress.rule: 'Host(`mas.MY_DOMAIN`)'
networks:
  default:
    external:
      name: gateway
  network1:
    internal: true
volumes:
  db_data:

Then the second docker-compose.yml should look like this

version: '3'
services:
  database2:
    image: mysql:5.7
    container_name: bdd2
    volumes:
      - ./SQL/file2.sql:/docker-entrypoint-initdb.d/init.sql
      - db_data2:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: passwd2
      MYSQL_DATABASE: db2
      MYSQL_USER: user-db2
      MYSQL_PASSWORD: passwd-bdd2
    networks:
      - network2
  phpmyadmin2:
    depends_on:
      - database2
    image: phpmyadmin
    container_name: pma2
    restart: always
    environment:
      PMA_HOST: database2
      MYSQL_PASSWORD: passwd-bdd2
      MYSQL_ROOT_PASSWORD: passwd2
    networks:
      - default
      - network2
    labels:
      traefik.enable: true
      traefik.http.routers.phpmyadmin-second.entrypoints: websecure
      traefik.http.routers.phpmyadmin-second.rule: 'Host(`pma.MY_DOMAIN2`)'

  wordpress2:
    depends_on:
      - database2
    image: wordpress:5.7.1-php7.3
    container_name: wordpress2
    restart: always
    volumes:
      - ./WP:/var/www/html
    environment:
      WORDPRESS_DB_HOST: database2:3306
      WORDPRESS_DB_USER: user-db2
      WORDPRESS_DB_PASSWORD: passwd-bdd2
      WORDPRESS_DB_NAME: db2
      WORDPRESS_TABLE_PREFIX: wp_
    networks:
      - default
      - network2
    labels:
      traefik.enable: true
      traefik.docker.network: default
      traefik.http.routers.wordpress-second.entrypoints: websecure
      traefik.http.routers.wordpress-second.rule: 'Host(`wordpress.MY_DOMAIN2`)'

networks:
  default:
    external:
      name: gateway
  network2:
    internal: true

volumes:
  db_data2:
Related