平台
自托管
同一个镜像既可以在您的主机上运行,也可以在我们的主机上运行。本页是运维者视角:要设置什么,前面放什么,以及如何在没有任何数据离开大楼的情况下保持运行。
布局
- 一个 Python 进程在单个事件循环中运行聊天监听器、调度器和带仪表板的 API。
- 容器只监听回环接口;反向代理(Nginx 或 Caddy)终结 TLS 并转发给它。
- 状态存放在一个数据目录中:SQLite 数据库、上传文件、GeoIP 数据、生成的密钥和模型权重。多主机部署请将 DATABASE_URL 指向 Postgres;只增不改的迁移集在两者上都能运行。
- 聊天服务器(Synapse 或其他 Matrix 主服务器)可以在任何可达的位置。
环境
| MATRIX_HOMESERVER, MATRIX_USER_ID, MATRIX_ACCESS_TOKEN | 机器人账户 |
|---|---|
| MATRIX_STANDUP_ROOM_ID | 默认日报房间 |
| MATRIX_ADMIN_TOKEN | 用于配置和查询的主服务器管理令牌;仅在环境中,绝不持久化 |
| SECRET_KEY | 一个 64 字符以上的随机字符串,用于签署仪表板会话 |
| DATABASE_URL | 默认为 sqlite,或一个 Postgres URL |
| BOOTSTRAP_ADMIN_MATRIX_ID | 第一位管理员,启动时提升权限 |
| AI_PROVIDER 及提供商密钥 | 参见“AI 提供商” |
| INTEGRATION_VAULT_KEY | 加密已存储集成凭据的密钥 |
| TZ, MAX_BODY_BYTES, AI_REASONING_MODEL | 可选 |
反向代理
- 转发 X-Forwarded-For 和 X-Forwarded-Proto;缺少后者时,产品无法区分 HTTP 和 HTTPS,会跳过 HSTS 头。
- 为代理的响应启用压缩和 HTTP/2;仪表板冷加载时会拉取数十个资源。
- 绝不压缩或缓冲事件流端点;实时更新是服务器推送事件。
- 按 IP 限速是代理的职责;产品自己限制验证码请求和登录。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; gzip_proxied any; http2 on;
安全头与限制
每个响应都携带 nosniff、禁止嵌入框架、无来源引用策略、限制性权限策略、TLS 上的两年 HSTS 和内容安全策略。请求体默认上限 5 MiB。每个输入在处理器运行前都按模式校验;聊天 ID 在任何主服务器调用前都经正则检查;出站 HTTP 固定为主服务器和配置的提供商主机。
运维
- 升级:拉取、重建、重启。迁移在启动时运行并跳过已存在的部分。
- 每晚备份数据目录;Postgres 使用 pg_dump。
- 健康:一个快速的无需认证的存活端点用于容器检查,一个仅限管理员的详细端点提供运行时长、数据库大小和提供商状态。
- GeoIP:每周运行刷新脚本(无需密钥的 db-ip Lite,或使用免费密钥的 MaxMind);数据卷中的副本在重启时自动加载,无需配置。
- 调度器支撑整个工作日:每五分钟采样在岗状态,每十五分钟检查缺勤,每晚汇总和物化评分,摘要和报告按各自节奏运行。
docker compose up -d --build docker exec inroots sqlite3 /app/data/standup.db ".backup /tmp/backup.db" GEO_DATA_DIR=/app/data/geo scripts/update_geoip.sh
物理隔离
使用自托管的 Matrix 服务器、以 Ollama 作为提供商、主机上的本地 IP 数据库、关闭语音回复且不启用任何集成,产品完全不需要互联网。没有遥测,没有使用信标,没有向外呼叫的崩溃报告;除非您配置了目标,否则零字节外流。