Собираем контейнер с обратным прокси Traefik c Let’s Encrypt сертификатами

В корне создаём папку «traefik» и файлы файлы «docker-compose.yml» и «acme.json»

    mkdir traefik
    touch traefik/acme.json 
    touch traefik/docker-compose.yml

добавляем содержимое в docker-compose.yml cat > traefik/docker-compose.yml

version: '3'

services:

  traefik:
    image: traefik:v2.2
    restart: always
    container_name: "traefik"
    command:
      - --api.insecure=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --providers.file.directory=/etc/traefik/dynamic_conf
      - --accesslog=true
      - --metrics.prometheus=true
      - --entrypoints.metrics.address=:8081
      - --metrics.prometheus.entrypoint=metrics
      - --certificatesresolvers.le.acme.email=(youemail@youdamain)
      - --certificatesresolvers.le.acme.storage=acme.json
      - --certificatesresolvers.le.acme.httpchallenge.entrypoint=web

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /traefik/acme.json:/acme.json:rw

    labels:
        - traefik.enable = true 
        - traefik.http.middlewares.traefik_https.redirectscheme.scheme = https
        - traefik.http.routers.traefik.entrypoints = web
        - traefik.http.routers.traefik.middlewares = traefik_https@docker
        - traefik.http.routers.traefik.rule = Host(`traefik.(youdomain)`)
        - traefik.http.routers.traefik_https.entrypoints = websecure
        - traefik.http.routers.traefik_https.rule = Host(`traefik.(youdomain)`)
        - traefik.http.routers.traefik_https.tls = true
        - traefik.http.routers.traefik_https.tls.certresolver=le

меняем права на файл «acme.json»

    chmod 600 traefik/acme.json

И вот теперь запускаем контейнер командой

    docker-compose up -d traefik

Далее редактируем контейнер который необходимо обрабатывать через обратный прокси в нем нам необходимо добавить ярлыки для работы внешних протоколов и назначем ему сеть по умолчания "traefik_default"

Добавляем labels для контейнера заменив (name_service) на имя запускаемого контейнера, а (youdomaine) на доменное имя присвоенное серверу

    traefik.enable = true 
    traefik.http.middlewares.(name_service)_https.redirectscheme.scheme = https
    traefik.http.routers.(name_service).entrypoints = web
    traefik.http.routers.(name_service).middlewares = (name_service)_https@docker
    traefik.http.routers.(name_service).rule = Host(`(name_service).(youdomain)`)
    traefik.http.routers.(name_service)_https.entrypoints = websecure
    traefik.http.routers.(name_service)_https.rule = Host(`(name_service).(youdomain)`)
    traefik.http.routers.(name_service)_https.tls = true
    traefik.http.routers.(name_service)_https.tls.certresolver=le

После запуска (name_service).(youdomaine) будет являться опубликованным именем сервиса *.(youdomaine) может быть как 2 уровня так и 3

Для контейнера с нестандартным портом добавляем еще одну строчку для примера используем контейнер с portainer добавляем еще одну строчку

    traefik.http.services.portainer.loadbalancer.server.port = 9000

Так же все необходимые метки можно добавить в отдельном файле

    cat > /data/config/portainer/portainer-label

Строка запуска контейнера будет выглядеть так

    docker run -d --name=portainer --label-file /data/config/portainer/portainer-label \
    --network traefik_default --restart=always -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data portainer/portainer