# 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://:@:6379/0` - [ ] `CELERY_BROKER_URL=redis://:@: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)