让bitwarden在cloudfare上运行
准备工作
- 一个 Cloudflare 账户
- 一个 Github 账户
- 一个没有被阻断的域名
教程开始
第一步,设置 Github 项目
首先fork 项目仓库 到你的账户,进入Action页面,启用Action。
点击settings- Secrets and variables - Actions,准备添加 Repository secrets,接下来我们一共要添加三个secrets。
然后进入 Cloudflare 控制台,在浏览器地址栏中复制你的account id

回到github页面,点击New repository secret,名称写CLOUDFLARE_ACCOUNT_ID,值就写刚才复制的id。
接着访问 https://dash.cloudflare.com/profile/api-tokens
选择编辑Worker的模板,然后给它再添加编辑D1和编辑KV的权限,再创建api令牌,回到github页面添加为CLOUDFLARE_API_TOKEN。

最后去Cloudflare控制台的存储与数据库 - D1 sql 数据库,创建一个数据库,并复制它的id。

回到github,添加为D1_DATABASE_ID。
附件支持(可选)
本项目的附件功能依赖R2或KV,默认会自动创建用于存储附件的KV。
KV完全免费不绑卡,单个附件限25MB;
启用R2需要绑卡,本项目因为是用Worker转发,受请求体大小限制,单个附件限100MB。
虽然Cloudflare提供了慷慨的R2免费额度,但可能产生非预期的扣费,参考Cloudflare R2 pricing,因此该功能默认关闭。
如果你想启用R2支持,需要先去Cloudflare控制台创建一个R2储存桶,记下它的名称。
在github仓库中添加一个名为R2_NAME的secret,值就填刚才创建的桶名称。
如果你完全不需要附件支持,可以在wrangler.toml中删除KV和R2绑定,仍可以正常使用其他功能。
至此在github上的配置就完毕了,点击上方的Actions选项卡,选到Build工作流点运行即可。
第二步:建表
现在Github Actions会自动在数据库为空时建表,无需手动建表。
第三步:配置环境变量与自定义域名
当github的Action执行完毕后,你就能在CF的Workers中找到刚才创建的 warden-worker了,进入这个Worker的设置页面,在变量和机密栏添加以下三个密钥:
| 名称 | 说明 |
|---|---|
| ALLOWED_EMAILS | 允许注册的完整邮箱(支持通配符),用,分隔 |
| (例:your-name@example.com,*@xxx.com) | |
| JWT_SECRET | 随机长字符串(32字节以上) |
| JWT_REFRESH_SECRET | 随机长字符串(32字节以上) |
可选环境变量
IMPORT_BATCH_SIZE:用于控制导入密码库时,每次批操作的数据条数,默认为30,设为0代表一次批操作导入所有数据(不推荐);如果你需要导入的库特别大,可以适当调大这个值。PASSWORD_ITERATIONS: 服务端PBKDF2迭代次数,默认600000,最小600000.TRASH_AUTO_DELETE_DAYS: 配置回收站中的项目多少天后会被清理,默认为30,设为0代表永不清理。DISABLE_USER_REGISTRATION: 用于控制是否表明服务器不支持注册,默认为true,设为false可以让客户端显示注册按钮;该选项不影响实际注册功能。AUTHENTICATOR_DISABLE_TIME_DRIFT: 控制是否允许TOTP的时间±1偏移,默认为true。ATTACHMENT_MAX_BYTES: 单个附件的大小限制,单位字节,默认不限制,填104857600则代表100MB。ATTACHMENT_TOTAL_LIMIT_KB: 单个用户的总附件大小限制,单位KB,默认不限制,填1048576代表1GB。ATTACHMENT_TTL_SECS: 附件的上传下载链接的有效时间,默认五分钟。
然后在域和路由中添加一个路由,区域选择你的域名,路由写你分给这个Worker的子域名 + /*(如bitwarden.example.com/*)。
最后别忘记去给这个子域名添加一条dns记录。
如果你想优选IP,那就不开小黄云,把它CNAME到一个优选过的域名。
要是不想优选,那就打开小黄云,目标随便填。
建议去域名配置页的 安全性 - 安全规则 里给 /identity/* 和 /api/accounts/* 添加速率限制规则。
第四步,创建账户并导入数据
这步其实没啥好说的了,如果已有bitwarden库,在电脑上把它导出为JSON即可。
前端默认隐藏了注册按钮,可以参考上一步的环境变量开启然后清空缓存,或者直接访问https:// 你的域名 /#/register即可注册。
注意: 创建账户时用的密码必须记住,没有任何方式能找回。
(可选)第五步,配置数据库自动备份(S3/Webdav)
官方文档:https://github.com/qaz741wsd856/warden-worker/blob/main/docs/db-backup-recovery.md
将以下密钥添加到你的 GitHub 仓库 (Settings > Secrets and variables > Actions):
S3兼容存储 (可选)
| 密钥 | 必需 | 描述 |
|---|---|---|
S3_ACCESS_KEY_ID |
yes (for S3) | 您的 S3 访问密钥 ID |
S3_SECRET_ACCESS_KEY |
yes (for S3) | 您的 S3 密钥访问密钥 |
S3_BUCKET |
yes (for S3) | 用于存储备份的 S3 存储桶名称 |
S3_REGION |
yes (for S3) | S3 区域(例如,us-east-1)。不确定时,使用 auto |
S3_ENDPOINT |
no | 自定义 S3 端点 URL。未设置时默认为 AWS S3。适用于 S3 兼容服务(MinIO、Cloudflare R2、Backblaze B2 等) |
WebDAV (可选)
| 密钥 | 必须 | 描述 |
|---|---|---|
WEBDAV_URL |
yes (for WebDAV) | webdav对应的url,一般是https://domain.xxx/dav |
WEBDAV_USER |
yes (for WebDAV) | 用户名 |
WEBDAV_PASSWORD |
yes (for WebDAV) | WebDAV 密码 |
WEBDAV_VENDOR |
no | rclone 的 WebDAV 供应商(nextcloud、owncloud 或其他 )。默认为其他 |
WEBDAV_BASE_PATH |
no | 远程备份的基本路径。默认为 warden-worker |
通用配置 (可选)
| 密钥 | 必须 | 描述 |
|---|---|---|
BACKUP_ENCRYPTION_KEY |
no | 备份的加密密钥,不填就不加密,填了要记住 |
BACKUP_RETENTION_DAYS |
no | 保留备份的天数。默认为30天 |
Action会分别检查这两种备份的凭据配置情况,如果只需要一种备份方式,可以只填对应的凭据,没填的会自动跳过。
然后在Action页面中选到Backup D1 Database to S3,手动触发一次,等待它运行完成,然后检查你的S3中是否有备份文件。成功后,每天都会自动备份一次,每个备份默认保存30天。
额外说明
其实 Cloudflare D1 提供了回滚到30天内的任意时刻的功能:Cloudflare D1 Time Travel documentation
查看当前bookmark
DATABASE_NAME换成你在Cloudflare控制台里设置的D1名称
wrangler d1 time-travel info DATABASE_NAME回退到指定时间 (ISO 8601)
wrangler d1 time-travel restore DATABASE_NAME –timestamp=2024-01-15T12:00:00Z回退到指定bookmark
wrangler d1 time-travel restore DATABASE_NAME –bookmark=
通过这个操作,就算库出了问题也能快速回滚,再配上S3备份,是不是感觉这一通操作不那么灵车了?
其他说明
本项目不是Vaultwarden的兼容层,不保证安全性跟Vaultwarden持平,如果你对安全性有疑虑,请使用其他更热门、经过验证的Bitwarden服务端;如果你发现本项目存在安全性问题,请在github中提交(github仓库中的security - Report a vulnerability)




