Traefik + Netdata + Let’s Encrypt

Статья описывает, как настроить взаимодействие Traefik, Netdata и Let’s Encrypt с использованием Docker Compose для автоматического управления SSL-сертификатами и проксирования трафика.

Настройка трафика

  1. mkdir traefik && cd traefik
  2. Создаём сесть docker network create web
  3. Копируем всё в свой docker-compose.yml
version: '3'

services:
  reverse-proxy:
    image: traefik:v2.5.4
    restart: always
    command:
      - "--api.insecure=true" # включим веб-интерфейс
      - "--providers.docker=true" # указывает Traefik слушать докер
      - "--entrypoints.web.address=:80" # указываем точку входа web
      - "--entrypoints.websecure.address=:443" # указываем точку входа websecure
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" # Указываем метод вызова ACME как HTTP Challenge
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.letsencrypt.acme.email=твой_ящик@gmail.com" # указываем email для регистрации в Let's Encrypt
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" # указываем путь для хранения сертификатов
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080" # The Web UI (enabled by --api.insecure=true)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # Чтобы Traefik мог слушать события Docker
      - ./letsencrypt:/letsencrypt # папка с сертификатами
    networks:
      - web
    labels:
      # добавим домен traefik.твой_домен.com
      - traefik.enable=true
      - traefik.http.routers.traefik.entrypoints=websecure
      - traefik.http.routers.traefik.rule=Host(`traefik.твой_домен.com`)
      # TLS настройки
      - traefik.http.routers.traefik.tls=true
      - traefik.http.routers.traefik.tls.certresolver=letsencrypt
      # TLS настройки для дашборда
      - traefik.http.services.traefik-traefik.loadbalancer.server.port=8080
      # middleware для редиректа с http на https
      - traefik.http.middlewares.http-redirect.redirectscheme.scheme=https
      - traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)
      - traefik.http.routers.http-catchall.entrypoints=web
      - traefik.http.routers.http-catchall.middlewares=http-redirect
networks:
  web:
    external: true

Настройка Netdata

version: '3'
services:
  netdata:
    image: netdata/netdata
    container_name: netdata
    hostname: netdata.твой_домен.com
    ports:
      - 19999:19999
    restart: unless-stopped
    cap_add:
      - SYS_PTRACE
    security_opt:
      - apparmor:unconfined
    volumes:
      - netdataconfig:/etc/netdata
      - netdatalib:/var/lib/netdata
      - netdatacache:/var/cache/netdata
      - /etc/passwd:/host/etc/passwd:ro
      - /etc/group:/host/etc/group:ro
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /etc/os-release:/host/etc/os-release:ro
    labels:
      - traefik.enable=true
      - traefik.http.routers.netdata.rule=Host(`netdata.твой_домен.com`)
      - traefik.http.routers.netdata.entrypoints=websecure
      - traefik.http.routers.netdata.tls=true
      - traefik.http.routers.netdata.tls.certresolver=letsencrypt
      - traefik.http.services.netdata.loadbalancer.server.port=19999
      - traefik.http.services.netdata.loadbalancer.server.scheme=http
      - traefik.http.services.netdata.loadbalancer.passhostheader=true
    networks:
      - web

volumes:
  netdataconfig:
  netdatalib:
  netdatacache:

networks:
  web:
    external: true # стандартная для всех на этом сервере

PROFIT