Add docker admin bootstrap for clean release

This commit is contained in:
2026-03-13 11:41:44 +03:00
parent 2aea70a0f6
commit 152f19eba2
12 changed files with 254 additions and 25 deletions

View File

@@ -34,7 +34,8 @@
- 1 enterprise release flow;
- 1 TUI сценарий подготовки/проверки;
- 69 новых/обновлённых модулей (+config_loader, filesystem_scanner, db_cleanup_executor);
- документация и контракты в пределах feature-папки.
- документация и контракты в пределах feature-папки;
- runtime bootstrap администратора через переменные `.env.enterprise-clean` без hardcode секретов в образах.
## Constitution Check
@@ -167,7 +168,8 @@ frontend/
## Implementation Traceability & Final Notes
- Статус реализации: Phase 17 завершены (T001T043).
- Статус реализации: Phase 17 завершены (T001T044).
- Новое расширение (post-release hardening, 2026-03-13): добавлен scope на управляемый bootstrap администратора через `.env.enterprise-clean` и docker startup flow.
- Ключевые подтверждения polish-фазы:
- T039: smoke TUI сценария зафиксирован в [`quickstart.md`](./quickstart.md).
- T040: контрактная проверка API подтверждена тестом [`backend/tests/api/routes/test_clean_release_api.py`](../../backend/tests/api/routes/test_clean_release_api.py).
@@ -175,7 +177,30 @@ frontend/
- T042: governance conflict по префиксу закрыт и задокументирован.
- T043: добавлена итоговая traceability-нотация в текущем плане.
Итог: feature готова к финальному релизному циклу с обязательным CI gate (`COMPLIANT` only) и операционной доказательной базой для аудита.
Итог: базовая feature готова к финальному релизному циклу с обязательным CI gate (`COMPLIANT` only) и операционной доказательной базой для аудита.
## Post-Release Hardening Addendum — Admin Bootstrap via `.env.enterprise-clean`
Цель addendum: убрать ручной шаг создания initial admin после доставки offline bundle и сделать это управляемой частью container startup.
Архитектурные решения:
1. В `.env.enterprise-clean.example` добавить параметры:
- `INITIAL_ADMIN_CREATE=false` (default-safe),
- `INITIAL_ADMIN_USERNAME=admin`,
- `INITIAL_ADMIN_PASSWORD=change-me`,
- `INITIAL_ADMIN_EMAIL=` (optional).
2. В backend image добавить entrypoint-скрипт:
- запускает проверку флага `INITIAL_ADMIN_CREATE`,
- при `true` вызывает существующий скрипт создания администратора,
- обрабатывает idempotency (существующий пользователь => без ошибки, лог `already exists`).
3. В `docker-compose.enterprise-clean.yml` прокинуть переменные bootstrap администратора только в `backend` service.
4. В операционном runbook зафиксировать обязательную ротацию bootstrap-пароля после первого входа.
5. В offline bundle manifest оставить ссылку на `.env.enterprise-clean.example` как source-of-truth для параметров запуска.
Нефункциональные ограничения:
- Никаких default production секретов в Git.
- Повторный restart контейнера не должен менять существующего admin.
- Ошибка bootstrap не должна маскироваться: должна логироваться и приводить к fail-fast старта backend (чтобы оператор устранил причину до ввода в эксплуатацию).
## Complexity Tracking

View File

@@ -73,6 +73,23 @@ cd /home/busya/dev/ss-tools
2. Повторно запустить проверку из того же TUI экрана (`F5`).
3. Повторять до статуса `COMPLIANT`.
## Admin Bootstrap via `.env.enterprise-clean` (Docker Runtime)
Для offline bundle deployment в контейнерах используйте runtime файл `.env.enterprise-clean` на базе шаблона `.env.enterprise-clean.example`.
Обязательные параметры bootstrap:
- `INITIAL_ADMIN_CREATE=true` для первого запуска;
- `INITIAL_ADMIN_USERNAME=<org-admin-login>`;
- `INITIAL_ADMIN_PASSWORD=<strong-temporary-secret>`;
- `INITIAL_ADMIN_EMAIL=<optional>`.
Ожидаемое поведение:
1. Backend container стартует.
2. EntryPoint проверяет флаг `INITIAL_ADMIN_CREATE`.
3. Если пользователь не существует — создаётся Admin user.
4. Если пользователь уже существует — bootstrap шага пропускается без изменения учётной записи.
5. После первого входа оператор выполняет обязательную ротацию bootstrap-пароля.
## CI Gate (обязательный)
После операторского прогона TUI та же политика должна быть проверена в CI.

