开源密码管理服务Vaultwarden
- 一、部署前准备
- [二、安装Docker与Docker Compose](#二、安装Docker与Docker Compose)
-
- [1. 安装Docker](#1. 安装Docker)
- [2. 安装Docker Compose](#2. 安装Docker Compose)
- 三、Vaultwarden部署
-
- 目录结构
- [1. 创建部署目录](#1. 创建部署目录)
- [2. 创建环境变量文件](#2. 创建环境变量文件)
- [3. 创建docker-compose.yml](#3. 创建docker-compose.yml)
- [4. 配置Nginx反向代理](#4. 配置Nginx反向代理)
- 四、获取SSL证书
-
- [1. 临时启动服务](#1. 临时启动服务)
- [2. 使用Certbot获取证书](#2. 使用Certbot获取证书)
- [3. 配置证书自动续期](#3. 配置证书自动续期)
- 五、启动与验证
-
- [1. 重启服务](#1. 重启服务)
- [2. 验证服务状态](#2. 验证服务状态)
- [3. 访问管理控制台](#3. 访问管理控制台)
- 六、安全加固与优化
-
- [1. 禁用公开注册](#1. 禁用公开注册)
- [2. 启用双因素认证(2FA)](#2. 启用双因素认证(2FA))
- [3. 数据库备份](#3. 数据库备份)
- [4. 性能优化](#4. 性能优化)
- 七、故障排除
- 九、客户端使用指南
Vaultwarden(原Bitwarden_rs)是Bitwarden密码管理器的轻量级Rust实现,资源占用仅为原版的1/10,同时保持100% API兼容性
一、部署前准备
python
系统要求
操作系统:CentOS 7.6+
内存:≥1GB(推荐2GB)
存储:≥2GB可用空间
网络:开放80/443端口
环境配置
python
# 更新系统
sudo yum update -y
# 安装基础工具
sudo yum install -y epel-release curl wget vim
# 禁用SELinux(可选但推荐)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
二、安装Docker与Docker Compose
1. 安装Docker
python
# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
2. 安装Docker Compose
python
# 下载最新版本(替换为最新版本号)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 设置可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
三、Vaultwarden部署
目录结构
python
/opt/vaultwarden/
├── docker-compose.yml
├── .env
├── data/
└── nginx/
└── nginx.conf
1. 创建部署目录
python
sudo mkdir -p /opt/vaultwarden/{data,nginx}
cd /opt/vaultwarden
2. 创建环境变量文件
python
sudo tee .env <<EOF
# Vaultwarden 配置
DOMAIN=https://vault.yourdomain.com
ADMIN_TOKEN=$(openssl rand -base64 48) # 自动生成管理员令牌
SIGNUPS_ALLOWED=true # 首次部署后设为false
WEBSOCKET_ENABLED=true
DATA_DIR=/data
# 数据库配置
DATABASE_URL=/data/db.sqlite3
# SMTP配置(示例使用QQ邮箱)
SMTP_HOST=smtp.qq.com
SMTP_PORT=465
SMTP_SECURITY=force_tls
SMTP_USERNAME=your_email@qq.com
SMTP_PASSWORD=your_smtp_password # QQ邮箱授权码
SMTP_FROM=no-reply@yourdomain.com
EOF
3. 创建docker-compose.yml
python
version: '3.8'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
env_file: .env
volumes:
- ./data:/data
networks:
- vault-net
nginx:
image: nginx:alpine
container_name: vault-nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./data/ssl:/etc/letsencrypt
depends_on:
- vaultwarden
networks:
- vault-net
networks:
vault-net:
driver: bridge
4. 配置Nginx反向代理
python
sudo tee nginx/nginx.conf <<'EOF'
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server_tokens off;
# HTTP重定向到HTTPS
server {
listen 80;
server_name vault.yourdomain.com;
return 301 https://$host$request_uri;
}
# HTTPS服务器
server {
listen 443 ssl http2;
server_name vault.yourdomain.com;
# 证书路径(稍后生成)
ssl_certificate /etc/letsencrypt/live/vault.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vault.yourdomain.com/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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# 安全头
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
# 客户端最大上传大小
client_max_body_size 128M;
# 反向代理配置
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支持
location /notifications/hub {
proxy_pass http://vaultwarden:3012;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
EOF
四、获取SSL证书
1. 临时启动服务
python
sudo docker-compose up -d
2. 使用Certbot获取证书
python
# 安装Certbot
sudo yum install -y certbot python3-certbot-nginx
# 获取证书(确保域名解析已生效)
sudo certbot certonly --webroot \
-w /opt/vaultwarden/data \
-d vault.yourdomain.com \
--email admin@yourdomain.com \
--agree-tos \
--non-interactive
# 创建证书软链接
sudo mkdir -p /opt/vaultwarden/data/ssl/live/vault.yourdomain.com
sudo ln -s /etc/letsencrypt/live/vault.yourdomain.com/fullchain.pem /opt/vaultwarden/data/ssl/live/vault.yourdomain.com/
sudo ln -s /etc/letsencrypt/live/vault.yourdomain.com/privkey.pem /opt/vaultwarden/data/ssl/live/vault.yourdomain.com/
3. 配置证书自动续期
python
# 创建续期脚本
sudo tee /etc/cron.daily/certbot-renew <<EOF
#!/bin/sh
certbot renew --quiet --post-hook "systemctl reload nginx"
EOF
# 设置可执行权限
sudo chmod +x /etc/cron.daily/certbot-renew
五、启动与验证
1. 重启服务
python
sudo docker-compose down
sudo docker-compose up -d
2. 验证服务状态
python
# 检查容器状态
docker ps
# 查看日志
docker logs vaultwarden -f
# 健康检查
curl -I https://vault.yourdomain.com
# 检查WebSocket连接
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" \
-H "Host: vault.yourdomain.com" https://vault.yourdomain.com/notifications/hub
3. 访问管理控制台
- 打开浏览器访问:https://vault.yourdomain.com
- 注册第一个账户(管理员账户)
- 访问管理控制台:https://vault.yourdomain.com/admin
- 使用.env文件中生成的ADMIN_TOKEN登录
六、安全加固与优化
1. 禁用公开注册
python
# 编辑.env文件
sudo sed -i 's/SIGNUPS_ALLOWED=true/SIGNUPS_ALLOWED=false/' /opt/vaultwarden/.env
# 重启服务
sudo docker-compose restart vaultwarden
2. 启用双因素认证(2FA)
- 登录个人账户
- 进入"设置" > "安全" > "两步登录"
- 选择认证方式(推荐Authenticator应用)
3. 数据库备份
python
# 创建备份脚本
sudo tee /opt/vaultwarden/backup.sh <<'EOF'
#!/bin/bash
BACKUP_DIR="/opt/vaultwarden/backups"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
mkdir -p $BACKUP_DIR
docker exec vaultwarden sqlite3 /data/db.sqlite3 ".backup '$BACKUP_DIR/db_$TIMESTAMP.sqlite3'"
tar czf $BACKUP_DIR/vaultwarden_$TIMESTAMP.tar.gz $BACKUP_DIR/db_$TIMESTAMP.sqlite3 /opt/vaultwarden/data/attachments
echo "备份完成: $BACKUP_DIR/vaultwarden_$TIMESTAMP.tar.gz"
EOF
# 设置可执行权限
sudo chmod +x /opt/vaultwarden/backup.sh
# 每日自动备份
(crontab -l 2>/dev/null; echo "0 2 * * * /opt/vaultwarden/backup.sh") | crontab -
4. 性能优化
python
# 在docker-compose.yml中添加资源限制
services:
vaultwarden:
# ...现有配置
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
七、故障排除
常见问题解决方案
| 问题现象 | 解决方案 |
|---|---|
| 无法发送邮件 | 检查SMTP配置,QQ邮箱需使用授权码而非密码 |
| WebSocket连接失败 | 确认nginx配置中包含/notifications/hub位置块 |
| 上传附件失败 | 增加nginx的client_max_body_size值 |
| 管理员控制台无法访问 | 检查.env中的ADMIN_TOKEN是否正确 |
| HTTPS证书过期 | 运行sudo /etc/cron.daily/certbot-renew手动续期 |
日志分析命令
python
# 查看实时日志
docker-compose logs -f vaultwarden
# 搜索特定错误
docker logs vaultwarden 2>&1 | grep -i error
# 检查数据库完整性
docker exec -it vaultwarden sqlite3 /data/db.sqlite3 "PRAGMA integrity_check;"
八、升级与维护
1. 升级Vaultwarden
python
cd /opt/vaultwarden
docker-compose pull
docker-compose up -d --force-recreate
2. 数据迁移
python
# 备份整个数据目录
tar czf vaultwarden_backup.tar.gz data/
# 在新服务器恢复
tar xzf vaultwarden_backup.tar.gz -C /opt/vaultwarden/
docker-compose up -d
九、客户端使用指南
桌面客户端:
- 下载地址:https://bitwarden.com/download/
- 服务器URL填写:https://vault.yourdomain.com
浏览器扩展:
- Chrome扩展:https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb
- 设置 > 服务器URL填写自建地址
移动应用:
- Android/iOS搜索"Bitwarden"
- 设置 > 服务器 > 输入自建URL