Files
OJ2/docker
yuetsh e6c8c3c155
Some checks failed
Deploy / deploy (push) Has been cancelled
feat(部署): deploy.sh 识别「自带数据」形态,不再写死试跑假设
旧 Django 后端下线后要把 postgres / redis 收回 OJ2 自己的 compose 管。
compose 那边本来就备好了(oj-postgres / oj-redis 挂在 local-data profile 下,
镜像和旧栈同版本),但 deploy.sh 三处都写死了「并行试跑」的假设,会直接挡住:

- COMPOSE 没有 --profile local-data,自带的两个容器永远不会被启动
- 自检② 见到 DATABASE_URL 指向 oj-postgres 就 die —— 而合并后它必然指向那里
- 自检④ 要求已经有 oj-postgres 在跑 —— 旧的停了、新的还没起,正好卡死

现在按 DB_HOST 是否为空自动判形态。判据用 DB_HOST 而不是另加开关,是因为它本来
就决定了 DATABASE_URL 指向谁;两个变量各说各话迟早会出现「起了自带的库、却连到
别处」这种自相矛盾的状态。

自检② 改成两个方向都查:外接形态下不许指向 oj-postgres,自带形态下必须指向
`oj-postgres:5432`。连端口一起查是因为清了 DB_HOST 却忘了清 DB_PORT 会拼出
`oj-postgres:5445` —— 那是宿主机映射端口,容器网络里不通。

新增自检②b:自带形态下检查 $DATA_DIR/postgres/PG_VERSION 存在且是 16。
这是整个部署里唯一会**静默**走歪的地方 —— DATA_DIR 不对的话 postgres 当成全新
部署,在空目录上初始化一个空库,站点起得来、能注册能登录,就是一道题都没有。

验证:用模拟的 env 跑 `docker compose config` 确认

  --profile local-data  → 服务多出 oj-postgres / oj-redis
  DATABASE_URL          → postgres://onlinejudge:...@oj-postgres:5432/onlinejudge
  REDIS_URL             → redis://oj-redis:6379
  卷                    → /root/OJDeploy/data/{postgres,redis}(旧栈同一批目录)

并验证了「清了 DB_HOST 但忘清 DB_PORT」会被自检②拦下、正常配置会放行。
形态判定对空值 / 非空值 / 缺失三种情况都试过。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 08:19:28 -06:00
..