Databag 0.1.18 介绍与选型指南
Databag 自托管联邦制端到端加密 IM 全景解析:架构、数据模型、E2E 机制、版本双轨说明与同类量化选型对比。
Databag 0.1.18 介绍与选型指南
目标:说清 Databag 是什么、架构如何设计、适合谁用、与同类自托管 IM 相比怎么选。本文信息均实查自官方仓库、Docker Hub 与项目设计文档(查询日期:2026-10-25),部署与 API 的实测细节见专栏后续篇目。
一、环境信息
- 调研日期:2026-10-25
- 官方仓库:
https://github.com/balzack/databag(GitHub Star 1.5k,Apache-2.0,最近提交 2026-06-14,处于活跃维护状态) - 服务端镜像:
balzack/databag(Docker Hub,最新标签 0.1.18,推送于 2025-10-15,amd64/arm64 双架构) - 客户端:Web(React,服务端内置托管)、Android(Google Play / F-Droid)、iOS(App Store)
- 服务端技术栈:Go(gorilla/mux + GORM + SQLite)、WebSocket 事件推送、ImageMagick/FFmpeg 媒体转码
二、软件概述
Databag 是一个面向自托管场景的联邦制(Federated)端到端加密即时通讯系统,由个人开发者 balzack 主导开发。它的设计目标非常明确:让普通人用一台低功耗设备(官方宣称树莓派 Zero 即可跑)就能给自己和家人朋友搭一个私密 IM 节点。
与主流 IM 的核心差异:
- 去中心化 + 联邦制:每个人/家庭跑自己的节点,不同节点上的账号可以互相通信(类似电子邮件/Matrix 的联邦模型),没有中心服务器。
- 身份不依赖域名或区块链:账号身份 = 公私钥对的指纹(fingerprint),创建账号时生成密钥对,私钥永不离开所在节点,所有数据签名在服务端完成。
- 真正的端到端加密(E2E):消息内容只在客户端加解密,节点管理员也无法查看「密封(sealed)」频道内容。
- 话题(Topic)制消息组织:消息按频道(Channel)下的话题组织,而不是按联系人会话流。
- 不限人数:群组成员数无上限、单节点账号数无上限。
一句话定位:Signal 的加密理念 + 电子邮件的联邦拓扑 + 极低的自托管门槛。
三、核心架构
3.1 组件与数据流
Databag 系统由三类组件构成:
- 节点(Node):自托管的服务端(即本文档系列的主角),Go 编写,内嵌 SQLite 存储,同时托管 Web 客户端静态资源。
- 客户端(App):Web/Android/iOS,通过 REST API + WebSocket 双通道连接节点。
- TURN 中继(可选):音视频通话依赖 STUN/TURN 做 NAT 穿透,需单独部署(如 coturn)或使用公共服务。
一次跨节点消息投递的数据流(来自官方设计文档 doc/design_overview.md):
- 发送方客户端通过 REST API 把数据提交到发送方节点;
- 发送方节点通过 Notification 通道通知接收方节点「有更新」;
- 接收方节点通过 WebSocket 通知接收方客户端;
- 接收方客户端主动通过 REST API 从发送方节点拉取数据。
⚠️ 注意:节点之间只同步事件通知,不同步内容。内容始终存放在发送方所在节点,由接收方客户端跨节点拉取——这与 Matrix 的「全量房间状态复制」模型有本质区别,也是 Databag 能做到极轻量的关键原因。
3.2 数据模型
服务端只定义数据的关系结构与同步规则,数据格式对应用层透明(加密载荷)。核心对象:
| 对象 | 作用 | 共享关系 |
|---|---|---|
| Profile | 账号资料 | 可公开分享(用于联系人发现) |
| Card | 网络中另一个账号的引用(联系人) | 账号私有 |
| Alias | 联系人分组 | 账号私有 |
| Channel | 一组共享数据的集合(会话/频道) | 共享给指定 Alias/Card |
| Topic | Channel 下的一条消息(可带附件) | 随 Channel |
| Comment | Topic 下的评论 | 随 Channel |
| Attribute | 账号发布的属性数据 | 共享给指定 Alias |
同步机制采用版本号(revision)增量模型:账号下所有 Channel 共享同一 revision 计数器,客户端记录自己同步到的 revision,之后只拉取「revision 大于 X」的变更;删除用「slot 保留、value 置空」的墓碑方式传播。
3.3 身份与 E2E 加密
- 账号身份 = RSA 公钥的 SHA-256 指纹;私钥在服务端生成并保存(支持 RSA2048/RSA4096,见 C1 配置篇 keyType)。
- 密封密钥(Sealing Key):客户端生成的 E2E 密钥对,公钥随资料公开;私钥用 PBKDF2 派生密钥加密后存于节点,同账号多客户端可恢复。
- 频道加密:每个 Channel 有独立对称密钥,用每个参与账号的 sealing 公钥分别加密后随频道分发。
💡 技术拓展:E2E 算法在 IM 领域有多条路线——
算法路线 特点 代表 公钥加密对称密钥(无前向 secrecy) 实现简单、多设备友好 Databag Signal 协议(双棘轮) 前向/后向 secrecy,实现复杂 Signal、WhatsApp Megolm(群组棘轮) 群聊前向 secrecy,服务端仍见元数据 Matrix MLS(IETF RFC 9420) 标准化群聊 E2E 协议 新兴 IM 采用中 Databag 选择无棘轮方案的理由(官方设计文档):内容只驻留发送方节点,对前向 secrecy 的需求被弱化,换取多客户端与实现的灵活性。
四、功能特性
实查官方 README 与仓库确认的能力清单:
- 文本/图片/音频/视频/二进制附件消息(媒体类型可按节点开关)
- 端到端加密「密封频道」、未密封频道可选(allowUnsealed)
- 音视频通话(WebRTC,需自建 STUN/TURN 中继)
- 移动推送(UnifiedPush / FCM / APN,服务端内置 WebPush VAPID 密钥对自动生成)
- 多因素认证(TOTP,兼容 Google Authenticator 类应用)
- 联邦通信:跨节点联系人、跨节点频道
- 管理端:账号创建链接、账号禁用/重置密码、存储配额、开放注册(open access)
- 官方一键平台支持:CapRover、CasaOS、Unraid、Runtipi、Kubero、Umbrel
五、快速开始(最小可用示例)
最简体验方式是官方镜像 + 一条命令(完整生产化部署见本专栏《Databag 0.1.18 Docker Compose 部署指南》):
docker run -d --name databag \
-p 7000:7000 \
-e ADMIN=q1w2e3r4 \
-v databag-data:/var/lib/databag \
balzack/databag:0.1.18
启动后访问 http://<主机>:7000,点右上角齿轮输入管理员口令进入管理台,设置节点域名后生成账号创建链接,发给使用者即可开户。
💡 说明:Databag 客户端要求服务端有「DNS 域名 + 证书」才能正常使用(移动端尤其严格),裸 HTTP/IP 直连只适合本机体验;正式使用需配反向代理 + TLS 证书,或启动时用
-c/-k直挂证书。
六、适用场景与限制
适合:
- 家庭/小团队私密 IM:一台树莓派/NAS/小 VPS 即可承载全家账号
- 隐私优先社区:节点管理员看不到密封频道内容,适合对「自托管但仍防管理员」有要求的场景
- 无公网大资源的环境:实测空载内存约 23MB(见安装篇实测),官方称可在 Raspberry Pi Zero v1.3 运行
限制(实查结论,非臆测):
- 版本号双轨制容易踩坑:GitHub Releases 的 v1.1.x 是客户端 App 版本线(附件只有 webapp.tar.gz 前端包);Docker Hub 的 0.1.x 才是服务端版本线。部署服务端请以镜像标签 0.1.18 为准,不要按 GitHub「Latest Release v1.1.1021」去找服务端包。
- 服务端项目体量小:个人主导项目,无商业支持;GitHub Release 节奏(2024 年后未再发 v1.x 版)与镜像推送(2025-10 仍更新)不同步,版本判定要以 Docker Hub 标签时间为准。
- 联邦生态小:不像 Matrix 有大规模公共联邦网络,Databag 联邦主要靠自建节点互联。
- 无桌面原生客户端:桌面端用 Web 版(浏览器或套壳)。
- 管理 API 行为有版本差异:实测 0.1.18 镜像中
enableOpenAccess等少数字段不随PUT /admin/config持久化(main 分支源码已接入),详见配置篇 FAQ。
七、同类选型对比
自托管 IM 的主要候选量化对比(Star 数实查自 shields.io,2026-10-25):
| 产品 | Stars | 技术栈 | 拓扑 | E2E | 资源占用 | 适合人群 |
|---|---|---|---|---|---|---|
| Databag | 1.5k | Go + SQLite | 联邦(节点间仅通知) | 内置默认 | 极低(树莓派 Zero 级) | 家庭/极客小圈 |
| Matrix (Synapse) | 12k | Python + PostgreSQL | 联邦(全量状态复制) | Megolm 可选开启 | 高(GB 级内存) | 社区/组织级 |
| SimpleX Chat | 20k | Haskell | 无身份中继网络 | 双棘轮默认 | 中 | 极致匿名通信 |
| Rocket.Chat | 46k | Node.js + MongoDB | 中心化 | 可选 | 中高 | 企业团队协作 |
| Mattermost | 39k | Go + PostgreSQL | 中心化 | 无(依赖 TLS) | 中 | 企业 Slack 替代 |
| Ejabberd (XMPP) | 6.7k | Erlang | 联邦 | 依赖客户端 OMEMO | 低 | 标准协议派 |
选型建议:
- 要「一家人私聊 + 极低资源 + 开箱 E2E」→ Databag
- 要「大社区联邦 + 成熟生态 + 客户端多」→ Matrix/Synapse
- 要「不注册账号、无元数据」→ SimpleX
- 要「企业 IM、频道权限、集成机器人」→ Rocket.Chat / Mattermost
- 要「开放协议、跨厂商客户端互通」→ XMPP(Ejabberd)
八、参考链接
- GitHub 仓库:https://github.com/balzack/databag
- 设计总览(doc/design_overview.md):https://github.com/balzack/databag/blob/main/doc/design_overview.md
- Docker Hub 镜像:https://hub.docker.com/r/balzack/databag/tags
- 官方演示节点(定期清空,勿存重要内容):https://databag.coredb.org/
- F-Droid 客户端:https://f-droid.org/en/packages/com.databag/