Baikal 0.10.1 介绍与选型指南

Baikal 认知篇:轻量 CalDAV+CardDAV 服务器的架构、功能特性与量化选型对比(Radicale/Davis/Nextcloud),核心论断经 0.10.1 实例实测验证,信息溯源 2026-10-30。

BaikalBaikalCalDAV日历自托管2026/10/30

Baikal 0.10.1 介绍与选型指南

目标:面向「想把日历(CalDAV)与通讯录(CardDAV)同步服务收回自己服务器」的读者,讲清 Baikal 是什么、架构如何、功能边界在哪,并给出与 Radicale、Davis、Nextcloud 的量化选型对比。软件定位与版本信息全部联网溯源自官方渠道(查询日期 2026-10-30),架构与协议行为均在本地 Baikal 0.10.1 真实实例上实测验证,部署过程见《Baikal 0.10.1 Docker Compose 部署指南》。

一、环境信息

本篇为认知篇,主体信息联网溯源,核心论断以本地实测佐证;取证口径如下:

  • 软件名称:Baikal(官方文档站 sabre.io/baikal,GitHub 仓库 sabre-io/Baikal,官网域名 baikal-server.com 重定向至 sabre.io/baikal)
  • 当前最新稳定版:0.13.0(GitHub Releases Atom 流 github.com/sabre-io/Baikal/releases.atom 实查,feed 更新时间 2026-10-18T17:54:31Z,0.13.0 条目时间 2026-10-19;查询日期 2026-10-30)
  • 本文实测版本:0.10.1(2024-11-10 发布,官方 tar 包 baikal-0.10.1.tar.gz,包内 composer.json 实查依赖 php: ^8.1、sabre/dav: ~4.7.0)
  • 开源许可:GNU GPL v3(官网「It is released under the GNU GPL v3 license」原句;本地实例 Web Admin 后台 License and credits 区域同步显示 GPL v3)
  • 运行语言与依赖:PHP 实现,基于 sabre/dav 4.7 框架;数据库支持 SQLite / MySQL / PostgreSQL 三选一(官网原句:The data can be stored in a MySQL, a PostgreSQL or an SQLite database)
  • 社区热度:GitHub 星数 3.4k(shields.io 徽章 img.shields.io/github/stars/sabre-io/Baikal.json 返回 3.4k,查询日期 2026-10-30)
  • 版本节奏(GitHub Releases Atom 近 8 个版本实查,查询日期 2026-10-30):0.13.0(2026-10-19)、0.12.1(2026-08-05)、0.12.0(2026-08-03)、0.11.1(2025-11-30)、0.11.0(2025-11-29)、0.10.1(2024-11-10)、0.9.5(2024-03-20)、0.9.4(2023-11-15)
  • 主要信息来源:sabre.io/baikal 官网、GitHub Releases Atom、shields.io 徽章 API、本地 0.10.1 实例(配置文件、数据库、HTTP 协议实测)

二、软件概述

Baikal 是一个用 PHP 编写的轻量级 CalDAV + CardDAV 服务器,由 fruux GmbH(sabre/dav 框架的维护方)与 Net Gusto 联合开发,现由 sabre-io 组织在 GitHub 上社区维护。官方对它的定位是一句话(sabre.io/baikal 首页原文):

Baïkal is a lightweight CalDAV+CardDAV server. It offers an extensive web interface with easy management of users, address books and calendars.

翻译过来:Baikal 是一个轻量的 CalDAV+CardDAV 服务器,提供完善的 Web 管理界面,可以轻松管理用户、地址簿和日历。它解决的痛点与所有自托管 DAV 服务端一致——把 Thunderbird、DAVx⁵、Apple 日历/通讯录等客户端默认托管在 Google、iCloud、Microsoft 侧的日程与联系人数据收回自己的服务器。官网明确列出的客户端兼容清单:iOS、macOS、Android 上的 DAVx⁵、Mozilla Thunderbird,「以及一切支持 CalDAV/CardDAV 的应用」。

