systemd-cgtop

pstree
systemctl list-unit-files
systemctl list-units —all —type=service
systemctl list-units
systemd-cgls

16.设置为 systemd 服务

{% hint style=”success” %}
对应的页面地址
{% endhint %}

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

设置

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

  1. [Unit]
  2. Description=Vaultwarden Server (Rust Edition)
  3. Documentation=https://github.com/dani-garcia/vaultwarden
  4. # 如果你使用 mariadb、mysql 或 postgresql 数据库,
  5. # 你必须像下面这样添加它们,并去掉前面的 # 以取消注释。
  6. # 这将确保你的数据库服务器在 Vaultwarden 之前启动("After"),
  7. # 并且在启动 Vaultwarden 之前成功启动("Requires")。
  8. # 仅 sqlite
  9. After=network.target
  10. # MariaDB
  11. # After=network.target mariadb.service
  12. # Requires=mariadb.service
  13. # Mysql
  14. # After=network.target mysqld.service
  15. # Requires=mysqld.service
  16. # PostgreSQL
  17. # After=network.target postgresql.service
  18. # Requires=postgresql.service
  19. [Service]
  20. # 设置 bitwarden_rs 用户/群组。此用户/群组对工作目录(见下文)允许有读写权限
  21. User=vaultwarden
  22. Group=vaultwarden
  23. # 用作配置作用的 .env 文件的位置
  24. EnvironmentFile=/etc/vaultwarden.env
  25. # 已编译的二进制的位置
  26. ExecStart=/usr/bin/vaultwarden
  27. # 设置合理的连接和进程限制
  28. LimitNOFILE=1048576
  29. LimitNPROC=64
  30. # 将 bitwarden_rs 与系统的其他部分隔离开
  31. PrivateTmp=true
  32. PrivateDevices=true
  33. ProtectHome=true
  34. ProtectSystem=strict
  35. # 仅允许对以下目录进行写入,并将其设置为工作目录(用户和密码数据存储在这里)
  36. WorkingDirectory=/var/lib/vaultwarden
  37. ReadWriteDirectories=/var/lib/vaultwarden
  38. # 允许 bitwarden_rs 绑定 0-1024 范围内的端口
  39. AmbientCapabilities=CAP_NET_BIND_SERVICE
  40. [Install]
  41. WantedBy=multi-user.target

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

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

  1. $ sudo systemctl edit vaultwarden.service

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

  1. $ sudo systemctl daemon-reload

用法

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

  1. $ sudo systemctl start vaultwarden.service

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

  1. $ sudo systemctl enable vaultwarden.service

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

更新 Vaultwarden

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

$ sudo systemctl restart vaultwarden.service

卸载 Vaultwarden

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

$ sudo systemctl disable --now vaultwarden.service

然后,您可以删除二进制、.env 文件、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

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

$ systemctl --version

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

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

$ sudo systemctl daemon-reload

服务无法启动

systemd 日志中显示以下错误(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 不支持环境文件中与变量在同一行的注释。比如下面这个 .env 文件示例中,变量 WEBSOCKET_ENABLED 将不会被加载:

ROCKET_PORT=XXXX
WEBSOCKET_ENABLED=true # enable websocket

来源:#1607

更多信息

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