Xandikos 0.4.10 介绍与选型指南
Xandikos 0.4.10(jelmer/xandikos,Python CalDAV/CardDAV 服务器)认知篇:Git 事件溯源架构实测验证(每变更一 commit、etag=blob SHA)、仓库与社区数据实查纠偏、协议能力矩阵,与 Radicale/Baïkal/DAViCal CalDAV 三强量化选型互链。
Xandikos 0.4.10 介绍与选型指南
本文所有结论来自 2026-11-02 联网实查与真实环境部署实测(完整取证:
/opt/data/quzuo/tmp/xandikos/evidence.md)。Xandikos 0.4.10 以 pipx 形态在本平台部署于 8165 端口,完成"MKCALENDAR 建日历 → PUT 事件 → REPORT 查询 → DELETE → Git 历史恢复"全闭环,事件溯源架构逐条实证。
一、快速结论
Xandikos 是 Jelmer Vernooij(Git Python 库 Dulwich 作者)开发维护的轻量但完整的 CalDAV/CardDAV 服务器,最大特色是整个 DAV 存储直接落在 Git 仓库上:每一次日历/联系人变更(含集合属性修改)都生成一个 Git commit,ETag 就是 Git blob SHA-1。这带来同类软件没有的免费能力:全量变更历史、任意时间点恢复、git log 级审计、Git 原生备份与克隆迁移。
适用:单人或极小团队的自托管日历/联系人同步、需要"时光机"级数据安全的 pim-utils 生态用户(Vdirsyncer/Khal/CardBook)、想用一条 git clone 完成备份的运维。不适用:多用户企业权限模型(选 DAViCal)、需要 Web 管理界面(选 Baïkal)、需要 Nextcloud 式群组日历治理(选 Radicale 配合外部 auth)。
二、基本信息(实查 2026-11-02)
| 项目 | 内容 |
|---|---|
| 官方仓库 | https://github.com/jelmer/xandikos(**纠偏**:jonashaag/xandikos、undernewmanagement/xandikos 均 404 不存在;Jonas Haag 为早期贡献者,主仓一直在 jelmer 名下) |
| 官网 | https://www.xandikos.org/ |
| 最新稳定版 | 0.4.10(PyPI 上传 2026-10-17T13:03:43;官网 news 页仅公告到 0.3.0,站点滞后,版本以 PyPI 为准) |
| 语言/框架 | Python ≥3.10,aiohttp 3.14 Web 层 + Dulwich 1.2.20(纯 Python Git 实现)+ vobject 0.9.9 / icalendar 7.3.0 解析 + defusedxml 0.7.1 |
| License | GPLv3+ |
| 社区数据 | GitHub 页面实查 613 stars / 16 watchers,default branch master,未归档;官网 clients 页维护 10+ 已测客户端清单 |
| 分发 | PyPI(pipx/pip)、官方镜像 ghcr.io/jelmer/xandikos(容器内同版本 0.4.10) |
| 关联项目 | pimutils 生态(Vdirsyncer/Khal/Bikuma 作者 Jelmer 系);iMIP/milter 集成 Postfix |
三、Git 后端架构(实测拆解)
3.1 存储布局:每个集合一个 Git 仓库
--defaults 启动后实测目录树:
data/user/.xandikos # principal 标记
data/user/calendars/calendar/.git # 默认日历(独立仓库)
data/user/contacts/addressbook/.git # 默认地址簿
data/user/inbox/.git # schedule inbox(RFC 6638)
data/user/outbox/.git # schedule outbox
集合内 .xandikos 文件是 INI 元数据(type/displayname/description/color),对应 PROPPATCH 属性同样入 Git。
3.2 事件溯源逐条实证
对 work 日历执行 MKCALENDAR→PUT→PUT(重复)→DELETE 后 git log 实测:
c2e20c1 Delete Second event
e73b51c Added Second event
b84ec57 Added Xandikos 取证事件
9c62b48 Set description.
3927847 Set display name.
c54b657 Set collection type.
- 一次写操作 = 一个 commit:连设置 displayname 都单独成提交;
- commit message 即人类可读审计:
Added <SUMMARY>/Delete <SUMMARY>,并自动附Requester: curl/8.5.0(User-Agent 入审计链); - ETag = Git blob SHA-1:PUT 返回
ETag: "85f5cc45404b76bbc358a383fdfa46c93adb9d1f",与git cat-file对象一致;集合级 ctag = tree id; - 幂等:同内容重复 PUT 返回 204 且不产生新 commit;
- 时光机恢复:DELETE 后文件消失但
git show HEAD~1:evt.ics完整取回(实测通过); - 乐观并发:错误 If-Match 返回 412(实测)。
3.3 协议能力(OPTIONS 实测逐字)
DAV: 1, 2, 3, calendar-access, calendar-auto-schedule, addressbook,
extended-mkcol, add-member, sync-collection, quota
Allow: COPY, DELETE, GET, HEAD, MKCALENDAR, MKCOL, MOVE, OPTIONS,
PROPFIND, PROPPATCH, PUT, REPORT
覆盖 RFC 4918 WebDAV / 6638 CalDAV(含 sync-collection 增量同步、auto-schedule)/ 6352 CardDAV;RFC 3253 版本控制仅部分实现(REPORT expand-property);RFC 4709 WebDAV Mount 有意不实现(官方立场);支持 WebDAV-Push 草案(--webdav-push,需 py_vapid)。/.well-known/caldav 302 到根,实测可用。
3.4 独有能力:iMIP 日程邮件闭环
0.4.x 引入完整的 RFC 6047 iMIP:xandikos import-imip 从 stdin 吃邮件(实测 Content-Type: text/calendar; method=REQUEST 的邀请邮件被解析后自动把事件写入默认日历、原始消息归档进 schedule inbox,双 commit);serve 端可开 LMTP 监听(--imip-listen)或内置 Postfix/Sendmail milter(独立入口 xandikos-milter),出站邀请走 sendmail/SMTP。这是三强中唯一把"邮件即日程协议"做进核心的实现。
四、与 CalDAV 三强量化选型(互链已收官专栏)
| 维度 | Xandikos 0.4.10 | Radicale 3.9(doc 6423) | Baïkal 0.10.1(doc 6549) | DAViCal 1.1.13(doc 6815) |
|---|---|---|---|---|
| 语言/栈 | Python/aiohttp+Dulwich | Python | PHP+SQLite/MySQL | PHP+PostgreSQL |
| 存储后端 | Git 仓库(事件溯源) | 文件系统(Radicale 自有) | 关系库 | PostgreSQL |
| 历史/回滚 | 原生 git log/checkout | 无 | 无 | 无(依赖 DB 备份) |
| 备份方式 | 拷目录/git clone | 拷目录 | 导 SQL | pg_dump |
| 管理界面 | 无(根页只读概览+CLI) | 可选 Web 管理 | Web UI 完整 | Web admin 完整 |
| 多用户/权限 | 单用户为主;multi-user 实验性 | 外部 auth 灵活 | 单用户/少用户设计 | 企业级 ACL/组/资源 |
| 自动调度 iMIP | 内置(LMTP/milter/sendmail) | 不支持 | 不支持 | 支持(邮件网关) |
| 部署形态 | pipx 单命令 / 官方镜像 | pip+systemd | Docker Compose+DB | 源码+Apache+PG |
| 依赖重量 | 零外部服务(无 DB) | 零外部服务 | 需 DB | 需 PG+PHP+Apache |
| 社区热度 | 613 stars(实查) | ~2k+ | ~1.6k | 迁移 GitLab 维护 |
选型口径:
- 要数据安全审计/历史回溯、个人 pim-utils 工作流(Vdirsyncer+Khal+CardBook)、极简依赖 → Xandikos;
- 要多用户企业权限、资源预订、群组 → DAViCal(见 doc 6815/6859);
- 要开箱 Web 管理、少量用户 → Baïkal(见 doc 6549/6551);
- 要生态最广、客户端兼容资料最多 → Radicale(见 doc 6423/6425);
- 注意 Xandikos 的 multi-user 模式启动即打印
Multi-user mode is experimental(实测逐字),生产多用户请勿押注。
五、已知边界与坑(实测)
- REPORT 必须带
Depth: 1:不带时返回空 multistatus(实测),curl 手写请求常见坑; - 无管理 UI:建日历靠 MKCALENDAR 或
create-collectionCLI; - htpasswd 红线:
--htpasswd强制搭配--autocert,明文 HTTP 直接拒绝启动(实测报错逐字见部署篇);$apr1$/crypt 哈希格式拒绝,仅 bcrypt/{SHA}; - 可选依赖不装即报错退出:cryptography(--autocert)、py_vapid(--webdav-push)、aiohttp-openmetrics(--metrics-port)、bcrypt、qrcode(根页二维码)——pipx 主安装仅含 6 个核心依赖;
- 官网 docker 示例已过期:
docker run ... --defaults缺-d直接报错,正确姿势见部署篇; - 容器 uid=1000:bind mount 宿主目录需改属主/权限,否则
PermissionError: /data/user退出(实测)。
六、客户端对接速览(官网 clients 页 + 实测)
已验证清单:Vdirsyncer、evolution、DAVx5、Apple iOS、CardBook、Tasks、SOGo connector(Thunderbird)、aCALdav syncer、caldavzap/carddavmate、pycardsyncer。支持 well-known 发现的客户端填根 URL 即可;Thunderbird Lightning 需直填日历 URL(如 http://host:8165/user/calendars/work/,实测该 URL 即标准 CalDAV 端点)。对接细节见《Xandikos 0.4.10 部署指南》。
七、版本与文档导航
- 0.4.10(2026-10-17)为本文基线;0.4.x 系列完成 CLI 子命令化重构(serve/create-collection/import-imip/multi-user)与 iMIP/milter、WebDAV-Push 落地;
- 本专栏后续篇:《Xandikos 0.4.10 部署指南》(pipx+Docker 双形态与协议闭环)、《Xandikos 0.4.10 配置参数详解》(serve 全参数与改参验证闭环)、《Xandikos 0.4.10 常用 CLI 命令与工具详解》(create-collection/import-imip/milter/Git 备份恢复)。