树莓派上部署Vaultwarden

Vaultwarden(原名 Bitwarden_RS)是一个用 Rust 编写的轻量级、自托管的 Bitwarden 兼容密码管理服务器。它资源占用低,适合单机部署,非常适合个人或小团队使用。

我主要用来弥补 KeePassXC 不能覆盖的场景,它的多端同步功能非常适合局域网,比如你在家里电脑上保存了个密码,通过 Vaultwarden 可同步到同 WI-FI 的手机或者平板上,完全不用绕道公网去。

老实说,对于密码类管理工具,我不信任任何能被公网接触到的方案。所以,在树莓派上私有化部署 Vaultwarden 非常合理。

设备信息:

1mephisto@raspberrypi:~ $ cat /proc/cpuinfo | grep Model
2Model		: Raspberry Pi 2 Model B Rev 1.1
3mephisto@raspberrypi:~ $ uname -m
4armv7l

我已经在上面跑了很多服务

 1mephisto@raspberrypi:~ $ pstree
 2systemd─┬─ModemManager───2*[{ModemManager}]
 3        ├─NetworkManager───2*[{NetworkManager}]
 4        ├─2*[agetty]
 5        ├─avahi-daemon───avahi-daemon
 6        ├─cron
 7        ├─dbus-daemon
 8        ├─frpc───6*[{frpc}]
 9        ├─navidrome───12*[{navidrome}]
10        ├─nginx───4*[nginx]
11        ├─polkitd───2*[{polkitd}]
12        ├─prometheus───10*[{prometheus}]
13        ├─sing-box───10*[{sing-box}]
14        ├─sshd───sshd───sshd───bash───pstree
15        ├─sudo───sudo───vim───{vim}
16        ├─systemd───(sd-pam)
17        ├─systemd-journal
18        ├─systemd-logind
19        ├─systemd-timesyn───{systemd-timesyn}
20        ├─systemd-udevd
21        ├─thd
22        └─vaultwarden───12*[{vaultwarden}]

已经在跑的:frpc、navidrome、sing-box、prometheus,昨天又加上了 vaultwarden,都是自己玩的轻量服务,cpu 长期空闲,内存用了不到 1/3,只有磁盘剩余容量不多了。

题外话不多说,跟着我开始操作,难点在 2 个地方:

  • 在电脑端交叉编译出 armv7l 32 位版本的的二进制程序;
  • 配置证书如何让 iPhone 和 iPad 上的 Bitwarden 客户端可用。

二者都有一定的难度,主要是互联网上相关资料比较少。

1. 电脑上交叉编译 arm 版本 32 位 vaultwarden 程序

搜索互联网上的资料,私有化部署 vaultwarden 都是 docker 一把梭,试问我一个低配版树莓派,还要额外安装个 docker?直接二进制部署不好么。

当然,高配机器或者不想折腾,能跑 docker 也节约时间。

看官方的 release 页面没有提供 ARMv7 的预编译版本,只能自己动手在 Arch Linux 主机上进行交叉编译,这是获得最新版 + 安全更新 + ARMv7 支持的最佳方式。

避坑:不要使用 paru -S arm-linux-gnueabihf-gcc 进行交叉编译,arm-linux-gnueabihf-gcc 在 aur 中,会下载很多额外环境包,好几个 G 的那种,光是编译这些包就会消耗小时级别的时间,还有可能出错,灾难级别,不信你可以试试看。

这个时候,不得不让人感叹!gcc-arm-linux-gnueabihf 包在 Debian 发行版仓库中默认就包含,不用自己手刨编译😅,还是有实力的,Arch 没有它有,这就是差别。

先切换到 Vaultwarden 的源码目录,然后开始编译。

编译方法:

 1docker run --rm -v "$(pwd)":/build -w /build \
 2  debian:bookworm \
 3  bash -c "
 4    # 1. 安装工具链
 5    apt update && apt install -y \
 6      curl build-essential gcc-arm-linux-gnueabihf pkg-config
 7
 8    # 2. 启用 multiarch 并安装 ARM 依赖
 9    dpkg --add-architecture armhf
