✨ Реорганизация структуры заметок v2.0
- Создана новая организационная структура с эмодзи-папками - Добавлена система Inbox для быстрого захвата идей - Созданы шаблоны для всех типов заметок с YAML метаданными - Перенесен весь контент из старой структуры в новую - Добавлен главный дашборд с динамическими запросами - Создано подробное руководство по использованию системы - Техническая документация реорганизована по типам Основные улучшения: ✅ Inbox-first подход для новых заметок ✅ Тематическая организация по 8 областям знаний ✅ Шаблоны с метаданными для структурированности ✅ Система связей между заметками ✅ Динамические дашборды с аналитикой ✅ Централизованная техническая документация без дублирования
This commit is contained in:
71
⚙️ Техническое/index.md
Normal file
71
⚙️ Техническое/index.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# ⚙️ Техническое
|
||||
|
||||
Техническая документация, серверы, конфигурации и IT-инфраструктура.
|
||||
|
||||
## 🚀 Быстрые действия
|
||||
|
||||
- [[📋 Templates/⚙️ Техническая документация|📖 Создать документацию]]
|
||||
- [[📋 Templates/🖥️ Конфигурация сервера|🖥️ Конфигурация сервера]]
|
||||
- [[📋 Templates/🔧 Инструкция|🔧 Новая инструкция]]
|
||||
|
||||
## 📂 Разделы
|
||||
|
||||
### 🖥️ [Серверы](🖥️%20Серверы/)
|
||||
Документация по серверам и инфраструктуре
|
||||
|
||||
```dataview
|
||||
TABLE status as "Статус", version as "Версия", category as "Категория"
|
||||
FROM "⚙️ Техническое/🖥️ Серверы"
|
||||
WHERE status = "активный"
|
||||
SORT file.mtime DESC
|
||||
```
|
||||
|
||||
### 🔧 [Конфигурации](🔧%20Конфигурации/)
|
||||
Файлы конфигураций и настройки
|
||||
|
||||
```dataview
|
||||
LIST
|
||||
FROM "⚙️ Техническое/🔧 Конфигурации"
|
||||
SORT file.mtime DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
### 📖 [Документация](📖%20Документация/)
|
||||
Техническая документация и инструкции
|
||||
|
||||
```dataview
|
||||
TABLE category as "Категория", version as "Версия", status as "Статус"
|
||||
FROM "⚙️ Техническое/📖 Документация"
|
||||
SORT file.mtime DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
## 🔗 Связанные системы
|
||||
|
||||
Здесь будет перенесена документация из старой папки "Мой сервер":
|
||||
- Authelia Authentication
|
||||
- Git Service
|
||||
- Second Mind Setup
|
||||
- Traefik Reverse Proxy
|
||||
|
||||
## 📊 Статистика
|
||||
|
||||
### По типам документации
|
||||
```dataview
|
||||
TABLE length(rows) as "Количество"
|
||||
FROM "⚙️ Техническое"
|
||||
WHERE category != null
|
||||
GROUP BY category
|
||||
SORT length(rows) DESC
|
||||
```
|
||||
|
||||
### Активные системы
|
||||
```dataview
|
||||
TABLE status, version, file.mtime as "Последнее обновление"
|
||||
FROM "⚙️ Техническое"
|
||||
WHERE status = "активный"
|
||||
SORT file.mtime DESC
|
||||
```
|
||||
|
||||
---
|
||||
[[📊 Dashboard/Главный дашборд|← Вернуться к главному дашборду]]
|
||||
@@ -0,0 +1,85 @@
|
||||
# Документация сервера aepif.ru
|
||||
|
||||
Техническая документация инфраструктуры и сервисов домена aepif.ru. Здесь собрана вся информация о развернутых системах.
|
||||
|
||||
## Обзор архитектуры
|
||||
|
||||
Система построена на микросервисной архитектуре с использованием Docker и состоит из следующих основных компонентов:
|
||||
|
||||
### Инфраструктурные сервисы
|
||||
- **[[Traefik Reverse Proxy/Обзор системы|Traefik Reverse Proxy]]** - централизованная маршрутизация и SSL
|
||||
- **[[Authelia Authentication/Обзор системы|Authelia Authentication]]** - единая система аутентификации и авторизации
|
||||
- **Redis** - хранение сессий и кэширование
|
||||
|
||||
### Основные приложения
|
||||
- **[[Second Mind Setup/Обзор системы|Second Mind]]** - система публикации заметок Obsidian через Quartz
|
||||
- **[[Git Service/Обзор системы|Git Service]]** - Git-сервер на базе Gitea для хранения кода и заметок
|
||||
|
||||
## Структура документации
|
||||
|
||||
### 🏗️ Общий обзор инфраструктуры
|
||||
- **[[Обзор инфраструктуры]]** - архитектура высокого уровня и принципы системы
|
||||
|
||||
### 📋 Инфраструктурные сервисы
|
||||
Базовые сервисы, обеспечивающие работу всей системы:
|
||||
|
||||
#### 🌐 Traefik Reverse Proxy
|
||||
- **[[Traefik Reverse Proxy/Обзор системы]]** - архитектура и функции
|
||||
- **[[Traefik Reverse Proxy/Конфигурации]]** - настройки маршрутизации и SSL
|
||||
- **[[Traefik Reverse Proxy/Развертывание]]** - установка reverse proxy
|
||||
- **[[Traefik Reverse Proxy/Администрирование]]** - управление трафиком
|
||||
|
||||
#### 🔐 Authelia Authentication
|
||||
- **[[Authelia Authentication/Обзор системы]]** - система аутентификации
|
||||
- **[[Authelia Authentication/Конфигурации]]** - настройки доступа и пользователей
|
||||
- **[[Authelia Authentication/Развертывание]]** - установка системы авторизации
|
||||
- **[[Authelia Authentication/Администрирование]]** - управление пользователями
|
||||
|
||||
### 📝 Second Mind Setup
|
||||
Система автоматической публикации заметок:
|
||||
- **[[Second Mind Setup/Обзор системы]]** - концепция и архитектура
|
||||
- **[[Second Mind Setup/Конфигурации]]** - настройки компонентов
|
||||
- **[[Second Mind Setup/Развертывание]]** - пошаговая установка
|
||||
- **[[Second Mind Setup/Администрирование]]** - управление и поддержка
|
||||
|
||||
### 🗂️ Git Service
|
||||
Централизованное хранение кода и версионирование:
|
||||
- **[[Git Service/Обзор системы]]** - архитектура Git-сервера
|
||||
- **[[Git Service/Конфигурации]]** - настройки Gitea и PostgreSQL
|
||||
- **[[Git Service/Развертывание]]** - установка и первоначальная настройка
|
||||
- **[[Git Service/Администрирование]]** - управление пользователями и репозиториями
|
||||
|
||||
## Домены и сервисы
|
||||
|
||||
| Домен | Сервис | Описание | Статус |
|
||||
|-------|--------|----------|--------|
|
||||
| `notes.aepif.ru` | Second Mind | Опубликованные заметки | 🟢 Активен |
|
||||
| `git.aepif.ru` | Gitea | Git-сервер | 🟢 Активен |
|
||||
| `auth.aepif.ru` | Authelia | Система входа | 🟢 Активен |
|
||||
| `traefik.aepif.ru` | Traefik Dashboard | Мониторинг прокси | 🟢 Активен |
|
||||
| `webhook.aepif.ru` | Webhook Service | API автоматизации | 🟢 Активен |
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
1. **Развертывание Traefik**: [[Traefik Reverse Proxy/Развертывание]]
|
||||
2. **Настройка аутентификации**: [[Authelia Authentication/Развертывание]]
|
||||
3. **Установка Git Service**: [[Git Service/Развертывание]]
|
||||
4. **Установка Second Mind**: [[Second Mind Setup/Развертывание]]
|
||||
5. **Первая публикация**: [[Second Mind Setup/Администрирование]]
|
||||
|
||||
## Мониторинг и безопасность
|
||||
|
||||
- Все сервисы защищены SSL сертификатами от Let's Encrypt
|
||||
- Централизованная аутентификация через Authelia
|
||||
- Мониторинг доступен через Traefik Dashboard
|
||||
- Логи сервисов доступны через `docker logs`
|
||||
|
||||
## Полезные ссылки
|
||||
|
||||
- [Опубликованная версия заметок](https://notes.aepif.ru) 🔒
|
||||
- [Git-репозиторий](https://git.aepif.ru) 🔒
|
||||
- [Административная панель](https://traefik.aepif.ru) 🔒
|
||||
|
||||
---
|
||||
|
||||
*Документация обновлена: {{ date | date('YYYY-MM-DD') }}*
|
||||
259
⚙️ Техническое/📖 Документация/Обзор инфраструктуры.md
Normal file
259
⚙️ Техническое/📖 Документация/Обзор инфраструктуры.md
Normal file
@@ -0,0 +1,259 @@
|
||||
# Обзор инфраструктуры aepif.ru
|
||||
|
||||
## Введение
|
||||
|
||||
Данный документ представляет общий обзор инфраструктуры домена aepif.ru и служит связующим звеном между отдельными компонентами системы.
|
||||
|
||||
← **[[index|Вернуться к документации сервера]]**
|
||||
|
||||
## Архитектура высокого уровня
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[Internet] --> B[Traefik Reverse Proxy]
|
||||
|
||||
B --> C[Authelia Authentication]
|
||||
B --> D[Second Mind - notes.aepif.ru]
|
||||
B --> E[Git Service - git.aepif.ru]
|
||||
B --> F[Webhook Service - webhook.aepif.ru]
|
||||
|
||||
C --> G[Redis Session Store]
|
||||
C --> H[User Database]
|
||||
|
||||
E --> I[PostgreSQL Database]
|
||||
E --> J[Git Repositories]
|
||||
|
||||
D --> K[Nginx Static Server]
|
||||
D --> L[Quartz Builder]
|
||||
|
||||
F --> L
|
||||
F --> J
|
||||
|
||||
subgraph "Infrastructure Layer"
|
||||
B
|
||||
C
|
||||
G
|
||||
end
|
||||
|
||||
subgraph "Application Layer"
|
||||
D
|
||||
E
|
||||
F
|
||||
end
|
||||
|
||||
subgraph "Data Layer"
|
||||
H
|
||||
I
|
||||
J
|
||||
K
|
||||
end
|
||||
```
|
||||
|
||||
## Принципы архитектуры
|
||||
|
||||
### Микросервисная архитектура
|
||||
- **Разделение ответственности**: Каждый сервис выполняет специфическую функцию
|
||||
- **Независимое развертывание**: Сервисы можно обновлять и масштабировать независимо
|
||||
- **Контейнеризация**: Все сервисы работают в Docker контейнерах
|
||||
- **Service Discovery**: Автоматическое обнаружение сервисов через Docker
|
||||
|
||||
### Централизованная инфраструктура
|
||||
- **Single Point of Entry**: Traefik как единая точка входа
|
||||
- **Unified Authentication**: Authelia для всех защищенных сервисов
|
||||
- **Automated SSL**: Let's Encrypt для всех доменов
|
||||
- **Shared Networks**: Общие Docker сети для взаимодействия
|
||||
|
||||
### DevOps практики
|
||||
- **Infrastructure as Code**: Конфигурация через docker-compose файлы
|
||||
- **Automated Deployment**: Git-based deployment для заметок
|
||||
- **Monitoring**: Централизованный мониторинг через Traefik Dashboard
|
||||
- **Security First**: Принцип минимальных привилегий и защита по умолчанию
|
||||
|
||||
## Компоненты системы
|
||||
|
||||
### Уровень инфраструктуры
|
||||
|
||||
#### Traefik Reverse Proxy
|
||||
- **Роль**: Центральный маршрутизатор трафика
|
||||
- **Документация**: [[Мой сервер/Traefik Reverse Proxy/Обзор системы]]
|
||||
- **Функции**: SSL termination, load balancing, service discovery
|
||||
- **Интеграции**: Docker API, Let's Encrypt, Authelia middleware
|
||||
|
||||
#### Authelia Authentication
|
||||
- **Роль**: Централизованная аутентификация и авторизация
|
||||
- **Документация**: [[Мой сервер/Authelia Authentication/Обзор системы]]
|
||||
- **Функции**: SSO, 2FA, access control, session management
|
||||
- **Интеграции**: Traefik Forward Auth, Redis, file-based users
|
||||
|
||||
### Уровень приложений
|
||||
|
||||
#### Second Mind
|
||||
- **Роль**: Система публикации заметок Obsidian
|
||||
- **Документация**: [[Мой сервер/Second Mind Setup/Обзор системы]]
|
||||
- **Функции**: Статическая генерация сайта, webhook processing
|
||||
- **Интеграции**: Git Service, Quartz, Nginx
|
||||
|
||||
#### Git Service
|
||||
- **Роль**: Централизованное хранение кода и документации
|
||||
- **Документация**: [[Мой сервер/Git Service/Обзор системы]]
|
||||
- **Функции**: Git repositories, web interface, webhook notifications
|
||||
- **Интеграции**: PostgreSQL, Traefik, SSH access
|
||||
|
||||
## Сетевая архитектура
|
||||
|
||||
### Docker Networks
|
||||
|
||||
#### Proxy Network
|
||||
```yaml
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
driver: bridge
|
||||
external: true
|
||||
```
|
||||
|
||||
- **Назначение**: Связывает все публичные сервисы с Traefik
|
||||
- **Подключенные сервисы**: Traefik, Authelia, Second Mind, Git Service
|
||||
- **Безопасность**: Изолированная сеть для веб-трафика
|
||||
|
||||
#### Internal Networks
|
||||
- **auth_default**: Внутренняя сеть для Authelia и Redis
|
||||
- **git_default**: Внутренняя сеть для Git Service и PostgreSQL
|
||||
- **second-mind_default**: Внутренняя сеть для Second Mind компонентов
|
||||
|
||||
### Port Mapping
|
||||
| Порт | Сервис | Протокол | Назначение |
|
||||
|------|--------|----------|------------|
|
||||
| 80 | Traefik | HTTP | Редирект на HTTPS |
|
||||
| 443 | Traefik | HTTPS | Основной веб-трафик |
|
||||
| 2222 | Traefik → Git | SSH | Git operations |
|
||||
| 8080 | Traefik | HTTP | Dashboard (insecure) |
|
||||
|
||||
## Управление доменами
|
||||
|
||||
### Domain Structure
|
||||
```
|
||||
aepif.ru
|
||||
├── notes.aepif.ru → Second Mind (защищено Authelia)
|
||||
├── git.aepif.ru → Git Service (собственная авторизация)
|
||||
├── auth.aepif.ru → Authelia (публичная страница входа)
|
||||
├── webhook.aepif.ru → Webhook Service (API без авторизации)
|
||||
└── traefik.aepif.ru → Traefik Dashboard (небезопасно)
|
||||
```
|
||||
|
||||
### SSL Certificate Management
|
||||
- **Провайдер**: Let's Encrypt ACME
|
||||
- **Challenge Type**: TLS Challenge
|
||||
- **Автоматическое обновление**: Traefik управляет жизненным циклом
|
||||
- **Хранение**: Persistent volume в Traefik контейнере
|
||||
|
||||
## Data Flow
|
||||
|
||||
### User Authentication Flow
|
||||
1. **User Request** → Traefik получает запрос к защищенному ресурсу
|
||||
2. **Middleware Check** → Traefik проверяет Authelia middleware
|
||||
3. **Auth Validation** → Authelia валидирует сессию в Redis
|
||||
4. **Authentication** → При необходимости перенаправление на auth.aepif.ru
|
||||
5. **Access Grant** → После успешной аутентификации доступ к ресурсу
|
||||
|
||||
### Content Publishing Flow
|
||||
1. **Git Push** → Изменения отправляются в Git Service
|
||||
2. **Webhook Trigger** → Git Service отправляет webhook
|
||||
3. **Content Pull** → Webhook Service получает изменения
|
||||
4. **Site Build** → Quartz генерирует статический сайт
|
||||
5. **Content Deploy** → Nginx раздает обновленный контент
|
||||
|
||||
## Security Model
|
||||
|
||||
### Принципы безопасности
|
||||
- **Zero Trust**: Проверка каждого запроса
|
||||
- **Least Privilege**: Минимальные необходимые права
|
||||
- **Defense in Depth**: Многоуровневая защита
|
||||
- **Secure by Default**: Безопасные настройки по умолчанию
|
||||
|
||||
### Security Layers
|
||||
1. **Network Level**: Firewall, isolated networks
|
||||
2. **Transport Level**: TLS encryption, HSTS
|
||||
3. **Application Level**: Authentication, authorization
|
||||
4. **Data Level**: Encrypted storage, secure secrets
|
||||
|
||||
### Access Control
|
||||
- **Public Access**: webhook.aepif.ru (API with token)
|
||||
- **Bypass Authelia**: git.aepif.ru, auth.aepif.ru
|
||||
- **Protected by Authelia**: notes.aepif.ru
|
||||
- **Admin Only**: traefik.aepif.ru (должен быть защищен в production)
|
||||
|
||||
## Monitoring и Observability
|
||||
|
||||
### Available Metrics
|
||||
- **Traefik Dashboard**: Request metrics, response times, error rates
|
||||
- **Container Logs**: Application logs через `docker logs`
|
||||
- **Health Checks**: Automatic service health monitoring
|
||||
- **SSL Certificate Status**: Expiration monitoring
|
||||
|
||||
### Monitoring Endpoints
|
||||
```bash
|
||||
# Health checks
|
||||
curl -I https://notes.aepif.ru/health
|
||||
curl -I https://git.aepif.ru/
|
||||
curl -I https://auth.aepif.ru/api/health
|
||||
|
||||
# Traefik metrics
|
||||
curl https://traefik.aepif.ru/api/rawdata
|
||||
```
|
||||
|
||||
## Disaster Recovery
|
||||
|
||||
### Backup Strategy
|
||||
1. **Configuration Files**: All docker-compose.yml and config files
|
||||
2. **SSL Certificates**: Traefik ACME data
|
||||
3. **User Data**: Authelia user database and config
|
||||
4. **Git Repositories**: Git Service data and PostgreSQL
|
||||
5. **Application Data**: Second Mind built content
|
||||
|
||||
### Recovery Procedures
|
||||
1. **Infrastructure**: Redeploy Traefik and Authelia
|
||||
2. **Certificates**: Restore ACME data or let auto-renewal
|
||||
3. **Services**: Redeploy application services
|
||||
4. **Data**: Restore databases and repositories
|
||||
5. **Testing**: Validate all services are functional
|
||||
|
||||
## Развертывание (High Level)
|
||||
|
||||
### Порядок развертывания
|
||||
1. **[[Мой сервер/Traefik Reverse Proxy/Развертывание|Traefik Deployment]]** - Базовая инфраструктура
|
||||
2. **[[Мой сервер/Authelia Authentication/Развертывание|Authelia Deployment]]** - Система аутентификации
|
||||
3. **[[Мой сервер/Git Service/Развертывание|Git Service Deployment]]** - Git сервер
|
||||
4. **[[Мой сервер/Second Mind Setup/Развертывание|Second Mind Deployment]]** - Система публикации
|
||||
|
||||
### Prerequisites
|
||||
- Docker и Docker Compose
|
||||
- Доступ к серверу с публичным IP
|
||||
- Настроенные DNS записи для всех поддоменов
|
||||
- Открытые порты 80, 443, 2222
|
||||
|
||||
## Масштабирование
|
||||
|
||||
### Horizontal Scaling
|
||||
- **Load Balancing**: Traefik поддерживает несколько backend instances
|
||||
- **Database Scaling**: PostgreSQL можно масштабировать с репликами
|
||||
- **Static Content**: CDN для Second Mind статического контента
|
||||
|
||||
### Performance Optimization
|
||||
- **Caching**: Nginx кеширование статического контента
|
||||
- **Compression**: Gzip compression в Traefik/Nginx
|
||||
- **Connection Pooling**: Оптимизированные подключения к БД
|
||||
|
||||
## Связанные документы
|
||||
|
||||
### Компоненты инфраструктуры
|
||||
- **[[Traefik Reverse Proxy/Обзор системы]]** - Reverse proxy и SSL
|
||||
- **[[Authelia Authentication/Обзор системы]]** - Аутентификация и авторизация
|
||||
|
||||
### Прикладные сервисы
|
||||
- **[[Second Mind Setup/Обзор системы]]** - Система публикации заметок
|
||||
- **[[Git Service/Обзор системы]]** - Git сервер и репозитории
|
||||
|
||||
### Развертывание и администрирование
|
||||
- **[[Traefik Reverse Proxy/Администрирование]]** - Управление трафиком
|
||||
- **[[Authelia Authentication/Администрирование]]** - Управление пользователями
|
||||
@@ -0,0 +1,553 @@
|
||||
# Оптимизация VPS с Hugo
|
||||
|
||||
## 1. Концепция
|
||||
|
||||
### 1.1 Общая идея
|
||||
Создание единого приложения на Go, которое объединяет webhook сервер и Hugo генератор статического сайта. Приложение обрабатывает Git webhook и автоматически пересобирает сайт при изменениях в репозитории, заменяя ресурсоемкий Quartz на эффективный Hugo.
|
||||
|
||||
### 1.2 Преимущества единого приложения
|
||||
- **Простота развертывания**: Один контейнер вместо нескольких
|
||||
- **Эффективность ресурсов**: Меньше накладных расходов
|
||||
- **Простота мониторинга**: Единая точка наблюдения
|
||||
- **Атомарность операций**: Все операции в одном процессе
|
||||
- **Простота отладки**: Единый лог и контекст
|
||||
|
||||
### 1.3 Недостатки единого приложения
|
||||
- **Менее гибкое масштабирование**: Сложность горизонтального масштабирования
|
||||
- **Сложность при росте функциональности**: Монолитная архитектура
|
||||
- **Единая точка отказа**: Все компоненты в одном процессе
|
||||
- **Сложность обновлений**: Необходимость пересборки всего приложения
|
||||
|
||||
## 2. Архитектура
|
||||
|
||||
### 2.1 Компонентная диаграмма
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[Git Webhook] --> B[HTTP Server]
|
||||
B --> C[Webhook Handler]
|
||||
C --> D[Git Manager]
|
||||
D --> E[Hugo Builder]
|
||||
E --> F[Shared Volume]
|
||||
F --> G[Nginx]
|
||||
|
||||
subgraph "Единое приложение"
|
||||
B
|
||||
C
|
||||
D
|
||||
E
|
||||
end
|
||||
|
||||
subgraph "Внешние сервисы"
|
||||
A
|
||||
F
|
||||
G
|
||||
end
|
||||
```
|
||||
|
||||
### 2.2 Структура приложения
|
||||
|
||||
**Основные модули:**
|
||||
- **HTTP Server**: Обработка входящих запросов
|
||||
- **Webhook Handler**: Валидация и обработка webhook
|
||||
- **Git Manager**: Клонирование и обновление репозитория
|
||||
- **Hugo Builder**: Сборка статического сайта
|
||||
- **File Manager**: Управление файловой системой
|
||||
|
||||
## 3. Флоу обработки
|
||||
|
||||
### 3.1 Основной флоу
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[Получение webhook] --> B[Валидация подписи]
|
||||
B --> C[Проверка ветки]
|
||||
C --> D[Обновление репозитория]
|
||||
D --> E[Проверка изменений]
|
||||
E --> F[Сборка Hugo]
|
||||
F --> G[Автоматическое обновление статики]
|
||||
G --> H[Отправка уведомления]
|
||||
|
||||
subgraph "Обработка ошибок"
|
||||
I[Retry логика]
|
||||
J[Fallback механизмы]
|
||||
K[Логирование ошибок]
|
||||
end
|
||||
|
||||
E --> I
|
||||
F --> J
|
||||
G --> K
|
||||
```
|
||||
|
||||
### 3.2 Детальный флоу
|
||||
|
||||
**Этап 1: Получение и валидация**
|
||||
- Получение webhook от Git (GitHub, GitLab, Gitea)
|
||||
- Валидация подписи webhook
|
||||
- Проверка типа события (push, merge)
|
||||
- Проверка целевой ветки
|
||||
|
||||
**Этап 2: Работа с репозиторием**
|
||||
- Клонирование репозитория (если первый раз)
|
||||
- Pull последних изменений
|
||||
- Проверка наличия изменений в контенте
|
||||
- Очистка временных файлов
|
||||
|
||||
**Этап 3: Сборка сайта**
|
||||
- Проверка конфигурации Hugo
|
||||
- Запуск Hugo сборки
|
||||
- Обработка ошибок сборки
|
||||
- Оптимизация статических файлов
|
||||
|
||||
**Этап 4: Развертывание**
|
||||
- Автоматическое обновление файлов в общем volume
|
||||
- Проверка целостности файлов
|
||||
- Nginx автоматически раздает обновленный контент
|
||||
|
||||
**Этап 5: Завершение**
|
||||
- Логирование результата
|
||||
- Обновление метрик
|
||||
|
||||
## 4. Сохранение структуры каталогов
|
||||
|
||||
### 4.1 Принцип "не трогать структуру"
|
||||
|
||||
**Ключевое правило:** Структура каталогов в Git остается неизменной, Hugo адаптируется под неё.
|
||||
|
||||
**Преимущества:**
|
||||
- Сохранение удобной навигации в Obsidian
|
||||
- Отсутствие необходимости переименовывать файлы
|
||||
- Сохранение существующих ссылок
|
||||
- Простота миграции
|
||||
|
||||
### 4.2 Адаптация Hugo под существующую структуру
|
||||
|
||||
**Текущая структура (остается неизменной):**
|
||||
```
|
||||
Second Mind/
|
||||
├── index.md
|
||||
├── Идеи/
|
||||
│ ├── Obsidian телеграм бот/
|
||||
│ │ ├── MVP Telegram бота для Obsidian.md
|
||||
│ │ └── Telegram бот для Obsidian.md
|
||||
│ └── Оптимизация ресурсов VPS/
|
||||
│ ├── Единое приложение Hugo + Webhook.md
|
||||
│ └── Миграция контента на Hugo.md
|
||||
├── Мой сервер/
|
||||
│ ├── Authelia Authentication/
|
||||
│ ├── Git Service/
|
||||
│ ├── Second Mind Setup/
|
||||
│ └── Traefik Reverse Proxy/
|
||||
└── Документация сервера aepif.ru.md
|
||||
```
|
||||
|
||||
**Hugo конфигурация для работы с существующей структурой:**
|
||||
- Настройки для работы с существующей структурой
|
||||
- Поддержка Obsidian-специфичных элементов
|
||||
- Сохранение кириллических имен
|
||||
|
||||
### 4.3 Обработка имен файлов и каталогов
|
||||
|
||||
**Стратегия Hugo:**
|
||||
- Использование оригинальных имен файлов и каталогов
|
||||
- Автоматическое создание slug из имен файлов
|
||||
- Сохранение кириллических имен
|
||||
- Обработка пробелов и специальных символов
|
||||
|
||||
**URL структура:**
|
||||
- `/идеи/obsidian-телеграм-бот/mvp-telegram-бота-для-obsidian/`
|
||||
- `/мой-сервер/authelia-authentication/`
|
||||
- Сохранение читаемости URL
|
||||
|
||||
## 5. Граф записей (Graph View)
|
||||
|
||||
### 5.1 Аналоги Obsidian/Quartz графа
|
||||
|
||||
**Доступные решения для Hugo:**
|
||||
|
||||
**Встроенные возможности Hugo:**
|
||||
- Автоматическое создание графа связей между страницами
|
||||
- Визуализация внутренних ссылок
|
||||
- Отображение связанных страниц
|
||||
- Интерактивная карта знаний
|
||||
|
||||
**Сторонние библиотеки:**
|
||||
- D3.js для интерактивной визуализации
|
||||
- Vis.js для сетевых графов
|
||||
- Cytoscape.js для сложных графов
|
||||
- Sigma.js для больших сетей
|
||||
|
||||
### 5.2 Функциональность графа
|
||||
|
||||
**Визуализация связей:**
|
||||
- Отображение всех внутренних ссылок между страницами
|
||||
- Размер узлов в зависимости от количества связей
|
||||
- Цветовая кодировка по категориям/тегам
|
||||
- Интерактивная навигация по графу
|
||||
|
||||
**Интерактивность:**
|
||||
- Клик по узлу для перехода к странице
|
||||
- Зум и панорамирование графа
|
||||
- Фильтрация по тегам или категориям
|
||||
- Поиск по названиям страниц
|
||||
|
||||
**Аналитика:**
|
||||
- Центральные страницы (много связей)
|
||||
- Изолированные страницы (мало связей)
|
||||
- Кластеры связанных тем
|
||||
- Пути между страницами
|
||||
|
||||
### 5.3 Интеграция с существующей структурой
|
||||
|
||||
**Автоматическое создание графа:**
|
||||
- Анализ всех Markdown файлов
|
||||
- Извлечение внутренних ссылок
|
||||
- Создание JSON данных для графа
|
||||
- Генерация интерактивной визуализации
|
||||
|
||||
**Сохранение Obsidian-стиля:**
|
||||
- Похожий интерфейс на Obsidian Graph View
|
||||
- Те же принципы навигации
|
||||
- Совместимость с существующими ссылками
|
||||
- Поддержка кириллических названий
|
||||
|
||||
## 6. Миграция контента
|
||||
|
||||
### 6.1 Основные изменения при миграции
|
||||
|
||||
**Frontmatter преобразования:**
|
||||
- Сохранение существующих полей
|
||||
- Добавление Hugo-специфичных полей (title, date, draft)
|
||||
- Автоматическое извлечение заголовка из имени файла
|
||||
- Преобразование дат в стандартный формат
|
||||
|
||||
**Внутренние ссылки:**
|
||||
- `[[wiki links]]` → `{{< ref "path" >}}`
|
||||
- Сохранение относительных путей
|
||||
- Обработка Obsidian-специфичных ссылок
|
||||
- Автоматическое обновление ссылок при изменении структуры
|
||||
|
||||
**Изображения и вложения:**
|
||||
- Сохранение в той же структуре каталогов
|
||||
- Обновление путей в контенте
|
||||
- Оптимизация размера файлов без изменения структуры
|
||||
|
||||
### 6.2 Автоматизация миграции
|
||||
|
||||
**Скрипт миграции:**
|
||||
- Анализ существующей структуры
|
||||
- Автоматическое создание Hugo конфигурации
|
||||
- Преобразование frontmatter
|
||||
- Обновление внутренних ссылок
|
||||
- Сохранение структуры каталогов
|
||||
|
||||
## 7. Docker развертывание
|
||||
|
||||
### 7.1 Архитектура контейнеров
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[Git Repository] --> B[Hugo + Webhook Container]
|
||||
B --> C[Shared Volume]
|
||||
C --> D[Nginx Container]
|
||||
D --> E[Internet]
|
||||
|
||||
subgraph "Docker Host"
|
||||
B
|
||||
C
|
||||
D
|
||||
end
|
||||
```
|
||||
|
||||
### 7.2 Структура Docker
|
||||
|
||||
**Docker Compose:**
|
||||
- Hugo + Webhook контейнер с прямым монтированием существующей структуры
|
||||
- Nginx контейнер для раздачи статики
|
||||
- Общий volume для статических файлов
|
||||
- Автоматическое обновление контента без перезагрузки
|
||||
|
||||
### 7.3 Преимущества общего volume
|
||||
|
||||
**Для пользователя:**
|
||||
- Знакомая навигация в Obsidian
|
||||
- Отсутствие необходимости переучиваться
|
||||
- Сохранение всех существующих ссылок
|
||||
- Простота поиска файлов
|
||||
|
||||
**Для системы:**
|
||||
- Минимальные изменения в Git репозитории
|
||||
- Простота отката к предыдущей версии
|
||||
- Сохранение истории изменений
|
||||
- Совместимость с существующими инструментами
|
||||
- Автоматическое обновление без перезагрузки сервисов
|
||||
|
||||
## 8. Интеграция с Obsidian
|
||||
|
||||
### 8.1 Рабочий флоу
|
||||
|
||||
**Разработка (без изменений):**
|
||||
1. Редактирование в Obsidian
|
||||
2. Коммит в Git репозиторий
|
||||
3. Webhook автоматически запускает сборку
|
||||
4. Hugo генерирует новый сайт
|
||||
5. Nginx автоматически раздает обновленный контент
|
||||
|
||||
**Синхронизация:**
|
||||
- Obsidian Vault → Git Repository (без изменений)
|
||||
- Git Repository → Hugo Content (прямое использование)
|
||||
- Hugo Content → Static Site (с сохранением структуры)
|
||||
- Static Site → Nginx (через общий volume)
|
||||
|
||||
### 8.2 Автоматизация
|
||||
|
||||
**Git Hooks (без изменений):**
|
||||
- Автоматический коммит при изменениях в Obsidian
|
||||
- Push в удаленный репозиторий
|
||||
- Webhook уведомление
|
||||
|
||||
**Webhook обработка:**
|
||||
- Валидация изменений
|
||||
- Клонирование/обновление репозитория
|
||||
- Сборка Hugo с сохранением структуры
|
||||
- Автоматическое обновление в общем volume
|
||||
|
||||
## 9. Конфигурация
|
||||
|
||||
### 9.1 Основные параметры
|
||||
|
||||
**Git настройки:**
|
||||
- URL репозитория
|
||||
- Ветка для отслеживания
|
||||
- SSH ключи или токены
|
||||
- Webhook секрет
|
||||
|
||||
**Hugo настройки:**
|
||||
- Путь к исходникам
|
||||
- Путь для сборки (общий volume)
|
||||
- Конфигурационный файл
|
||||
- Параметры оптимизации
|
||||
|
||||
**Системные настройки:**
|
||||
- Пути для статических файлов
|
||||
- Настройки логирования
|
||||
- Общий volume для Hugo и Nginx
|
||||
|
||||
### 9.2 Переменные окружения
|
||||
|
||||
**Обязательные:**
|
||||
- GIT_REPOSITORY_URL
|
||||
- GIT_WEBHOOK_SECRET
|
||||
- HUGO_SOURCE_PATH
|
||||
- HUGO_OUTPUT_PATH
|
||||
- SHARED_VOLUME_PATH
|
||||
|
||||
**Опциональные:**
|
||||
- LOG_LEVEL
|
||||
- METRICS_PORT
|
||||
|
||||
### 9.3 Оптимизации для VPS
|
||||
|
||||
**Производительность:**
|
||||
- Минификация всех ресурсов
|
||||
- Оптимизация изображений
|
||||
- Gzip сжатие
|
||||
- Кэширование статических файлов
|
||||
|
||||
**Ресурсы:**
|
||||
- Ограничение использования памяти
|
||||
- Оптимизация времени сборки
|
||||
- Эффективное использование диска
|
||||
|
||||
## 10. Сравнение Hugo vs Quartz
|
||||
|
||||
### 10.1 Преимущества Hugo перед Quartz
|
||||
|
||||
**Производительность:**
|
||||
- **Время сборки**: Hugo в 5-10 раз быстрее
|
||||
- **Потребление памяти**: Снижение на 70-80%
|
||||
- **CPU нагрузка**: Минимальная нагрузка
|
||||
- **Время загрузки**: Улучшение на 40-60%
|
||||
|
||||
**Технические:**
|
||||
- **Язык**: Go vs Node.js (более эффективный)
|
||||
- **Зависимости**: Минимальные vs множество npm пакетов
|
||||
- **Размер**: Один бинарник vs множество файлов
|
||||
- **Сборка**: Компиляция vs интерпретация
|
||||
|
||||
**Операционные:**
|
||||
- **Развертывание**: Простое Docker развертывание
|
||||
- **Мониторинг**: Встроенные метрики
|
||||
- **Безопасность**: Меньше уязвимостей
|
||||
- **Стабильность**: Более предсказуемое поведение
|
||||
|
||||
### 10.2 Недостатки Hugo перед Quartz
|
||||
|
||||
**Функциональность:**
|
||||
- **Готовые компоненты**: Меньше готовых решений
|
||||
- **Экосистема**: Меньше плагинов и тем
|
||||
- **Гибкость**: Менее гибкая настройка
|
||||
- **Сообщество**: Меньше готовых решений для Obsidian
|
||||
|
||||
**Разработка:**
|
||||
- **Кривая обучения**: Сложнее для новичков
|
||||
- **Документация**: Меньше примеров для Obsidian
|
||||
- **Отладка**: Сложнее отладка шаблонов
|
||||
- **Кастомизация**: Требует больше знаний
|
||||
|
||||
**Интеграция:**
|
||||
- **Obsidian специфика**: Меньше готовых решений
|
||||
- **Wiki ссылки**: Требует дополнительной обработки
|
||||
- **Frontmatter**: Другой формат
|
||||
- **Плагины**: Ограниченная совместимость
|
||||
|
||||
## 11. Обработка ошибок
|
||||
|
||||
### 11.1 Типы ошибок
|
||||
|
||||
**Git ошибки:**
|
||||
- Недоступность репозитория
|
||||
- Конфликты при merge
|
||||
- Проблемы с аутентификацией
|
||||
- Отсутствие изменений
|
||||
|
||||
**Hugo ошибки:**
|
||||
- Ошибки в конфигурации
|
||||
- Проблемы с шаблонами
|
||||
- Ошибки в Markdown файлах
|
||||
- Недостаток ресурсов
|
||||
|
||||
**Системные ошибки:**
|
||||
- Проблемы с файловой системой
|
||||
- Проблемы с общим volume
|
||||
- Проблемы с сетью
|
||||
- Недостаток места на диске
|
||||
|
||||
### 11.2 Стратегии восстановления
|
||||
|
||||
**Retry логика:**
|
||||
- Автоматические повторные попытки
|
||||
- Экспоненциальная задержка
|
||||
- Максимальное количество попыток
|
||||
- Graceful degradation
|
||||
|
||||
**Fallback механизмы:**
|
||||
- Использование последней успешной сборки
|
||||
- Откат к предыдущей версии
|
||||
- Уведомления администратора
|
||||
- Логирование для анализа
|
||||
|
||||
## 12. Мониторинг и метрики
|
||||
|
||||
### 12.1 Ключевые метрики
|
||||
|
||||
**Производительность:**
|
||||
- Время обработки webhook
|
||||
- Время сборки Hugo
|
||||
- Размер генерируемых файлов
|
||||
- Частота обновлений
|
||||
|
||||
**Надежность:**
|
||||
- Количество успешных сборок
|
||||
- Количество ошибок по типам
|
||||
- Время восстановления
|
||||
- Доступность сервиса
|
||||
|
||||
**Ресурсы:**
|
||||
- Использование CPU
|
||||
- Использование памяти
|
||||
- Использование диска
|
||||
- Сетевой трафик
|
||||
|
||||
### 12.2 Алерты
|
||||
|
||||
**Критические:**
|
||||
- Сборка не завершилась в течение 5 минут
|
||||
- Ошибки webhook валидации
|
||||
- Проблемы с файловой системой
|
||||
- Недоступность сайта
|
||||
|
||||
**Предупреждения:**
|
||||
- Высокое время сборки
|
||||
- Большой размер файлов
|
||||
- Частые ошибки
|
||||
- Низкое место на диске
|
||||
|
||||
## 13. Безопасность
|
||||
|
||||
### 13.1 Webhook безопасность
|
||||
- Валидация подписи webhook
|
||||
- Проверка IP адресов
|
||||
- Rate limiting
|
||||
- Логирование подозрительной активности
|
||||
|
||||
### 13.2 Системная безопасность
|
||||
- Запуск от непривилегированного пользователя
|
||||
- Ограничение доступа к файлам
|
||||
- Шифрование чувствительных данных
|
||||
- Регулярные обновления
|
||||
|
||||
### 13.3 Git безопасность
|
||||
- Использование SSH ключей
|
||||
- Проверка подписи коммитов
|
||||
- Ограничение доступа к репозиторию
|
||||
- Мониторинг изменений
|
||||
|
||||
## 14. Развертывание
|
||||
|
||||
### 14.1 Docker контейнер
|
||||
- Многоэтапная сборка
|
||||
- Минимальный образ на Alpine
|
||||
- Включение Hugo и Git
|
||||
- Оптимизация размера
|
||||
|
||||
### 14.2 Конфигурация
|
||||
- Environment variables
|
||||
- Конфигурационные файлы
|
||||
- Volume mounts для данных
|
||||
- Health checks
|
||||
|
||||
### 14.3 Orchestration
|
||||
- Docker Compose для разработки
|
||||
- Kubernetes для production
|
||||
- Автоматическое масштабирование
|
||||
- Rolling updates
|
||||
|
||||
## 15. Преимущества миграции
|
||||
|
||||
### 15.1 Производительность
|
||||
- **Время сборки**: С 30-60 секунд до 5-10 секунд
|
||||
- **Потребление памяти**: С 512MB до 128MB
|
||||
- **CPU нагрузка**: Снижение на 70-80%
|
||||
- **Время загрузки**: Улучшение на 40-60%
|
||||
|
||||
### 15.2 Операционные
|
||||
- **Простота развертывания**: Docker Compose
|
||||
- **Изоляция**: Контейнеры
|
||||
- **Автоматическое обновление**: Без перезагрузки сервисов
|
||||
- **Масштабируемость**: Легкое горизонтальное масштабирование
|
||||
- **Мониторинг**: Встроенные метрики
|
||||
|
||||
### 15.3 Интеграция
|
||||
- **Сохранение рабочего флоу**: Obsidian → Git → Hugo
|
||||
- **Сохранение структуры**: Без изменений в организации файлов
|
||||
- **Граф записей**: Интерактивная визуализация связей
|
||||
- **Автоматизация**: Webhook → Сборка → Деплой
|
||||
- **Консистентность**: Один источник истины
|
||||
- **Простота отладки**: Единый лог и контекст
|
||||
|
||||
## 16. Применимость
|
||||
|
||||
### 16.1 Идеальные сценарии
|
||||
- Один пользователь или небольшая команда
|
||||
- VPS с ограниченными ресурсами
|
||||
- Простота развертывания важнее сложной функциональности
|
||||
- Быстрая итерация и отладка
|
||||
- Готовность к дополнительной настройке
|
||||
|
||||
### 16.2 Неподходящие сценарии
|
||||
- Большие команды разработчиков
|
||||
- Критически важные production системы
|
||||
- Сложные требования к кастомизации
|
||||
- Необходимость готовых решений "из коробки"
|
||||
- Ограниченное время на настройку
|
||||
@@ -0,0 +1,35 @@
|
||||
# Authelia Authentication - Администрирование
|
||||
|
||||
## Ежедневное администрирование Authelia
|
||||
|
||||
*Документация будет дополнена процедурами администрирования*
|
||||
|
||||
## Управление пользователями
|
||||
*Добавление, изменение, удаление пользователей*
|
||||
|
||||
## Управление группами и правами
|
||||
*Настройка access control правил*
|
||||
|
||||
## Мониторинг аутентификации
|
||||
*Анализ логов входа и безопасности*
|
||||
|
||||
## Password reset процедуры
|
||||
*Сброс паролей пользователей*
|
||||
|
||||
## Управление TOTP
|
||||
*Настройка и сброс двухфакторной аутентификации*
|
||||
|
||||
## Мониторинг Redis
|
||||
*Контроль хранилища сессий*
|
||||
|
||||
## Troubleshooting
|
||||
*Решение проблем с аутентификацией*
|
||||
|
||||
## Backup пользователей
|
||||
*Резервное копирование базы пользователей*
|
||||
|
||||
## Обновления Authelia
|
||||
*Процедуры обновления сервиса*
|
||||
|
||||
---
|
||||
*Эта страница находится в разработке*
|
||||
@@ -0,0 +1,407 @@
|
||||
# Authelia Authentication - Конфигурации
|
||||
|
||||
← **[[Обзор системы|← Назад к обзору]]**
|
||||
|
||||
## Docker Compose конфигурация
|
||||
|
||||
### Основной файл: `/DOCKER/auth/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
|
||||
- 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
|
||||
```
|
||||
|
||||
## Основной файл configuration.yml
|
||||
|
||||
### Полная конфигурация: `/DOCKER/auth/authelia/configuration.yml`
|
||||
|
||||
```yaml
|
||||
---
|
||||
theme: auto
|
||||
jwt_secret: 4odTQ0TqW2Ej8m8Cm3K6Wn3VTvg09Mb2Yi4CUzuIPUsHB3fpF54+NbIAqo6+CREA
|
||||
default_redirection_url: https://notes.aepif.ru
|
||||
|
||||
server:
|
||||
host: 0.0.0.0
|
||||
port: 9091
|
||||
|
||||
log:
|
||||
level: info
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
### Разбор конфигурации по разделам
|
||||
|
||||
#### Server Configuration
|
||||
```yaml
|
||||
server:
|
||||
host: 0.0.0.0 # Слушать на всех интерфейсах
|
||||
port: 9091 # Внутренний порт контейнера
|
||||
```
|
||||
|
||||
#### JWT и безопасность
|
||||
```yaml
|
||||
jwt_secret: 4odTQ0TqW2Ej8m8Cm3K6Wn3VTvg09Mb2Yi4CUzuIPUsHB3fpF54+NbIAqo6+CREA
|
||||
default_redirection_url: https://notes.aepif.ru
|
||||
theme: auto # Автоматическая тема (dark/light)
|
||||
```
|
||||
|
||||
#### Logging
|
||||
```yaml
|
||||
log:
|
||||
level: info # Уровни: trace, debug, info, warn, error
|
||||
```
|
||||
|
||||
## User Database Configuration
|
||||
|
||||
### Файл пользователей: `/DOCKER/auth/authelia/users_database.yml`
|
||||
|
||||
```yaml
|
||||
users:
|
||||
admin:
|
||||
displayname: "Administrator"
|
||||
password: "$argon2id$v=19$m=65536,t=3,p=4$..." # Argon2id hash
|
||||
email: epifantsev1aa@gmail.com
|
||||
groups:
|
||||
- admins
|
||||
- users
|
||||
```
|
||||
|
||||
### Генерация паролей
|
||||
```bash
|
||||
# Использование authelia для генерации хеша пароля
|
||||
docker run --rm authelia/authelia:latest authelia crypto hash generate argon2 --password 'your_password'
|
||||
|
||||
# Результат вставляется в users_database.yml
|
||||
```
|
||||
|
||||
### Структура пользователей
|
||||
- **displayname**: Отображаемое имя пользователя
|
||||
- **password**: Argon2id хеш пароля
|
||||
- **email**: Email для уведомлений и 2FA
|
||||
- **groups**: Массив групп для контроля доступа
|
||||
|
||||
## Access Control Rules
|
||||
|
||||
### Политики доступа
|
||||
```yaml
|
||||
access_control:
|
||||
default_policy: deny # По умолчанию запрещено
|
||||
rules:
|
||||
- domain: notes.aepif.ru
|
||||
policy: one_factor # Требует логин + пароль
|
||||
- domain: git.aepif.ru
|
||||
policy: bypass # Без проверки Authelia
|
||||
- domain: webhook.aepif.ru
|
||||
policy: bypass # API сервис
|
||||
- domain: auth.aepif.ru
|
||||
policy: bypass # Сама страница входа
|
||||
```
|
||||
|
||||
### Типы политик
|
||||
- **deny**: Полный запрет доступа
|
||||
- **bypass**: Доступ без аутентификации через Authelia
|
||||
- **one_factor**: Только логин + пароль
|
||||
- **two_factor**: Логин + пароль + TOTP
|
||||
|
||||
### Расширенные правила доступа
|
||||
```yaml
|
||||
# Пример дополнительных правил
|
||||
access_control:
|
||||
rules:
|
||||
# Ограничение по группам
|
||||
- domain: admin.aepif.ru
|
||||
policy: two_factor
|
||||
subject: "group:admins"
|
||||
|
||||
# Ограничение по пользователям
|
||||
- domain: private.aepif.ru
|
||||
policy: one_factor
|
||||
subject: "user:admin"
|
||||
|
||||
# Ограничение по IP/сети
|
||||
- domain: internal.aepif.ru
|
||||
policy: one_factor
|
||||
networks:
|
||||
- "192.168.1.0/24"
|
||||
|
||||
# Ограничение по методам HTTP
|
||||
- domain: api.aepif.ru
|
||||
policy: one_factor
|
||||
methods:
|
||||
- "GET"
|
||||
- "POST"
|
||||
```
|
||||
|
||||
## Session Configuration
|
||||
|
||||
### Настройки сессий
|
||||
```yaml
|
||||
session:
|
||||
name: authelia_session # Имя cookie
|
||||
domain: aepif.ru # Домен для cookie (все поддомены)
|
||||
secret: 91Zc/PM0EogwZbsX0tsDGLpr4Wg7zwtQUzcp5tYP5dNdRNTlpkXBfJr9EivuD+A4
|
||||
expiration: 1h # Время жизни сессии
|
||||
inactivity: 5m # Время неактивности до выхода
|
||||
|
||||
redis:
|
||||
host: redis # Хост Redis контейнера
|
||||
port: 6379 # Порт Redis
|
||||
password: Ll8qlQ3rgBFo4Syq # Пароль Redis
|
||||
```
|
||||
|
||||
### Дополнительные настройки сессий
|
||||
```yaml
|
||||
session:
|
||||
# Дополнительные опции безопасности
|
||||
same_site: lax # Политика SameSite cookie
|
||||
secure: true # Только HTTPS (автоматически в production)
|
||||
remember_me_duration: 1M # Время "запомнить меня"
|
||||
```
|
||||
|
||||
## TOTP Configuration
|
||||
|
||||
### Двухфакторная аутентификация
|
||||
```yaml
|
||||
totp:
|
||||
issuer: aepif.ru # Отображается в приложении аутентификации
|
||||
algorithm: sha1 # sha1, sha256, sha512
|
||||
digits: 6 # Количество цифр в коде
|
||||
period: 30 # Период действия кода в секундах
|
||||
skew: 1 # Допуск на рассинхронизацию времени
|
||||
```
|
||||
|
||||
### Поддерживаемые приложения
|
||||
- Google Authenticator
|
||||
- Authy
|
||||
- Microsoft Authenticator
|
||||
- 1Password
|
||||
- Bitwarden
|
||||
|
||||
## Redis Configuration
|
||||
|
||||
### Настройки Redis контейнера
|
||||
```yaml
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
command: redis-server --requirepass Ll8qlQ3rgBFo4Syq
|
||||
volumes:
|
||||
- redis_data:/data # Персистентное хранение
|
||||
```
|
||||
|
||||
### Дополнительные настройки Redis
|
||||
```yaml
|
||||
# В configuration.yml для дополнительных опций Redis
|
||||
session:
|
||||
redis:
|
||||
host: redis
|
||||
port: 6379
|
||||
password: Ll8qlQ3rgBFo4Syq
|
||||
database_index: 0 # Номер базы данных
|
||||
maximum_active_connections: 8
|
||||
minimum_idle_connections: 0
|
||||
```
|
||||
|
||||
## Regulation (Rate Limiting)
|
||||
|
||||
### Защита от брутфорса
|
||||
```yaml
|
||||
regulation:
|
||||
max_retries: 3 # Максимум попыток входа
|
||||
find_time: 2m # Временное окно для подсчета попыток
|
||||
ban_time: 5m # Время блокировки после превышения лимита
|
||||
```
|
||||
|
||||
### Расширенная конфигурация
|
||||
```yaml
|
||||
regulation:
|
||||
max_retries: 3
|
||||
find_time: 2m
|
||||
ban_time: 5m
|
||||
|
||||
# Дополнительные настройки
|
||||
bantime_multiplier: 2 # Увеличение времени блокировки при повторных нарушениях
|
||||
cleanup_interval: 1h # Интервал очистки старых записей
|
||||
```
|
||||
|
||||
## Storage Configuration
|
||||
|
||||
### Локальное хранилище
|
||||
```yaml
|
||||
storage:
|
||||
encryption_key: sWLemnH0QNsYsYvbav59mQOWxLOeUvSl
|
||||
local:
|
||||
path: /config/db.sqlite3
|
||||
```
|
||||
|
||||
### База данных содержит
|
||||
- TOTP секреты пользователей
|
||||
- U2F/WebAuthn данные
|
||||
- Статистика авторизации
|
||||
- Конфигурация двухфакторной аутентификации
|
||||
|
||||
## Notifier Configuration
|
||||
|
||||
### Файловые уведомления
|
||||
```yaml
|
||||
notifier:
|
||||
filesystem:
|
||||
filename: /config/notification.txt
|
||||
```
|
||||
|
||||
### SMTP уведомления (альтернатива)
|
||||
```yaml
|
||||
notifier:
|
||||
smtp:
|
||||
username: your_email@gmail.com
|
||||
password: your_app_password
|
||||
host: smtp.gmail.com
|
||||
port: 587
|
||||
sender: your_email@gmail.com
|
||||
startup_check_address: your_email@gmail.com
|
||||
disable_require_tls: false
|
||||
disable_html_emails: false
|
||||
|
||||
subject: "[Authelia] {title}"
|
||||
templates_path: /config/templates
|
||||
```
|
||||
|
||||
## Traefik Integration Labels
|
||||
|
||||
### Forward Auth Middleware
|
||||
```yaml
|
||||
labels:
|
||||
# Основная конфигурация 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
|
||||
```
|
||||
|
||||
### Применение к сервисам
|
||||
```yaml
|
||||
# Для защищенного сервиса
|
||||
labels:
|
||||
- traefik.http.routers.protected-service.middlewares=authelia@docker
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### Переменные окружения
|
||||
```yaml
|
||||
environment:
|
||||
- TZ=Europe/Moscow # Часовой пояс
|
||||
- AUTHELIA_JWT_SECRET_FILE=/run/secrets/jwt_secret # Секреты через файлы
|
||||
- AUTHELIA_SESSION_SECRET_FILE=/run/secrets/session_secret
|
||||
```
|
||||
|
||||
## Безопасность конфигурации
|
||||
|
||||
### Генерация секретов
|
||||
```bash
|
||||
# Генерация случайных секретов
|
||||
openssl rand -base64 64 # Для JWT и session secrets
|
||||
openssl rand -hex 32 # Для encryption key
|
||||
```
|
||||
|
||||
### Рекомендации по безопасности
|
||||
1. **Используйте сильные пароли**: Все секреты должны быть случайными
|
||||
2. **Ротация секретов**: Регулярно обновляйте JWT и session секреты
|
||||
3. **Ограничьте доступ к файлам**: Конфигурационные файлы должны быть доступны только контейнеру
|
||||
4. **Мониторинг попыток входа**: Настройте алерты на подозрительную активность
|
||||
|
||||
### Защита конфигурационных файлов
|
||||
```bash
|
||||
# Правильные права доступа
|
||||
chmod 600 /DOCKER/auth/authelia/configuration.yml
|
||||
chmod 600 /DOCKER/auth/authelia/users_database.yml
|
||||
chown root:root /DOCKER/auth/authelia/*.yml
|
||||
```
|
||||
|
||||
## Связанные файлы
|
||||
|
||||
- **[[Развертывание]]** - инструкции по установке и настройке
|
||||
- **[[Администрирование]]** - управление пользователями и мониторинг
|
||||
- **[[../Traefik Reverse Proxy/Конфигурации]]** - интеграция с reverse proxy
|
||||
@@ -0,0 +1,314 @@
|
||||
## Описание
|
||||
|
||||
Authelia Authentication - централизованная система аутентификации и авторизации для всех сервисов экосистемы aepif.ru. Обеспечивает Single Sign-On (SSO), двухфакторную аутентификацию и гранулярное управление доступом.
|
||||
|
||||
## Архитектура системы
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[User Request] --> B[Traefik Reverse Proxy]
|
||||
B --> C{Authelia Middleware}
|
||||
C -->|Authenticated| D[Target Service]
|
||||
C -->|Not Authenticated| E[Authelia Login Page]
|
||||
|
||||
E --> F[User Authentication]
|
||||
F --> G[Session Storage - Redis]
|
||||
F --> H[User Database - File]
|
||||
|
||||
G --> I[Session Validation]
|
||||
I --> D
|
||||
|
||||
subgraph "Authelia Container"
|
||||
E
|
||||
F
|
||||
I
|
||||
J[TOTP 2FA]
|
||||
K[Password Reset]
|
||||
end
|
||||
|
||||
subgraph "Redis Container"
|
||||
G
|
||||
L[Session Data]
|
||||
end
|
||||
|
||||
subgraph "Configuration"
|
||||
H
|
||||
M[Access Control Rules]
|
||||
N[Notification Settings]
|
||||
end
|
||||
```
|
||||
|
||||
## Основные компоненты
|
||||
|
||||
### Authelia Server
|
||||
- **Назначение**: Центральный сервер аутентификации
|
||||
- **Домен**: `auth.aepif.ru`
|
||||
- **Порт**: 9091
|
||||
- **Технология**: Go-based authentication server
|
||||
- **Особенности**:
|
||||
- Forward Authentication integration с Traefik
|
||||
- TOTP двухфакторная аутентификация
|
||||
- Password reset через файловые уведомления
|
||||
- Детальные политики доступа
|
||||
|
||||
### Redis Session Store
|
||||
- **Назначение**: Хранение пользовательских сессий
|
||||
- **Технология**: Redis 7 Alpine
|
||||
- **Контейнер**: `auth_redis`
|
||||
- **Особенности**:
|
||||
- Персистентное хранение сессий
|
||||
- Защита паролем (`Ll8qlQ3rgBFo4Syq`)
|
||||
- Быстрый доступ к данным сессий
|
||||
- Автоматическое истечение сессий
|
||||
|
||||
### File-based User Database
|
||||
- **Назначение**: Хранение пользователей и их данных
|
||||
- **Файл**: `/config/users_database.yml`
|
||||
- **Особенности**:
|
||||
- Argon2id хеширование паролей
|
||||
- Группы пользователей для управления доступом
|
||||
- Email адреса для уведомлений
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### Docker Compose
|
||||
Основная конфигурация в `/DOCKER/auth/docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
container_name: auth_redis
|
||||
command: redis-server --requirepass Ll8qlQ3rgBFo4Syq
|
||||
|
||||
authelia:
|
||||
image: authelia/authelia:latest
|
||||
container_name: authelia
|
||||
depends_on:
|
||||
- redis
|
||||
volumes:
|
||||
- ./authelia:/config
|
||||
networks:
|
||||
- proxy # Подключение к Traefik
|
||||
```
|
||||
|
||||
### Основная конфигурация
|
||||
Файл `/DOCKER/auth/authelia/configuration.yml`:
|
||||
|
||||
```yaml
|
||||
jwt_secret: 4odTQ0TqW2Ej8m8Cm3K6Wn3VTvg09Mb2Yi4CUzuIPUsHB3fpF54+NbIAqo6+CREA
|
||||
default_redirection_url: https://notes.aepif.ru
|
||||
|
||||
server:
|
||||
host: 0.0.0.0
|
||||
port: 9091
|
||||
|
||||
totp:
|
||||
issuer: aepif.ru
|
||||
|
||||
session:
|
||||
domain: aepif.ru
|
||||
expiration: 1h
|
||||
inactivity: 5m
|
||||
redis:
|
||||
host: redis
|
||||
port: 6379
|
||||
password: Ll8qlQ3rgBFo4Syq
|
||||
```
|
||||
|
||||
## Политики доступа
|
||||
|
||||
### Access Control Rules
|
||||
Текущие правила доступа:
|
||||
|
||||
```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**: Полный запрет доступа
|
||||
|
||||
## Пользователи и группы
|
||||
|
||||
### Структура пользователей
|
||||
Файл `users_database.yml`:
|
||||
|
||||
```yaml
|
||||
users:
|
||||
admin:
|
||||
displayname: "Administrator"
|
||||
password: "$argon2id$..." # Хешированный пароль Argon2id
|
||||
email: epifantsev1aa@gmail.com
|
||||
groups:
|
||||
- admins # Администраторская группа
|
||||
- users # Базовая группа пользователей
|
||||
```
|
||||
|
||||
### Управление паролями
|
||||
- **Хеширование**: Argon2id (высокий уровень безопасности)
|
||||
- **Reset процедура**: Через файловые уведомления
|
||||
- **Требования**: Минимальная длина, сложность
|
||||
|
||||
## Двухфакторная аутентификация
|
||||
|
||||
### TOTP Configuration
|
||||
- **Issuer**: `aepif.ru`
|
||||
- **QR Code**: Автоматическая генерация для настройки
|
||||
- **Backup Codes**: Коды восстановления доступа
|
||||
- **Приложения**: Google Authenticator, Authy, 1Password
|
||||
|
||||
### Настройка TOTP
|
||||
1. Первый вход с логином/паролем
|
||||
2. Сканирование QR кода мобильным приложением
|
||||
3. Подтверждение TOTP кода
|
||||
4. Сохранение backup кодов
|
||||
|
||||
## Интеграция с Traefik
|
||||
|
||||
### Forward Auth Middleware
|
||||
Traefik labels для защищенных сервисов:
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
- 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
|
||||
```
|
||||
|
||||
### Headers передача
|
||||
Authelia передает в backend сервисы:
|
||||
- **Remote-User**: Username аутентифицированного пользователя
|
||||
- **Remote-Groups**: Группы пользователя
|
||||
- **Remote-Name**: Display name
|
||||
- **Remote-Email**: Email адрес
|
||||
|
||||
## Сессии и безопасность
|
||||
|
||||
### Session Management
|
||||
- **Время жизни**: 1 час активной сессии
|
||||
- **Неактивность**: 5 минут до автоматического выхода
|
||||
- **Хранение**: Redis с паролем
|
||||
- **Domain**: `.aepif.ru` (работает для всех поддоменов)
|
||||
|
||||
### Regulation (Rate Limiting)
|
||||
Защита от брутфорса:
|
||||
|
||||
```yaml
|
||||
regulation:
|
||||
max_retries: 3 # Максимум попыток входа
|
||||
find_time: 2m # Период для подсчета попыток
|
||||
ban_time: 5m # Время блокировки
|
||||
```
|
||||
|
||||
### Безопасность
|
||||
- **JWT Secret**: Секретный ключ для подписи токенов
|
||||
- **Session Secret**: Ключ для шифрования сессий
|
||||
- **Encryption Key**: Ключ для шифрования хранилища
|
||||
- **Secure Headers**: Автоматические заголовки безопасности
|
||||
|
||||
## Уведомления
|
||||
|
||||
### File Notifier
|
||||
- **Файл**: `/config/notification.txt`
|
||||
- **Назначение**: Password reset уведомления
|
||||
- **Формат**: Простой текстовый файл
|
||||
|
||||
### Email Integration (Future)
|
||||
Для полноценных email уведомлений потребуется настройка SMTP:
|
||||
- Password reset emails
|
||||
- 2FA setup notifications
|
||||
- Security alerts
|
||||
|
||||
## Мониторинг
|
||||
|
||||
### Health Checks
|
||||
```bash
|
||||
# Проверка доступности Authelia
|
||||
curl -I https://auth.aepif.ru
|
||||
|
||||
# Проверка API здоровья
|
||||
curl https://auth.aepif.ru/api/health
|
||||
|
||||
# Логи Authelia
|
||||
docker logs authelia -f
|
||||
|
||||
# Проверка Redis
|
||||
docker exec auth_redis redis-cli -a Ll8qlQ3rgBFo4Syq ping
|
||||
```
|
||||
|
||||
### Metrics
|
||||
- **Authentication attempts**: Успешные/неуспешные попытки входа
|
||||
- **Session statistics**: Активные сессии, время жизни
|
||||
- **2FA usage**: Статистика использования TOTP
|
||||
- **Access denials**: Заблокированные запросы
|
||||
|
||||
## Структура файлов
|
||||
|
||||
```
|
||||
/DOCKER/auth/
|
||||
├── docker-compose.yml # Конфигурация Authelia + Redis
|
||||
├── authelia/ # Конфигурация Authelia
|
||||
│ ├── configuration.yml # Основная конфигурация
|
||||
│ ├── users_database.yml # База пользователей
|
||||
│ ├── db.sqlite3 # SQLite база данных (для хранения состояния)
|
||||
│ └── notification.txt # Файл уведомлений
|
||||
└── volumes/
|
||||
└── redis_data/ # Данные Redis
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Общие проблемы
|
||||
1. **Не работает аутентификация**: Проверить сеть `proxy`, статус контейнеров
|
||||
2. **Сессии не сохраняются**: Проверить подключение к Redis
|
||||
3. **TOTP не работает**: Синхронизировать время на сервере и устройстве
|
||||
4. **Password reset**: Проверить файл уведомлений
|
||||
|
||||
### Логи отладки
|
||||
```yaml
|
||||
# В configuration.yml для детальных логов
|
||||
log:
|
||||
level: debug
|
||||
```
|
||||
|
||||
## Backup и восстановление
|
||||
|
||||
### Критически важные данные
|
||||
- **configuration.yml**: Основная конфигурация
|
||||
- **users_database.yml**: База пользователей
|
||||
- **db.sqlite3**: Состояние системы (2FA secrets, etc.)
|
||||
- **redis_data**: Активные сессии
|
||||
|
||||
### Процедура backup
|
||||
```bash
|
||||
# Backup конфигурации Authelia
|
||||
tar czf authelia_config_backup.tar.gz -C /DOCKER/auth/authelia .
|
||||
|
||||
# Backup Redis данных
|
||||
docker exec auth_redis redis-cli -a Ll8qlQ3rgBFo4Syq BGSAVE
|
||||
```
|
||||
|
||||
## Связанные сервисы
|
||||
|
||||
- **[[Мой сервер/Traefik Reverse Proxy/Обзор системы|Traefik]]** - интеграция через Forward Auth middleware
|
||||
- **[[Мой сервер/Second Mind Setup/Обзор системы|Second Mind]]** - защита доступа к заметкам
|
||||
- **Redis** - хранение сессий и состояния
|
||||
|
||||
## Связанные документы
|
||||
|
||||
- **[[Authelia Authentication - Конфигурации]]** - детальные настройки всех компонентов
|
||||
- **[[Authelia Authentication - Развертывание]]** - пошаговая установка
|
||||
- **[[Authelia Authentication - Администрирование]]** - управление пользователями и мониторинг
|
||||
@@ -0,0 +1,32 @@
|
||||
# Authelia Authentication - Развертывание
|
||||
|
||||
## Пошаговая установка Authelia
|
||||
|
||||
*Документация будет дополнена инструкциями по развертыванию*
|
||||
|
||||
## Предварительные требования
|
||||
*Системные требования, Traefik, сеть proxy*
|
||||
|
||||
## Подготовка конфигурации
|
||||
*Создание файлов configuration.yml и users_database.yml*
|
||||
|
||||
## Генерация секретов
|
||||
*Создание JWT и session секретов*
|
||||
|
||||
## Создание пользователей
|
||||
*Настройка первичных пользователей*
|
||||
|
||||
## Развертывание контейнеров
|
||||
*Запуск Authelia и Redis*
|
||||
|
||||
## Интеграция с Traefik
|
||||
*Настройка Forward Auth middleware*
|
||||
|
||||
## Тестирование аутентификации
|
||||
*Проверка работы системы*
|
||||
|
||||
## Настройка TOTP
|
||||
*Конфигурация двухфакторной аутентификации*
|
||||
|
||||
---
|
||||
*Эта страница находится в разработке*
|
||||
60
⚙️ Техническое/🖥️ Серверы/Git Service/Администрирование.md
Normal file
60
⚙️ Техническое/🖥️ Серверы/Git Service/Администрирование.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# Git Service - Администрирование
|
||||
|
||||
## Ежедневное администрирование
|
||||
|
||||
Этот документ содержит информацию по управлению и обслуживанию Git Service.
|
||||
|
||||
## Управление пользователями
|
||||
|
||||
### Создание пользователей
|
||||
*Процедуры добавления новых пользователей*
|
||||
|
||||
### Управление правами доступа
|
||||
*Настройка прав и ролей*
|
||||
|
||||
### Сброс паролей
|
||||
*Процедуры восстановления доступа*
|
||||
|
||||
## Управление репозиториями
|
||||
|
||||
### Создание репозиториев
|
||||
*Настройка новых репозиториев*
|
||||
|
||||
### Backup репозиториев
|
||||
*Процедуры резервного копирования*
|
||||
|
||||
### Миграция репозиториев
|
||||
*Перенос репозиториев*
|
||||
|
||||
## Мониторинг
|
||||
|
||||
### Проверка состояния сервиса
|
||||
*Health checks и мониторинг*
|
||||
|
||||
### Анализ логов
|
||||
*Работа с логами Gitea и PostgreSQL*
|
||||
|
||||
### Метрики производительности
|
||||
*Мониторинг ресурсов*
|
||||
|
||||
## Обслуживание
|
||||
|
||||
### Обновления
|
||||
*Процедуры обновления Gitea*
|
||||
|
||||
### Backup и восстановление
|
||||
*Полное резервное копирование*
|
||||
|
||||
### Troubleshooting
|
||||
*Решение типовых проблем*
|
||||
|
||||
## Интеграции
|
||||
|
||||
### Настройка Webhooks
|
||||
*Конфигурация уведомлений*
|
||||
|
||||
### Интеграция с CI/CD
|
||||
*Подключение систем автоматизации*
|
||||
|
||||
---
|
||||
*Эта страница находится в разработке*
|
||||
409
⚙️ Техническое/🖥️ Серверы/Git Service/Конфигурации.md
Normal file
409
⚙️ Техническое/🖥️ Серверы/Git Service/Конфигурации.md
Normal file
@@ -0,0 +1,409 @@
|
||||
# Git Service - Конфигурации
|
||||
|
||||
← **[[Обзор системы|← Назад к обзору]]**
|
||||
|
||||
## Docker Compose конфигурация
|
||||
|
||||
### Основной файл: `/DOCKER/git/docker-compose.yml`
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
gitea:
|
||||
image: gitea/gitea:latest
|
||||
container_name: gitea
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
- GITEA__database__DB_TYPE=postgres
|
||||
- GITEA__database__HOST=db:5432
|
||||
- GITEA__database__NAME=gitea
|
||||
- GITEA__database__USER=gitea
|
||||
- GITEA__database__PASSWORD=sG7hZXBQDAtRab9A
|
||||
- GITEA__server__SSH_DOMAIN=git.aepif.ru
|
||||
- GITEA__server__SSH_PORT=2222
|
||||
volumes:
|
||||
- gitea_data:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
depends_on:
|
||||
- db
|
||||
networks:
|
||||
- default
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
# HTTP routing
|
||||
- traefik.http.routers.gitea.rule=Host(`git.aepif.ru`)
|
||||
- traefik.http.routers.gitea.tls.certresolver=letsencrypt
|
||||
- traefik.http.services.gitea.loadbalancer.server.port=3000
|
||||
# TCP routing for SSH
|
||||
- traefik.tcp.routers.gitea-ssh.rule=HostSNI(`*`)
|
||||
- traefik.tcp.routers.gitea-ssh.entrypoints=ssh
|
||||
- traefik.tcp.services.gitea-ssh.loadbalancer.server.port=22
|
||||
restart: unless-stopped
|
||||
|
||||
db:
|
||||
image: postgres:14
|
||||
container_name: gitea_db
|
||||
environment:
|
||||
- POSTGRES_USER=gitea
|
||||
- POSTGRES_PASSWORD=sG7hZXBQDAtRab9A
|
||||
- POSTGRES_DB=gitea
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
networks:
|
||||
- default
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
gitea_data:
|
||||
external: true
|
||||
name: gitea_gitea_data
|
||||
postgres_data:
|
||||
external: true
|
||||
name: gitea_postgres_data
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
||||
default:
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
## Gitea конфигурация
|
||||
|
||||
### Environment Variables
|
||||
```yaml
|
||||
environment:
|
||||
# User Configuration
|
||||
- USER_UID=1000 # UID пользователя в контейнере
|
||||
- USER_GID=1000 # GID пользователя в контейнере
|
||||
|
||||
# Database Configuration
|
||||
- GITEA__database__DB_TYPE=postgres
|
||||
- GITEA__database__HOST=db:5432
|
||||
- GITEA__database__NAME=gitea
|
||||
- GITEA__database__USER=gitea
|
||||
- GITEA__database__PASSWORD=sG7hZXBQDAtRab9A
|
||||
|
||||
# Server Configuration
|
||||
- GITEA__server__SSH_DOMAIN=git.aepif.ru
|
||||
- GITEA__server__SSH_PORT=2222
|
||||
```
|
||||
|
||||
### Расширенные настройки через переменные окружения
|
||||
```yaml
|
||||
environment:
|
||||
# Server Settings
|
||||
- GITEA__server__DOMAIN=git.aepif.ru
|
||||
- GITEA__server__ROOT_URL=https://git.aepif.ru
|
||||
- GITEA__server__DISABLE_SSH=false
|
||||
- GITEA__server__START_SSH_SERVER=true
|
||||
- GITEA__server__SSH_PORT=22 # Внутренний SSH порт
|
||||
- GITEA__server__SSH_LISTEN_PORT=22 # Порт прослушивания в контейнере
|
||||
|
||||
# Security Settings
|
||||
- GITEA__security__INSTALL_LOCK=true
|
||||
- GITEA__security__SECRET_KEY=your_secret_key_here
|
||||
|
||||
# Service Settings
|
||||
- GITEA__service__DISABLE_REGISTRATION=true
|
||||
- GITEA__service__REQUIRE_SIGNIN_VIEW=false
|
||||
- GITEA__service__ENABLE_NOTIFY_MAIL=false
|
||||
|
||||
# Repository Settings
|
||||
- GITEA__repository__DEFAULT_BRANCH=main
|
||||
- GITEA__repository__ENABLE_PUSH_CREATE_USER=true
|
||||
- GITEA__repository__ENABLE_PUSH_CREATE_ORG=false
|
||||
|
||||
# Webhook Settings
|
||||
- GITEA__webhook__ALLOWED_HOST_LIST=*
|
||||
- GITEA__webhook__SKIP_TLS_VERIFY=false
|
||||
```
|
||||
|
||||
### Структура конфигурации app.ini
|
||||
Gitea также поддерживает конфигурацию через файл `app.ini`:
|
||||
|
||||
```ini
|
||||
# /data/gitea/conf/app.ini внутри контейнера
|
||||
[database]
|
||||
DB_TYPE = postgres
|
||||
HOST = db:5432
|
||||
NAME = gitea
|
||||
USER = gitea
|
||||
PASSWD = sG7hZXBQDAtRab9A
|
||||
SSL_MODE = disable
|
||||
|
||||
[server]
|
||||
DOMAIN = git.aepif.ru
|
||||
HTTP_PORT = 3000
|
||||
ROOT_URL = https://git.aepif.ru/
|
||||
DISABLE_SSH = false
|
||||
SSH_DOMAIN = git.aepif.ru
|
||||
SSH_PORT = 2222
|
||||
START_SSH_SERVER = true
|
||||
SSH_LISTEN_PORT = 22
|
||||
|
||||
[security]
|
||||
INSTALL_LOCK = true
|
||||
SECRET_KEY = your_secret_key_here
|
||||
|
||||
[service]
|
||||
DISABLE_REGISTRATION = true
|
||||
REQUIRE_SIGNIN_VIEW = false
|
||||
ENABLE_NOTIFY_MAIL = false
|
||||
DEFAULT_KEEP_EMAIL_PRIVATE = true
|
||||
|
||||
[mailer]
|
||||
ENABLED = false
|
||||
|
||||
[repository]
|
||||
DEFAULT_BRANCH = main
|
||||
ENABLE_PUSH_CREATE_USER = true
|
||||
ENABLE_PUSH_CREATE_ORG = false
|
||||
|
||||
[webhook]
|
||||
ALLOWED_HOST_LIST = *
|
||||
SKIP_TLS_VERIFY = false
|
||||
```
|
||||
|
||||
## PostgreSQL конфигурация
|
||||
|
||||
### Database Container Settings
|
||||
```yaml
|
||||
db:
|
||||
image: postgres:14
|
||||
container_name: gitea_db
|
||||
environment:
|
||||
- POSTGRES_USER=gitea # Пользователь БД
|
||||
- POSTGRES_PASSWORD=sG7hZXBQDAtRab9A # Пароль БД
|
||||
- POSTGRES_DB=gitea # Имя базы данных
|
||||
```
|
||||
|
||||
### Дополнительные настройки PostgreSQL
|
||||
```yaml
|
||||
environment:
|
||||
# Performance Settings
|
||||
- POSTGRES_SHARED_PRELOAD_LIBRARIES=pg_stat_statements
|
||||
- POSTGRES_MAX_CONNECTIONS=200
|
||||
- POSTGRES_SHARED_BUFFERS=256MB
|
||||
- POSTGRES_EFFECTIVE_CACHE_SIZE=1GB
|
||||
- POSTGRES_WORK_MEM=4MB
|
||||
|
||||
# Logging Settings
|
||||
- POSTGRES_LOG_STATEMENT=all
|
||||
- POSTGRES_LOG_MIN_DURATION_STATEMENT=1000
|
||||
|
||||
# Backup Settings
|
||||
- POSTGRES_WAL_LEVEL=replica
|
||||
- POSTGRES_ARCHIVE_MODE=on
|
||||
```
|
||||
|
||||
### PostgreSQL Volume Configuration
|
||||
```yaml
|
||||
volumes:
|
||||
postgres_data:
|
||||
external: true
|
||||
name: gitea_postgres_data # External volume для персистентности
|
||||
```
|
||||
|
||||
## Traefik Integration Labels
|
||||
|
||||
### HTTP Routing
|
||||
```yaml
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.gitea.rule=Host(`git.aepif.ru`)
|
||||
- traefik.http.routers.gitea.tls.certresolver=letsencrypt
|
||||
- traefik.http.services.gitea.loadbalancer.server.port=3000
|
||||
```
|
||||
|
||||
### TCP Routing для SSH
|
||||
```yaml
|
||||
labels:
|
||||
# SSH TCP routing
|
||||
- traefik.tcp.routers.gitea-ssh.rule=HostSNI(`*`)
|
||||
- traefik.tcp.routers.gitea-ssh.entrypoints=ssh
|
||||
- traefik.tcp.services.gitea-ssh.loadbalancer.server.port=22
|
||||
```
|
||||
|
||||
### Объяснение SSH routing
|
||||
- **HostSNI(`*`)**: Принимает любые TCP соединения на SSH entrypoint
|
||||
- **entrypoints=ssh**: Использует SSH entrypoint (порт 2222) в Traefik
|
||||
- **port=22**: Перенаправляет на порт 22 внутри Gitea контейнера
|
||||
|
||||
## Networking Configuration
|
||||
|
||||
### Networks
|
||||
```yaml
|
||||
networks:
|
||||
proxy:
|
||||
external: true # Подключение к Traefik
|
||||
default:
|
||||
driver: bridge # Внутренняя сеть для Gitea + PostgreSQL
|
||||
```
|
||||
|
||||
### Network Architecture
|
||||
- **proxy network**: Для HTTP/HTTPS трафика через Traefik
|
||||
- **default network**: Для внутренней связи Gitea ↔ PostgreSQL
|
||||
- **SSH traffic**: Напрямую через TCP routing Traefik
|
||||
|
||||
## Volume Configuration
|
||||
|
||||
### Gitea Data Volume
|
||||
```yaml
|
||||
gitea_data:
|
||||
external: true
|
||||
name: gitea_gitea_data
|
||||
```
|
||||
|
||||
**Содержимое Gitea volume:**
|
||||
- **repositories/**: Git репозитории
|
||||
- **conf/**: Конфигурационные файлы (app.ini)
|
||||
- **log/**: Логи Gitea
|
||||
- **data/**: Загруженные файлы, аватары
|
||||
- **ssh/**: SSH ключи сервера
|
||||
|
||||
### PostgreSQL Data Volume
|
||||
```yaml
|
||||
postgres_data:
|
||||
external: true
|
||||
name: gitea_postgres_data
|
||||
```
|
||||
|
||||
**Содержимое PostgreSQL volume:**
|
||||
- **base/**: Файлы базы данных
|
||||
- **global/**: Глобальные настройки кластера
|
||||
- **pg_wal/**: Write-Ahead Log файлы
|
||||
- **pg_tblspc/**: Tablespace ссылки
|
||||
|
||||
### Создание external volumes
|
||||
```bash
|
||||
# Создание volumes перед запуском
|
||||
docker volume create gitea_gitea_data
|
||||
docker volume create gitea_postgres_data
|
||||
|
||||
# Проверка созданных volumes
|
||||
docker volume ls | grep gitea
|
||||
```
|
||||
|
||||
## Time Synchronization
|
||||
|
||||
### Timezone Configuration
|
||||
```yaml
|
||||
volumes:
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
```
|
||||
|
||||
Это обеспечивает синхронизацию времени контейнера с хост-системой, что важно для:
|
||||
- Корректных timestamp в Git commits
|
||||
- Правильного отображения времени в веб-интерфейсе
|
||||
- Синхронизации с логами других сервисов
|
||||
|
||||
## Security Configuration
|
||||
|
||||
### User Permissions
|
||||
```yaml
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
```
|
||||
|
||||
- Gitea запускается под пользователем с UID/GID 1000
|
||||
- Соответствует обычному пользователю в Linux системах
|
||||
- Обеспечивает правильные права доступа к файлам
|
||||
|
||||
### Database Security
|
||||
- **Пароль БД**: Случайно сгенерированный пароль `sG7hZXBQDAtRab9A`
|
||||
- **Изоляция сети**: PostgreSQL доступна только из внутренней сети
|
||||
- **SSL отключен**: Для внутренней связи в Docker сети
|
||||
|
||||
### SSH Security
|
||||
- **Отдельный порт**: SSH на нестандартном порту 2222
|
||||
- **TCP routing**: Прямое подключение через Traefik
|
||||
- **Key management**: SSH ключи управляются через веб-интерфейс
|
||||
|
||||
## Performance Tuning
|
||||
|
||||
### Gitea Performance Settings
|
||||
```yaml
|
||||
environment:
|
||||
# Repository settings
|
||||
- GITEA__repository__DEFAULT_REPO_UNITS=repo.code,repo.releases,repo.issues,repo.pulls,repo.wiki
|
||||
- GITEA__repository__DEFAULT_PRIVATE=private
|
||||
|
||||
# Git settings
|
||||
- GITEA__git__MAX_GIT_DIFF_LINES=10000
|
||||
- GITEA__git__MAX_GIT_DIFF_LINE_CHARACTERS=5000
|
||||
- GITEA__git__MAX_GIT_DIFF_FILES=100
|
||||
|
||||
# Session settings
|
||||
- GITEA__session__PROVIDER=memory
|
||||
- GITEA__session__PROVIDER_CONFIG=data/sessions
|
||||
```
|
||||
|
||||
### PostgreSQL Performance
|
||||
```yaml
|
||||
environment:
|
||||
# Connection settings
|
||||
- POSTGRES_MAX_CONNECTIONS=200
|
||||
- POSTGRES_SHARED_BUFFERS=256MB
|
||||
- POSTGRES_EFFECTIVE_CACHE_SIZE=1GB
|
||||
- POSTGRES_RANDOM_PAGE_COST=1.1
|
||||
- POSTGRES_WORK_MEM=4MB
|
||||
```
|
||||
|
||||
## Backup Configuration
|
||||
|
||||
### Automated Backups
|
||||
```yaml
|
||||
# Дополнительный контейнер для backup (опционально)
|
||||
backup:
|
||||
image: prodrigestivill/postgres-backup-local
|
||||
environment:
|
||||
- POSTGRES_HOST=db
|
||||
- POSTGRES_DB=gitea
|
||||
- POSTGRES_USER=gitea
|
||||
- POSTGRES_PASSWORD=sG7hZXBQDAtRab9A
|
||||
- BACKUP_KEEP_DAYS=7
|
||||
- BACKUP_KEEP_WEEKS=4
|
||||
- BACKUP_KEEP_MONTHS=6
|
||||
volumes:
|
||||
- ./backups:/backups
|
||||
depends_on:
|
||||
- db
|
||||
```
|
||||
|
||||
### Backup Strategy
|
||||
1. **Database Backup**: Автоматический dump PostgreSQL
|
||||
2. **Repository Backup**: Резервное копирование Git репозиториев
|
||||
3. **Configuration Backup**: Сохранение настроек и конфигурации
|
||||
|
||||
## Monitoring и Logging
|
||||
|
||||
### Log Configuration
|
||||
```yaml
|
||||
environment:
|
||||
- GITEA__log__MODE=file
|
||||
- GITEA__log__LEVEL=Info
|
||||
- GITEA__log__ROOT_PATH=/data/gitea/log
|
||||
```
|
||||
|
||||
### Health Checks
|
||||
```yaml
|
||||
# Дополнительные health checks
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000/api/healthz"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
```
|
||||
|
||||
## Связанные файлы
|
||||
|
||||
- **[[Развертывание]]** - пошаговая установка и настройка
|
||||
- **[[Администрирование]]** - управление пользователями и репозиториями
|
||||
- **[[../Traefik Reverse Proxy/Конфигурации]]** - настройки интеграции с reverse proxy
|
||||
204
⚙️ Техническое/🖥️ Серверы/Git Service/Обзор системы.md
Normal file
204
⚙️ Техническое/🖥️ Серверы/Git Service/Обзор системы.md
Normal file
@@ -0,0 +1,204 @@
|
||||
## Описание
|
||||
|
||||
Git Service - отдельный сервис на базе Gitea, обеспечивающий централизованное хранение кода и заметок. Работает независимо от других сервисов и предоставляет Git-интерфейс для всех проектов в экосистеме aepif.ru.
|
||||
|
||||
## Архитектура системы
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[Users] --> B[Traefik Proxy]
|
||||
B --> C[Gitea Web Interface]
|
||||
C --> D[Git Repositories]
|
||||
C --> E[PostgreSQL Database]
|
||||
F[SSH Clients] --> G[Gitea SSH:2222]
|
||||
G --> D
|
||||
|
||||
subgraph "Git Service Container"
|
||||
C
|
||||
D
|
||||
end
|
||||
|
||||
subgraph "Database Container"
|
||||
E
|
||||
end
|
||||
|
||||
H[Webhook Consumers] --> C
|
||||
C --> I[Webhook Notifications]
|
||||
```
|
||||
|
||||
## Основные компоненты
|
||||
|
||||
### Gitea Server
|
||||
- **Назначение**: Web-интерфейс для управления Git-репозиториями
|
||||
- **Домен**: `git.aepif.ru`
|
||||
- **Технология**: Gitea (Go-based Git service)
|
||||
- **Особенности**:
|
||||
- Web-интерфейс для просмотра кода
|
||||
- Issue tracking
|
||||
- Pull/Merge requests
|
||||
- Webhook notifications
|
||||
- User management
|
||||
|
||||
### PostgreSQL Database
|
||||
- **Назначение**: Хранение метаданных Gitea
|
||||
- **Технология**: PostgreSQL 14
|
||||
- **Данные**:
|
||||
- Информация о пользователях
|
||||
- Метаданные репозиториев
|
||||
- Issues и комментарии
|
||||
- Настройки системы
|
||||
|
||||
### SSH Access
|
||||
- **Порт**: 2222 (внешний доступ)
|
||||
- **Назначение**: Git operations через SSH
|
||||
- **Особенности**: Отдельный порт для избежания конфликтов
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### Docker Compose
|
||||
```yaml
|
||||
services:
|
||||
gitea:
|
||||
image: gitea/gitea:latest
|
||||
environment:
|
||||
- GITEA__database__DB_TYPE=postgres
|
||||
- GITEA__database__HOST=db:5432
|
||||
- GITEA__server__SSH_DOMAIN=git.aepif.ru
|
||||
- GITEA__server__SSH_PORT=2222
|
||||
networks:
|
||||
- proxy # Подключение к Traefik
|
||||
- default
|
||||
```
|
||||
|
||||
### Traefik Labels
|
||||
- **HTTP routing**: `git.aepif.ru` → port 3000
|
||||
- **TCP routing**: SSH на порту 2222
|
||||
- **SSL**: Автоматические сертификаты
|
||||
|
||||
## Репозитории
|
||||
|
||||
### Активные репозитории
|
||||
- **second-mind-aep**: Заметки для Second Mind
|
||||
- **configs**: Конфигурационные файлы сервера
|
||||
- **scripts**: Вспомогательные скрипты
|
||||
|
||||
### Структура URL
|
||||
- **HTTP Clone**: `https://git.aepif.ru/username/repo.git`
|
||||
- **SSH Clone**: `git@git.aepif.ru:username/repo.git`
|
||||
- **Internal URL**: `http://gitea:3000/username/repo.git`
|
||||
|
||||
## Интеграции
|
||||
|
||||
### Webhook Integration
|
||||
- **Second Mind**: автоматическая пересборка при push
|
||||
- **CI/CD**: потенциальная интеграция с системами автоматизации
|
||||
- **Notifications**: уведомления в внешние системы
|
||||
|
||||
### Authentication
|
||||
- **Bypass Authelia**: Собственная система аутентификации Gitea
|
||||
- **Local Users**: Управление пользователями внутри Gitea
|
||||
- **SSH Keys**: Управление SSH ключами для каждого пользователя
|
||||
|
||||
## Домены и доступ
|
||||
|
||||
| Протокол | Endpoint | Описание | Порт |
|
||||
|----------|----------|----------|------|
|
||||
| HTTPS | `git.aepif.ru` | Web-интерфейс Gitea | 443 |
|
||||
| SSH | `git.aepif.ru:2222` | Git SSH operations | 2222 |
|
||||
| HTTP | `gitea:3000` | Internal container access | 3000 |
|
||||
|
||||
## Workflow использования
|
||||
|
||||
### Веб-интерфейс
|
||||
1. **Доступ** через `git.aepif.ru`
|
||||
2. **Аутентификация** с помощью логина/пароля Gitea
|
||||
3. **Управление** репозиториями через Web UI
|
||||
4. **Настройка** webhooks для автоматизации
|
||||
|
||||
### Git Operations
|
||||
```bash
|
||||
# SSH клонирование
|
||||
git clone git@git.aepif.ru:2222/username/repo.git
|
||||
|
||||
# HTTPS клонирование
|
||||
git clone https://git.aepif.ru/username/repo.git
|
||||
|
||||
# Push изменений
|
||||
git push origin main
|
||||
```
|
||||
|
||||
## Структура файлов
|
||||
|
||||
```
|
||||
/DOCKER/git/
|
||||
├── docker-compose.yml # Конфигурация Gitea + PostgreSQL
|
||||
└── volumes/
|
||||
├── gitea_data/ # Данные Gitea (repos, config)
|
||||
└── postgres_data/ # База данных PostgreSQL
|
||||
```
|
||||
|
||||
## Безопасность
|
||||
|
||||
### Уровни защиты
|
||||
- **SSL/TLS**: Все HTTPS соединения зашифрованы
|
||||
- **SSH Keys**: Аутентификация по ключам для Git operations
|
||||
- **User Management**: Контроль доступа на уровне пользователей
|
||||
- **Repository Permissions**: Детальные права доступа к репозиториям
|
||||
|
||||
### Backup Strategy
|
||||
- **Database**: Регулярные дампы PostgreSQL
|
||||
- **Repositories**: Backup директории `gitea_data`
|
||||
- **External Mirrors**: Синхронизация с внешними Git-сервисами
|
||||
|
||||
## Мониторинг
|
||||
|
||||
### Доступные метрики
|
||||
- **Repository Usage**: Размер и активность репозиториев
|
||||
- **User Activity**: Статистика commits, pushes, pulls
|
||||
- **System Health**: Состояние базы данных и сервиса
|
||||
|
||||
### Health Checks
|
||||
```bash
|
||||
# Проверка веб-интерфейса
|
||||
curl -I https://git.aepif.ru
|
||||
|
||||
# Проверка SSH доступа
|
||||
ssh -T git@git.aepif.ru -p 2222
|
||||
|
||||
# Проверка контейнеров
|
||||
docker ps | grep gitea
|
||||
```
|
||||
|
||||
## Администрирование
|
||||
|
||||
### Создание пользователей
|
||||
1. Доступ к админ-панели Gitea
|
||||
2. User Management → Create User
|
||||
3. Настройка прав доступа
|
||||
|
||||
### Настройка репозиториев
|
||||
1. Создание репозитория через Web UI
|
||||
2. Настройка webhooks для интеграций
|
||||
3. Управление коллаборацией
|
||||
|
||||
### Обновления
|
||||
```bash
|
||||
# Обновление образа
|
||||
docker-compose pull
|
||||
docker-compose up -d
|
||||
|
||||
# Проверка версии
|
||||
docker exec gitea gitea --version
|
||||
```
|
||||
|
||||
## Связанные сервисы
|
||||
|
||||
- **[[Мой сервер/Second Mind Setup/Обзор системы|Second Mind]]** - использует Git Service для хранения заметок
|
||||
- **[[Мой сервер/Инфраструктура/Обзор системы|Traefik]]** - обеспечивает маршрутизацию и SSL
|
||||
- **Potential CI/CD** - будущие интеграции с системами автоматизации
|
||||
|
||||
## Связанные документы
|
||||
|
||||
- **[[Git Service - Конфигурации]]** - детальные настройки
|
||||
- **[[Git Service - Развертывание]]** - пошаговая установка
|
||||
- **[[Git Service - Администрирование]]** - управление и обслуживание
|
||||
46
⚙️ Техническое/🖥️ Серверы/Git Service/Развертывание.md
Normal file
46
⚙️ Техническое/🖥️ Серверы/Git Service/Развертывание.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# Git Service - Развертывание
|
||||
|
||||
## Пошаговая установка
|
||||
|
||||
Этот документ содержит инструкции по развертыванию Git Service с нуля.
|
||||
|
||||
## Предварительные требования
|
||||
|
||||
### Системные требования
|
||||
*Минимальные требования к серверу*
|
||||
|
||||
### Зависимости
|
||||
*Необходимое ПО и сервисы*
|
||||
|
||||
## Установка
|
||||
|
||||
### Шаг 1: Подготовка среды
|
||||
*Подготовка окружения для развертывания*
|
||||
|
||||
### Шаг 2: Конфигурация
|
||||
*Настройка файлов конфигурации*
|
||||
|
||||
### Шаг 3: Развертывание контейнеров
|
||||
*Запуск Docker Compose*
|
||||
|
||||
### Шаг 4: Первоначальная настройка
|
||||
*Настройка Gitea через веб-интерфейс*
|
||||
|
||||
## Интеграция с инфраструктурой
|
||||
|
||||
### Подключение к Traefik
|
||||
*Настройка reverse proxy*
|
||||
|
||||
### Настройка SSL
|
||||
*Конфигурация сертификатов*
|
||||
|
||||
## Тестирование
|
||||
|
||||
### Проверка доступности
|
||||
*Тесты работоспособности сервиса*
|
||||
|
||||
### Создание тестового репозитория
|
||||
*Валидация функциональности*
|
||||
|
||||
---
|
||||
*Эта страница находится в разработке*
|
||||
450
⚙️ Техническое/🖥️ Серверы/Second Mind Setup/Администрирование.md
Normal file
450
⚙️ Техническое/🖥️ Серверы/Second Mind Setup/Администрирование.md
Normal file
@@ -0,0 +1,450 @@
|
||||
## Мониторинг системы
|
||||
|
||||
### Проверка статуса сервисов
|
||||
|
||||
```bash
|
||||
# Статус всех контейнеров
|
||||
docker-compose ps
|
||||
|
||||
# Подробная информация о ресурсах
|
||||
docker stats second_mind_gitea second_mind_webhook second_mind_nginx second_mind_db
|
||||
|
||||
# Проверка дискового пространства
|
||||
df -h
|
||||
du -sh /DOCKER/second-mind/
|
||||
```
|
||||
|
||||
### Мониторинг логов
|
||||
|
||||
```bash
|
||||
# Все логи системы
|
||||
docker-compose logs -f
|
||||
|
||||
# Логи конкретного сервиса
|
||||
docker-compose logs -f quartz-webhook
|
||||
docker-compose logs -f gitea
|
||||
docker-compose logs -f nginx
|
||||
|
||||
# Последние 100 строк с отметками времени
|
||||
docker-compose logs --tail=100 -t quartz-webhook
|
||||
```
|
||||
|
||||
### Health checks
|
||||
|
||||
```bash
|
||||
# Проверка webhook сервиса
|
||||
curl https://webhook.aepif.ru/health
|
||||
|
||||
# Проверка Gitea
|
||||
curl -I https://git.aepif.ru
|
||||
|
||||
# Проверка статического сайта
|
||||
curl -I https://notes.aepif.ru
|
||||
|
||||
# Проверка SSH доступа к Git
|
||||
ssh -p 2222 git@git.aepif.ru
|
||||
```
|
||||
|
||||
## Обслуживание
|
||||
|
||||
### Регулярные задачи
|
||||
|
||||
#### Очистка логов Docker
|
||||
|
||||
```bash
|
||||
# Очистка логов всех контейнеров
|
||||
docker system prune -f
|
||||
|
||||
# Очистка конкретного контейнера
|
||||
docker logs second_mind_webhook 2>/dev/null | tail -1000 > temp.log
|
||||
docker cp temp.log second_mind_webhook:/tmp/
|
||||
docker exec second_mind_webhook truncate -s 0 /proc/1/fd/1
|
||||
rm temp.log
|
||||
```
|
||||
|
||||
#### Очистка старых образов
|
||||
|
||||
```bash
|
||||
# Удаление неиспользуемых образов
|
||||
docker image prune -f
|
||||
|
||||
# Удаление всех неиспользуемых ресурсов
|
||||
docker system prune -a -f
|
||||
```
|
||||
|
||||
### Перезапуск сервисов
|
||||
|
||||
```bash
|
||||
# Перезапуск всей системы (с сохранением данных)
|
||||
docker-compose restart
|
||||
|
||||
# Перезапуск конкретного сервиса
|
||||
docker-compose restart quartz-webhook
|
||||
|
||||
# Полная пересборка webhook сервиса
|
||||
docker-compose build quartz-webhook
|
||||
docker-compose up -d quartz-webhook
|
||||
|
||||
# Graceful restart с ожиданием
|
||||
docker-compose stop
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## Обновления
|
||||
|
||||
### Обновление Quartz
|
||||
|
||||
```bash
|
||||
# Вход в контейнер webhook
|
||||
docker exec -it second_mind_webhook bash
|
||||
|
||||
# Обновление Quartz репозитория
|
||||
cd /quartz
|
||||
git pull origin main
|
||||
npm install
|
||||
|
||||
# Выход из контейнера
|
||||
exit
|
||||
|
||||
# Перезапуск для применения изменений
|
||||
docker-compose restart quartz-webhook
|
||||
```
|
||||
|
||||
### Обновление образов Docker
|
||||
|
||||
```bash
|
||||
# Скачивание новых версий
|
||||
docker-compose pull
|
||||
|
||||
# Пересоздание контейнеров с новыми образами
|
||||
docker-compose up -d
|
||||
|
||||
# Принудительное пересоздание всех сервисов
|
||||
docker-compose up -d --force-recreate
|
||||
```
|
||||
|
||||
### Обновление системы
|
||||
|
||||
```bash
|
||||
# Обновление пакетов хост-системы
|
||||
apt update && apt upgrade -y
|
||||
|
||||
# Обновление Docker и Docker Compose до последних версий
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
pip3 install --upgrade docker-compose
|
||||
```
|
||||
|
||||
## Диагностика проблем
|
||||
|
||||
### Проблемы с webhook'ами
|
||||
|
||||
#### Проверка получения webhook'ов
|
||||
|
||||
```bash
|
||||
# Просмотр логов webhook сервиса в реальном времени
|
||||
docker-compose logs -f quartz-webhook
|
||||
|
||||
# Проверка последних webhook'ов в Gitea
|
||||
# Repository → Settings → Webhooks → Recent Deliveries
|
||||
```
|
||||
|
||||
#### Ручной запуск сборки
|
||||
|
||||
```bash
|
||||
# Вход в контейнер webhook
|
||||
docker exec -it second_mind_webhook bash
|
||||
|
||||
# Ручной запуск процесса сборки
|
||||
cd /webhook
|
||||
node -e "
|
||||
const { execSync } = require('child_process');
|
||||
const fs = require('fs');
|
||||
|
||||
function buildSite() {
|
||||
try {
|
||||
console.log('Manual build started...');
|
||||
execSync('cd /obsidian && git pull origin main || git pull origin master', { stdio: 'inherit' });
|
||||
execSync('cd /quartz && npm run quartz build -- -d /obsidian', { stdio: 'inherit' });
|
||||
execSync('rm -rf /public/*', { stdio: 'inherit' });
|
||||
execSync('cp -r /quartz/public/* /public/', { stdio: 'inherit' });
|
||||
console.log('Manual build completed!');
|
||||
} catch (error) {
|
||||
console.error('Build error:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
buildSite();
|
||||
"
|
||||
```
|
||||
|
||||
### Проблемы с Git
|
||||
|
||||
#### Проверка SSH подключения
|
||||
|
||||
```bash
|
||||
# Тест SSH соединения
|
||||
ssh -p 2222 -v git@git.aepif.ru
|
||||
|
||||
# Проверка SSH ключей в контейнере
|
||||
docker exec -it second_mind_webhook ls -la /root/.ssh/
|
||||
docker exec -it second_mind_webhook cat /root/.ssh/config
|
||||
```
|
||||
|
||||
#### Сброс SSH ключей
|
||||
|
||||
```bash
|
||||
# Пересоздание SSH ключей
|
||||
rm ~/.ssh/id_ed25519*
|
||||
ssh-keygen -t ed25519 -C "webhook-new" -f ~/.ssh/id_ed25519
|
||||
|
||||
# Добавление нового ключа в Gitea
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
# Копировать в Gitea → Settings → SSH Keys
|
||||
|
||||
# Перезапуск webhook контейнера
|
||||
docker-compose restart quartz-webhook
|
||||
```
|
||||
|
||||
### Проблемы с базой данных
|
||||
|
||||
#### Проверка подключения к PostgreSQL
|
||||
|
||||
```bash
|
||||
# Вход в контейнер базы данных
|
||||
docker exec -it second_mind_db psql -U gitea -d gitea
|
||||
|
||||
# Проверка размера базы
|
||||
\l+
|
||||
|
||||
# Проверка активных подключений
|
||||
SELECT * FROM pg_stat_activity;
|
||||
|
||||
# Выход
|
||||
\q
|
||||
```
|
||||
|
||||
#### Очистка базы данных (ОСТОРОЖНО!)
|
||||
|
||||
```bash
|
||||
# Полная очистка и пересоздание базы
|
||||
docker-compose stop gitea
|
||||
docker exec -it second_mind_db psql -U gitea -c "DROP DATABASE gitea;"
|
||||
docker exec -it second_mind_db psql -U gitea -c "CREATE DATABASE gitea;"
|
||||
docker-compose start gitea
|
||||
```
|
||||
|
||||
### Проблемы с Nginx
|
||||
|
||||
#### Проверка конфигурации
|
||||
|
||||
```bash
|
||||
# Тест конфигурации Nginx
|
||||
docker exec -it second_mind_nginx nginx -t
|
||||
|
||||
# Перезагрузка конфигурации без перезапуска
|
||||
docker exec -it second_mind_nginx nginx -s reload
|
||||
|
||||
# Проверка файлов статического сайта
|
||||
docker exec -it second_mind_nginx ls -la /usr/share/nginx/html/
|
||||
```
|
||||
|
||||
## Безопасность
|
||||
|
||||
### Регулярная смена паролей
|
||||
|
||||
```bash
|
||||
# Изменение паролей в .env файле
|
||||
nano .env
|
||||
|
||||
# Применение новых переменных
|
||||
docker-compose up -d --force-recreate
|
||||
```
|
||||
|
||||
### Мониторинг доступа
|
||||
|
||||
```bash
|
||||
# Просмотр логов Nginx для анализа трафика
|
||||
docker-compose logs nginx | grep -E "GET|POST"
|
||||
|
||||
# Анализ логов Gitea для подозрительной активности
|
||||
docker-compose logs gitea | grep -i "login\|failed"
|
||||
|
||||
# Проверка активных SSH сессий
|
||||
docker exec -it second_mind_gitea who
|
||||
```
|
||||
|
||||
### Обновления безопасности
|
||||
|
||||
```bash
|
||||
# Регулярное обновление образов для получения security patches
|
||||
docker-compose pull
|
||||
docker-compose up -d
|
||||
|
||||
# Проверка уязвимостей в образах
|
||||
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v $PWD/cache:/tmp/cache --name trivy aquasec/trivy \
|
||||
image second-mind_quartz-webhook
|
||||
```
|
||||
|
||||
## Backup и восстановление
|
||||
|
||||
### Создание резервных копий
|
||||
|
||||
```bash
|
||||
# Backup базы данных
|
||||
docker exec second_mind_db pg_dump -U gitea gitea > backup_db_$(date +%Y%m%d).sql
|
||||
|
||||
# Backup Git репозиториев (Gitea data)
|
||||
docker run --rm -v second-mind_gitea_data:/data -v $(pwd):/backup alpine \
|
||||
tar czf /backup/gitea_data_$(date +%Y%m%d).tar.gz -C /data .
|
||||
|
||||
# Backup конфигурационных файлов
|
||||
tar czf config_backup_$(date +%Y%m%d).tar.gz \
|
||||
docker-compose.yml Dockerfile nginx.conf .env webhook-server/
|
||||
|
||||
# Backup SSH ключей
|
||||
cp -r ~/.ssh ssh_backup_$(date +%Y%m%d)
|
||||
```
|
||||
|
||||
### Восстановление из резервных копий
|
||||
|
||||
```bash
|
||||
# Остановка сервисов
|
||||
docker-compose down
|
||||
|
||||
# Восстановление базы данных
|
||||
docker-compose up -d db
|
||||
sleep 10
|
||||
docker exec -i second_mind_db psql -U gitea gitea < backup_db_YYYYMMDD.sql
|
||||
|
||||
# Восстановление Gitea data
|
||||
docker run --rm -v second-mind_gitea_data:/data -v $(pwd):/backup alpine \
|
||||
tar xzf /backup/gitea_data_YYYYMMDD.tar.gz -C /data
|
||||
|
||||
# Запуск всех сервисов
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
## Автоматизация
|
||||
|
||||
### Cron задачи для автоматического обслуживания
|
||||
|
||||
```bash
|
||||
# Добавление в crontab
|
||||
crontab -e
|
||||
|
||||
# Ежедневный backup в 2:00
|
||||
0 2 * * * cd /DOCKER/second-mind && docker exec second_mind_db pg_dump -U gitea gitea > backup_db_$(date +\%Y\%m\%d).sql
|
||||
|
||||
# Еженедельная очистка старых логов в воскресенье в 3:00
|
||||
0 3 * * 0 docker system prune -f
|
||||
|
||||
# Ежемесячное обновление образов в первое воскресенье месяца в 4:00
|
||||
0 4 1-7 * 0 cd /DOCKER/second-mind && docker-compose pull && docker-compose up -d
|
||||
```
|
||||
|
||||
### Скрипт мониторинга
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# monitoring.sh - проверка состояния Second Mind
|
||||
|
||||
echo "=== Second Mind System Status ==="
|
||||
echo "Date: $(date)"
|
||||
echo
|
||||
|
||||
# Проверка контейнеров
|
||||
echo "Container Status:"
|
||||
docker-compose ps
|
||||
|
||||
echo
|
||||
echo "Resource Usage:"
|
||||
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" \
|
||||
second_mind_gitea second_mind_webhook second_mind_nginx second_mind_db
|
||||
|
||||
echo
|
||||
echo "Disk Usage:"
|
||||
df -h /DOCKER/second-mind
|
||||
|
||||
echo
|
||||
echo "Webhook Health:"
|
||||
curl -s https://webhook.aepif.ru/health || echo "Webhook unreachable"
|
||||
|
||||
echo
|
||||
echo "Recent Errors:"
|
||||
docker-compose logs --tail=20 | grep -i error || echo "No recent errors"
|
||||
```
|
||||
|
||||
### Настройка алертов
|
||||
|
||||
```bash
|
||||
# Простой скрипт алертов через email (требует настройки sendmail/postfix)
|
||||
#!/bin/bash
|
||||
# alerts.sh
|
||||
|
||||
WEBHOOK_STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://webhook.aepif.ru/health)
|
||||
NOTES_STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://notes.aepif.ru)
|
||||
|
||||
if [ "$WEBHOOK_STATUS" != "200" ]; then
|
||||
echo "ALERT: Webhook service is down!" | mail -s "Second Mind Alert" admin@aepif.ru
|
||||
fi
|
||||
|
||||
if [ "$NOTES_STATUS" != "200" ]; then
|
||||
echo "ALERT: Notes website is down!" | mail -s "Second Mind Alert" admin@aepif.ru
|
||||
fi
|
||||
```
|
||||
|
||||
## Performance оптимизация
|
||||
|
||||
### Настройка ресурсов контейнеров
|
||||
|
||||
```yaml
|
||||
# В docker-compose.yml добавить лимиты ресурсов
|
||||
services:
|
||||
gitea:
|
||||
# ... другие настройки
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
cpus: '0.5'
|
||||
reservations:
|
||||
memory: 256M
|
||||
cpus: '0.25'
|
||||
|
||||
quartz-webhook:
|
||||
# ... другие настройки
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 1G
|
||||
cpus: '1.0'
|
||||
reservations:
|
||||
memory: 512M
|
||||
cpus: '0.5'
|
||||
```
|
||||
|
||||
### Оптимизация Nginx
|
||||
|
||||
```nginx
|
||||
# Добавление в nginx.conf для улучшения производительности
|
||||
http {
|
||||
# ... существующие настройки
|
||||
|
||||
# Увеличение буферов
|
||||
client_body_buffer_size 128k;
|
||||
client_max_body_size 10m;
|
||||
client_header_buffer_size 1k;
|
||||
large_client_header_buffers 4 4k;
|
||||
output_buffers 1 32k;
|
||||
postpone_output 1460;
|
||||
|
||||
# Кэширование файлов
|
||||
open_file_cache max=1000 inactive=20s;
|
||||
open_file_cache_valid 30s;
|
||||
open_file_cache_min_uses 2;
|
||||
open_file_cache_errors on;
|
||||
}
|
||||
```
|
||||
|
||||
Система администрирования настроена! Для дальнейшего изучения см. [[Мой сервер/Second Mind Setup/Обзор системы]]
|
||||
301
⚙️ Техническое/🖥️ Серверы/Second Mind Setup/Конфигурации.md
Normal file
301
⚙️ Техническое/🖥️ Серверы/Second Mind Setup/Конфигурации.md
Normal file
@@ -0,0 +1,301 @@
|
||||
## Docker Compose
|
||||
|
||||
### Основной файл docker-compose.yml
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
gitea:
|
||||
image: gitea/gitea:latest
|
||||
container_name: second_mind_gitea
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
- GITEA__database__DB_TYPE=postgres
|
||||
- GITEA__database__HOST=db:5432
|
||||
- GITEA__database__NAME=gitea
|
||||
- GITEA__database__USER=gitea
|
||||
- GITEA__database__PASSWORD=sG7hZXBQDAtRab9A
|
||||
- GITEA__server__SSH_DOMAIN=git.aepif.ru
|
||||
- GITEA__server__SSH_PORT=2222
|
||||
volumes:
|
||||
- gitea_data:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
depends_on:
|
||||
- db
|
||||
networks:
|
||||
- default
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
# HTTP routing
|
||||
- traefik.http.routers.gitea.rule=Host(`git.aepif.ru`)
|
||||
- traefik.http.routers.gitea.tls.certresolver=letsencrypt
|
||||
- traefik.http.services.gitea.loadbalancer.server.port=3000
|
||||
# TCP routing for SSH
|
||||
- traefik.tcp.routers.gitea-ssh.rule=HostSNI(`*`)
|
||||
- traefik.tcp.routers.gitea-ssh.entrypoints=ssh
|
||||
- traefik.tcp.services.gitea-ssh.loadbalancer.server.port=22
|
||||
restart: unless-stopped
|
||||
|
||||
db:
|
||||
image: postgres:14
|
||||
container_name: second_mind_db
|
||||
environment:
|
||||
- POSTGRES_USER=gitea
|
||||
- POSTGRES_PASSWORD=sG7hZXBQDAtRab9A
|
||||
- POSTGRES_DB=gitea
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
networks:
|
||||
- default
|
||||
restart: unless-stopped
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
container_name: second_mind_nginx
|
||||
volumes:
|
||||
- ./quartz_build:/usr/share/nginx/html:ro
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
networks:
|
||||
- default
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.obsidian.rule=Host(`notes.aepif.ru`)
|
||||
- traefik.http.routers.obsidian.tls.certresolver=letsencrypt
|
||||
- traefik.http.routers.obsidian.middlewares=authelia@docker
|
||||
- traefik.http.services.obsidian.loadbalancer.server.port=80
|
||||
restart: unless-stopped
|
||||
|
||||
quartz-webhook:
|
||||
build: .
|
||||
container_name: second_mind_webhook
|
||||
volumes:
|
||||
- /root/.ssh:/root/.ssh
|
||||
- ./obsidian_repo:/obsidian
|
||||
- ./quartz_build:/public
|
||||
environment:
|
||||
- WEBHOOK_SECRET=MHtue5Zclp/dr69OFdwquGzCVHUGiEHP
|
||||
- GITEA_REPO_URL=http://gitea:3000/admin/second-mind-aep.git
|
||||
networks:
|
||||
- default
|
||||
- proxy
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.webhook.rule=Host(`webhook.aepif.ru`)
|
||||
- traefik.http.routers.webhook.tls.certresolver=letsencrypt
|
||||
- traefik.http.services.webhook.loadbalancer.server.port=3000
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
gitea_data:
|
||||
postgres_data:
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
||||
default:
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
## Dockerfile для webhook сервиса
|
||||
|
||||
```dockerfile
|
||||
FROM node:22
|
||||
WORKDIR /app
|
||||
|
||||
# Установка Git и SSH клиента
|
||||
RUN apt-get update && apt-get install -y git openssh-client && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Создание .ssh директории и настройка SSH
|
||||
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh
|
||||
|
||||
# Добавление SSH ключа для доступа к git.aepif.ru (будет примонтирован как volume)
|
||||
# Настройка SSH для автоматического принятия ключей хоста
|
||||
RUN echo "Host git.aepif.ru\n\tStrictHostKeyChecking no\n\tUserKnownHostsFile=/dev/null" > /root/.ssh/config
|
||||
|
||||
# Клонирование кастомного Quartz репозитория
|
||||
RUN git clone ssh://git@git.aepif.ru:2222/aep/quartz.git /quartz
|
||||
WORKDIR /quartz
|
||||
RUN npm install
|
||||
|
||||
# Копирование и настройка webhook сервиса
|
||||
COPY webhook-server/ /webhook/
|
||||
WORKDIR /webhook
|
||||
RUN npm install
|
||||
|
||||
EXPOSE 3000
|
||||
WORKDIR /webhook
|
||||
CMD ["node", "server.js"]
|
||||
```
|
||||
|
||||
## Конфигурация Nginx
|
||||
|
||||
### nginx.conf
|
||||
|
||||
```nginx
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
gzip on;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
# Основная обработка запросов
|
||||
location / {
|
||||
try_files $uri $uri/ $uri.html =404;
|
||||
}
|
||||
|
||||
# Кэширование статических файлов
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Переменные окружения
|
||||
|
||||
### .env файл
|
||||
|
||||
```bash
|
||||
# Основной домен
|
||||
DOMAIN=aepif.ru
|
||||
|
||||
# Настройки Gitea
|
||||
GITEA_ADMIN_USER=admin
|
||||
GITEA_ADMIN_PASSWORD=Creonila1
|
||||
GITEA_DB_PASSWORD=sG7hZXBQDAtRab9A
|
||||
GITEA_SECRET=okPnnPYzdKkkpO6oS8LqI5PHm7fH/OCl
|
||||
|
||||
# Webhook настройки
|
||||
WEBHOOK_SECRET=MHtue5Zclp/dr69OFdwquGzCVHUGiEHP
|
||||
|
||||
# Репозиторий заметок
|
||||
REPO_NAME=second-mind-aep
|
||||
```
|
||||
|
||||
## Webhook сервис
|
||||
|
||||
### package.json
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "quartz-webhook",
|
||||
"version": "1.0.0",
|
||||
"main": "server.js",
|
||||
"dependencies": {
|
||||
"express": "^4.18.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### server.js (основные моменты)
|
||||
|
||||
Webhook сервис включает:
|
||||
- Обработчик POST `/webhook` для получения уведомлений от Gitea
|
||||
- Health check endpoint GET `/health`
|
||||
- Функцию автоматической сборки с этапами:
|
||||
1. Проверка наличия Git репозитория
|
||||
2. `git pull` для обновления локальной копии
|
||||
3. Создание `index.md` если отсутствует
|
||||
4. Запуск `npm run quartz build` с указанием исходной директории
|
||||
5. Очистка целевой папки `/public`
|
||||
6. Копирование собранного сайта из `/quartz/public`
|
||||
|
||||
## Настройки Quartz
|
||||
|
||||
### quartz.config.ts (основные параметры)
|
||||
|
||||
```typescript
|
||||
const config: QuartzConfig = {
|
||||
configuration: {
|
||||
pageTitle: "AEP Second Mind",
|
||||
pageTitleSuffix: "",
|
||||
enableSPA: true,
|
||||
enablePopovers: true,
|
||||
locale: "ru-RU",
|
||||
baseUrl: "notes.aepif.ru",
|
||||
ignorePatterns: ["private", "templates", ".obsidian"],
|
||||
defaultDateType: "modified",
|
||||
theme: {
|
||||
typography: {
|
||||
header: "Schibsted Grotesk",
|
||||
body: "Source Sans Pro",
|
||||
code: "IBM Plex Mono",
|
||||
},
|
||||
},
|
||||
},
|
||||
// ... плагины и эмиттеры
|
||||
}
|
||||
```
|
||||
|
||||
## SSH конфигурация
|
||||
|
||||
### Настройка доступа к репозиториям
|
||||
|
||||
```bash
|
||||
# В ~/.ssh/config
|
||||
Host git.aepif.ru
|
||||
Port 2222
|
||||
User git
|
||||
IdentityFile ~/.ssh/id_ed25519
|
||||
StrictHostKeyChecking no
|
||||
```
|
||||
|
||||
### Known hosts для автоматического принятия ключей
|
||||
|
||||
```bash
|
||||
# Добавление отпечатков сервера
|
||||
ssh-keyscan -p 2222 git.aepif.ru >> ~/.ssh/known_hosts
|
||||
```
|
||||
|
||||
## Traefik Labels
|
||||
|
||||
### Основные метки для маршрутизации
|
||||
|
||||
```yaml
|
||||
# HTTP с SSL
|
||||
- traefik.http.routers.service-name.rule=Host(`domain.aepif.ru`)
|
||||
- traefik.http.routers.service-name.tls.certresolver=letsencrypt
|
||||
- traefik.http.services.service-name.loadbalancer.server.port=PORT
|
||||
|
||||
# TCP для SSH (только для Gitea)
|
||||
- traefik.tcp.routers.gitea-ssh.rule=HostSNI(`*`)
|
||||
- traefik.tcp.routers.gitea-ssh.entrypoints=ssh
|
||||
- traefik.tcp.services.gitea-ssh.loadbalancer.server.port=22
|
||||
|
||||
# Middleware для защиты (Authelia)
|
||||
- traefik.http.routers.obsidian.middlewares=authelia@docker
|
||||
```
|
||||
|
||||
## Безопасность
|
||||
|
||||
### Уровни защиты
|
||||
|
||||
1. **Gitea**: Собственная авторизация пользователей
|
||||
2. **Notes**: Защита через Authelia middleware
|
||||
3. **Webhook**: Проверка секретного токена в запросах
|
||||
4. **SSH**: Доступ только по ключам
|
||||
5. **SSL**: Автоматические сертификаты через Let's Encrypt
|
||||
|
||||
### Секреты и пароли
|
||||
|
||||
Все чувствительные данные хранятся в:
|
||||
- `.env` файле для Docker Compose
|
||||
- Environment переменных контейнеров
|
||||
- Примонтированных SSH ключах
|
||||
|
||||
Следующий документ: [[Мой сервер/Second Mind Setup/Развертывание]]
|
||||
107
⚙️ Техническое/🖥️ Серверы/Second Mind Setup/Обзор системы.md
Normal file
107
⚙️ Техническое/🖥️ Серверы/Second Mind Setup/Обзор системы.md
Normal file
@@ -0,0 +1,107 @@
|
||||
## Описание
|
||||
|
||||
Second Mind - система автоматической публикации заметок Obsidian через Quartz с использованием Git-based workflow. Позволяет превращать локальные заметки в красивый статический сайт автоматически при каждом commit'е.
|
||||
|
||||
## Архитектура системы
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[External Gitea Repository] --> B[Webhook Service]
|
||||
B --> C[Quartz Builder]
|
||||
C --> D[Static Files]
|
||||
D --> E[Nginx Server]
|
||||
F[Traefik Proxy] --> E
|
||||
F --> B
|
||||
|
||||
subgraph "Second Mind Container"
|
||||
B
|
||||
C
|
||||
end
|
||||
|
||||
subgraph "External Services"
|
||||
A
|
||||
F
|
||||
end
|
||||
```
|
||||
|
||||
## Основные компоненты
|
||||
|
||||
### External Git-сервер (Gitea)
|
||||
- **Назначение**: Хранение и версионирование заметок
|
||||
- **Домен**: `git.aepif.ru`
|
||||
- **Особенности**: Отдельный сервис, SSH доступ на порту 2222, webhook'и при push
|
||||
- **Репозиторий**: `http://gitea:3000/admin/second-mind-aep.git`
|
||||
|
||||
### Webhook Service
|
||||
- **Назначение**: Автоматическая пересборка при изменениях
|
||||
- **Домен**: `webhook.aepif.ru`
|
||||
- **Технология**: Node.js + Express
|
||||
- **Функции**:
|
||||
- Получение webhook'ов от Gitea
|
||||
- Обновление локальной копии репозитория
|
||||
- Запуск сборки Quartz
|
||||
- Копирование результата для Nginx
|
||||
|
||||
### Quartz Builder
|
||||
- **Назначение**: Генерация статического сайта из Markdown
|
||||
- **Репозиторий**: Кастомный форк `ssh://git@git.aepif.ru:2222/aep/quartz.git`
|
||||
- **Особенности**: Поддержка Obsidian-flavored Markdown, граф связей, поиск
|
||||
|
||||
### Веб-сервер (Nginx)
|
||||
- **Назначение**: Раздача статического контента
|
||||
- **Домен**: `notes.aepif.ru`
|
||||
- **Особенности**: Кэширование, сжатие, защита через Authelia
|
||||
|
||||
### Reverse Proxy (Traefik)
|
||||
- **Назначение**: Маршрутизация трафика и SSL
|
||||
- **Функции**: Автоматические SSL сертификаты, балансировка, middleware
|
||||
|
||||
## Workflow использования
|
||||
|
||||
1. **Создание заметок** в Obsidian локально
|
||||
2. **Commit и push** изменений в Gitea репозиторий
|
||||
3. **Автоматический webhook** от Gitea запускает пересборку
|
||||
4. **Webhook сервис** обновляет локальную копию и запускает Quartz
|
||||
5. **Quartz генерирует** обновленный статический сайт
|
||||
6. **Nginx раздает** новый контент посетителям
|
||||
|
||||
## Домены и доступ
|
||||
|
||||
| Сервис | Домен | Описание | Защита |
|
||||
|--------|-------|----------|---------|
|
||||
| Git-сервер | `git.aepif.ru` | Интерфейс Gitea | Авторизация |
|
||||
| Статический сайт | `notes.aepif.ru` | Опубликованные заметки | Authelia |
|
||||
| Webhook | `webhook.aepif.ru` | API для автоматизации | Секретный токен |
|
||||
|
||||
## Структура файлов
|
||||
|
||||
```
|
||||
/DOCKER/second-mind/
|
||||
├── docker-compose.yml # Основная конфигурация (только Nginx + Webhook)
|
||||
├── Dockerfile # Кастомный образ для webhook сервиса
|
||||
├── nginx.conf # Конфигурация Nginx для статических файлов
|
||||
├── webhook-server/ # Код webhook сервиса
|
||||
│ ├── server.js # Node.js сервер для обработки webhooks
|
||||
│ └── package.json # Зависимости Node.js
|
||||
├── obsidian_repo/ # Локальная копия Git-репозитория
|
||||
└── quartz_build/ # Собранные статические файлы для Nginx
|
||||
```
|
||||
|
||||
**Примечание**: Gitea и PostgreSQL развернуты отдельно в `/DOCKER/git/`
|
||||
|
||||
## Преимущества решения
|
||||
|
||||
- **Автоматизация**: Публикация происходит автоматически при push
|
||||
- **Версионирование**: Полная история изменений через Git
|
||||
- **Безопасность**: Многоуровневая защита доступа
|
||||
- **Производительность**: Статический сайт быстро загружается
|
||||
- **Кастомизация**: Возможность настройки внешнего вида через Quartz
|
||||
- **Поиск**: Полнотекстовый поиск по заметкам
|
||||
- **Связи**: Визуализация связей между заметками
|
||||
|
||||
## Следующие шаги
|
||||
|
||||
Для развертывания системы изучите:
|
||||
- [[Мой сервер/Second Mind Setup/Конфигурации]] - настройки всех сервисов
|
||||
- [[Мой сервер/Second Mind Setup/Развертывание]] - пошаговая инструкция установки
|
||||
- [[Мой сервер/Second Mind Setup/Администрирование]] - обслуживание и мониторинг
|
||||
342
⚙️ Техническое/🖥️ Серверы/Second Mind Setup/Развертывание.md
Normal file
342
⚙️ Техническое/🖥️ Серверы/Second Mind Setup/Развертывание.md
Normal file
@@ -0,0 +1,342 @@
|
||||
## Предварительные требования
|
||||
|
||||
### Системные требования
|
||||
- Ubuntu/Debian сервер с Docker и Docker Compose
|
||||
- Доступ к интернету для скачивания образов
|
||||
- Настроенный Traefik с сетью `proxy`
|
||||
- Домен с настроенными DNS записями
|
||||
|
||||
### Необходимые поддомены
|
||||
- `git.aepif.ru` → IP сервера
|
||||
- `notes.aepif.ru` → IP сервера
|
||||
- `webhook.aepif.ru` → IP сервера
|
||||
|
||||
## Пошаговая установка
|
||||
|
||||
### 1. Подготовка директорий
|
||||
|
||||
```bash
|
||||
# Создание основной директории проекта
|
||||
mkdir -p /DOCKER/second-mind
|
||||
cd /DOCKER/second-mind
|
||||
|
||||
# Создание рабочих папок
|
||||
mkdir -p webhook-server obsidian_repo quartz_build
|
||||
|
||||
# Установка прав доступа
|
||||
chmod 755 obsidian_repo quartz_build
|
||||
```
|
||||
|
||||
### 2. Настройка SSH ключей
|
||||
|
||||
```bash
|
||||
# Генерация SSH ключа для webhook сервиса
|
||||
ssh-keygen -t ed25519 -C "second-mind-webhook" -f ~/.ssh/id_ed25519
|
||||
|
||||
# Просмотр публичного ключа (для добавления в Gitea позже)
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
|
||||
# Настройка SSH конфигурации
|
||||
cat >> ~/.ssh/config << EOF
|
||||
Host git.aepif.ru
|
||||
Port 2222
|
||||
User git
|
||||
IdentityFile ~/.ssh/id_ed25519
|
||||
StrictHostKeyChecking no
|
||||
EOF
|
||||
|
||||
# Установка правильных прав
|
||||
chmod 600 ~/.ssh/id_ed25519
|
||||
chmod 644 ~/.ssh/id_ed25519.pub
|
||||
chmod 600 ~/.ssh/config
|
||||
```
|
||||
|
||||
### 3. Создание конфигурационных файлов
|
||||
|
||||
#### Создание .env файла
|
||||
|
||||
```bash
|
||||
cat > .env << 'EOF'
|
||||
DOMAIN=aepif.ru
|
||||
GITEA_ADMIN_USER=admin
|
||||
GITEA_ADMIN_PASSWORD=Creonila1
|
||||
GITEA_DB_PASSWORD=sG7hZXBQDAtRab9A
|
||||
GITEA_SECRET=okPnnPYzdKkkpO6oS8LqI5PHm7fH/OCl
|
||||
WEBHOOK_SECRET=MHtue5Zclp/dr69OFdwquGzCVHUGiEHP
|
||||
REPO_NAME=second-mind-aep
|
||||
EOF
|
||||
```
|
||||
|
||||
#### Создание Dockerfile
|
||||
|
||||
```bash
|
||||
cat > Dockerfile << 'EOF'
|
||||
FROM node:22
|
||||
WORKDIR /app
|
||||
|
||||
# Установка Git и SSH клиента
|
||||
RUN apt-get update && apt-get install -y git openssh-client && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Создание .ssh директории и настройка SSH
|
||||
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh
|
||||
|
||||
# Настройка SSH для автоматического принятия ключей хоста
|
||||
RUN echo "Host git.aepif.ru\n\tStrictHostKeyChecking no\n\tUserKnownHostsFile=/dev/null" > /root/.ssh/config
|
||||
|
||||
# Клонирование кастомного Quartz репозитория
|
||||
RUN git clone ssh://git@git.aepif.ru:2222/aep/quartz.git /quartz
|
||||
WORKDIR /quartz
|
||||
RUN npm install
|
||||
|
||||
# Копирование и настройка webhook сервиса
|
||||
COPY webhook-server/ /webhook/
|
||||
WORKDIR /webhook
|
||||
RUN npm install
|
||||
|
||||
EXPOSE 3000
|
||||
WORKDIR /webhook
|
||||
CMD ["node", "server.js"]
|
||||
EOF
|
||||
```
|
||||
|
||||
#### Создание nginx.conf
|
||||
|
||||
```bash
|
||||
cat > nginx.conf << 'EOF'
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
gzip on;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ $uri.html =404;
|
||||
}
|
||||
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
#### Создание docker-compose.yml
|
||||
|
||||
```bash
|
||||
# Скопировать содержимое из документа "Second Mind - Конфигурации"
|
||||
# Файл слишком большой для вставки здесь
|
||||
```
|
||||
|
||||
### 4. Настройка webhook сервиса
|
||||
|
||||
#### Создание package.json
|
||||
|
||||
```bash
|
||||
cat > webhook-server/package.json << 'EOF'
|
||||
{
|
||||
"name": "quartz-webhook",
|
||||
"version": "1.0.0",
|
||||
"main": "server.js",
|
||||
"dependencies": {
|
||||
"express": "^4.18.0"
|
||||
}
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
#### Копирование server.js
|
||||
|
||||
```bash
|
||||
# Скопировать готовый server.js в webhook-server/server.js
|
||||
# (используйте существующий файл)
|
||||
```
|
||||
|
||||
### 5. Первый запуск
|
||||
|
||||
```bash
|
||||
# Сборка и запуск всех сервисов
|
||||
docker-compose up -d
|
||||
|
||||
# Проверка статуса
|
||||
docker-compose ps
|
||||
|
||||
# Просмотр логов
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
### 6. Настройка Gitea
|
||||
|
||||
#### Первоначальная настройка
|
||||
|
||||
1. Открыть `https://git.aepif.ru`
|
||||
2. Пройти первоначальную настройку:
|
||||
- Database Type: PostgreSQL
|
||||
- Host: `db:5432`
|
||||
- Database Name: `gitea`
|
||||
- Username: `gitea`
|
||||
- Password: `sG7hZXBQDAtRab9A`
|
||||
- SSH Server Domain: `git.aepif.ru`
|
||||
- SSH Port: `2222`
|
||||
- HTTP Port: `3000`
|
||||
- Application URL: `https://git.aepif.ru/`
|
||||
|
||||
#### Добавление SSH ключа
|
||||
|
||||
1. Войти под админом (`admin` / `Creonila1`)
|
||||
2. Settings → SSH / GPG Keys
|
||||
3. Add Key → вставить содержимое `~/.ssh/id_ed25519.pub`
|
||||
4. Сохранить
|
||||
|
||||
#### Создание репозитория заметок
|
||||
|
||||
1. New Repository
|
||||
2. Repository Name: `second-mind-aep`
|
||||
3. Visibility: Private
|
||||
4. Initialize Repository: Yes
|
||||
5. Create Repository
|
||||
|
||||
#### Создание репозитория Quartz
|
||||
|
||||
1. New Repository
|
||||
2. Repository Name: `quartz`
|
||||
3. Visibility: Private
|
||||
4. **НЕ** инициализировать (будем форкать)
|
||||
|
||||
### 7. Форк и настройка Quartz
|
||||
|
||||
```bash
|
||||
# Клонирование оригинального Quartz
|
||||
git clone https://github.com/jackyzha0/quartz.git temp-quartz
|
||||
cd temp-quartz
|
||||
|
||||
# Изменение remote на наш Gitea
|
||||
git remote set-url origin ssh://git@git.aepif.ru:2222/aep/quartz.git
|
||||
|
||||
# Push в наш репозиторий
|
||||
git push -u origin main
|
||||
|
||||
# Удаление временной папки
|
||||
cd ..
|
||||
rm -rf temp-quartz
|
||||
```
|
||||
|
||||
### 8. Настройка webhook'а
|
||||
|
||||
1. В Gitea перейти в репозиторий `second-mind-aep`
|
||||
2. Settings → Webhooks → Add Webhook → Gitea
|
||||
3. Настройки:
|
||||
- Target URL: `https://webhook.aepif.ru/webhook`
|
||||
- HTTP Method: `POST`
|
||||
- POST Content Type: `application/json`
|
||||
- Secret: `MHtue5Zclp/dr69OFdwquGzCVHUGiEHP`
|
||||
- Trigger On: `Push events`
|
||||
- Active: ✓
|
||||
4. Add Webhook
|
||||
|
||||
### 9. Первый тест
|
||||
|
||||
#### Создание тестовой заметки
|
||||
|
||||
```bash
|
||||
# Клонирование репозитория заметок
|
||||
git clone ssh://git@git.aepif.ru:2222/admin/second-mind-aep.git test-notes
|
||||
cd test-notes
|
||||
|
||||
# Создание тестовой заметки
|
||||
cat > README.md << 'EOF'
|
||||
---
|
||||
title: "Добро пожаловать"
|
||||
---
|
||||
|
||||
# AEP Second Mind
|
||||
|
||||
Это главная страница базы знаний.
|
||||
|
||||
## Тестовая заметка
|
||||
|
||||
Проверка автоматической сборки.
|
||||
EOF
|
||||
|
||||
# Commit и push
|
||||
git add .
|
||||
git commit -m "Initial test note"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
#### Проверка работы
|
||||
|
||||
1. Проверить логи webhook сервиса:
|
||||
```bash
|
||||
docker-compose logs -f quartz-webhook
|
||||
```
|
||||
|
||||
2. Проверить появление файлов:
|
||||
```bash
|
||||
ls -la quartz_build/
|
||||
```
|
||||
|
||||
3. Открыть `https://notes.aepif.ru` и проверить сайт
|
||||
|
||||
## Возможные проблемы и решения
|
||||
|
||||
### SSH ключи не работают
|
||||
|
||||
```bash
|
||||
# Проверка SSH подключения
|
||||
ssh -p 2222 git@git.aepif.ru
|
||||
|
||||
# Если не работает, пересоздать ключи
|
||||
rm ~/.ssh/id_ed25519*
|
||||
ssh-keygen -t ed25519 -C "webhook" -f ~/.ssh/id_ed25519
|
||||
# Добавить новый публичный ключ в Gitea
|
||||
```
|
||||
|
||||
### Контейнер webhook не запускается
|
||||
|
||||
```bash
|
||||
# Проверить логи сборки
|
||||
docker-compose build quartz-webhook
|
||||
|
||||
# Проверить что SSH ключи примонтированы
|
||||
docker exec -it second_mind_webhook ls -la /root/.ssh/
|
||||
```
|
||||
|
||||
### Webhook не срабатывает
|
||||
|
||||
1. Проверить URL webhook'а в настройках Gitea
|
||||
2. Проверить секретный токен
|
||||
3. Посмотреть логи delivery в Gitea: Repository → Settings → Webhooks → Recent Deliveries
|
||||
|
||||
### 404 на главной странице
|
||||
|
||||
```bash
|
||||
# Проверить наличие index.html
|
||||
docker exec -it second_mind_nginx ls -la /usr/share/nginx/html/
|
||||
|
||||
# Если нет - создать index.md в репозитории
|
||||
# или проверить работу webhook'а
|
||||
```
|
||||
|
||||
## Завершение установки
|
||||
|
||||
После успешного развертывания у вас будет:
|
||||
|
||||
- ✅ Gitea сервер на `git.aepif.ru`
|
||||
- ✅ Защищенный сайт заметок на `notes.aepif.ru`
|
||||
- ✅ Автоматическая пересборка при каждом push'е
|
||||
- ✅ Полнотекстовый поиск и граф связей
|
||||
- ✅ SSL сертификаты для всех доменов
|
||||
|
||||
Следующий документ: [[Мой сервер/Second Mind Setup/Администрирование]]
|
||||
@@ -0,0 +1,29 @@
|
||||
# Traefik Reverse Proxy - Администрирование
|
||||
|
||||
## Ежедневное администрирование Traefik
|
||||
|
||||
*Документация будет дополнена процедурами администрирования*
|
||||
|
||||
## Мониторинг Dashboard
|
||||
*Работа с веб-интерфейсом Traefik*
|
||||
|
||||
## Управление SSL сертификатами
|
||||
*Мониторинг и обновление сертификатов*
|
||||
|
||||
## Анализ логов
|
||||
*Работа с логами доступа и ошибок*
|
||||
|
||||
## Добавление новых сервисов
|
||||
*Процедура подключения новых сервисов*
|
||||
|
||||
## Troubleshooting
|
||||
*Решение типовых проблем*
|
||||
|
||||
## Обновления
|
||||
*Процедуры обновления Traefik*
|
||||
|
||||
## Backup и восстановление
|
||||
*Резервное копирование конфигурации*
|
||||
|
||||
---
|
||||
*Эта страница находится в разработке*
|
||||
255
⚙️ Техническое/🖥️ Серверы/Traefik Reverse Proxy/Конфигурации.md
Normal file
255
⚙️ Техническое/🖥️ Серверы/Traefik Reverse Proxy/Конфигурации.md
Normal file
@@ -0,0 +1,255 @@
|
||||
# Traefik Reverse Proxy - Конфигурации
|
||||
|
||||
← **[[Обзор системы|← Назад к обзору]]**
|
||||
|
||||
## Docker Compose конфигурация
|
||||
|
||||
### Основной файл: `/DOCKER/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 Configuration
|
||||
- --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:
|
||||
# Самонастройка для Dashboard
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.traefik.rule=Host(`traefik.aepif.ru`)
|
||||
- traefik.http.routers.traefik.tls.certresolver=letsencrypt
|
||||
- traefik.http.routers.traefik.service=api@internal
|
||||
|
||||
# HTTP to HTTPS redirect
|
||||
- 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
|
||||
```
|
||||
|
||||
## Command Line Arguments
|
||||
|
||||
### API Configuration
|
||||
- `--api.dashboard=true` - Включает веб-интерфейс Dashboard
|
||||
- `--api.insecure=true` - **⚠️ Небезопасно**: Доступ к API без аутентификации на порту 8080
|
||||
|
||||
### Provider Configuration
|
||||
- `--providers.docker=true` - Включает Docker provider для автодискавери
|
||||
- `--providers.docker.exposedbydefault=false` - Сервисы не экспонируются автоматически
|
||||
- `--providers.docker.network=proxy` - Использует сеть `proxy` для подключения
|
||||
|
||||
### Entrypoints
|
||||
- `--entrypoints.web.address=:80` - HTTP entrypoint
|
||||
- `--entrypoints.websecure.address=:443` - HTTPS entrypoint
|
||||
- `--entrypoints.ssh.address=:2222` - TCP entrypoint для SSH
|
||||
|
||||
### SSL Certificate Management
|
||||
- `--certificatesresolvers.letsencrypt.acme.email=your_email@aepif.ru` - Email для Let's Encrypt
|
||||
- `--certificatesresolvers.letsencrypt.acme.storage=/data/acme.json` - Файл хранения сертификатов
|
||||
- `--certificatesresolvers.letsencrypt.acme.tlschallenge=true` - Использует TLS-01 challenge
|
||||
|
||||
## Port Mapping
|
||||
|
||||
| Внешний порт | Внутренний порт | Назначение |
|
||||
|--------------|-----------------|------------|
|
||||
| 80 | 80 | HTTP трафик (редирект на HTTPS) |
|
||||
| 443 | 443 | HTTPS трафик |
|
||||
| 8080 | 8080 | Dashboard (небезопасно) |
|
||||
| 2222 | 2222 | SSH для Git operations |
|
||||
|
||||
## Volume Configuration
|
||||
|
||||
### traefik_data
|
||||
- **Назначение**: Хранение SSL сертификатов и конфигурации
|
||||
- **Содержимое**:
|
||||
- `acme.json` - Let's Encrypt сертификаты
|
||||
- Конфигурационные файлы Traefik
|
||||
|
||||
### Docker Socket
|
||||
```yaml
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
```
|
||||
- **Назначение**: Доступ к Docker API для service discovery
|
||||
- **Режим**: Read-only для безопасности
|
||||
|
||||
## Network Configuration
|
||||
|
||||
### Proxy Network
|
||||
```yaml
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
**Важно**: Эта сеть должна быть создана заранее и подключена ко всем сервисам, которые должны быть доступны через Traefik.
|
||||
|
||||
## Labels Configuration
|
||||
|
||||
### Self-configuration для Dashboard
|
||||
```yaml
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.traefik.rule=Host(`traefik.aepif.ru`)
|
||||
- traefik.http.routers.traefik.tls.certresolver=letsencrypt
|
||||
- traefik.http.routers.traefik.service=api@internal
|
||||
```
|
||||
|
||||
### HTTP to HTTPS Redirect
|
||||
```yaml
|
||||
labels:
|
||||
- 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
|
||||
```
|
||||
|
||||
## Dynamic Configuration Examples
|
||||
|
||||
### Типичные labels для сервиса
|
||||
```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.services.service-name.loadbalancer.server.port=80
|
||||
```
|
||||
|
||||
### С Authelia middleware
|
||||
```yaml
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.protected-service.rule=Host(`protected.aepif.ru`)
|
||||
- traefik.http.routers.protected-service.tls.certresolver=letsencrypt
|
||||
- traefik.http.routers.protected-service.middlewares=authelia@docker
|
||||
- traefik.http.services.protected-service.loadbalancer.server.port=80
|
||||
```
|
||||
|
||||
### TCP routing (для SSH)
|
||||
```yaml
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.tcp.routers.git-ssh.rule=HostSNI(`*`)
|
||||
- traefik.tcp.routers.git-ssh.entrypoints=ssh
|
||||
- traefik.tcp.services.git-ssh.loadbalancer.server.port=22
|
||||
```
|
||||
|
||||
## SSL/TLS Configuration
|
||||
|
||||
### ACME Settings
|
||||
- **Challenge Type**: TLS-01 (HTTP challenge через порт 443)
|
||||
- **Storage**: `/data/acme.json` внутри контейнера
|
||||
- **Email**: Обязательно указать для уведомлений о истечении сертификатов
|
||||
- **Domains**: Автоматически из Host rules в labels
|
||||
|
||||
### Security Headers (рекомендуемые)
|
||||
```yaml
|
||||
labels:
|
||||
- traefik.http.middlewares.security-headers.headers.frameDeny=true
|
||||
- traefik.http.middlewares.security-headers.headers.sslRedirect=true
|
||||
- traefik.http.middlewares.security-headers.headers.browserXssFilter=true
|
||||
- traefik.http.middlewares.security-headers.headers.contentTypeNosniff=true
|
||||
- traefik.http.middlewares.security-headers.headers.forceSTSHeader=true
|
||||
- traefik.http.middlewares.security-headers.headers.stsIncludeSubdomains=true
|
||||
- traefik.http.middlewares.security-headers.headers.stsPreload=true
|
||||
- traefik.http.middlewares.security-headers.headers.stsSeconds=31536000
|
||||
```
|
||||
|
||||
## Middleware Configuration
|
||||
|
||||
### Redirect to HTTPS
|
||||
```yaml
|
||||
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
|
||||
```
|
||||
|
||||
### Rate Limiting
|
||||
```yaml
|
||||
- traefik.http.middlewares.rate-limit.ratelimit.burst=100
|
||||
- traefik.http.middlewares.rate-limit.ratelimit.average=50
|
||||
```
|
||||
|
||||
### CORS Headers
|
||||
```yaml
|
||||
- traefik.http.middlewares.cors.headers.accessControlAllowOriginList=*
|
||||
- traefik.http.middlewares.cors.headers.accessControlAllowMethods=GET,OPTIONS,PUT,POST,DELETE
|
||||
- traefik.http.middlewares.cors.headers.accessControlAllowHeaders=*
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
Traefik поддерживает конфигурацию через переменные окружения:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- TRAEFIK_API_DASHBOARD=true
|
||||
- TRAEFIK_PROVIDERS_DOCKER=true
|
||||
- TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
|
||||
- TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
|
||||
- TRAEFIK_CERTIFICATESRESOLVERS_LETSENCRYPT_ACME_EMAIL=your_email@aepif.ru
|
||||
```
|
||||
|
||||
## Безопасность конфигурации
|
||||
|
||||
### ⚠️ Проблемы безопасности в текущей конфигурации
|
||||
1. **Dashboard без аутентификации**: `--api.insecure=true` делает Dashboard доступным без авторизации
|
||||
2. **Docker socket**: Доступ к Docker API может быть использован для эскалации привилегий
|
||||
|
||||
### 🔒 Рекомендации по улучшению безопасности
|
||||
1. Убрать `--api.insecure=true` и настроить аутентификацию для Dashboard
|
||||
2. Добавить middleware для Dashboard:
|
||||
```yaml
|
||||
- traefik.http.routers.traefik.middlewares=authelia@docker
|
||||
```
|
||||
3. Использовать Docker socket proxy для ограничения доступа к Docker API
|
||||
|
||||
## Связанные файлы
|
||||
|
||||
- **[[Развертывание]]** - инструкции по первоначальной настройке
|
||||
- **[[Администрирование]]** - управление и мониторинг
|
||||
- **[[../Authelia Authentication/Конфигурации]]** - настройка middleware аутентификации
|
||||
239
⚙️ Техническое/🖥️ Серверы/Traefik Reverse Proxy/Обзор системы.md
Normal file
239
⚙️ Техническое/🖥️ Серверы/Traefik Reverse Proxy/Обзор системы.md
Normal file
@@ -0,0 +1,239 @@
|
||||
## Описание
|
||||
|
||||
Traefik Reverse Proxy - центральный компонент инфраструктуры aepif.ru, обеспечивающий маршрутизацию трафика, автоматические SSL сертификаты и интеграцию с системой аутентификации.
|
||||
|
||||
## Архитектура системы
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[Internet] --> B[Traefik v3.0]
|
||||
B --> C[Second Mind - notes.aepif.ru]
|
||||
B --> D[Gitea - git.aepif.ru]
|
||||
B --> E[Authelia - auth.aepif.ru]
|
||||
B --> F[Webhook Service - webhook.aepif.ru]
|
||||
B --> G[Traefik Dashboard - traefik.aepif.ru]
|
||||
|
||||
H[Let's Encrypt] --> B
|
||||
I[Docker Socket] --> B
|
||||
|
||||
subgraph "SSL Certificates"
|
||||
H
|
||||
J[ACME Storage]
|
||||
end
|
||||
|
||||
subgraph "Service Discovery"
|
||||
I
|
||||
K[Docker Labels]
|
||||
end
|
||||
```
|
||||
|
||||
## Основные функции
|
||||
|
||||
### Reverse Proxy
|
||||
- **Назначение**: Централизованная точка входа для всех сервисов
|
||||
- **Технология**: Traefik v3.0
|
||||
- **Порты**:
|
||||
- 80 (HTTP) - автоматический редирект на HTTPS
|
||||
- 443 (HTTPS) - основной трафик
|
||||
- 8080 - Dashboard (небезопасен в production)
|
||||
- 2222 - SSH для Git-сервера
|
||||
|
||||
### SSL Management
|
||||
- **Let's Encrypt**: Автоматическое получение и обновление сертификатов
|
||||
- **ACME Challenge**: TLS challenge для валидации доменов
|
||||
- **Автоматический редирект**: HTTP → HTTPS для всех сервисов
|
||||
- **Хранение**: Персистентные сертификаты в volume
|
||||
|
||||
### Service Discovery
|
||||
- **Docker Integration**: Автоматическое обнаружение сервисов через Docker API
|
||||
- **Label-based Configuration**: Настройка маршрутизации через Docker labels
|
||||
- **Dynamic Configuration**: Изменения конфигурации без перезапуска
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### Docker Compose
|
||||
Основная конфигурация в `/DOCKER/reverse-proxy/docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:v3.0
|
||||
command:
|
||||
- --api.dashboard=true
|
||||
- --providers.docker=true
|
||||
- --providers.docker.exposedbydefault=false
|
||||
- --entrypoints.web.address=:80
|
||||
- --entrypoints.websecure.address=:443
|
||||
- --entrypoints.ssh.address=:2222
|
||||
- --certificatesresolvers.letsencrypt.acme.tlschallenge=true
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
- "8080:8080"
|
||||
- "2222:2222"
|
||||
```
|
||||
|
||||
### Entrypoints
|
||||
- **web** (80): HTTP трафик с редиректом на HTTPS
|
||||
- **websecure** (443): HTTPS трафик
|
||||
- **ssh** (2222): TCP трафик для Git SSH
|
||||
|
||||
### Middlewares
|
||||
- **redirect-to-https**: Автоматический редирект HTTP → HTTPS
|
||||
- **authelia@docker**: Интеграция с Forward Auth
|
||||
|
||||
## Маршрутизация
|
||||
|
||||
### HTTP Routes
|
||||
| Домен | Сервис | Middleware | Порт |
|
||||
|-------|--------|------------|------|
|
||||
| `notes.aepif.ru` | Second Mind | authelia@docker | 80 |
|
||||
| `git.aepif.ru` | Gitea | - | 3000 |
|
||||
| `auth.aepif.ru` | Authelia | - | 9091 |
|
||||
| `webhook.aepif.ru` | Webhook Service | - | 3000 |
|
||||
| `traefik.aepif.ru` | Dashboard | - | api@internal |
|
||||
|
||||
### TCP Routes
|
||||
- **SSH Git Access**: `git.aepif.ru:2222` → Gitea container port 22
|
||||
|
||||
## Сетевая архитектура
|
||||
|
||||
### Proxy Network
|
||||
```yaml
|
||||
networks:
|
||||
proxy:
|
||||
name: proxy
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
Все сервисы, которые должны быть доступны через Traefik, подключаются к сети `proxy`.
|
||||
|
||||
### Labels Configuration
|
||||
Пример конфигурации сервиса через labels:
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.service.rule=Host(`service.aepif.ru`)
|
||||
- traefik.http.routers.service.tls.certresolver=letsencrypt
|
||||
- traefik.http.services.service.loadbalancer.server.port=80
|
||||
```
|
||||
|
||||
## SSL Сертификаты
|
||||
|
||||
### Let's Encrypt Integration
|
||||
- **Email**: `your_email@aepif.ru` для уведомлений
|
||||
- **Challenge Type**: TLS Challenge
|
||||
- **Storage**: `/data/acme.json` в контейнере
|
||||
- **Автоматическое обновление**: Traefik обновляет сертификаты автоматически
|
||||
|
||||
### Wildcard Certificates
|
||||
Для поддержки wildcard сертификатов потребуется DNS Challenge с API ключами DNS провайдера.
|
||||
|
||||
## Dashboard
|
||||
|
||||
### Доступ
|
||||
- **URL**: `https://traefik.aepif.ru`
|
||||
- **Порт**: 8080 (insecure mode)
|
||||
- **Функции**: Мониторинг роутеров, сервисов, middleware
|
||||
|
||||
### Безопасность
|
||||
⚠️ **Внимание**: Dashboard в текущей конфигурации доступен без аутентификации. В production рекомендуется:
|
||||
- Отключить insecure API (`--api.insecure=false`)
|
||||
- Добавить middleware для аутентификации
|
||||
- Ограничить доступ по IP
|
||||
|
||||
## Мониторинг
|
||||
|
||||
### Metrics
|
||||
- **Prometheus**: Встроенная поддержка метрик Prometheus
|
||||
- **Health Checks**: Автоматические проверки состояния backend сервисов
|
||||
- **Access Logs**: Детальные логи запросов
|
||||
|
||||
### Troubleshooting
|
||||
```bash
|
||||
# Проверка статуса Traefik
|
||||
curl -I https://traefik.aepif.ru
|
||||
|
||||
# Логи Traefik
|
||||
docker logs traefik -f
|
||||
|
||||
# Проверка конфигурации
|
||||
docker exec traefik traefik version
|
||||
```
|
||||
|
||||
## Безопасность
|
||||
|
||||
### TLS Configuration
|
||||
- **Минимальная версия**: TLS 1.2
|
||||
- **Cipher Suites**: Современные безопасные шифры
|
||||
- **HSTS**: HTTP Strict Transport Security headers
|
||||
|
||||
### Rate Limiting
|
||||
Можно настроить ограничение запросов через middleware:
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
- traefik.http.middlewares.ratelimit.ratelimit.burst=100
|
||||
- traefik.http.middlewares.ratelimit.ratelimit.average=50
|
||||
```
|
||||
|
||||
## Производительность
|
||||
|
||||
### Load Balancing
|
||||
- **Алгоритм**: Round Robin (по умолчанию)
|
||||
- **Health Checks**: Автоматическое исключение неисправных backend'ов
|
||||
- **Connection Pooling**: Переиспользование соединений
|
||||
|
||||
### Caching
|
||||
- **Static Content**: Заголовки кеширования для статических файлов
|
||||
- **Compression**: Автоматическое сжатие ответов
|
||||
|
||||
## Структура файлов
|
||||
|
||||
```
|
||||
/DOCKER/reverse-proxy/
|
||||
├── docker-compose.yml # Основная конфигурация Traefik
|
||||
└── volumes/
|
||||
└── traefik_data/ # ACME сертификаты и данные
|
||||
└── acme.json # Let's Encrypt сертификаты
|
||||
```
|
||||
|
||||
## Интеграции
|
||||
|
||||
### Docker Integration
|
||||
- **Automatic Service Discovery**: Обнаружение сервисов через Docker API
|
||||
- **Label-based Configuration**: Настройка через labels в docker-compose
|
||||
- **Hot Reload**: Изменения применяются без перезапуска
|
||||
|
||||
### Authelia Integration
|
||||
- **Forward Auth**: Интеграция с Authelia для централизованной аутентификации
|
||||
- **Headers**: Передача информации о пользователе в backend сервисы
|
||||
|
||||
## Backup и восстановление
|
||||
|
||||
### Критически важные данные
|
||||
- **acme.json**: SSL сертификаты Let's Encrypt
|
||||
- **docker-compose.yml**: Конфигурация сервиса
|
||||
- **traefik.yml**: Статическая конфигурация (если используется)
|
||||
|
||||
### Процедура backup
|
||||
```bash
|
||||
# Backup SSL сертификатов
|
||||
docker cp traefik:/data/acme.json ./backup/acme.json
|
||||
|
||||
# Backup всего volume
|
||||
docker run --rm -v traefik_data:/data -v $(pwd):/backup alpine tar czf /backup/traefik_data.tar.gz -C /data .
|
||||
```
|
||||
|
||||
## Связанные сервисы
|
||||
|
||||
- **[[Мой сервер/Authelia Authentication/Обзор системы|Authelia]]** - аутентификация через Forward Auth
|
||||
- **[[Мой сервер/Second Mind Setup/Обзор системы|Second Mind]]** - защищенный доступ к заметкам
|
||||
- **[[Мой сервер/Git Service/Обзор системы|Git Service]]** - HTTP и SSH доступ к Git
|
||||
|
||||
## Связанные документы
|
||||
|
||||
- **[[Traefik Reverse Proxy - Конфигурации]]** - детальные настройки и параметры
|
||||
- **[[Traefik Reverse Proxy - Развертывание]]** - пошаговая установка
|
||||
- **[[Traefik Reverse Proxy - Администрирование]]** - обслуживание и мониторинг
|
||||
325
⚙️ Техническое/🖥️ Серверы/Traefik Reverse Proxy/Развертывание.md
Normal file
325
⚙️ Техническое/🖥️ Серверы/Traefik Reverse Proxy/Развертывание.md
Normal file
@@ -0,0 +1,325 @@
|
||||
# Traefik Reverse Proxy - Развертывание
|
||||
|
||||
← **[[Обзор системы|← Назад к обзору]]**
|
||||
|
||||
## Предварительные требования
|
||||
|
||||
### Системные требования
|
||||
- **Docker**: версия 20.10+
|
||||
- **Docker Compose**: версия 2.0+
|
||||
- **Операционная система**: Linux (Ubuntu 20.04+ рекомендуется)
|
||||
- **RAM**: минимум 512MB для Traefik
|
||||
- **Дисковое пространство**: 1GB для логов и SSL сертификатов
|
||||
|
||||
### Сетевые требования
|
||||
- **Публичный IP**: Для Let's Encrypt ACME challenge
|
||||
- **Открытые порты**: 80, 443, 2222 (для SSH Git), 8080 (Dashboard)
|
||||
- **Доступ к DNS**: Для настройки A-записей
|
||||
|
||||
### DNS настройка
|
||||
Перед развертыванием настройте DNS записи:
|
||||
|
||||
```bash
|
||||
# A записи для всех поддоменов
|
||||
traefik.aepif.ru IN A YOUR_SERVER_IP
|
||||
auth.aepif.ru IN A YOUR_SERVER_IP
|
||||
notes.aepif.ru IN A YOUR_SERVER_IP
|
||||
git.aepif.ru IN A YOUR_SERVER_IP
|
||||
webhook.aepif.ru IN A YOUR_SERVER_IP
|
||||
```
|
||||
|
||||
## Создание сети proxy
|
||||
|
||||
### Шаг 1: Создание Docker network
|
||||
```bash
|
||||
# Создаем external сеть для всех сервисов
|
||||
docker network create proxy
|
||||
|
||||
# Проверяем создание
|
||||
docker network ls | grep proxy
|
||||
```
|
||||
|
||||
### Важность proxy сети
|
||||
Сеть `proxy` позволяет:
|
||||
- Изолировать веб-трафик от внутренних сетей
|
||||
- Автоматически подключать сервисы к Traefik
|
||||
- Обеспечить безопасность через сегментацию сети
|
||||
|
||||
## Подготовка файлов
|
||||
|
||||
### Шаг 2: Создание директории
|
||||
```bash
|
||||
# Создаем рабочую директорию
|
||||
mkdir -p /docker/reverse-proxy
|
||||
cd /docker/reverse-proxy
|
||||
```
|
||||
|
||||
### Шаг 3: Создание 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 Configuration - ЗАМЕНИТЕ EMAIL!
|
||||
- --certificatesresolvers.letsencrypt.acme.email=YOUR_EMAIL@domain.com
|
||||
- --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json
|
||||
- --certificatesresolvers.letsencrypt.acme.tlschallenge=true
|
||||
|
||||
# Logging
|
||||
- --log.level=INFO
|
||||
- --accesslog=true
|
||||
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
- "8080:8080"
|
||||
- "2222:2222"
|
||||
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- traefik_data:/data
|
||||
|
||||
networks:
|
||||
- proxy
|
||||
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.http.routers.traefik.rule=Host(`traefik.aepif.ru`)
|
||||
- traefik.http.routers.traefik.tls.certresolver=letsencrypt
|
||||
- traefik.http.routers.traefik.service=api@internal
|
||||
|
||||
# Global HTTP to HTTPS redirect
|
||||
- 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:
|
||||
external: true
|
||||
```
|
||||
|
||||
**⚠️ Важно**: Замените `YOUR_EMAIL@domain.com` на свой email адрес!
|
||||
|
||||
## Первый запуск
|
||||
|
||||
### Шаг 4: Запуск Traefik
|
||||
```bash
|
||||
# Переходим в директорию с конфигурацией
|
||||
cd /docker/reverse-proxy
|
||||
|
||||
# Запускаем в detached режиме
|
||||
docker-compose up -d
|
||||
|
||||
# Проверяем статус
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
### Шаг 5: Проверка логов
|
||||
```bash
|
||||
# Смотрим логи запуска
|
||||
docker-compose logs -f traefik
|
||||
|
||||
# Должны увидеть сообщения о:
|
||||
# - Создании routers и services
|
||||
# - Успешном запуске API
|
||||
# - Подключении к Docker provider
|
||||
```
|
||||
|
||||
## Проверка работоспособности
|
||||
|
||||
### Шаг 6: Тестирование Dashboard
|
||||
```bash
|
||||
# Проверяем доступность Dashboard
|
||||
curl -I http://YOUR_SERVER_IP:8080
|
||||
|
||||
# Проверяем HTTPS редирект
|
||||
curl -I http://traefik.aepif.ru
|
||||
# Должен вернуть 301/302 редирект на HTTPS
|
||||
```
|
||||
|
||||
### Шаг 7: Проверка SSL сертификатов
|
||||
```bash
|
||||
# Проверяем получение SSL сертификата
|
||||
curl -I https://traefik.aepif.ru
|
||||
|
||||
# Проверяем детали сертификата
|
||||
openssl s_client -connect traefik.aepif.ru:443 -servername traefik.aepif.ru | openssl x509 -noout -text
|
||||
```
|
||||
|
||||
## Настройка firewall
|
||||
|
||||
### Шаг 8: Конфигурация UFW (Ubuntu)
|
||||
```bash
|
||||
# Разрешаем необходимые порты
|
||||
sudo ufw allow 22/tcp # SSH
|
||||
sudo ufw allow 80/tcp # HTTP
|
||||
sudo ufw allow 443/tcp # HTTPS
|
||||
sudo ufw allow 2222/tcp # Git SSH
|
||||
sudo ufw allow 8080/tcp # Dashboard (временно)
|
||||
|
||||
# Включаем firewall
|
||||
sudo ufw enable
|
||||
|
||||
# Проверяем статус
|
||||
sudo ufw status
|
||||
```
|
||||
|
||||
## Мониторинг и диагностика
|
||||
|
||||
### Проверка состояния
|
||||
```bash
|
||||
# Статус контейнера
|
||||
docker ps | grep traefik
|
||||
|
||||
# Использование ресурсов
|
||||
docker stats traefik --no-stream
|
||||
|
||||
# Логи в реальном времени
|
||||
docker logs traefik -f
|
||||
```
|
||||
|
||||
### Dashboard интерфейс
|
||||
- **URL**: http://YOUR_SERVER_IP:8080 или https://traefik.aepif.ru
|
||||
- **Разделы**:
|
||||
- **HTTP Routers**: Настроенные маршруты
|
||||
- **HTTP Services**: Backend сервисы
|
||||
- **HTTP Middlewares**: Промежуточное ПО
|
||||
- **TLS**: SSL сертификаты
|
||||
|
||||
## Устранение проблем
|
||||
|
||||
### Проблема: Сертификат не получается
|
||||
```bash
|
||||
# Проверяем DNS записи
|
||||
nslookup traefik.aepif.ru
|
||||
|
||||
# Проверяем доступность порта 443 извне
|
||||
telnet YOUR_SERVER_IP 443
|
||||
|
||||
# Смотрим логи ACME
|
||||
docker logs traefik | grep acme
|
||||
```
|
||||
|
||||
### Проблема: Dashboard недоступен
|
||||
```bash
|
||||
# Проверяем, что контейнер запущен
|
||||
docker ps | grep traefik
|
||||
|
||||
# Проверяем порт
|
||||
netstat -tulpn | grep :8080
|
||||
|
||||
# Проверяем логи
|
||||
docker logs traefik --tail 50
|
||||
```
|
||||
|
||||
### Проблема: Сервисы не обнаруживаются
|
||||
```bash
|
||||
# Проверяем сеть proxy
|
||||
docker network inspect proxy
|
||||
|
||||
# Проверяем подключение Traefik к Docker socket
|
||||
docker logs traefik | grep docker
|
||||
|
||||
# Проверяем labels сервисов
|
||||
docker inspect SERVICE_CONTAINER | grep -A 10 Labels
|
||||
```
|
||||
|
||||
## Безопасность после установки
|
||||
|
||||
### Рекомендации по безопасности
|
||||
1. **Закрыть порт 8080**: Настроить аутентификацию для Dashboard
|
||||
2. **Ограничить доступ к Docker socket**: Использовать Docker socket proxy
|
||||
3. **Настроить логирование**: Централизованный сбор логов
|
||||
4. **Мониторинг**: Настроить алерты на проблемы с сертификатами
|
||||
|
||||
### Закрытие небезопасного Dashboard
|
||||
После настройки всех сервисов, отредактируйте docker-compose.yml:
|
||||
|
||||
```yaml
|
||||
command:
|
||||
- --api.dashboard=true
|
||||
# Убираем эту строку:
|
||||
# - --api.insecure=true
|
||||
```
|
||||
|
||||
И добавьте middleware для аутентификации:
|
||||
```yaml
|
||||
labels:
|
||||
- traefik.http.routers.traefik.middlewares=authelia@docker
|
||||
```
|
||||
|
||||
## Следующие шаги
|
||||
|
||||
После успешного развертывания Traefik:
|
||||
|
||||
1. **[[../Authelia Authentication/Развертывание]]** - Настройка аутентификации
|
||||
2. **[[../Git Service/Развертывание]]** - Развертывание Git сервера
|
||||
3. **[[../Second Mind Setup/Развертывание]]** - Настройка системы заметок
|
||||
4. **[[Администрирование]]** - Ежедневное управление
|
||||
|
||||
## Автоматизация развертывания
|
||||
|
||||
### Скрипт развертывания
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# deploy-traefik.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Развертывание Traefik Reverse Proxy"
|
||||
|
||||
# Проверяем Docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker не установлен"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Создаем сеть
|
||||
docker network create proxy 2>/dev/null || echo "Сеть proxy уже существует"
|
||||
|
||||
# Создаем директорию
|
||||
mkdir -p /docker/reverse-proxy
|
||||
cd /docker/reverse-proxy
|
||||
|
||||
# Запрашиваем email
|
||||
read -p "📧 Введите email для Let's Encrypt: " ACME_EMAIL
|
||||
|
||||
# Создаем docker-compose.yml с введенным email
|
||||
cat > docker-compose.yml << EOF
|
||||
# Вставляем конфигурацию с заменой email
|
||||
EOF
|
||||
|
||||
# Запускаем
|
||||
docker-compose up -d
|
||||
|
||||
echo "✅ Traefik развернут успешно"
|
||||
echo "🌐 Dashboard: http://$(curl -s ipinfo.io/ip):8080"
|
||||
```
|
||||
|
||||
## Связанные документы
|
||||
|
||||
- **[[Конфигурации]]** - детальные настройки конфигурации
|
||||
- **[[Администрирование]]** - управление и мониторинг
|
||||
- **[[../Authelia Authentication/Развертывание]]** - следующий шаг развертывания
|
||||
120
⚙️ Техническое/🖥️ Серверы/index.md
Normal file
120
⚙️ Техническое/🖥️ Серверы/index.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# 🖥️ Серверы
|
||||
|
||||
Документация по всем серверам и сервисам инфраструктуры aepif.ru.
|
||||
|
||||
## 🏗️ Архитектура инфраструктуры
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[User] --> B[Traefik Reverse Proxy]
|
||||
B --> C[Authelia Authentication]
|
||||
C --> D[Second Mind - notes.aepif.ru]
|
||||
C --> E[Git Service - git.aepif.ru]
|
||||
|
||||
B --> F[Webhook Service - webhook.aepif.ru]
|
||||
|
||||
subgraph "Docker Network: proxy"
|
||||
B
|
||||
C
|
||||
D
|
||||
E
|
||||
F
|
||||
end
|
||||
|
||||
subgraph "Databases"
|
||||
G[Redis - Sessions]
|
||||
H[PostgreSQL - Gitea]
|
||||
end
|
||||
|
||||
C --> G
|
||||
E --> H
|
||||
```
|
||||
|
||||
## 📋 Активные сервисы
|
||||
|
||||
| Сервис | Домен | Статус | Документация |
|
||||
|--------|-------|--------|--------------|
|
||||
| Traefik | traefik.aepif.ru | 🟢 | [[Traefik Reverse Proxy/Обзор системы]] |
|
||||
| Authelia | auth.aepif.ru | 🟢 | [[Authelia Authentication/Обзор системы]] |
|
||||
| Second Mind | notes.aepif.ru | 🟢 | [[Second Mind Setup/Обзор системы]] |
|
||||
| Git Service | git.aepif.ru | 🟢 | [[Git Service/Обзор системы]] |
|
||||
| Webhook | webhook.aepif.ru | 🟢 | - |
|
||||
|
||||
## 📖 Документация по сервисам
|
||||
|
||||
### 🌐 [Traefik Reverse Proxy](Traefik%20Reverse%20Proxy/)
|
||||
Центральный реверс-прокси для маршрутизации трафика и SSL терминации.
|
||||
- [[Traefik Reverse Proxy/Обзор системы|Обзор системы]]
|
||||
- [[Traefik Reverse Proxy/Конфигурации|Конфигурации]]
|
||||
- [[Traefik Reverse Proxy/Развертывание|Развертывание]]
|
||||
- [[Traefik Reverse Proxy/Администрирование|Администрирование]]
|
||||
|
||||
### 🔐 [Authelia Authentication](Authelia%20Authentication/)
|
||||
Централизованная система аутентификации и авторизации.
|
||||
- [[Authelia Authentication/Обзор системы|Обзор системы]]
|
||||
- [[Authelia Authentication/Конфигурации|Конфигурации]]
|
||||
- [[Authelia Authentication/Развертывание|Развертывание]]
|
||||
- [[Authelia Authentication/Администрирование|Администрирование]]
|
||||
|
||||
### 📝 [Second Mind Setup](Second%20Mind%20Setup/)
|
||||
Система автоматической публикации заметок Obsidian через Quartz.
|
||||
- [[Second Mind Setup/Обзор системы|Обзор системы]]
|
||||
- [[Second Mind Setup/Конфигурации|Конфигурации]]
|
||||
- [[Second Mind Setup/Развертывание|Развертывание]]
|
||||
- [[Second Mind Setup/Администрирование|Администрирование]]
|
||||
|
||||
### 🗂️ [Git Service](Git%20Service/)
|
||||
Git-сервер на базе Gitea для хранения кода и заметок.
|
||||
- [[Git Service/Обзор системы|Обзор системы]]
|
||||
- [[Git Service/Конфигурации|Конфигурации]]
|
||||
- [[Git Service/Развертывание|Развертывание]]
|
||||
- [[Git Service/Администрирование|Администрирование]]
|
||||
|
||||
## 🔧 Быстрые команды
|
||||
|
||||
### Мониторинг всех сервисов
|
||||
```bash
|
||||
# Проверка всех контейнеров
|
||||
docker ps
|
||||
|
||||
# Логи всех сервисов
|
||||
docker-compose logs -f
|
||||
|
||||
# Статус системы
|
||||
curl -I https://notes.aepif.ru
|
||||
curl -I https://git.aepif.ru
|
||||
curl -I https://auth.aepif.ru
|
||||
```
|
||||
|
||||
### Обновление системы
|
||||
```bash
|
||||
# Обновление всех образов
|
||||
docker-compose pull
|
||||
docker-compose up -d
|
||||
|
||||
# Перезапуск отдельного сервиса
|
||||
docker-compose restart SERVICE_NAME
|
||||
```
|
||||
|
||||
## 📊 Мониторинг
|
||||
|
||||
### Health Checks
|
||||
```dataview
|
||||
TABLE status as "Статус", version as "Версия", file.mtime as "Обновлено"
|
||||
FROM "⚙️ Техническое/🖥️ Серверы"
|
||||
WHERE file.name != "index"
|
||||
SORT file.mtime DESC
|
||||
```
|
||||
|
||||
### Структура файлов сервера
|
||||
```
|
||||
/DOCKER/
|
||||
├── traefik/ # Reverse Proxy
|
||||
├── auth/ # Authelia + Redis
|
||||
├── git/ # Gitea + PostgreSQL
|
||||
├── notes/ # Second Mind Quartz
|
||||
└── webhook/ # Webhook Service
|
||||
```
|
||||
|
||||
---
|
||||
[[⚙️ Техническое/index|← Назад к техническому разделу]]
|
||||
Reference in New Issue
Block a user