flea/CONFIGURATION.md
2025-10-16 22:11:06 +04:00

564 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Руководство по конфигурации
Этот документ описывает, как настроить микросервисную систему NOCR для различных сценариев развертывания.
## Содержание
1. [Обзор системы конфигурации](#обзор-системы-конфигурации)
2. [Сценарии развертывания](#сценарии-развертывания)
- [Локальная разработка (VS Code)](#локальная-разработка-vs-code)
- [Docker Compose](#docker-compose)
- [Kubernetes](#kubernetes)
3. [Приоритет конфигурации](#приоритет-конфигурации)
4. [Настройки для конкретных сервисов](#настройки-для-конкретных-сервисов)
5. [Режим отладки](#режим-отладки)
6. [Устранение неполадок](#устранение-неполадок)
---
## Обзор системы конфигурации
Система использует многоуровневый подход конфигурации ASP.NET Core со следующими источниками (от низшего к высшему приоритету):
1. `appsettings.json` - Базовая конфигурация (коммитится в git)
2. `appsettings.{Environment}.json` - Настройки для конкретного окружения (некоторые коммитятся, некоторые нет)
3. User Secrets - Секреты только для разработки (хранятся локально, не в git)
4. **Переменные окружения** - **Наивысший приоритет** (переопределяют всё)
### Важные примечания
- **Никогда не коммитьте секреты в git**
- Используйте файлы `.example` как шаблоны
- Переменные окружения всегда имеют наивысший приоритет
- Каждый сервис имеет свои требования к конфигурации
---
## Сценарии развертывания
### Локальная разработка (VS Code)
Для отладки отдельных сервисов в VS Code:
#### Шаг 1: Создание конфигурации для окружения
Для каждого сервиса, который вы хотите запустить, создайте `appsettings.Development.json` из примера:
```bash
# Telegram Listener
cd telegram-listener/src/Nocr.TelegramListener.Host
cp appsettings.Development.json.example appsettings.Development.json
# Text Matcher
cd text-matcher/src/Nocr.TextMatcher.Host
cp appsettings.Development.json.example appsettings.Development.json
# Users
cd users/src/Nocr.Users.Host
cp appsettings.Development.json.example appsettings.Development.json
# Telegram Client
cd telegram-client/src/Nocr.TelegramClient.Host
cp appsettings.Development.json.example appsettings.Development.json
```
#### Шаг 2: Заполните ваши значения
Отредактируйте каждый файл `appsettings.Development.json` и замените placeholder-значения на ваши реальные учетные данные.
**Пример для Telegram Listener:**
```json
{
"RebusRabbitMqOptions": {
"ConnectionString": "amqp://admin:admin@localhost:5672/"
},
"WTelegramClientOptions": {
"ApiId": "22101230",
"ApiHash": "c72f884d8eb84cb7134a14362bff060b",
"PhoneNumber": "79167310711"
}
}
```
#### Шаг 3: Альтернатива - использование переменных окружения
Вместо создания `appsettings.Development.json`, вы можете использовать переменные окружения в `.vscode/launch.json`:
```json
{
"name": "Запуск сервиса",
"type": "coreclr",
"request": "launch",
"env": {
"ASPNETCORE_ENVIRONMENT": "Development",
"RebusRabbitMqOptions__ConnectionString": "amqp://admin:admin@localhost:5672/",
"WTelegramClientOptions__ApiId": "22101230",
"WTelegramClientOptions__ApiHash": "c72f884d8eb84cb7134a14362bff060b",
"WTelegramClientOptions__PhoneNumber": "79167310711"
}
}
```
**Примечание:** Используйте двойное подчеркивание `__` для представления вложенных секций конфигурации в переменных окружения.
#### Шаг 4: Запуск инфраструктуры
Вам нужны работающие RabbitMQ и базы данных:
```bash
# Запустить только инфраструктурные сервисы
docker-compose up nocr-rabbitmq nocr-text-matcher-db nocr-users-db -d
```
#### Шаг 5: Отладка в VS Code
Нажмите F5 или используйте панель Run and Debug для запуска вашего сервиса.
---
### Docker Compose
Для запуска всей системы локально с Docker:
#### Шаг 1: Создание файла .nocr.env
```bash
cd /путь/к/корню/проекта
cp .nocr.env.example .nocr.env
```
#### Шаг 2: Редактирование .nocr.env
Откройте `.nocr.env` и заполните ваши реальные учетные данные:
```bash
# Telegram Listener - получить на https://my.telegram.org/apps
WTelegramClientOptions__ApiId=22101230
WTelegramClientOptions__ApiHash=c72f884d8eb84cb7134a14362bff060b
WTelegramClientOptions__PhoneNumber=79167310711
# Telegram Client Bot - получить у @BotFather
TelegramBotOptions__Token=1234567890:ABCdefGHIjklMNOpqrsTUVwxyz
# Опционально: включить отладочное логирование
# NOCR_DEBUG_MODE=true
```
#### Шаг 3: Создание конфигурационных файлов для DockerCompose
Каждому сервису нужен `appsettings.DockerCompose.json`:
```bash
# Для каждого сервиса
cd telegram-listener/src/Nocr.TelegramListener.Host
cp appsettings.DockerCompose.json.example appsettings.DockerCompose.json
cd text-matcher/src/Nocr.TextMatcher.Host
cp appsettings.DockerCompose.json.example appsettings.DockerCompose.json
cd users/src/Nocr.Users.Host
cp appsettings.DockerCompose.json.example appsettings.DockerCompose.json
cd telegram-client/src/Nocr.TelegramClient.Host
cp appsettings.DockerCompose.json.example appsettings.DockerCompose.json
```
**Примечание:** Эти файлы содержат имена хостов Docker-сети (например, `nocr-rabbitmq:5672` вместо `localhost:5672`).
#### Шаг 4: Запуск всех сервисов
```bash
docker-compose up
```
Или со сборкой:
```bash
docker-compose up --build
```
#### Шаг 5: Проверка работоспособности сервисов
- Telegram Listener: http://localhost:5040/health
- Text Matcher: http://localhost:5041/health
- Users: http://localhost:5042/health
- Telegram Client: http://localhost:5050/health
- RabbitMQ Management: http://localhost:15672 (admin/admin)
---
### Kubernetes
Для production-развертывания на Kubernetes:
#### Шаг 1: Создание Kubernetes Secrets
**НЕ используйте файл `.nocr.env` в K8s.** Вместо этого создайте Secrets:
```bash
# Создать namespace
kubectl create namespace nocr
# Создать secrets для Telegram Listener
kubectl create secret generic telegram-listener-secrets \
--from-literal=WTelegramClientOptions__ApiId=22101230 \
--from-literal=WTelegramClientOptions__ApiHash=c72f884d8eb84cb7134a14362bff060b \
--from-literal=WTelegramClientOptions__PhoneNumber=79167310711 \
-n nocr
# Создать secrets для Telegram Client
kubectl create secret generic telegram-client-secrets \
--from-literal=TelegramBotOptions__Token=1234567890:ABCdefGHIjklMNOpqrsTUVwxyz \
-n nocr
```
#### Шаг 2: Ссылка на Secrets в Deployment
Пример манифеста Kubernetes deployment:
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: telegram-listener
namespace: nocr
spec:
template:
spec:
containers:
- name: telegram-listener
image: nocr-telegram-listener:latest
env:
- name: ASPNETCORE_ENVIRONMENT
value: "Production"
envFrom:
- secretRef:
name: telegram-listener-secrets
```
#### Шаг 3: Создание appsettings.Production.json
Создайте production-конфигурационные файлы с именами сервисов K8s:
```json
{
"RebusRabbitMqOptions": {
"ConnectionString": "amqp://admin:admin@rabbitmq-service:5672/"
}
}
```
**Примечание:** Секреты из переменных окружения переопределят эти значения.
#### Шаг 4: Деплой
```bash
kubectl apply -f deployment/
```
---
## Приоритет конфигурации
Понимание приоритета критически важно при устранении проблем с конфигурацией.
### Порядок приоритета (от низшего к высшему)
1. ⬇️ `appsettings.json` (базовый)
2. ⬆️ `appsettings.{Environment}.json` (например, Development, DockerCompose, Production)
3. ⬆️ User Secrets (только Development)
4. ⬆️⬆️ **Переменные окружения (ВСЕГДА ВЫИГРЫВАЮТ)**
### Пример сценария
Если у вас есть:
- `appsettings.json`: `"ConnectionString": ""`
- `appsettings.DockerCompose.json`: `"ConnectionString": "amqp://admin:admin@nocr-rabbitmq:5672/"`
- Переменная окружения: `RebusRabbitMqOptions__ConnectionString=amqp://admin:admin@localhost:5672/`
**Результат:** Переменная окружения побеждает! Подключение будет использовать `localhost:5672`.
Именно поэтому мы удалили `appsettings.protected.json` - он неправильно переопределял настройки Docker Compose.
---
## Настройки для конкретных сервисов
### Telegram Listener
**Обязательная конфигурация:**
```json
{
"RebusRabbitMqOptions": {
"ConnectionString": "amqp://user:pass@host:port/"
},
"WTelegramClientOptions": {
"ApiId": "YOUR_API_ID",
"ApiHash": "YOUR_API_HASH",
"PhoneNumber": "YOUR_PHONE_NUMBER"
}
}
```
**Как получить учетные данные Telegram:**
1. Посетите https://my.telegram.org/apps
2. Войдите с вашим номером телефона
3. Создайте новое приложение
4. Скопируйте `api_id` и `api_hash`
---
### Text Matcher
**Обязательная конфигурация:**
```json
{
"ConnectionStrings": {
"TextMatcherContext": "server=host;port=3306;database=nocr_text_matcher;uid=root;pwd=password"
},
"RebusRabbitMqOptions": {
"ConnectionString": "amqp://user:pass@host:port/"
}
}
```
**Порты по окружениям:**
- Development: `localhost:3316`
- Docker Compose: `nocr-text-matcher-db:3306`
- Kubernetes: `text-matcher-db-service:3306`
---
### Users
**Обязательная конфигурация:**
```json
{
"ConnectionStrings": {
"UsersContext": "server=host;port=3306;database=nocr_users;uid=root;pwd=password"
}
}
```
**Порты по окружениям:**
- Development: `localhost:3326`
- Docker Compose: `nocr-users-db:3306`
- Kubernetes: `users-db-service:3306`
---
### Telegram Client
**Обязательная конфигурация:**
```json
{
"RebusRabbitMqOptions": {
"ConnectionString": "amqp://user:pass@host:port/"
},
"UsersRestEaseOptions": {
"BasePath": "http://users-service:8080"
},
"TextMatcherRestEaseOptions": {
"BasePath": "http://text-matcher-service:8080"
},
"TelegramBotOptions": {
"Token": "YOUR_BOT_TOKEN"
}
}
```
**Как получить Bot Token:**
1. Откройте Telegram и найдите @BotFather
2. Отправьте команду `/newbot`
3. Следуйте инструкциям для создания вашего бота
4. Скопируйте предоставленный токен
---
## Режим отладки
Включите режим отладки для вывода маскированных значений конфигурации при запуске.
### Как включить
Установите переменную окружения:
```bash
export NOCR_DEBUG_MODE=true
```
Или в `.nocr.env`:
```bash
NOCR_DEBUG_MODE=true
```
Или в `docker-compose.yml`:
```yaml
environment:
NOCR_DEBUG_MODE: "true"
```
### Пример вывода
Когда режим отладки включен, вы увидите маскированную конфигурацию при запуске:
```
=== [NOCR_DEBUG] Значения конфигурации ===
[NOCR_DEBUG] RebusRabbitMqOptions:
[NOCR_DEBUG] ConnectionString: amqp://admin:***@nocr-rabbitmq:5672/
[NOCR_DEBUG] InputQueueName: nocr.telegram.listener.queue
[NOCR_DEBUG] DirectExchangeName: nocr.direct
[NOCR_DEBUG] TopicsExchangeName: nocr.topics
[NOCR_DEBUG] WTelegramClientOptions:
[NOCR_DEBUG] ApiId: 22101230
[NOCR_DEBUG] ApiHash: c7...0b
[NOCR_DEBUG] PhoneNumber: 79...11
=== [NOCR_DEBUG] Конец конфигурации ===
```
**Безопасность:** Пароли и секреты автоматически маскируются для защиты конфиденциальных данных.
---
## Устранение неполадок
### Проблема: Сервис не может подключиться к RabbitMQ
**Симптомы:**
```
Connection refused to nocr-rabbitmq:5672
```
**Решение:**
1. Проверьте, работает ли RabbitMQ: `docker-compose ps nocr-rabbitmq`
2. Включите режим отладки: `NOCR_DEBUG_MODE=true`
3. Проверьте ConnectionString в выводе отладки
4. Для Docker Compose убедитесь, что hostname - `nocr-rabbitmq:5672`, НЕ `localhost:5672`
5. Проверьте, не переопределяет ли переменная окружения appsettings
---
### Проблема: Сервис не может подключиться к базе данных
**Симптомы:**
```
Unable to connect to any of the specified MySQL hosts
```
**Решение:**
1. Проверьте, что база данных запущена: `docker-compose ps nocr-text-matcher-db`
2. Включите режим отладки для просмотра маскированной строки подключения
3. Проверьте hostname в строке подключения:
- Docker Compose: `nocr-text-matcher-db:3306`
- Локальная разработка: `localhost:3316`
4. Подождите прохождения healthcheck (может занять 10-30 секунд при первом запуске)
---
### Проблема: Значения конфигурации не применяются
**Симптомы:**
- Настройки в `appsettings.Development.json` игнорируются
- Сервис использует неправильную конфигурацию
**Решение:**
1. Проверьте, что `ASPNETCORE_ENVIRONMENT` установлен правильно:
- VS Code: `Development`
- Docker Compose: `DockerCompose`
- K8s: `Production`
2. Включите режим отладки для просмотра загруженных значений
3. Проверьте переменные окружения, переопределяющие ваши настройки
4. Помните: **Переменные окружения всегда выигрывают!**
---
### Проблема: Секреты раскрыты в логах
**Решение:**
- Режим отладки автоматически маскирует конфиденциальные значения
- Никогда не логируйте конфигурацию в production без маскировки
- Проверьте формат вывода отладки в `Startup.cs`:
- Пароли: `amqp://user:***@host`
- Секреты: `ab...yz` (только первые 2 + последние 2 символа)
---
### Проблема: Отсутствует файл .nocr.env
**Симптомы:**
```
docker-compose up падает с ошибкой отсутствующих переменных окружения
```
**Решение:**
1. Скопируйте файл-пример: `cp .nocr.env.example .nocr.env`
2. Заполните ваши реальные значения
3. Убедитесь, что `.nocr.env` находится в корне проекта (на том же уровне, что и `docker-compose.yml`)
---
## Краткая справка
### Соглашение об именовании переменных окружения
ASP.NET Core использует двойное подчеркивание `__` для представления вложенной JSON-структуры:
```bash
# JSON: { "Section": { "Key": "Value" } }
# Переменная окружения:
Section__Key=Value
# Примеры:
WTelegramClientOptions__ApiId=12345
RebusRabbitMqOptions__ConnectionString=amqp://localhost
```
### Расположение файлов
```
flea/ # Корень проекта
├── .nocr.env # Ваши секреты (gitignored)
├── .nocr.env.example # Шаблон (коммитится)
├── docker-compose.yml # Ссылается на .nocr.env
├── telegram-listener/
│ └── src/Nocr.TelegramListener.Host/
│ ├── appsettings.json # Базовый (коммитится)
│ ├── appsettings.Development.json # Локальная разработка (gitignored)
│ ├── appsettings.Development.json.example # Шаблон (коммитится)
│ ├── appsettings.DockerCompose.json # Docker (gitignored)
│ └── appsettings.DockerCompose.json.example # Шаблон (коммитится)
└── [та же структура для text-matcher, users, telegram-client]
```
---
## Рекомендации по безопасности
1.**Никогда не коммитьте секреты** - используйте файлы `.example` как шаблоны
2.**Используйте переменные окружения** для конфиденциальных данных в production
3.**Используйте K8s Secrets** для развертывания в Kubernetes
4.**Включайте режим отладки** только при устранении неполадок
5.**Ротируйте учетные данные** регулярно
6.**Используйте User Secrets** для локальной разработки (опционально)
7.**Не коммитьте** `.nocr.env` или `appsettings.*.json` (кроме файлов `.example`)
8.**Не используйте** `appsettings.protected.json` (удален из кода)
---
## Дополнительные ресурсы
- [Документация конфигурации ASP.NET Core](https://learn.microsoft.com/ru-ru/aspnet/core/fundamentals/configuration/)
- [Переменные окружения Docker Compose](https://docs.docker.com/compose/environment-variables/)
- [Kubernetes Secrets](https://kubernetes.io/ru/docs/concepts/configuration/secret/)
- [Документация Telegram API](https://core.telegram.org/api)
- [Telegram Bot API](https://core.telegram.org/bots/api)