跳转到内容

Docker 搭建 Vaultwarden:自建 Bitwarden 密码管理器完整教程(2026版)

Docker 搭建 Vaultwarden

在数字时代,我们拥有越来越多的账号:邮箱、社交账号、银行账户、各种服务的登录凭证……密码管理已经成为每个人必须面对的问题。使用相同密码不安全,记不同密码又很痛苦。

Bitwarden 是一个开源的密码管理解决方案,功能全面且价格透明。而 Vaultwarden(原 bitwarden_rs)是 Bitwarden 官方服务器的社区开源实现版本,用 Rust 重写,资源占用极低,部署简单,非常适合个人或小团队自建使用。

本文将带你从零开始,用 Docker 部署属于你自己的 Vaultwarden 密码管理器,实现:

  • 🔐 完全掌控:密码数据库存放在你的服务器上
  • 🔄 多端同步:Web、桌面、移动端全平台支持
  • 🌐 浏览器扩展:一键填充登录凭证
  • 📱 手机端支持:iOS、Android 原生 App 同步
  • 💾 数据备份:定期备份,永不丢失
  • 🛡️ 安全加固:反向代理 + HTTPS + 双因素认证

目录

  1. Vaultwarden 与 Bitwarden 官方版对比
  2. 部署前准备工作
  3. Docker 与 Docker Compose 安装
  4. Vaultwarden Docker Compose 部署
  5. Nginx 反向代理与 HTTPS 配置
  6. Caddy 反向代理(推荐方案)
  7. 初始化配置与管理员账号
  8. 浏览器扩展安装与使用
  9. 桌面客户端与手机 App 配置
  10. 数据备份与恢复方案
  11. 安全加固最佳实践
  12. 常见问题排查

1. Vaultwarden 与 Bitwarden 官方版对比

1.1 Vaultwarden 是什么?

Vaultwarden(原 bitwarden_rs)是 Bitwarden 官方服务器的 Rust 语言重写版本,完全兼容 Bitwarden 客户端生态。它的核心优势在于:

特性VaultwardenBitwarden 官方版
开源协议AGPL-3.0源码可查看但不可商用
部署方式Docker 一键部署需要官方订阅或复杂部署
资源占用极低(内存 ~20MB)较重(需要多个组件)
功能完整度核心功能 100%完整功能
高级功能大部分支持全部功能(企业版)
数据掌控完全掌控在自己服务器存储在 Bitwarden 云端
成本免费(仅需服务器费用)个人版 $10/年
多用户支持✅(企业版)
组织(Organizations)
双因素认证 2FA

1.2 Vaultwarden 支持的功能

✅ 账户注册与管理
✅ 密码保存与分类(收藏夹)
✅ 浏览器扩展自动填充
✅ iOS / Android 移动客户端
✅ 桌面客户端(Windows / macOS / Linux)
✅ 双因素认证(2FA)- TOTP、电子邮件、YubiKey
✅ 密码生成器
✅ 密码健康检查
✅ 附件上传
✅ 组织(Organizations)与团队共享
✅ 紧急联系人
✅ Web Vault 网页界面
✅ API 支持

1.3 为什么选择自建 Vaultwarden?

🎯 **隐私与安全**:密码数据完全掌握在自己手中
🎯 **零广告 / 零追踪**:没有数据收集,没有第三方分析
🎯 **成本可控**:一台廉价 VPS 即可运行,终身免费使用
🎯 **学习机会**:了解 Docker、反向代理、HTTPS 等运维知识
🎯 **自定义功能**:可以按需修改配置,启用/禁用功能
🎯 **多端同步**:完全兼容 Bitwarden 客户端生态

2. 部署前准备工作

2.1 硬件要求

Vaultwarden 对硬件要求非常低:

