Модуль конфигурации управляет жизненным циклом настроек агента. Он отвечает за поиск конфигурационного файла agent.conf, его создание с настройками по умолчанию, если он отсутствует, а также за строгую валидацию данных перед тем, как другие части системы (например, логгер или веб-сервер) начнут использовать эти параметры.
Поскольку запуск агента может происходить из разных директорий (например, из корневой папки проекта или из bin/Debug/...), логика системы гарантирует создание и поиск файлов в обоих местах (AppDomain.CurrentDomain.BaseDirectory и Directory.GetCurrentDirectory()).
Минимальные обязательные ключи agent.conf:
Address — IP-адрес для прослушивания (например, 0.0.0.0).Port — Порт для биндинга (должен быть числом).AgentName — Название агента.AllowedHosts — Список разрешённых хостов для подключений (например, 127.0.0.1,localhost).Environment — Рабочее окружение приложения (например, Production).LogLevel, LogFilePath, LogFileRetentionDays — Настройки, необходимые для корректной работы логгера Serilog.Примечание об
appsettings.json: Наш конфигурационный конвейер строго опирается только на файлagent.conf. Чтобы избежать путаницы или переопределений извне, все источникиjson-конфигурации, которые ASP.NET добавляет по умолчанию (appsettings.json,appsettings.Development.json), изымаются из провайдера конфигурации Kestrel на этапе запуска.
Для соблюдения принципа единственной ответственности, логика была разделена на пять атомарных сервисов, реализующих соответствующие интерфейсы:
CheckConfigFile — Проверяет, существует ли agent.conf хотя бы в одном из ожидаемых мест (папка компиляции или корень проекта).CreateConfigFile — Создает пустой файл в обеих директориях, если CheckConfigFile выдал отрицательный результат.WriteConfigFile — Заполняет вновь созданные конфигурационные файлы стандартными дефолтными настройками агента.ReadConfigFile — Считывает файл, парсит текстовые строки, отбрасывает комментарии (начинающиеся с #) и пустые строки, после чего возвращает данные в виде словаря Dictionary<string, string>.ValidateConfigFile — Является этапом контроля качества. Запрашивает чтение, убеждается, что все requiredKeys присутствуют (не пусты/NULL) и что числовые параметры, такие как порты, успешно конвертируются в int. При ошибке валидации происходит гарантированный сбой пайплайна (Throw Exception), не дающий приложению запуститься в "нерабочем" состоянии.Инкапсулирует вызовы всех этих сервисов класс-фасад ConfigurationManagement. Он предоставляет единый метод Initialize(), который оркестрирует эту цепочку действий.
Данная блок-схема показывает процесс от старта приложения до перехода к инициализации логгера (при условии успешного выполнения всех шагов конфигурирования).
Диаграмма наглядно демонстрирует, как в процессе запуска точки входа (Program.cs) сервисы обмениваются данными внутри фасада.
Модуль сертификатов управляет жизненным циклом SSL/TLS сертификатов, необходимых для безопасной работы агента по протоколу HTTPS. Он отвечает за поиск директории Cert и файлов сертификата, проверку их срока действия, авто-продление (пролонгацию) самоподписных сертификатов, генерацию новых сертификатов при их отсутствии, а также за архивирование устаревших сторонних сертификатов.
Система разработана так, чтобы минимизировать ручное вмешательство пользователя: если сертификат не предоставлен или истёк, агент самостоятельно сгенерирует новый локальный сертификат, чтобы гарантировать безопасный запуск HTTP-сервера Kestrel.
Как и в модуле конфигурации, для соблюдения принципа единственной ответственности логика разделена на атомарные сервисы, реализующие интерфейсы:
CheckCertificatesFolder — Проверяет наличие директории Cert в корневой папке приложения и создает её, если она отсутствует.CheckCertificatesFiles — Строго проверяет наличие файлов сертификатов всех требуемых форматов (.pfx, .cer, .crt, .pem) внутри папки Cert. Если хотя бы один формат отсутствует, набор файлов считается неполным.ReadCertificatesFiles — Считывает найденные файлы сертификатов .pfx из системы и загружает их (используя X509CertificateLoader) для последующего анализа.CheckCertificatesFilesExpirationDate — Анализирует загруженный сертификат и проверяет, не истек ли срок его действия (сравнивая свойство NotAfter с текущей датой).ProlongCertificatesFiles — Если срок действия самоподписного сертификата истек, генерирует новый сертификат на основе данных от старого с продленным сроком (на 1 год).WriteCertificatesFiles — Сохраняет новый (или пролонгированный) сертификат во всех необходимых форматах (.pfx, .cer, .crt, .pem) в папку Cert, чтобы обеспечить совместимость с различными веб-серверами и компонентами инфраструктуры.Инкапсуляцией всех этих проверок и вызовов занимается класс-фасад ServicesManagement. Он предоставляет метод InitializeCertificates() для выполнения всего конвейера проверок во время старта приложения, а также вспомогательные методы для отдачи пути до .pfx файла и пароля в Kestrel.
Блок-схема ниже показывает логическое дерево принятия решений модулем при запуске программы.
Диаграмма наглядно демонстрирует порядок вызовов сервисов и их взаимодействие внутри фасада перед передачей управления веб-серверу в Program.cs.
В агенте за логирование отвечает инфраструктура Serilog, абстрагированная за отдельными сервисами, которые следуют принципам SOLID. Модуль подготавливает папки, настраивает параметры вывода в файл и консоль, а также отвечает за периодическую и принудительную очистку устаревших файлов до старта основного пайплайна веб-приложения и во время его работы.
Основные настройки задаются в agent.conf:
LogFilePath — директория для сохранения логов (по умолчанию /logs/).LogLevel — уровень детализации (по умолчанию Information).LogFileRetentionDays — количество дней хранения файлов-логов до их удаления (по умолчанию 30).Логика разделена на пять основных сервисов:
ReadSerilogConfig — Кэшируемое чтение параметров логгера из глобального конфига агента.CheckSerilogConfig — Обеспечение существования директории по пути, указанному в LogFilePath.SetSerilogSettings — Инициализация объекта Log.Logger, подключение консольного и файлового синков, настройка ротации (RollingInterval).CleanSerilogOldFiles — Очистка файлов по паттерну agent-*.log, чья дата создания старше заданного в LogFileRetentionDays времени.LogCleanupBackgroundService — Фоновая задача (наследованная от BackgroundService), которая работает в процессе выполнения приложения и автоматически инициирует CleanSerilogOldFiles каждые 12 часов.Управление первичным жизненным циклом выведено в класс-фасад SerilogManagement, который поочередно вызывает этапы инициализации перед запуском веб-сервера.
Ниже представлена блок-схема процесса подготовки логирования при запуске агента, а также параллельный цикл очистки старых файлов в фоне.
Диаграмма описывает взаимодействие компонентов в процессе инициализации Serilog в точке входа Program.cs и последующий мониторинг в фоновом режиме.