Xandikos 0.4.10 介绍与选型指南

Xandikos 0.4.10(jelmer/xandikos,Python CalDAV/CardDAV 服务器)认知篇:Git 事件溯源架构实测验证(每变更一 commit、etag=blob SHA)、仓库与社区数据实查纠偏、协议能力矩阵,与 Radicale/Baïkal/DAViCal CalDAV 三强量化选型互链。

XandikosXandikosCalDAVCardDAVgit自托管Python2026/11/02

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
LicenseGPLv3+
社区数据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.10Radicale 3.9(doc 6423)Baïkal 0.10.1(doc 6549)DAViCal 1.1.13(doc 6815)
语言/栈Python/aiohttp+DulwichPythonPHP+SQLite/MySQLPHP+PostgreSQL
存储后端Git 仓库(事件溯源)文件系统(Radicale 自有)关系库PostgreSQL
历史/回滚原生 git log/checkout无无无(依赖 DB 备份)
备份方式拷目录/git clone拷目录导 SQLpg_dump
管理界面无(根页只读概览+CLI)可选 Web 管理Web UI 完整Web admin 完整
多用户/权限单用户为主;multi-user 实验性外部 auth 灵活单用户/少用户设计企业级 ACL/组/资源
自动调度 iMIP内置(LMTP/milter/sendmail)不支持不支持支持(邮件网关)
部署形态pipx 单命令 / 官方镜像pip+systemdDocker 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(实测逐字),生产多用户请勿押注。

五、已知边界与坑(实测)

  1. REPORT 必须带 Depth: 1:不带时返回空 multistatus(实测),curl 手写请求常见坑;
  2. 无管理 UI:建日历靠 MKCALENDAR 或 create-collection CLI;
  3. htpasswd 红线:--htpasswd 强制搭配 --autocert,明文 HTTP 直接拒绝启动(实测报错逐字见部署篇);$apr1$/crypt 哈希格式拒绝,仅 bcrypt/{SHA};
  4. 可选依赖不装即报错退出:cryptography(--autocert)、py_vapid(--webdav-push)、aiohttp-openmetrics(--metrics-port)、bcrypt、qrcode(根页二维码)——pipx 主安装仅含 6 个核心依赖;
  5. 官网 docker 示例已过期:docker run ... --defaults 缺 -d 直接报错,正确姿势见部署篇;
  6. 容器 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 备份恢复)。
Xandikos 0.4.10 介绍与选型指南 - Quzuo