搭建私人CardDAV_CalDAV服务_通讯录_日历同步服务_debian11_radicale3_nginx_DAVx5


转载注明来源: 来自osnosn的博客,写于 2022-04-24.

参考

  • 【radicale 官网】
  • 【radicale3 的文档】
  • 【radicale GitHub】

安装环境

  • debian 11,
  • apt install radicale, debian11 stable 中,实际安装的版本是 radicale-3.0.6,
    我没有使用 pip 安装,也没有去安装最新版 3.1.7,
  • nginx 用的是 apt install nginx-full, debian11 stable 中的版本是 nginx-1.18.0,

安装

  • radicale 的官网说,3.x 版本是开箱即用的。
  • apt install radicale 安装的版本,
    已经装好 radicale.service 服务启动脚本,
    已经有了 /etc/radicale/ 配置目录。
    已经有了 /var/lib/radicale/collections/ 数据目录。
    并且还有了,用 uwsgi 启动的配置目录 /etc/uwsgi/ (我没有使用uwsgi)
  • 因为用 apt 安装的, 方便齐全, 并且够用。所以我没有使用 pip 安装。

配置

修改 radicale 配置

  • 修改 /etc/radicale/config 文件
    • [server] 中, 添加 host = localhost:5232
      计划用 nginx 做反向代理,没必要绑定到 0.0.0.0:5232[::]:5232
      • localhost:5232,启动服务后,内网用 http://192.168.x.x:5232/也不能访问。
      • 0.0.0.0:5232,启动服务后,内网用 http://192.168.x.x:5232/可以访问。
    • [auth] 中,
      修改/添加 type = htpasswd,
      htpasswd_filename = /etc/radicale/users,
      htpasswd_encryption = plain,
      自己个人使用,账号文件,我选择不加密。自己忘了密码,还能查看。
      如果你想更安全,可以选择 md5 加密。
    • 关于 radicale 其他的配置项,用默认值。
  • 创建 /etc/radicale/users 文件。
    (用户名写成 email 格式,是为了在 DAVx5 中显示的账号,看起来更有辨识度),
    plain的格式是,
user01@myhost:pass123
user02@myhost:pass456

如果你选用 md5 加密,则需要用 htpasswd 命令去创建 users 文件。
为了安全,不让users文件全局可读,
chown radicale.radicale /etc/radicale/users; chmod 640 /etc/radicale/users;

  • 我的 nginx 已经配置好 ssl,而 nginx 和 radicale 又在同一台机器。
    所以,我就不再配置 radicale 的 ssl 证书了。
  • radicale 服务, 将会以 radicale 用户身份执行。而安装时,/var/lib/radicale/collections 目录的 owner 是 root。会导致无法写入。
    需要 chown radicale.radicale /var/lib/radicale/collections 修改 collections 目录的权限。
  • systemctl enable radicale 激活服务。
    systemctl start radicale 启动服务。
  • 如果修改了 users 账号文件,无需重启 radicale 即生效
  • 用户(比如用户名:gst)的数据,将会放在 /var/lib/radicale/collections/collection-root/gst/ 中。
    如果gst用户不再使用,则简单的删除 gst/ 目录即可。

修改 nginx 配置

  • 我的 nginx 是配置了 ssl 的。是使用 https:// 访问的。
  • 在 nginx 的配置文件中,合适的地方,加入,(抄自radicale官方文档),
location  /card/ {   # The trailing / is important!
    allow all;
    proxy_pass        http://127.0.0.1:5232/;  # The trailing / is important! 
    proxy_set_header  X-Script-Name /card;   #与location中的目录名相同,去掉最后的/号
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host $http_host;
    proxy_pass_header Authorization;
}
  • service nginx reload 重启 nginx。

