树洞剪藏#剪藏#树洞剪藏

自建vaultwarden,实现自动同步与镜像更新 - 文档共建 - LINUX DO

2024 年 11 月 15 日1 分钟
分享Twitter / XTelegram微博
自建vaultwarden,实现自动同步与镜像更新 - 文档共建 - LINUX DO 封面

同步来源:树洞剪藏 源站剪藏 ID:84 原文地址:https://linux.do/t/topic/241010

打开原文 · 打开源站剪藏快照


自建vaultwarden,实现自动同步与镜像更新 - 文档共建 - LINUX DO

跳到主要内容

话题

我的帖子

关于

友链

文档

更多

外部链接

Status

Connect

Channel

Telegram

Shared Chat

类别

开发调优

资源荟萃

文档共建

跳蚤市场

前沿快讯

福利羊毛

搞七捻三

运营反馈

深海幽域

所有类别

标签

抽奖

公告

精华神帖

快问快答

人工智能

所有标签

消息

收件箱

频道

常规频道

直接消息

聊天

真诚 、 友善 、 团结 、 专业 ,共建你我引以为荣之社区。 《常见问题解答》

自建 vaultwarden, 实现自动同步与镜像更新

文档共建

bitwarden

10月 24 日

1 / 70

10月 24 日

返回

4 天

热门回复

前排围观支持一下 感谢分享大佬厉害啊 有点厉害支持~~

XYZ yonse 大预言家

6 22 天 #1

在 ChatGPT 的辅助下完成了自建 vaultwarden, 多次修改后终于有个能用的了,具体操作有:

容器采用目录挂载方式启动,这样方便备份和更新

保留 90 天备份,将整个挂载目录压缩加密备份,每天 5 点自动备份到 onedrive

备份使用 GPG 加密存储

其实本地密码文件本身是加密存储的,但是配置文件会泄露一点信息,故我再次加密

每天自动检测 vaultwarden 镜像是否有更新,有的话自动更新并启动 (有佬推荐使用watchower自动更新镜像)

实现这些需要的:

一台 vps

一个域名,这个域名解析到你的 vps 上,本文假设域名为 my.com

服务器或 VPS 挂了怎么办:

vaultwarden 支持离线使用,密码在本地会存一份,即使 bitwarden 插件现在连不上 VPS 也可以继续使用密码

本地存的那份密码可以导出

bitwarden 官方不是有自己的镜像吗?为什么要使用 vaultwarden?

bitwarden 官方占用比 vaultwarden 大,如果你的 VPS 空间紧张,那 vaultwarden 很适合你

目录结构

为组织脚本和相关文件,建议使用以下目录结构:

/vaultwarden_backup/

├── admin_token_hash ├── backup │ ├── backup_2024-10-19.tar.gz.gpg │ ├── backup_2024-10-20.tar.gz.gpg │ ├── backup_2024-10-21.tar.gz.gpg │ ├── backup_2024-10-22.tar.gz.gpg │ └── backup_2024-10-24.tar.gz.gpg ├── backup.log ├── backup_update_script.sh └── gpg_passphrase_file

文件名 描述

admin_token_hash 保存 Vaultwarden 后台密码 Hash

backup 存放每天自动备份文件

backup.log 存放脚本 backup_update_script.sh 执行时输出的日志

backup_update_script.sh 自动备份和镜像更新脚本

gpg_passphrase_file GPG 加密文件

环境准备

  1. 必要工具

确保您的系统已经安装以下工具:

Docker :用于运行 Vaultwarden。

Rclone :用于将备份文件上传到 OneDrive。

GPG :用于加密备份文件。

Argon2 :用于生成 ADMIN_TOKEN 的哈希值。

Cron :用于定时执行备份和更新脚本。

sudo apt update sudo apt install docker.io rclone gpg argon2 sudo systemctl start docker sudo systemctl enable docker

在远程 Linux 服务器上安装并配置 rclone (配置rclone流程我记不清了,这个是我找的)

1 安装 rclone

如果你的 Linux 服务器还没有安装 rclone ,可以按照以下步骤安装:

