跳轉到內容

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 構建安全的密碼管理體系!

💡 提示:收藏本頁面以備將來參考。如果您覺得本指南有幫助,歡迎分享給更多朋友!

最後更新於: