开源密码管理服务Vaultwarden

开源密码管理服务Vaultwarden

Vaultwarden(原Bitwarden_rs)是Bitwarden密码管理器的轻量级Rust实现,资源占用仅为原版的1/10,同时保持100% API兼容性

官方地址:https://github.com/dani-garcia/vaultwarden

一、部署前准备

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. 访问管理控制台

  1. 打开浏览器访问:https://vault.yourdomain.com
  2. 注册第一个账户(管理员账户)
  3. 访问管理控制台:https://vault.yourdomain.com/admin
  4. 使用.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)

  1. 登录个人账户
  2. 进入"设置" > "安全" > "两步登录"
  3. 选择认证方式(推荐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

九、客户端使用指南

桌面客户端:

浏览器扩展:

移动应用:

  • Android/iOS搜索"Bitwarden"
  • 设置 > 服务器 > 输入自建URL
相关推荐
江湖有缘5 小时前
Docker一键部署docat:打造轻量级开源文档管理系统
docker·容器·开源
百***24375 小时前
GLM-4.7底层技术拆解与落地避坑:开源大模型编码实战指南
人工智能·gpt·开源
IvorySQL5 小时前
用 PostgreSQL 实践 Palantir 本体论
数据库·postgresql·开源
viperrrrrrrrrr75 小时前
开源模型如何盈利
人工智能·开源·deepseek-v4
南知意-5 小时前
两款免费开源的音乐播放器!
开源·开源软件·音乐播放器·软件
小小呱呱蛙6 小时前
spec-kit 到底干了啥
开源·ai编程
Android技术之家6 小时前
在手机上跑大模型?Google AI Edge Gallery 开源项目深度解析
前端·人工智能·edge·开源
是毛毛吧6 小时前
GitHub前沿----AI Agent 爆发前夜:深度解析 UI-TARS, MCP 与 Claude Code 如何重塑开发流
开源·github
万岳软件开发小城6 小时前
如何用直播电商系统源码低成本打造自己的直播带货APP/小程序?
开源·php·源码·直播带货系统源码·直播带货软件开发·直播带货app开发·电商直播小程序