通过 SSH 连接到你的远程 Linux 服务器。

运行以下命令来下载并安装 rclone :

curl https://rclone.org/install.sh | sudo bash

安装完成后,可以通过以下命令确认安装是否成功:

rclone version

2 初始化 rclone 配置

运行 rclone config 命令启动配置过程:

rclone config

输入 n 来创建一个新的 remote。

输入 remote 的名称(例如 onedrive )

继续按提示操作,直到要求进行 OAuth 认证的步骤。

在这一步,通常 rclone 会自动打开浏览器来完成 OAuth 认证,但由于我们是在远程服务器上,这就需要在本地的 Windows 机器上进行认证。

在本地 Windows 机器上完成 OAuth 认证

1 获取认证 URL

当 rclone 提示你需要在浏览器中打开一个 URL 来完成认证时,它会输出一个类似于下面的链接:

https://accounts.google.com/o/oauth2/auth?client_id=XXXXXXX&response_type=code&scope=XXXXX

复制这个链接 ,你需要将它复制到本地的机器。

2 在 Windows 机器上打开浏览器并完成认证

在本地 Windows 电脑上,打开浏览器,并粘贴刚才从远程服务器上复制的 OAuth 认证 URL。

按照浏览器中的指示进行登录,并授权 rclone 访问你的云存储账户。

完成认证后,浏览器将返回一个包含认证代码的页面。这时候会显示一段长的代码。

3 将认证代码粘贴回远程 Linux 服务器

复制 认证完成后页面中显示的授权代码。

回到你连接远程 Linux 服务器的终端,在 rclone 提示你输入认证代码的地方, 粘贴该代码 并按回车。

完成 rclone 配置

继续完成后续的配置。通常是选择默认值(除非你有其他自定义需求),然后保存并退出。

你可以通过以下命令测试配置是否成功(以 Google Drive 为例):

rclone lsd onedrive:vaultwarden_backup

如果能够列出你的云存储目录结构,说明配置成功。

如果目录不存在,可以手动创建:

rclone mkdir onedrive:vaultwarden_backup

配置 GPG

1:生成一个随机密码

我们可以使用 openssl 或 pwgen 生成一个强密码:

使用 openssl 生成随机密码

openssl rand - base64 32 > /vaultwarden_backup/gpg_passphrase_file

确保文件权限是 600

chmod 600 /vaultwarden_backup/gpg_passphrase_file

这样会在 /vaultwarden_backup/gpg_passphrase_file 中生成一个 32 字节的随机密码,并设置为仅当前用户可读。

2:安装 GPG

如果你的系统上还没有 GPG,请进行安装:

sudo apt update sudo apt install gnupg -y

3:使用 GPG 创建加密测试文件

你可以测试一下这个 GPG 密码文件是否正常工作:

读取生成的密码到变量

GPG_PASSPHRASE=$(< /vaultwarden_backup/gpg_passphrase_file)

创建一个测试文件

echo "This is a test backup file." > test_file.txt

使用 GPG 加密测试文件

gpg --batch -- yes --symmetric --cipher-algo AES256 --passphrase " $GPG_PASSPHRASE " -o test_file.txt.gpg test_file.txt

检查是否生成了加密文件

ls test_file.txt.gpg

4:解密文件测试

确保可以使用相同的密码文件解密:

解密文件

gpg --batch -- yes --passphrase " $GPG_PASSPHRASE " -o decrypted_test_file.txt -d test_file.txt.gpg

检查解密结果

cat decrypted_test_file.txt

5:清理测试文件

如果一切正常,可以删除测试文件:

rm test_file.txt test_file.txt.gpg decrypted_test_file.txt

注意事项

文件权限 :确保 /vaultwarden_backup/gpg_passphrase_file 的权限是 600 ,以保证安全:

chmod 600 /vaultwarden_backup/gpg_passphrase_file

备份密码文件 :将该密码文件妥善保存(例如在安全的地方备份),因为如果丢失,将无法解密备份文件。可以存到 onedrive 的保险库中.

生成 ADMIN_TOKEN 的哈希值

