除了cloudflare R1,能用自己云服务器上的数据库吗?

理论上来说,你可以将部署在 Cloudflare Workers 上的博客项目的数据存储从 Cloudflare D1(日志中显示为 R1 存储)切换到你自己的云服务器上的 SQLite 数据库。不过,这会涉及到一些架构上的调整。

为什么需要调整?

Cloudflare Workers 是一个无服务器环境。它本身的执行环境是无状态且分布式的,无法直接访问你私有云服务器上的本地文件系统。D1 数据库是 Cloudflare 提供的一个分布式 SQL 数据库,它与 Workers 紧密集成,是为 Workers 设计的持久化存储方案。

如何实现?

要将数据切换到你自己的云服务器上的 SQLite 数据库,你需要做以下几件事:

  • 在你的云服务器上搭建一个 API 服务:

    • 这个 API 服务将负责处理来自 Cloudflare Worker 的数据库请求。

    • 你需要选择一个后端语言(例如 Node.js, Python, Go, PHP 等)和框架来构建这个 API。

    • 在这个 API 服务中,你会编写代码来连接到本地的 SQLite 数据库,并执行查询、插入、更新和删除等操作。

  • 修改你的 Cloudflare Worker 代码:

    • 当前你的 Worker 代码可能是通过 env.DB 绑定直接与 D1 数据库交互。

    • 你需要移除所有与 D1 相关的代码。

    • 修改你的 Worker 代码,使其不再直接访问数据库,而是通过 HTTP 请求调用你在云服务器上搭建的 API 服务。

    • 例如,当 Worker 需要获取博客文章时,它会向你的云服务器上的 API 发送一个 GET 请求;当需要保存新文章时,它会发送一个 POST 请求。

  • 处理网络延迟和错误:

    • 当你的 Worker 位于 Cloudflare 的全球网络上,而你的数据库位于一个特定的云服务器时,数据传输会引入网络延迟。这可能会影响博客的响应速度。

    • 你需要考虑在 Worker 端实现适当的错误处理和重试机制,以应对与云服务器 API 通信时可能发生的网络问题。

  • 安全考虑:

    • 确保你的云服务器上的 API 服务有适当的认证和授权机制,以防止未经授权的访问。你可能需要使用 API 密钥、OAuth 或者其他验证方式来保护你的 API 端点。

    • 考虑使用 HTTPS 来加密 Worker 和你的云服务器 API 之间的通信。

配置文件变更

你的 wrangler.toml 文件(你在问题中提供的 JSON 结构看起来像是 wrangler.toml 的一部分)将发生变化。

当前的这部分将被移除

[[d1_databases]]

binding = "DB"

database_name = "DB"

database_id = "b32dd761-4f7a-4fbf-8a21-ce1b83a4b87d"

你可能需要添加一些环境变量来存储你的云服务器 API 的 URL 或密钥,例如:

[vars]

MY_API_SERVER_URL = "https://your-cloud-server-ip-or-domain/api"

API_KEY = "your_secret_api_key" # 如果需要认证

然后在你的 Worker 代码中通过 env.MY_API_SERVER_URL 和 env.API_KEY 来访问这些变量。

总结

虽然技术上可行,但从 Cloudflare D1 切换到自己的 SQLite 数据库会增加项目的复杂性,引入额外的网络延迟,并且需要你负责数据库服务器的维护、安全和扩展。D1 作为一个托管服务,在简化开发和全球分发方面具有优势。在做出决定之前,请权衡这些利弊。