Taskd
taskd 是一个轻量级、安全的 Taskwarrior (task) 服务器。它允许用户在多个客户端之间智能地同步他们的任务,包括桌面和移动客户端之间。
服务器
安装
安装 taskd 或 taskd-gitAUR 以获取开发版本。
配置
一旦 taskd 安装完成,你需要进行设置。第一步是
$ export TASKDDATA=/var/lib/taskd
否则你需要将 --data /var/lib/taskd
附加到每个 taskd 命令。
接下来,编辑 /usr/share/doc/taskd/pki/vars
文件。CN=
行必须与服务器的主机名或 IP 地址匹配,具体取决于你的连接方式。
一旦文件编辑完成,切换到目录 /usr/share/doc/taskd/pki/
并运行 ./generate
。这将为你的服务器创建自签名证书。
将所有生成的 .pem
文件复制到 /var/lib/taskd
。请注意,至少 ca.cert.pem
和 ca.key.pem
必须保留在 pki
文件夹中,以便稍后生成用户证书。
然后确保只有 taskd 可以读取 /var/lib/taskd
中的证书和密钥
# chown taskd:taskd ca.cert.pem ca.key.pem server.cert.pem server.crl.pem server.key.pem # chmod 400 ca.cert.pem ca.key.pem server.cert.pem server.crl.pem server.key.pem
现在你需要配置 taskd。使用 taskd config
命令或直接将以下内容添加到 /var/lib/taskd/config
/var/lib/taskd/config
client.cert=/var/lib/taskd/client.cert.pem client.key=/var/lib/taskd/client.key.pem server.cert=/var/lib/taskd/server.cert.pem server.key=/var/lib/taskd/server.key.pem server.crl=/var/lib/taskd/server.crl.pem ca.cert=/var/lib/taskd/ca.cert.pem
此外,你应该更改 taskd 日志的写入位置,因为默认位置是 /tmp/taskd.log
。这可以通过运行以下命令完成
# touch /var/log/taskd.log # chown taskd:taskd /var/log/taskd.log # taskd config --force log /var/log/taskd.log
最后一步是设置 taskd 的服务器名称,该名称必须与证书中使用的名称相同
# taskd config --force server servername:port
请注意,taskd 没有默认端口,必须手动设置。
运行
启动/启用 taskd.service
。
在 taskd 中添加用户
taskd 将数据组织成组织和用户,每个用户都属于一个组织。
要添加用户,请运行以下命令,根据需要替换 organization
和 username
。
# taskd add org organization # taskd add user organization username
注意最后一个命令返回的密钥,用户将需要它来进行同步。
确保用户 taskd
可以读取新的组织和用户。
# chown -R taskd:taskd /var/lib/taskd/orgs
返回到 /usr/share/doc/taskd/pki/
并运行
# ./generate.client username
这将返回 username.cert.pem
和 username.key.pem
。
username.key.pem
、username.cert.pem
和 ca.cert.pem
必须复制到用户的 Taskwarrior 用户数据目录(默认为 ~/.task
)。
客户端
用户配置
一旦 .pem
文件被复制到用户的 Taskwarrior 数据目录,他们的配置文件(默认为 ~/.taskrc
)必须更新以指向这些文件和服务器
~/.taskrc
taskd.server=servername:port taskd.credentials=organization/username/key taskd.certificate=~/.task/username.cert.pem taskd.key=~/.task/username.key.pem taskd.ca=~/.task/ca.cert.pem
路径相对于执行 task
命令的目录,因此路径应该是相对于 ~
的相对路径或绝对路径。
taskd.credentials
中的密钥是在服务器上的 /var/lib/taskd/orgs/organization/users/
目录下创建的目录名。这个目录中包含一个配置文件,文件内有你选择的用户名。
config
user=username
执行初始同步并同意将你的 Taskwarrior 数据发送到服务器
$ task sync init
将本地更改发送到服务器
$ task sync
使用 Android Taskwarrior 应用
在下载 Android 应用之前,你需要创建一个文件夹。在你的外部存储(或者如果你只有一个内部存储,就在那里)创建文件夹 Android/data/kvj.taskw/files/key
,其中 “key” 与使用 taskd
创建用户时给出的密钥相同。然后将 username.key.pem
、username.cert.pem
和 ca.cert.pem
文件添加到该文件夹。
在该文件夹中创建一个名为 .taskrc.android
的新文件。它应该看起来像这样
/sdcard/Android/data/kvj.taskw/files/uuid/.taskrc.android
taskd.server=servername:port taskd.credentials=organization/username/key taskd.certificate=username.cert.pem taskd.key=username.key.pem taskd.ca=ca.cert.pem
.taskrc.android
在末尾有一个换行符。否则,它将无法正确解析。现在下载应用并启动它。当提示添加配置文件时,选择你刚刚创建的数据文件夹。Taskwarrior 现在应该可以同步并按预期工作。
故障排除
无法连接的服务器
如果服务器无法连接但正在运行,则它已绑定到 IPv6 地址。你可以通过在 /var/lib/taskd/config
中添加 family=IPv4
来强制使用 IPv4。
如果服务器停留在“Server starting”状态,则可能是无法解析你在 server
选项中指定的地址。过一段时间后,服务器将超时并显示“Name or service not known”(名称或服务未知)。在这种情况下,尝试添加一个外部 /etc/hosts
条目,将该地址别名化为你的外部 IP 地址(请参阅 域名解析),
尝试这些操作后重启 taskd,然后检查你的问题是否已解决。
“错误的密钥”
如果服务器响应“错误的密钥”错误,即使你刚刚生成了密钥,请检查已创建文件夹的权限(/var/lib/taskd/
及其子文件夹中的所有内容)。taskd 不会设置自己的 uid/gid,因此这些文件夹必须手动 chown 为 taskd 用户。
taskd.service 启动时失败
Taskd 1.1 的 systemd 单元没有正确的网络目标依赖项,因此有时可能会在启动时失败。下面的代码片段添加了正确的依赖项,这已在上游 修复。
/etc/systemd/system/taskd.service.d/online.conf
[Unit] After= Wants=network-online.target After=network-online.target [Install] WantedBy= WantedBy=network.target
Systemd 强化
默认情况下,Taskd 没有沙盒化,下面的覆盖配置禁止 taskd 写入除 /var/lib/taskd
和 /var/log/taskd.log
之外的任何内容。
/etc/systemd/system/taskd.service.d/hardening.conf
[Service] PrivateTmp=true ProtectSystem=strict ProtectHome=true ReadWritePaths=/var/lib/taskd /var/log/taskd.log ProtectKernelTunables=true ProtectControlGroups=true ProtectHostname=true NoNewPrivileges=true MemoryDenyWriteExecute=true LockPersonality=true