Vaultwarden 官方推荐使用 argon2 生成 ADMIN_TOKEN 的哈希值。请按照以下步骤操作:

生成哈希值并保存 :

使用以下命令生成 ADMIN_TOKEN 的哈希值,并将其保存到 /vaultwarden_backup/admin_token_hash 文件中:

替换 "123456789" 为您实际的管理员密码

echo -n "123456789" | argon2 " $(openssl rand -base64 32) " -e - id -k 65540 -t 3 -p 4 > /vaultwarden_backup/admin_token_hash

设置文件权限,确保只有授权用户可以读取

sudo chmod 600 /vaultwarden_backup/admin_token_hash

示例输出 (保存在 /vaultwarden_backup/admin_token_hash 文件中):

$argon 2id $v = 19 $m = 65540 ,t= 3 ,p= 4 $bXBGMENBZUVzT3VUSFErTzQzK25Jck1BN2Z0amFuWjdSdVlIQVZqYzAzYz 0 $T9m73OdD2mz9 +aJKLuOAdbvoARdaKxtOZ+jZcSL9/N0

注意 :将 "123456789" 替换为您的实际管理员密码,确保密码足够强壮。

备份和镜像更新脚本

  1. 设置备份目录和权限

确保备份目录存在,并设置正确的权限:

sudo mkdir -p /vaultwarden_backup sudo chmod -R 700 /vaultwarden_backup

  1. 完整备份与更新脚本

将以下脚本保存为 /vaultwarden_backup/backup_update_script.sh ,并赋予可执行权限。

#!/bin/bash

================== 配置部分 ==================

BACKUP_DIR= "/vaultwarden_backup/backup" # 本地备份存储路径 SOURCE_DIR= "/VM_data" # 需要备份的源目录 REMOTE= "onedrive:vaultwarden_backup" # rclone 远程 OneDrive 目录 DATE=$( date + "%Y-%m-%d" ) # 当前日期 BACKUP_FILE= "backup_ $DATE .tar.gz" # 备份文件名 GPG_FILE= " $BACKUP_FILE .gpg" # 加密后的备份文件名 GPG_PASSPHRASE_FILE= "/vaultwarden_backup/gpg_passphrase_file" # GPG 加密密码文件 RETENTION_DAYS=90 # 保留的天数 LOG_FILE= "/vaultwarden_backup/backup_update_script.log" # 日志文件

Docker 配置

IMAGE_NAME= "vaultwarden/server:latest" # 镜像名称 CONTAINER_NAME= "vaultwarden" # 容器名称

日志函数

log () { echo " $(date + "%Y-%m-%d %H:%M:%S" ) - $1 " | tee -a $LOG_FILE }

检查 GPG 密码文件是否存在

if [ ! -f " $GPG_PASSPHRASE_FILE " ]; then log "GPG 密码文件不存在,备份终止" exit 1 fi

读取 GPG 密码

GPG_PASSPHRASE=$(< " $GPG_PASSPHRASE_FILE " )

创建备份

log "开始备份" if tar -czf " $BACKUP_DIR / $BACKUP_FILE " -C " $SOURCE_DIR " .; then log "备份文件已创建: $BACKUP_FILE " else log "备份失败" exit 1 fi

GPG 加密

if gpg --batch -- yes --passphrase " $GPG_PASSPHRASE " -c " $BACKUP_DIR / $BACKUP_FILE " ; then log "备份文件已加密: $GPG_FILE " else log "加密失败,备份终止" exit 1 fi

删除未加密的文件

rm " $BACKUP_DIR / $BACKUP_FILE " log "未加密的备份文件已删除"

同步到 OneDrive

if rclone copy " $BACKUP_DIR / $GPG_FILE " " $REMOTE " ; then log "已同步到 OneDrive: $GPG_FILE " else log "同步到 OneDrive 失败" exit 1 fi

清理本地和远程超过保留期的备份

find " $BACKUP_DIR " -name "backup_*.tar.gz.gpg" - type f -mtime + $RETENTION_DAYS -delete rclone delete --min-age ${RETENTION_DAYS} d " $REMOTE " log "超过 $RETENTION_DAYS 天的旧备份已删除"

