部署开发者门户
API7 开发者门户由协同工作的两个官方容器镜像组成:
| 图片 | 角色 | 港口 | 源代码库 |
|---|---|---|---|
api7/api7-ee-developer-portal | 门户 API(后端) — 存储门户定义、API 产品、开发者、应用程序、订阅和凭证的 Go 服务。与控制面的其余部分共享主 api7ee PostgreSQL 数据库。 | 4321 (HTTPS) | api7ee-3-control-plane |
api7/api7-ee-developer-portal-fe | 开发者门户前端 — 开发者登录的面向客户的 Next.js Web 应用程序。使用自己的 PostgreSQL 进行用户会话和开发者账户(通过 Better Auth + Drizzle),并使用每个门户令牌与门户 API 进行通信。 | 3001 | api7ee-developer-portal |
一个后端为你的整个组织服务;如果你想要单独的品牌或受众,你可以部署多个前端实例(每个门户一个)。
本指南展示了如何从头开始部署完整堆栈。在 Kubernetes 上的大多数生产部署中,后端已作为主 api7/api7ee3 Helm 图表的一部分安装;在这种情况下,你只需部署前端并将其指向现有门户 API。
先决条件
- 使用支持门户的许可证安装和激活 API7 Enterprise(试用许可证默认包括门户支持)。
- 从前端主机到门户 API 端点(
4321/tcp)的网络连接。 - Docker 和 Docker Compose,或带有 Helm 的 Kubernetes 集群,具体取决于你选择的部署方法。
步骤 1:在提供商门户中创建门户和令牌
在部署开发者门户前端之前,创建门户实例并从 API7 仪表板生成连接令牌。
1.登录API7仪表板。
2. 导航到 提供商门户 > 添加门户。
3. 提供 名称 和可访问 开发者门户的 公共 URL(例如,https://portal.example.com)。
4. 创建门户后,打开其设置 > 令牌选项卡。
5. 单击生成新令牌并保存令牌(格式:a7prt-xxxxxxxxxxxx)。你将其粘贴到步骤 2 中的前端配置中。
:::信息
每个门户都有一个唯一的公共 URL。单个门户可以支持一个前端实例或共享相同令牌和用户会话数据库的多个前端副本。
:::
第二步:编写配置文件
后端和前端从单独的 YAML 文件中读取其配置。创建一个工作目录并添加这两个文件。
mkdir api7-developer-portal && cd api7-developer-portal
mkdir -p backend_conf frontend_conf
后端配置 — backend_conf/conf.yaml
后端连接到控制面的主 api7ee 数据库。下面的 DSN 与 api7/api7ee3 Helm 图表中的默认凭证匹配;根据需要进行调整。
server:
listen:
host: "0.0.0.0"
port: 4321
tls:
enabled: true
key_file: "" # Optional: /app/certs/tls.key for TLS termination
cert_file: "" # Optional: /app/certs/tls.crt for TLS termination
status:
disable: false
host: "127.0.0.1"
port: 4322
log:
level: warn
output: stderr
access_log: stdout
database:
dsn: "postgres://api7ee:YOUR_DB_PASSWORD@api7-postgresql:5432/api7ee"
max_open_conns: 30
max_idle_time: 30s
timeout: 5s
前端配置 — frontend_conf/config.yaml
前端使用你在步骤 1 中生成的门户令牌指向后端,并为用户会话保留自己的小型 PostgreSQL。
portal:
# 门户 API 端点(后端)。根据实际情况使用公共地址或内部地址。
url: https://api7-developer-portal-backend:4321
# 步骤 1 中从提供商门户生成的令牌。
token: a7prt-xxxxxxxxxxxx
db:
# PostgreSQL connection string for the frontend's user-session database.
url: "postgres://portal:YOUR_PORTAL_DB_PASSWORD@portal-postgres:5432/portal"
auth:
# Generate a secure value: openssl rand -base64 32
secret: "REPLACE_WITH_SECURE_RANDOM_STRING"
app:
# 开发者访问此门户所使用的公共 URL。
baseURL: "https://portal.example.com"
trustedOrigins:
- "https://portal.example.com"
在任何共享环境中运行之前,将 auth.secret 替换为安全生成的随机值。不要在生产中使用示例值。
步骤 3:部署
选择适合你环境的部署方法。
- Docker Compose
- Kubernetes
Docker Compose 是运行独立 开发者门户堆栈进行开发或测试的最快方法。下面的 Compose 文件会显示两个图像(后端和前端)以及用于前端用户会话的专用 PostgreSQL。
在同目录下创建docker-compose.yaml:
services:
api7-postgresql:
image: postgres:16
hostname: api7-postgresql
environment:
POSTGRES_USER: api7ee
POSTGRES_PASSWORD: YOUR_DB_PASSWORD
POSTGRES_DB: api7ee
healthcheck:
test: ["CMD", "pg_isready", "-U", "api7ee"]
interval: 5s
timeout: 5s
retries: 5
networks:
- portal
portal-postgres:
image: postgres:16
hostname: portal-postgres
environment:
POSTGRES_USER: portal
POSTGRES_PASSWORD: YOUR_PORTAL_DB_PASSWORD
POSTGRES_DB: portal
volumes:
- portal_postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "portal", "-d", "portal"]
interval: 5s
timeout: 5s
retries: 5
networks:
- portal
api7-developer-portal-backend:
image: api7/api7-ee-developer-portal:${API7_VERSION}
hostname: api7-developer-portal-backend
restart: always
volumes:
- ./backend_conf/conf.yaml:/usr/local/api7/conf/conf.yaml:ro
command:
- /usr/local/api7/api7-ee-developer-portal
- -c
- /usr/local/api7/conf/conf.yaml
ports:
- "4321:4321"
depends_on:
api7-postgresql:
condition: service_healthy
networks:
- portal
api7-developer-portal-frontend:
image: api7/api7-ee-developer-portal-fe:${API7_VERSION}
hostname: api7-developer-portal-frontend
restart: always
volumes:
- ./frontend_conf/config.yaml:/app/apps/site/config.yaml:ro
environment:
# Defaults to "1" (strict TLS verification).
# Only set to "0" in development if the backend uses a self-signed certificate.
NODE_TLS_REJECT_UNAUTHORIZED: "1"
ports:
- "3001:3001"
depends_on:
portal-postgres:
condition: service_healthy
api7-developer-portal-backend:
condition: service_started
networks:
- portal
networks:
portal:
driver: bridge
volumes:
portal_postgres_data:
设置镜像版本并启动堆栈:
export API7_VERSION=3.9.10 # pin to a specific release; see Supported Versions
docker compose up -d
检查所有四个容器是否都达到 healthy / Up 状态:
docker compose ps
此 Compose 文件将其自己的 PostgreSQL 与后端一起部署以实现自我包含。在实际部署中,后端通常共享控制面的其余部分使用的主 api7ee PostgreSQL — 将 backend_conf/conf.yaml 指向该现有数据库,并从 Compose 文件中删除 api7-postgresql 服务。
在 Kubernetes 上,当 developer_portal.enable: true(默认)时,门户 API 后端被部署作为主 api7/api7ee3控制面图表的一部分。你通常只需要 单独部署前端。此选项卡显示了两者 — 在 CP 图表中启用后端,然后将前端部署为其自己的工作负载。
启用控制面图表中的后端
在控制面值文件(例如 cp-values.yaml)中,确保启用并配置开发者门户后端:
developer_portal:
replicaCount: 1
image:
repository: api7/api7-ee-developer-portal
tag: "3.9.10" # pin to your API7 Enterprise release
developer_portal_service:
type: ClusterIP
port: 4321
developer_portal_configuration:
enable: true
server:
listen:
host: "0.0.0.0"
port: 4321
tls:
enabled: true
status:
host: "127.0.0.1"
port: 4322
log:
level: warn
database:
dsn: "postgres://api7ee:YOUR_DB_PASSWORD@api7-postgresql:5432/api7ee"
使用以下值安装或升级控制面图表:
helm upgrade --install api7ee3 api7/api7ee3 \
-f cp-values.yaml \
-n api7
现在可以在集群内部通过 https://api7ee3-developer-portal:4321 访问后端。
部署前端
前端不附带专用的 Helm 图表,因此将其部署为标准 Kubernetes 工作负载。下面的清单使用 ConfigMap 来挂载你在步骤 2 中编写的 config.yaml,并使用一个小型 StatefulSet 支持的 PostgreSQL 作为前端自己的用户会话数据库。
apiVersion: v1
kind: ConfigMap
metadata:
name: developer-portal-frontend-config
namespace: api7
data:
config.yaml: |
portal:
url: https://api7ee3-developer-portal:4321
token: a7prt-xxxxxxxxxxxx
db:
url: "postgres://portal:YOUR_PORTAL_DB_PASSWORD@portal-postgres:5432/portal"
auth:
secret: "REPLACE_WITH_SECURE_RANDOM_STRING"
app:
baseURL: "https://portal.example.com"
trustedOrigins:
- "https://portal.example.com"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: developer-portal-frontend
namespace: api7
spec:
replicas: 2
selector:
matchLabels:
app: developer-portal-frontend
template:
metadata:
labels:
app: developer-portal-frontend
spec:
containers:
- name: frontend
image: api7/api7-ee-developer-portal-fe:3.9.10 # pin to your release
ports:
- containerPort: 3001
env:
- name: NODE_TLS_REJECT_UNAUTHORIZED
value: "1"
volumeMounts:
- name: config
mountPath: /app/apps/site/config.yaml
subPath: config.yaml
readOnly: true
volumes:
- name: config
configMap:
name: developer-portal-frontend-config
---
apiVersion: v1
kind: Service
metadata:
name: developer-portal-frontend
namespace: api7
spec:
selector:
app: developer-portal-frontend
ports:
- port: 80
targetPort: 3001
type: ClusterIP
应用清单:
kubectl apply -f developer-portal-frontend.yaml
你还需要创建前端的 PostgreSQL 数据库 (portal) 并通过 Ingress 或 LoadBalancer 公开前端 Service,以便外部开发者可以通过你设置的公共 URL 访问它app.baseURL。
将真实的 auth.secret 和 PostgreSQL 密码存储在 Secret 中,而不是将它们嵌入到 ConfigMap 中。上面的清单内含了简洁的价值观——在生产中运行之前将其适应你的秘密管理实践。
步骤 4:验证部署
- 在浏览器中打开你配置的公共URL(
app.baseURL),例如https://portal.example.com。 - 验证主页是否加载并且注册按钮可见。
- 创建测试开发者账户以确认身份验证功能正常。
- 导航到 API Hub 以确认前端可以到达门户 API。如果 API 产品已发布到此门户,它们将出现在此处。
部署多个门户实例
你可以针对同一后端部署多个 开发者门户前端 — 每个前端服务于不同的受众(例如,公共开发者、内部团队或合作伙伴):
- 在提供商门户中,创建一个具有唯一名称和公共 URL 的附加门户。
- 为该门户生成新令牌。
- 使用新令牌和
config.yaml中的公共 URL 部署另一个前端实例(Kubernetes 上的新Deployment或单独的 Compose 堆栈)。
API 产品发布到特定门户。发布到一个门户的 API 产品在另一个门户上不可见,除非你也明确将其发布到该门户。