Files
second-mind-aep/Мой сервер/Инфраструктура/Конфигурации.md
2025-08-04 12:45:56 +04:00

11 KiB
Raw Blame History

Traefik Reverse Proxy

docker-compose.yml

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)

DOMAIN=aepif.ru
ADMIN_EMAIL=epifantsev1aa@gmail.com

Важные особенности конфигурации

Entrypoints (точки входа)

  • web (80): HTTP трафик, автоматически редиректится на HTTPS
  • websecure (443): HTTPS трафик для веб-сервисов
  • ssh (2222): TCP трафик для SSH доступа к Git

Labels для автоматического SSL

# Для любого сервиса добавить эти 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

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)

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

---
# Тема интерфейса (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

---
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 сервиса:

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

# В Traefik можно добавить rate limiting
- traefik.http.middlewares.rate-limit.ratelimit.burst=100
- traefik.http.middlewares.rate-limit.ratelimit.average=50

Security Headers

# Безопасные заголовки
- traefik.http.middlewares.security.headers.browserXssFilter=true
- traefik.http.middlewares.security.headers.contentTypeNosniff=true
- traefik.http.middlewares.security.headers.frameDeny=true

Сетевая конфигурация

Сеть proxy

Сеть proxy является центральной для всей инфраструктуры:

networks:
  proxy:
    name: proxy
    driver: bridge
    external: true  # Сеть используется несколькими docker-compose файлами

Создание сети

# Создание внешней сети (выполнить один раз)
docker network create proxy

Подключение сервисов

Все сервисы, которые должны быть доступны через Traefik, подключаются к сети proxy:

services:
  your-service:
    # ... конфигурация сервиса
    networks:
      - default  # Внутренняя сеть для связи с базой данных
      - proxy    # Внешняя сеть для Traefik

SSL/TLS конфигурация

ACME настройки

# В команде 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 дней до истечения.

Генерация секретов

Создание случайных секретов

# 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

# Установка 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/

Права доступа

Важные права файлов

# 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

Следующий документ: Инфраструктура - Развертывание