Skip to content

支持基于 SQLite 和本地文件系统的 Docker 私有化部署#101

Open
tan9710630 wants to merge 15 commits intoshuaiplus:mainfrom
tan9710630:self_host
Open

支持基于 SQLite 和本地文件系统的 Docker 私有化部署#101
tan9710630 wants to merge 15 commits intoshuaiplus:mainfrom
tan9710630:self_host

Conversation

@tan9710630
Copy link
Copy Markdown

  • 实现封装 better-sqlite3SqliteDatabase 适配器,兼容并模拟 Cloudflare D1Database 接口。
  • 扩展 blob-store.ts 以支持本地文件系统级别的附件及 Send 文件读写。
  • 新增 server.ts 作为 Node.js HTTP 服务入口(基于 Express),无缝对接原有的 Worker 路由处理逻辑。
  • 增加 Dockerfile、docker-compose.yml 和 .env.example 文件,支持一键容器化部署。
  • 新增 Cloudflare Cache API (caches) 的内存级 Polyfill,解决原生 Node 运行环境中的限流器报错。
  • 修改 package.json,补充后端运行依赖并新增相关的本地开发/构建脚本。
  • 在中英文 README 中补充详细的 Docker 本地部署文档。

- 实现封装 `better-sqlite3` 的 `SqliteDatabase` 适配器,兼容并模拟 Cloudflare `D1Database` 接口。
- 扩展 `blob-store.ts` 以支持本地文件系统级别的附件及 Send 文件读写。
- 新增 [server.ts](cci:7://file:///root/VsCodeProject/nodewarden/src/server.ts:0:0-0:0) 作为 Node.js HTTP 服务入口(基于 Express),无缝对接原有的 Worker 路由处理逻辑。
- 增加 [Dockerfile](cci:7://file:///root/VsCodeProject/nodewarden/Dockerfile:0:0-0:0)、[docker-compose.yml](cci:7://file:///root/VsCodeProject/nodewarden/docker-compose.yml:0:0-0:0) 和 `.env.example` 文件,支持一键容器化部署。
- 新增 Cloudflare Cache API (`caches`) 的内存级 Polyfill,解决原生 Node 运行环境中的限流器报错。
- 修改 [package.json](cci:7://file:///root/VsCodeProject/nodewarden/package.json:0:0-0:0),补充后端运行依赖并新增相关的本地开发/构建脚本。
- 在中英文 README 中补充详细的 Docker 本地部署文档。
@tan9710630
Copy link
Copy Markdown
Author

为了方便在非 Cloudflare 环境(私有化/本地)部署,本 PR 引入了 Node.js 兼容层:

  1. 核心逻辑:新增 server.ts (Express) 桥接原 Worker 路由。
  2. 数据库:封装 better-sqlite3 模拟 D1 Database 接口。
  3. 存储:支持本地文件系统读写附件(原 blob-store.ts 扩展)。
  4. 补丁:增加内存级 Cache API Polyfill,解决 Node 环境报错。
  5. 部署:提供 Dockerfile & docker-compose 支持一键容器化。

注:由于本地测试时间有限,目前已在基础流程上跑通,请作者重点关注 D1 模拟层 与 Worker 路由对接 的稳定性,感谢!

@tan9710630
Copy link
Copy Markdown
Author

最后补充说明一下我为什么想要这个功能:

容灾与云同步协同:

由于 nodewarden 已支持云端备份/还原,若多个实例(CF Worker + 本地 Node 节点)挂载同一云端存储,则天然形成了一套多活容灾与自动同步方案。本地化部署让这一特性的应用场景从单一云端拓宽到了“云+端”的混合架构。

“逃生舱”方案(Vendor Lock-in Mitigation):

尽管 Cloudflare 极具公信力,但作为生产力工具,我们需要具备脱离单一平台依赖的能力。万一 CF 服务异常或定价策略调整,这套适配层能确保用户无缝切换至私有节点,保障业务连续性。

内网环境下的一致性体验:

在纯内网或私有云场景下,虽然有 Vaultwarden 等选择,但对于习惯了 nodewarden 交互逻辑和特性的用户来说,这套 PR 提供了低迁移成本的内网私有化方案。

tan9710630 and others added 4 commits March 18, 2026 00:57
将 fs 和 path 修改为动态导入,确保代码在 Cloudflare Workers 环境下可以正常编译,仅在 LOCAL_ATTACHMENTS_DIR 存在时加载。
- 将 `fs/promises` 和 `path` 的静态导入改为动态导入
- 仅在启用本地存储模式时加载 Node.js 相关模块
- 需在 wrangler.toml 中开启 `nodejs_compat` 标志以支持构建
@tan9710630 tan9710630 changed the title feat: 支持基于 SQLite 和本地文件系统的 Docker 私有化部署 支持基于 SQLite 和本地文件系统的 Docker 私有化部署 Mar 18, 2026
@tan9710630
Copy link
Copy Markdown
Author

@shuaiplus 大佬啥时候能reviews一下呀,这个feature有机会合并吗?🥺🥺🥺

@shuaiplus
Copy link
Copy Markdown
Owner

shuaiplus commented Mar 19, 2026

以前写nodecrypt的时候,总有人想要docker版本,我折腾了好几天,最终还是弄出来了个勉强能用的,结果过几天又不能用了,于是把docker都删掉了。

再等一下几天,我有大把时间的时候好好测试一下。

但是我还是有疑问,既然cf崩了,cf跑路了,cf不让免费用了,用户为什么还要用nodewarden,直接用成熟的vaultwarden不好吗,咱是不是应该把中心放在如何导出跟vaultwarden目录一样的data文件,到时候直接拿这个文件创建vaultwarden就可以直接用?

@tan9710630
Copy link
Copy Markdown
Author

tan9710630 commented Mar 19, 2026

但是我还是有疑问,既然cf崩了,cf跑路了,cf不让免费用了,用户为什么还要用nodewarden,直接用成熟的vaultwarden不好吗,咱是不是应该把中心放在如何导出跟vaultwarden目录一样的data文件,到时候直接拿这个文件创建vaultwarden就可以直接用?

NodeWarden:从“数据备份”向“实例级容灾”的演进

目前 Vaultwarden 在应对多实例同步和极端场景下的灾备时,依然存在明显的短板。NodeWarden 的核心价值,在于通过原生镜像同步彻底解决这些底层的工程挑战。

1. 全量“镜像级”同步:实现真正的状态对等

传统的 JSON 导出仅是静态的数据镜像,而 NodeWarden 追求的是全实例状态的实时对等

  • 无缝同步:不再局限于单一条目的导出与导入。NodeWarden 能够同步包括数据、系统配置、甚至个性化状态在内的完整环境,确保多个实例间互为热备。
  • 高可用(HA)架构:对于开发者而言,可以将 Cloudflare 版本设为主实例,自建环境作为从实例。一旦主节点不可用,从节点可以无缝接管业务,数据流转完全透明,极大地降低了运维的心智负担。如果我有内网环境需要使用密码记录,有了本地化能力之后,我也可以将这个备份文件放到内网的S3/WebDAV进行同步,体验完全一致

2. 对现有方案痛点的深度思考

Vaultwarden 虽然生态成熟,但在某些产品逻辑上确实给深度用户带来了不便,这也正是 NodeWarden 的差异化机会:

  • 原生云备份缺失:目前 Vaultwarden 极其依赖第三方脚本或插件来实现云端持久化,这增加了系统的复杂度和不稳定性。NodeWarden 将云备份作为原生能力,开箱即用。
  • 同步逻辑冗余:这是最直观的体验痛点。现有的导入逻辑缺乏有效的去重校验,导致重复数据堆积,不仅污染数据库,也增加了后期维护成本。NodeWarden 的设计初衷是在还原实例完整状态,确保数据的纯净度。

3. NodeWarden 的核心买点依旧是 Cloudflare

NodeWarden 本地化部署也仅仅是一个可选项,给有需求的用户提供的一个方案,大家使用 NodeWarden 肯定是 CF优先,只是在我提到的一些场景下本地化确实是一个加分项,如果我们维护本地化的代价没有那么大的话,多一个选项肯定是加分项

@shuaiplus
Copy link
Copy Markdown
Owner

兄弟,你能搞一个docker和workers同步的吗,不然搞docker意义不大。要是两边能同步一个没了一个能继续用,这个就很牛了。

@tan9710630
Copy link
Copy Markdown
Author

tan9710630 commented Mar 23, 2026

兄弟,你能搞一个docker和workers同步的吗,不然搞docker意义不大。要是两边能同步一个没了一个能继续用,这个就很牛了。

对呀,我本来的愿景就是这个,通过帅总写好的云备份就可以实现呀,一边没有了,另一边挂同一个云备份直接执行恢复就行了。

@shuaiplus
Copy link
Copy Markdown
Owner

ok,我测试一下,workers导出备份,docker导入

@tan9710630
Copy link
Copy Markdown
Author

@shuaiplus 帅总,啥时候方便review一下呀?🥺🥺🥺

@shuaiplus
Copy link
Copy Markdown
Owner

出差中,一直抽不出来时间来测试🙁,再等等,肯定会合并的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants