18.设置为 systemd 服务

这部分的内容要求您已经编译了 Vaultwarden 二进制。如果您已生成了 docker 镜像,则需要查看使用 systemd-docker 运行

设置

要使 Vaultwarden 在系统启动的时候启动并使用 systemd 的其他功能(例如,隔离、日志记录等),则需要一个 .service 文件。以下是一个可行的起点:

[Unit]
Description=Vaultwarden Server (Rust Edition)
Documentation=https://github.com/dani-garcia/vaultwarden
# 如果您使用 mariadb、mysql 或 postgresql 数据库, 
# 您必须像下面这样添加它们,并去掉前面的 # 以取消注释。
# 这将确保您的数据库服务器在 Vaultwarden 之前启动 ("After"),
# 并且在启动 Vaultwarden 之前成功启动 ("Requires")。

# 仅 sqlite
After=network.target

# MariaDB
# After=network.target mariadb.service
# Requires=mariadb.service

# Mysql
# After=network.target mysqld.service
# Requires=mysqld.service

# PostgreSQL
# After=network.target postgresql.service
# Requires=postgresql.service


[Service]
# 设置 Vaultwarden 用户/群组。此用户/群组对工作目录(见下文)允许有读写权限
User=vaultwarden
Group=vaultwarden
# 使用环境文件进行配置
EnvironmentFile=/etc/vaultwarden.env
# 已编译的二进制的位置
ExecStart=/usr/bin/vaultwarden
# 设置合理的连接和进程限制
LimitNOFILE=1048576
LimitNPROC=64
# 将 bitwarden_rs 与系统的其他部分隔离开
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=strict
# 仅允许对以下目录进行写入,并将其设置为工作目录(用户和密码数据存储在这里)
WorkingDirectory=/var/lib/vaultwarden
ReadWritePaths=/var/lib/vaultwarden

[Install]
WantedBy=multi-user.target

更改以上所有路径以匹配您的安装(WorkingDirectoryReadWritePaths 应相同),将此文件命名为 vaultwarden.service 并将其放入 /etc/systemd/system 中。

如果必须更改现有(而不是像上面那样新建)的 systemd 文件(您安装的软件包提供给您的),可以使用下面的命令来添加更改:

$ sudo systemctl edit vaultwarden.service

请运行以下命令,以让 systemd 知道您的新文件或您所做的任何更改:

$ sudo systemctl daemon-reload

用法

要启动此「服务」,请运行:

$ sudo systemctl start vaultwarden.service

要启用自动启动,请运行:

$ sudo systemctl enable vaultwarden.service

同理,您可以使用 stoprestartdisable 来停止、重启或禁用此服务。

更新 Vaultwarden

编译新版本的 Vaultwarden 之后,您可以复制已编译的(新的)二进制文件并替换现有的(旧的)二进制文件,然后重新启动服务:

$ sudo systemctl restart vaultwarden.service

卸载 Vaultwarden

在执行其他操作之前,应先停止并禁用该服务:

$ sudo systemctl disable --now vaultwarden.service

然后,您可以删除二进制、环境文件、web-vault 文件夹(如果已安装)以及用户数据(如果需要)。请记住,还要删除专门创建的用户、群组和防火墙规则(如果需要)和 systemd 文件。

删除 systemd 文件后,您应该通过下面的方式使 systemd 意识到这一点:

$ sudo systemctl daemon-reload

查看日志和状态

如果要查看日志输出,请运行:

$ journalctl -u vaultwarden.service

或查看此服务的更简洁的状态,请运行:

$ systemctl status vaultwarden.service

故障排除

旧版 systemd 的沙盒选项

在 RHEL 7(以及 debian 8)中,使用的 systemd 不支持某些隔离选项 (#445, #363)。这可能导致出现如下错误:

Failed at step NAMESPACE spawning /home/vaultwarden/vaultwarden: Permission denied

或者:

Failed to parse protect system value

要解决这一点,您可以在包含有 PrivateTmpPrivateDevicesProtectHomeProtectSystemReadWritePaths 的部分或全部行前面放置 # 符号来将其注释掉。尽管将所有这些行注释掉可能会起作用,但不建议这样做,因为这些都是很好的安全措施。要查看您的 systemd 支持哪些选项,请运行以下命令来查看其输出:

$ systemctl --version

检查您的 systemd 版本并与 systemd/NEWS.md 进行比较。

编辑 .service 文件后,请不要忘记在启动(或重启)服务之前运行如下命令:

$ sudo systemctl daemon-reload

服务无法启动

systemd journal (journalctl -eu vaultwarden.service) 中显示以下错误:

Feb 18 05:29:10 staging-bitwarden systemd[1]: Started Vaultwarden Server (Rust Edition).
Feb 18 05:29:10 staging-bitwarden systemd[49506]: vaultwarden.service: Failed to execute command: Resource temporarily unavailable
Feb 18 05:29:10 staging-bitwarden systemd[49506]: vaultwarden.service: Failed at step EXEC spawning /usr/bin/vaultwarden: Resource temporarily unavailable
Feb 18 05:29:10 staging-bitwarden systemd[1]: vaultwarden.service: Main process exited, code=exited, status=203/EXEC
Feb 18 05:29:10 staging-bitwarden systemd[1]: vaultwarden.service: Failed with result 'exit-code'.

已知当 Vaultwarden 在容器(LXC 等)内部或本地运行时,会出现这种情况。服务文件中的参数 LimitNPROC=64 使服务无法启动。注释掉此参数后,服务可以正常启动。

注意:systemd 覆盖文件不起作用,必须注释/删除该行。最简单的方法是通过

# systemctl edit --full vaultwarden.service

然后重新加载守护程序并重新启动。

环境变量未被加载

请注意,systemd 不支持 EnvironmentFile=/etc/vaultwarden.env 文件中的注释与变量在同一行中(参阅 #1607)。比如下面这个环境文件示例中,变量 WEBSOCKET_ENABLED 将不会被加载:

ROCKET_PORT=8080
WEBSOCKET_ENABLED=true # enable websocket

如果您想要使用同行注释,请考虑改用 /var/lib/vaultwarden/.env(这也将避免启动时提示 .env 文件缺失的 INFO 错误)。

更多信息

有关 .service 文件的更多信息,请参阅 systemd.servicesystemd.exec(用于安全性配置)手册页。

最后更新于