feat(config): несекретные настройки из OpenBao через OPENBAO__APP__<ИМЯ> (#44) #49

Merged
aep merged 1 commits from feat/44-openbao-app-settings into main 2026-10-07 17:42:13 +03:00
Owner

Closes #44

Что сделано

  • api/src/core/settings_sources.py — OpenBaoAppSettingsSource (наследник EnvSettingsSource с префиксом OPENBAO__APP__): типы, NoDecode-списки, вложенность __ и регистр разбираются так же, как из обычного env. Неизвестное имя — ValueError при создании Settings (то есть при старте).
  • api/src/core/config.py — settings_customise_sources: init → обычный env → OPENBAO__APP__* → .env → умолчание; OpenBAOSettings отбрасывает ключ APP.
  • Тесты api/tests/test_config_openbao_app.py (13): применение значения, приоритеты, типы (bool, int, CORS_ORIGINS списком), неизвестное имя, OPENBAO__APP__OPENBAO__..., вложенные группы не сломаны.
  • api/.env.example, README (таблица переменных): правило для контура.

Rulings I made

  • R-1: ключ APP убирается model_validator(mode="before") в OpenBAOSettings (а не extra="ignore" на всей группе): самый узкий вариант, опечатка в имени группы (OPENBAO__DATABSE__...) остаётся ошибкой. Проверено: без него OPENBAO.app падает с extra_forbidden (из env и из .env).
  • R-2: источник читает только окружение процесса, OPENBAO__APP__* в .env-файле не действует (платформа передаёт процессом; приоритет «.env ниже OPENBAO__APP__» иначе неоднозначен). Описано в README и .env.example.
  • R-3: OPENBAO__APP__OPENBAO__... отвергается как неизвестное имя: секреты задаются только OPENBAO__<ГРУППА>__*.
  • R-4: в .env.example/.env.test новые ключи не добавлены (только комментарий): тест требует одинаковых ключей в обоих файлах, а значения в .env.example и так заданы обычными именами.
  • R-5: наследование от EnvSettingsSource (публичный класс pydantic-settings) вместо собственного PydanticBaseSettingsSource: переиспользует разбор типов без копирования, нужная гарантия «так же, как из env».

Проверка

make check-full зелёный: check (1212 passed), dbml-check, check-infra, test-integration (797 passed), e2e (1 skipped — нет профиля services), docker-build, web-check (build ok).

🤖 Generated with Claude Code

https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3

Closes #44 ## Что сделано - `api/src/core/settings_sources.py` — `OpenBaoAppSettingsSource` (наследник `EnvSettingsSource` с префиксом `OPENBAO__APP__`): типы, `NoDecode`-списки, вложенность `__` и регистр разбираются так же, как из обычного env. Неизвестное имя — `ValueError` при создании `Settings` (то есть при старте). - `api/src/core/config.py` — `settings_customise_sources`: init → обычный env → `OPENBAO__APP__*` → `.env` → умолчание; `OpenBAOSettings` отбрасывает ключ `APP`. - Тесты `api/tests/test_config_openbao_app.py` (13): применение значения, приоритеты, типы (bool, int, CORS_ORIGINS списком), неизвестное имя, `OPENBAO__APP__OPENBAO__...`, вложенные группы не сломаны. - `api/.env.example`, README (таблица переменных): правило для контура. ## Rulings I made - R-1: ключ `APP` убирается `model_validator(mode="before")` в `OpenBAOSettings` (а не `extra="ignore"` на всей группе): самый узкий вариант, опечатка в имени группы (`OPENBAO__DATABSE__...`) остаётся ошибкой. Проверено: без него `OPENBAO.app` падает с `extra_forbidden` (из env и из `.env`). - R-2: источник читает только окружение процесса, `OPENBAO__APP__*` в `.env`-файле не действует (платформа передаёт процессом; приоритет «`.env` ниже `OPENBAO__APP__`» иначе неоднозначен). Описано в README и `.env.example`. - R-3: `OPENBAO__APP__OPENBAO__...` отвергается как неизвестное имя: секреты задаются только `OPENBAO__<ГРУППА>__*`. - R-4: в `.env.example`/`.env.test` новые ключи не добавлены (только комментарий): тест требует одинаковых ключей в обоих файлах, а значения в `.env.example` и так заданы обычными именами. - R-5: наследование от `EnvSettingsSource` (публичный класс pydantic-settings) вместо собственного `PydanticBaseSettingsSource`: переиспользует разбор типов без копирования, нужная гарантия «так же, как из env». ## Проверка `make check-full` зелёный: check (1212 passed), dbml-check, check-infra, test-integration (797 passed), e2e (1 skipped — нет профиля services), docker-build, web-check (build ok). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
aep added 1 commit 2026-10-07 17:33:38 +03:00
Контур платформы передаёт в под только OPENBAO__*. Свой источник настроек
(settings_customise_sources): приоритет обычный env -> OPENBAO__APP__* -> .env -> умолчание;
неизвестное имя — ошибка при старте; ключ APP не ломает OpenBAOSettings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
aep merged commit c5451aa7b2 into main 2026-10-07 17:42:13 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#49
No description provided.