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

255 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 аутентификации