Radicale 3.9 配置参数详解
Radicale 3.9.0 全部 12 个配置 section(server/auth/rights/storage/web/logging/headers 等)逐参数详解,默认值实取自安装包,附生产配置模板与实测排障。
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)
二、前置条件
阅读与验证本文需要:
- 已按《Ubuntu 22.04 安装 Radicale 3.9 指南(pip + venv + systemd)》完成安装并确认服务运行:
systemctl is-active radicale # 确认服务在跑
实测回显:
active
- 了解 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。
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| hosts | localhost:5232 | 监听地址与端口,可写多个(IPv4/IPv6)。生产对外服务改 0.0.0.0:5232,纯反代后端改 127.0.0.1:5232 |
| type | builtin | HTTP 服务实现:builtin(内置线程服务)或 hypercorn(需 pip install radicale[h2],支持 H2C) |
| max_connections | 8 | 最大并行连接数。轻量定位的默认值,小团队可适当调大 |
| max_content_length | 100000000 | 请求体上限(字节,100MB)。防大包攻击 |
| max_resource_size | 10000000 | 单资源上限(字节,10MB)。事件/联系人文件超过会被拒 |
| max_vevent_rrule_occurrence | 10000 | 单条 RRULE 重复展开上限(防恶意超长重复规则耗尽资源) |
| delay_on_error | 1 | 服务端 5xx 后的基础延迟秒数(缓解雪崩) |
| timeout | 30 | socket 超时秒数 |
| ssl | False | 是否启用内置 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_value | minimal | 用户名/路径的校验强度(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。
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| type | denyall | 认证方式。默认拒绝一切请求(安全默认),必须显式配置。反代认证场景选 http_x_remote_user/remote_user |
| htpasswd_filename | /etc/radicale/users | htpasswd 口令文件路径 |
| htpasswd_encryption | autodetect | 口令哈希类型(autodetect/md5/bcrypt/argon2/plain);bcrypt/argon2 需装对应扩展 |
| htpasswd_cache | False | 缓存口令文件内容(频繁登录场景提速;改口令文件后需重启) |
| realm | Radicale - Password Required | 401 弹窗显示的域描述 |
| delay | 1 | 认证失败后的延迟秒数(防爆破) |
| cache_logins | false | 是否缓存登录结果 |
| cache_successful_logins_expiry | 15 | 成功登录缓存秒数 |
| cache_failed_logins_expiry | 90 | 失败登录缓存秒数 |
| strip_domain | False | 去掉用户名中的域名部分(如 user@x.com → user) |
| lc_username / uc_username | False | 用户名统一小写/大写(对接大小写不敏感的认证源时开启) |
| urldecode_username | False | 对用户名做 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_security | localhost / tls | 复用 IMAP 服务器认证(如邮件系统已有账号体系) |
| oauth2_token_endpoint / oauth2_client_id | (空) / radicale | OAuth2 令牌内省端点对接 |
| pam_service / pam_group_membership | radicale / (空) | PAM 系统用户认证 |
| dovecot_* | socket/端口系列 | 对接 Dovecot SASL 认证(邮件栈常用) |
| remote_ip_source | REMOTE_ADDR | 传给认证后端的来源地址字段(反代后取 X-Forwarded-For 类字段时调整) |
⚠️ 注意:本文 B1 安装篇实测采用
type = htpasswd+htpasswd_encryption = md5——零额外依赖且htpasswd命令原生支持;LDAP/IMAP/PAM 等后端适合企业已有账号体系的场景,切换后需重启服务。
5.3 [group]:用户组
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| type | none | 组查询方式:none(不用组)/from_auth(从认证后端取组,如 LDAP 组)/htgroup(本地组文件) |
| htgroup_filename | /etc/radicale/groups | htgroup 组文件路径(type = htgroup 时用) |
| htgroup_cache | False | 组文件缓存开关 |
| group_collections_folder | GROUPS | 权限规则中组集合目录名(配合 from_file 规则实现组共享) |
组功能本身默认关闭(type = none);个人/小团队单用户模式无需关注,需要「按组授权日历」时启用。
5.4 [rights]:权限模型
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| type | owner_only | 权限后端:owner_only(默认,用户只读写自己的集合)/owner_write(他人可读自己的集合)/authenticated(登录即可读写一切)/from_file(自定义规则文件) |
| permit_delete_collection | True | 允许删除集合 |
| permit_overwrite_collection | True | 允许覆盖集合 |
| file | /etc/radicale/rights | type = 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]:文件存储
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| type | multifilesystem | 存储后端(文件系统多文件模式,官方唯一内置后端) |
| filesystem_folder | /var/lib/radicale/collections | 数据根目录,备份/迁移的核心对象 |
| filesystem_cache_folder | (空) | 缓存独立目录(下面三个 use_cache_subfolder_* 开启时才需要) |
| use_cache_subfolder_for_item / for_history / for_synctoken | False | 把对应缓存移出集合目录、集中存放(便于备份时排除缓存) |
| use_mtime_and_size_for_item_cache | False | 用 mtime+size 代替 SHA256 做条目缓存校验(提速) |
| folder_umask | (空) | 新建目录的 umask(空=系统默认) |
| max_sync_token_age | 2592000 | sync-token 文件最大保留 30 天(过期清理) |
| skip_broken_item | True | 跳过损坏条目而不是抛异常中断(容错) |
| hook | (空) | 存储变更后执行的本地命令(与 [hook] section 的消息通知是两回事,这是本地 shell 命令钩子) |
| strict_preconditions | False | PUT 的 If-Match/If-None-Match 前置条件严格校验 |
| predefined_collections | (空) | 新用户首登时自动预建的集合模板 |
| _filesystem_fsync | True | 请求内同步刷盘(保证崩溃一致性,性能换安全) |
⚠️ 注意:
filesystem_folder改动后必须保证该目录属主是运行用户(本文为radicale),并重启服务;更换数据目录时先把旧目录完整拷贝再改配置。
5.6 [sharing]:集合共享(3.9 新增能力)
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| type | none | 共享数据库类型(默认整体关闭共享) |
| database_path | (空) | 共享数据库文件路径 |
| collection_by_token / collection_by_map | false / false | 按 token / 按映射共享集合 |
| permit_create_token / permit_create_map | false / false | 允许用户创建对应共享 |
| default_permissions_create_token / default_permissions_create_map | rp / r | 创建共享时的默认权限 |
| permit_properties_overlay / enforce_properties_overlay | false / true | 共享时的属性覆盖策略 |
| conversion_bday_* | 见配置 | 联系人生日 → 日历事件的转换模板(生日日历特性) |
5.7 [hook]:变更通知(RabbitMQ/SMTP)
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| type | none | 通知后端:none / RabbitMQ / SMTP(邮件) |
| rabbitmq_endpoint / rabbitmq_topic / rabbitmq_queue_type | (空) | RabbitMQ 对接三件套 |
| smtp_server / smtp_port / smtp_security | (空)/ 25 / none | SMTP 服务器与加密方式(none/tls/starttls) |
| smtp_username / smtp_password(_file) | (空) | SMTP 认证(密码建议用 smtp_password_file 落文件而非明文配置) |
| from_email | (空) | 通知邮件发件人 |
| mass_email | False | 群发模式(一封给全部参会人 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]:
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| type | internal | Web 界面后端:internal(内置界面)或 none(关闭)。访问路径 /.web/ |
| prefer_browser_login | False | 优先用浏览器登录表单而非 HTTP Basic 弹窗 |
[logging]:
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| level | info | 日志级别(debug/info/warning/error;排障切 debug,实测见三、3.2) |
| mask_passwords | True | 日志中口令脱敏(保持默认,勿关) |
| limit_content | 3000 | 日志包裹内容的字符上限 |
| bad_put_request_content | False | 记录坏 PUT 请求体(排障时可开) |
| backtrace_on_debug | False | debug 级别输出堆栈 |
| request_header/content_on_debug、response_header/content_on_debug | False | debug 级别记录请求/响应头与体(深度排障用) |
| profiling | none | 性能分析日志(info 级别输出 top 函数) |
| rights_rule_doesnt_match_on_debug | False | debug 时输出未命中的权限规则(调 from_file 规则利器) |
[headers]:默认空。按需添加自定义 HTTP 响应头,键即头名:
[headers]
X-Frame-Options = DENY
[reporting]:
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| max_expand_occurrence | 10000 | REPORT expand 单事件展开上限 |
| max_freebusy_occurrence | 10000 | free-busy 查询展开上限 |
| freebusy_view_past_days / freebusy_view_future_days | 365 / 365 | 忙闲视图向前/向后覆盖天数 |
5.9 [encoding]
| 参数 | 默认值(实取) | 说明 |
|---|---|---|
| request | utf-8 | 请求/响应编码 |
| stock | utf-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
模板要点解说:
hosts = 127.0.0.1:5232:只监听回环,对外一律走反代的 443 TLS(Nginx/Caddy 均可,见《Ubuntu 22.04 安装 Caddy 指南(apt 官方源 编译多方案)》)。htpasswd_encryption = bcrypt:需先在 venv 内pip install radicale[bcrypt];口令文件改用htpasswd -B生成。若不愿装扩展,退回md5(MD5-APR1)。- 缓存子目录三开关:把缓存移出集合目录,备份时整目录拷贝
collections即可少拷缓存、且可对缓存目录单独排除。 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 参数)。
八、参考链接
- Radicale 官方配置文档:https://radicale.org/v3.html#configuration
- 官方教程(含反代/认证章节):https://radicale.org/tutorial.html
- GitHub 仓库(rights 模块源码):https://github.com/Kozea/Radicale
站内相关阅读:
- 《Radicale 介绍与选型指南》
- 《Ubuntu 22.04 安装 Radicale 3.9 指南(pip + venv + systemd)》
- 《Radicale 3.9 常用 CLI 命令与运维详解》
- 《Nginx HTTPS 与证书配置方案(certbot/自签名)》:https://www.quzuo.net/document/5edEKp5tnuw2
- 《Ubuntu 22.04 安装 Nextcloud 指南》:https://www.quzuo.net/document/1T3AYvb8zbMj
- 《Nextcloud 配置参数详解》:https://www.quzuo.net/document/Zn9TlUIyxGqO