Files
next-ai-draw-io/docs/cn/admin-panel.md

25 lines
1.3 KiB
Markdown
Raw Normal View History

feat: add file-based admin settings panel at /admin (#866) * feat: add file-based admin settings panel at /admin Settings saved in the panel are written to data/settings.json and overlaid onto process.env, taking precedence over environment variables and applying immediately without restart. Enable by setting ADMIN_PASSWORD; on serverless platforms without persistent disk the panel degrades to read-only. * polish: admin panel UI improvements - Provider logos in credential rows (shared ProviderLogo component, extracted from model-config-dialog) - Scroll-spy active state in the sidebar nav - Green success state in the save bar that clears after a few seconds - Wider content column (max-w-6xl) for less wasted space on desktop * polish: admin panel section toggles and reorder - Move Quota & Rate Limits to the end of the settings page - Add enable switches to Observability and Quota sections; default off with fields grayed out, auto-on when any field is already configured * polish: make section enable switch more visible Wrap the switch in a labeled pill ('Enabled'/'Disabled') with border and background so the off state is clearly visible. * refactor: derive admin registry from PROVIDER_INFO, simplify page state - Provider options, labels, and base-URL placeholders now come from PROVIDER_INFO instead of hand-copied lists (fixes SiliconFlow .com/.cn placeholder drift; panel names now match the model-config dialog) - Replace free-text subgroup strings + SUBGROUP_PROVIDERS reverse map with a typed provider field on SettingDef - Precompute SETTINGS_BY_GROUP and PROVIDER_SUBGROUPS at module level - Merge justSaved into saveMessage, drop unused mainRef, hoist fetchSettings out of the component, dedupe savedText logic - Serialize from SETTINGS_REGISTRY directly; json validators in a map instead of a hardcoded key check - Make allowPrivateUrls a function so ALLOW_PRIVATE_URLS edits in the admin panel apply without restart * feat: graphical model management in admin panel Replace the provider credential fields and raw AI_MODELS_CONFIG JSON textarea with a Models section mirroring the in-app model settings UI: provider instance list with logos, credential fields per provider type, model add/remove with suggestions, per-model connectivity test, and a default-provider star. On save the server derives everything the runtime needs into settings.json: credential env vars (with _2 suffixes for multiple instances of one provider), AI_MODELS_CONFIG, and AI_PROVIDER/AI_MODEL for the default. Secrets round-trip as masked markers and are never sent back to the browser. The general settings registry now only covers non-provider settings (generation, access, features, observability, quota). * fix: allow testing unsaved providers in admin panel The test button previously looked up credentials by providerId in the saved settings, so testing a newly added (unsaved) provider failed with 'Unknown provider or model'. The test endpoint now accepts the client's current provider state; newly typed secrets are used as-is and masked markers are resolved against the stored values, so testing works both before and after saving. * fix: merge env AI_MODELS_CONFIG with admin panel providers Previously, saving in the admin panel wrote a complete AI_MODELS_CONFIG into settings.json, which (by overlay precedence) replaced any config from .env or ai-models.json — admins lost their env-configured models. The panel no longer writes AI_MODELS_CONFIG. Instead its providers are merged with the env baseline at read time in loadRawServerModelsConfig, and panel credentials go to ADMIN_-prefixed env vars wired up via apiKeyEnv/baseUrlEnv so they never shadow standard vars. Env-based providers now appear read-only in the panel, name clashes are rejected, and a panel default overrides the env default. data/ is now gitignored. * fix: block global-credential providers already managed via env Bedrock, Vertex AI, and Ollama credentials live in fixed env vars with no apiKeyEnv redirection, so a panel instance of one of these would silently override the credentials that env-configured models rely on. The API now rejects saving such a provider when the env config already uses that type, and the Add Provider dropdown disables it with a 'managed via env' note. * fix: address admin panel review findings - Security: test-model no longer resolves a stored secret when the request's baseUrl/provider differs from the stored entry, closing a path where a tampered baseUrl could exfiltrate a saved key - Save failures are now visible: the save bar shows the error in red (was masked by the persistent 'Unsaved changes' text), and per-field validation errors from the settings API are surfaced under each field - The Observability/Quota enable switch is now real: toggling off stages deletion of the group's saved values, and the toggle no longer snaps back to Enabled after saving - Env provider's default star is hidden when a panel provider is the active default (no more double star) - Clearing a credential field reverts to the stored value instead of silently deleting it; an explicit X button removes a stored secret - Form inputs are disabled during an in-flight save * refactor(admin): split 1549-line admin page into focused modules Extract admin-shared.ts (types + fetch helper), setting-field.tsx (registry-driven fields), and models-section.tsx (provider/model manager) from page.tsx. Pure mechanical move, no behavior change. * feat(admin): share credential fields with user dialog and localize panel Extract ProviderCredentialsFields (display name + per-provider credential inputs) used by both the user ModelConfigDialog and the admin Models panel; secret input passed via renderSecret (plaintext vs masked), test button via footer slot. Add full i18n for the admin panel across en/zh/ja/zh-Hant, reusing modelConfig.* for shared parts. * fix(admin): address Copilot review findings - Reflect built-in defaults for boolean settings (ALLOW_PRIVATE_URLS defaults on) and allow clearing a saved boolean back to default, so the SSRF toggle matches actual runtime behavior. - Harden JSON loading: filter settings values to strings only, and schema-validate stored ADMIN_PROVIDERS entries, dropping malformed ones instead of letting them reach runtime code. - Set beforeunload returnValue so the unsaved-changes prompt shows in all browsers; reject non-finite numbers in settings validation. - Fix README/CN/JA docs that claimed the panel auto-generates AI_MODELS_CONFIG (providers are merged at read time, not written). - Add unit tests for corrupted-file value filtering and provider schema validation. * docs: move admin panel details to dedicated docs/{en,cn,ja}/admin-panel.md The READMEs now carry a short blurb + link, matching the existing per-topic docs (docker.md, ai-providers.md, ...). Removes the ~22-line inline section and the duplicated data/settings.json mentions. * fix(admin): address follow-up Copilot findings on the prior fixes - loadAdminProviders now validates against a stored-shape schema where secrets are plain strings, so a hand-edited ADMIN_PROVIDERS holding an {isSet} marker is dropped instead of later crashing maskSecret(). - loadSettings guards against array values (typeof [] === 'object'), which would otherwise overlay numeric keys onto process.env. - Admin SecretInput uses the bare id so the shared component's <Label htmlFor> stays associated (only one ProviderDetail mounts). - Add tests: marker-secret rejection, array-values guard, bedrock multi-secret round-trip.
2026-06-15 00:40:35 +09:00
# 管理面板
无需手动编辑 `.env`,您可以在 Web 管理面板中管理服务端设置。
## 启用面板
1. 设置 `ADMIN_PASSWORD` 环境变量(不设置则面板禁用)。
2. 访问 `/admin` 并登录。
## 可配置内容
1. **Models模型** — 添加提供商及其 API Key 和模型列表,交互与应用内的模型设置相同。保存后这些模型成为所有用户可用的服务端模型,并在请求时与环境中的 `AI_MODELS_CONFIG` / `ai-models.json` 合并(面板不会修改这些环境文件)。
2. **其余区块** — 访问码、生成参数、功能开关、可观测性和配额。保存的设置会写入 `data/settings.json` 并立即生效,无需重启(少数设置如 Langfuse 和 DynamoDB 标记为"需要重启")。
## 优先级
面板中保存的设置覆盖环境变量,环境变量覆盖内置默认值。删除已保存的值会回退到环境变量。
## 注意事项
- 密钥以明文形式存储在 `data/settings.json` 中(文件权限 600请妥善保管该文件。
- 在无服务器平台Vercel、Cloudflare Workers上没有持久化磁盘面板为只读 — 请改用环境变量配置。
- 使用 Docker 时,`data/` 目录通过 `docker-compose.yml` 中的卷持久化。
- `NEXT_PUBLIC_*` 变量在构建时固化,无法在面板中修改。