log "备份完成"

================== Docker 镜像更新 ==================

log "开始检查 Docker 镜像更新"

拉取最新镜像

if docker pull $IMAGE_NAME ; then log "拉取最新镜像成功: $IMAGE_NAME " else log "拉取镜像失败" exit 1 fi

获取最新镜像的 ID

LATEST_IMAGE_ID=$(docker inspect --format= '{{.Id}}' $IMAGE_NAME )

获取当前运行容器的镜像 ID

CURRENT_IMAGE_ID=$(docker inspect --format= '{{.Image}}' $CONTAINER_NAME )

检查是否有更新

if [ " $LATEST_IMAGE_ID " != " $CURRENT_IMAGE_ID " ]; then log "有新镜像,更新容器..."

停止并移除旧容器

if docker stop $CONTAINER_NAME && docker rm $CONTAINER_NAME ; then log "旧容器已停止并移除" else log "停止或移除旧容器失败" exit 1 fi

重新启动容器

if docker run -d --name $CONTAINER_NAME
-v /VM_data:/data
-e ADMIN_TOKEN= " $(cat /vaultwarden_backup/admin_token_hash) "
-e INVITATIONS_ALLOWED= false
-p 80:80
--restart unless-stopped
$IMAGE_NAME ; then log "容器已更新并重新启动" else log "容器启动失败" exit 1 fi else log "镜像没有更新,不执行操作" fi

log "Docker 镜像检查完成"

  1. 设置脚本执行权限

确保脚本具有可执行权限,并设置正确的所有者和权限:

sudo chmod +x /vaultwarden_backup/backup_update_script.sh sudo chown your_backup_user:your_backup_group /vaultwarden_backup/backup_update_script.sh

注意 :将 your_backup_user 和 your_backup_group 替换为实际的用户和组,确保只有授权用户可以执行和修改脚本。我使用的是 chown vaultwarden:vaultwarden /vaultwarden_backup/backup_update_script.sh

  1. 配置定时任务(Cron)

使用 cron 定期执行备份和更新脚本。以下示例将脚本设置为每天凌晨 2 点执行。

编辑 Crontab :

sudo crontab -e

添加以下行 :

每天凌晨5点执行备份与更新脚本

0 5 * * * /vaultwarden_backup/backup_update_script.sh >> /vaultwarden_backup/backup.log 2>&1

保存并退出 。

  1. 验证脚本

在首次运行脚本之前,建议手动执行一次以确保一切正常:

sudo /vaultwarden_backup/backup_update_script.sh

检查日志文件 /vaultwarden_backup/backup.log 以确保所有步骤顺利完成。

bitwarden 配置

  1. 选自托管

image 582×921 47.7 KB

  1. 填解析到这个 vps 的域名

image 582×921 43.5 KB

  1. 注册第一个用户,第一个注册用户就是管理员

image 562×901 31.5 KB

  1. 进入后台管理,关闭新用户注册,因为这只是我们自己用

后台网址为 https://域名/admin , 这里密码填上面使用 argon2 中的密码 (例子中为123456789)

image 1400×497 22 KB

image 1012×971 58.3 KB

安全提示

密码安全 :确保 /vaultwarden_backup/gpg_passphrase_file 和 /vaultwarden_backup/admin_token_hash 文件的权限为 600 ,且仅限授权用户访问。

脚本权限 :确保脚本拥有适当的执行权限,并且只有授权用户可以修改。

定期检查 :定期检查备份日志,确保备份和更新过程正常运行。

套 CDN : 给解析到 VPS 的域名套上 CDN, 防止泄露 VPSIP, 这个可以在 Cloudcone 中打开

开防火墙 : 注意放行 443 和 80 端口

至此,已经结束,下面都是一些佬推荐的,不属于上面教程的一部分,感兴趣的可以看看

其他佬倾情推荐

docker compose 一把梭,注意他使用的是 alpine 系统镜像

小手冰凉:

分享一个我的 docker-compose.yml

