Commit Graph

2 Commits

Author SHA1 Message Date
eadfa0b04a 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>
2026-08-16 09:34:39 -06:00
eb849ca5ab fix(镜像): apt 换清华源、去掉用不上的 ca-certificates;补部署脚本
## apt-get update 在服务器上卡死

不是慢,是挂住不返回 —— 本机构建从来没事,所以演练没暴露。换清华源。两个细节:

- trixie 的源是 deb822 格式,在 `/etc/apt/sources.list.d/debian.sources`,
  老的 `sources.list` 在这个基底里是**空文件**,改它没有任何效果。
- **只能换主机名、必须保持 http。** https 源会在这一步失败,因为镜像里还没有根证书。

`ARG APT_MIRROR` 可覆盖。

## ca-certificates 是多余的

原注释写「给 AI 接口的 https 出站用」,不成立:Bun 和 Node 一样内嵌了一份根证书,
走自己那份,不读系统的 /etc/ssl/certs。

实测:把探针二进制丢进裸 debian:trixie-slim(没有 ca-certificates)请求
api.deepseek.com,握手正常、返回 401(没带 key),和装了的镜像行为一致。
去掉之后重新构建,clang-format / ruff 都在,https 出站照旧,487MB → 483MB。

哪天镜像里加了用 OpenSSL 做 TLS 的东西(curl、wget 之类),这条要重新考虑,
注释里写了。

## docker/deploy.sh

没有 git remote 时的部署路径:本机 rsync 推代码 → 服务器上构建 → 起栈 → 冒烟。
默认不推 docker/.env(两边不是一回事,覆盖掉是静默故障),要同步显式 --env。

起栈前两道守卫,就是今天在服务器上真撞到的那两种失败:DATA_DIR 没生效(卷指向
OJ2/data)、DB_HOST 没生效(DATABASE_URL 还指着试跑形态下并不存在的 oj-postgres)。
两道守卫都用当天那份坏 env 正反跑过:齐全时放行,抹掉这两个变量时都触发。
两半的语法也都 `bash -n` 过(远端那半是 heredoc,单独渲染后再查的)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 09:30:50 -06:00