View File

@@ -76,6 +76,7 @@
- Что происходит, если внутренний сервер ресурсов временно недоступен во время развёртывания в изолированном контуре?
- Как система реагирует, если в конфигурации присутствует косвенная ссылка на внешний интернет-источник (например, зеркальный URL вне корпоративного домена)?
- Что происходит при повторной подготовке clean-дистрибутива для уже очищенного релиз-кандидата?
- Что происходит, если контейнер перезапускается с `INITIAL_ADMIN_CREATE=true` и администратор уже существует?
## Requirements *(mandatory)*
@@ -101,6 +102,9 @@
- **FR-018**: Стадия `NO_EXTERNAL_ENDPOINTS` MUST сканировать все текстовые файлы (включая код, конфиги, скрипты) на наличие URL/хостов и сверять каждый найденный endpoint с `allowed_sources`.
- **FR-019**: Процесс clean-подготовки MUST включать стадию очистки БД от тестовых пользователей и демо-данных. Правила очистки (таблицы, условия, исключения) задаются в секции `database_cleanup` файла `.clean-release.yaml`.
- **FR-020**: Структура `.clean-release.yaml` MUST включать секции: `profile`, `scan_mode`, `prohibited_categories`, `prohibited_paths`, `allowed_sources`, `ignore_paths`, `database_cleanup` (с подсекциями `tables` и `preserve`).
- **FR-021**: Enterprise clean release bundle MUST включать `.env.enterprise-clean.example` с параметрами bootstrap администратора (`INITIAL_ADMIN_USERNAME`, `INITIAL_ADMIN_PASSWORD`, `INITIAL_ADMIN_EMAIL` optional, `INITIAL_ADMIN_CREATE`) и безопасными комментариями по ротации пароля.
- **FR-022**: Docker startup flow backend MUST поддерживать idempotent bootstrap администратора при запуске контейнера: при `INITIAL_ADMIN_CREATE=true` система создаёт администратора только если пользователь отсутствует и не перезаписывает существующие credentials/roles.
- **FR-023**: Процесс публикации clean bundle MUST включать операторский сценарий заполнения runtime `.env.enterprise-clean` из шаблона и подтверждение, что bootstrap-пароль заменён на организационный секрет до первого production запуска.
### Key Entities *(include if feature involves data)*

View File

@@ -141,6 +141,20 @@
---
## Phase 8: Post-Release Hardening — Admin Bootstrap in Docker
**Purpose**: Автоматизировать первичное создание администратора через runtime `.env.enterprise-clean` в offline/enterprise deployment.
- [X] T045 Add admin bootstrap env contract to `.env.enterprise-clean.example` (`INITIAL_ADMIN_CREATE`, `INITIAL_ADMIN_USERNAME`, `INITIAL_ADMIN_PASSWORD`, optional `INITIAL_ADMIN_EMAIL`)
- [X] T046 Wire admin bootstrap envs to backend runtime in `docker-compose.enterprise-clean.yml`
- [X] T047 Add backend entrypoint flow that performs idempotent admin bootstrap before app start in `docker/backend.Dockerfile` and new entrypoint script
- [X] T048 Extend admin creation script for optional email and deterministic exit behavior for existing user in `backend/src/scripts/create_admin.py`
- [X] T049 Update offline bundle packaging metadata to preserve new env contract in `scripts/build_offline_docker_bundle.sh` and bundle docs
- [X] T050 Add deployment runbook section for secure admin bootstrap and mandatory password rotation in `README.md` and `docs/installation.md`
- [X] T051 Add regression tests for container bootstrap path and create-admin idempotency in `backend/tests/scripts/` and/or service tests
---
## Dependencies & Execution Order
### Phase Dependencies