## 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 ``` Следующий документ: [[Инфраструктура - Развертывание]]