与同领域的 Radicale(Python 系极简路线,见《Radicale 介绍与选型指南》)相比,Baikal 的差异化标签非常清晰:内置一个功能完整的管理后台。用户、日历、地址簿、数据库切换、管理员密码都能在浏览器里点出来,而不必手改配置文件;代价是需要一个 PHP 运行环境与一个(可选的)外部数据库。

💡 技术拓展:CalDAV/CardDAV 与 WebDAV 的关系。三者是「基础协议 + 领域扩展」的关系:WebDAV(RFC 4918)定义了通用的资源集合读写;CalDAV(RFC 4791)在其上定义了日历集合与 iCalendar 事件的语义(含忙闲查询、邀约调度);CardDAV(RFC 6352)定义了地址簿与 vCard 联系人的语义。Baikal 底层使用 sabre/dav 一次性实现了这三个协议,一个服务入口(dav.php)同时承载两类数据。

三、核心架构

以下架构信息均在本地 Baikal 0.10.1 实例上验证(配置文件实读、HTTP 请求实测、数据库实查),非纯文档转述。

3.1 运行形态:PHP 应用 + Web 服务器 + 单数据库

Baikal 本体是一个标准 PHP 应用,解压即用,运行时由三类角色组成:

  • Web 服务器 + PHP-FPM:对外提供 HTTP/HTTPS 服务,官方部署包内置 Apache 与 nginx 两种重写规则(.well-known/caldav、.well-known/carddav 重定向到 dav.php);
  • PHP 应用目录:程序与数据分离——程序在安装目录,可变数据集中在 config/(配置)与 Specific/(数据库文件等)两个目录,这两个目录就是升级与备份的全部对象;
  • 数据库:SQLite(零依赖,默认)/ MySQL / PostgreSQL 三选一,全部表结构由官方 SQL 文件定义。

实测确认的关键行为:配置在每次请求时重新解析。实测直接修改配置文件(把数据库后端从 SQLite 切到 MySQL)后不重启任何进程,下一个请求立即按新配置执行——这意味着配置变更「改完即生效」,也意味着配置文件语法错误会立即影响所有请求。

3.2 URL 入口与协议层结构

本地实例实测(curl PROPFIND,路径为文档示意域名):

curl -s -u root:q1w2e3r4 -X PROPFIND -H 'Depth: 1' \
  https://dav.example.com/dav.php/ | grep -oE '<d:href>[^<]+</d:href>'

实测回显:

<d:href>/dav.php/</d:href>
<d:href>/dav.php/principals/</d:href>
<d:href>/dav.php/calendars/</d:href>
<d:href>/dav.php/addressbooks/</d:href>

协议层是标准 sabre/dav 的三层树:principals/(用户主体)、calendars/(每个用户一个日历家目录,内含 default/ 默认日历与 inbox/、outbox/ 调度集合,实测创建用户后自动生成)、addressbooks/(每个用户一个通讯录家目录,内含 default/ 地址簿)。每个用户可以在自己的家目录下继续创建多个日历/地址簿(实测 MKCALENDAR 创建第二个日历返回 201 Created,重复创建返回 405 Method Not Allowed)。

.well-known 重定向实测(RFC 6764 服务发现):

curl -s -i https://dav.example.com/.well-known/caldav | grep -i '^location'

实测回显:

Location: https://dav.example.com/dav.php

3.3 认证与数据模型

  • Web 管理后台认证:登录名固定为 admin,密码在初始化向导中设置。实测在源码中确认:管理员密码以 sha256('admin:' + auth_realm + ':' + password) 存入配置文件;实测复算 sha256('admin:BaikalDAV:q1w2e3r4') 与配置文件中的哈希逐字符一致。
  • DAV 协议认证:走 users 数据表,密码以 Digest 兼容格式 md5(username:realm:password) 存储(auth_realm 默认 BaikalDAV)。实测:管理后台创建用户 root/q1w2e3r4 后,数据库中 digesta1 字段值与 md5('root:BaikalDAV:q1w2e3r4') 计算结果逐字符一致;HTTP 层以 Authorization: Basic 头通过验证。
  • 数据表结构:0.10.1 的 SQLite 库实测共 14 张表:users、principals、calendars、calendarinstances、calendarobjects、calendarchanges、calendarsubscriptions、addressbooks、cards、addressbookchanges、groupmembers、locks、propertystorage、schedulingobjects——即 sabre/dav 官方标准 schema,日历与通讯录各一套「实体表 + 变更表」,另加锁表、属性表与调度表。

