- Создана новая организационная структура с эмодзи-папками - Добавлена система Inbox для быстрого захвата идей - Созданы шаблоны для всех типов заметок с YAML метаданными - Перенесен весь контент из старой структуры в новую - Добавлен главный дашборд с динамическими запросами - Создано подробное руководство по использованию системы - Техническая документация реорганизована по типам Основные улучшения: ✅ Inbox-first подход для новых заметок ✅ Тематическая организация по 8 областям знаний ✅ Шаблоны с метаданными для структурированности ✅ Система связей между заметками ✅ Динамические дашборды с аналитикой ✅ Централизованная техническая документация без дублирования
255 lines
8.9 KiB
Markdown
255 lines
8.9 KiB
Markdown
# 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 аутентификации |