1734 字
9 分钟
Docker 部署密码管理器 Vaultwarden
2025-04-20
2025-08-04

简介#

Vaultwarden 是一个与 Bitwarden 兼容的自托管密码管理服务器,使用 Rust 编写,资源占用小,安全性高。它实现了 Bitwarden 客户端所需的所有主要功能,是一个轻量级的替代方案。本文将详细介绍如何使用 Docker 部署 Vaultwarden。

前置要求#

  • 已安装 Docker
  • 服务器具备公网访问能力(可选)
  • 基本的 Linux 命令行操作知识
  • 域名(推荐,用于 HTTPS 配置)

部署步骤#

1. 创建工作目录#

Terminal window
mkdir vaultwarden
cd vaultwarden

2. 创建数据目录#

Terminal window
mkdir data

3. 运行 Vaultwarden 容器#

使用基本配置运行 Vaultwarden:

Terminal window
docker run -d \
--name vaultwarden \
--restart unless-stopped \
-v $(pwd)/data:/data \
-p 8080:80 \
-e WEBSOCKET_ENABLED=true \
vaultwarden/server:latest

4. 访问 Vaultwarden#

在浏览器中访问 http://your-server-ip:8080 进入 Vaultwarden 初始化页面。

环境变量配置#

Vaultwarden 支持多种环境变量配置,以下是常用配置项:

Terminal window
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"

启动服务:

Terminal window
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

# 强制 HTTPS
server {
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.insertuser-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-proxyletsencrypt 自动配置 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#

Terminal window
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:

Terminal window
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

日常维护#

备份数据#

Terminal window
# 备份数据目录
tar czf vaultwarden-backup-$(date +%Y%m%d).tar.gz data/
# 或者只备份数据库
cp data/db.sqlite3 vaultwarden-db-$(date +%Y%m%d).sqlite3

升级版本#

Terminal window
# 拉取最新镜像
docker pull vaultwarden/server:latest
# 停止并删除现有容器
docker stop vaultwarden
docker rm vaultwarden
# 使用相同参数重新运行容器
docker run -d \
--name vaultwarden \
--restart unless-stopped \
-v $(pwd)/data:/data \
-p 8080:80 \
-e WEBSOCKET_ENABLED=true \
vaultwarden/server:latest

查看日志#

Terminal window
# 查看实时日志
docker logs -f vaultwarden
# 查看最近的日志
docker logs --tail 100 vaultwarden
# 查看 Vaultwarden 容器日志
docker logs vaultwarden
# 查看详细日志
docker logs --details vaultwarden

手机安装 bitwarden、edge 安装插件#

MIUI密码填充服务设置:更多设置-语言与输入法-自动填充服务-Bitwarden

遇到问题#

安全建议#

  1. 启用 HTTPS:始终使用 HTTPS 保护数据传输
  2. 限制注册:在生产环境中关闭新用户注册
  3. 定期备份:定期备份数据目录
  4. 更新及时:定期更新 Vaultwarden 到最新版本
  5. 强密码策略:设置管理员令牌并使用强密码

故障排除#

常见问题#

  1. 无法注册账号 原因:ipv6tables限制了某些端口访问,去掉所有限制后成功注册
  2. 密码记录无法删除 原因:nginx限制了put请求,增加PUT即可
  3. 移动端无法连接服务 原因:nginx限制了客户端的请求,增加Bitwarden_Mobile即可
  4. 无法访问 Web 界面
    • 检查防火墙设置
    • 确认端口映射正确
    • 查看容器日志
  5. WebSockets 连接失败
    • 确认 WEBSOCKET_ENABLED=true 已设置
    • 检查反向代理 WebSocket 配置
  6. 邮件发送失败
    • 检查 SMTP 配置
    • 确认防火墙未阻止 SMTP 端口

总结#

通过 Docker 部署 Vaultwarden 可以快速搭建一个安全、自托管的密码管理服务。相比 Bitwarden 官方服务,Vaultwarden 具有资源占用小、易于部署和完全控制数据的优势。根据实际需求,可以进一步配置 HTTPS、外部数据库和邮件服务等功能来提升安全性和可用性。

Vaultwarden 是个人用户和小型团队管理密码的理想选择,既保证了数据安全,又提供了与 Bitwarden 完全兼容的客户端体验。

Docker 部署密码管理器 Vaultwarden
https://3log.us.kg/posts/blog/tech/service/docker/docker-部署密码管理器-vaultwarden/
作者
迟来者
发布于
2025-04-20
许可协议
CC BY-NC-SA 4.0