Перед запуском контейнера с Traefik и настройкой провайдера Let's Encrypt для автоматической выдачи сертификатов, нужно сделать одну важную вещь — добавить A-запись со звёздочкой в DNS. Представим её так: *.server_name.yourdomain, где server_name — имя сервера, а youdomain — ваш домен.

Это позволит запускать новые сервисы без необходимости каждый раз вручную добавлять новую A-запись для каждого из них. Traefik, благодаря своим ярлыкам, сам поймёт, куда нужно направить трафик для нового сервиса.

Переходим в папку где храним конфигурации example: cd /data/config/ и создаём папку «traefik», а в ней два файла — docker-compose.yml и acme.json:

mkdir traefik
touch traefik/{acme.json,docker-compose.yml}

Меняем права на файл acme.json, чтобы никто не подглядывал:

chmod 600 traefik/acme.json

Переходим в папку traefik и добавляем содержимое в docker-compose.yml:

cd traefik
cat > 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
      - --accesslog=true
      - --certificatesresolvers.le.acme.email=youemail@youdomain
      - --certificatesresolvers.le.acme.storage=acme.json
      - --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./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.server_name.youdomain`)
      - traefik.http.routers.traefik_https.entrypoints=websecure
      - traefik.http.routers.traefik_https.rule=Host(`traefik.server_name.youdomain`)
      - traefik.http.routers.traefik_https.tls=true
      - traefik.http.routers.traefik_https.tls.certresolver=le
      - traefik.http.services.traefik.loadbalancer.server.port=8080
networks:
  default:
    external:
      name: traefik_default

Отредактируйте фаил, замените server_name.youdomain.

Теперь можно смело запускать контейнер с помощью команды:

docker-compose up -d traefik

После успешного запуска контейнера по адресу https://traefik.server_name.youdomain будет открываться Traefik dashboard


Настройка проксирования

Теперь займёмся контейнером, который нужно обрабатывать через наш новый прокси. В его docker-compose нужно закомментировать раздел ports и добавить ярлыки, чтобы Traefik знал, что делать с этим сервисом. Также назначаем ему сеть по умолчанию traefik_default.

Вот пример ярлыков для нового контейнера. Замените name_service на имя запускаемого контейнера, а server_name.youdomain — на ваш домен:

labels:
  - 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.server_name.youdomain`)
  - traefik.http.routers.name_service_https.entrypoints=websecure
  - traefik.http.routers.name_service_https.rule=Host(`name_service.server_name.youdomain`)
  - traefik.http.routers.name_service_https.tls=true
  - traefik.http.routers.name_service_https.tls.certresolver=le

networks:
  default:
    external:
      name: traefik_default

После запуска сервис будет доступен по адресу name_service.server_name.youdomain.


Добавление нестандартных портов

Если ваш контейнер использует нестандартный порт, например Portainer на порту 9000, добавьте в labels ещё одну строку:

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

Вот полный пример для Portainer:

labels:
  - traefik.enable=true 
  - traefik.http.middlewares.portainer_https.redirectscheme.scheme=https
  - traefik.http.routers.portainer.entrypoints=web
  - traefik.http.routers.portainer.middlewares=portainer_https@docker
  - traefik.http.routers.portainer.rule=Host(`portainer.server_name.youdomain`)
  - traefik.http.routers.portainer_https.entrypoints=websecure
  - traefik.http.routers.portainer_https.rule=Host(`portainer.server_name.youdomain`)
  - traefik.http.routers.portainer_https.tls=true
  - traefik.http.routers.portainer_https.tls.certresolver=le
  - traefik.http.services.portainer.loadbalancer.server.port=9000

Можно даже вынести ярлыки в отдельный файл для удобства:

cat > /data/portainer/portainer-label
traefik.enable=true 
traefik.http.middlewares.portainer_https.redirectscheme.scheme=https
traefik.http.routers.portainer.entrypoints=web
traefik.http.routers.portainer.middlewares=portainer_https@docker
traefik.http.routers.portainer.rule=Host(portainer.server_name.youdomain)
traefik.http.routers.portainer_https.entrypoints=websecure
traefik.http.routers.portainer_https.rule=Host(portainer.server_name.youdomain)
traefik.http.routers.portainer_https.tls=true
traefik.http.routers.portainer_https.tls.certresolver=le
traefik.http.services.portainer.loadbalancer.server.port=9000

Теперь запуск контейнера выглядит так:

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

Вот и всё! Теперь Traefik сам будет заботиться о вашем трафике, а вам останется только наслаждаться автоматизацией.