🛠️ Настройка обратного прокси Traefik

Для начала создадим в корне папку traefik:

mkdir traefik

Затем создаём два файла: docker-compose.yml и traefik.yml — в них будет основная конфигурация нашего прокси:

touch docker-compose.yml
touch traefik.yml

📄 Настройка docker-compose.yml

Скопируем следующее содержимое в docker-compose.yml, чтобы задать конфигурацию контейнера Traefik:

cat > /data/config/traefik/docker-compose.yml <<EOL
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

    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /data/config/traefik/traefik.yml:/etc/traefik/dynamic_conf/conf.yml:ro
      - /data/config/ssl/live/(youdomaine):/etc/traefik/(youdomaine)
      - /data/config/ssl/live/*.(youdomaine):/etc/traefik/*.(youdomaine)
EOL

🔐 Получение SSL-сертификатов

Теперь получаем SSL-сертификаты через DNS запись для основного домена example.com и поддоменов *.example.com. Сертификаты копируем в папку /data/config/ssl/.

📄 Настройка traefik.yml

Скопируем следующее содержимое в traefik.yml для управления сертификатами и логами:

cat > /data/config/traefik/traefik.yml <<EOL
tls:
  certificates:
   -  certFile: /etc/traefik/*.(youdomaine)/cert.pem
      keyFile: /etc/traefik/*.(youdomaine)/privkey.pem
      stores:
        - default
   -  certFile: /etc/traefik/(youdomaine)/cert.pem
      keyFile: /etc/traefik/(youdomaine)/privkey.pem

accessLog:
  filePath: "/var/log/access.log"
  format: json
  filters:
    statusCodes:
      - "200"
      - "300-302"
    retryAttempts: true
    minDuration: "10ms"
EOL

🚀 Запуск Traefik

Теперь можно запустить контейнер командой:

docker-compose up -d traefik

🛠️ Настройка контейнера для работы с обратным прокси

Чтобы настроить любой контейнер для работы с Traefik, добавим к нему необходимые ярлыки и назначим сеть traefik_default. Пример конфигурации ярлыков (замените (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).(youdomaine)`)
traefik.http.routers.(name_service)_https.entrypoints = websecure
traefik.http.routers.(name_service)_https.rule = Host(`(name_service).(youdomaine)`)
traefik.http.routers.(name_service)_https.tls = true

Теперь ваш сервис будет доступен по имени (name_service).(youdomaine). Сюда можно добавить и поддомены 2 или 3 уровня.

📌 Настройка контейнера с нестандартным портом

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

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

📄 Использование файла для меток

Все необходимые метки также можно собрать в отдельный файл. Например, создадим файл с метками для Portainer:

cat > /data/config/portainer/portainer-label <<EOL
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.(youdomaine)`)
traefik.http.routers.portainer_https.entrypoints = websecure
traefik.http.routers.portainer_https.rule = Host(`portainer.(youdomaine)`)
traefik.http.routers.portainer_https.tls = true
traefik.http.services.portainer.loadbalancer.server.port = 9000
EOL

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

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 готов к работе, и вы можете использовать его для управления трафиком на все ваши контейнеры.