Appearance
部署上线(Docker + 云服务)
把「本机能跑」收成「别人用链接能打开」的最小闭环。
AI CODING · 场景三 · 部署
先 Compose 或仓库既有脚本;密钥只进 env 示例。验收用健康检查 + 业务 curl。代码发布与数据发布分开确认。
产出 可重复启动验收 health + curl
本节要点
- Compose / 无 Docker 两种最小启动路径
- 发布清单(代码与数据分开)
- 健康检查 + 「今天吃什么」业务 curl 验收
范围
备选做法
自建 K8s、多区域、完整 APM;真密钥写进仓库「图省事」。 推荐做法
可重复启动:Compose(或既有脚本)+ .env.example + 发布检查清单。 选型说明: 场景三要证明「别人用链接能打开」,不是证明你会搭集群。密钥进仓库一次,后面全是事故;检查清单比仪表盘更优先。
前置:三只读 API 本机 curl 已绿(见 API / 库表)。
推荐 Compose 形状(示意)
text
services:
api: build/上下文 → 暴露端口 → env_file
db: (若用 Postgres/MySQL;SQLite 可挂 volume 文件)教学用 SQLite 时:确保容器内数据目录可写,volume 绑定到宿主机路径,避免一重建就丢 seed。
最小 docker-compose 示意(可让 AI 按仓库改)
yaml
services:
api:
build: .
ports:
- "8000:8000"
env_file:
- .env
volumes:
- ./data:/data
command: ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]环境变量清单(示例)
| 变量 | 含义 | 示例占位 |
|---|---|---|
| DATABASE_URL | 库连接 | sqlite:////data/app.db |
| APP_PORT | 服务端口 | 8000 |
| LOG_LEVEL | 日志级别 | info |
真值放本地 .env(gitignore);仓库只留 .env.example。真密钥永不进镜像层。
跟做步骤
- 贴下方给 AI 的 Prompt;先看将新增/修改的文件列表。
- 确认后落 Compose(或对齐仓库已有部署脚本)。
- 冷启动 → 健康检查 → 业务 curl。
- 停掉再起一次,确认仍可访问。
- README 写清启动 / 停服 / 数据卷位置。
给 AI 的 Prompt
给 AI · Prompt · 最小可部署
text
【目标】Docker Compose(或仓库已有部署方式)一键起 API;写清环境变量。
【约束】
- 不引入新云厂商 SDK,除非仓库已有
- 密钥仅占位符(.env.example)
- README:启动、验收 3 步、如何停掉、数据卷在哪
- 业务验收端点用 meal-scenes / dishes(不要 stages)
【请你】
1. 将新增/修改的文件列表
2. 确认后再写
3. 命令序列 + 期望输出特征(例如 health 返回 ok)无 Docker 时的最小替代
- 本机 venv / 进程按 README 启动 API
- 用
curl完成与 Compose 相同的健康检查 + 业务验收 - README 写明「生产仍以 Compose/既有脚本为准」
教学验收看可重复启动 + curl 合同,不强制第一天就上云。
验收清单
- [ ]
compose up(或等价)冷启动成功 - [ ] 重启容器 / 进程后仍可访问
- [ ]
GET /health(或约定)通过 - [ ]
GET /api/meal-scenes与本地合同一致 - [ ]
GET /api/dishes?scene=solo非空 - [ ] README 有停服命令
bash
curl -s http://127.0.0.1:8000/health
curl -s http://127.0.0.1:8000/api/meal-scenes | python -m json.tool | head
curl -s "http://127.0.0.1:8000/api/dishes?scene=solo" | python -m json.tool | head发布清单(给人用的)
text
1. 备份数据库(有生产数据时)
2. 拉代码 / 构建镜像
3. 跑迁移(单独确认成功)——代码发布 ≠ 数据发布
4. 启动新版本
5. 健康检查 + 一条业务 curl(meal-scenes 或 dishes)
6. 抽查前端主路径(若已联调)
7. 不行 → 回滚到上一版本(步骤写在 README)纠错
| 现象 | 话术 |
|---|---|
| 容器起不来 | 「贴 compose 日志最后 40 行;先不要改业务代码。」 |
| 健康通但 API 空 | 「检查 volume 与 seed 是否在容器内执行过。」 |
| 密钥被写进 Dockerfile | 「删掉;改 env_file;轮换已泄露密钥。」 |
| curl 还在打 /api/stages | 「合同已是 meal-scenes / dishes,改验收命令与 README。」 |
场景三收工 → 场景四。