Docker部署Vaultwarden(Bitwarden_RS)
最近又有超星學(xué)習(xí)通的數(shù)據(jù)庫(kù)被脫褲的消息,涉及了1.6億條個(gè)人信息,又是一次密碼大泄露,所以我也開(kāi)始考慮使用密碼管理器了。
因?yàn)?Password收費(fèi)且價(jià)格不低,所以我想嘗試一下可以自行部署的Bitwarden,但是當(dāng)我看到官方版本的Docker部署時(shí),頭直接大一圈:
圖片[1]-Docker部署Vaultwarden(Bitwarden_RS)-Rain's Blog
官方版本的Docker容器部署
只能說(shuō)官方的Docker腳本屬實(shí)太全面,也難怪最低要求為2GB的RAM,普通用戶屬實(shí)是無(wú)福消受了
然后我在GitHub瞎晃的時(shí)候突然看見(jiàn)了名為Vaultwarden的項(xiàng)目,自介紹為使用Ruby重寫的Bitwarden Server API(官方為C語(yǔ)言),大幅減少了內(nèi)存占用的同時(shí)也提供了更精簡(jiǎn)的鏡像部署,非常適合個(gè)人的私有化部署,并且文檔真的是相當(dāng)詳細(xì)了(從部署到數(shù)據(jù)庫(kù)備份到恢復(fù)備份都有完整的文檔說(shuō)明),那么立即開(kāi)整!
安裝Docker
使用官方安裝腳本,安裝源為阿里云,默認(rèn)最新發(fā)行版
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
拉取鏡像&&部署鏡像
docker run -d --restart=always --name vaultwarden? \
-v /vw-data/:/data/? \
-p 3011:80 \
-p 3012:3012 \
-e ADMIN_TOKEN=some_random_token_as_per_above_explanation \
vaultwarden/server:latest
參數(shù)解釋:
/vw-data/:數(shù)據(jù)存放位置,可以替換為自定義目錄
ADMIN_TOKEN:管理員登錄密鑰,推薦使用openssl rand -base64 48創(chuàng)建一個(gè)隨機(jī)字符串
-p:端口設(shè)置,如果本機(jī)環(huán)境內(nèi)有NGINX作為反向代理的話,則應(yīng)該將80端口映射到其他端口上.
NGINX反向代理(示例)
# http
? ? server {
? ? ? ? listen? ? ? ?80;
? ? ? ? listen? [::]:80;
? ? ? ? server_name? bitwarden.example.com;
? ? ? ?##防止搜索引擎收錄
? ? ? ?if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|^$") {??
? ? ? ? return 404;
? ? ? ? ? ? }
? ? ? ? location / { # 訪問(wèn)80端口后的所有路徑都轉(zhuǎn)發(fā)到 proxy_pass 配置的ip中
? ? ? ? ? ? root? ?/usr/share/nginx/html;
? ? ? ? ? ? index? index.html index.htm;
##如果使用cloudflare加速就換成302
? ? ? ? ?return 301 https://bitwarden.example.com;
? ? ? ? ? ??
? ? ? ? }
? ? }
# https
?server {
? ? ? ? listen? ? ? ?443 ssl http2;
? ? ? ? listen? [::]:443 ssl http2;
? ? ? ? server_name? bitwarden.example.com;
? ? ? ? ? ?if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|^$") {??
? ? ? ? return 404;
? ? ? ? }
? ? ? ? #啟用HSTS? ??
? ? ? ? add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;?
? ? ? ? ssl_certificate /path/to/ssl/cert;
? ? ? ? ssl_certificate_key /path/to/cert/key;
? ? ? ? keepalive_timeout? ?70;
? ? ? ? # OCSP stapling
? ? ? ? ssl_stapling? ? ? ? on;
? ? ? ? ssl_stapling_verify on;
##填入你機(jī)器的DNS
? ? ? ? resolver 8.8.8.8;
? ? ? ? ssl_protocols? TLSv1.1 TLSv1.2 TLSv1.3;
? ? ? ? ? ? ?location / {
? ? ? ? ? ? ?root? ?/usr/share/nginx/html;
#? ? ? ? ? ? index? index.html index.htm;
? ? ? ? ? ? ? ?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;
? ? ? ? ? ? ? ?proxy_set_header X-Forwarded-Port $server_port;
? ? ? ? ? ? ? ?proxy_pass http://localhost:xxxx;
? ? ? ? ? ? ??
? ? ? }
? }
備份
這里使用vaultwarden-backup項(xiàng)目
配置Rclone
docker run --rm -it \
? --mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
? ttionya/vaultwarden-backup:latest \
? rclone config
檢查Rclone配置
docker run --rm -it \
? --mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
? ttionya/vaultwarden-backup:latest \
? rclone config show
# Microsoft Onedrive Example
# [YouRemoteName]
# type = onedrive
# token = {"access_token":"access token","token_type":"token type","refresh_token":"refresh token","expiry":"expiry time"}
# drive_id = driveid
# drive_type = personal
配置自動(dòng)備份&&郵件發(fā)送
docker run -d \
? --restart=always \
? --name vaultwarden_backup \
? --volumes-from=vaultwarden \
? --mount type=volume,source=vaultwarden-rclone-data,target=/config/ \
? -e RCLONE_REMOTE_NAME="YouRemoteName" \
? -e DATA_DIR="/data" \
? -e ZIP_ENABLE="TRUE" \
? -e ZIP_PASSWORD="your-zip-password" \
? -e BACKUP_KEEP_DAYS="7" \
? -e CRON="*/60 * * * *" \
? -e TIMEZONE="Asia/Shanghai" \
? -e MAIL_SMTP_ENABLE="TRUE"\
? -e MAIL_SMTP_VARIABLES="
? -S smtp-use-starttls \
? -S smtp=smtp://smtp.office365.com:587 \
? -S smtp-auth=login \
? -S smtp-auth-user=your-email-address \
? -S smtp-auth-password=Your_app_Password \
? -S from=your-email-address(your-email-name)" \
? -e MAIL_TO="your-email-address" \
? ttionya/vaultwarden-backup:latest
此處的配置為完整的自動(dòng)備份docker run命令,其含義為時(shí)區(qū)為Asia/Shanghai,每小時(shí)壓縮備份一次,并且在備份完成后發(fā)送郵件到MAIL_TO地址。SMTP的示例為Outlook配置,請(qǐng)將your-email-address、your-email-name 、Your_app_Password自行替換為郵件地址、發(fā)件人名稱與應(yīng)用密碼!
更多的配置項(xiàng)請(qǐng)參考項(xiàng)目文檔
關(guān)于配置完成后,F(xiàn)IDO2認(rèn)證在Windows Desktop客戶端卡Loading的問(wèn)題修復(fù)
根據(jù)Windows 10 Desktop app FIDO2 Webauthn stuck on “Loading” · Discussion #2111 · dani-garcia/vaultwarden來(lái)看,這是一個(gè)已知的程序問(wèn)題,原因在于Vaultwarden處理FIDO2認(rèn)證標(biāo)頭時(shí)出現(xiàn)了錯(cuò)誤。但作者認(rèn)為此問(wèn)題很容易靠外部修復(fù)所以不在程序內(nèi)進(jìn)行修復(fù)。
解決辦法一:
反向代理增加兩個(gè)響應(yīng)標(biāo)頭
proxy_hide_header Content-Security-Policy;
proxy_hide_header X-Frame-Options;
解決辦法二:
在Admin-Setting-Advanced Settings-Allowed iframe ancestors增加內(nèi)容file://*
或者,在啟動(dòng)容器時(shí)增加下面的環(huán)境變量
ALLOWED_IFRAME_ANCESTORS="file://*"
參考資料
vaultwarden-backup/README_zh.md at master · ttionya/vaultwarden-backup (github.com)
Home · dani-garcia/vaultwarden Wiki (github.com)
Install and Deploy – Linux | Bitwarden Help & Support
[技術(shù)向] 用Docker自建 Vaultwarden (Bitwarden_rs) – 主機(jī)萌站 (idc.moe)
完整文章:https://blog.im.ci/study-notes/880/