White-label options ใน Owner settings
ทุก white-label option deployment สามารถ set ผ่าน configuration (appsettings/env) เป็น also
settable ที่ runtime โดย app owner จาก Settings → Deployment ไม่มี redeploy owner
override wins over configuration; clearing มัน reverts option ไป deployment ของ configured (หรือ
built-in default) value
นี้ mirrors วิธี white-label deployment configures product — knobs เดียวกัน effect เดียวกัน — ดังนั้น operator สามารถ tune branding gates และ policy live และ see result immediately
Where มันlives
- UI: the owner-only Deployment section ใน settings dialog และ deep-linkable page
/settings/deploymentoptions grouped ไป 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— ทุก option ด้วย effective value ของมัน provenance (Config/Owner/Default) และ ว่า override set หรือไม่ Secrets masked (value never returned)PUT /api/whitelabel/{key}{ "value": "…" }— set override (validated per option kind) blank value on secret keeps existing secretDELETE /api/whitelabel/{key}— clear one override (revert ไป config)POST /api/whitelabel/reset— clear all overrides (revert deployment ไป pure config)
How overrides take effect
Owner overrides stored เป็น encrypted-where-needed AppSetting rows และ layered บน top ของ bound
AppOptions โดย decorated IOptionsMonitor<AppOptions> เพราะ ทุก consumer already reads options
ผ่าน monitor override applies live ข้าม whole app — theme page title MFA
gate AI-provider gates broker allow-list registration policy email transport settings ฯลฯ update
on next read (theme/branding re-render immediately) ถ้า database briefly unavailable layer
fails open ไป configured baseline ดังนั้น override read can never break app
Feature flags part ของ same surface แต่ persisted ผ่าน existing feature-override
store (IFeatureGate) ดังนั้น Features tab และ standalone feature toggles never diverge
Secrets (SMTP password CAPTCHA secret provisioning secret) encrypted at rest
(ISecretProtector purpose whitelabel.secret) write-only ใน UI และ never returned โดย API
Delegated options
shared Open API application credentials และ per-message-type rate limits managed on Open API settings section (ดู copy-trading / Open API docs) พวกเขา appear ใน Deployment catalog เป็น delegated entries (read-only ที่นี่ ด้วย link) ดังนั้นอะไรก็ไม่ duplicated และ sync guarantee still counts พวกเขา covered
Always ใน sync (enforced)
adding new white-label option ไป configuration must surface มัน ใน owner settings ใน same
commit นี้ enforced โดย WhiteLabelCatalogParityTests: มันreflects over ทุก white-label
options-record property และ fails build unless property registered ใน
Core/WhiteLabel/WhiteLabelCatalog (หรือ explicitly listed ใน IntentionallyExcluded ด้วย reason)
ดู mandate 10 ใน CLAUDE.md
Notes
- enabling SMTP on deployment ที่ started ด้วย no email configured needs restart (sender type chosen at startup); host/credentials ของ already-configured sender update live
- option labels/descriptions technical config-knob identifiers shown as data; tab labels และ ทั้งหมด interactive chrome fully localized