10    apt update
11    apt install -y libssl-dev:armhf libsqlite3-dev:armhf
12
13    # 3. 安装 Rust
14    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
15    source /root/.cargo/env
16
17    # 4. ⭐⭐⭐ 关键:配置 Cargo 使用 ARM 链接器 ⭐⭐⭐
18    mkdir -p .cargo
19    cat > .cargo/config.toml <<EOF
20[target.armv7-unknown-linux-gnueabihf]
21linker = \"arm-linux-gnueabihf-gcc\"
22runner = \"qemu-arm -L /usr/arm-linux-gnueabihf\"
23EOF
24
25    # 5. 设置 pkg-config(可选,但推荐)
26    export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig
27    export PKG_CONFIG_SYSROOT_DIR=/
28
29    # 6. 编译(启用 sqlite)
30    rustup target add armv7-unknown-linux-gnueabihf
31    cargo build --release --target=armv7-unknown-linux-gnueabihf --features sqlite
32  "

上面的意思是使用 docker 镜像 debian:bookworm,在容器里进行编译,前后倒腾了几个小时得到的。

比如说要启用 multiarch 支持、libssl-dev:armhf 和 libsqlite3-dev:armhf 缺失、--features sqlite 编译参数等,谁编谁知道,不过现在有 AI 加持,稍微能省点心。

读者直接用上面的编译语句,约等于节约 2 个小时。编译需要时间,看电脑配置,请保持耐心!

查看编译结果

1➜  vaultwarden git:(main) file target/armv7-unknown-linux-gnueabihf/release/vaultwarden
2target/armv7-unknown-linux-gnueabihf/release/vaultwarden: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=e8a6e119d65a23dc6b2833d59aa669bb36bdce38, for GNU/Linux 3.2.0, not stripped

确认为 32 位 archv7,直接复制到树莓派上面就能跑。

2. 安装 Web Vault 等

在树莓派上运行 vaultwarden 会提示你安装 Web Vault

 1# 1. 进入 Vaultwarden 安装目录
 2cd /opt/vaultwarden
 3
 4# 2. 创建 web-vault 目录
 5sudo mkdir -p web-vault
 6
 7# 3. 进入 web-vault 目录
 8cd /opt/vaultwarden/web-vault
 9
10# 4.下载
11sudo wget https://github.com/dani-garcia/bw_web_builds/releases/download/v2025.12.2/bw_web_v2025.12.2.tar.gz
12
13# 解压到当前目录(注意:tar.gz 通常包含一个顶层目录,我们需要提取内容)
14sudo tar -xzf bw_web_v2025.12.2.tar.gz --strip-components=1
15
16# 清理压缩包
17sudo rm bw_web_v2025.12.2.tar.gz
18
19# 权限处理
20sudo chown -R vaultwarden:vaultwarden /opt/vaultwarden/web-vault

其它配置信息

 1mephisto@raspberrypi:~ $ systemctl cat vaultwarden.service
 2# /etc/systemd/system/vaultwarden.service
 3[Unit]
 4Description=Vaultwarden Password Manager (Raspberry Pi)
 5After=network.target
 6
 7[Service]
 8User=vaultwarden
 9Group=vaultwarden
10WorkingDirectory=/opt/vaultwarden
11EnvironmentFile=/etc/default/vaultwarden
12ExecStart=/opt/vaultwarden/vaultwarden
13Restart=always
14RestartSec=10
15
16[Install]
17WantedBy=multi-user.target
18mephisto@raspberrypi:~ $ cat /etc/default/vaultwarden
19DOMAIN=http://192.168.1.5
20ADMIN_TOKEN='your token'
21WEBSOCKET_ENABLED=true
22DATA_FOLDER=/opt/vaultwarden/data
23ROCKET_ADDRESS=127.0.0.1
24ROCKET_PORT=8080

其中 ADMIN_TOKENsudo -u vaultwarden /opt/vaultwarden/vaultwarden hash 生成,不符合要求看启动日志排错。

启动 sudo systemctl start vaultwarden 后,确认进程正常:

1mephisto@raspberrypi:~ $ sudo ss -lntp |grep vault
2LISTEN 0      4096       127.0.0.1:8080       0.0.0.0:*    users:(("vaultwarden",pid=16926,fd=22))

3. Nginx 配置

