fix: P4T1审查修复(platform.db入data卷/tzdata注释/corepack钉版/compose版本注记)

- main.py: PLATFORM_DB 挪到 <repo>/data/platform.db——data/ 是 compose
  bind mount,容器/镜像重建不再丢租户注册表;lifespan 对父目录兜底
  mkdir(冷机 data/ 不存在,sqlite 不建父目录)。bootstrap 脚本 --db
  默认值同步锚定 data/。
- 新测试 test_platform_db_defaults_into_data_dir: 常量形状钉死(回退
  仓库根即红)+ 冷机形态下 lifespan 建库于 data/ 内(全量 603)。
- Dockerfile: corepack 钉实测通过的具体版本 0.36.0(不追 latest,构建
  可复现);tzdata 注释照实改写(trixie slim 实测已自带,安装留作基
  镜像漂移保险)。
- docker-compose: 头注释改准确(tenants/=租户库,data/=platform.db+
  uploads);env_file 注记对象式写法需 Docker Compose >= 2.24。
- 实证: compose down/up 重建容器后宿主 ./data/platform.db 仍在,
  healthcheck healthy,/admin/ 200;docker compose build 复验通过。

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-14 08:42:50 +08:00
parent 4f38522759
commit 6100b4eb15
5 changed files with 51 additions and 17 deletions
+12 -6
View File
@@ -28,7 +28,10 @@ logger = logging.getLogger(__name__)
BASE_DIR = Path(__file__).resolve().parents[1]
SEED_DIR = BASE_DIR / "seed_profiles"
TENANTS_DIR = BASE_DIR / "tenants" # .gitignore 已忽略 tenants/*.db
PLATFORM_DB = BASE_DIR / "platform.db" # .gitignore 已忽略 platform.db*
# 平台库落 data/ 子目录(P4T1 审查修复):data/ 是 compose 的 bind mount
# ——容器/镜像重建不丢租户注册表(租户库本就在挂载的 tenants/ 内);
# .gitignore 的 data/ 规则覆盖其运行产物。
PLATFORM_DB = BASE_DIR / "data" / "platform.db"
# ---- admin 前端生产服务(Phase 4 Task 1)---------------------------------------
@@ -116,13 +119,16 @@ async def lifespan(app: FastAPI):
f"TENANT_SOURCE 只允许 db|file(实际 {tenant_source!r})")
# 平台库测试缝(Phase 2 Task 1,同 registry 缝模式):预置过
# app.state.platform_engine(临时库)则沿用——不预置则每个 TestClient
# 测试都会在仓库根建出真实 platform.db。schema+bootstrap 无条件跑
# (两者幂等):预置引擎同样被建到可用,Task 2 起认证测试直接可用。
# 装配次序(Task 11 起)engine 先于 registry:db 源 registry 构造即需
# 持有 platform_engine。
# app.state.platform_engine(临时库)则沿用——不预置则会在 <repo>/data/
# 下建出真实 platform.db(生产;测试必须预置或锚到 tmp)。schema+
# bootstrap 无条件跑(两者幂等):预置引擎同样被建到可用,Task 2 起
# 认证测试直接可用。装配次序(Task 11 起)engine 先于 registry:db 源
# registry 构造即需持有 platform_engine。
platform_engine = getattr(app.state, "platform_engine", None)
if platform_engine is None:
# sqlite 不建父目录——冷机 data/ 可能尚不存在(全新检出/新容器),
# 连接前兜底建目录(registry._ensure_ready 同纪律)
PLATFORM_DB.parent.mkdir(parents=True, exist_ok=True)
platform_engine = make_platform_engine(PLATFORM_DB)
app.state.platform_engine = platform_engine