vCards 是一个中国黄页开源项目,整理了一批常用的企业联系人,并精心设定了头像;可以导入到手机、电脑中,优化来电和信息界面的使用体验。支持 vcf 文件下载,要求使用者手动导入;如果后续有变动,仍需重复手动导入操作。本文探讨使用 Radicale 在 Ubuntu 24.04 中搭建 CardDav 服务,以实现方便在各个设备上订阅导入,以及让黄页联系人自动保持最新的目标。
准备工作
出于安全考虑,建议使用专用的用户:
sudo useradd --system --user-group --home-dir /home/radicale --shell /sbin/nologin radicale
创建 Radicale 数据目录:
sudo mkdir -p /home/radicale/collections/collections-root
sudo chown -R radicale: /home/radicale
vCards
vCards 项目已经可以直接输出 Radicale 所支持的数据格式。
sudo apt install git npm
# 切换到用户 radicale
sudo su -l radicale -s /bin/bash
cd ~
git clone https://github.com/metowolf/vCards.git
cd vCards
npm install
npm run radicale
完成后,数据会输出在 vCards 目录中的 radicale
,创建一个软链接,以供 Radicale 使用:
ln -s /home/radicale/vCards/radicale /home/radicale/collections/collection-root/cn
运行 crontab -e
,添加一个定时任务,以使得数据自动保持最新。鉴于项目更新频率,可设置为每周更新一次:
0 5 * * 1 cd /home/radicale/vCards && git pull && npm run radicale
Radicale
Radicale 是一个开源的 CalDav 和 CardDav 服务器软件,基于 Python 编写。
安装
安装 Radicale
sudo apt install python3-pip python3.12-venv
python3 -m venv /home/radicale/python3-env
source /home/radicale/python3-env/bin/activate
pip install radicale
配置
创建配置目录:
mkdir /etc/radicale
因为联系人数据是由 vCards 项目自动生成,为避免日后数据混乱,所以要关闭 Radicale 的修改写入功能。创建权限配置 /etc/radicale/rights
:
[root]
user: .+
collection:
permissions: R
# (same as user name)
[principal]
user: .+
collection: {user}
permissions: R
[collections]
user: .+
collection: {user}/[^/]+
permissions: rR
参考 官方文档 ,创建 Radicale 配置文件 /etc/radicale/config
:
[rights]
type = from_file
file = /etc/radicale/rights
[storage]
type = multifilesystem
filesystem_folder = /home/radicale/collections
创建服务配置 /etc/systemd/system/radicale.service
:
[Unit]
Description=A simple CalDAV (calendar) and CardDAV (contact) server
After=network.target
Requires=network.target
[Service]
ExecStart=/home/radicale/python3-env/bin/python -m radicale
Restart=on-failure
User=radicale
# Deny other users access to the calendar data
UMask=0027
# Optional security settings
PrivateTmp=true
ProtectSystem=strict
#ProtectHome=true
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
NoNewPrivileges=true
ReadWritePaths=/home/radicale/collections
[Install]
WantedBy=multi-user.target
启动服务并查看状态:
sudo systemctl deamon-reload
sudo systemctl enable --now radicale
sudo systemctl status radicale
提供 HTTPS 访问
Caddy
安装 Caddy 并编辑配置文件:
sudo apt install caddy
sudo vim /etc/caddy/CaddyFile
配置:
vcards.example.com {
reverse_proxy localhost:5232
}
启动:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl enable --now caddy
sudo systemctl status caddy
请确保 80/443 端口开放:
sudo ufw allow 80,443/tcp
Nginx
参考以下配置:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name vcards.example.com;
# ssl cert ...
# security ...
location ^~ /{
proxy_pass http://localhost:5232;
}
access_log off;
}
使用
访问 https://vcards.example.com
,如果一切正常,会看到 Radicale 的登录页面,用户名 cn
密码任意填写,即可登录并查看到 vCards 提供的联系人信息。
订阅相关参数:
- 服务器:
vcards.example.com
- 用户名:
cn
- 密码:
cn
或任意填写
在设备中添加订阅:
- iOS: 「设置」--「通讯录」--「账户」--「添加账户」-- 「其他」--「添加 CardDAV 账户」。因为 iOS 的 Bug,并不能随时修改描述,建议将 描述 填写为「中国黄页」。
- Mac:「通讯录」--「设置」--「账户」--「其他通讯录账户」
- ThunderBird
- 旧版:需要安装 TbSync 及 Provider for CalDav & CardDav 扩展。「工具」--「Synchronization Settings(TbSync)」--「Account actions」--「CalDav & CardDav」-- 「Manual Configuration
- 新版:等待官方支持
- Android:需要安装 DAVx5。「+」--「使用 URL 和用户名登录」
可尝试使用由 vCards 的作者 metowolf 提供的公开订阅服务:vcards.metowolf.com
(以 vcards.metowolf.com
替换vcards.example.com
)
结语
本方案中 Radicale 对于订阅用户来说,是只读的。如果你有需要临时加入一些号码,建议在本地另建一个与主联系人的有相同主号码的联系人,iOS 会自动将 vCards 中的黄页联系人和本地联系人自动合并显示。
订阅同步的方式,可能会消耗相当的服务器流量,如果你有资源,可以搭建公开的同步服务并分享给他人使用;如果你在白嫖他们提供的服务,建议设置为最慢的同步频率,以节省你的电量、流量,以及英雄们的服务器带宽和流量。
为 vCards 搭建 Radicale CardDav 服务器