独立 WebUI 使用
适用范围
Sharelife WebUI 可以独立运行,不依赖 AstrBot Dashboard 内嵌。 本页只记录公开 / 用户侧的真实使用链路:
- Spotlight 风格的市场搜索
- 本地安装管理
- 模板上传与 profile-pack 投稿
- 用户侧任务 / 结果跟踪
特权审核与 operator 流程只保留在私有文档中。
配置
json
{
"webui": {
"enabled": true,
"host": "127.0.0.1",
"port": 8106,
"cors": {
"allow_origins": ""
},
"security_headers": {
"enabled": true,
"X-Content-Type-Options": "nosniff",
"X-Frame-Options": "DENY",
"Referrer-Policy": "no-referrer",
"Permissions-Policy": "camera=(), microphone=(), geolocation=()",
"Content-Security-Policy": "default-src 'self'; base-uri 'self'; frame-ancestors 'none'; object-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; form-action 'self'"
},
"auth": {
"member_password": "",
"token_ttl_seconds": 7200,
"allow_query_token": false,
"allow_anonymous_member": false,
"anonymous_member_user_id": "webui-user",
"anonymous_member_allowlist": [
"POST /api/trial",
"GET /api/trial/status",
"POST /api/templates/install",
"GET /api/member/installations",
"POST /api/member/installations/refresh",
"GET /api/preferences",
"POST /api/preferences/mode",
"POST /api/preferences/observe"
],
"login_rate_limit_window_seconds": 60,
"login_rate_limit_max_attempts": 10,
"api_rate_limit_window_seconds": 60,
"api_rate_limit_max_requests": 600
},
"observability": {
"metrics_max_paths": 128,
"metrics_overflow_path_label": "/__other__"
}
}
}鉴权行为
- 鉴权字段为空时,公开 / 用户侧界面可直接使用。
member_password会为受保护的 member 动作开启登录门控。GET /api/ui/capabilities在登录前可读,前端据此做按钮能力控制。- 默认关闭 query token,使用
Authorization: Bearer <token>。 - 登录失败受
login_rate_limit_*限流。 - API 请求受
api_rate_limit_*限流(维度为client + role + path)。 - 默认响应会带上
security_headers,包括Content-Security-Policy。 - 若设置
allow_anonymous_member=true,只有匿名 allowlist 中的接口可以免登录调用,且请求仍固定绑定到anonymous_member_user_id。 - 特权鉴权、secret 材料与备份恢复手册都保留在私有文档中。
- standalone 模式下“导入本机 AstrBot 配置”默认关闭(更安全)。如需启用请显式打开:
- CLI:
python3 scripts/run_sharelife_webui_standalone.py --enable-local-astrbot-import - 环境变量:
SHARELIFE_ENABLE_LOCAL_ASTRBOT_IMPORT=1 - 如需允许匿名主体触发本机导入:
--allow-anonymous-local-astrbot-import/SHARELIFE_ALLOW_ANONYMOUS_LOCAL_ASTRBOT_IMPORT=1
- 本机 AstrBot 自动探测支持可选路径提示:
SHARELIFE_ASTRBOT_CONFIG_PATH=/绝对路径/cmd_config.jsonSHARELIFE_ASTRBOT_CONFIG_PATH=/path/a:/path/b(Windows 使用;)SHARELIFE_ASTRBOT_SEARCH_ROOTS=/path/root-a:/path/root-b(Windows 使用;)SHARELIFE_ASTRBOT_HOME=/path/to/astrbot
启动与路由
- 插件启动时会尝试自动拉起 WebUI。
- 执行
/sharelife_webui获取访问地址。 - 公开 / 用户侧路由:
/统一入口/member用户控制台/market独立市场页
- 受限 operator 路由仍然存在,但不会在公开文档中描述。
容器快速启动
bash
docker compose up -d --build随后访问 http://127.0.0.1:8106。 数据默认持久化到 ./output/docker-data。 Compose 默认使用 state_store.backend=sqlite,文件位于 ./output/docker-data/sharelife_state.sqlite3。
用户工作流
1. 市场搜索 + 试用状态
/member与/market都以 Spotlight 风格搜索作为第一入口。- 搜索会驱动目录卡片、详情与对比面板。
试用状态(Trial Status)会展示not_started|active|expired,以及ttl_seconds与remaining_seconds。
2. 本地安装管理
- 先加载本地安装列表。
- 用
刷新本地已有配置同步当前可见状态。 - 单个安装项支持:
重新安装卸载
- 安装控件支持:
preflightforce_reinstallsource_preference=auto|uploaded_submission|generated
3. 模板上传链路
- 在
/member打开上传区域。 - 选择文件,或直接使用生成包输出。
- 模板包直传上限为
20 MiB。 - 上传选项:
scan_mode=strict|balancedvisibility=community|privatereplace_existing=true|false
- 提交后,在
我的投稿中查看详情,并下载自己的原始投稿包。
4. Profile-Pack 投稿链路
- 先准备 profile-pack 产物,并复制
artifact_id。 - 在
/member的“本地安装管理”中,导入草稿卡片可直接打开“上传细则”进行审阅后投稿。 - “上传细则”会按草稿记忆审阅状态(
selected unit/node、section 勾选、replace_existing),同一浏览器会话内关闭重开与页面刷新都不会丢失。 - 从
/member或/market发起投稿。 - 提交选项包括:
pack_typeselected_sectionsredaction_modereplace_existing
- 提交后,在
我的 Profile-Pack 投稿查看详情并下载自己的导出物。
5. 能力门控与错误模型
- 所有按钮级动作都通过
/api/ui/capabilities做后端能力门控。 - 鉴权 / 限流 / 内部错误统一返回:
{"ok": false, "error": {"code": "...", "message": "..."}} - 属主不匹配会返回
permission_denied。 - 模板上传超限会返回
package_too_large。 - 类似
prompt_injection_detected的风险命中会作为审查信号展示,不会静默删除。
公开 / 私有边界
- 公开文档只覆盖搜索、安装、上传、以及用户自己的投稿管理。
- 公开文档不暴露审核动作、特权 apply/rollback、secret 处理、备份恢复 SOP。
常见问题
401:已开启鉴权,当前 member 动作需要先登录。permission_denied:当前 token 不能访问指定user_id或目标动作。package_too_large:模板上传超过20 MiB。prompt_injection_detected:包已被标记并升级审查。- 手动修改浏览器存储后语言异常:删除
sharelife.uiLocale后刷新。 - 手动修改浏览器存储后开发者模式异常:删除
sharelife.developerMode后刷新。