免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

WeKnora 平台管理与系统管理员实战指南:全局设置、任务队列、平台 API Key 与跨空间审计

WeKnora 平台管理与系统管理员实战指南:全局设置、任务队列、平台 API Key 与跨空间审计 WeKnora 平台管理与系统管理员实战指南全局设置、任务队列、平台 API Key 与跨空间审计【免费下载链接】WeKnoraOpen-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki.项目地址: https://gitcode.com/GitHub_Trending/we/WeKnora系统管理员是 WeKnora 部署的全局运维角色负责整个部署的运行时设置、异步任务队列、平台 API Key 与跨空间审计与仅管辖单个工作空间的「空间 Owner」严格区分。本文将基于 website-docs/03-features/20-platform-admin.md 的完整脉络结合仓库源码cmd/server/bootstrap.go、internal/application/service/system_setting.go、internal/router/routes_auth_tenant.go、internal/handler/system.go等逐层拆解如何引导出第一个系统管理员、平台控制台四个分区各自能做什么、运行时设置的三级取值优先级与生效时机以及相关 API 的调用形态。读完你可以独立完成 WeKnora 的平台级初始化、日常运维配置与排障。两种身份空间 Owner 与系统管理员WeKnora 的权限模型将「空间治理」与「平台治理」彻底分离。空间 Owner 只负责单个工作空间系统管理员负责整个部署。两类身份分别授予互不自动叠加在某空间是 Owner 不代表是系统管理员反之亦然。空间 Owner系统管理员作用范围单个工作空间整个部署授予方式创建空间时获得或由原 Owner 转让由现有系统管理员授予首个管理员通过环境变量引导管理内容空间成员、模型、知识库、集成、空间审计全局系统设置、任务队列、平台 API Key、跨空间审计、重置用户密码跨空间数据访问由CanAccessAllTenants单独控制系统管理员身份不会自动授予其他空间知识库内容的访问权。从源码结构看该字段是types.User上的独立标志internal/application/service/user.go与internal/handler/tenant.go中所有跨空间门禁都显式检查user.CanAccessAllTenants与IsSystemAdmin解耦且前端展示时还会叠加configInfo.Tenant.EnableCrossTenantAccess开关见 internal/handler/auth.go。也就是说平台管理员身份与知识库数据访问是两个正交维度不能互相推导。设置首个系统管理员环境变量引导新部署没有任何系统管理员时需要先引导出第一个先用正常流程注册一个账号引导流程只提升已存在账号不负责创建用户为 app 服务配置WEKNORA_BOOTSTRAP_SYSTEM_ADMIN_EMAIL该账号邮箱重启启动时仅在部署尚无系统管理员的情况下将该邮箱对应的用户提升为系统管理员。这一逻辑的完整实现在 cmd/server/bootstrap.go。关键设计点best-effort 不阻断启动bootstrap 在 DI 容器构建完成后、HTTP 服务监听前执行任何失败只记录告警不会因环境变量拼写错误而让整个部署起不来——运维可以在运行中的实例里修复问题幂等用户已是系统管理员时为 no-op部署已存在至少一位系统管理员后环境变量停止授权防止 UI 撤销在下次重启时被悄悄回滚邮箱未注册时的处理用户查找失败或为空时记录告警并返回下一次重启会再次检查。因为创建账号涉及密码哈希、空间分配、审计等一系列副作用引导流程刻意不短路这些流程运维应先正常注册、再设置变量重启引导仅执行提升动作并写入日志promoted user %s (%s) to system admin via WEKNORA_BOOTSTRAP_SYSTEM_ADMIN_EMAIL。后续可在界面中添加或撤销系统管理员。不能撤销自己也不能撤销最后一位系统管理员——对应repository.ErrCannotRevokeSelf与repository.ErrLastSystemAdmin两条安全护栏见 internal/handler/system.go。对应接口为# 提升user_id 与 email 二选一user_id 优先 curl -X POST $BASE/api/v1/system/admin/promote -H Authorization: Bearer $TOKEN \ -H Content-Type: application/json -d {email:adminexample.com} # 撤销不能撤销自己也不能撤销最后一位管理员 curl -X POST $BASE/api/v1/system/admin/revoke -H Authorization: Bearer $TOKEN \ -H Content-Type: application/json -d {user_id:u-1} # 列表offset 默认 0limit 默认 50、上限 200 curl $BASE/api/v1/system/admin/list -H Authorization: Bearer $TOKEN重复撤销非管理员返回 200幂等审计记录以changedfalse标明未发生权限变更重复提升已有管理员同样幂等并留下idempotenttrue的审计痕迹。所有/system/admin/*路由都挂在g.SystemAdmin()组级守卫之下见 internal/router/routes_auth_tenant.go新增端点不会意外漏掉门禁。平台控制台四个系统管理员分区系统管理员登录后在「设置」侧栏可见四个专属分区。前端的分区清单硬编码在 frontend/src/config/settingsAccess.ts 的SYSTEM_ADMIN_SETTINGS_SECTIONS中system-global、runtime-queues、platform-api-keys、system-audit-log后端路由守卫才是最终权威。分区作用接口系统设置全局运行时开关注册模式、空间策略、并发、SSRF 白名单等按设置项的生效规则应用GET/PUT/DELETE /system/admin/settings[/:key]任务队列查看 asynq 各队列实时积压、逐个任务的重试/归档/删除、批量清空归档任务Lite 模式返回availablefalse/system/admin/runtime/queues*平台 API Key面向控制面自动化的 platform 作用域 Key能力包括system_tenants_read/manage、system_settings_read/manage、system_runtime_read/manage、system_audit_read/system/admin/api-keys系统审计日志tenant_id 0的平台级事件改设置、提升/撤销管理员、队列操作等。空间级审计接口按 tenant 过滤看不到这些行GET /system/admin/audit-log除了四个分区系统管理员还可执行两项特殊操作重置用户密码POST /system/admin/users/reset-password请求体为email与new_password。实现会替换目标用户本地密码并吊销其全部会话审计字段sessions_revoked: true不能给自己重置——自助改密码仍要求提供旧密码internal/handler/system.go批量套用默认存储配额POST /system/admin/tenants/apply-default-storage-quota把当前默认配额写到所有已存在的空间上响应{affected:N,quota_bytes:N,quota_gb:N}。注意该操作更新的是已有空间的配额数据与「仅新建空间时读取」的设置项语义互补。创建用户系统管理员可在系统设置中创建本地账号填写用户名、邮箱选择自动生成密码或指定符合策略的密码。空间分配遵循auth.default_tenant_modecreate_personal创建个人空间tenantless等待用户加入空间。接口为POST /api/v1/system/admin/users/create不开放给 platform API Key请求字段username2–50 字符、email合法邮箱、password可选或 null 则自动生成且显式空字符串仍要经过密码策略校验不视为自动生成。语义要点源自 website-docs/04-api/02-api-system.md201新建返回{user,generated_password?}仅自动生成时返回明文密码且只返回这一次之后不可再查询200已有身份返回已有用户、不改密码幂等400参数或密码策略不满足409邮箱与用户名对应不同身份时拒绝创建。curl -i -X POST $BASE/api/v1/system/admin/users/create \ -H Authorization: Bearer $TOKEN -H Content-Type: application/json \ -d {username:alice,email:aliceexample.com}创建用户与首个管理员引导是不同操作bootstrap 仍只提升已存在用户不负责创建账号AdminCreateUser走的是完整服务链路密码哈希、默认空间策略、审计见 internal/handler/system.go。运行时设置参考注册表驱动的三级取值WeKnora 把可运行时修改的全局设置收敛为一张注册表定义在 internal/application/service/system_setting.go 的registry中。注册表是「哪些键合法、什么类型、ENV 回退名、内置默认值」的唯一权威Update拒绝任何不在注册表中的键即使请求体被攻击者控制也无法向数据库注入任意键。设置值的解析优先级为DB ENV 内置默认数据库中的设置值优先于环境变量多数立即生效。影响新资源或需重建运行时的设置以表中「生效时机」说明为准。核心运行时设置键类型默认生效时机auth.registration_modeself_serve/invite_onlyself_serve立即auth.default_tenant_modecreate_personal/tenantlesscreate_personal只影响之后注册的新用户tenant.self_service_creation_enabledbooltrue立即tenant.max_owned_per_userint100 用内置默认负数 关闭限额每次建空间时读取tenant.default_storage_quota_gbint10仅新建空间时读取不回写已有空间tenant.auto_create_api_keyboolfalse每次建空间时读取ssrf.whitelist字符串列表空立即SSRF_WHITELIST_EXTRA仍只由部署方维护不在此覆盖asynq.core/postprocess/enrichment/maintenance/shared/wiki_concurrencyint见 异步任务系统各 worker pool 重新装配model.max_concurrencyint32立即附加安全与合规开关键默认作用auth.complex_password_enabledfalse新注册/新密码要求大小写字母、数字和特殊字符tenant.auto_accept_invitationfalse邮箱邀请已注册用户时直接写入成员关系sandbox.docker_enabledfalse开放 Docker 沙箱配置和实例创建几点来自注册表描述的细节值得注意tenant.auto_create_api_key默认关闭用于兼容旧版「创建空间即下发 full-access Key 并返回明文」的行为属于破坏性变更的回退开关sandbox.docker_enabled默认关闭因为本机docker.sock等同宿主机 root仅系统管理员可打开打开后立即生效无需重启见 system_setting.gossrf.whitelist支持example.com、*.foo.com、10.0.0.0/8、2001:db8::1等形态写入时会经过utils.ValidateSSRFWhitelistEntries的条目级校验非法 CIDR 直接 400并即时合并SSRF_WHITELIST_EXTRA环境变量后推送到 SSRF 检查器asynq 的六个 worker 并发键core/postprocess/enrichment/maintenance/shared/wiki均标记RequiresRestart: trueUI 会显示重启徽标修改后需重启进程生效model.max_concurrency是后台任务文档入库/富化对单个模型的默认并发上限、按模型 ID 全副本共享修改后通过limiter.SetGlobalLimit实时下推无需重启0/负数表示关闭默认限制各模型仍尊重自身配置。数据库优先与重置::: tip 排查「配置不生效」的第一步 控制台保存设置后修改对应环境变量不会覆盖数据库值。排查未生效时先检查运行时设置重置DELETE /system/admin/settings/:key会删除数据库覆盖值恢复使用环境变量或内置默认值。 :::底层机制对应 system_setting.go 的resolveRaw与GetInt/GetString/GetBool/GetStringList启动时异步预载全部设置行到进程内缓存preloadDB 故障只是导致预热变慢不阻断启动Update写库 → 更新本地缓存 → 通过 Redis pub/subchannel 名可加WEKNORA_REDIS_NAMESPACE后缀隔离多部署向其他副本广播变更消息只携带 key 不携带 value副本收到后重新从 DB 拉取避免把 pub/sub 当作配置字节传输通道Lite 模式 / 未配置 Redis 时自动降级rdb nil时跳过 pubsub本地编辑仍生效Update同步写本地缓存对单副本部署是正确的行为Reset幂等删除从未持久化的键视为成功、不写审计行避免 UI 重试堆积噪音真正删除时写入new_valuenull的审计行以区分「更新」与「重置」。平台 API Key面向控制面的自动化凭证平台 API Key 是 platform 作用域的独立凭证体系面向控制面自动化CI/CD、运维脚本与空间级租户 API Key 相互独立。核心接口# 列出掩码 curl $BASE/api/v1/system/admin/api-keys -H Authorization: Bearer $TOKEN # 创建明文仅返回一次 curl -X POST $BASE/api/v1/system/admin/api-keys -H Authorization: Bearer $TOKEN \ -H Content-Type: application/json \ -d {name:ops,capabilities:[system_tenants_read],expires_at_unix:1893456000} # 删除 curl -X DELETE $BASE/api/v1/system/admin/api-keys/3 -H Authorization: Bearer $TOKEN请求体字段name非空、capabilitiessystem_*能力列表必填、expires_at_unix可选须为未来时间。能力集合覆盖六类能力对应接口system_tenants_read/system_tenants_manage空间批量运维如apply-default-storage-quota需system_tenants_managesystem_settings_read/system_settings_manage运行时设置读 / 写删system_runtime_read/system_runtime_manage任务队列查看 / 任务操作与清空归档system_audit_read平台审计日志路由注册时通过g.apiKeyRoute(adminRoutes, ...)与apiKeyPlatform(...)将 API Key 能力绑定到具体端点见 routes_auth_tenant.go能力模型与 router_api_key_capabilities_test.go 的测试矩阵一一对应。任务队列运维asynq 队列管理任务队列分区直接暴露 asynq 各队列的实时状态与操作能力# 队列深度与并发状态Lite 模式返回 available:false curl $BASE/api/v1/system/admin/runtime/queues -H Authorization: Bearer $TOKEN # 响应{available,upstream_concurrency,parse_concurrency,wiki_concurrency,pools,queues,model_limiter_available,models,timestamp} # 队列任务列表state ∈ pending/active/scheduled/retry/archived/completed curl $BASE/api/v1/system/admin/runtime/queues/default/tasks?statepending -H Authorization: Bearer $TOKEN # 任务操作action ∈ cancel/run_now/delete curl -X POST $BASE/api/v1/system/admin/runtime/queues/default/tasks/t-1/actions/cancel \ -H Authorization: Bearer $TOKEN # 清空归档任务 curl -X DELETE $BASE/api/v1/system/admin/runtime/queues/default/archived -H Authorization: Bearer $TOKEN队列拓扑与各 worker pool 的并发预算设计见 异步任务系统任务级操作cancel/run_now/delete都经过状态检查避免对已完成或正在执行的任务做危险变更。系统审计日志tenant_id0 的平台级事件系统管理员审计分区读取tenant_id 0的平台级事件行包括修改系统设置system.setting_changed详情携带old_value/new_value、提升/撤销管理员system.admin_promoted/system.admin_revoked含idempotent/changed标记、重置密码sessions_revoked: true、队列操作等。空间级审计接口按 tenant 过滤天然看不到这些行因此必须有独立的平台审计入口。查询接口GET /api/v1/system/admin/audit-log需system_audit_read能力查询参数与空间审计一致after_id、limit、action、outcome、actor响应{success:true,data:[AuditLog],next_cursor:N}。审计写入处可见 internal/application/service/system_setting.goemitChangeAudit以TenantID: 0、ActorRole: system_admin标记平台级事件且审计失败不阻断配置更新本身。相关文档与实现参考空间内四级角色与 API Key租户、用户与认证授权队列拓扑与 worker pool异步任务系统审计日志与追踪可观测性与审计接口清单与 curl 示例系统与平台管理 API首个系统管理员引导cmd/server/bootstrap.go平台设置分区与侧栏渲染frontend/src/config/settingsAccess.ts运行时设置注册表与三级取值internal/application/service/system_setting.go系统管理路由注册internal/router/routes_auth_tenant.goRegisterSystemAdminRoutes系统管理 Handlerinternal/handler/system.go、internal/handler/audit_log.go【免费下载链接】WeKnoraOpen-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki.项目地址: https://gitcode.com/GitHub_Trending/we/WeKnora创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表