vault backup: 2025-08-04 12:45:56

This commit is contained in:
Andrey Epifancev
2025-08-04 12:45:56 +04:00
parent c0c328dc67
commit 2073fb73ad
4 changed files with 644 additions and 2 deletions

View File

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

View File

@@ -0,0 +1,227 @@
## Описание
Инфраструктурные сервисы обеспечивают базовую функциональность для всех приложений в экосистеме aepif.ru. Включают в себя reverse proxy с автоматическими SSL сертификатами и систему аутентификации.
## Архитектура инфраструктуры
```mermaid
graph TB
A[Internet] --> B[Traefik Reverse Proxy]
B --> C[Authelia Auth Service]
B --> D[Second Mind]
B --> E[Other Services]
C --> F[Redis Session Store]
C --> G[SQLite User Database]
B --> H[Let's Encrypt]
H --> I[SSL Certificates]
subgraph "Network: proxy"
B
C
D
E
end
subgraph "Auth Network"
C
F
end
```
## Основные компоненты
### Traefik Reverse Proxy
- **Назначение**: Централизованная маршрутизация трафика
- **Домен**: `traefik.aepif.ru` (dashboard)
- **Порты**:
- 80 (HTTP) → автоматический редирект на HTTPS
- 443 (HTTPS)
- 2222 (SSH для Git)
- 8080 (Dashboard)
- **Функции**:
- Автоматическое получение SSL сертификатов от Let's Encrypt
- Load balancing между контейнерами
- TCP и HTTP маршрутизация
- Middleware для аутентификации
### Authelia Authentication
- **Назначение**: Централизованная аутентификация и авторизация
- **Домен**: `auth.aepif.ru`
- **Технология**: Forward Auth middleware
- **Функции**:
- Single Sign-On (SSO) для всех сервисов
- Two-factor authentication (TOTP)
- Session management через Redis
- Политики доступа по доменам
### Redis Session Store
- **Назначение**: Хранение пользовательских сессий
- **Технология**: Redis 7 Alpine
- **Особенности**:
- Персистентное хранение сессий
- Защита паролем
- Быстрый доступ к данным сессий
## Структура проектов
### Reverse Proxy
```
/DOCKER/reverse-proxy/
├── docker-compose.yml # Конфигурация Traefik
├── .env # Переменные окружения
└── volumes/
└── traefik_data/ # ACME сертификаты и конфиг
```
### Authentication Service
```
/DOCKER/auth/
├── docker-compose.yml # Конфигурация Authelia + Redis
├── .env # Переменные окружения и секреты
└── authelia/ # Конфигурация Authelia
├── configuration.yml # Основная конфигурация
├── users_database.yml # База пользователей
├── db.sqlite3 # SQLite база данных
└── notification.txt # Файл уведомлений
```
## Принцип работы
### Маршрутизация запросов
1. **Пользователь** обращается к любому поддомену `*.aepif.ru`
2. **Traefik** перехватывает запрос и анализирует Host header
3. **Traefik** проверяет, требуется ли аутентификация (middleware authelia)
4. Если нужна **аутентификация** → перенаправление на `auth.aepif.ru`
5. **Authelia** проверяет сессию или запрашивает логин/пароль
6. После успешной **аутентификации** → возврат к исходному сервису
7. **Traefik** проксирует запрос к целевому контейнеру
### SSL сертификаты
1. **Let's Encrypt ACME** автоматически получает сертификаты для новых доменов
2. **Traefik** автоматически обновляет сертификаты перед истечением
3. Все **HTTP запросы** автоматически перенаправляются на HTTPS
4. **Сертификаты сохраняются** в volume для персистентности
## Домены и маршрутизация
| Домен | Сервис | Аутентификация | Описание |
|-------|--------|---------------|----------|
| `traefik.aepif.ru` | Traefik Dashboard | Нет* | Панель управления Traefik |
| `auth.aepif.ru` | Authelia | Bypass | Страница входа в систему |
| `notes.aepif.ru` | Second Mind | ✅ Authelia | Заметки с защитой |
| `git.aepif.ru` | Gitea | Bypass | Git-сервер (собственная авторизация) |
| `webhook.aepif.ru` | Webhook Service | Bypass | API для автоматизации |
*Dashboard Traefik в production должен быть защищен
## Политики доступа
### Конфигурация в Authelia
```yaml
access_control:
default_policy: deny # По умолчанию запрещен доступ
rules:
- domain: notes.aepif.ru
policy: one_factor # Требует логин/пароль
- domain: git.aepif.ru
policy: bypass # Собственная авторизация Gitea
- domain: webhook.aepif.ru
policy: bypass # API с токеном
- domain: auth.aepif.ru
policy: bypass # Сама страница входа
```
### Типы политик
- **bypass**: Доступ без аутентификации через Authelia
- **one_factor**: Требует логин/пароль
- **two_factor**: Требует логин/пароль + TOTP код
- **deny**: Полный запрет доступа
## Пользователи и группы
### Структура пользователей
```yaml
users:
admin:
displayname: "Administrator"
password: "$argon2id$..." # Хешированный пароль
email: epifantsev1aa@gmail.com
groups:
- admins # Администраторская группа
- users # Базовая группа пользователей
```
### Управление паролями
- Пароли хранятся в формате **Argon2id** (безопасное хеширование)
- Поддержка **reset паролей** через email уведомления
- Интеграция с **TOTP** для двухфакторной аутентификации
## Безопасность
### Уровни защиты
1. **SSL/TLS**: Все соединения зашифрованы
2. **Forward Auth**: Централизованная проверка аутентификации
3. **Session Management**: Безопасное хранение сессий в Redis
4. **Password Hashing**: Argon2id для хранения паролей
5. **Rate Limiting**: Защита от брутфорса (3 попытки за 2 минуты)
6. **Session Expiration**: Автоматическое истечение сессий
### Настройки безопасности
```yaml
regulation:
max_retries: 3 # Максимум попыток входа
find_time: 2m # Период для подсчета попыток
ban_time: 5m # Время блокировки
session:
expiration: 1h # Время жизни сессии
inactivity: 5m # Время неактивности до выхода
```
## Мониторинг
### Доступные метрики
- **Traefik Dashboard**: Статистика запросов, ошибок, времени ответа
- **Authelia Logs**: Попытки входа, ошибки аутентификации
- **Redis Metrics**: Использование памяти, количество ключей
- **SSL Certificate Status**: Статус и срок действия сертификатов
### Health Checks
```bash
# Проверка Traefik
curl -I https://traefik.aepif.ru
# Проверка Authelia
curl -I https://auth.aepif.ru
# Проверка SSL сертификатов
openssl s_client -connect aepif.ru:443 -servername aepif.ru | openssl x509 -noout -dates
```
## Преимущества архитектуры
- **Централизация**: Единая точка входа для всех сервисов
- **Автоматизация SSL**: Не нужно вручную управлять сертификатами
- **Безопасность**: Единая система аутентификации
- **Масштабируемость**: Легко добавлять новые сервисы
- **Мониторинг**: Централизованная статистика
- **Zero Downtime**: Обновления без простоя сервисов
## Связанные документы
- [[Инфраструктура - Конфигурации]] - детальные настройки всех компонентов
- [[Инфраструктура - Развертывание]] - установка и первоначальная настройка
- [[Инфраструктура - Администрирование]] - обслуживание и мониторинг
- [[Second Mind - Обзор системы]] - основное приложение на этой инфраструктуре