377 March 4, 2024, 10:11 a.m.

Настройка Traefik

Задачи:

  1. Установить traefik
  2. Установить имеющеся сертификат.
  3. Настроить dashboard с паролем
  4. Настроить прокси для веб-ресурсов
  5. Сделать вывод метрик
  6. Добавить сервис 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 появятся данные об этом.