299 lines
11 KiB
Markdown
299 lines
11 KiB
Markdown
---
|
||
title: "chore: GEO Platform Launch Readiness Sprint"
|
||
type: chore
|
||
status: active
|
||
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 客户端等问题
|