跳转到内容

Vaultwarden 完全指南:自建 Bitwarden 密码管理器(2026版)

Vaultwarden 密码管理器

在数字化时代,密码安全变得前所未有的重要。据统计,平均每人拥有 100+ 个在线账户,而 65% 的人会在多个网站重复使用相同密码。Vaultwarden 是一款完全免费、开源的密码管理器,它是 Bitwarden 的轻量级 Rust 实现,让您可以在自己的服务器上搭建私有的密码管理平台。本指南将带您从零开始,通过 Docker 部署 Vaultwarden,打造安全、私密、完全可控的密码管理解决方案。

目录

  1. 什么是 Vaultwarden?
  2. 为什么需要密码管理器?
  3. 系统要求与准备
  4. Docker 部署方案
  5. Nginx 反向代理配置
  6. 高级配置与安全加固
  7. 客户端配置与使用
  8. 数据迁移指南
  9. 备份与恢复策略
  10. 监控与维护

1. 什么是 Vaultwarden?

1.1 Vaultwarden 简介

Vaultwarden(原名 bitwarden_rs)是 Bitwarden 密码管理器的非官方开源服务器实现,使用 Rust 语言编写。它完全兼容官方的 Bitwarden 客户端,包括浏览器扩展、桌面应用和移动端 App,但资源占用更低,更适合个人和小型团队自托管。

核心特点

  • 🆓 完全免费:无任何付费功能或订阅
  • 🔓 开源透明:代码完全公开,可审计
  • 轻量高效:Rust 编写,资源占用极低
  • 🔒 端到端加密:AES-256-CBC + HMAC-SHA256
  • 📱 全平台支持:兼容所有官方客户端
  • 🏠 自托管:数据完全掌控在自己手中
  • 🔄 持续更新:活跃的社区维护
  • 💾 低资源需求:可在树莓派上运行

1.2 发展历程

时间事件
2018.06bitwarden_rs 项目启动
2019.03首个稳定版本发布
2020.08用户突破 10,000
2021.05重命名为 Vaultwarden
2022.01GitHub Stars 突破 10,000
2023.06支持 WebSocket 实时同步
2024.03用户突破 100,000
2025.01全面支持 Bitwarden 3.0 API
2026.01持续活跃开发,社区壮大

1.3 Vaultwarden vs Bitwarden 官方

特性VaultwardenBitwarden 官方
价格🆓 完全免费💰 部分功能付费
开源✅ 完全开源✅ 服务端闭源
资源占用⭐ 极低(~50MB RAM)⭐⭐⭐ 较高(~500MB)
硬件要求树莓派即可需要较强服务器
功能完整性✅ 95%+ 功能✅ 100% 功能
官方支持❌ 社区支持✅ 官方支持
企业功能⚠️ 部分支持✅ 完整支持
更新频率快速跟进稳定发布
自定义性⭐⭐⭐⭐⭐⭐⭐
适合场景个人/小团队企业/大型组织

选择建议

  • 🎯 个人用户/家庭 → Vaultwarden
  • 👥 小型团队(<50人) → Vaultwarden
  • 🏢 中大型企业 → Bitwarden 官方
  • 🔧 喜欢折腾和技术控制 → Vaultwarden
  • 💼 需要官方 SLA 支持 → Bitwarden 官方

1.4 与其他密码管理器对比

特性Vaultwarden1PasswordLastPassKeePassBitwarden 云
价格🆓 免费$3-8/月$3-4/月🆓 免费$0-10/月
自托管✅ 支持❌ 不支持❌ 不支持✅ 本地❌ 云端
开源✅ 完全❌ 闭源❌ 闭源✅ 完全⚠️ 部分
跨平台✅ 完整✅ 完整✅ 完整⚠️ 有限✅ 完整
自动填充✅ 支持✅ 优秀✅ 支持⚠️ 插件✅ 支持
2FA✅ 支持✅ 支持✅ 支持⚠️ 插件✅ 支持
密码共享✅ 支持✅ 支持✅ 支持❌ 困难✅ 支持
数据主权⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
易用性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

2. 为什么需要密码管理器?

2.1 密码安全现状

严峻的现实

📊 统计数据(2026):
- 平均每人拥有 150+ 在线账户
- 65% 的人在多个网站重复使用密码
- 81% 的数据泄露由弱密码导致
- 平均每 39 秒发生一次黑客攻击
- 密码破解成本:< $100(GPU 集群)

常见密码问题

弱密码

123456
password
qwerty
admin123
生日/姓名

密码重用

同一密码用于:
- 邮箱
- 银行
- 社交媒体
- 购物网站

风险:一处泄露,全部遭殃

不安全存储

❌ 写在纸上
❌ 存在文本文件
❌ 浏览器保存(未加密)
❌ Excel 表格
❌ 手机备忘录

2.2 密码管理器的优势

优势一:生成强密码

密码强度对比

弱密码:
password123
破解时间:< 1 秒

中等密码:
MyDog2024!
破解时间:约 1 小时

强密码(密码管理器生成):
xK9#mP2$vL5@nQ8&wR3!
破解时间:数百年

密码管理器生成

✅ 随机性强
✅ 长度可调(12-64 位)
✅ 包含大小写、数字、符号
✅ 每个网站唯一
✅ 无需记忆

优势二:安全存储

加密机制

Vaultwarden 使用:
- AES-256-CBC 加密数据
- HMAC-SHA256 验证完整性
- PBKDF2 密钥派生(100,000 次迭代)
- 零知识架构(服务器无法解密)

即使服务器被黑:
❌ 黑客无法获取明文密码
❌ 只有加密后的数据
❌ 需要主密码才能解密

本地 vs 云端

云端密码管理器:
⚠️ 数据在第三方服务器
⚠️ 可能被政府调取
⚠️ 服务可能停止
⚠️ 隐私政策可能变更

自托管(Vaultwarden):
✅ 数据在自己服务器
✅ 完全控制
✅ 不受第三方影响
✅ 隐私有保障

优势三:便捷使用

自动填充

浏览器扩展自动识别登录表单
一键填充用户名和密码
无需手动输入
节省时间

多设备同步

手机、电脑、平板
实时同步
离线可用
无缝切换

密码分享

安全分享给家人/同事
可设置权限
随时撤销访问
审计日志追踪

优势四:额外功能

两步验证(2FA)

存储 TOTP 种子
自动生成验证码
比短信更安全
支持多种 2FA 类型

安全审计

检测弱密码
发现重复密码
检查已泄露密码
安全评分和建议

笔记和安全记录

存储敏感信息:
- 信用卡号
- 护照信息
- 软件许可证
- WiFi 密码
- 保险箱组合

2.3 实际案例

案例 1:LastPass 数据泄露(2022)

事件:
- LastPass 遭受攻击
- 用户 vault 数据被盗
- 虽然加密,但存在风险

后果:
- 用户信任度下降
- 大量用户迁移
- 品牌声誉受损

教训:
⚠️ 不要完全依赖第三方
⚠️ 自托管更可控

案例 2:密码重用导致的连锁反应

场景:
用户在论坛使用简单密码
论坛数据库泄露
黑客尝试相同密码登录:
- 邮箱 ✓ 成功
- 银行 ✓ 成功
- 支付宝 ✓ 成功

损失:
💰 资金被盗
📧 邮箱被控
🔐 身份盗用

如果使用密码管理器

✅ 每个网站不同密码
✅ 强密码难以破解
✅ 即使一处泄露,其他安全
✅ 快速检测和响应

3. 系统要求与准备

3.1 硬件要求

最低配置(适合个人使用)

CPU: ARM Cortex-A53 1GHz(树莓派)或 x86 单核
RAM: 512MB
存储: 2GB(系统)+ 数据库空间
网络: 稳定的互联网连接

适用场景:
- 1-5 个用户
- < 500 个密码条目
- 轻度使用

推荐设备

✅ Raspberry Pi Zero 2 W
✅ Raspberry Pi 3/4
✅ 旧笔记本/台式机
✅ VPS(1核 512MB)

推荐配置(家庭/小团队)

CPU: 双核 2GHz+
RAM: 2GB
存储: 10GB SSD
网络: 稳定的宽带连接

适用场景:
- 5-20 个用户
- 500-5000 个密码条目
- 正常使用

推荐设备

✅ Raspberry Pi 4 (4GB)
✅ Intel NUC
✅ 二手迷你主机
✅ VPS(2核 2GB)

高性能配置(企业使用)

CPU: 四核+ 3GHz+
RAM: 4-8GB
存储: NVMe SSD
网络: Gigabit Ethernet

适用场景:
- 20+ 用户
- 5000+ 密码条目
- 高并发访问

3.2 存储需求计算

数据库大小估算

每个密码条目:~1-2 KB
每个用户基础数据:~10 KB
附件:按实际大小

示例:
10 用户 × 100 密码 = 10 MB
10 用户 × 500 密码 = 50 MB
50 用户 × 1000 密码 = 500 MB

建议:
预留 10× 空间用于增长
定期清理不需要的数据

备份空间

保留 3-5 个备份版本
每个备份 ≈ 数据库大小
总备份空间 = 数据库 × 5

3.3 软件要求

必需软件

bash
# Docker 和 Docker Compose
docker --version      # 需要 20.10+
docker compose version # 需要 2.0+

# 文本编辑器
nano / vim / VS Code

# SSH 客户端(远程管理)
ssh / PuTTY

# 浏览器
Chrome / Firefox / Edge

可选软件

bash
# 反向代理
Nginx / Caddy

# SSL 证书
Certbot(Let's Encrypt)

# 监控
Prometheus + Grafana

# 备份工具
rclone(云存储同步)

3.4 网络规划

域名准备

为什么需要域名

✅ 便于记忆和访问
✅ SSL 证书必需
✅ 专业形象
✅ IP 变更不影响

域名选择

推荐注册商:
- Namecheap(便宜)
- Cloudflare Registrar(成本价)
- Porkbun(界面友好)

子域名示例:
vault.yourdomain.com
passwords.yourdomain.com
bitwarden.yourdomain.com

成本

.com 域名:$10-15/年
.xyz/.top 域名:$1-5/年
免费域名:duckdns.org(动态 DNS)

端口需求

必需端口:
TCP 80   - HTTP(重定向到 HTTPS)
TCP 443  - HTTPS(主要访问)

可选端口:
TCP 3012 - WebSocket(实时同步)
TCP 8080 - 管理界面(如启用)

防火墙设置

bash
# Ubuntu (UFW)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

# CentOS (firewalld)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

3.5 安全考虑

HTTPS 必要性

为什么必须 HTTPS

❌ HTTP 明文传输
   - 密码可被窃听
   - 中间人攻击
   - 数据篡改

✅ HTTPS 加密传输
   - 端到端加密
   - 防止窃听
   - 身份验证
   - 数据完整性

SSL 证书选项

🆓 Let's Encrypt(推荐)
   - 完全免费
   - 自动续期
   - 广泛信任
   - 90 天有效期

💰 商业证书
   - 1-5 年有效期
   - 额外保障
   - 适合企业

⚠️ 自签名证书
   - 免费
   - 浏览器警告
   - 仅测试使用

访问控制

基本安全措施

bash
# 1. 禁用公开注册
SIGNUPS_ALLOWED=false

# 2. 启用管理员令牌
ADMIN_TOKEN=<strong_random_token>

# 3. 限制 IP 访问(可选)
# 通过 Nginx 配置白名单

# 4. 启用失败登录锁定
# Vaultwarden 内置保护

备份策略

3-2-1 原则:
- 3 份数据副本
- 2 种不同介质
- 1 份异地备份

示例:
1. 服务器本地
2. NAS 存储
3. 云存储(加密后)

4. Docker 部署方案

4.1 安装 Docker

Ubuntu/Debian

bash
# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 更新包索引
sudo apt update

# 安装依赖
sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 添加 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

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

# 添加当前用户到 docker 组(避免每次 sudo)
sudo usermod -aG docker $USER
newgrp docker

CentOS/RHEL

bash
# 添加仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

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

# 验证
docker --version

macOS

bash
# 使用 Homebrew
brew install --cask docker

# 启动 Docker Desktop
open /Applications/Docker.app

# 等待启动完成(菜单栏出现鲸鱼图标)

Windows

1. 下载 Docker Desktop for Windows
   https://www.docker.com/products/docker-desktop

2. 安装并启动

3. 启用 WSL 2(推荐)
   wsl --install

4. 重启电脑

4.2 创建目录结构

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

# 目录说明:
# data/     - 数据库和配置文件
# backups/  - 备份文件
# docker-compose.yml - Docker 配置

设置权限

bash
# 确保目录所有权正确
sudo chown -R $USER:$USER ~/vaultwarden

# 设置适当权限
chmod 700 ~/vaultwarden/data
chmod 700 ~/vaultwarden/backups

4.3 Docker Compose 配置

创建 docker-compose.yml

yaml
version: '3.8'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      # 基本配置
      - DOMAIN=https://vault.yourdomain.com
      - SIGNUPS_ALLOWED=false
      - INVITATIONS_ALLOWED=false
      - ADMIN_TOKEN=${ADMIN_TOKEN}
      
      # 邮件配置(可选)
      - SMTP_HOST=smtp.gmail.com
      - SMTP_PORT=587
      - SMTP_SSL=true
      - SMTP_USERNAME=your-email@gmail.com
      - SMTP_PASSWORD=${SMTP_PASSWORD}
      - SMTP_FROM=vaultwarden@yourdomain.com
      
      # 其他配置
      - WEBSOCKET_ENABLED=true
      - LOG_LEVEL=info
      - EXTENDED_LOGGING=true
      
    volumes:
      - ./data:/data
      - ./backups:/backups
    
    ports:
      - "127.0.0.1:8080:80"  # 只监听本地,通过 Nginx 代理
      - "127.0.0.1:3012:3012"  # WebSocket
    
    networks:
      - vaultwarden-net
    
    labels:
      - "com.centurylinklabs.watchtower.enable=true"

networks:
  vaultwarden-net:
    driver: bridge

环境变量文件 .env

bash
# 生成强随机令牌
# 方法 1:使用 openssl
openssl rand -base64 48

# 方法 2:使用 Python
python3 -c "import secrets; print(secrets.token_urlsafe(48))"

# 方法 3:使用 /dev/urandom
head -c 48 /dev/urandom | base64

# 将生成的令牌填入 .env 文件
ADMIN_TOKEN=your_generated_admin_token_here
SMTP_PASSWORD=your_email_app_password

重要说明

⚠️ ADMIN_TOKEN

这是访问管理界面的密钥
必须足够强壮(至少 32 字符)
妥善保管,不要泄露
丢失后需要重置

⚠️ 端口绑定

127.0.0.1:8080:80
只监听本地回环地址
外部无法直接访问
必须通过 Nginx 反向代理
提高安全性

4.4 启动服务

bash
# 启动 Vaultwarden
docker compose up -d

# 查看日志
docker compose logs -f vaultwarden

# 查看运行状态
docker ps

# 期望输出:
# CONTAINER ID   IMAGE                      STATUS
# xxx            vaultwarden/server:latest  Up 2 minutes

验证运行

bash
# 检查容器健康
docker compose ps

# 测试本地访问
curl http://localhost:8080

# 应该返回 HTML 内容

4.5 初始配置

访问 Web 界面

首次访问

浏览器打开:http://your-server-ip:8080

看到欢迎页面:
"Welcome to Vaultwarden"

创建管理员账户

注意:如果禁用了公开注册,需要通过管理界面创建第一个账户。

访问管理界面

1. 访问:http://your-server-ip:8080/admin
2. 输入 ADMIN_TOKEN
3. 进入管理面板

创建第一个用户

1. 点击 "Users" 标签
2. 点击 "Add User"
3. 输入邮箱
4. 设置名称
5. 勾选 "Verified"
6. 点击 "Save"
7. 用户会收到邀请邮件(如配置了 SMTP)
8. 或通过管理界面设置密码

或者临时启用注册

bash
# 修改 docker-compose.yml
SIGNUPS_ALLOWED=true

# 重启
docker compose down
docker compose up -d

# 注册第一个账户
# 然后再次禁用注册
SIGNUPS_ALLOWED=false
docker compose restart

4.6 测试基本功能

注册用户

1. 访问主页
2. 点击 "Create Account"
3. 输入邮箱
4. 设置主密码(强密码!)
5. 确认密码
6. 点击 "Register"
7. 登录测试

添加第一个密码

1. 登录后点击 "Add Item"
2. 选择 "Login"
3. 输入网站名称
4. 输入网址
5. 输入用户名
6. 点击密码框旁的生成器
7. 保存
8. 测试自动填充

5. Nginx 反向代理配置

5.1 为什么需要反向代理?

优势

✅ HTTPS 加密
   - 保护数据传输
   - 浏览器信任
   - SEO 友好

✅ 域名访问
   - 易于记忆
   - 专业形象
   - IP 变更无影响

✅ 安全防护
   - 隐藏真实端口
   - 速率限制
   - DDoS 防护

✅ 负载均衡(未来扩展)
   - 多实例部署
   - 高可用性

5.2 安装 Nginx

方法一:Docker 方式(推荐)

创建 nginx/docker-compose.yml

yaml
version: '3.8'

services:
  nginx:
    image: nginx:alpine
    container_name: vaultwarden-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./conf.d:/etc/nginx/conf.d:ro
      - ./ssl:/etc/nginx/ssl:ro
      - ./html:/usr/share/nginx/html:ro
    networks:
      - vaultwarden-net

networks:
  vaultwarden-net:
    external: true

方法二:直接安装

bash
# Ubuntu/Debian
sudo apt install nginx certbot python3-certbot-nginx

# CentOS/RHEL
sudo yum install nginx certbot python3-certbot-nginx

# 启动 Nginx
sudo systemctl start nginx
sudo systemctl enable nginx

# 验证
sudo nginx -t
sudo systemctl status nginx

5.3 获取 SSL 证书

使用 Certbot(Let's Encrypt)

前提条件

✅ 域名已解析到服务器 IP
✅ 80 和 443 端口开放
✅ Nginx 已安装

获取证书

bash
# 停止 Nginx(如果使用 Docker)
docker compose down

# 获取证书
sudo certbot certonly --standalone \
  -d vault.yourdomain.com \
  --email your-email@example.com \
  --agree-tos \
  --no-eff-email

# 证书位置:
# /etc/letsencrypt/live/vault.yourdomain.com/fullchain.pem
# /etc/letsencrypt/live/vault.yourdomain.com/privkey.pem

自动续期

bash
# 测试续期
sudo certbot renew --dry-run

# 设置定时任务
sudo crontab -e

# 每天凌晨 3 点检查续期
0 3 * * * certbot renew --quiet && systemctl reload nginx

复制证书到 Docker 目录

bash
# 创建目录
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 $USER:$USER ~/vaultwarden/nginx/ssl/*
chmod 600 ~/vaultwarden/nginx/ssl/*

5.4 Nginx 配置详解

创建 nginx/conf.d/vaultwarden.conf

nginx
# HTTP 重定向到 HTTPS
server {
    listen 80;
    server_name vault.yourdomain.com;
    
    # Let's Encrypt 验证
    location /.well-known/acme-challenge/ {
        root /usr/share/nginx/html;
    }
    
    # 所有其他请求重定向到 HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

# HTTPS 配置
server {
    listen 443 ssl http2;
    server_name vault.yourdomain.com;
    
    # SSL 证书
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    
    # SSL 优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    
    # 安全头
    add_header Strict-Transport-Security "max-age=63072000" always;
    add_header X-Frame-Options "DENY" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    
    # 日志
    access_log /var/log/nginx/vaultwarden-access.log;
    error_log /var/log/nginx/vaultwarden-error.log;
    
    # 客户端最大上传大小(附件)
    client_max_body_size 500M;
    
    # 代理到 Vaultwarden
    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;
        
        # WebSocket 支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 超时设置
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
    }
    
    # 管理界面(可选,建议限制 IP)
    location /admin {
        # 限制特定 IP 访问(取消注释并修改 IP)
        # allow 192.168.1.100;
        # deny all;
        
        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;
    }
    
    # WebSocket 通知
    location /notifications/hub {
        proxy_pass http://vaultwarden:3012;
        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;
    }
    
    # WebSocket 通知(HTTP fallback)
    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;
    }
}

主配置文件 nginx/nginx.conf

nginx
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log /var/log/nginx/access.log main;
    
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    
    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml application/json 
               application/javascript application/xml+rss 
               application/atom+xml image/svg+xml;
    
    include /etc/nginx/conf.d/*.conf;
}

5.5 启动 Nginx

bash
# 进入 nginx 目录
cd ~/vaultwarden/nginx

# 启动 Nginx
docker compose up -d

# 查看日志
docker compose logs -f nginx

# 验证配置
docker exec vaultwarden-nginx nginx -t

5.6 测试 HTTPS 访问

浏览器访问

https://vault.yourdomain.com

应该看到:
✅ 绿色锁图标
✅ 证书有效
✅ Vaultwarden 登录页面

SSL Labs 测试

访问:https://www.ssllabs.com/ssltest/
输入您的域名
目标评分:A 或 A+

命令行测试

bash
# 测试 HTTPS
curl -I https://vault.yourdomain.com

# 应该返回 200 OK
# 检查安全头

5.7 Caddy 替代方案(更简单)

如果您觉得 Nginx 配置复杂,可以使用 Caddy(自动 HTTPS):

docker-compose.yml

yaml
version: '3.8'

services:
  caddy:
    image: caddy:alpine
    container_name: vaultwarden-caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    networks:
      - vaultwarden-net

volumes:
  caddy_data:
  caddy_config:

networks:
  vaultwarden-net:
    external: true

Caddyfile

vault.yourdomain.com {
    encode gzip
    
    reverse_proxy vaultwarden:80
    
    tls your-email@example.com
    
    header {
        Strict-Transport-Security "max-age=63072000"
        X-Frame-Options "DENY"
        X-Content-Type-Options "nosniff"
    }
}

优势

✅ 自动获取和续期 SSL 证书
✅ 配置简单
✅ 默认安全
✅ 无需 Certbot

6. 高级配置与安全加固

6.1 环境变量详解

完整的 .env 配置示例:

bash
# ===== 基本配置 =====
DOMAIN=https://vault.yourdomain.com
ADMIN_TOKEN=your_strong_admin_token_here

# ===== 注册控制 =====
SIGNUPS_ALLOWED=false
INVITATIONS_ALLOWED=false
SIGNUPS_VERIFY=true
SIGNUPS_DOMAINS_WHITELIST=yourdomain.com,company.com

# ===== 邮件配置 =====
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SSL=true
SMTP_USERNAME=your-email@gmail.com
SMTP_PASSWORD=your_app_password
SMTP_FROM=Vaultwarden <vault@yourdomain.com>
SMTP_TIMEOUT=15

# ===== 安全配置 =====
PASSWORD_ITERATIONS=100000
LOG_LEVEL=info
EXTENDED_LOGGING=true
IP_HEADER=X-Real-IP

# ===== WebSocket =====
WEBSOCKET_ENABLED=true
WEBSOCKET_ADDRESS=0.0.0.0
WEBSOCKET_PORT=3012

# ===== 附件配置 =====
MAX_ATTACHMENT_SIZE=500000000  # 500MB
ATTACHMENT_FOLDER=/data/attachments

# ===== 备份配置 =====
BACKUP_FOLDER=/backups
BACKUP_KEEP_DAYS=30

# ===== 性能优化 =====
DATABASE_MAX_CONNS=10
ROCKET_WORKERS=10
CACHE_TTL=300

# ===== 高级功能 =====
ENABLE_DB_WAL=true
SHOW_PASSWORD_HINT=false
DISABLE_ICON_DOWNLOAD=false
ORG_CREATION_USERS=admin@yourdomain.com

6.2 数据库配置

SQLite(默认,适合小规模)

yaml
# 无需额外配置
# 数据库文件:./data/db.sqlite3
# 自动备份和清理

优点

✅ 简单无需配置
✅ 单文件易备份
✅ 性能足够(< 100 用户)
✅ 无外部依赖

PostgreSQL(推荐生产环境)

添加 PostgreSQL 服务

yaml
version: '3.8'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    environment:
      - DATABASE_URL=postgresql://vaultwarden:${DB_PASSWORD}@postgres:5432/vaultwarden
    depends_on:
      - postgres
    # ... 其他配置

  postgres:
    image: postgres:15-alpine
    container_name: vaultwarden-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: vaultwarden
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: vaultwarden
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    networks:
      - vaultwarden-net

networks:
  vaultwarden-net:
    driver: bridge

优点

✅ 更好的并发性能
✅ ACID 合规
✅ 成熟稳定
✅ 易于扩展
✅ 备份工具丰富

迁移数据

bash
# 使用官方迁移工具
docker run --rm \
  -v $(pwd)/data:/source \
  vaultwarden/server:latest \
  vaultwarden migrate \
  --from sqlite:///source/db.sqlite3 \
  --to postgresql://vaultwarden:password@postgres:5432/vaultwarden

6.3 邮件配置详解

Gmail SMTP

bash
# 1. 启用两步验证
# 访问:myaccount.google.com/security

# 2. 生成应用专用密码
# 访问:myaccount.google.com/apppasswords
# 选择 "Mail" 和设备
# 复制生成的 16 位密码

# 3. 配置环境变量
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SSL=true
SMTP_USERNAME=your-email@gmail.com
SMTP_PASSWORD=xxxx xxxx xxxx xxxx  # 应用专用密码
SMTP_FROM=Vaultwarden <your-email@gmail.com>

SendGrid(推荐企业使用)

bash
# 1. 注册 SendGrid
# 访问:sendgrid.com
# 免费套餐:100 封/天

# 2. 创建 API Key
# Settings → API Keys → Create API Key

# 3. 配置
SMTP_HOST=smtp.sendgrid.net
SMTP_PORT=587
SMTP_SSL=true
SMTP_USERNAME=apikey
SMTP_PASSWORD=SG.xxxxxxxxxxxx
SMTP_FROM=noreply@yourdomain.com

测试邮件发送

bash
# 通过管理界面测试
# 1. 访问 /admin
# 2. 点击 "Test SMTP"
# 3. 输入测试邮箱
# 4. 检查是否收到

6.4 安全加固

禁用公开注册

bash
# 生产环境必须禁用
SIGNUPS_ALLOWED=false

# 如需邀请制
INVITATIONS_ALLOWED=true

IP 白名单(管理界面)

在 Nginx 配置中添加:

nginx
location /admin {
    allow 192.168.1.0/24;  # 内网
    allow 203.0.113.100;   # 特定公网 IP
    deny all;
    
    proxy_pass http://vaultwarden:80;
    # ... 其他代理设置
}

速率限制

nginx
# 在 http 块中添加
limit_req_zone $binary_remote_addr zone=vaultwarden:10m rate=10r/s;

# 在 server 块中使用
location / {
    limit_req zone=vaultwarden burst=20 nodelay;
    # ... 其他配置
}

Fail2ban 防暴力破解

安装 Fail2ban

bash
sudo apt install fail2ban

创建过滤器 /etc/fail2ban/filter.d/vaultwarden.conf

ini
[Definition]
failregex = ^.*Invalid email or password\. IP: <ADDR>\..*$
            ^.*Failed login from <ADDR>\..*$
ignoreregex =

创建监狱 /etc/fail2ban/jail.local

ini
[vaultwarden]
enabled = true
port = 80,443
filter = vaultwarden
logpath = /var/log/nginx/vaultwarden-access.log
maxretry = 5
bantime = 3600
findtime = 600

重启 Fail2ban

bash
sudo systemctl restart fail2ban
sudo fail2ban-client status vaultwarden

6.5 性能优化

数据库优化

bash
# 定期清理
docker exec -it vaultwarden sqlite3 /data/db.sqlite3 <<EOF
VACUUM;
ANALYZE;
EOF

缓存配置

bash
# 增加缓存 TTL
CACHE_TTL=600

# 启用数据库 WAL 模式
ENABLE_DB_WAL=true

工作线程调整

bash
# 根据 CPU 核心数调整
ROCKET_WORKERS=10  # 默认为 CPU 核心数 × 2

# 数据库连接池
DATABASE_MAX_CONNS=10

静态资源优化

在 Nginx 中启用 Gzip 和缓存:

nginx
# 已在 Caddyfile 中配置
# Nginx 配置见上文

(由于篇幅限制,后续章节将继续展开...)

7-10. 更多内容...

完整文章包含:

  • 客户端配置与使用(浏览器、桌面、移动端)
  • 数据迁移指南(从其他密码管理器导入)
  • 备份与恢复策略(自动备份脚本)
  • 监控与维护(日志、更新、故障排除)
  • 常见问题解答(15+ FAQ)

总结

Vaultwarden 是自建密码管理器的绝佳选择,它结合了 Bitwarden 的功能完整性和自托管的隐私保护。

🎯 核心价值

  1. 完全免费:无任何隐藏费用
  2. 数据主权:密码存储在自家服务器
  3. 功能完整:兼容所有官方客户端
  4. 资源节约:可在低功耗设备运行
  5. 社区活跃:持续更新和支持

💡 实施建议

  1. 安全第一:启用 HTTPS、强密码、2FA
  2. 定期备份:遵循 3-2-1 原则
  3. 保持更新:及时升级到最新版本
  4. 监控日志:及时发现异常
  5. 测试恢复:定期验证备份有效性

📚 延伸阅读

💬 获取帮助

  • 📖 官方文档:github.com/dani-garcia/vaultwarden/wiki
  • 💬 社区论坛:community.bitwarden.com
  • 💬 Reddit:r/Vaultwarden
  • 🐛 问题反馈:GitHub Issues
  • 💡 本站交流:欢迎在评论区分享经验

🔐 立即开始保护您的数字生活,使用 Vaultwarden 构建安全的密码管理体系!

💡 提示:收藏本页面以备将来参考。如果您觉得本指南有帮助,欢迎分享给更多朋友!