# Руководство по конфигурации Этот документ описывает, как настроить микросервисную систему 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)