Search code examples
docker-composetraefik

Traefik docker-compose only creating one frontend route instead of 3


I want traefik to routh specific paths to my nginx service. The setup below works on my development environment, but not on a live environment.

The issue is, for the nginx service it only ever creates one of the frontend routes, usually just static, or just media. It's as if it finds one, creates it and then just doesn't bother with the rest.

If I restart my containers, then traefik will randomly do only one of the routes again, but never all 3 as it does on my dev machine.

docker-compose.yml

version: '3'

services:

    db:
        image: postgres:latest

    webapp:
        build:
        context: ./src/webapp/
        env_file:
        - .env
        volumes:
        - "./resources:/mnt/resources/"
        depends_on:
        - db
        links:
        - "db:dbhost"
        labels:
        - "traefik.backend=webapp"
        - "traefik.port=8000"
        - "traefik.webapp.entryPoints=https"
        - "traefik.webapp.frontend.rule=Host:my.domain.example"

    nginx:
        build:
        context: ./src/nginx/
        volumes:
        - ./resources:/mnt/resources
        labels:
        - "traefik.backend=nginx"
        - "traefik.port=443"
        - "traefik.frontend.entryPoints=https"
        - "traefik.static.frontend.rule=Host:my.domain.example;PathPrefix:/static"
        - "traefik.media.frontend.rule=Host:my.domain.example;PathPrefix:/media"
        - "traefik.sw.frontend.rule=Host:my.domain.example;Path:/service-worker.js"

    traefik:
        image: traefik:1.6.3
        restart: always
        ports:
        - "80:80"
        - "443:443"
        - "8080:8080"
        volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - ./src/traefik/traefik.toml:/traefik.toml
        - ./src/traefik/acme.json:/acme.json

A separate question but still traefik related:

Traefik is supposed to fetch letsencrypt certs for the main.domain, and does so perfectly well for that domain.

But it's also trying to fetch certs for the db and traefik service. How do I tell traefik not to fetch certs for these services?


Solution

  • Finally figured it out.

    For the frontends that weren't generated, I basically had to specify a backend for each frontend, and then they worked as expected.

    so this:

        - "traefik.static.frontend.rule=Host:my.domain.example;PathPrefix:/static"
        - "traefik.media.frontend.rule=Host:my.domain.example;PathPrefix:/media"
        - "traefik.sw.frontend.rule=Host:my.domain.example;Path:/service-worker.js"
    

    ... became this:

        - "traefik.static.backend=nginx-static"
        - "traefik.static.frontend.rule=Host:my.domain.example;PathPrefix:/static"
        - "traefik.media.backend=nginx-media"
        - "traefik.media.frontend.rule=Host:my.domain.example;PathPrefix:/media"
        - "traefik.sw.backend=nginx-sw"
        - "traefik.sw.frontend.rule=Host:my.domain.example;Path:/service-worker.js"
    

    After that everything worked correctly.