Vaultwarden 部署指南:在 VPS 上用 Docker 自托管密码管理器,替代 Bitwarden 的轻量级方案

为什么选择 Vaultwarden?

密码管理是数字生活的基础设施。市面上虽然有不少密码管理器,但要么收费昂贵(1Password 年费 $35+),要么把数据存储在云端(LastPass 曾经的泄漏事件让人心有余悸)。

Vaultwarden 是 Bitwarden 服务器端的非官方轻量级重写版本,用 Rust 语言编写,相比官方版本(需要 SQL Server、数 GB 内存)来说,资源消耗极低,非常适合在个人 VPS 上部署。

Vaultwarden 的核心优势

特性VaultwardenBitwarden 官方
内存占用~30MB1GB+
数据库依赖SQLite/MySQL/PostgreSQLSQL Server
Docker 镜像大小~50MB~2GB+
完全兼容客户端✅ 全平台✅ 全平台
价格免费自托管复杂,付费 $10/年
  • 🔒 端到端加密:服务器无法读取您的密码数据
  • 📱 全平台客户端:支持 iOS、Android、Chrome/Firefox/Edge 扩展、桌面应用
  • 🔑 完整功能:密码管理、安全笔记、身份信息、信用卡、TOTP 两步验证
  • 🚀 超低资源:最低 512MB RAM 的 VPS 即可流畅运行
  • 🔐 自托管:数据完全在您自己的服务器上

