---
title: "chore: GEO Platform Launch Readiness Sprint"
type: chore
status: completed
date: "2026-06-01"
origin: docs/brainstorms/2026-06-01-geo-launch-readiness-requirements.md
---

## Summary

修复部署阻塞问题，启动服务，端到端验证完整变现闭环（注册→诊断→健康分→付费墙→支付→解锁），使 GEO 平台达到可上线状态。

## Problem Frame

Plan 003 完成了 9 个实施单元的代码编写，但这些代码从未作为完整系统运行过。研究发现 4 个 P0 阻塞问题导致服务无法启动：JWT_SECRET 长度不足、DATABASE_URL 驱动不匹配、根目录 .env 缺失、pgvector 扩展未安装。在代码从未跑过的状态下，任何单点修复都是盲目的；只有让系统先跑起来，才能发现真正的集成问题。

## Requirements

**部署就绪**

R1. 后端服务可在 Docker Compose 环境中启动，所有 API 端点可访问

R2. 前端构建产物可被部署并提供页面访问

R3. 数据库迁移可从空库执行到最新版本，所有表和索引正确创建

R4. 环境变量配置完整，第三方服务密钥缺失时优雅降级为 mock 模式

**核心流程可跑通**

R5. 新用户可完成注册并登录，获得有效 JWT

R6. 登录用户可创建品牌，触发诊断，获得非零健康分

R7. 免费用户访问付费功能时触发付费墙，显示升级提示

R8. 用户可发起支付（mock 模式），支付完成后配额刷新、付费功能解锁

R9. 公开健康分页面无需注册即可访问，输入品牌名可生成报告

**端到端验证**

R10. 完整变现闭环可在部署环境中走通：注册→诊断→健康分→付费墙→支付→解锁

**代码质量**

R11. Dockerfile 健康检查端点与实际 API 端点一致

R12. 测试环境配置完整，测试可正常启动

R13. 前端页面统一使用 API 客户端，认证 token 正确传递

## Key Technical Decisions

KTD1. **DATABASE_URL 使用 asyncpg 驱动。** `database.py` 使用 `create_async_engine`，必须用 `postgresql+asyncpg://` 而非 `postgresql+psycopg://`。当前 `backend/.env` 中的值使用了错误的同步驱动。

KTD2. **数据库初始化使用 create_all + stamp head。** Alembic 迁移链存在顺序问题（alerts 表引用 brands 但 brands 在更晚的迁移中创建），直接 `alembic upgrade head` 会失败。先用 `Base.metadata.create_all()` 创建所有表，再用 `alembic stamp head` 标记版本。这与前序会话中验证过的策略一致。

KTD3. **pgvector 通过 PostgreSQL 初始化脚本安装。** 在 Docker Compose 中为 db 服务添加初始化脚本，从源码编译安装 pgvector 扩展。避免构建自定义 PostgreSQL 镜像的复杂性。

KTD4. **支付/分发/邮件保持 mock 模式。** 本次验证目标是确认付费墙逻辑正确，真实 SDK 接入是后续工作。`PAYMENT_MODE=mock`、`DISTRIBUTION_MODE=mock`、`EMAIL_MODE=mock`。

KTD5. **开发环境优先于生产环境。** 先用 `docker-compose.yml`（开发模式）验证，确认跑通后再配置 `docker-compose.prod.yml`。开发模式挂载源码目录便于调试。

KTD6. **本地裸跑优先于 Docker 部署。** Docker Hub 网络问题导致镜像构建失败，先用本地直接运行后端/前端验证核心流程，Docker 部署作为后续工作。

KTD7. **验证驱动修复。** 手动走完注册→诊断→支付全链路，每步发现问题就修，不做预防性重构。

## Implementation Units

### U1. Fix environment configuration blockers ✅

**Goal:** 修复所有 P0 阻塞问题，使服务可以启动

**Requirements:** R4

**Status:** Completed (previous session)

**What was done:**
- `backend/.env` DATABASE_URL 改为 `postgresql+asyncpg://`
- `JWT_SECRET` 改为 43 字符
- 从 `.env.example` 创建根目录 `.env`
- `.gitignore` 确认排除 `.env`

---

### U2. Database setup with pgvector and migrations ✅

**Goal:** PostgreSQL 容器安装 pgvector 扩展，数据库表结构完整创建

**Requirements:** R3

**Status:** Completed (previous session)

**What was done:**
- 创建 `backend/init-db.sh` pgvector 初始化脚本
- `docker-compose.yml` 挂载初始化脚本
- 创建 `backend/init_schema.py` 使用 create_all + stamp head
- 数据库表和 pgvector 扩展已验证存在

---

### U3. Service startup and health verification 🔄

**Goal:** 后端和前端服务均可启动并通过健康检查

**Requirements:** R1, R2

**Status:** Partially completed (previous session)

**What was done:**
- 后端本地启动成功：`uvicorn app.main:app --host 0.0.0.0 --port 8000`
- 后端健康检查通过：`/health` → healthy, `/ready` → database:ok, redis:ok
- 前端本地启动成功：`npm run dev` on port 3001

**Remaining:**
- 验证前端页面可访问（`curl http://localhost:3001`）
- 验证前端可调用后端 API（无 CORS 错误）

---

### U3.5. Fix audit-discovered P0 issues

**Goal:** 修复复盘发现的 P0 阻塞问题

**Requirements:** R11, R12

**Dependencies:** none (可并行)

**Files:**
- `backend/Dockerfile` — 修复健康检查端点 `/api/health` → `/health`
- `backend/.env.test` — 添加 JWT_SECRET

**Approach:**
1. 修改 Dockerfile HEALTHCHECK 端点从 `/api/health` 改为 `/health`
2. 在 `.env.test` 中添加 `JWT_SECRET=test-jwt-secret-for-testing-at-least-32-characters-long`

**Test scenarios:**
- Dockerfile 健康检查端点与 FastAPI 注册的 `/health` 一致
- `pytest` 可正常启动（不因 JWT_SECRET 缺失而 sys.exit）

**Verification:** Dockerfile HEALTHCHECK CMD 正确，测试可运行

---

### U4. Authentication flow verification

**Goal:** 新用户可完成注册、登录、获取 JWT

**Requirements:** R5

**Dependencies:** U3

**Files:**
- `backend/app/api/auth.py` — 认证 API
- `backend/app/services/auth.py` — 认证服务
- `backend/app/models/user.py` — User 模型
- `frontend/app/(auth)/` — 前端认证页面

**Known issues:**
- 前端部分页面绕过统一 API 客户端（reports、lifecycle/new），认证 token 可能不被附加

**Approach:**
1. 启动后端和前端服务
2. 通过 API 注册新用户：`POST /api/v1/auth/register`
3. 验证用户数据正确写入数据库（plan=free, max_queries=5）
4. 登录获取 JWT token：`POST /api/v1/auth/login`
5. 用 JWT token 调用受保护 API：`GET /api/v1/brands`
6. 修复认证流程中的任何错误

**Test scenarios:**
- `POST /api/v1/auth/register` 创建用户成功，返回 201
- `POST /api/v1/auth/login` 返回 JWT token
- `GET /api/v1/brands` 携带 JWT 返回 200（非 401）
- 新用户 plan 字段为 "free"，max_queries 为 5

**Verification:** 新用户可完成注册→登录→访问受保护资源

---

### U5. Diagnosis and health score verification

**Goal:** 用户可创建品牌、触发诊断、获得非零健康分；公开健康分页面可访问

**Requirements:** R6, R9

**Dependencies:** U4

**Files:**
- `backend/app/api/diagnosis.py` — 诊断 API
- `backend/app/api/health_score.py` — 公开健康分 API
- `backend/app/services/diagnosis/` — 诊断服务
- `frontend/app/(public)/health-score/` — 公开健康分页面
- `frontend/app/(dashboard)/onboarding/` — Onboarding 页面

**Known risks:**
- 诊断依赖 DeepSeek API，如果 API Key 无效或额度耗尽，诊断会返回空结果
- 诊断是异步流程，可能需要轮询等待结果

**Approach:**
1. 登录用户创建品牌
2. 触发诊断，验证数据采集流程（AI 平台查询 + CitationRecord 分析）
3. 查看诊断结果，确认健康分为非零值
4. 访问公开健康分页面，输入品牌名生成报告
5. 修复诊断流程中的任何错误（LLM API 调用失败、数据采集空结果等）

