Files
server-deploy/vaultwarden/README.md

329 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Vaultwarden 部署指南
Bitwarden 兼容的自托管密码管理器,轻量、安全、功能完整。
## 功能特性
- 完全兼容 Bitwarden 官方客户端(浏览器插件、桌面端、移动端)
- 密码、笔记、信用卡、身份信息安全存储
- TOTP 两步验证码生成
- 密码分享Send 功能)
- 组织与多用户协作
- 管理员面板
- 轻量级:使用 SQLite单容器约 50MB 内存
## 技术栈
| 组件 | 版本 | 说明 |
|------|------|------|
| Vaultwarden | latest | Bitwarden 兼容服务端Rust 实现) |
| SQLite | 内置 | 轻量数据库,无需额外部署 |
| Nginx | 系统包 | 反向代理 + HTTPSBitwarden 客户端必须 HTTPS |
| Docker | 最新版 | 容器运行环境 |
## 前置条件
1. 一台 Linux 服务器Ubuntu 22.04/24.04 推荐)
2. 一个已解析到服务器的域名(如 `vault.example.com`
3. 服务器 80/443 端口可从外网访问
4. **必须启用 HTTPS**Bitwarden 客户端强制要求)
## 目录结构
```
vaultwarden/
├── docker-compose.yml # 容器编排
├── .env.example # 配置模板
├── deploy.sh # 一键部署脚本
├── backup.sh # 备份脚本
├── nginx/
│ └── vaultwarden.conf # Nginx 反向代理配置
└── README.md # 本文件
```
服务器上的数据目录:
```
/var/lib/vaultwarden/ # Vaultwarden 数据SQLite + 附件 + RSA 密钥)
/var/backups/vaultwarden/ # 备份文件
```
## 快速部署
### 第一步:上传文件到服务器
```bash
# 在本地执行,上传 base 和 vaultwarden 目录
scp -r base/ vaultwarden/ root@<服务器IP>:/opt/
```
### 第二步:登录服务器执行部署
```bash
ssh root@<服务器IP>
# 如果是全新服务器,先安装基础环境
cd /opt/base
cp .env.example .env
bash setup.sh
# 部署 Vaultwarden
cd /opt/vaultwarden
bash deploy.sh
# 首次运行会生成 .env含自动生成的 ADMIN_TOKEN按提示修改后重新运行
vi .env
bash deploy.sh
```
### 第三步:配置域名解析
在域名服务商添加 A 记录:
| 记录类型 | 主机记录 | 记录值 |
|----------|----------|--------|
| A | vault | `<服务器公网IP>` |
### 第四步:注册账号
1. 浏览器访问 `https://vault.yourdomain.com`
2. 点击「创建账户」注册一个主账号
3. 注册完成后,**强烈建议关闭注册功能**
```bash
cd /opt/vaultwarden
# 编辑 .env将 SIGNUPS_ALLOWED 改为 false
vi .env
docker compose restart
```
### 第五步:安装客户端
1. 下载 Bitwarden 客户端https://bitwarden.com/download/
2. 打开客户端,点击左上角齿轮图标
3. 在「自托管服务器」中填入服务器 URL`https://vault.yourdomain.com`
4. 保存后使用注册的账号登录
## 配置说明
### .env 配置项
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `VAULTWARDEN_DOMAIN` | 访问域名 | 必填 |
| `CERTBOT_EMAIL` | Let's Encrypt 邮箱 | 必填 |
| `ADMIN_TOKEN` | 管理员面板令牌 | 自动生成 |
| `SIGNUPS_ALLOWED` | 允许新用户注册 | `true` |
| `SHOW_PASSWORD_HINT` | 显示密码提示 | `false` |
| `SENDS_ALLOWED` | 允许 Send 功能 | `true` |
| `VAULTWARDEN_IMAGE` | Docker 镜像 | `vaultwarden/server:latest` |
| `VAULTWARDEN_DATA_DIR` | 数据目录 | `/var/lib/vaultwarden` |
| `VAULTWARDEN_PORT` | 本地监听端口 | `8080` |
| `BACKUP_DIR` | 备份目录 | `/var/backups/vaultwarden` |
| `LOG_LEVEL` | 日志级别 | `info` |
### 管理员面板
访问 `https://vault.yourdomain.com/admin`,输入 `ADMIN_TOKEN` 中的明文令牌即可登录。
管理员面板可以:
- 查看所有用户
- 邀请新用户(关闭注册后)
- 删除用户
- 查看系统诊断信息
- 调整运行时配置
> **安全提醒**:可在 Nginx 配置中限制 `/admin` 路径仅允许特定 IP 访问。
### 使用 argon2id 加强 ADMIN_TOKEN 安全性
部署脚本默认生成随机字符串作为 ADMIN_TOKEN。如需使用更安全的 argon2id 哈希:
```bash
# 生成 argon2id 哈希(使用 Bitwarden 默认参数: m=64MiB, t=3, p=4
docker run --rm -it vaultwarden/server /vaultwarden hash
# 或使用 OWASP 推荐参数m=19MiB, t=2, p=1更节省内存
docker run --rm -it vaultwarden/server /vaultwarden hash --preset owasp
```
将生成的哈希值填入 `.env` 时,**必须用单引号包裹**(因为 argon2id 字符串包含 `$` 符号):
```bash
# .env 中的写法(注意单引号)
ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$MmeK......'
```
> **注意**:登录管理面板时输入的是你生成哈希时使用的**原始明文密码**,不是哈希值本身。
## 日常运维
### 查看日志
```bash
cd /opt/vaultwarden
docker compose logs -f
docker compose logs --tail 100
```
### 备份
```bash
cd /opt/vaultwarden
bash backup.sh
```
备份内容包括:
- SQLite 数据库(支持在线安全备份)
- 附件和 RSA 密钥
- 部署配置
也可使用 Vaultwarden v1.32.1+ 内置备份命令:
```bash
docker exec -it vaultwarden /vaultwarden backup
```
备份文件保存在 `/var/backups/vaultwarden/`,自动清理 30 天前的旧备份。
**建议配置定时备份:**
```bash
# 每天凌晨 2 点自动备份
crontab -e
# 添加:
0 2 * * * cd /opt/vaultwarden && bash backup.sh >> /var/log/vaultwarden-backup.log 2>&1
```
### 恢复备份
```bash
cd /opt/vaultwarden
docker compose down
# 查看可用备份
ls /var/backups/vaultwarden/
# ⚠ 重要:先删除现有 WAL 文件,避免与恢复的数据库不匹配导致损坏
rm -f /var/lib/vaultwarden/db.sqlite3-wal /var/lib/vaultwarden/db.sqlite3-shm
# 恢复数据库
cp /var/backups/vaultwarden/<日期>/db.sqlite3 /var/lib/vaultwarden/
# 恢复附件
tar xzf /var/backups/vaultwarden/<日期>/vaultwarden-data.tar.gz -C /var/lib/
# 重启
docker compose up -d
```
> **警告**:恢复通过 `.backup` 方式创建的备份时,**必须先删除**现有的 `db.sqlite3-wal` 文件,否则 SQLite 会尝试用旧的 WAL 文件恢复数据库,可能导致数据损坏。
### 升级
```bash
cd /opt/vaultwarden
# 1. 备份数据
bash backup.sh
# 2. 拉取新镜像
docker compose pull
# 3. 重启
docker compose up -d
# 4. 检查运行状态
docker compose ps
docker compose logs --tail 20
```
### 停止 / 启动
```bash
cd /opt/vaultwarden
docker compose down # 停止
docker compose up -d # 启动
docker compose restart # 重启
```
## 安全加固建议
### 1. 关闭注册
注册好所有需要的账号后:
```bash
# .env 中设置
SIGNUPS_ALLOWED=false
```
### 2. 限制管理面板访问
`nginx/vaultwarden.conf` 中取消注释 `/admin` 的 IP 限制部分,仅允许你的 IP 访问。
### 3. 启用两步验证
登录 Vaultwarden Web 界面 → 设置 → 两步登录 → 启用 TOTP 或其他验证方式。
### 4. 定期备份
配置定时任务,每天自动备份,并将备份文件同步到异地存储。
## 故障排查
### 客户端无法连接
```bash
# 检查 HTTPS 是否正常
curl -I https://vault.yourdomain.com
# 检查容器是否运行
docker compose ps
# 检查端口
curl http://127.0.0.1:8080/alive
```
### 502 Bad Gateway
```bash
# 容器未运行
docker compose up -d
# 检查端口是否匹配
grep VAULTWARDEN_PORT .env
grep proxy_pass /etc/nginx/sites-available/vaultwarden
```
### 管理面板无法登录
```bash
# 确认 ADMIN_TOKEN 已设置
grep ADMIN_TOKEN .env
# 如果使用 argon2id 哈希,登录时输入的是原始明文密码
# 检查容器日志中的错误
docker compose logs --tail 20
```
### SSL 证书问题
```bash
# 检查证书状态
certbot certificates
# 手动续期
certbot renew --dry-run
# 检查域名解析
dig vault.yourdomain.com
```
## 端口说明
| 端口 | 协议 | 说明 |
|------|------|------|
| 80 | TCP | HTTP → HTTPS 重定向 |
| 443 | TCP | HTTPSNginx 反向代理) |
| 8080 | TCP | Vaultwarden HTTP仅监听 127.0.0.1 |