chore(backend): list_order迁移补齐+Task14类型修正落链+moments每页日志+MsgTypeParam派生+3处文档修正+Dockerfile打包migrations+DEPLOY补迁移步骤

- 9b0d0c133035: wechat_account.list_order 进迁移链(此前仅模型声明,
  干净库 /api/accounts 即 500);sa.inspect 幂等守卫兼容已手动加列的
  smoke.db
- fe63c6789e94(验证中发现的预存缺口,超出原清单): Task 14 的 5 列模型
  类型修正(4×URL String(1024)→Text, db_size Integer→BigInteger)从未落
  链——纯 alembic 新库会复活 >1KB 链接截断;对齐后干净库 alembic check
  全绿。SQLite message 表 batch 重建会掉 FTS 触发器+rowid 脱节(docstring
  记明 ensure_fts+rebuild_fts 修复,smoke.db 已修复验证)
- scrape_via_page: _iter_moments_pages 每页一行进度日志(镜像 _fetch_pages)
- messages: MsgTypeParam=Literal[tuple(_MSG_TYPE_FILTER)] 派生,杜绝
  双处罗列漂移(openapi enum 验证一致,492 绿含 422 行为)
- 文档: ChatGroup 复合PK docstring/groups room_id 多行表述/测试名去
  单行假设;Dockerfile 补 alembic.ini+migrations;DEPLOY 增「数据库
  迁移」节(新库/旧库stamp路径/回填脚本显式DB_URL)+运维表升级行

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
浅念
2026-08-25 20:32:25 +08:00
parent e602822dfb
commit 35bfebd3e3
9 changed files with 226 additions and 24 deletions
+43 -4
View File
@@ -74,14 +74,53 @@ docker compose ps # 五服务全部 Up(healthy)
docker compose logs -f scheduler # 看调度器日志
```
### 4. 验证
### 4. 数据库迁移(alembic schema)
后端启动**不会**自动建表,schema 由 alembic 迁移链管理(镜像已打包
`alembic.ini` + `migrations/`,`DB_URL` 由 compose 注入)。
**新库首次部署**(空 MySQL 直接建全量表):
```bash
docker compose exec backend alembic upgrade head
```
**旧库升级**(2026-08-22 `migrate_sqlite_to_mysql.py` 搬迁产物,没有
alembic_version 表)——2026-08-25 实战踩通的完整路径,原样记录:
```bash
# 1) 前置校验:chat_group 无 NULL owner_account_id(复合 PK 迁移要求 NOT NULL,
# 非 0 则是必须人工核对的数据问题,不要带病升级)
docker compose exec mysql mysql -uyunke -p<密码> yunke \
-e "SELECT COUNT(*) FROM chat_group WHERE owner_account_id IS NULL"
# 2) stamp 到搬迁脚本对应的链上位置,再升级到 head
docker compose exec backend alembic stamp d8eee96cd017
docker compose exec backend alembic upgrade head
```
**每次拉新代码后**:
```bash
docker compose exec backend alembic upgrade head
```
涉及存量数据回填的更新另跑回填脚本(幂等,重跑 0 改动;脚本默认连
`./smoke.db`,服务器上须显式传 DB_URL——容器 env 已带,直接透传):
```bash
docker compose exec backend python -c "import asyncio,os; from scripts.backfill_chat_group_fields import main; asyncio.run(main(os.environ['DB_URL']))"
docker compose exec backend python -c "import asyncio,os; from scripts.backfill_msg_types import main; asyncio.run(main(os.environ['DB_URL']))"
```
### 5. 验证
```bash
curl http://localhost:8000/api/health # {"status":"ok"}
curl http://localhost:5173/ # 前端页面
```
### 5. 数据迁移(把本地 SQLite 数据搬到服务器 MySQL)
### 6. 数据迁移(把本地 SQLite 数据搬到服务器 MySQL)
**方式 A:重抓(推荐,数据最新)**
@@ -100,7 +139,7 @@ DB_URL="mysql+asyncmy://yunke:<密码>@mysql:3306/yunke" \
把本地 smoke.db 和 media/ 目录传到服务器,用 Python 脚本逐表导:
(如有需要我可以写迁移脚本,~100 行)
### 6. 媒体文件
### 7. 媒体文件
媒体存在 Docker volume `media_data` 里。本地已有 2.5GB 媒体的话:
@@ -122,7 +161,7 @@ docker run --rm -v yunke_media_data:/target -v $(pwd):/src alpine \
| 换 cookie | 改 `.env` 的 `YK_COOKIE` → `docker compose restart scheduler backend` |
| 备份 MySQL | `docker compose exec mysql mysqldump -uroot -p<密码> yunke > backup.sql` |
| 备份媒体 | `docker run --rm -v yunke_media_data:/data -v $(pwd):/out alpine tar czf /out/media.tgz -C /data .` |
| 升级版本 | `git pull && docker compose up -d --build` |
| 升级版本 | `git pull && docker compose up -d --build && docker compose exec backend alembic upgrade head`(回填见「数据库迁移」) |
## 已知注意事项