配置最低要求推荐配置
CPU1 核1 核 或更高
内存256 MB512 MB 或更高
磁盘1 GB5 GB SSD
网络稳定网络连接1 Mbps 上行带宽即可
操作系统Linux(推荐)/ macOS / WindowsUbuntu 22.04 LTS

💡 实际上:一台最低配置的 VPS(1核256MB内存)就能完美运行 Vaultwarden。我自己的 Vaultwarden 实例运行在一台 1核512MB 的 VPS 上,内存占用不到 30MB。

2.2 服务器选择

推荐方案:
• 国内 VPS:腾讯云轻量、阿里云轻量(¥30-50/月)
• 国外 VPS:Vultr、DigitalOcean、Linode($3-5/月)
• 家里服务器:树莓派、小主机(完全免费)

注意事项:
• 国外服务器 + 国内访问需要科学上网
• 建议选择国外服务器部署,避免备案等问题
• 选择稳定的服务商,数据安全第一

2.3 域名与证书

必需:
• 一个域名(如 bitwarden.example.com 或 vault.example.com)
• HTTPS 证书(Let's Encrypt 免费证书即可)

推荐:
• 使用二级域名部署(如 bw.yourdomain.com)
• 避免使用主域名(方便后续扩展其他服务)

2.4 环境准备清单

✅ 一台 Linux VPS(推荐 Ubuntu 22.04 LTS)
✅ 一个指向该服务器的域名(A 记录或 CNAME)
✅ SSH 登录权限(root 或 sudo 用户)
✅ 基本的 Linux 命令操作技能

3. Docker 与 Docker Compose 安装

3.1 更新系统

bash
# 更新软件包索引
sudo apt update

# 升级已安装的软件包
sudo apt upgrade -y

# 安装必要依赖
sudo apt install -y curl wget git gnupg2 lsb-release ca-certificates

3.2 安装 Docker

bash
# 安装 Docker(使用官方一键脚本,最省事)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 将当前用户加入 docker 组(免 sudo 执行 docker 命令)
sudo usermod -aG docker $USER

# 重新登录或执行以下命令使组生效
newgrp docker

# 验证安装
docker --version
# 输出类似:Docker version 27.0.0, build xxxxxx

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

# 验证 Docker 运行状态
sudo systemctl status docker

3.3 安装 Docker Compose

Docker Compose 是一个用于定义和运行多容器应用的工具。

bash
# 检查是否已包含 docker compose(新版 Docker 已内置)
docker compose version

# 如果输出错误,手动安装 Docker Compose 插件
sudo apt install -y docker-compose-plugin

# 或安装独立版本
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose --version

4. Vaultwarden Docker Compose 部署

4.1 创建数据目录

bash
# 创建项目目录
mkdir -p ~/vaultwarden/{data,nginx,caddy}

# 进入目录
cd ~/vaultwarden

4.2 创建 docker-compose.yml

yaml
# ~/vaultwarden/docker-compose.yml

version: '3.8'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"   # HTTP(仅本地访问,通过反向代理暴露)
      - "127.0.0.1:3012:3012" # WebSocket 通知端口
    volumes:
      - ./data:/data           # 数据持久化目录
    environment:
      # ====== 基本配置 ======
      - DOMAIN=https://bw.yourdomain.com      # 你的域名,必须是 https
      - SIGNUPS_ALLOWED=true                  # 是否允许新用户注册(首次部署开启)
      - SIGNUPS_DOMAINS_WHITELIST=yourdomain.com  # 限制注册邮箱域名(可选)
      - INVITATIONS_ALLOWED=true              # 是否允许邀请其他用户

      # ====== Web 界面配置 ======
      - WEB_VAULT_ENABLED=true                # 启用 Web 界面
      - SHOW_PASSWORD_HINT=false              # 是否显示密码提示

      # ====== 通知 / WebSocket ======
      - WEBSOCKET_ENABLED=true                # 启用 WebSocket 实时通知

      # ====== SMTP 邮件发送(重要!用于验证邮箱和 2FA) ======
      - SMTP_HOST=smtp.gmail.com              # SMTP 服务器地址
      - SMTP_FROM=noreply@yourdomain.com      # 发件人邮箱
      - SMTP_FROM_NAME=Vaultwarden            # 发件人名称
      - SMTP_SECURITY=starttls                # 加密方式:starttls 或 force_tls
      - SMTP_PORT=587                         # SMTP 端口
      - SMTP_USERNAME=your-smtp-username      # SMTP 用户名
      - SMTP_PASSWORD=your-smtp-password      # SMTP 密码
      - SMTP_AUTH_MECHANISM=plain             # 认证方式

      # ====== 安全配置 ======
      - ADMIN_TOKEN=your-admin-token-here     # 管理面板令牌(设置后可访问 /admin)
      - DISABLE_ICON_DOWNLOAD=false           # 是否禁用网站图标下载
      - IP_HEADER=X-Forwarded-For             # 反向代理获取真实 IP

      # ====== 密码尝试限制 ======
      - LOGIN_RATELIMIT_MAX_BURST=10          # 最大尝试次数
      - LOGIN_RATELIMIT_SECONDS=60            # 时间窗口(秒)

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80"]
      interval: 30s
      timeout: 10s
      retries: 3

🎯 ADMIN_TOKEN 生成

bash
# 生成一个安全的管理员令牌(保存好,用于访问 /admin 管理面板)
openssl rand -base64 48

# 或使用以下命令
python -c "import secrets; print(secrets.token_urlsafe(64))"

4.3 启动 Vaultwarden

bash
# 在 docker-compose.yml 所在目录执行
cd ~/vaultwarden

# 启动容器(首次会拉取镜像)
docker compose up -d

# 查看容器状态
docker compose ps

# 查看容器日志
docker compose logs -f vaultwarden

4.4 验证本地访问

bash
# 测试本地 8080 端口是否正常响应
curl -I http://127.0.0.1:8080

# 正常输出类似:
# HTTP/1.1 200 OK
# content-type: text/html; charset=utf-8

5. Nginx 反向代理与 HTTPS 配置

5.1 安装 Nginx 和 Certbot

bash
sudo apt install -y nginx certbot python3-certbot-nginx

5.2 申请 Let's Encrypt 证书

bash
# 确保 Nginx 已启动
sudo systemctl start nginx
sudo systemctl enable nginx

# 申请证书(替换为你的邮箱和域名)
sudo certbot --nginx \
  --email your@email.com \
  --agree-tos \
  --no-redirect \
  -d bw.yourdomain.com

# 测试自动续期
sudo certbot renew --dry-run

5.3 创建 Nginx 配置文件

nginx
# /etc/nginx/sites-available/vaultwarden

server {
    # HTTP 跳转到 HTTPS
    listen 80;
    listen [::]:80;
    server_name bw.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    # HTTPS 配置
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name bw.yourdomain.com;

    # SSL 证书路径(Certbot 会自动填充)
    ssl_certificate /etc/letsencrypt/live/bw.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bw.yourdomain.com/privkey.pem;

    # SSL 安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # 日志
    access_log /var/log/nginx/vaultwarden_access.log;
    error_log /var/log/nginx/vaultwarden_error.log;

    # 反向代理到 Vaultwarden
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        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;

        # 超时设置
        proxy_connect_timeout 60;
        proxy_send_timeout 60;
        proxy_read_timeout 300;
        proxy_buffering off;
    }

    # WebSocket 通知
    location /notifications/hub {
        proxy_pass http://127.0.0.1:3012;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /notifications/hub/negotiate {
        proxy_pass http://127.0.0.1:8080;
    }

    # 管理面板访问限制(可选,建议限制 IP)
    location /admin {
        # allow 192.168.1.0/24;   # 允许的 IP 段
        # deny all;                 # 拒绝其他所有 IP

        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        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;
    }

    # 安全头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-XSS-Protection "1; mode=block";
}

5.4 启用配置并重启

bash
# 启用站点配置
sudo ln -s /etc/nginx/sites-available/vaultwarden /etc/nginx/sites-enabled/

# 测试 Nginx 配置是否正确
sudo nginx -t

# 重启 Nginx
sudo systemctl restart nginx

6. Caddy 反向代理(推荐方案)

如果你觉得 Nginx 配置太复杂,Caddy 是更简单的选择——它会自动申请和续期 HTTPS 证书。

6.1 使用 Docker Compose + Caddy 一键部署

yaml
# ~/vaultwarden/docker-compose.yml

version: '3.8'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    volumes:
      - ./data:/data
    environment:
      - DOMAIN=https://bw.yourdomain.com
      - SIGNUPS_ALLOWED=true
      - WEBSOCKET_ENABLED=true
      - ADMIN_TOKEN=your-admin-token-here
      - IP_HEADER=X-Forwarded-For
      - SMTP_HOST=smtp.gmail.com
      - SMTP_FROM=noreply@yourdomain.com
      - SMTP_PORT=587
      - SMTP_SECURITY=starttls
      - SMTP_USERNAME=your-smtp-username
      - SMTP_PASSWORD=your-smtp-password

  caddy:
    image: caddy:latest
    container_name: vaultwarden-caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
      - ./caddy/site:/srv
      - ./caddy/caddy_data:/data
      - ./caddy/caddy_config:/config
    depends_on:
      - vaultwarden