使用

  • 用浏览器访问 https://xxxx.mydomain.com:8888/card/ (这里用的是 nginx 对外的 ddns 域名和端口)
    登录账号,
    • 可以创建 addressbook 空集合 和 calendar 空集合,
    • 可以修改 集合的名称,描述。(名称,描述都能在DAVx5中能看到,描述中的中文显示正常).
    • 可以上传 ics 或 vcf 文件, 生成一个新集合。(vcf对于通讯录,ics对应日历)。
    • 可以下载已有集合中的所有数据。
      • 下载的vcf版本格式,与你之前上传的一样。
        你之前上传的是vcf-2.1格式的,下载时也是vcf-2.1格式的。
    • 3.0.6版中,web不能编辑集合中的内容(增,删,改)。
  • 手机中的通讯录,默认是存在 "本机"。如果要变成 cardDAV 的。
    需要从手机中导出通讯录,然后在浏览器中,上传通讯录(支持vcf,ics格式)
    • 上传vcf文件后,会在当前用户中生成一个没有名字的新的通讯录集合。
      在DAVx5中,要在对应账号中,点击 "刷新通讯录列表",才能看到。
      导入的无名称的新集合,只能在web网页端修改名称。
      在DAVx5中,有创建新集合,删除已有集合。没有修改已有集合名称的地方。
    • 在浏览器中,删除一个集合。
      系统目录 /var/lib/radicale/collections/collection-root/用户名/中,
      对应集合的目录也删除了。没有数据残留
    • 上传 ics 文件,是导入日历事件。
  • 然后在 Android 手机中安装 DAVx5,添加账号,"使用 URL 和用户名登录"。
    "根地址" 填https://xxxx.mydomain.com:8888/card/ 即可。
    • 然后点击刚才加入的账号。选择"CARDDAV", 点右上角的"三个点", 选"刷新通讯录列表"。
      勾选上需要同步的集合,点击右下角"同步"图标。
      就能双向同步 对应的集合了。
    • 一个radicale账号中,可以有多个集合, DAVx5也支持。方便你对通讯录分类保存,同步。
    • CalDAV创建了集合后,在手机日历中, 新创建的事件,就可以同步到服务器。
      • DAVx5对于CalDAV默认只同步90天内的事件。可以在设置中"旧日程时间限制"设置为空,表示"同步所有日程"。
  • DAVx5 可以去 F-Droid 下载, 目前的最新版是 4.2.0.3-ose,10MB。
  • DAVx5 中的 mount "WebDAV 文件系统" 功能,是只读的,比较鸡肋。没什么用处。

其他

  • 如果不想开放 radicale 的 web 页面登陆。仅使用 DAVx5.
    改 /etc/radicale/config 文件, [web] 中, type = none, 然后重启 radicale 即可。
  • radicale 有机制, 记录所有通讯录的改变。比如,每当通讯录有改变, 就自动调用 git 命令提交一次记录。
    看官方文档中,关于 [storage]中, hook = 的描述。
  • DAVx5 支持服务自动发现。需要把两个链接临时重定向(302)到 radicale 的目录。
    这样, 在DAVx5中添加账号时,根地址(URL)就不用写全路径了。
    • /.well-known/caldav → CalDAV service path (302 Found), → /card/
    • /.well-known/carddav → CardDAV service path (302 Found), → /card/
      这个可以通过 nginx 的配置 return 302 xxx 或者 rewrite xxx xxx redirect, 来实现。

错误

  • 如果通过浏览器,上传 vcf 文件失败。
    在服务器上执行 tail -f /var/log/syslog,
    再次上传试试,看看 syslog 中输出了什么错误。
    方便您定位错误。
  • 我发现 3.0.6 版,对 vcf-3.0 版的格式,支持很好。
  • 我发现 3.0.6 版,上传 华为手机 鸿蒙系统 导出的 vcf-2.1 版,支持不好。
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=
=95=E6=B5=8B=E8=AF=95=E6=B5=8B;;;
FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=
=95=E6=B5=8B=E8=AF=95=E6=B5=8B
TEL;CELL:12 345 678 90
PHOTO;ENCODING=BASE64;JPEG:/9j/4AAQS....
 2wBDAQcHBwo....

END:VCARD

上面的文件,上传会失败。

  • 把 Quoted-Printable 编码,整理成一行。
    Quoted-Printable编码的基本方法是:输入数据在33-60、62-126范围内的,直接输出;其它的需编码为“=”加两个字节的HEX码(大写)。为保证输出行不超过规定长度,可在行尾加“=/r/n”序列作为软回车。
  • PHOTO 项中(如果有头像),要把 ENCODING=BASE64 改为 ENCODING=B 才行。

修改为下面的内容,才行,

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B;;;
FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B=E8=AF=95=E6=B5=8B
TEL;CELL:12 345 678 90
PHOTO;ENCODING=B;JPEG:/9j/4AAQS....
 2wBDAQcHBwo....

END:VCARD

才能成功上传。

完成

  • 其他CardDAV安装,请看【】

  • WebDAV 的搭建,请看【】


转载注明来源: 本文链接
来自 osnosn的博客 https://www.cnblogs.com/osnosn/ .