引言
随着通行密钥的兴起以及越来越多的软件开始引入 2FA 安全机制,我开始使用密码管理工具。
原本使用的是 Microsoft Edge 加 Microsoft Authenticator 的组合,但微软砍刀部发力,Authenticator 的自动填充功能被删除了,Edge 也天天出问题,我没法登录账号,所以换密码管理器已经是板上钉钉的事了。 一开始看了好多个密码管理器,感觉订阅费都挺贵。虽然 Bitwarden 可以免费使用,但 2FA 相关功能需要付费,所以也很犹豫。不过在网上看到 Bitwarden 能自建,而且有一个轻量化的自建客户端叫 Vaultwarden,配置很低也可以搭建,还可以解锁很多付费功能。
NOTE如果不想折腾自建可以参考 二叉树树的文章修改 Bitwarden 或者参考 密码管理器折腾记
挑选厨具
原本打算在家里云里面搭建这个,但全天候开着 VPN 耗电是个问题,而且移动大内网很难拿到公网 IP,内网穿透又不稳定,最后兜兜转转还是选择了免费的容器平台。

NOTE免费的 serverless 平台可以参考 二叉树树的盘点 ,free-backend-hosting.md 免费的容器可以参考 free-database-hosting.md
本次搭建使用的是 ClawCloud 新加坡区 和 Supabase 新加坡区,没有使用 App Store 自带的镜像文件搭建,这样备份更方便。
注册 ClawCloud Run 账号需要使用超过 180 天的 GitHub 账号以获取每月 $5 的赠送余额。注册 Supabase 则没有要求,用自建邮箱也可以过,我使用的是 .fun 结尾的邮箱。
前置工作
首先进入 Supabase,建立数据库。Organization Name 随便填写,英文即可。在新建 project 时根据实际联通情况选择,我选择的是新加坡区。

NOTE记得勾上 Auto RLS,避免访问受限出现问题。
新建数据库时选择免费机,硬盘 1G。数据库密码可以设置,也可以生成;如果忘记保存密码,可以在 project 下选择 database/settings,并点击 Reset Database Password。
创建好以后,进入 project,选择上方的 connect,修改连接方式为 Session pooler。会得到一个链接,格式如下,将密码替换进 [YOUR-PASSWORD] 后复制备用。
postgresql://postgres.(project name):[YOUR-PASSWORD]@aws-1-ap-northeast-1.pooler.supabase.com:5432/postgres
如果使用 Koyeb 这种支持 IPv6 双栈的平台,可以使用 Direct Connection,否则建议 Session pooler。
然后就是去 Bitwarden 官网申请一个推送 ID 和推送 KEY,保存下来备用,具体可以参考 Vaultwarden Wiki 中文版
NOTE不用推送 key 和 id 也可以使用,但是会影响自动同步,具体参考 Wiki 说明。
正式搭建
之后我们进入 ClawCloud Run,点击 App Launchpad,然后点击 Create App。
镜像名字写 vaultwarden/server
TIP可以使用自定义域名来访问这个 Vaultwarden 实例,参考 ClawCloud 的文档以获取更多信息。
之后就是重头戏,环境变量的设置。在 Environment Variables 旁边点击 Add,之后按照以下格式输入。
DATABASE_URL=postgresql://postgres.(projectname):(password)@(database address):(prot)/(location)LOG_LEVEL=errorPUSH_ENABLED=truePUSH_INSTALLATION_ID=(填入官网获取的 id)PUSH_INSTALLATION_KEY=(填入官网获取的 key)之后点击保存,应该会出现如下图的界面。
点击最上方的 Deploy Application 之后,你的 Vaultwarden 实例就要上线了。
之后就可以根据个人喜好配置 Vaultwarden 了。

CAUTION由于前面的教程没有配置 SMTP 发件服务器,所以没办法使用忘记密码,请务必记得你的主账号的密码,或者使用其他的密码管理器单独记录 Vaultwarden 的主账号密码。
自动备份数据库
在 NAS 或者其他设备上要先安装好 postgresql-client,我们需要使用里面的 pg_dump 工具。 以下是可以参考使用的自动备份脚本:
#!/bin/bash
# 配置区域# 根据你的网络连通性,选择 Direct Connection 或 Session Pooler 的 URIDB_URI="postgresql://postgres.[project-name]:[YOUR-PASSWORD]@[pool-address]:[port]/[location]"BACKUP_DIR="/path/to/backups/vaultwarden"DATE=$(date +"%Y%m%d_%H%M%S")BACKUP_FILE="$BACKUP_DIR/vaultwarden_$DATE.dump"
# 保留最近 7 天的备份DAYS_TO_KEEP=7
echo "开始备份 Supabase 数据库..."
# 运行 pg_dumppg_dump "$DB_URI" -Fc -f "$BACKUP_FILE"
if [ $? -eq 0 ]; then echo "备份成功: $BACKUP_FILE" # 删除旧备份 find "$BACKUP_DIR" -name "vaultwarden_*.dump" -type f -mtime +$DAYS_TO_KEEP -exec rm {} \; echo "旧备份清理完毕。"else echo "备份失败!" exit 1fi之后只需要设置好 crontab 定时任务即可备份到指定的路径了,参考 cron 语句如下:
0 6 * * * /home/timmy/scripts/backup_db.sh >> /home/timmy/backups/vaultwarden/backup.log 2>&1#每天早上6点备份可以查看 /home/timmy/backups/vaultwarden/backup.log 文件以获取备份状态。
结语
本文就此结束,享受你的密码管理工具吧~
至于如何使用Vaultwarden和恢复备份,本文不再过多赘述。