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

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