# QNAP NAS 用 Docker 部署 Radicale [[https://radicale.org/|Radicale]]是一个开源的`CalDAV`和`CardDAV`服务器,用来存放待办事项、任务、联系人一类的东西。 ## 部署和运行 QNAP NAS 理论上可以添加 QNAP Club 源直接安装 Radicale,但是安装的版本没有SSL,运行貌似也不容易(反正我是打不开登录界面也不知道怎么配置),所以还不如在`Container Station`上面自己来一个。 平时自己玩过几次Docker,都是当虚拟机用,但这一次可以说是生产环境,再把数据全写到Docker里面就太心大了,必须挂载到外面来,保证整个Docker没了也不会丢数据。 按这个原则,找到了[[https://github.com/tomsquest/docker-radicale|这个Docker镜像]],直接提供了把配置和数据挂载出来的方法: ``` docker run -d --name radicale \ -p 127.0.0.1:5232:5232 \ --read-only \ --init \ --security-opt="no-new-privileges:true" \ --cap-drop ALL \ --cap-add CHOWN \ --cap-add SETUID \ --cap-add SETGID \ --cap-add KILL \ --pids-limit 50 \ --memory 256M \ --health-cmd="curl --fail http://localhost:5232 || exit 1" \ --health-interval=30s \ --health-retries=3 \ -v ~/radicale/data:/data \ -v ~/radicale/config:/config:ro \ tomsquest/docker-radicale ``` 但是这个配置显然是过于复杂了,`Container Station`的 GUI 没有提供这些功能。搜索了大概半个小时,也没有找到类似的变通办法,只能是`ssh`进去,命令行的干活。好在命令行的结果也会反映在GUI中,当然那些复杂的选项仍然是不显示的。 过几次尝试,合理的命令是: ``` docker run -d --name radicale \ -p 5232:5232 \ --read-only \ --init \ --security-opt="no-new-privileges:true" \ --cap-drop ALL \ --cap-add CHOWN \ --cap-add SETUID \ --cap-add SETGID \ --cap-add KILL \ --memory 256M \ --health-cmd="curl --fail https://localhost:5232 || exit 1" \ --health-interval=30s \ --health-retries=3 \ --restart=always \ -v /share/Container/Volumes/Radicale/data:/data \ -v /share/Container/Volumes/Radicale/config:/config:ro \ tomsquest/docker-radicale ``` 其中: + 端口绑定那里去掉了`127.0.0.1` + `/share/Container/Volumes/Radicale/data`和`config`文件夹,是手动创建的。 + `health-cmd`一行,为了适应SSL,手动加了https + `pids-limit`在QNAP中不支持,去掉了 + `config`文件夹下应该有`config`文件,其格式可以看[[https://github.com/tomsquest/docker-radicale/blob/master/config|这里]] + `config`文件中配置SSL证书位置,可以放到挂载的文件夹中,注意路径要写容器内的路径 + `config`文件配置的用户密码文件,也可以放在这两个文件夹中挂载进去 以后,即使Docker全部完蛋了,只要`/share/Container/Volumes/Radicale/data`和`config`文件夹还在,重新下载一个并且用上面的命令再次运行就好了。 ## 部署后导入数据 一般,能想到用radicale的都是有相关经验的人,也在其他地方有正在使用中的日历软件并且积累了不少数据。 正常来说,应该都能拿到`*ics`,文件,此时有一个很简单的,文档中没有说的办法来把数据**替换**成现有的(注意不是导入而是替换): 1. 在Radicale中新建一个日历; 2. 下载原来的`ics`文件,保证访问正常; 3. 拿到Radicale中此日历的url,一般是`https://cloud.tiger2doudou.com:端口号/用户名/一串UUID/`这样的; 4. 把你的`ics`文件拿到一个有`curl`命令的地方,执行:`curl -u '用户名:密码' -X PUT https:刚才的URL --data-binary @ICS文件路径.ics` 5. 如果`ics`文件格式没问题,可以看到新建的日历除了URL,已经被整个替换成了`ics`文件里面的那个,包括名字,当然这个可以后期修改; 6. 可以把新的事项加进去了。