跳到主要内容
Deno 2.4 已发布,带来 deno bundle、字节/文本导入、OTel 稳定版等更多功能
了解更多
Subhosting

Deno Subhosting 引入 KV 备份

Subhosting 使您能够在安全的沙盒中以编程方式运行来自多个用户的非受信任 JavaScript,无需管理复杂基础设施的麻烦。自从其自助服务发布以来,许多客户使用 Subhosting 来为用户提供更近的电商店面托管为低代码工作流构建器提供代码级别的自定义“逃生舱口”,甚至简单转售无服务器边缘函数

今天,我们很高兴地宣布,KV 备份现已可用于 Subhosting。此功能为您和您的用户提供了更高的数据持久性,因为您现在可以持续备份您的KV 数据库到您自己的 S3 兼容对象存储,使用时间点恢复等功能。

让我们深入了解如何使用此功能。

为您的用户提供简单、持久的数据存储

您的用户可能希望为其代码添加数据持久性。虽然他们可以导入任意数量的 npm 包来连接到数据存储,但最简单的方法是使用内置的 KV API

const kv = await Deno.openKv();
您的用户只需一行代码即可访问全球复制的 ACID 数据库,无需任何配置。

这让您的用户可以跳过配置新的数据库实例和管理 API 密钥,直接投入代码编写。但是请注意,要为您的用户启用 KV,您需要以编程方式创建一个 KV 数据库,然后将其附加到新的部署

了解更多关于使用 Deno KV 进行构建的信息.

设置 KV 数据库

在我们向您展示如何对 KV 数据库执行备份操作之前,我们首先使用 POST /organizations/{organizationId}/databases 在您的组织中创建一个。

import { assert } from "jsr:@std/assert/assert";

const orgId = "your-organization-id";
const orgToken = "your-organization-token";

// Create a new database in your organization
const res = await fetch(
  `https://api.deno.com/v1/organizations/${orgId}/databases`,
  {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${orgToken}`,
    },
    body: JSON.stringify({
      description: "my database",
    }),
  },
);

assert(res.ok);

// You can get database ID from response body
const { id: databaseId } = await res.json();
console.log(databaseId);

启用 KV 备份

拥有 KV 数据库后,您可以使用 POST /databases/{databaseId}/database_backups 启用备份。以下示例展示了如何将备份启用到 S3 兼容对象存储,本例中为 Google Cloud Storage。

import { assert } from "jsr:@std/assert/assert";

const ACCESS_KEY_ID = Deno.env.get("ACCESS_KEY_ID")!;
const SECRET_ACCESS_KEY = Deno.env.get("SECRET_ACCESS_KEY")!;

const orgToken = "your-organization-token";
// Database ID you got from the previous step
const databaseId = "database-id";

const res = await fetch(
  `https://api.deno.com/v1/databases/${databaseId}/database_backups`,
  {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${orgToken}`,
    },
    body: JSON.stringify({
      kind: "s3",
      endpoint: "https://storage.googleapis.com",
      bucketName: "test-kv-backup",
      bucketRegion: "us-central1",
      accessKeyId: ACCESS_KEY_ID,
      secretAccessKey: SECRET_ACCESS_KEY,
      prefix: "backup/",
    }),
  },
);

assert(res.ok);

// You can get database backup ID from response body
const { id: databaseBackupId } = await res.json();
console.log(databaseBackupId);

然后,您可以使用 GET /database_backups/{databaseBackupId} 获取备份状态以及其他信息。

import { assert } from "jsr:@std/assert/assert";

const orgToken = "your-organization-token";
// Database backup ID you got from the previous step
const databaseBackupId = "database-backup-id";

const res = await fetch(
  `https://api.deno.com/v1/database_backups/${databaseBackupId}`,
  {
    headers: {
      authorization: `Bearer ${orgToken}`,
    },
  },
);

assert(res.ok);

console.log(await res.json());
// You would see something like:
// {
//   id: "database-id",
//   kind: "s3",
//   endpoint: "https://storage.googleapis.com",
//   bucketName: "test-kv-backup",
//   bucketRegion: "us-central1",
//   accessKeyId: "YOUR_ACCESS_KEY_ID",
//   prefix: "backup/",
//   status: {
//     code: "active"
//   }
// }

如果您忘记了数据库备份 ID 怎么办?别担心,您可以调用 GET /databases/{databaseId}/database_backups 端点列出数据库的所有备份。

import { assert } from "jsr:@std/assert/assert";

const orgToken = "your-organization-token";
const databaseId = "database-id";

const res = await fetch(
  `https://api.deno.com/v1/databases/${databaseId}/database_backups`,
  {
    headers: {
      authorization: `Bearer ${orgToken}`,
    },
  },
);

assert(res.ok);

console.log(await res.json());
// You would see something like:
// [
//   {
//     id: "database-id",
//     kind: "s3",
//     endpoint: "https://storage.googleapis.com",
//     bucketName: "test-kv-backup",
//     bucketRegion: "us-central1",
//     accessKeyId: "YOUR_ACCESS_KEY_ID",
//     prefix: "backup/",
//     status: {
//       code: "active"
//     }
//   }
// ]

请注意,目前单个数据库只能启用一个备份。这意味着如果您想使用不同的配置设置更新备份、备份到不同的目的地,或者修复配置错误的凭据,您需要首先禁用现有备份。您可以使用 DELETE /database_backups/{databaseBackupId} 完成此操作。

import { assert } from "jsr:@std/assert/assert";

const orgToken = "your-organization-token";
const databaseBackupId = "database-backup-id";

const res = await fetch(
  `https://api.deno.com/v1/database_backups/${databaseBackupId}`,
  {
    method: "DELETE",
    headers: {
      authorization: `Bearer ${orgToken}`,
    },
  },
);

assert(res.ok);

之后,您可以启用具有新设置的新备份。

备份数据的高级用法

您可以使用 denokv 工具管理您的备份数据。例如,您可以将数据同步到本地 SQLite 文件,并查看或检出一个可恢复的时间点。有关更多详细信息,请参阅 denokv 文档

下一步

使用 Deno Subhosting 可以轻松构建一个安全部署和运行非受信任代码的平台。您可以在数周而非数月内推出您的集成平台、低代码解决方案、应用市场等,并且成本仅为一小部分。

我们计划继续投入,确保 Deno Subhosting 成为安全运行第三方非受信任代码的最简单方式,以便您可以继续专注于为用户创造价值。

🚨️ 了解更多关于 Deno Subhosting 的信息 🚨️