chore(部署): 服务器的数据库和 Redis 改由 OJ2 自己起,不用再改 OJDeploy 下的 compose;附一次性搬家脚本
Deploy / deploy (push) Canceled after 0s

compose.debian.yml 去掉外接形态,postgres / redis 固定由本栈起(PostgreSQL 18、Redis 8)。
docker/move-db-into-oj2.sh 把服务器上旧栈的 16 / 7 倒进来:先编镜像、确认机房已断开、
备份、恢复时剥掉 dump 里的 md5 口令(18 只认 SCRAM)、核对行数和网络登录,最后交给 deploy.sh。

生产库口令原来是默认的 onlinejudge(超级用户、5445 对公网开着),脚本要求换成强口令才执行。

本机按线上「之前」的状态完整演练过:停机到恢复 36 秒,行数一致,登录态保住,提交照常判题。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-13 21:10:09 +08:00
1 parent fad43f513f
commit 625bd49801
7 files changed
+350 -239

No files matched your search

+6 -11
View File
@@ -4,14 +4,10 @@
#
# ## 为什么不走 docker compose exec
#
# 线上是**外接形态**:postgres 容器由 /root/OJDeploy/docker-compose.yml 起,不归
# OJ2 这套 compose 管。compose.debian.yml 里虽然也定义了 oj-postgres,但它挂着
# `profiles: ["local-data"]`,只在「自带数据」形态下才启动。所以在 OJ2 目录里跑
#
# docker compose exec -T oj-postgres pg_dumpall ...
#
# 会报 `service "oj-postgres" is not running` —— 容器明明在跑,只是属于另一个
# compose 项目。这里直接按容器名 `docker exec`,跟谁起的无关,两种形态都能用。
# 按容器名 `docker exec`,跟容器是谁起的无关:以前线上的 postgres 由旧栈那份
# /root/OJDeploy/docker-compose.yml 起,在 OJ2 目录里 `docker compose exec` 会报
# `service "oj-postgres" is not running`。现在它归 compose.debian.yml 了,但按名字找
# 照样能用,move-db-into-oj2.sh 搬家时也靠这一点去备份旧容器(CONTAINER=旧容器名)。
#
# ## 用法
#
@@ -104,9 +100,8 @@ human() {
say "自检"
docker ps --filter "name=^/${CONTAINER}\$" --filter status=running -q | grep -q . \
|| die "容器 $CONTAINER 没在跑。用 CONTAINER=... 指定容器名;外接形态下它由
/root/OJDeploy/docker-compose.yml 起:
docker compose -f /root/OJDeploy/docker-compose.yml up -d $CONTAINER"
|| die "容器 $CONTAINER 没在跑。用 CONTAINER=... 指定容器名;服务器上它由本栈起:
docker compose -f docker/compose.debian.yml --env-file docker/.env up -d $CONTAINER"
# 用 psql 真连一次,不用 pg_isready:后者只探「服务在不在」,DB_USER 写错照样说 OK,
# 要等到 pg_dumpall 那步才炸出一句 role does not exist