惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
V
V2EX
博客园_首页
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
H
Help Net Security
A
About on SuperTechFans
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Blog — PlanetScale
Blog — PlanetScale
W
WeLiveSecurity
云风的 BLOG
云风的 BLOG
D
Docker
Security Archives - TechRepublic
Security Archives - TechRepublic
Help Net Security
Help Net Security
N
News and Events Feed by Topic
Simon Willison's Weblog
Simon Willison's Weblog
G
Google Developers Blog
A
Arctic Wolf
T
The Blog of Author Tim Ferriss
博客园 - 叶小钗
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
博客园 - 三生石上(FineUI控件)
aimingoo的专栏
aimingoo的专栏
Hacker News: Ask HN
Hacker News: Ask HN
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 司徒正美
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy International News Feed
T
Troy Hunt's Blog
T
Tenable Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Recorded Future
Recorded Future
F
Fortinet All Blogs
D
DataBreaches.Net
B
Blog
T
Threat Research - Cisco Blogs
MyScale Blog
MyScale Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
The GitHub Blog
The GitHub Blog
Security Latest
Security Latest
M
MIT News - Artificial intelligence

Dallas Lu

OpenWRT 使用 udp2raw 对抗 WireGuard 阻断 博客程序架构的思考与展望 如何证明你是原创作者 Nginx 泛域名配置的隐患与对策 WISeID S/MIME 证书 V2EX 刑满释放记 邮件服务的域名成功从 SURBL 黑名单移除 网站多语言的设计细节 网站评论系统的目前进展和展望 在公网使用 iptables 转发端口时保留客户端 IP 邮件投递平台 Postal 的使用经验 自建 Postal 完美替代 SendGrid 互联网在崩塌吗,然后呢 在 SvelteKit 应用中使用 JSON-LD 网页的打印样式应该怎么写 “茴字的四种写法”之 IP 与域名 怎么伪造 Git 提交的时区 供大众交流的论坛和其它替代产品还是不好用 改编不是照搬 一次排查诡异的网络问题的经历 在 OpenWRT 23 中使用 nftset 配置 Shadowsocks 规则 使用自建 Tabby Web 来同步 Tabby 配置 手动建立自己的 IPv6 Tunnel 服务 在 PVE 手动配置网络及虚拟机 IPv6 公网 在 PVE 中缩小 Ubuntu 虚拟机的磁盘 Beancount 摊销与折旧的使用以及相关插件 Nginx 反代 Apache Subversion 添加 HTTPS 使用你的主域名作为 Mastodon 实例名 Firefox 和 Chrome 为何要革 EV 证书的命
使用 Radicale 在 Ubuntu 24.04 中搭建 vCards CardDav 服务
达拉斯・卢 · 2024-10-17 · via Dallas Lu

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/collection-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 中的黄页联系人和本地联系人自动合并显示。

订阅同步的方式,可能会消耗相当的服务器流量,如果你有资源,可以搭建公开的同步服务并分享给他人使用;如果你在白嫖他们提供的服务,建议设置为最慢的同步频率,以节省你的电量、流量,以及英雄们的服务器带宽和流量。