简介
Vaultwarden 是一个与 Bitwarden 兼容的自托管密码管理服务器,使用 Rust 编写,资源占用小,安全性高。它实现了 Bitwarden 客户端所需的所有主要功能,是一个轻量级的替代方案。本文将详细介绍如何使用 Docker 部署 Vaultwarden。
前置要求
- 已安装 Docker
- 服务器具备公网访问能力(可选)
- 基本的 Linux 命令行操作知识
- 域名(推荐,用于 HTTPS 配置)
部署步骤
1. 创建工作目录
mkdir vaultwardencd vaultwarden2. 创建数据目录
mkdir data3. 运行 Vaultwarden 容器
使用基本配置运行 Vaultwarden:
docker run -d \ --name vaultwarden \ --restart unless-stopped \ -v $(pwd)/data:/data \ -p 8080:80 \ -e WEBSOCKET_ENABLED=true \ vaultwarden/server:latest4. 访问 Vaultwarden
在浏览器中访问 http://your-server-ip:8080 进入 Vaultwarden 初始化页面。
环境变量配置
Vaultwarden 支持多种环境变量配置,以下是常用配置项:
docker run -d \ --restart always \ --name vaultwarden \ --net nginx-net \ -p 3336:80 \ -v /mnts/docker-files/vaultwarden/data:/data/ \ --env DOMAIN="https://域名" \ --env LOGIN_RATELIMIT_MAX_BURST=10 \ --env LOGIN_RATELIMIT_SECONDS=60 \ --env ADMIN_RATELIMIT_MAX_BURST=10 \ --env ADMIN_RATELIMIT_SECONDS=60 \ --env ADMIN_SESSION_LIFETIME=20 \ --env ADMIN_TOKEN=令牌 \ --env SENDS_ALLOWED=true \ --env EMERGENCY_ACCESS_ALLOWED=true \ --env WEB_VAULT_ENABLED=true \ --env SIGNUPS_ALLOWED=true \ quay.io/vaultwarden/server:latest
# DOMAIN="https://v.wice.eu.org" \ # 这是您希望与您的Vaultwarden实例关联的域名。# LOGIN_RATELIMIT_MAX_BURST=10 # 允许在一阵登录/两步验证尝试中的最大请求次数。# LOGIN_RATELIMIT_SECONDS=60 # 这是来自同一IP的登录请求之间的平均秒数,在Vaultwarden限制登录次数之前。# ADMIN_RATELIMIT_MAX_BURST=10 # 这与LOGIN_RATELIMIT_MAX_BURST相同,只争对admin面板。# ADMIN_RATELIMIT_SECONDS=60 # 这与LOGIN_RATELIMIT_SECONDS相同# ADMIN_SESSION_LIFETIME=20 # 会话持续时间# ADMIN_TOKEN=YourReallyStrongAdminTokenHere # 此值是Vaultwarden管理员面板的令牌(一种密码)。为了安全起见,这应该是一个长的随机字符串。如果未设置此值,则管理员面板将被禁用。建议openssl rand -base64 48 生成ADMIN_TOKEN确保安全# SENDS_ALLOWED=true # 此设置决定是否允许用户创建Bitwarden发送 - 一种凭证共享形式。# EMERGENCY_ACCESS_ALLOWED=true # 此设置控制用户是否可以启用紧急访问其账户的权限。例如,这样做可以在用户去世后,配偶可以访问密码库以获取账户凭证。可能的值:true / false。# WEB_VAULT_ENABLED=true # 此设置决定了网络保险库是否可访问。一旦您配置了您的账户和客户端,停止您的容器,然后将此值切换为false并重启Vaultwarden,可以用来防止未授权访问。可能的值:true/false。# SIGNUPS_ALLOWED=true # 此设置控制新用户是否可以在没有邀请的情况下注册账户。可能的值:true / false。使用 Docker Compose 部署
创建 docker-compose.yml 文件:
version: '3.8'
services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped environment: WEBSOCKET_ENABLED: 'true' SIGNUPS_ALLOWED: 'true' INVITATIONS_ALLOWED: 'false' ADMIN_TOKEN: 'your-admin-token' DOMAIN: 'https://your-domain.com' volumes: - ./data:/data ports: - "8080:80"启动服务:
docker-compose up -d配置 HTTPS(推荐)
为了安全考虑,强烈建议配置 HTTPS。可以使用 Nginx 或 Traefik 作为反向代理。
使用 Nginx 配置 HTTPS
创建 docker-compose.yml:
version: '3.8'
services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped environment: WEBSOCKET_ENABLED: 'true' SIGNUPS_ALLOWED: 'true' DOMAIN: 'https://your-domain.com' volumes: - ./data:/data networks: - vaultwarden_network
nginx: image: nginx:alpine container_name: nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./nginx/conf:/etc/nginx/conf.d - ./nginx/certs:/etc/nginx/certs - ./nginx/logs:/var/log/nginx depends_on: - vaultwarden networks: - vaultwarden_network
networks: vaultwarden_network: driver: bridge创建 Nginx 配置文件 nginx/conf/default.conf:
# 强制 HTTPSserver { listen 80; server_name your-domain.com; return 301 https://$server_name$request_uri;}
map $http_upgrade $connection_upgrade { default upgrade; '' close;}# HTTPS 配置server {
server_name v.wice.eu.org;
include /etc/nginx/conf.d/server.conf.insert; # 增加身份验证 #auth_basic "my site auth."; #auth_basic_user_file /etc/nginx/conf/auth_password;
location / { proxy_pass http://vaultwarden:80/; # 注意改成你实际使用的端口 rewrite ^/(.*)$ /$1 break; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade-Insecure-Requests 1; proxy_set_header X-Forwarded-Proto https;
# 可选:解决 WebSocket 代理问题 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
include /etc/nginx/conf.d/server.conf.append;
}修改server.conf.insert的user-agent
# 仅放行指定user-agent
if ($http_user_agent !~* "Edg|Bitwarden_Mobile" ) { return 403;}修改请求类型,增加|PUT改为
# 限制请求类型
if ($request_method !~ ^(GET|HEAD|POST|PATCH|PUT)$ ){ return 403;}使用 Let’s Encrypt 自动配置 SSL
可以使用 nginx-proxy 和 letsencrypt 自动配置 SSL:
version: '3.8'
services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped environment: WEBSOCKET_ENABLED: 'true' SIGNUPS_ALLOWED: 'true' DOMAIN: 'https://your-domain.com' volumes: - ./data:/data networks: - vaultwarden_network expose: - 80 environment: - VIRTUAL_HOST=your-domain.com - VIRTUAL_PORT=80 - LETSENCRYPT_HOST=your-domain.com - LETSENCRYPT_EMAIL=your-email@example.com
nginx-proxy: image: jwilder/nginx-proxy container_name: nginx-proxy restart: unless-stopped ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro - ./certs:/etc/nginx/certs:ro - ./vhost.d:/etc/nginx/vhost.d - ./html:/usr/share/nginx/html networks: - vaultwarden_network
letsencrypt: image: jrcs/letsencrypt-nginx-proxy-companion container_name: letsencrypt restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./certs:/etc/nginx/certs - ./vhost.d:/etc/nginx/vhost.d - ./html:/usr/share/nginx/html - ./acme:/etc/acme.sh environment: - NGINX_PROXY_CONTAINER=nginx-proxy networks: - vaultwarden_network depends_on: - nginx-proxy
networks: vaultwarden_network: driver: bridge数据库配置
默认情况下,Vaultwarden 使用 SQLite 数据库。对于生产环境,可以配置使用外部数据库:
使用 PostgreSQL
docker run -d \ --name vaultwarden-db \ -e POSTGRES_USER=vaultwarden \ -e POSTGRES_PASSWORD=your-password \ -e POSTGRES_DB=vaultwarden \ -v postgres_data:/var/lib/postgresql/data \ postgres:14
docker run -d \ --name vaultwarden \ --restart unless-stopped \ -v $(pwd)/data:/data \ -p 8080:80 \ -e DATABASE_URL=postgresql://vaultwarden:your-password@vaultwarden-db/vaultwarden \ -e WEBSOCKET_ENABLED=true \ vaultwarden/server:latest邮件配置
为了启用邮件功能(如密码重置),需要配置 SMTP:
docker run -d \ --name vaultwarden \ --restart unless-stopped \ -v $(pwd)/data:/data \ -p 8080:80 \ -e SMTP_HOST=smtp.your-email-provider.com \ -e SMTP_FROM=vaultwarden@your-domain.com \ -e SMTP_PORT=587 \ -e SMTP_SECURITY=starttls \ -e SMTP_USERNAME=your-smtp-username \ -e SMTP_PASSWORD=your-smtp-password \ -e DOMAIN=https://your-domain.com \ vaultwarden/server:latest日常维护
备份数据
# 备份数据目录tar czf vaultwarden-backup-$(date +%Y%m%d).tar.gz data/
# 或者只备份数据库cp data/db.sqlite3 vaultwarden-db-$(date +%Y%m%d).sqlite3升级版本
# 拉取最新镜像docker pull vaultwarden/server:latest
# 停止并删除现有容器docker stop vaultwardendocker rm vaultwarden
# 使用相同参数重新运行容器docker run -d \ --name vaultwarden \ --restart unless-stopped \ -v $(pwd)/data:/data \ -p 8080:80 \ -e WEBSOCKET_ENABLED=true \ vaultwarden/server:latest查看日志
# 查看实时日志docker logs -f vaultwarden
# 查看最近的日志docker logs --tail 100 vaultwarden
# 查看 Vaultwarden 容器日志docker logs vaultwarden
# 查看详细日志docker logs --details vaultwarden手机安装 bitwarden、edge 安装插件
MIUI密码填充服务设置:更多设置-语言与输入法-自动填充服务-Bitwarden
遇到问题
安全建议
- 启用 HTTPS:始终使用 HTTPS 保护数据传输
- 限制注册:在生产环境中关闭新用户注册
- 定期备份:定期备份数据目录
- 更新及时:定期更新 Vaultwarden 到最新版本
- 强密码策略:设置管理员令牌并使用强密码
故障排除
常见问题
- 无法注册账号
原因:
ipv6tables限制了某些端口访问,去掉所有限制后成功注册 - 密码记录无法删除
原因:
nginx限制了put请求,增加PUT即可 - 移动端无法连接服务
原因:
nginx限制了客户端的请求,增加Bitwarden_Mobile即可 - 无法访问 Web 界面:
- 检查防火墙设置
- 确认端口映射正确
- 查看容器日志
- WebSockets 连接失败:
- 确认
WEBSOCKET_ENABLED=true已设置 - 检查反向代理 WebSocket 配置
- 确认
- 邮件发送失败:
- 检查 SMTP 配置
- 确认防火墙未阻止 SMTP 端口
总结
通过 Docker 部署 Vaultwarden 可以快速搭建一个安全、自托管的密码管理服务。相比 Bitwarden 官方服务,Vaultwarden 具有资源占用小、易于部署和完全控制数据的优势。根据实际需求,可以进一步配置 HTTPS、外部数据库和邮件服务等功能来提升安全性和可用性。
Vaultwarden 是个人用户和小型团队管理密码的理想选择,既保证了数据安全,又提供了与 Bitwarden 完全兼容的客户端体验。