3.4 插件体系

实测读取 0.10.1 运行环境中装配的插件清单:CalDAV、CardDAV 两大协议插件之外,默认启用了 ICSExportPlugin(日历整体导出 ICS)、VCFExportPlugin(地址簿整体导出 VCF)、Sync(sync-collection 增量同步)、Schedule(邀约调度,配合 invite_from 发件地址发邮件)、Sharing(日历/地址簿共享)。实测验证了两个导出插件:

curl -s -o /dev/null -w '%{http_code} %{content_type}\n' -u root:q1w2e3r4 \
  'https://dav.example.com/cal.php/calendars/root/teamcal/?export'

实测回显:

200 text/calendar;charset=UTF-8

地址簿侧 ?export 返回 200 text/directory;charset=UTF-8(VCF 格式)。这两个端点在做数据迁移时非常实用。

四、功能特性

以下特性均在 0.10.1 实例上实测确认(操作方式与回显详见姊妹篇):

功能域实测结论
CalDAV 日历完整支持:PROPFIND 枚举、MKCALENDAR 建日历、PUT/GET 事件、REPORT calendar-query 过滤查询、If-Match ETag 并发控制(过期 ETag 实测返回 412)
CardDAV 通讯录完整支持:MKCOL 建地址簿、PUT/GET vCard、REPORT addressbook-query、?export 整簿导出
增量同步sync-collection REPORT 可用,实测返回 sync-token(形如 http://sabre.io/ns/sync/2),客户端可按 token 增量拉取变更
Web 管理后台Dashboard(版本/服务状态/用户/日历/事件/通讯录统计)、用户管理(增删改、按用户管理日历与地址簿)、系统设置、数据库设置四个板块,实测全程可用
多用户隔离实测跨用户读操作返回外层 207 但资源级 d:status 为 403 Forbidden,写操作直接 403——数据按所有者严格隔离
邀约邮件配置 invite_from 发件地址后,IMIP 插件通过系统邮件通道(如 msmtp)发送会议邀请
数据库三选一SQLite 开箱即用;MySQL/PostgreSQL 通过导入官方 db.sql 后切换配置文件生效,均实测通过

五、快速开始(最小可用示例)

完整部署见《Baikal 0.10.1 Docker Compose 部署指南》,此处给出「装完之后的第一小时」最小路径:

  1. 初始化向导:浏览器打开 https://dav.example.com/admin/install/,第一步设置管理员密码(本文示例账号 admin / q1w2e3r4),第二步选数据库(SQLite 默认路径即可,实测向导页标题为「Baïkal Database setup」),第三步向导页明确提示「Baïkal is now installed, and its database properly configured. For security reasons, this installation wizard is now disabled.」——完成后安装器自动写死 Specific/INSTALL_DISABLED 标记文件防止重放。
  2. 登录后台:https://dav.example.com/admin/,用 admin/q1w2e3r4 登录,Dashboard 实测回显(节选):
About this system | Version | This systems runs Baïkal 0.10.1
Services | Web admin On | CalDAV On | CardDAV On
Statistics | Registered users 3 | Number of calendars 6 | Number of events 3 | Number of address books 5 | Number of contacts 3
  1. 建用户:Users → + Add user,实测填写 username/displayname/email/password 后回显「User root has been created.」,新用户自动获得 default 日历与 default 地址簿。
  2. 协议自检:一条命令验证 DAV 入口(输入与回显见 3.2 节),返回 207 即服务可用。
  3. 接客户端:Thunderbird 日历、DAVx⁵、iOS 日历均填服务器地址 + 用户名密码即可;实测 .well-known 发现路径已内置,客户端只需填根地址。

六、适用场景与限制

适合:个人与小团队的私有日历/通讯录同步;需要浏览器里点出用户与权限管理、不想手改配置文件的 PHP 技术栈用户;需要 MySQL/PostgreSQL 做集中备份与接管的场景;已有 nginx/Apache 想挂一个子路径或子域名的存量服务器。

限制(全部实测或官方文档确认):

  1. 没有命令行工具:0.10.1 不提供任何 CLI(对比 Radicale 的 radicale-admin),用户增删、密码重置只能走 Web 后台或直接操作数据库;也没有管理 REST API,一切管理动作都是表单 POST。
  2. 升级是手工活:官方升级路径是「下载新包 → 替换程序目录 → 保留 config/ 与 Specific/ → 核对 configured_version」,没有自动迁移器;0.10.1(2024-11)到 0.13.0(2026-10)跨越了 0.11/0.12/0.13 三条线,跨版本升级需逐版核对升级说明。
  3. 版本节奏偏慢:Releases 时间线显示 2024-11 到 2025-11 有约一年的空档(0.10.1 → 0.11.0),虽已恢复活跃(2026 年连发 0.12/0.13),但对比 Nextcloud 的月度节奏仍属「低频稳定」路线。
  4. 实测发现的管理缺陷:0.10.1 Web 后台「Database settings」页从 SQLite 切换到 MySQL 会触发 PHP 异常(形态构建与校验逻辑读值时机不一致,实测异常全文与根因见《Baikal 0.10.1 配置参数详解》常见问题节),切库需直改配置文件——已在文中给出完整可用流程。
  5. 单实例架构:无官方集群方案,多实例共享同一数据库不被官方支持;高可用只能靠数据库层与反向代理层自己做。

七、同类选型对比

与同定位产品做量化对比(社区数据为查询日快照,来源 shields.io 徽章 API 与各 GitHub 仓库,查询日期 2026-10-30;Radicale 数据同步自其官方仓库与 PyPI):

维度Baikal 0.10.1Radicale 3.9DavisNextcloud(日历/联系人模块)
开源许可GPL-3.0GPL-3.0+MIT(GitHub LICENSE)AGPL-3.0
技术栈PHP ^8.1 + sabre/dav ~4.7Python ≥3.9 单进程PHP(基于 sabre/dav 二次封装)PHP 全栈(LAMP)
外部数据库SQLite/MySQL/PostgreSQL 三选一不需要(纯文件存储)SQLite/MySQL需要 MariaDB/PostgreSQL
Web 管理后台完整(用户/日历/地址簿/数据库/设置)简易内置页有,较简完整(全家桶级)
命令行工具无radicale-admin 等无occ(功能全面)
管理用 REST API无无无OCS API
共享与协作Sharing 插件(日历/地址簿共享)+ 调度邀约owner/自定义规则基础丰富(共享/闲忙/会议室)
GitHub stars(2026-10-30 快照)3.4k(sabre-io/Baikal)5.2k(Kozea/Radicale)762(tchapi/davis)37k(nextcloud/server)
版本节奏低频(2024-11→2025-11 空档后恢复)持续(3.9.0 于 2026-10-25 发布)低频高频(月度级)
适合谁要 Web 后台的 PHP 用户、多库选型需求极简派、低配设备、协议纯净sabre/dav 生态集成者已用 Nextcloud 全家桶的团队

选型建议:

  • 想要「浏览器里点出来的管理后台」+ 数据库可选 → Baikal,本篇与姊妹篇覆盖其完整生命周期;
  • 追求最少依赖、装完即忘、设备性能紧张 → Radicale(零数据库依赖是同档位独有优势,对比详见《Radicale 介绍与选型指南》);
  • 已在用 Nextcloud 做文件与协作 → 直接启用其 Calendar/Contacts 应用,不要再引入独立 DAV 服务(对比见《Nextcloud 介绍与选型指南》);
  • 是 sabre/dav 生态的 PHP 开发者、想把 DAV 能力嵌进自己的应用 → Davis 或直接基于 sabre/dav 库开发(Baikal 本身就是这条路线的标杆成品)。

八、参考链接

站内相关阅读: