0%

Vaultwarden 在 Windows 上的编译与使用

Vaultwarden 是一个用 Rust 编写的非官方 Bitwarden 服务器实现。
Bitwarden 是一个密码管理器,可以在浏览器、Android 实现密码填充功能。使用自托管 Vaultwarden 服务器可以在离线环境下使用 Bitwarden 客户端、浏览器插件、网页端管理密码。
Vaultwarden 有提供 Docker 容器运行方式,也可以通过 Docker 容器提取预编译的二进制文件,但预编译的二进制文件并没有 Windows 版本,所以需要手动编译。
为了实现开箱即用和便携化,编译时尽可能选择静态链接、二进制文件无额外依赖的方法。
本文主要为 x86_64 架构编译,arm64 的方法可能不同,所有命令使用 PowerShell 执行。
文末放出了编译好的文件,可以先尝试使用后再决定是否要自行编译。
2025-05-06 更新:添加了使用 GitHub Actions 的编译方法。

本地编译环境搭建

  1. 安装 C++ 编译工具链

参照 在 Windows 上针对 Rust 设置开发环境的教程,需要先安装 C++ 编译工具链。
可以安装 Microsoft C++ 生成工具Microsoft Visual Studio,然后启用 使用 C++ 的桌面开发 工作负载。

  1. 安装 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
  1. 使用 vcpkg 安装 OpenSSL

Vaultwarden 还依赖 openssl/vendored,需要使用 vcpkg 安装:

1
2
3
4
5
6
7
8
9
# 克隆仓库
git clone https://github.com/microsoft/vcpkg
cd vcpkg
# 下载 vcpkg
.\bootstrap-vcpkg.bat
# 设置用户范围的 vcpkg 实例
.\vcpkg integrate install
# 安装 openssl 依赖库
.\vcpkg install openssl:x64-windows-static
  1. 编译 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"
# Rust 默认使用 openssl:x64-windows-static-md 库,将会依赖 msvcrXXX.dll
# 添加该标记以使用 openssl:x64-windows-static 库,不再依赖其他 dll
$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.2Web-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