前置要求

  • 一台 VPS(最低 512MB RAM,1GB 推荐)
  • Docker 和 Docker Compose 已安装
  • 一个域名(用于 HTTPS 配置,建议使用 vault.yourdomain.com
  • 基本的 Linux 命令行知识

第一步:安装 Docker 和 Docker Compose

如果您的 VPS 尚未安装 Docker,请执行以下命令:

# 安装 Docker
curl -fsSL https://get.docker.com | sh

# 设置 Docker 开机自启
sudo systemctl enable docker
sudo systemctl start docker

# 安装 Docker Compose 插件
sudo apt-get install docker-compose-plugin -y

# 验证安装
docker --version && docker compose version

第二步:准备目录结构

# 创建 Vaultwarden 目录
mkdir -p ~/vaultwarden
cd ~/vaultwarden

# 创建数据持久化目录
mkdir -p ./data ./nginx/conf.d

第三步:配置 Docker Compose

创建 docker-compose.yml 文件:

version: '3.8'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    volumes:
      - ./data:/data
    environment:
      # 域名配置(重要!)
      - DOMAIN=https://vault.yourdomain.com
      # 管理员面板密码(首次登录后立即修改)
      - ADMIN_TOKEN=your-strong-admin-token-here
      # 注册开放设置(部署后建议关闭)
      - SIGNUPS_ALLOWED=true
      # 邀请功能
      - INVITATIONS_ALLOWED=true
      # 日志级别
      - LOG_LEVEL=warn
      # 数据推送间隔(秒)
      - PUSH_INTERVAL=60
      # 禁用新版本检查
      - DISABLE_ADMIN_TOKEN=false
    ports:
      - "127.0.0.1:8080:80"
    networks:
      - vaultwarden_network

  nginx:
    image: nginx:alpine
    container_name: vaultwarden-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
      - ./data:/data:ro
    depends_on:
      - vaultwarden
    networks:
      - vaultwarden_network

networks:
  vaultwarden_network:
    driver: bridge

⚠️ 安全提示ADMIN_TOKEN 请使用强密码。部署完成后建议执行 openssl rand -base64 48 生成随机 token。

第四步:配置 Nginx 反向代理和 SSL

创建 Nginx 配置文件 nginx/conf.d/vaultwarden.conf

server {
    listen 80;
    server_name vault.yourdomain.com;
    
    # Let's Encrypt 验证路径
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    server_name vault.yourdomain.com;

    # SSL 证书(稍后使用 Certbot 生成)
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # WebSocket 支持(Vaultwarden 需要)
    location /notifications/hub {
        proxy_pass http://vaultwarden:80;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /notifications/hub/negotiate {
        proxy_pass http://vaultwarden:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        proxy_pass http://vaultwarden:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 大文件上传支持(附件导入)
        client_max_body_size 128M;
    }
}

第五步:申请 SSL 证书

使用 Let’s Encrypt 和 Certbot 申请免费 SSL 证书:

# 安装 Certbot
sudo apt-get install certbot -y

# 申请证书(先确保域名已指向服务器 IP)
sudo certbot certonly --standalone -d vault.yourdomain.com

# 复制证书到 Nginx SSL 目录
sudo mkdir -p ~/vaultwarden/nginx/ssl
sudo cp /etc/letsencrypt/live/vault.yourdomain.com/fullchain.pem ~/vaultwarden/nginx/ssl/
sudo cp /etc/letsencrypt/live/vault.yourdomain.com/privkey.pem ~/vaultwarden/nginx/ssl/
sudo chown -R $USER:$USER ~/vaultwarden/nginx/ssl

💡 Tip: 建议设置 crontab 自动续期证书。编辑 sudo crontab -e,添加:

0 3 * * * certbot renew --quiet && cp /etc/letsencrypt/live/vault.yourdomain.com/fullchain.pem ~/vaultwarden/nginx/ssl/ && cp /etc/letsencrypt/live/vault.yourdomain.com/privkey.pem ~/vaultwarden/nginx/ssl/ && docker restart vaultwarden-nginx

第六步:启动服务

cd ~/vaultwarden
docker compose up -d

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs -f vaultwarden

第七步:初始化配置

  1. 在浏览器中打开 https://vault.yourdomain.com
  2. 点击"创建账户"注册您的第一个账号
  3. 登录后访问 https://vault.yourdomain.com/admin(使用您设置的 ADMIN_TOKEN)
  4. 在管理员面板中:
    • 关闭公开注册:将 SIGNUPS_ALLOWED 改为 false
    • 配置 SMTP:设置邮箱以便密码找回
    • 查看系统信息:确认运行状态

第八步:导入密码

从其他密码管理器导入

假设您使用的是 Firefox 导出 CSV:

# 将 CSV 文件上传到 Vaultwarden 数据目录
scp ~/Downloads/firefox_passwords.csv user@your-vps:~/vaultwarden/data/

# 通过 Vaultwarden Web UI 导入
# 点击右上角头像 → 工具 → 导入数据 → 选择对应格式

Vaultwarden 支持从以下工具导入:

  • Bitwarden(原生 JSON)
  • 1Password(1pif/CSV)
  • LastPass(CSV)
  • Chrome(CSV)
  • Firefox(CSV)
  • KeePass(CSV/XML)
  • Dashlane(CSV)

第九步:客户端配置

Vaultwarden 完全兼容 Bitwarden 官方客户端。安装后只需修改服务器地址即可。

以 Bitwarden 浏览器扩展为例:

  1. 安装 Bitwarden 浏览器扩展
  2. 点击扩展图标 → 设置(齿轮图标)
  3. 找到"自托管环境"选项
  4. 输入您的服务器地址:https://vault.yourdomain.com
  5. 点击"保存",然后使用您的账号登录

支持的客户端平台

平台下载方式
Chrome/Edge/Firefox浏览器扩展商店搜索 Bitwarden
iOSApp Store 搜索 Bitwarden
AndroidGoogle Play 或 F-Droid 搜索 Bitwarden
macOS/Windows/LinuxBitwarden 官网下载桌面应用
CLIcurl -sSLO https://github.com/bitwarden/clients/releases/latest/download/bw-linux-*.zip

第十步:备份策略

密码数据不容有失!以下是推荐的自动备份方案:

#!/bin/bash
# ~/vaultwarden/backup.sh - 每日备份脚本

BACKUP_DIR=~/vaultwarden/backups
DATE=$(date +%Y%m%d_%H%M%S)
DB_FILE=~/vaultwarden/data/db.sqlite3

mkdir -p $BACKUP_DIR

# 停止容器确保数据一致性
docker stop vaultwarden

# 备份数据库和附件
tar czf $BACKUP_DIR/vaultwarden-backup-$DATE.tar.gz \
  -C ~/vaultwarden data/

# 重新启动
docker start vaultwarden

# 保留最近 30 天备份,删除更早的
find $BACKUP_DIR -name "vaultwarden-backup-*.tar.gz" -mtime +30 -delete

echo "Backup completed: vaultwarden-backup-$DATE.tar.gz"

设置 cron 每日自动备份:

chmod +x ~/vaultwarden/backup.sh
crontab -e
# 添加以下行(每天凌晨 2 点执行)
0 2 * * * ~/vaultwarden/backup.sh

💡 异地备份建议:将备份文件定期同步到 S3 兼容对象存储或 Google Drive。

# 使用 rclone 同步到远程存储
rclone copy $BACKUP_DIR remote:vaultwarden-backups/

性能基准测试

在 $6/月 的 VPS(1核 CPU、1GB RAM、NVMe SSD)上测试结果:

指标VaultwardenBitwarden 官方
启动时间< 2秒~30秒
空闲内存~30MB~1.2GB
API 响应时间 (p95)< 15ms~50ms
Docker 镜像~50MB~2.5GB
5000 条密码同步< 3秒~10秒

常见问题排查

Q: 无法连接到 WebSocket,客户端不实时同步?

A: 检查 Nginx 配置中的 WebSocket 代理是否正确,确认 proxy_set_header UpgradeConnection 头部已配置。

Q: 忘记管理员密码(ADMIN_TOKEN)?

A: 重新设置环境变量并重启容器:

docker stop vaultwarden
# 编辑 docker-compose.yml 修改 ADMIN_TOKEN
docker compose up -d vaultwarden

Q: 如何开启两步验证(2FA)?

A: 登录 Web UI → 设置 → 安全 → 两步验证 → 启用 TOTP 验证器。建议配合 Authenticator App(如 Google Authenticator、Authy)使用。

Q: 如何更新 Vaultwarden?

cd ~/vaultwarden
docker compose pull vaultwarden
docker compose up -d vaultwarden
# 确认新版本
docker compose logs vaultwarden | grep "Version"

总结

Vaultwarden 是自托管密码管理器的最佳选择之一。它的资源消耗极低,$3-5/月 的廉价 VPS 就能运行,同时完全兼容 Bitwarden 的全平台客户端生态。相比 Bitwarden 官方自托管方案需要 SQL Server 和数 GB 内存,Vaultwarden 用 Rust 重写了服务端,将资源需求降低了 95% 以上。

部署完成后,您将拥有一个完全私密、端到端加密、跨平台同步的密码管理系统——不再依赖任何第三方云服务,不再为密码管理付费,真正掌握自己的数字身份。

下一步建议

  • 🔗 配置 SMTP 邮件服务,实现密码找回功能
  • 🛡️ 启用两步验证(2FA)增强安全性
  • 📦 设置自动备份和异地备份
  • 👨‍👩‍👧‍👦 邀请家人使用您的 Vaultwarden 实例(创建一个共享组织)
  • 🔄 每月检查更新,保持最新版本