Vaultwarden 是一个用 Rust 编写的非官方 Bitwarden 服务器实现。
Bitwarden 是一个密码管理器,可以在浏览器、Android 实现密码填充功能。使用自托管 Vaultwarden 服务器可以在离线环境下使用 Bitwarden 客户端、浏览器插件、网页端管理密码。
Vaultwarden 有提供 Docker 容器运行方式,也可以通过 Docker 容器提取预编译的二进制文件,但预编译的二进制文件并没有 Windows 版本,所以需要手动编译。
为了实现开箱即用和便携化,编译时尽可能选择静态链接、二进制文件无额外依赖的方法。
本文主要为 x86_64
架构编译,arm64
的方法可能不同,所有命令使用 PowerShell
执行。
文末放出了编译好的文件,可以先尝试使用后再决定是否要自行编译。
2025-05-06 更新:添加了使用 GitHub Actions 的编译方法。
本地编译环境搭建
- 安装 C++ 编译工具链
参照 在 Windows 上针对 Rust 设置开发环境的教程,需要先安装 C++ 编译工具链。
可以安装 Microsoft C++ 生成工具或 Microsoft Visual Studio,然后启用 使用 C++ 的桌面开发
工作负载。
- 安装 Rust
首先通过官网下载 rustup-init.exe,使用默认设置安装 Rust:
1 2 3
| $env:RUSTUP_UPDATE_ROOT="https://mirrors.cernet.edu.cn/rustup/rustup" $env:RUSTUP_DIST_SERVER="https://mirrors.cernet.edu.cn/rustup" .\rustup-init.exe
|
- 使用 vcpkg 安装 OpenSSL
Vaultwarden 还依赖 openssl/vendored
,需要使用 vcpkg 安装:
1 2 3 4 5 6 7 8 9
| git clone https://github.com/microsoft/vcpkg cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install
.\vcpkg install openssl:x64-windows-static
|
- 编译 Vaultwarden
克隆 Vaultwarden,进入目录后编译:
1 2 3 4 5 6 7 8 9 10
| git clone https://github.com/dani-garcia/vaultwarden cd vaultwarden
$env:RUSTUP_UPDATE_ROOT="https://mirrors.cernet.edu.cn/rustup/rustup" $env:RUSTUP_DIST_SERVER="https://mirrors.cernet.edu.cn/rustup"
$env:RUSTFLAGS="-Ctarget-feature=+crt-static"
cargo build --features sqlite --release
|
在本地使用,仅需要启用 sqlite 数据库支持,如编译成功,exe 文件会出现在 .\target\release\
目录下。
使用 GitHub Actions 编译
如果觉得以上搭建步骤麻烦,可以使用 GitHub Actions 来完成编译。
创建 repo 或者在现有 repo 中,创建文件:.github/workflows/build.yml
写入以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| name: Vaultwarden Build
on: workflow_dispatch: inputs: tag_choice: description: "版本选择" required: true default: "release" type: choice options: - release - latest - custom tag: description: "自定义 commit" required: false
jobs: build: runs-on: windows-latest
steps: - name: 检查工具版本 run: git version && cargo version && vcpkg version
- name: vaultwarden 版本选择 id: get_tag run: | if ("${{ github.event.inputs.tag_choice }}" -eq "release") { $release = Invoke-RestMethod -Uri "https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest" echo "Using release tag: $($release.tag_name)" echo "tag=$($release.tag_name)" >> $env:GITHUB_OUTPUT } elseif ("${{ github.event.inputs.tag_choice }}" -eq "latest") { echo "Using latest commit" echo "tag=" >> $env:GITHUB_OUTPUT } elseif ("${{ github.event.inputs.tag_choice }}" -eq "custom") { echo "Using custom tag: ${{ github.event.inputs.tag }}" echo "tag=${{ github.event.inputs.tag }}" >> $env:GITHUB_OUTPUT }
- name: 克隆 vaultwarden 仓库 run: git clone https://github.com/dani-garcia/vaultwarden
- name: 切换版本 if: ${{ steps.get_tag.outputs.tag != '' }} run: git switch --detach "${{ steps.get_tag.outputs.tag }}" working-directory: vaultwarden
- name: 下载 web-vault run: | $Release = Invoke-RestMethod -Uri "https://api.github.com/repos/dani-garcia/bw_web_builds/releases/latest" $Asset = $Release.assets | Where-Object { $_.name -like "*.tar.gz" }
if (-not $Asset) { Write-Error "No .tar.gz asset found." exit 1 }
$DownloadUrl = $Asset.browser_download_url $FileName = $Asset.name $OutPath = "web-vault"
Write-Host "Downloading $FileName..." Invoke-WebRequest -Uri $DownloadUrl -OutFile $FileName
Write-Host "Extracting..." tar -xf $FileName
- name: 配置 vcpkg 缓存 uses: actions/github-script@v7 with: script: | core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
- name: 使用 vcpkg 安装依赖 run: | vcpkg integrate install vcpkg install openssl:x64-windows-static env: VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
- name: 编译 vaultwarden run: cargo build --features sqlite --release working-directory: vaultwarden env: RUSTFLAGS: "-Ctarget-feature=+crt-static"
- name: 移动文件 run: move .\vaultwarden\target\release\vaultwarden.exe .\vaultwarden.exe
- name: 版本信息 id: get_version run: | $version_output = .\vaultwarden.exe -v $vaultwarden_version = ($version_output | Select-String -Pattern "Vaultwarden (\S+)").Matches.Groups[1].Value $web_vault_version = ($version_output | Select-String -Pattern "Web-Vault (\S+)").Matches.Groups[1].Value
echo "Vaultwarden version: $vaultwarden_version" echo "Web-Vault version: $web_vault_version"
echo "vaultwarden_version=$vaultwarden_version" >> $env:GITHUB_OUTPUT echo "web_vault_version=$web_vault_version" >> $env:GITHUB_OUTPUT
- name: 打包文件 uses: actions/upload-artifact@v4 with: name: Vaultwarden_${{ steps.get_version.outputs.vaultwarden_version }}_${{ steps.get_version.outputs.web_vault_version }} path: | vaultwarden.exe web-vault
|
之后在 Actions 栏中可以找到名为 Vaultwarden Build
的 workflow,点击 Run workflow
,可以选择编译的 Vaultwarden 版本(release、latest)。
如果需要自定义选择的版本,可以选择 custom,然后在下方填入 tag 或 commit id,将会使用 git switch --detach
切换版本。
首次编译可能需要 27 分钟,vcpkg 缓存生成后,再次编译大约需要 18 分钟。
编译后打包的压缩包里包含了最新的 web-vault,可以跳过下面的获取步骤。
Vaultwarden 使用
得到编译完成的 exe 文件后,还需要 web-vault 文件夹来提供网页内容。
按照 安装 web-vault 的教程,从 dani-garcia/bw_web_builds 下载 bw_web_vxxxx.xx.xx.tar.gz
文件解压得到 web-vault
文件夹,放在 vaultwarden.exe
同目录下。
然后创建 .env
配置文件:
1 2 3 4 5 6 7 8 9 10 11
| DISABLE_ICON_DOWNLOAD=true
LOG_LEVEL=warn
ROCKET_ADDRESS=127.10.10.100
ROCKET_PORT=8000
ROCKET_WORKERS=1
|
可以参考 .env.template 配置更多选项。
创建 data
文件夹,数据库和设置文件将会保存到这里。运行 vaultwarden.exe
,在网页中打开 http://127.10.10.100:8000
可以开始注册账号使用。
要在浏览器插件或者程序上使用,需要在自托管环境设置中将服务器 URL 设置为 http://127.10.10.100:8000
。
如果需要开机启动或者后台运行,可以使用 WinSW 创建开机自启服务。
在仅使用浏览器插件进行填充的情况下,只有更新密码信息才会和服务端通信,服务端后台常驻不是很有必要。
以下是基于 vaultwarden 1.33.2 和 Web-Vault v2025.1.1 编译打包的文件信息:
1 2 3 4 5 6 7
| 文件版本: Vaultwarden 1.33.2 Web-Vault 2025.1.1
MD5 校验: 3f8efef99c93d2668e92011265cfc557 vaultwarden.exe 7cf14321f9ed3908b4f13b7282c95a7e vaultwarden_1.33.2.zip
|
点击下载 vaultwarden_1.33.2.zip