1202
March 4, 2024, 10:11 a.m.
Настройка Traefik
Задачи:
- Установить traefik
- Установить имеющеся сертификат.
- Настроить dashboard с паролем
- Настроить прокси для веб-ресурсов
- Сделать вывод метрик
- Добавить сервис nextcloud
Для начала необходимо сконфигурировать docker-compose файл, предпочитаю использовать swarm.
version: '3.9'
services:
traefik:
image: "traefik:v2.11"
command:
- "--configFile=/etc/traefik/traefik.yml" # Указываем путь где будет находится конфигурационный файл.
ports: # Порты, которые указываем в entrypoints
- "443:443"
- "8082:8082"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
secrets:
- source: fullchain.pem
target: /run/secrets/fullchain.crt
- source: privkey.pem
target: /run/secrets/privkey.pem
configs: # Подключаем конфигурационный файл для traefik.
- source: traefik.yml
target: /etc/traefik/traefik.yml
labels:
# Активируем traefik для данного сервиса
- "traefik.enable=true"
# Указываем адрес на который будет отвечать дашборд
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
# Указываем название entrypoint, к которому привязан 443 порт
- "traefik.http.routers.dashboard.entrypoints=websecure"
# Для дашборда не измеяется.
- "traefik.http.routers.dashboard.service=api@internal"
# Включаем авторизацию по логину и паролю
- "traefik.http.routers.dashboard.middlewares=auth"
# Генерируем htpasswd знаки $ должны быть обязательно продублированы
- "traefik.http.middlewares.auth.basicauth.users=<USER>:<HASH>"
# Указываем использование сертифика для SSL соединения.
- "traefik.http.routers.dashboard.tls=true"
secrets:
fullchain.pem:
external: true
privkey.pem:
external: true
configs:
traefik.yml:
external: true
networks:
default:
name: proxy
external: true
Далее настраиваем конфигурационный файл для traefik.
global:
checkNewVersion: false
sendAnonymousUsage: false
# Вывод метрик для PROMETHEUS, если нет необходимости, нужно закомментировать
metrics:
prometheus:
addEntryPointsLabels: true
addServicesLabels: true
entryPoint: metrics
# Точки входа, в данном случае 80 замкомментирован т.к. WEB трафик приходит от CLOUDFLARE
# Поля proxyProtocol и forwardedHeaders, нужны для передачи реальных в том числе реальных IP адресов сервисам
# Иначе это сделать не возможно т.к. в сервисы трафик приходит от loadbalancer и сервисы будут видеть его IP как источника.
entrypoints:
# web:
# address: ":80"
# proxyProtocol:
# trustedIPs:
# - "0.0.0.0/0"
# forwardedHeaders:
# trustedIPs:
# - "0.0.0.0/0"
# http:
# redirections:
# entrypoint:
# to: websecure
# scheme: https
# permanent: true
metrics:
address: ":8082"
websecure:
address: ":443"
proxyProtocol:
trustedIPs:
- "0.0.0.0/0"
forwardedHeaders:
trustedIPs:
- "0.0.0.0/0"
# # uVNC service
# uvnc-repeater:
# address: ":5500"
# uvnc-viever:
# address: ":5901"
providers:
docker:
# endpoint: "unix:///var/run/docker.sock"
watch: true
exposedByDefault: false
network: proxy
file:
fileName: /etc/traefik/traefik.yml # Обязательно указываем эту строку, иначае SSL работать не будет.
watch: true # Обязательно указываем эту строку, иначае SSL работать не будет.
api:
insecure: false # Запрещаем незащищенный доступ
dashboard: true
# Списком указываем сертификаты, поддерживаются wildcard.
tls:
certificates:
- certFile: /run/secrets/fullchain.crt
keyFile: /run/secrets/privkey.pem
Предположим что prometheus уже настроен. В него нужно добавить:
scrape_configs:
- job_name: 'traefik'
scrape_interval: 10s
static_configs:
- targets: ['traefik:8082']
Добавляем плагин в Grafana:
grafana-cli plugins install grafana-piechart-panel
Ипортируем панель c ID 12250
или 17346
На этом настройка traefik для HTTP(S) завершена, остаётся подключить web ресурс. Предлагаю, вариант для nextcloud
version: "3"
services:
nextcloud:
image: nextcloud:28.0.2
volumes:
- /mnt/DATA_CLOUD/APP/:/var/www/html # Дириктория для статических файлов
# Блок стандартных для контейнера настроек.
environment:
- POSTGRES_DB=
- POSTGRES_USER=
- POSTGRES_PASSWORD=
- POSTGRES_HOST=
- REDIS_HOST=
- NEXTCLOUD_TRUSTED_DOMAINS=cloud.example.com
- NEXTCLOUD_ADMIN_USER=
- NEXTCLOUD_ADMIN_PASSWORD=
- OBJECTSTORE_S3_BUCKET=
- OBJECTSTORE_S3_KEY=
- OBJECTSTORE_S3_SECRET=
- OBJECTSTORE_S3_REGION=
networks:
- proxy # Обязательно указываем сеть в которой traefik
# Для того чтобы он мог проксировать трафик
- cloud
labels:
# nextcloud - это название сервиса, дожно быть уникальным в кластере
- "traefik.enable=true"
- "traefik.http.routers.nextcloud.rule=Host(`cloud.example.com`)"
- "traefik.http.routers.nextcloud.entrypoints=websecure"
- "traefik.http.services.nextcloud.loadbalancer.server.port=80"
- "traefik.http.routers.nextcloud.tls=true"
# Блок настроек для корректной работы.
- "traefik.http.routers.nextcloud.middlewares=nextcloud-redirectregex1,nextcloud-redirectregex2"
- "traefik.http.middlewares.nextcloud-redirectregex1.redirectregex.permanent=true"
- "traefik.http.middlewares.nextcloud-redirectregex1.redirectregex.regex=https?://([^/]*)/.well-known/(card|cal)dav"
- "traefik.http.middlewares.nextcloud-redirectregex1.redirectregex.replacement=https://$${1}/remote.php/dav/"
- "traefik.http.middlewares.nextcloud-redirectregex2.redirectregex.permanent=true"
- "traefik.http.middlewares.nextcloud-redirectregex2.redirectregex.regex=https?://([^/]*)(/.well-known[^#]*)"
- "traefik.http.middlewares.nextcloud-redirectregex2.redirectregex.replacement=https://$${1}/index.php$${2}"
networks:
cloud:
proxy:
external:
name: proxy
При переходе cloud.example.com
должен открыться nextcloud, а в Grafana появятся данные об этом.