fix(部署脚本): 改成在服务器上直接跑,加 --check

上一版是从本机 rsync + ssh 过去的,不是想要的形态。改成服务器上跑:
代码怎么上去(rsync / 以后的 git pull)不归它管,脚本只管起栈。

五道自检,前两道是这次在服务器上真撞到的失败:

  compose 版本 ≥ 2.20   depends_on.required 是那版才有的字段
  DATA_DIR              卷指向 OJ2/data → 中止(空数据,且不报错)
  DB_HOST               DATABASE_URL 还指着 oj-postgres → 中止
  JUDGE_STATE_DIR       没设的话新旧两个判题机共用运行目录
  旧栈还活着            oj-postgres / oj-redis 是新栈的上游

--check 只做只读校验,不建目录不动容器(mkdir 挪到起栈那一段了)。

## 跑出来的两个问题

1. 版本比较写反了。原来用 `sort -V -C` 判「这两行本来就有序」,结果本机
   compose 5.4.0 被判成「太老」。改成取 min(2.20, ver),在 1.29.2 / 2.19.9 /
   2.20.0 / 2.24.5 / 5.4.0 / 0 六个值上逐个验过分界。
2. --check 里的 mkdir 会真的建目录,本机跑直接撞权限。挪走了。

自检全路径实跑过:旧栈没起时正确拦下;造两个同名容器冒充旧栈后全绿通过;
抹掉 DATA_DIR / DB_HOST 两条守卫都按预期中止并打出可操作的提示。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 09:34:39 -06:00
parent eb849ca5ab
commit eadfa0b04a
2 changed files with 122 additions and 84 deletions

View File

@@ -236,17 +236,28 @@ JUDGE_STATE_DIR=/root/OJDeploy/data/judge_server_oj2
### 2. 起
有脚本,**本机**跑(没有 git remote 时靠 rsync 推代码)
有脚本,**在服务器上**跑
```bash
docker/deploy.sh # 推代码 → 自检 → 构建 → 起栈 → 冒烟
SERVER=root@1.2.3.4 docker/deploy.sh
cd /root/OJDeploy/OJ2
docker/deploy.sh # 自检 → 构建 → 起栈 → 冒烟
docker/deploy.sh --check # 只自检,只读,不动任何容器
docker/deploy.sh --no-build # 只改了 env / compose 时跳过构建
```
它默认**不推 `docker/.env`**(本机那份和服务器那份不是一回事,覆盖掉是静默故障),
要同步时显式加 `--env`。起栈前有两道守卫,正是今天在服务器上撞到的那两种:
`DATA_DIR` 没生效(卷指向 `OJ2/data`)、`DB_HOST` 没生效(`DATABASE_URL` 还指着
试跑形态下并不存在的 `oj-postgres`)—— 命中任一条就中止,不会起一个看着正常的坏栈。
代码怎么上到服务器不归它管rsync 或以后的 `git pull`,命令在脚本头部注释里)。
起栈前有五道自检,前两道正是这次在服务器上真撞到的:
| 自检 | 拦什么 |
|---|---|
| compose 版本 | `depends_on.required` 要 ≥ 2.20,老版本解析就会失败 |
| `DATA_DIR` | 卷指向 `OJ2/data` → 中止(空数据,静默) |
| `DB_HOST` | `DATABASE_URL` 还指着 `oj-postgres` → 中止(试跑形态下它不存在) |
| `JUDGE_STATE_DIR` | 没设的话新旧两个判题机共用运行目录 |
| 旧栈 | `oj-postgres` / `oj-redis` 得还活着,新栈连的就是它们 |
起完等 `oj-api` healthy再跑四条冒烟题目数是 0 也中止 —— 那意味着连错库了。
手动等价于: