# 数据库、Cron 与 Timelines

新 Deno Deploy 的核心抽象是 app、revision、timeline 与 context。生产、Git 分支和 preview 可以运行不同 revision，并取得不同环境变量和逻辑数据库。

## 数据库

平台当前支持关联 PostgreSQL 或 Deno KV。每个 app 的生产、分支和 preview timeline 默认获得隔离的逻辑数据库。

```ts
const kv = await Deno.openKv();

Deno.serve(async () => {
  await kv.set(["health", "lastSeen"], new Date().toISOString());
  return Response.json({ ok: true });
});
```

PostgreSQL 连接会注入标准 `DATABASE_URL`、`PGHOST`、`PGPORT`、`PGDATABASE`、`PGUSER`、`PGPASSWORD`。迁移命令可以配置为 pre-deploy command，在 revision 接流量前运行。

<Callout type="warn" title="当前组合限制">
官方文档截至 2026-08-03 表示：单个 app 暂不能同时关联多个数据库实例，因此不能同时关联一套 Deno KV 和一套 PostgreSQL 实例。每个 app 目前还有一个由所有 preview deployment 共用的 preview 数据库。发布前再次核对。
</Callout>

## Cron

```ts
Deno.cron("daily cleanup", "0 3 * * *", async () => {
  await runCleanup();
});
```

Cron 使用 UTC。Deploy 在发布时发现任务并处理调度，执行显示在 dashboard/logs/traces。失败默认不重试；需要重试时在任务上显式配置 `backoffSchedule`（最多 5 次，单次延迟上限 1 小时）。任务必须幂等；重试与下一次计划重叠时可能跳过后一个执行。

## Context 与环境变量

- Production：生产 timeline。
- Development：分支与 preview timeline。
- Build：只在构建阶段可见，不自动进入运行时。
- Secret 创建后不再在 UI 显示；不要通过日志回显。

使用 `DENO_TIMELINE`、`DENO_DEPLOY_APP_ID` 和 deployment 标识做日志维度，而不是把它们当访问控制。

官方依据：[Databases](https://docs.deno.com/deploy/reference/databases/)、[Cron](https://docs.deno.com/deploy/reference/cron/)、[Timelines](https://docs.deno.com/deploy/reference/timelines/)、[Environment contexts](https://docs.deno.com/deploy/reference/env_vars_and_contexts/)。
