在Debian12上用docker部署Vaultwarden
大致步骤:
- 在合适的位置创建文件夹保存
docker-compose.yml
文件和数据库数据- 配置
docker-compose.yml
文件,配置好后运行docker compose up -d
运行服务- 配置反向代理
- 配置fail2ban 防止密码管理器帐号被暴力破解
- 设置定时备份。
前期准备
- 一个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文件
我的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 .env
按i
进入编辑模式
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.conf
按i
进入编辑模式,wiki上有示例配置,或者查看 汉化版说明
用certbot申请ssl证书,以下二选一
- 停止nginx(
systemctl stop nginx
)后运行certbot certonly --standalone -d example.com
然后再去配置文件中指定ssl证书文件位置,再运行systemctl restart nginx
重启nginx - 不停止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仓库...)---重启容器
的思路创建脚本定时执行就行了。