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