415 lines
11 KiB
Markdown
415 lines
11 KiB
Markdown
## Traefik 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 сертификаты Let's Encrypt
|
||
- --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:
|
||
- traefik.enable=true
|
||
|
||
# Dashboard маршрут
|
||
- traefik.http.routers.traefik.rule=Host(`traefik.aepif.ru`)
|
||
- traefik.http.routers.traefik.tls.certresolver=letsencrypt
|
||
- traefik.http.routers.traefik.service=api@internal
|
||
|
||
# HTTP → HTTPS редирект
|
||
- 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
|
||
```
|
||
|
||
### Переменные окружения (.env)
|
||
|
||
```bash
|
||
DOMAIN=aepif.ru
|
||
ADMIN_EMAIL=epifantsev1aa@gmail.com
|
||
```
|
||
|
||
### Важные особенности конфигурации
|
||
|
||
#### Entrypoints (точки входа)
|
||
- **web** (80): HTTP трафик, автоматически редиректится на HTTPS
|
||
- **websecure** (443): HTTPS трафик для веб-сервисов
|
||
- **ssh** (2222): TCP трафик для SSH доступа к Git
|
||
|
||
#### Labels для автоматического SSL
|
||
```yaml
|
||
# Для любого сервиса добавить эти labels:
|
||
labels:
|
||
- traefik.enable=true
|
||
- traefik.http.routers.service-name.rule=Host(`subdomain.aepif.ru`)
|
||
- traefik.http.routers.service-name.tls.certresolver=letsencrypt
|
||
- traefik.http.services.service-name.loadbalancer.server.port=SERVICE_PORT
|
||
```
|
||
|
||
## Authelia Authentication Service
|
||
|
||
### docker-compose.yml
|
||
|
||
```yaml
|
||
version: '3.8'
|
||
services:
|
||
redis:
|
||
image: redis:7-alpine
|
||
container_name: auth_redis
|
||
volumes:
|
||
- redis_data:/data
|
||
networks:
|
||
- default
|
||
command: redis-server --requirepass Ll8qlQ3rgBFo4Syq
|
||
restart: unless-stopped
|
||
|
||
authelia:
|
||
image: authelia/authelia:latest
|
||
container_name: authelia
|
||
depends_on:
|
||
- redis
|
||
volumes:
|
||
- ./authelia:/config
|
||
networks:
|
||
- default
|
||
- proxy
|
||
labels:
|
||
- traefik.enable=true
|
||
- traefik.http.routers.authelia.rule=Host(`auth.aepif.ru`)
|
||
- traefik.http.routers.authelia.tls.certresolver=letsencrypt
|
||
- traefik.http.services.authelia.loadbalancer.server.port=9091
|
||
|
||
# Forward Auth Middleware
|
||
- traefik.http.middlewares.authelia.forwardauth.address=http://authelia:9091/api/verify?rd=https://auth.aepif.ru
|
||
- traefik.http.middlewares.authelia.forwardauth.trustForwardHeader=true
|
||
- traefik.http.middlewares.authelia.forwardauth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email
|
||
restart: unless-stopped
|
||
environment:
|
||
- TZ=Europe/Moscow
|
||
|
||
volumes:
|
||
redis_data:
|
||
|
||
networks:
|
||
proxy:
|
||
external: true
|
||
default:
|
||
driver: bridge
|
||
```
|
||
|
||
### Переменные окружения (.env)
|
||
|
||
```bash
|
||
DOMAIN=aepif.ru
|
||
ADMIN_EMAIL=epifantsev1aa@gmail.com
|
||
|
||
# JWT секрет для токенов
|
||
JWT_SECRET=4odTQ0TqW2Ej8m8Cm3K6Wn3VTvg09Mb2Yi4CUzuIPUsHB3fpF54+NbIAqo6+CREA
|
||
|
||
# Секрет для сессий
|
||
SESSION_SECRET=91Zc/PM0EogwZbsX0tsDGLpr4Wg7zwtQUzcp5tYP5dNdRNTlpkXBfJr9EivuD+A4
|
||
|
||
# Ключ шифрования для хранилища
|
||
STORAGE_KEY=sWLemnH0QNsYsYvbav59mQOWxLOeUvSl
|
||
|
||
# Пароль Redis
|
||
REDIS_PASSWORD=Ll8qlQ3rgBFo4Syq
|
||
|
||
# Пароль администратора
|
||
AUTHELIA_ADMIN_PASSWORD=Creonila1
|
||
```
|
||
|
||
## Конфигурация Authelia
|
||
|
||
### configuration.yml
|
||
|
||
```yaml
|
||
---
|
||
# Тема интерфейса (auto, light, dark)
|
||
theme: auto
|
||
|
||
# JWT секрет для подписи токенов
|
||
jwt_secret: 4odTQ0TqW2Ej8m8Cm3K6Wn3VTvg09Mb2Yi4CUzuIPUsHB3fpF54+NbIAqo6+CREA
|
||
|
||
# URL по умолчанию после входа
|
||
default_redirection_url: https://notes.aepif.ru
|
||
|
||
# Настройки сервера
|
||
server:
|
||
host: 0.0.0.0
|
||
port: 9091
|
||
|
||
# Логирование
|
||
log:
|
||
level: info
|
||
|
||
# TOTP настройки (двухфакторная аутентификация)
|
||
totp:
|
||
issuer: aepif.ru
|
||
|
||
# Бэкенд аутентификации
|
||
authentication_backend:
|
||
file:
|
||
path: /config/users_database.yml
|
||
|
||
# Политики доступа
|
||
access_control:
|
||
default_policy: deny
|
||
rules:
|
||
- domain: notes.aepif.ru
|
||
policy: one_factor
|
||
- domain: git.aepif.ru
|
||
policy: bypass
|
||
- domain: webhook.aepif.ru
|
||
policy: bypass
|
||
- domain: auth.aepif.ru
|
||
policy: bypass
|
||
|
||
# Настройки сессий
|
||
session:
|
||
name: authelia_session
|
||
domain: aepif.ru
|
||
secret: 91Zc/PM0EogwZbsX0tsDGLpr4Wg7zwtQUzcp5tYP5dNdRNTlpkXBfJr9EivuD+A4
|
||
expiration: 1h
|
||
inactivity: 5m
|
||
redis:
|
||
host: redis
|
||
port: 6379
|
||
password: Ll8qlQ3rgBFo4Syq
|
||
|
||
# Защита от брутфорса
|
||
regulation:
|
||
max_retries: 3
|
||
find_time: 2m
|
||
ban_time: 5m
|
||
|
||
# Хранилище данных
|
||
storage:
|
||
encryption_key: sWLemnH0QNsYsYvbav59mQOWxLOeUvSl
|
||
local:
|
||
path: /config/db.sqlite3
|
||
|
||
# Уведомления
|
||
notifier:
|
||
filesystem:
|
||
filename: /config/notification.txt
|
||
```
|
||
|
||
### users_database.yml
|
||
|
||
```yaml
|
||
---
|
||
users:
|
||
admin:
|
||
displayname: "Administrator"
|
||
# Хешированный пароль (Argon2id)
|
||
password: "$argon2id$v=19$m=65536,t=3,p=4$iF/2ZnDiY1seRau4Vf5MHw$JbKU6i/2uhvpN0CWg73eD0lzUs7NkcHw6INCH0+YFTA"
|
||
email: epifantsev1aa@gmail.com
|
||
groups:
|
||
- admins
|
||
- users
|
||
```
|
||
|
||
## Middleware конфигурации
|
||
|
||
### Использование Authelia middleware
|
||
|
||
Для защиты сервиса через Authelia добавьте в docker-compose.yml сервиса:
|
||
|
||
```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.routers.service-name.middlewares=authelia@docker # Защита Authelia
|
||
- traefik.http.services.service-name.loadbalancer.server.port=SERVICE_PORT
|
||
```
|
||
|
||
### Дополнительные middleware
|
||
|
||
#### Rate Limiting
|
||
```yaml
|
||
# В Traefik можно добавить rate limiting
|
||
- traefik.http.middlewares.rate-limit.ratelimit.burst=100
|
||
- traefik.http.middlewares.rate-limit.ratelimit.average=50
|
||
```
|
||
|
||
#### Security Headers
|
||
```yaml
|
||
# Безопасные заголовки
|
||
- traefik.http.middlewares.security.headers.browserXssFilter=true
|
||
- traefik.http.middlewares.security.headers.contentTypeNosniff=true
|
||
- traefik.http.middlewares.security.headers.frameDeny=true
|
||
```
|
||
|
||
## Сетевая конфигурация
|
||
|
||
### Сеть proxy
|
||
|
||
Сеть `proxy` является центральной для всей инфраструктуры:
|
||
|
||
```yaml
|
||
networks:
|
||
proxy:
|
||
name: proxy
|
||
driver: bridge
|
||
external: true # Сеть используется несколькими docker-compose файлами
|
||
```
|
||
|
||
### Создание сети
|
||
|
||
```bash
|
||
# Создание внешней сети (выполнить один раз)
|
||
docker network create proxy
|
||
```
|
||
|
||
### Подключение сервисов
|
||
|
||
Все сервисы, которые должны быть доступны через Traefik, подключаются к сети `proxy`:
|
||
|
||
```yaml
|
||
services:
|
||
your-service:
|
||
# ... конфигурация сервиса
|
||
networks:
|
||
- default # Внутренняя сеть для связи с базой данных
|
||
- proxy # Внешняя сеть для Traefik
|
||
```
|
||
|
||
## SSL/TLS конфигурация
|
||
|
||
### ACME настройки
|
||
|
||
```yaml
|
||
# В команде Traefik:
|
||
- --certificatesresolvers.letsencrypt.acme.email=epifantsev1aa@gmail.com
|
||
- --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json
|
||
- --certificatesresolvers.letsencrypt.acme.tlschallenge=true
|
||
```
|
||
|
||
### Хранение сертификатов
|
||
|
||
Сертификаты сохраняются в `/data/acme.json` внутри контейнера, который маппится на volume `traefik_data`.
|
||
|
||
### Автоматическое обновление
|
||
|
||
Traefik автоматически обновляет сертификаты за 30 дней до истечения.
|
||
|
||
## Генерация секретов
|
||
|
||
### Создание случайных секретов
|
||
|
||
```bash
|
||
# JWT секрет (64 символа)
|
||
openssl rand -base64 48
|
||
|
||
# Session секрет (64 символа)
|
||
openssl rand -base64 48
|
||
|
||
# Storage ключ (32 символа)
|
||
openssl rand -base64 24
|
||
|
||
# Redis пароль (16 символов)
|
||
openssl rand -base64 12
|
||
```
|
||
|
||
### Хеширование паролей для Authelia
|
||
|
||
```bash
|
||
# Установка authelia CLI (опционально)
|
||
docker run --rm -it authelia/authelia:latest authelia hash-password 'your-password'
|
||
```
|
||
|
||
## Файловая структура
|
||
|
||
### Полная структура проектов
|
||
|
||
```
|
||
/DOCKER/
|
||
├── reverse-proxy/
|
||
│ ├── docker-compose.yml
|
||
│ ├── .env
|
||
│ └── volumes/
|
||
│ └── traefik_data/
|
||
│ ├── acme.json # SSL сертификаты
|
||
│ └── traefik.log # Логи Traefik
|
||
│
|
||
├── auth/
|
||
│ ├── docker-compose.yml
|
||
│ ├── .env
|
||
│ └── authelia/
|
||
│ ├── configuration.yml # Основная конфигурация
|
||
│ ├── users_database.yml # База пользователей
|
||
│ ├── db.sqlite3 # SQLite база данных
|
||
│ └── notification.txt # Файл уведомлений
|
||
│
|
||
└── second-mind/
|
||
├── docker-compose.yml
|
||
├── .env
|
||
├── nginx.conf
|
||
├── Dockerfile
|
||
├── webhook-server/
|
||
├── obsidian_repo/
|
||
└── quartz_build/
|
||
```
|
||
|
||
## Права доступа
|
||
|
||
### Важные права файлов
|
||
|
||
```bash
|
||
# ACME файл должен быть доступен только Traefik
|
||
chmod 600 /var/lib/docker/volumes/reverse-proxy_traefik_data/_data/acme.json
|
||
|
||
# Конфигурационные файлы Authelia
|
||
chmod 644 /DOCKER/auth/authelia/configuration.yml
|
||
chmod 644 /DOCKER/auth/authelia/users_database.yml
|
||
chmod 600 /DOCKER/auth/.env
|
||
|
||
# База данных SQLite
|
||
chmod 644 /DOCKER/auth/authelia/db.sqlite3
|
||
```
|
||
|
||
Следующий документ: [[Инфраструктура - Развертывание]] |