Перейти к основному содержимому

White-label options in Owner settings

Каждая white-label опция, которую deployment может установить через конфигурацию (appsettings/env), также настраивается runtime владельцем приложения, из Settings → Deployment, без redeploy. Owner override выигрывает над конфигурацией; очистка возвращает опцию к deployment's configured (или built-in default) значению.

Это отражает как white-label deployment конфигурирует продукт — те же ручки, тот же эффект — so an operator может tune branding, gates и policy live и видеть результат немедленно.

Где это живёт​

  • UI: owner-only Deployment section в settings dialog, и deep-linkable page /settings/deployment. Опции сгруппированы в tab per category (Branding, Theme, Features, Registration, Accounts, Email, AI, Open API, Prop firm), mobile-first, с windowed dialog on desktop и full-screen surface on phones.
  • API: /api/whitelabel (owner-only, never feature-gated):
    • GET /api/whitelabel — каждая опция с её effective value, provenance (Config / Owner / Default) и установлен ли override. Secrets замаскированы (value никогда не возвращается).
    • PUT /api/whitelabel/{key} { "value": "…" } — установить override (валидируется per option kind). Blank value на secret сохраняет существующий secret.
    • DELETE /api/whitelabel/{key} — очистить один override (вернуться к config).
    • POST /api/whitelabel/reset — очистить все overrides (вернуться к pure config deployment).

Как overrides применяются​

Owner overrides хранятся как encrypted-where-needed AppSetting rows и layered поверх bound AppOptions decorated IOptionsMonitor<AppOptions>. Потому что каждый consumer уже читает опции через that monitor, override применяется live across всё приложение — theme, page title, MFA gate, AI-provider gates, broker allow-list, registration policy, email transport settings и т.д. update on next read (theme/branding re-render немедленно). Если БД briefly unavailable, слой fails open к настроенному baseline, so override read может никогда не сломать приложение.

Feature flags часть той же surface но persisted через existing feature-override store (IFeatureGate), поэтому Features tab и standalone feature toggles никогда не расходятся.

Secrets (SMTP password, CAPTCHA secret, provisioning secret) зашифрованы at rest (ISecretProtector, purpose whitelabel.secret), write-only в UI, и никогда не возвращаются API.

Делегированные опции​

Shared Open API application креденшелы и per-message-type rate limits управляются на Open API settings section (см. copy-trading / Open API docs). Они появляются в Deployment catalog как delegated entries (read-only here, со ссылкой) so nothing duplicated и sync гарантия всё ещё считает их покрытыми.

Всегда in sync (enforced)​

Добавление новой white-label опции в конфигурацию должно surface it in owner settings in the same commit. Это enforced by WhiteLabelCatalogParityTests: он reflection'ит over every white-label options-record property и fails the build unless the property registered in Core/WhiteLabel/WhiteLabelCatalog (or explicitly listed in IntentionallyExcluded with a reason). См. mandate 10 in CLAUDE.md.

Notes​

  • Enabling SMTP на deployment что стартовал с нет email configured needs a restart (sender type выбирается at startup); host/credentials already-configured sender update live.
  • Option labels/descriptions — технические config-knob identifiers shown as data; tab labels и all interactive chrome полностью локализованы.