Taskd

来自 ArchWiki

taskd 是一个轻量级、安全的 Taskwarrior (task) 服务器。它允许用户在多个客户端之间智能地同步他们的任务,包括桌面和移动客户端之间。

服务器

安装

安装 taskdtaskd-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.pemca.key.pem 必须保留在 pki 文件夹中,以便稍后生成用户证书。

注意: 对于 taskd-gitAUR/usr/share/doc/taskd 已移动到 /usr/lib/taskd

然后确保只有 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 将数据组织成组织和用户,每个用户都属于一个组织。

要添加用户,请运行以下命令,根据需要替换 organizationusername

# 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.pemusername.key.pem

username.key.pemusername.cert.pemca.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.pemusername.cert.pemca.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