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:
@@ -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 也中止 —— 那意味着连错库了。
|
||||
|
||||
手动等价于:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user