樹莓派上部署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
欢迎关注微信公众号,留言交流;也欢迎使用我开发的微信小程序。

相關文章:

翻譯: