这是什么
Vaultwarden 是一款用 Rust 编写的轻量级非官方 Bitwarden 服务器,兼容 Bitwarden 的 API,因此所有官方 Bitwarden 客户端(浏览器扩展、桌面端、iOS/Android、CLI)都可以与它同步。它可以存储密码、通行密钥(passkeys)、TOTP 种子、银行卡信息和安全笔记的加密密码库,支持组织、附件和管理员控制功能,而内存占用仅为官方服务端的一小部分。
为何选择离岸托管
您的密码库是您所拥有的最敏感的资产,因此谁掌管这台服务器、受哪国法律管辖,与加密算法本身同样重要。选择位于隐私友好地区(NL/CH/RO/IS)、无需 KYC 且以加密货币支付的 VPS,意味着存放您加密密码库的服务器不会与您的法定身份绑定,不受美国/英国传票管辖,也不会因支付服务商将您下架而被锁定。
部署过程
一套可用的参考配置
将其复制到全新的 ChainVPS 实例中。替换占位符后即可启动。
# 1) DNS: point vault.example.com -> your ChainVPS IP (A/AAAA record)
# 2) Generate an Argon2 ADMIN_TOKEN (do NOT use a plain string):
# docker run --rm -it vaultwarden/server /vaultwarden hash
# paste the resulting '$argon2id$...' string as ADMIN_TOKEN below (single-quote it in .env)
# 3) Save as docker-compose.yml, create the Caddyfile shown, then: docker compose up -d
services:
vaultwarden:
image: vaultwarden/server:1.32.7
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vault.example.com" # must match the public URL exactly
SIGNUPS_ALLOWED: "false" # create your account, then keep this false
INVITATIONS_ALLOWED: "true"
ADMIN_TOKEN: "${ADMIN_TOKEN}" # Argon2 hash from step 2, kept in .env
WEBSOCKET_ENABLED: "true" # live sync (served on the main port)
SENDS_ALLOWED: "true"
ROCKET_PORT: "80"
volumes:
- ./vw-data:/data # vaults, attachments, sqlite db, keys
networks: [vw]
# no host port published: only Caddy talks to it over the internal network
caddy:
image: caddy:2
container_name: vaultwarden-caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # HTTP/3
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-data:/data
- ./caddy-config:/config
networks: [vw]
depends_on: [vaultwarden]
networks:
vw:
# ---- Caddyfile (same directory) ----
# vault.example.com {
# encode gzip
# reverse_proxy vaultwarden:80
# }
# Caddy fetches and renews a Let's Encrypt cert automatically; HTTPS is mandatory
# because Bitwarden clients use WebCrypto, which only runs on a secure origin.
防火墙
需开放的端口
| 端口 | 协议 | 用途 |
|---|---|---|
| 443 | TCP | HTTPS 密码库 + 客户端同步 + WebSocket(通过 Caddy);唯一必须公开的端口 |
| 80 | TCP | HTTP -> HTTPS 重定向,以及 ACME/Let's Encrypt 证书签发 |
| 443 | UDP | 可选的 HTTP/3(QUIC),用于加快客户端同步速度 |
按需调配规格
您需要哪种套餐
VPS Nano/Small(1 vCPU,1-2 GB 内存)
Vaultwarden 使用 SQLite 时空闲内存占用约为 15-30 MB,Nano 套餐绰绰有余。除非您存储较大的附件,否则所需存储空间很小。
VPS Pro(2 vCPU,4 GB 内存)
为并发同步、附件存储,以及在同一台服务器上运行 Caddy 和 fail2ban/备份留出充足余量。
VPS Pro(高配版)或入门级独立服务器(Dedicated)
从 SQLite 迁移到 Postgres/MySQL,并将附件存放在 Storage 套餐或更大容量的磁盘上;独享 CPU 可确保在高负载下同步延迟保持稳定。
最佳地区: 为您的密码库选择 ChainVPS 的隐私友好地区:瑞士(CH)和冰岛(IS)拥有深厚的数据保护与隐私传统,荷兰(NL)在遵循欧盟隐私法规的同时提供出色的网络连接,罗马尼亚(RO)或摩尔多瓦(MD)则位于最严格的监控共享联盟之外。请选择在地理位置上离您和用户同步所在地最近的节点,以尽量降低延迟——反正密码库始终在客户端完成加密。
全面加固安全
安全加固清单
- 创建好账户后请保持 SIGNUPS_ALLOWED=false,并使用邀请功能(INVITATIONS)添加用户;公开密码库上开放的注册接口很容易被滥用。
- 务必将 ADMIN_TOKEN 设置为通过 'vaultwarden hash' 生成的 Argon2 哈希值(切勿使用明文字符串),或者在配置完成后不设置 ADMIN_TOKEN,以彻底禁用 /admin 管理面板。建议将 /admin 通过防火墙限制为仅您自己的 IP 可访问。
- 强制仅使用 HTTPS,并交由 Caddy 管理 Let's Encrypt 证书;Bitwarden 客户端拒绝在明文 HTTP 上运行加密操作,而有效证书可以防止同步过程中的降级攻击/中间人攻击(MITM)。
- 请定期将 ./vw-data 目录(尤其是 rsa_key.pem、config.json、db.sqlite3 及附件)备份到服务器之外的位置,例如 ChainVPS 的 Storage 套餐;一旦丢失 rsa_key.pem,所有现有会话/令牌都将失效。
- 针对 Vaultwarden 的日志(LOG_FILE + LOG_LEVEL)运行 fail2ban,以封禁暴力破解登录尝试,并要求每位用户都启用双因素认证(2FA);通过 ufw/nftables 仅开放 80/443 端口,其余全部丢弃。
问题
主机服务 Vaultwarden — 常见问题
Vaultwarden 和 Bitwarden 是同一个东西吗?
它是一个独立、轻量级的 Bitwarden API 服务端实现,并非由 Bitwarden 官方公司开发,但官方的 Bitwarden 应用和扩展都可以与之配合使用,它支持密码库、组织、附件、Sends 功能以及通行密钥(passkeys)。对于希望自建服务而又不想承受官方服务端资源开销的个人和小团队来说,它是理想之选。
如果服务器被查封或主机被攻破,我的数据还安全吗?
密码库是在客户端使用由主密码派生出的密钥进行加解密的,因此服务器始终只存储密文。将其托管在注重隐私的司法辖区、无需 KYC 的服务器上,可以减少能够强制获取访问权限的对象,但您仍然需要使用强主密码、启用 2FA,并将 DOMAIN 保持在 HTTPS 上,以保护登录流程本身的安全。
我必须使用 HTTPS 吗?可以直接用 IP 吗?
您需要使用带有效证书的 HTTPS 以及一个域名。Bitwarden 客户端使用浏览器的 WebCrypto API,该 API 只能在安全源(secure origin)下运行,因此使用明文 http:// 或纯 IP 的方式将无法完成同步。配置中包含的 Caddy 服务会自动签发并续期免费的 Let's Encrypt 证书。
该选择 SQLite 还是 MySQL/Postgres?
SQLite(默认选项)对于个人使用以及至多几十名用户的小团队来说完全够用,而且速度最快。只有在大型多组织部署,或者您需要集中式数据库备份与复制时,才需要切换到 MySQL 或 PostgreSQL;届时相应设置 DATABASE_URL 即可。
在不开放公共注册的情况下,如何添加用户?
保持 SIGNUPS_ALLOWED=false 和 INVITATIONS_ALLOWED=true,然后从某个组织(Organization)内邀请用户,或通过 /admin 管理面板邀请。收到邀请的用户即使在公共注册关闭的情况下也可以完成注册,从而避免注册接口被滥用。
购买 VPS 时可以不提供身份证件吗?
可以。ChainVPS 无需 KYC 认证,支持加密货币支付,因此存放您加密密码库的服务器不会与您的法定身份或可能冻结账户的银行卡支付机构产生关联。