**Test scenarios:**
- `POST /api/v1/brands` 创建品牌成功
- `POST /api/v1/diagnosis` 触发诊断，返回诊断任务 ID
- `GET /api/v1/diagnosis/{id}` 返回非零健康分
- `GET /api/v1/public/health-score?brand={name}` 返回公开健康分报告
- 公开健康分页面无需登录即可访问

**Verification:** 用户可获得非零 GEO 健康分，公开页面可生成报告

---

### U6. Monetization closed loop verification

**Goal:** 完整变现闭环可走通——免费用户触发付费墙、mock 支付、功能解锁

**Requirements:** R7, R8, R10

**Dependencies:** U5

**Files:**
- `backend/app/middleware/subscription_enforcement.py` — 订阅限制中间件
- `backend/app/api/payments.py` — 支付 API
- `backend/app/services/payment/` — 支付服务
- `frontend/components/subscription/` — 订阅 UI 组件
- `frontend/app/(dashboard)/dashboard/` — Dashboard 页面

**Approach:**
1. 免费用户尝试访问付费功能（如 AI 内容生成、高级诊断），验证付费墙触发
2. 验证升级提示正确显示
3. 发起 mock 支付，确认支付流程完成
4. 验证支付后用户 plan 升级、配额刷新
5. 验证付费功能解锁
6. 修复变现闭环中的任何错误

**Test scenarios:**
- 免费用户访问付费 API 返回 403 + 升级提示
- `POST /api/v1/payments/create` 创建支付订单
- Mock 支付回调后用户 plan 从 "free" 变为 "pro"
- 付费功能解锁，用户可正常使用

**Verification:** 完整变现闭环走通——注册→诊断→付费墙→支付→解锁

---

## Scope Boundaries

**In scope:**
- 修复部署阻塞问题
- 数据库初始化和迁移
- 服务启动验证
- 核心流程端到端验证
- 验证过程中发现的阻塞 bug 修复
- 审计发现的 P0 问题修复

**Deferred for later:**
- 真实微信/支付宝 SDK 接入
- CI/CD 流水线
- 性能优化和压力测试
- 生产环境域名和 HTTPS 配置
- `.env.production` 文件创建
- Redis 密码保护
- PostgreSQL 弱密码更换
- pgvector 镜像优化（改用 pgvector/pgvector:pg15）
- 前端统一 API 客户端修复（reports、lifecycle/new 页面）
- JWT_SECRET 强密钥生成

**Outside this sprint:**
- UI 打磨和视觉优化
- 新功能开发
- 代码重构
- 完整测试覆盖

## Risks & Dependencies

- **LLM API 可用性**：诊断和内容生成依赖 DeepSeek API，如果 API Key 无效或额度耗尽，诊断会返回空结果。需确认 API Key 有效。
- **pgvector 编译时间**：从源码编译 pgvector 需要安装 build-essential 和 git，首次启动数据库容器可能需要 2-3 分钟。
- **迁移链顺序问题**：Alembic 迁移链可能存在未发现的顺序依赖，create_all + stamp head 策略可绕过此问题。
- **前端构建问题**：ESLint 警告已降级为 warn，但可能存在运行时错误仅在浏览器中暴露。
- **前端 API 客户端不一致**：部分页面绕过统一 API 客户端，认证 token 可能不被附加，导致 401 错误。
- **Docker Hub 网络问题**：国内环境拉取 Docker 镜像可能超时，影响 Docker Compose 部署。

## Sources & Research

- `backend/.env` — 当前环境变量配置，DATABASE_URL 驱动和 JWT_SECRET 已修复
- `backend/app/config.py` — JWT_SECRET >= 32 字符校验逻辑
- `backend/app/database.py` — async engine 配置，确认需要 asyncpg 驱动
- `backend/app/main.py` — FastAPI 入口，28+ API 路由注册，6 层中间件栈
- `backend/Dockerfile` — 健康检查端点错误（/api/health → /health）
- `docker-compose.yml` — 开发环境 4 服务配置，backend environment 覆盖
- `docker-compose.prod.yml` — 生产环境配置，依赖 `.env.production`
- 前序会话 pgvector 安装经验：从源码编译 v0.5.1
- 2026-06-01 全面复盘审计：发现 Dockerfile 健康检查、.env.test、前端 API 客户端等问题
