feat(deploy): 完成数据迁移与MySQL全链路(14表698k消息100%一致+5方言补丁+bind mount)

- migrate_sqlite_to_mysql.py: 逐表清空重导(幂等),复用repos强转,JSON列
  解析,67万消息按msg_id键集分批,467s跑完14表全一致
- 修4个MySQL实测bug: NULLS LAST语法(compat.py编译补丁)、message.text
  TEXT→MEDIUMTEXT(64KB字节上限,实测20.8万字符车源清单)、URL列
  String(1024)→Text(分享链接超1KB)、垃圾超长member_id源头清理
- compose: media改bind mount(不占C盘Docker虚拟磁盘,实测2.5GB卷把
  C盘撑爆引擎500);mysql不映射宿主机3306
- 前端Dockerfile: npm ci→install(本地/容器npm版本锁漂移)
- 五服务实测:nginx→backend→MySQL全链路返回真实数据(客户6859/A**杰25条
  /搜索56条),媒体49536文件bind mount直读

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
浅念
2026-08-22 12:40:44 +08:00
parent 2175cb0169
commit 00ae13b5c2
6 changed files with 207 additions and 13 deletions
+4 -7
View File
@@ -98,8 +98,9 @@ services:
API_TOKEN: ${API_TOKEN:-}
ENCRYPTION_KEY: ${ENCRYPTION_KEY:-}
volumes:
# Persist downloaded media blobs across container restarts.
- media_data:/data/media
# 媒体走 bind mount(不占 Docker 虚拟磁盘——本机实测 C 盘被 2.5GB
# volume 撑爆导致引擎 500,2026-08-22);服务器上数据直观可见好备份
- ./yunke-server/media:/data/media
ports:
- "8000:8000"
@@ -136,10 +137,7 @@ services:
FULL_SYNC_HOUR: ${FULL_SYNC_HOUR:-2}
MESSAGE_INTERVAL_HOURS: ${MESSAGE_INTERVAL_HOURS:-4}
volumes:
# Share the media volume with backend so both services see the same
# downloaded blobs (read-only would be ideal but the scheduler is the
# writer; mounting read-write here is the simplest correct config).
- media_data:/data/media
- ./yunke-server/media:/data/media
# ----------------------------------------------------------------------- #
# Frontend — built + served by nginx
@@ -159,4 +157,3 @@ services:
volumes:
mysql_data:
redis_data:
media_data: