Files
second-mind-aep/Мой сервер/Traefik Reverse Proxy/Конфигурации.md
2025-08-04 16:12:28 +04:00

8.9 KiB
Raw Blame History

Traefik Reverse Proxy - Конфигурации

Обзор системы

Docker Compose конфигурация

Основной файл: /DOCKER/reverse-proxy/docker-compose.yml

version: '3.8'
services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    command:
      # API и Dashboard
      - --api.dashboard=true
      - --api.insecure=true
      
      # Docker Provider
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --providers.docker.network=proxy
      
      # Entrypoints
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --entrypoints.ssh.address=:2222
      
      # SSL Configuration
      - --certificatesresolvers.letsencrypt.acme.email=your_email@aepif.ru
      - --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json
      - --certificatesresolvers.letsencrypt.acme.tlschallenge=true
      
      # TCP Routing
      - --providers.docker.exposedByDefault=false
    
    ports:
      - "80:80"       # HTTP
      - "443:443"     # HTTPS
      - "8080:8080"   # Dashboard
      - "2222:2222"   # SSH для Git
    
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik_data:/data
    
    networks:
      - proxy
    
    labels:
      # Самонастройка для Dashboard
      - traefik.enable=true
      - traefik.http.routers.traefik.rule=Host(`traefik.aepif.ru`)
      - traefik.http.routers.traefik.tls.certresolver=letsencrypt
      - traefik.http.routers.traefik.service=api@internal
      
      # HTTP to HTTPS redirect
      - traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)
      - traefik.http.routers.http-catchall.entrypoints=web
      - traefik.http.routers.http-catchall.middlewares=redirect-to-https
      - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
    
    restart: unless-stopped

volumes:
  traefik_data:

networks:
  proxy:
    name: proxy
    driver: bridge

Command Line Arguments

API Configuration

  • --api.dashboard=true - Включает веб-интерфейс Dashboard
  • --api.insecure=true - ⚠️ Небезопасно: Доступ к API без аутентификации на порту 8080

Provider Configuration

  • --providers.docker=true - Включает Docker provider для автодискавери
  • --providers.docker.exposedbydefault=false - Сервисы не экспонируются автоматически
  • --providers.docker.network=proxy - Использует сеть proxy для подключения

Entrypoints

  • --entrypoints.web.address=:80 - HTTP entrypoint
  • --entrypoints.websecure.address=:443 - HTTPS entrypoint
  • --entrypoints.ssh.address=:2222 - TCP entrypoint для SSH

SSL Certificate Management

  • --certificatesresolvers.letsencrypt.acme.email=your_email@aepif.ru - Email для Let's Encrypt
  • --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json - Файл хранения сертификатов
  • --certificatesresolvers.letsencrypt.acme.tlschallenge=true - Использует TLS-01 challenge

Port Mapping

Внешний порт Внутренний порт Назначение
80 80 HTTP трафик (редирект на HTTPS)
443 443 HTTPS трафик
8080 8080 Dashboard (небезопасно)
2222 2222 SSH для Git operations

Volume Configuration

traefik_data

  • Назначение: Хранение SSL сертификатов и конфигурации
  • Содержимое:
    • acme.json - Let's Encrypt сертификаты
    • Конфигурационные файлы Traefik

Docker Socket

volumes:
  - /var/run/docker.sock:/var/run/docker.sock:ro
  • Назначение: Доступ к Docker API для service discovery
  • Режим: Read-only для безопасности

Network Configuration

Proxy Network

networks:
  proxy:
    name: proxy
    driver: bridge

Важно: Эта сеть должна быть создана заранее и подключена ко всем сервисам, которые должны быть доступны через Traefik.

Labels Configuration

Self-configuration для Dashboard

labels:
  - traefik.enable=true
  - traefik.http.routers.traefik.rule=Host(`traefik.aepif.ru`)
  - traefik.http.routers.traefik.tls.certresolver=letsencrypt
  - traefik.http.routers.traefik.service=api@internal

HTTP to HTTPS Redirect

labels:
  - traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)
  - traefik.http.routers.http-catchall.entrypoints=web
  - traefik.http.routers.http-catchall.middlewares=redirect-to-https
  - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https

Dynamic Configuration Examples

Типичные labels для сервиса

labels:
  - traefik.enable=true
  - traefik.http.routers.service-name.rule=Host(`service.aepif.ru`)
  - traefik.http.routers.service-name.tls.certresolver=letsencrypt
  - traefik.http.services.service-name.loadbalancer.server.port=80

С Authelia middleware

labels:
  - traefik.enable=true
  - traefik.http.routers.protected-service.rule=Host(`protected.aepif.ru`)
  - traefik.http.routers.protected-service.tls.certresolver=letsencrypt
  - traefik.http.routers.protected-service.middlewares=authelia@docker
  - traefik.http.services.protected-service.loadbalancer.server.port=80

TCP routing (для SSH)

labels:
  - traefik.enable=true
  - traefik.tcp.routers.git-ssh.rule=HostSNI(`*`)
  - traefik.tcp.routers.git-ssh.entrypoints=ssh
  - traefik.tcp.services.git-ssh.loadbalancer.server.port=22

SSL/TLS Configuration

ACME Settings

  • Challenge Type: TLS-01 (HTTP challenge через порт 443)
  • Storage: /data/acme.json внутри контейнера
  • Email: Обязательно указать для уведомлений о истечении сертификатов
  • Domains: Автоматически из Host rules в labels

Security Headers (рекомендуемые)

labels:
  - traefik.http.middlewares.security-headers.headers.frameDeny=true
  - traefik.http.middlewares.security-headers.headers.sslRedirect=true
  - traefik.http.middlewares.security-headers.headers.browserXssFilter=true
  - traefik.http.middlewares.security-headers.headers.contentTypeNosniff=true
  - traefik.http.middlewares.security-headers.headers.forceSTSHeader=true
  - traefik.http.middlewares.security-headers.headers.stsIncludeSubdomains=true
  - traefik.http.middlewares.security-headers.headers.stsPreload=true
  - traefik.http.middlewares.security-headers.headers.stsSeconds=31536000

Middleware Configuration

Redirect to HTTPS

- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https

Rate Limiting

- traefik.http.middlewares.rate-limit.ratelimit.burst=100
- traefik.http.middlewares.rate-limit.ratelimit.average=50

CORS Headers

- traefik.http.middlewares.cors.headers.accessControlAllowOriginList=*
- traefik.http.middlewares.cors.headers.accessControlAllowMethods=GET,OPTIONS,PUT,POST,DELETE
- traefik.http.middlewares.cors.headers.accessControlAllowHeaders=*

Environment Variables

Traefik поддерживает конфигурацию через переменные окружения:

environment:
  - TRAEFIK_API_DASHBOARD=true
  - TRAEFIK_PROVIDERS_DOCKER=true
  - TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
  - TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
  - TRAEFIK_CERTIFICATESRESOLVERS_LETSENCRYPT_ACME_EMAIL=your_email@aepif.ru

Безопасность конфигурации

⚠️ Проблемы безопасности в текущей конфигурации

  1. Dashboard без аутентификации: --api.insecure=true делает Dashboard доступным без авторизации
  2. Docker socket: Доступ к Docker API может быть использован для эскалации привилегий

🔒 Рекомендации по улучшению безопасности

  1. Убрать --api.insecure=true и настроить аутентификацию для Dashboard
  2. Добавить middleware для Dashboard:
- traefik.http.routers.traefik.middlewares=authelia@docker
  1. Использовать Docker socket proxy для ограничения доступа к Docker API

Связанные файлы