树莓派上部署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_TOKEN 由 sudo -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。

版权申明:
- 未标注来源的内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。
相关文章:
- 树莓派跑分流代理
- 搭建树莓派无线路由器
- 使用goaccess实时分析Caddy日志
- 个人网站监控
- Hugo全站AVIF记
- Linux下尝试使用Godot开发小游戏
- Arch linux dae 透明代理
- Airflow接管galler-dl下载任务
- 如何使用gallery-dl批量下载图像
- Arch核显下如何愉快玩Dota2和CS2