Перейти к содержанию

Общий процесс bootstrap

Назначение

Bootstrap выполняет первоначальную настройку установки до запуска обычных пользовательских сценариев. Это процесс уровня приложения, а не ответственность одного доменного модуля.

Сейчас процесс создаёт первого администратора ГК через iam::bootstrap. В будущем он может явно вызывать bootstrap-контракты других модулей в требуемом порядке.

Изоляция от основного приложения

Проект разделён на общую библиотеку и два исполняемых Gradle-модуля:

app — доменные модули, persistence и Flyway migrations; не запускается самостоятельно
web — основное HTTP-приложение, scheduling и Quartz
cli — общий процесс bootstrap и будущие служебные команды

CLI-код расположен отдельно от web runtime:

cli/src/main/kotlin/ru/panampizza/monolith/bootstrap
├── BootstrapApplication
├── BootstrapCommand
└── BootstrapProperties

Он запускается единственной командой:

./gradlew bootstrap

cli зависит от app, но не зависит от web и не содержит зависимостей на Spring Web и Quartz. BootstrapApplication не использует MonolithApplication, component scan или web server. В его контекст явно подключаются только Flyway, DataSource/JPA и bootstrap-конфигурации нужных модулей. Поэтому команда не запускает HTTP, импорт iiko, scheduled-задачи и произвольные ApplicationRunner основного приложения.

Подключение модулей

Модуль публикует отдельную техническую named interface, например:

iam::api        — рабочий публичный контракт
iam::bootstrap  — первоначальная настройка IAM

BootstrapCommand вызывает контракты напрямую:

BootstrapCommand
└── iam::bootstrap.createInitialAdmin(...)

Автоматический поиск contributors намеренно не используется: список и порядок редких изменяющих операций должны быть видны в коде команды.

Чтобы добавить bootstrap другого модуля:

  1. Опубликовать module::bootstrap с узким сценарием первоначальной настройки.
  2. Подключить его configuration в BootstrapApplication.
  3. Добавить свойства с префиксом $PROJECT_BOOTSTRAP_$MODULE_$ENTITY_$PROPERTY.
  4. Добавить явный вызов в BootstrapCommand и тест порядка/результата.

Gradle-модули и команды при этом не меняются.

Среды запуска

локально       → task bootstrap
Docker Compose → одноразовый bootstrap service/profile
Kubernetes     → однократный Job

Bootstrap запускается одним процессом. Одновременный запуск нескольких экземпляров не поддерживается, поскольку операция выполняется один раз за жизнь установки. Основной Deployment запускается отдельно и не содержит bootstrap-режима.

web и cli собираются в разные BootJar. Способ их упаковки в контейнерные образы будет зафиксирован вместе с Dockerfile приложения.