容器部署的时候,先开注册,等自己账户注册完毕之后再加上环境变量关闭注册,而且有了 docker compose 之后很方便的

services:

vault: image: vaultwarden/server:alpine container_name: vault network_mode: host restart: always volumes: [ "./data/:/data" ] environment:

Vault

Rocket

  • ROCKET_ADDRESS=127.0.0.1
  • ROCKET_PORT=3018

Websocket

  • WEBSOCKET_ENABLED=true
  • WEBSOCKET_ADDRESS=127.0.0.1
  • WEBSOCKET_PORT=3019

SMTP

  • SMTP_HOST=smtp.gmail.com
  • SMTP_PORT=587
  • SMTP_SECURITY=starttls
  • [email protected]
  • [email protected]
  • SMTP_PASSWORD=xxx

heart

+1

148

回复

1.6k

浏览量

256

28

用户

25

7

5

3

2

阅读时间

5 分钟

热门回复

bbb 无所不知

22 天 #2

大佬厉害 1 个回复

4 回复

XYZ yonse 大预言家

bbb 22 天 #3

你特么绝对是脚本,住在这了是吧 1 个回复

heart

tieba_087

2

回复

bbb 无所不知 XYZ 22 天 #4

论坛买房了 1 个回复

2 回复

诗桃🍑 BabyPeach

22 天 #5

辛苦了,看完之后还是先用着官方的吧

heart

tieba_087

3

回复

上次访问

pyquery

22 天 #6

之前弄了个,现在用着官方服务,和 2fa 分开了

2 回复

糖醋小里脊 peaceokzun 大预言家 bbb 22 天 #7

逆天住户 太强了

heart

tieba_087

3

回复

类别 10月 24 日 更新

从 资源荟萃 到 文档共建

Miku loser

22 天 #9

fufu 好厉害哟

你是做个人密码管理器用的吗?感觉有点重 2 个回复

3 回复

XYZ yonse 大预言家

Miku 22 天 #10

对的,做个人密码管理器,通用性号,不需要来回导入导出密码.

另外,还用这个 VPS 科学上网,一机两用,省钱王

clap

1

回复

Winn 龙行龘龘

22 天 #11

算了,还是继续 10u 一年吧

heart

tieba_087

2

回复

斓曦未央丶 WyInnovate 活跃用户

22 天 #12

可以的佬!!!

我挂了个 SD 卡,每隔几天自动打包备份到卡上

有空了手动再备份一下到移动硬盘 1 个回复

2 回复

TerryFlatley

22 天 #13

插个眼,后面有时间搞一下做个自动备份

我现在就是单纯在用 vaultwarden 做密码记录,其他的啥也没搞,就是怕服务器出问题了,密码没了就完蛋. 1 个回复

clap

heart

2

回复

XYZ yonse 大预言家

TerryFlatley 22 天 #14

不用担心,他这个密码在本地浏览器中还有一份,即使你 VPS 挂了,还可以把浏览器中密码导入

heart

clap

3

回复

XYZ yonse 大预言家

斓曦未央丶 22 天 #15

最好每天保存吧,这个文件小得很,不过我还是建议云端备份一个 1 个回复

clap

1

回复

斓曦未央丶 WyInnovate 活跃用户 XYZ 22 天 #16

嗯,我是整个 docker 文件夹备份了

晚点加个单独的备份 1 个回复

4 回复

XYZ yonse 大预言家

斓曦未央丶 22 天 #17

最好弄个挂载目录,把重要目录映射出来,这样好备份,出了问题好恢复 2 个回复

clap

1

回复

斓曦未央丶 WyInnovate 活跃用户 XYZ 22 天 #18

嗯嗯,懂!感谢大佬

clap

heart

2

回复

Sediment6547

22 天 #19

直接基于官方的 docker 镜像构建一个内置 rclone 和备份计划任务的镜像,使用不同的参数启动就行了 1 个回复

clap

1

回复

XYZ yonse 大预言家

Sediment6547 22 天 #20

官方那个占用有点高,我的垃圾 VPS 跑不动 1 个回复

回复

开始阅读 启用自动点赞

楼主

等级

相关文章