跨实例群组绑定
跨实例群组绑定(目标版本 2.8.0)让两个独立的 EdgeChat HTTPS 站点把一个群组的未来纯文字消息双向同步。它不创建远端账号,也不导出历史消息。
支持范围与安全边界
- 仅支持 HTTPS 根域名;双方必须是可公开访问的 Cloudflare Worker origin。拒绝 IP、localhost、内网和特殊域名,禁止重定向。
- 仅支持公开、私有和
general群组;DM 不可绑定。每个群最多一个未撤销绑定,邀请和待确认状态也会占用位置。 - 只有本站管理员可以创建、认领、确认、暂停、恢复或解绑;服务端会重新检查管理员和群管理权限。
- 每次绑定使用各本站现有 keyring 分别加密保存长期凭据,不交换主密钥。不会新增手动 Secret。
- WAF/Access 应放行协议路由,但不要公开
/admin/instance-bridge;管理员页面仍需登录和管理员权限。
建立绑定
- A 管理员打开后台左侧栏的“跨实例群组绑定”,选择一个群组并创建邀请。
- A 获得一次性
bootstrap邀请:包含 256 bit 随机凭据,只有 10 分钟有效且只展示一次。不要把邀请放入 URL、日志、工单或提交记录。 - B 管理员粘贴邀请,选择 B 侧的公开、私有或
general群组,确认只导出未来纯文字消息。B 认领时生成独立的长期随机 key,并通过 HTTPS 传给 A;两站分别加密保存。 - A 核对 B 的 HTTPS origin 和群名/摘要后点击确认。两端通过签名控制任务激活;协议层重复投递不会重复激活。
- 刷新页面查看待认领、待确认、激活中、已激活或已撤销状态;暂停状态和丢弃计数会单独显示。
一群一绑定。A 创建邀请后,B 选择群接受,A 必须确认对端 origin 和群名,不能只凭邀请字符串信任对方。
同步内容
- 只同步绑定激活后新产生的本站原创纯文字消息:
sender_kind=local且source=edgechat。 - Markdown 正文按接收站的安全渲染规则显示;回复只发送回复正文,不发送引用、提及权限或远端 ID。
- 不同步附件、附件说明、外部来源消息、历史消息、编辑或撤回联动。已送达副本不会随来源站删除消失。
- 每条消息有稳定事件 ID,接收消息和 receipt 在同一事务中去重。
Telegram 等外部来源消息不属于本站原创,不会借由实例桥接再次出站。
暂停、恢复与解绑
- 两端各有独立暂停开关;任一端暂停后,本端停止收发并清空本端积压,同时通知对方清空积压。
- 恢复使用目标 revision 世代,而不是远端时钟水位;旧 revision 的消息不得在恢复后补发。暂停期间不补发积压。
- 解绑会立即在本地撤销接收资格并取消积压。保留最小凭据墓碑,最多 7 天用于重试远端解绑通知;在途请求仍可能在远端完成。
- 重试只提前唤醒尚未过期任务,不能复活已取消、过期或已丢弃消息。
投递与限制
- 单绑定积压最多 1000 条;超限只记录可见的丢弃计数,不阻塞本站聊天。
- 每条消息最多重试 24 小时,退避从 30 秒到最多 1 小时;单次网络超时 10 秒,单轮最多 10 条。
- 每 15 分钟运行一次全局补偿 cron,救援漏掉的唤醒并清理过期任务;数据库队列才是事实源。
- 后台分别展示网络/超时、鉴权/协议错误、远端暂停/解绑、积压满和过期原因,并显示已丢弃消息计数。
部署与恢复
新安装迁移 2026-09-19-instance-bridge,并启用 INSTANCE_BRIDGE Durable Object migration v3;保留既有 DO 和主 keyring。协议路由使用 global_fetch_strictly_public 旗标限制为公共 fetch。部署前先应用迁移,普通更新不要覆盖密钥环;回退前暂停所有绑定。
前端 Demo 只模拟操作,不发送跨站流量。生产部署和 GitHub Actions 模板应沿用现有资源与密钥配置,无需新增手动 Secret。