上线与运维

Dokploy 部署

用持久化 SQLite 把 localfed 部署到 Dokploy。

templates/localfed 默认用于本机开发。通过 Compose 部署时会关闭 Local Account,避免无需凭证的本地登录入口暴露到公网,并把 SQLite 数据保存在持久化 /data volume 中。

Dokploy 配置

在 Dokploy 里创建应用,选择当前 Git 仓库:

配置项
部署模式Compose
Compose 文件./docker-compose.yml
Container port43127
VolumeCompose 自动创建 downcity_infra_data

HOSTPORT、数据库路径和登录模式已经写在 docker-compose.yml 中:

HOST=0.0.0.0
PORT=43127
DATABASE_PATH=/data/downcity.sqlite
LOCAL_LOGIN=false

/data 必须是持久化 volume。City、账户和 Federation env 都会保存在这个 SQLite 数据库里。

域名路径

Node 街区默认监听 43127,Federation API 直接挂在服务根路径下:

GET  /health
POST /v1/env/upsert
GET  /v1/services
POST /v1/ai/text

如果你的域名是 https://base.example.com,产品侧 SDK 和可信后端应该使用:

base_url=https://base.example.com

Provider Key

localfed 模板直接读取进程环境中的 DEEPSEEK_API_KEY。在 Dokploy 中把它配置为 Secret:

DEEPSEEK_API_KEY=sk-...

验证

Dokploy 部署完成后,先验证公开服务:

curl https://base.example.com/health

只用 IP 和端口时:

curl http://1.2.3.4:43127/health

预期返回大致如下:

{
  "ok": true,
  "services": ["env", "cities", "bureaus", "accounts", "ai"]
}

如果这里超时,说明 Dokploy 服务没有对外暴露、VPS 防火墙没放行 43127,或还没有绑定可访问的域名。

产品侧调用

产品前端和应用应该通过 @downcity/city 调用 Node 街区:

import { City } from "@downcity/federation/legacy";

const city = new City({
  federation_url: "https://base.example.com",
  user_token: "user_token",
});

可信后端应该用 FederationAdmin 携带管理员会话 Token:

import { FederationAdmin } from "@downcity/federation/legacy";

const admin = new FederationAdmin({
  base_url: "https://base.example.com",
  credential: administrator_session_token,
});

完整 SDK 能力继续看 User CityFederationAdmin