6.2 创建 Caddyfile

caddyfile
# ~/vaultwarden/caddy/Caddyfile

bw.yourdomain.com {
    # 主应用反代
    reverse_proxy vaultwarden:80

    # WebSocket 通知
    reverse_proxy /notifications/hub vaultwarden:3012

    # 安全头
    header Strict-Transport-Security "max-age=31536000; includeSubDomains"
    header X-Content-Type-Options nosniff
    header X-Frame-Options SAMEORIGIN

    # 管理面板简单保护(可选)
    basicauth /admin/* {
        admin JDJhJDEwJHBhc3N3b3JkaGFzaGVyZSByZXBsYWNlIG1l  # echo -n 'password' | caddy hash-password
    }
}

6.3 启动服务

bash
cd ~/vaultwarden
docker compose up -d

# 查看日志
docker compose logs -f

💡 Caddy 的优势

  • 自动申请和续期 Let's Encrypt 证书
  • 自动启用 HTTPS,无需手动配置 SSL
  • 配置文件简洁易懂
  • 性能优秀,适合大多数场景

7. 初始化配置与管理员账号

7.1 访问 Web Vault

部署完成后,在浏览器中访问你的域名:

https://bw.yourdomain.com

你应该能看到 Bitwarden 的登录界面。

7.2 创建管理员账号

1. 点击「创建账户」
2. 填写邮箱地址(建议使用你自己的域名邮箱)
3. 设置主密码(Master Password)——务必牢记!
4. 再次确认密码
5. 填写密码提示(可选,建议留空或使用不相关的提示)
6. 点击「创建账户」

⚠️ 重要提示

  • 主密码是解锁所有密码的唯一凭证,必须使用高强度密码
  • 建议使用至少 16 位,包含大小写字母、数字和特殊字符
  • 务必将主密码保存在安全的地方(或记住它)
  • 如果忘记主密码,将无法恢复任何数据(这是设计特性,保护你的隐私)

7.3 访问管理面板

访问:https://bw.yourdomain.com/admin

输入之前在 docker-compose.yml 中设置的 ADMIN_TOKEN

在管理面板中可以:
• 查看已注册用户列表
• 禁用/启用用户
• 删除用户
• 查看组织信息
• 修改系统配置
• 查看系统日志

7.4 关闭公开注册(首次部署后推荐)

当你自己注册完毕后,建议关闭公开注册功能,防止陌生人注册:

bash
# 方法一:修改 docker-compose.yml 中的 SIGNUPS_ALLOWED
- SIGNUPS_ALLOWED=false

# 方法二:通过 /admin 管理面板设置
# 访问 https://bw.yourdomain.com → General settings → Allow new signups
# 取消勾选后 Save

# 重启容器使配置生效
docker compose restart

8. 浏览器扩展安装与使用

8.1 安装浏览器扩展

Chrome / Edge:
  Chrome 网上应用店 → 搜索 "Bitwarden" → 添加扩展

Firefox:
  Firefox 附加组件商店 → 搜索 "Bitwarden" → 安装

Safari:
  Mac App Store → 搜索 "Bitwarden" → 安装

8.2 配置扩展连接自建服务器

1. 点击浏览器工具栏中的 Bitwarden 图标
2. 点击「设置」或齿轮图标
3. 在「服务器 URL」中输入你的自建服务器地址:
   https://bw.yourdomain.com
4. 点击「保存」
5. 输入你的邮箱和主密码登录
6. 完成!浏览器扩展即可自动填充密码

9. 桌面客户端与手机 App 配置

9.1 桌面客户端(Windows / macOS / Linux)

下载地址:https://bitwarden.com/download/

安装后首次配置:
1. 打开 Bitwarden 桌面应用
2. 点击「设置」
3. 服务器 URL → 输入 https://bw.yourdomain.com
4. 保存后用邮箱和主密码登录

9.2 iOS / Android 移动端

App Store(iOS)或 Google Play(Android)→ 搜索 "Bitwarden"

安装后首次配置:
1. 打开 Bitwarden App
2. 点击「设置」
3. 服务器 URL → 输入 https://bw.yourdomain.com
4. 保存后用邮箱和主密码登录
5. 配置 Face ID / Touch ID / 指纹解锁
6. 启用自动填充功能

9.3 多端同步演示

在一个设备上添加密码 → 其他设备自动同步

工作原理:
1. 客户端将加密后的密码数据发送到服务器
2. 服务器存储加密数据(服务器端无法解密,加密在客户端完成)
3. 其他设备从服务器拉取最新数据
4. 客户端用主密码解密后显示

💡 重要:加密在本地进行,服务器只存储密文
   即使服务器被入侵,黑客也无法获取明文密码

10. 数据备份与恢复方案

10.1 数据目录结构

~/vaultwarden/data/
├── db.sqlite3          # 主数据库(最重要!)
├── db.sqlite3-shm      # SQLite 共享内存文件(临时)
├── db.sqlite3-wal      # SQLite WAL 日志(临时)
├── attachments/        # 附件目录(用户上传的文件)
├── sends/              # Send 功能数据
├── icon_cache/         # 网站图标缓存
├── rsa_key.der         # RSA 私钥(签名用)
├── rsa_key.pub.der     # RSA 公钥
└── config.json         # 配置文件

10.2 手动备份

bash
# 停止容器(避免数据库写入冲突)
cd ~/vaultwarden
docker compose stop

# 创建备份目录
mkdir -p ~/backups

# 备份数据目录(带时间戳)
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
sudo tar -czf ~/backups/vaultwarden_$BACKUP_DATE.tar.gz ./data/

# 重新启动容器
docker compose up -d

# 查看备份文件
ls -lh ~/backups/

10.3 自动备份脚本

创建自动备份脚本:

bash
# ~/vaultwarden/backup.sh

#!/bin/bash
# Vaultwarden 自动备份脚本

BACKUP_DIR="/home/yourusername/backups"
VAULTWARDEN_DIR="/home/yourusername/vaultwarden"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="vaultwarden_$DATE.tar.gz"
RETENTION_DAYS=30

# 创建备份目录(如不存在)
mkdir -p $BACKUP_DIR

# 停止容器
cd $VAULTWARDEN_DIR
docker compose stop

# 压缩备份
tar -czf $BACKUP_DIR/$BACKUP_FILE ./data/

# 重启容器
docker compose up -d

# 删除 30 天前的旧备份
find $BACKUP_DIR -name "vaultwarden_*.tar.gz" -mtime +$RETENTION_DAYS -delete

# 输出日志
echo "[$DATE] 备份完成: $BACKUP_FILE" >> $BACKUP_DIR/backup.log
bash
# 设置脚本可执行权限
chmod +x ~/vaultwarden/backup.sh

# 测试备份脚本
cd ~/vaultwarden
./backup.sh

10.4 设置定时任务

bash
# 编辑 crontab
crontab -e

# 添加以下行(每天凌晨 3 点自动备份)
0 3 * * * /home/yourusername/vaultwarden/backup.sh

# 保存并退出
# 查看当前 crontab
crontab -l

10.5 异地备份(推荐)

bash
# 方案一:使用 rsync 同步到另一台服务器
rsync -avz ~/backups/ user@backup-server:/path/to/backups/

# 方案二:使用 rclone 同步到云存储(如 Google Drive、OneDrive)
# 安装 rclone
curl https://rclone.org/install.sh | sudo bash

# 配置云存储(按提示操作)
rclone config

# 同步备份文件
rclone sync ~/backups/ gdrive:vaultwarden-backups

# 添加到 crontab
30 3 * * * rclone sync ~/backups/ gdrive:vaultwarden-backups

10.6 数据恢复

bash
# 停止当前容器
cd ~/vaultwarden
docker compose down

# 备份当前数据(以防恢复失败)
mv ./data ./data_backup_$(date +%Y%m%d)

# 从备份恢复数据
BACKUP_FILE="/path/to/backups/vaultwarden_20260612_030000.tar.gz"
tar -xzf $BACKUP_FILE

# 重启容器
docker compose up -d

# 验证数据
# 访问 https://bw.yourdomain.com 登录,检查密码是否恢复

11. 安全加固最佳实践

11.1 启用双因素认证(2FA)

强烈建议为你的账号启用双因素认证:
1. 登录 Web Vault: https://bw.yourdomain.com
2. 右上角个人资料 → 点击「设置」
3. 「安全」→「两步验证」
4. 选择「认证器应用」(推荐)
5. 用手机上的 Google Authenticator / Microsoft Authenticator 扫码
6. 输入验证码完成绑定
7. 保存恢复码(打印或保存在安全位置)

11.2 防火墙设置(UFW)

bash
# 安装 UFW
sudo apt install -y ufw

# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 开放 SSH(务必先开启,否则会被锁定)
sudo ufw allow 22/tcp

# 开放 HTTP 和 HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 启用防火墙
sudo ufw enable

# 查看状态
sudo ufw status verbose

11.3 限制管理面板访问

bash
# 方法一:通过 Nginx 配置限制 IP(见第 5.3 节)
# 方法二:修改 docker-compose,不暴露管理面板端口(建议)

# 修改 docker-compose.yml:确保不直接暴露管理面板
# 所有访问必须通过反向代理

11.4 定期更新容器

bash
# 检查更新并一键更新
cd ~/vaultwarden

# 拉取最新镜像
docker compose pull

# 重启容器(使用新镜像)
docker compose up -d

# 清理旧镜像
docker image prune -f

# 建议每月执行一次,或设置为定时任务

11.5 定期备份验证

每月至少验证一次备份的有效性:
1. 将备份恢复到测试环境
2. 检查能否正常登录
3. 验证数据完整性(抽查几个密码条目)
4. 确认 2FA 工作正常

11.6 防止暴力破解

Vaultwarden 内置的保护:
• LOGIN_RATELIMIT_MAX_BURST=10(10 次尝试)
• LOGIN_RATELIMIT_SECONDS=60(每 60 秒重置)

额外建议:
• 使用 Fail2ban 监控 Nginx 日志,自动封禁失败尝试
• 使用 Cloudflare 等 CDN 提供额外的 DDoS 保护
• 定期检查登录日志(/admin 管理面板)

12. 常见问题排查

12.1 无法访问网站

排查步骤:
1. 检查容器是否运行:docker compose ps
2. 检查容器日志:docker compose logs -f
3. 检查 Nginx/Caddy 状态:sudo systemctl status nginx
4. 检查域名 DNS 解析是否正常:nslookup bw.yourdomain.com
5. 检查防火墙是否开放端口:sudo ufw status
6. 测试本地访问:curl -I http://127.0.0.1:8080

12.2 浏览器扩展无法登录

排查步骤:
1. 确认服务器 URL 设置正确:https://bw.yourdomain.com
2. 检查浏览器是否能正常访问该网址
3. 清除浏览器缓存和 Cookie
4. 检查是否有浏览器扩展(如广告拦截)阻止连接
5. 检查容器日志查看登录请求

12.3 无法注册 / 邮箱验证失败

排查步骤:
1. 检查 SMTP 配置是否正确
2. 检查邮箱账号是否开启了第三方登录(如 Gmail 需要「应用专用密码」)
3. 检查 SMTP 端口是否被 VPS 服务商封禁(25 端口常被封)
4. 检查容器日志中的邮件发送错误
5. 尝试使用其他邮箱服务商(如 SendGrid、Mailgun、腾讯企业邮箱)

12.4 HTTPS 证书问题

排查步骤:
1. 检查域名是否正确解析到服务器
2. 检查 443 端口是否开放
3. 检查证书是否过期:sudo certbot certificates
4. 手动续期:sudo certbot renew
5. 测试证书:https://www.ssllabs.com/ssltest/

12.5 数据同步失败

排查步骤:
1. 检查 Vaultwarden 容器是否正常运行
2. 检查容器日志中的错误
3. 检查 WebSocket 配置(通知功能)
4. 在客户端手动触发同步(下拉刷新)
5. 检查客户端是否使用了正确的服务器 URL

12.6 忘记主密码

⚠️ 无法恢复!这是 Bitwarden/ Vaultwarden 的设计特性。

建议:
1. 使用密码提示(但不要让提示过于明显)
2. 将主密码写在安全的地方(物理保管)
3. 设置紧急联系人(家人/朋友)
4. 定期导出密码库作为备份

导出密码库:
Web Vault → 工具 → 导出保险库 → 选择格式(.json 或 .csv)→ 输入主密码
→ 保存文件到安全位置(建议加密后存储)

12.7 忘记管理员令牌

bash
# 重新生成并更新 docker-compose.yml
openssl rand -base64 48

# 编辑 docker-compose.yml,替换 ADMIN_TOKEN
cd ~/vaultwarden
nano docker-compose.yml

# 重启容器
docker compose up -d

# 现在可以用新令牌访问 /admin

总结

恭喜!你现在拥有了一个完全由自己掌控的密码管理器。让我们回顾一下整个部署流程:

1. 准备 VPS 服务器
2. 安装 Docker + Docker Compose
3. 创建 docker-compose.yml 配置文件
4. 配置 Nginx/Caddy 反向代理 + HTTPS
5. 部署并启动 Vaultwarden
6. 创建管理员账号,启用 2FA
7. 配置浏览器扩展和手机 App
8. 设置定期数据备份
9. 进行安全加固

自建 Vaultwarden 的核心价值:

  • 🔒 数据主权:你的密码只存在于你的服务器
  • 💰 零运营成本:除了 VPS 费用,完全免费
  • 🚀 高性能低占用:Rust 重写,资源占用极低
  • 🔄 全平台同步:兼容所有 Bitwarden 客户端
  • 🛡️ 端到端加密:服务器存储的是密文,即使服务器被入侵也无法解密

📖 延伸阅读



延伸阅读

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。