# Project Bootstrap（任务清单）

> 说明：本清单用于把 `plan.md` 拆成“可逐条执行”的任务。执行完成后请把对应项从 `[ ]` 勾选为 `[x]`。

## 0. 约定与前置

- [ ] **确认后端依赖管理方式**：使用 `requirements.txt + pip`
- [ ] **确认环境**：仅 dev / prod
- [ ] **确认 Redis 方案**：单实例 + ACL（`dev:*`/`pro:*`）+ prod `maxmemory=256mb`（硬限制）
- [ ] **确认迁移工具**：Alembic
- [ ] **确认部署方式**：MySQL/Redis 已部署，后端通过环境变量连接（不做 Docker 起 MySQL/Redis）

## A. 现有 MySQL/Redis 验证与环境隔离确认

### A1. MySQL（schema）确认

- [ ] 确认 dev schema：`mindfulness_dev` 已存在（字符集 `utf8mb4`）
- [ ] 确认 prod schema：`mindfulness` 已存在（字符集 `utf8mb4`）

### A2. Redis（ACL + maxmemory=256MB）确认

- [ ] 确认 Redis 已启用 ACL，并存在账号：
  - [ ] `dev_user` 仅允许访问 `~dev:*`
  - [ ] `pro_user` 仅允许访问 `~pro:*`
- [ ] 确认生产环境 Redis 内存限制：
  - [ ] `maxmemory=256mb` 生效
  - [ ] `maxmemory-policy=noeviction` 生效（队列优先，不丢任务）

### A3. Redis ACL 验收（必须可复现）

- [ ] 使用 `dev_user` 写入 `dev:test=1` 成功
- [ ] 使用 `dev_user` 写入 `pro:test=1` 失败（权限不足）
- [ ] 使用 `pro_user` 写入 `pro:test=1` 成功
- [ ] 使用 `pro_user` 写入 `dev:test=1` 失败（权限不足）

### A4. 可选：把现有配置“备份到仓库”（不参与部署）

- [ ] （可选）新建 `infra/redis/users.acl`（把线上 ACL 规则复制备份，注意去掉真实密码）
- [ ] （可选）新建 `infra/redis/redis.prod.conf`（把线上关键参数备份：maxmemory/noeviction/aclfile 等）
- [ ] （可选）新建 `infra/mysql/init/00-create-schemas.sql`（备份 schema 创建脚本）

## B. 后端工程骨架（server/）落地

> 当前 `server/` 目录可能尚未创建代码文件，本阶段目标是“能启动、能连库、能跑迁移、能跑 Celery”。

### B1. 依赖与环境变量模板

- [ ] 新增 `server/requirements.txt`
  - [ ] FastAPI、uvicorn
  - [ ] SQLAlchemy 2.x（异步）+ MySQL driver（如 `aiomysql`）
  - [ ] pydantic-settings（pydantic v2）
  - [ ] alembic
  - [ ] celery、redis（Python 客户端）
  - [ ] pytest
- [ ] 新增 `server/.env.example`（仅字段结构，不含真实值）
  - [ ] `APP_ENV=dev|prod`
  - [ ] `DATABASE_URL=.../mindfulness_dev`（dev）或 `.../mindfulness`（prod）
  - [ ] `REDIS_URL=redis://<user>:<pass>@<REDIS_HOST>:6379/0`
  - [ ] `CELERY_BROKER_URL=redis://<user>:<pass>@<REDIS_HOST>:6379/0`
  - [ ] （默认不写）`CELERY_RESULT_BACKEND`

### B2. FastAPI 最小入口

- [ ] 新增 `server/app/main.py`
  - [ ] 创建 FastAPI 实例 `app`
  - [ ] 增加健康检查接口 `/healthz`
- [ ] 新增 `server/app/core/config.py`
  - [ ] 使用 `pydantic-settings`
  - [ ] 根据 `APP_ENV` 加载 `.env.dev` / `.env.prod`

### B3. SQLAlchemy 与数据库连接

- [ ] 新增 `server/app/db/`（目录）
- [ ] 新增 `server/app/db/session.py`
  - [ ] 从 `DATABASE_URL` 创建 async engine
  - [ ] 提供 session 工厂

### B4. Alembic 初始化

- [ ] 初始化 Alembic：
  - [ ] 生成 `server/alembic.ini`
  - [ ] 生成 `server/alembic/`（env.py / versions/）
  - [ ] 配置从环境变量读取数据库连接
- [ ] 验收：
  - [ ] 能执行 `alembic revision -m "init"`（即使空迁移也可）
  - [ ] 能执行 `alembic upgrade head`

## C. Celery 最小闭环（Redis broker + 队列前缀）

### C1. Celery 入口与任务示例

- [ ] 新增 `server/app/worker.py`
  - [ ] Celery 初始化使用 `CELERY_BROKER_URL`
  - [ ] 默认 **不启用** result backend（或仅 dev 可选）
  - [ ] 配置默认队列名带环境前缀（例如 `dev:push` / `pro:push`）
- [ ] 新增 1 个示例任务（例如 `server/app/tasks/ping.py`）
  - [ ] 任务只传小参数（如字符串/ID）

### C2. Worker/Beat 启动与验收

- [ ] Worker 验收：
  - [ ] `celery -A app.worker:celery_app worker -l info` 可启动
  - [ ] 发送任务后能被消费
- [ ] Beat（如需要定时）：
  - [ ] `celery -A app.worker:celery_app beat -l info` 可启动
  - [ ] 能按周期触发示例任务

## D. 文档与验收补全

### D1. 更新 README 与约定一致

- [ ] 更新 `server/README.md`
  - [ ] 明确：`requirements.txt + pip` 作为依赖安装方式
  - [ ] 明确：dev/pro MySQL schema（`mindfulness_dev`/`mindfulness`）
  - [ ] 明确：Redis ACL + key 前缀、prod `maxmemory=256mb` 硬限制
  - [ ] 明确：Celery 默认不启用 result backend（或启用需 TTL）
- [ ] （可选）更新根 `README.md`
  - [ ] 追加：基础设施依赖与 dev/pro 隔离约定摘要

### D2. 最终验收清单（完成后统一勾选）

- [ ] **环境隔离**：dev/pro MySQL schema 与 Redis ACL 均生效
- [ ] **资源约束**：prod Redis `maxmemory=256mb` 生效
- [ ] **可运行性**：FastAPI/Celery 可启动并完成最小任务闭环（依赖通过环境变量连接现有 MySQL/Redis）