没有人希望带个 8080 端口访问, 而且移动端的 Bitwarden 是需要 https,所以要通过 Nginx 代理下。

 1mephisto@raspberrypi:~ $ cat /etc/nginx/sites-enabled/vaultwarden
 2server {
 3    listen 443 ssl;
 4    server_name _;
 5
 6    ssl_certificate /etc/nginx/ssl/my.pem;
 7    ssl_certificate_key /etc/nginx/ssl/my.key;
 8
 9    location / {
10        proxy_pass http://127.0.0.1:8080;
11        proxy_set_header Host  $host;
12        proxy_set_header X-Real-IP  $remote_addr;
13        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
14        proxy_set_header X-Forwarded-Proto  $scheme;
15    }
16
17    location /notifications/hub {
18        proxy_pass http://127.0.0.1:8080;
19        proxy_http_version 1.1;
20        proxy_set_header Upgrade  $http_upgrade;
21        proxy_set_header Connection "upgrade";
22    }
23}

上面的配置很简单,启动运行 Nginx 后,通过电脑浏览器访问 https://192.168.1.5就能正常使用了(信任证书操作还是要的)。

证书部分要特殊说明下,见下面一个章节。

4. 移动端证书处理

坑点:在 iPhone 和 iPad 上面,使用类似下面的方式生成的证书是不可用的❌,Bitwarden 限制,请注意!

1sudo openssl req -x509 -nodes -days 3650   -newkey rsa:2048   -keyout /etc/nginx/ssl/vaultwarden.key   -out /etc/nginx/ssl/vaultwarden.crt   -subj "/CN=192.168.1.5"

得在电脑上使用 mkcert 生成证书!

 1
 2➜  ~ sudo pacman -S mkcert
 3➜  ~ mkcert 192.168.1.5
 4Created a new local CA 💥
 5Note: the local CA is not installed in the system trust store.
 6Run "mkcert -install" for certificates to be trusted automatically ⚠️
 7
 8Created a new certificate valid for the following names 📜
 9 - "192.168.1.5"
10
11The certificate is at "./192.168.1.5.pem" and the key at "./192.168.1.5-key.pem"12
13It will expire on 25 April 2028 🗓

用上面的 certificate 和 key,分别替换 Nginx 中的 ssl_certificate 和 ssl_certificate_key,我想你应该懂的。

此外,还需要把根证书 rootCA.pem 导入到移动端。

1➜  ~ mkcert -CAROOT
2/home/mephisto/.local/share/mkcert
3➜  ~ ls /home/mephisto/.local/share/mkcert/rootCA.pem
4/home/mephisto/.local/share/mkcert/rootCA.pem

具体操作,请看这个文档:https://github.com/FiloSottile/mkcert?tab=readme-ov-file#mobile-devices

传到手机上后,按上面的文档设置信任证书,否则,你的 Bitwarden 始终无法工作,会弹出报错,报错信息也看不出来错在哪里!

信任证书后,创建账号不报错了,才表明大功告成。

为什么 openssl 生成的证书不行,而 mkcert 生成的可以,真的是搞不明白,也许这就是苹果生态吧。

没有 Android 手机,没做测试,这么多年折腾下来,深刻感觉还是 web 标准好,真正的互联网。

5. 其它

最后提下使用经验,在 pc 浏览器上,配合浏览器插件 Bitwarden 插件使用

iPhone 和 iPad 上:

  • 自动填充,可以和 Password 并存
  • 启动刷新同步,方便多端同步
  • 启用面容识别、Touch ID 等,我想没有人喜欢输入高强度的主密码

至于使用方法,多摸索下就知道了,很方便的。

此外,我的个人核心密码放在 KeePassXC 中,密码个人倾向全掌控的离线加密方案。只是 KeePassXC 的多端能力欠缺,才同时启用 Bitwarden,适用一些非重要的登录移动端登录场景,也就是作为 KeePassXC 补充,个人觉得非常方便又安全。如果你信任 Bitwarden,全端同步,甚至开启公网访问能力,可完全替代其它密码管理器,比如系统自带的 Password。

最后修改于: Sunday, January 25, 2026
欢迎关注微信公众号,留言交流;也欢迎使用我开发的微信小程序。

相关文章:

翻译: