Radicale 3.9 配置参数详解

Radicale 3.9.0 全部 12 个配置 section(server/auth/rights/storage/web/logging/headers 等)逐参数详解,默认值实取自安装包,附生产配置模板与实测排障。

RadicaleRadicaleCalDAV日历2026/10/30

Radicale 3.9 配置参数详解

目标:逐一讲清 Radicale 3.9.0 全部 12 个配置 section(server/encoding/auth/group/rights/storage/sharing/hook/web/logging/headers/reporting)的参数含义、默认值与生产建议,并给出可直接落地的生产配置模板。参数默认值取自本机安装的 radicale 3.9.0 包内配置模式(DEFAULT_CONFIG_SCHEMA)实取,配置生效行为经 Ubuntu 22.04 实测。

一、环境信息

  • 操作系统:Ubuntu 22.04(x86_64)
  • Radicale:3.9.0(venv 安装于 /opt/radicale-venv,安装过程见《Ubuntu 22.04 安装 Radicale 3.9 指南(pip + venv + systemd)》)
  • 主配置文件:/etc/radicale/config(INI 格式)
  • 数据目录:/var/lib/radicale/collections
  • 参数口径:本文「默认值」全部实取自 radicale 3.9.0 安装包内 radicale/config.py 的 DEFAULT_CONFIG_SCHEMA(3.9.0 真实内置值,非文档转述);「实测」指在本环境真实执行并记录回显。
  • 服务管理:systemd(unit 名 radicale.service)

二、前置条件

阅读与验证本文需要:

  1. 已按《Ubuntu 22.04 安装 Radicale 3.9 指南(pip + venv + systemd)》完成安装并确认服务运行:
systemctl is-active radicale    # 确认服务在跑

实测回显:

active
  1. 了解 INI 配置格式([section] 分节、key = value 键值对)与 systemd 基本操作(systemctl restart/daemon-reload)。

三、参数查看与修改方式

Radicale 的配置有三个来源层,优先级从高到低:命令行参数 > 配置文件 > 内置默认值。三者键名一一对应(如配置键 [server] hosts 对应命令行 --hosts),运维中最常用的是「配置文件为主、命令行临时覆盖」。

3.1 查看全部命令行参数

/opt/radicale-venv/bin/radicale --help

实测回显(节选,总选项与 server 段):

usage: radicale [OPTIONS]

options:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  --verify-storage      check the storage for errors and exit
  --verify-item VERIFY_ITEM
                        check the provided item file for errors and exit
  --verify-sharing      check the sharing database for errors and exit
  -C [CONFIG ...], --config [CONFIG ...]
                        use specific configuration files
  -D, --debug           print debug information

server:
  backend specific options omitted

  --server-type VALUE   server to use (builtin|hypercorn), hypercorn also
                        serves H2C and needs the "h2" extra (pip install
                        radicale[h2])
  -H VALUE, --hosts VALUE, --server-hosts VALUE
                        set server hostnames including ports
  --server-max-connections VALUE
                        maximum number of parallel connections
  ...

--help 输出按 section 分组(server/auth/storage/web/logging/headers…),每个键都有对应的 --<section>-<key> 长选项,帮助文本中标注了默认值(如 --server-max-content-length 默认 100 Mbyte)。全部命令行用法见《Radicale 3.9 常用 CLI 命令与运维详解》。

3.2 修改配置的标准流程

改 /etc/radicale/config 后必须重启服务才生效:

vi /etc/radicale/config    # 编辑配置
systemctl restart radicale    # 重启生效
systemctl is-active radicale    # 确认重启成功

实测回显(演示把日志级别改为 debug 再改回 info 的完整循环):

sed -i "s/^level = info/level = debug/" /etc/radicale/config    # 日志级别 info → debug
systemctl restart radicale
(重启后无输出,is-active 返回 active 即成功)
journalctl -u radicale --no-pager -n 3    # debug 级别下日志明显变多
Oct 30 02:50:50 radicale radicale[2857]: [2857] [INFO] rights type is 'radicale.rights.owner_only'
Oct 30 02:50:50 radicale radicale[2857]: [2857] [INFO] rights type is 'radicale.rights.owner_only'
Oct 30 02:50:51 radicale radicale[2857]: [2857/Thread-1 (process_request_thread)] [INFO] MKCOL request for '/admin/contacts/' received from 10.89.57.1 using 'curl/8.18.0' HTTP/1.1

⚠️ 注意:配置文件写错(如 section 名拼错、布尔值写成 yes/1 之外的字符串)时,服务可能启动失败。此时 systemctl status radicale 显示 failed,journalctl -u radicale -n 30 里会有具体解析错误行,改正后再次 systemctl restart radicale 即可。

四、参数总览

Radicale 3.9.0 共 12 个 section。下表为全景速览(各 section 的默认值均实取自 3.9.0 包内 DEFAULT_CONFIG_SCHEMA):

Section职责关键默认值(3.9.0 实取)
[server]监听地址/连接限制/SSL/反代适配hosts = localhost:5232、ssl = False、max_connections = 8
[encoding]请求响应与本地存储编码request = utf-8、stock = utf-8
[auth]认证后端与口令缓存/延迟type = denyall(默认拒绝一切)、delay = 1
[group]用户组查询(配合组权限)type = none
[rights]权限模型type = owner_only
[storage]文件存储后端/缓存/同步钩子filesystem_folder = /var/lib/radicale/collections
[sharing]集合共享(token/map)type = none(默认关闭)
[hook]变更通知(RabbitMQ/SMTP)type = none(默认关闭)
[web]内置 Web 界面type = internal
[logging]日志级别与脱敏level = info、mask_passwords = True
[headers]自定义 HTTP 响应头(空,按需添加)
[reporting]REPORT 查询上限max_expand_occurrence = 10000

💡 技术拓展:配置「层级合并」是 INI 类服务器的通用设计——

方式优先级典型用途
命令行参数最高临时调试、脚本启动
配置文件(-C 指定或默认路径)中生产持久配置(本文主线)
内置默认值最低兜底,不写即用默认

Radicale 还允许 -C 传入多个配置文件(后者覆盖前者同名键),便于「基础配置 + 环境差异化配置」分层管理。本文方案采用 /etc/radicale/config 单文件,理由是服务器场景无需多环境。

五、核心参数分类详解

以下按 section 逐组讲解。加粗的是生产环境最该关注的键。

5.1 [server]:监听与连接

控制服务如何对外提供服务,是所有部署第一步要改的 section。

参数默认值(实取)说明
hostslocalhost:5232监听地址与端口,可写多个(IPv4/IPv6)。生产对外服务改 0.0.0.0:5232,纯反代后端改 127.0.0.1:5232
typebuiltinHTTP 服务实现:builtin(内置线程服务)或 hypercorn(需 pip install radicale[h2],支持 H2C)
max_connections8最大并行连接数。轻量定位的默认值,小团队可适当调大
max_content_length100000000请求体上限(字节,100MB)。防大包攻击
max_resource_size10000000单资源上限(字节,10MB)。事件/联系人文件超过会被拒
max_vevent_rrule_occurrence10000单条 RRULE 重复展开上限(防恶意超长重复规则耗尽资源)
delay_on_error1服务端 5xx 后的基础延迟秒数(缓解雪崩)
timeout30socket 超时秒数
sslFalse是否启用内置 TLS。开启后配 certificate/key 两项;置于反代之后时保持 False
certificate / key/etc/ssl/radicale.cert.pem / /etc/ssl/radicale.key.pem证书与私钥路径(ssl = True 时生效)
certificate_authority(空)双向 TLS 时校验客户端的 CA
protocol / ciphersuite(空)TLS 协议版本与密码套件(OpenSSL/Apache 格式),留空用系统默认
script_name(空)反代场景下要剥离的 URI 前缀;留空则自动读取 HTTP_X_SCRIPT_NAME/SCRIPT_NAME
validate_user_value / validate_path_valueminimal用户名/路径的校验强度(none/minimal/unicode-letter/unicode-none/strict),3.9 新增的安全加固键

💡 技术拓展:对外 TLS 放在哪一层?常见三选——

方案说明取舍
Radicale 内置 SSL(ssl = True)服务自己上 TLS配置简单,但证书续期要自己处理
Nginx/Caddy 反代终结 TLS反代对外 443,对内 HTTP 5232证书统一管理,最主流(本文推荐)
不加密(内网裸奔)仅限受信内网快捷但明文传输口令

本文实测环境用内置 HTTP(ssl = False)+ 直连 5232 验证协议链路;生产对外推荐反代终结 TLS,可参考《Ubuntu 22.04 安装 Nginx 指南(apt/官方源/编译多方案)》或《Ubuntu 22.04 安装 Caddy 指南(apt 官方源 编译多方案)》。

5.2 [auth]:认证后端

Radicale 3.9 支持的认证后端(type 可选值实取自包内配置):none、remote_user、http_x_remote_user、http_remote_user、denyall、htpasswd、ldap、imap、oauth2、pam、dovecot。

参数默认值(实取)说明
typedenyall认证方式。默认拒绝一切请求(安全默认),必须显式配置。反代认证场景选 http_x_remote_user/remote_user
htpasswd_filename/etc/radicale/usershtpasswd 口令文件路径
htpasswd_encryptionautodetect口令哈希类型(autodetect/md5/bcrypt/argon2/plain);bcrypt/argon2 需装对应扩展
htpasswd_cacheFalse缓存口令文件内容(频繁登录场景提速;改口令文件后需重启)
realmRadicale - Password Required401 弹窗显示的域描述
delay1认证失败后的延迟秒数(防爆破)
cache_loginsfalse是否缓存登录结果
cache_successful_logins_expiry15成功登录缓存秒数
cache_failed_logins_expiry90失败登录缓存秒数
strip_domainFalse去掉用户名中的域名部分(如 user@x.com → user)
lc_username / uc_usernameFalse用户名统一小写/大写(对接大小写不敏感的认证源时开启)
urldecode_usernameFalse对用户名做 URL 解码(客户端发 URL 编码邮箱时开启)
ldap_*见左LDAP 系列参数:ldap_uri(默认 ldap://localhost)、ldap_base、ldap_filter(默认 (cn={0}))、ldap_security(none/tls/starttls)、ldap_ssl_verify_mode(REQUIRED)、组过滤 ldap_group_* 等
imap_host / imap_securitylocalhost / tls复用 IMAP 服务器认证(如邮件系统已有账号体系)
oauth2_token_endpoint / oauth2_client_id(空) / radicaleOAuth2 令牌内省端点对接
pam_service / pam_group_membershipradicale / (空)PAM 系统用户认证
dovecot_*socket/端口系列对接 Dovecot SASL 认证(邮件栈常用)
remote_ip_sourceREMOTE_ADDR传给认证后端的来源地址字段(反代后取 X-Forwarded-For 类字段时调整)

⚠️ 注意:本文 B1 安装篇实测采用 type = htpasswd + htpasswd_encryption = md5——零额外依赖且 htpasswd 命令原生支持;LDAP/IMAP/PAM 等后端适合企业已有账号体系的场景,切换后需重启服务。

5.3 [group]:用户组

参数默认值(实取)说明
typenone组查询方式:none(不用组)/from_auth(从认证后端取组,如 LDAP 组)/htgroup(本地组文件)
htgroup_filename/etc/radicale/groupshtgroup 组文件路径(type = htgroup 时用)
htgroup_cacheFalse组文件缓存开关
group_collections_folderGROUPS权限规则中组集合目录名(配合 from_file 规则实现组共享)

组功能本身默认关闭(type = none);个人/小团队单用户模式无需关注,需要「按组授权日历」时启用。

5.4 [rights]:权限模型

参数默认值(实取)说明
typeowner_only权限后端:owner_only(默认,用户只读写自己的集合)/owner_write(他人可读自己的集合)/authenticated(登录即可读写一切)/from_file(自定义规则文件)
permit_delete_collectionTrue允许删除集合
permit_overwrite_collectionTrue允许覆盖集合
file/etc/radicale/rightstype = from_file 时的规则文件路径

💡 技术拓展:3.9 的权限字母体系(实取自 3.9.0 包内 rights 模块常量 INTERNAL_PERMISSIONS = "RrifWwDdOoTtMmPpEel")比旧版细得多,常用的几个:大写 R/W 为元数据级读/写(能否看到集合、能否创建/删除集合本体),小写 r/w 为内容级读/写(能否读写集合内的事件/联系人)。实测验证:默认 owner_only 下,用户 principal 根(/admin/)授 RW,两层路径(/admin/calendar/)授 rw——这正是「MKCOL 无类型集合报 403 缺 W」现象的根因(详见 B1 篇 FAQ Q2)。

5.5 [storage]:文件存储

参数默认值(实取)说明
typemultifilesystem存储后端(文件系统多文件模式,官方唯一内置后端)
filesystem_folder/var/lib/radicale/collections数据根目录,备份/迁移的核心对象
filesystem_cache_folder(空)缓存独立目录(下面三个 use_cache_subfolder_* 开启时才需要)
use_cache_subfolder_for_item / for_history / for_synctokenFalse把对应缓存移出集合目录、集中存放(便于备份时排除缓存)
use_mtime_and_size_for_item_cacheFalse用 mtime+size 代替 SHA256 做条目缓存校验(提速)
folder_umask(空)新建目录的 umask(空=系统默认)
max_sync_token_age2592000sync-token 文件最大保留 30 天(过期清理)
skip_broken_itemTrue跳过损坏条目而不是抛异常中断(容错)
hook(空)存储变更后执行的本地命令(与 [hook] section 的消息通知是两回事,这是本地 shell 命令钩子)
strict_preconditionsFalsePUT 的 If-Match/If-None-Match 前置条件严格校验
predefined_collections(空)新用户首登时自动预建的集合模板
_filesystem_fsyncTrue请求内同步刷盘(保证崩溃一致性,性能换安全)

⚠️ 注意:filesystem_folder 改动后必须保证该目录属主是运行用户(本文为 radicale),并重启服务;更换数据目录时先把旧目录完整拷贝再改配置。

5.6 [sharing]:集合共享(3.9 新增能力)

参数默认值(实取)说明
typenone共享数据库类型(默认整体关闭共享)
database_path(空)共享数据库文件路径
collection_by_token / collection_by_mapfalse / false按 token / 按映射共享集合
permit_create_token / permit_create_mapfalse / false允许用户创建对应共享
default_permissions_create_token / default_permissions_create_maprp / r创建共享时的默认权限
permit_properties_overlay / enforce_properties_overlayfalse / true共享时的属性覆盖策略
conversion_bday_*见配置联系人生日 → 日历事件的转换模板(生日日历特性)

5.7 [hook]:变更通知(RabbitMQ/SMTP)

参数默认值(实取)说明
typenone通知后端:none / RabbitMQ / SMTP(邮件)
rabbitmq_endpoint / rabbitmq_topic / rabbitmq_queue_type(空)RabbitMQ 对接三件套
smtp_server / smtp_port / smtp_security(空)/ 25 / noneSMTP 服务器与加密方式(none/tls/starttls)
smtp_username / smtp_password(_file)(空)SMTP 认证(密码建议用 smtp_password_file 落文件而非明文配置)
from_email(空)通知邮件发件人
mass_emailFalse群发模式(一封给全部参会人 vs 每人一封)
new_or_added_to_event_template / deleted_or_removed_from_event_template / updated_event_template(内置模板)事件创建/删除/更新时发给参会人的邮件正文模板,支持 $attendee_name/$event_title 等占位符

典型用途:把 Radicale 的日程变更推送到内部消息总线(RabbitMQ,运行时依赖 pika 已随主包装好)或给参会人发邮件。

5.8 [web] 与 [logging] 与 [headers] 与 [reporting]

[web]:

参数默认值(实取)说明
typeinternalWeb 界面后端:internal(内置界面)或 none(关闭)。访问路径 /.web/
prefer_browser_loginFalse优先用浏览器登录表单而非 HTTP Basic 弹窗

[logging]:

参数默认值(实取)说明
levelinfo日志级别(debug/info/warning/error;排障切 debug,实测见三、3.2)
mask_passwordsTrue日志中口令脱敏(保持默认,勿关)
limit_content3000日志包裹内容的字符上限
bad_put_request_contentFalse记录坏 PUT 请求体(排障时可开)
backtrace_on_debugFalsedebug 级别输出堆栈
request_header/content_on_debug、response_header/content_on_debugFalsedebug 级别记录请求/响应头与体(深度排障用)
profilingnone性能分析日志(info 级别输出 top 函数)
rights_rule_doesnt_match_on_debugFalsedebug 时输出未命中的权限规则(调 from_file 规则利器)

[headers]:默认空。按需添加自定义 HTTP 响应头,键即头名:

[headers]
X-Frame-Options = DENY

[reporting]:

参数默认值(实取)说明
max_expand_occurrence10000REPORT expand 单事件展开上限
max_freebusy_occurrence10000free-busy 查询展开上限
freebusy_view_past_days / freebusy_view_future_days365 / 365忙闲视图向前/向后覆盖天数

5.9 [encoding]

参数默认值(实取)说明
requestutf-8请求/响应编码
stockutf-8本地集合文件存储编码

保持默认即可;仅在与老旧客户端对接出现乱码时调整。

六、生产配置模板

以下模板适用于「2C4G 云服务器、NVMe SSD、小团队(≤50 人)个人日历/联系人自托管」场景,可直接替换到 /etc/radicale/config(示例域名 dav.example.com、反代后端形态、htpasswd 认证):

[server]
hosts = 127.0.0.1:5232
max_connections = 16

[auth]
type = htpasswd
htpasswd_filename = /etc/radicale/users
htpasswd_encryption = bcrypt
delay = 1
cache_logins = true

[rights]
type = owner_only
permit_delete_collection = True

[storage]
filesystem_folder = /var/lib/radicale/collections
use_cache_subfolder_for_item = True
use_cache_subfolder_for_history = True
use_cache_subfolder_for_synctoken = True
skip_broken_item = True

[web]
type = internal

[logging]
level = warning
mask_passwords = True

[headers]
X-Frame-Options = DENY

[reporting]
max_expand_occurrence = 10000

模板要点解说:

  1. hosts = 127.0.0.1:5232:只监听回环,对外一律走反代的 443 TLS(Nginx/Caddy 均可,见《Ubuntu 22.04 安装 Caddy 指南(apt 官方源 编译多方案)》)。
  2. htpasswd_encryption = bcrypt:需先在 venv 内 pip install radicale[bcrypt];口令文件改用 htpasswd -B 生成。若不愿装扩展,退回 md5(MD5-APR1)。
  3. 缓存子目录三开关:把缓存移出集合目录,备份时整目录拷贝 collections 即可少拷缓存、且可对缓存目录单独排除。
  4. level = warning:正常运行少刷日志,排障时临时调回 info/debug。

七、常见问题(FAQ)

Q1:改了配置不生效? 三个检查点:① 是否 systemctl restart radicale(改文件不重启不生效);② 键名是否写对(拼错会被忽略并回退默认值,journalctl 里留意警告);③ 是否被更高优先级的命令行参数覆盖(检查 unit 的 ExecStart 是否带了 -- 参数)。

Q2:[auth] 保持默认 denyall 会怎样? 所有请求(包括 Web 界面)一律 401。这是 3.9 的安全默认设计,见 B1 篇 FAQ Q1 的实测现象。

Q3:bcrypt 类型报错「bcrypt 未安装」? htpasswd_encryption = bcrypt 依赖可选扩展:/opt/radicale-venv/bin/pip install radicale[bcrypt] 后重启;或改用 md5(无依赖)。argon2 同理装 radicale[argon2]。

Q4:自定义权限规则文件(type = from_file)怎么调试? 规则不生效时:① 确认 file 路径正确、重启过服务;② 临时把 [logging] level 调到 debug 并开 rights_rule_doesnt_match_on_debug = True,日志会输出未命中的规则行;③ 注意权限字母大小写语义(R/W 元数据、r/w 内容,见 5.4 的技术拓展)。

Q5:反代之后路径多了前缀(如 /dav/)导致客户端 404? 反代把 X-Script-Name: /dav 传给后端,或固定配置 [server] script_name = /dav;Radicale 会自动剥离该前缀(见 5.1 的 script_name 参数)。

八、参考链接

站内相关阅读: