在Debian12上用docker部署Vaultwarden

大致步骤:

  1. 在合适的位置创建文件夹保存docker-compose.yml文件和数据库数据
  2. 配置docker-compose.yml文件,配置好后运行 docker compose up -d运行服务
  3. 配置反向代理
  4. 配置fail2ban 防止密码管理器帐号被暴力破解
  5. 设置定时备份。

前期准备

  • 一个vps服务器
  • 一个域名,已经dns解析到服务器的ip地址(下文用example.com替代,自行替换成你自己的)

开始部署

设定数据保存位置

我喜欢在/home文件夹存放docker容器的数据,因此创建并进入/home/docker_apps/vaultwarden文件夹:

cd /home
mkdir docker_apps docker_apps/vaultwarden

进入刚刚创建的文件夹,创建docker-compose.yml文件并编辑(没有vim的要先安装,或者使用nano等其他文本编辑器)

cd docker_apps/vaultwarden
vim docker-compose.yml

键入i进入编辑模式(左下角显示--insert--)

编辑配置docker-compose文件

按照官方wiki进行配置,或者查看汉化版

我的docker-compose.yml文件(使用了postgresql数据库):

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    volumes:
      - ./vw-data/:/persistent/
    # - ./vw-database/:/database/ #启用默认的数据库时启用,并注释掉下文的‘- DATABASE_URL=’,这里启用了postgresql就不启用了
      - ./vw-attachments/:/attachments/
      - /icon_cache/ # 按wiki的说法这样子设置容器升级的时候后会清除图标,可以可避免在缓存中保留过时的图标
      - ./logs/:/fail2banlogs/ #在home文件夹生成log日志文件,启用fail2ban时需要
    restart: unless-stopped
    depends_on:
     - db
    ports:
      - "127.0.0.1:8888:80"
    environment:
      - DOMAIN=https:// #输入你的已经解析到服务器ip地址的域名
    # - SIGNUPS_DOMAINS_WHITELIST=gmail.com,outlook.com,hotmail.com,qq.com,foxmail.com,icloud.com #启用注册邮箱后缀限制,启用后禁止注册将失效
      - WEB_VAULT_ENABLED=true #启用网页页面
      - SIGNUPS_ALLOWED=false  #启用后禁止注册,管理员仍可邀请新成员;启用邮箱后缀后即使有限制也会失效
      - SIGNUPS_VERIFY=true    #启用注册验证,即往注册帐号的邮箱发送验证
      - ADMIN_TOKEN=${VAULTWARDEN_ADMIN_TOKEN} # 启用管理员界面 

        #  永久化的 数据映射
      - DATA_FOLDER=/persistent 
    # - DATABASE_URL=/database/vaultwarden.sqlite3  #使用默认数据库时启用,使用其他数据库时将此条注释掉
      - DATABASE_URL=postgres://${DB_USER}:${DB_SECRET}@db/${DB_NAME}?sslmode=disable #使用默认数据库时,将此条注释掉
      - ATTACHMENTS_FOLDER=/attachments
      - ICON_CACHE_FOLDER=/icon_cache
      - ROCKET_WORKERS=20 

        #启用bitwarden的push,访问https://bitwarden.com/host/ 输入邮箱注册,地区选的美国
      - PUSH_ENABLED=true
      - PUSH_INSTALLATION_ID=       #将注册的id复制至此
      - PUSH_INSTALLATION_KEY=      #将注册的key复制至此

        #通知邮件的配置
        # Domains: gmail.com, googlemail.com
      - SMTP_HOST=
      - SMTP_PORT=587
      - SMTP_SECURITY=starttls
      - SMTP_FROM=${SMTP_FROM}
      - SMTP_USERNAME=${SMTP_USER}
      - SMTP_PASSWORD=${SMTP_PASSWD}
  
      - SHOW_PASSWORD_HINT=false       #禁用密码提示
        
      - LOG_FILE=/fail2banlogs/vaultwarden.log          #指定日志文件
      - LOG_LEVEL=info
      - EXTENDED_LOGGING=true
        # - ENABLE_WEBSOCKET=false # 禁用websocket 
        
  db:
    image: postgres:15
    container_name: postgres_vaultwarden
    environment:
        - POSTGRES_DB=${DB_NAME}
        - POSTGRES_USER=${DB_USER}
        - POSTGRES_PASSWORD=${DB_SECRET} #特殊字符要特别设置转义字符,懒得折腾仅使用大小写的字母和数字
    volumes:
        - ./db:/var/lib/postgresql/data
    restart: unless-stopped

修改好后键入:wq按下回车退出

编辑.env环境变量

同文件夹下键入 vim .envi进入编辑模式

VAULTWARDEN_ADMIN_TOKEN=
DB_NAME=
DB_USER=
DB_SECRET=
SMTP_FROM=
SMTP_USERNAME=
SMTP_PASSWD=

建议各个值都用小引号‘’括起来,以及VAULTWARDEN_ADMIN_TOKEN要避免明文,参考官方wiki中文版。 配置完成后在此文件夹下运行 docker compose up -d 以启动服务。 可使用命令docker ps是否正常运行

配置反向代理

需要提前安装好nginx、certbot、python3-certbot-nginx 如果没有安装执行

apt update
apt install nginx certbot python3-certbot-nginx

创建配置文件 vim /etc/nginx/conf.d/vaultwarden.confi进入编辑模式,wiki上有示例配置,或者查看 汉化版说明

用certbot申请ssl证书,以下二选一

  1. 停止nginx(systemctl stop nginx)后运行certbot certonly --standalone -d example.com然后再去配置文件中指定ssl证书文件位置,再运行systemctl restart nginx重启nginx
  2. 不停止nginx,将配置文件的server块改成只监听80端口,让certbot自动设置你的ssl证书位置,执行certbot --nginx -d example.com

我使用第二种,下面是示例配置:

/etc/nginx/conf.d文件夹下的vaultwarden.conf:

server {
    listen 80;
    listen [::]:80;
    server_name example.com;



    client_max_body_size 525M;
location / {
      proxy_set_header   X-Real-IP $remote_addr;
      proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header   Host $host;
      proxy_pass         http://localhost:8888/;
      proxy_http_version 1.1;
      proxy_set_header   Upgrade $http_upgrade;
      proxy_set_header   Connection "upgrade";
      proxy_set_header X-Forwarded-Proto $scheme;

      # proxy_cache my_proxy_cache;
      #add_header Alt-Svc 'h3=":443"; ma=86400';
  }
}

编辑好后,执行certbot --nginx -d example.com后如果没有报错那就是已经设置上了,这时候再查看这个配置会发现被certbot自动增加上了ssl部分,打开浏览器访问你的网页吧。 到此为止基本的安装结束了。

配置fail2ban

fail2ban可以直接照汉化过的wiki来。 假设你按官方的wiki设置了一对filter与jail规则vaultwarden.local(按wiki在对应的文件夹创建对应的文件),执行 fail2ban-client status vaultwarden查看状态

设置定时备份

打字打半天累了,有空再更新吧。

停止容器---打包文件夹---上传打包好的包文件到要保存的地方(网盘、github仓库...)---重启容器 的思路创建脚本定时执行就行了。