# Traefik Reverse Proxy - Конфигурации ← **[[Обзор системы|← Назад к обзору]]** ## Docker Compose конфигурация ### Основной файл: `/DOCKER/reverse-proxy/docker-compose.yml` ```yaml 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 ```yaml volumes: - /var/run/docker.sock:/var/run/docker.sock:ro ``` - **Назначение**: Доступ к Docker API для service discovery - **Режим**: Read-only для безопасности ## Network Configuration ### Proxy Network ```yaml networks: proxy: name: proxy driver: bridge ``` **Важно**: Эта сеть должна быть создана заранее и подключена ко всем сервисам, которые должны быть доступны через Traefik. ## Labels Configuration ### Self-configuration для Dashboard ```yaml 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 ```yaml 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 для сервиса ```yaml 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 ```yaml 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) ```yaml 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 (рекомендуемые) ```yaml 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 ```yaml - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https ``` ### Rate Limiting ```yaml - traefik.http.middlewares.rate-limit.ratelimit.burst=100 - traefik.http.middlewares.rate-limit.ratelimit.average=50 ``` ### CORS Headers ```yaml - 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 поддерживает конфигурацию через переменные окружения: ```yaml 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: ```yaml - traefik.http.routers.traefik.middlewares=authelia@docker ``` 3. Использовать Docker socket proxy для ограничения доступа к Docker API ## Связанные файлы - **[[Развертывание]]** - инструкции по первоначальной настройке - **[[Администрирование]]** - управление и мониторинг - **[[../Authelia Authentication/Конфигурации]]** - настройка middleware аутентификации