chore(部署): 服务器的数据库和 Redis 改由 OJ2 自己起,不用再改 OJDeploy 下的 compose;附一次性搬家脚本
Deploy / deploy (push) Canceled after 0s
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:
1 parent
fad43f513f
commit
625bd49801
7 files changed
+350
-239
No files matched your search
+13
-48
@@ -1,51 +1,32 @@
|
||||
# 服务器(xuyue.cc)。数据库在这里,机房那套连的就是这里的 5445。
|
||||
# 服务器(oj.xuyue.cc)。数据库在这里,机房那套连的就是这里的 5445。
|
||||
#
|
||||
# docker compose -f docker/compose.debian.yml --env-file docker/.env up -d --build
|
||||
# docker/deploy.sh # 平时走这个(自检 → 构建 → 迁移 → 起栈 → 冒烟)
|
||||
#
|
||||
# 构建上下文是仓库根,所以 build.context 写 ..(相对本文件)。
|
||||
#
|
||||
# 和旧的 docker-compose.debian.yml 的对应关系:
|
||||
# oj-backend(supervisord 跑 caddy+gunicorn+dramatiq)→ 拆成 oj-web + oj-api + oj-worker
|
||||
# 端口、数据目录、判题机配置全部保持不变,这样回滚只是换回旧 compose。
|
||||
#
|
||||
# ## 两种形态
|
||||
#
|
||||
# **自带数据**(演练用的就是这个):postgres 和 redis 也由本文件起,要显式加 profile。
|
||||
#
|
||||
# docker compose -f docker/compose.debian.yml --env-file docker/.env --profile local-data up -d
|
||||
#
|
||||
# **只换前后端**(默认,上线用这个):旧栈的 postgres / redis 容器继续跑,
|
||||
# 这里只起 api / worker / web / judge,
|
||||
# 通过 env 指过去。切换当天数据库进程根本不重启,库和文件都不用挪位置。
|
||||
#
|
||||
# docker compose -f docker/compose.debian.yml --env-file docker/.env up -d
|
||||
#
|
||||
# 后者要在 env 里设 `DB_HOST` / `REDIS_HOST` / `DATA_DIR`,见 `.env.example` 末尾。
|
||||
#
|
||||
# **并行试跑**(新站挂在 oj2.xuyue.cc、旧站原样不动)是「只换前后端」再加两个变量:
|
||||
# `WEB_PORT`(8080 被旧 backend 占着)和 `JUDGE_STATE_DIR`(两个判题机不能共用运行目录)。
|
||||
# 这种形态下旧栈一个容器都不用停。见手册第四节。
|
||||
# **服务器上的全部容器都由这一个文件起**,包括 postgres 和 redis。以前库和 redis 是旧栈
|
||||
# 那份 /root/OJDeploy/docker-compose.yml 起的、这里通过 DB_HOST 外接过去,升级它们就得去
|
||||
# 改那份文件;2026-10 起收了进来(搬家用 docker/move-db-into-oj2.sh,一次性的)。
|
||||
#
|
||||
# ⚠️ `DATA_DIR` 默认值 `../data` 解析出来是 **`OJ2/data`**,不是部署目录的 `data/`。
|
||||
# 旧栈用的是 `<部署目录>/data/`,两者不是一个地方 —— 直接用默认值切过去,postgres 会在
|
||||
# 空目录上初始化一个全新的空库,测试点和题面图片也全都不在。**用旧数据就必须设 `DATA_DIR`。**
|
||||
# 不设它的话 postgres 会在空目录上初始化一个全新的空库,测试点和题面图片也全都不在,
|
||||
# 而且**不报错**。`deploy.sh` 为此专门设了自检。
|
||||
|
||||
services:
|
||||
oj-postgres:
|
||||
image: postgres:18-alpine
|
||||
container_name: oj-postgres
|
||||
restart: always
|
||||
# 只在「自带数据」形态下启动。用旧栈的库时不启动它 —— 否则 5445 端口会和
|
||||
# 旧的 postgres 撞,而且两个进程开同一个数据目录本来也起不来。
|
||||
profiles: ["local-data"]
|
||||
# 18 起镜像的数据目录是 /var/lib/postgresql/18/docker,挂载点要是上一级,
|
||||
# 还挂 .../data 的话 18 直接拒绝启动。宿主机目录也换了名:`postgres/` 是 16 的老库,
|
||||
# 18 读不了,分开放才能留着它做回退(升级步骤见 docs/deploy.md「PostgreSQL 升级」)
|
||||
# 还挂 .../data 的话 18 直接拒绝启动。宿主机目录叫 `postgresql/`,和旧栈 16 的
|
||||
# `postgres/` 分开:18 读不了 16 的目录,分开放才留得住老库做回退
|
||||
volumes:
|
||||
- ${DATA_DIR:-../data}/postgresql:/var/lib/postgresql
|
||||
environment:
|
||||
POSTGRES_DB: onlinejudge
|
||||
POSTGRES_USER: onlinejudge
|
||||
# 只在空目录上初始化时用一次,之后改它不会改库里的口令(要 ALTER ROLE)。
|
||||
# 这个账号是超级用户、端口又对公网开着,必须是 openssl rand -hex 32 那种强口令
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?请在 docker/.env 里设置 POSTGRES_PASSWORD}
|
||||
# 机房那套要连这个端口,必须对外暴露
|
||||
ports:
|
||||
@@ -60,10 +41,6 @@ services:
|
||||
image: redis:8-alpine
|
||||
container_name: oj-redis
|
||||
restart: always
|
||||
# 同上:旧栈的 redis 也发布了 5446,两个一起跑会撞端口。
|
||||
# redis 里没有非丢不可的东西(会话、判题队列),用旧的那个也无所谓 ——
|
||||
# 旧后端已经停了,新后端独占它,剩下的 Django / dramatiq 残留键前缀不同,互不干扰。
|
||||
profiles: ["local-data"]
|
||||
# 会话存在这里:谁能连上它,谁就能写一条 session:<token> 冒充超管。所以必须带密码,
|
||||
# 端口也只发布在本机(api / worker 走 compose 网络连 oj-redis,用不着宿主机端口)。
|
||||
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD:?}"]
|
||||
@@ -125,26 +102,16 @@ services:
|
||||
container_name: oj-api
|
||||
restart: always
|
||||
depends_on:
|
||||
# required: false —— 「只换前后端」时这两个服务不在启动集合里(profile 未启用),
|
||||
# 严格的 depends_on 会让整个 project 直接判定 invalid(实测过,不是猜的)。
|
||||
# 代价:自带数据形态下 postgres 起不来时,compose 只警告不中止,oj-api 照样起,
|
||||
# 然后自己 crash 循环。看 `docker compose ps`,oj-api 会是 unhealthy。
|
||||
oj-postgres:
|
||||
condition: service_healthy
|
||||
required: false
|
||||
oj-redis:
|
||||
condition: service_healthy
|
||||
required: false
|
||||
# 用旧栈的库时,库在宿主机上(旧 postgres 发布了 5445),走 host-gateway 过去,
|
||||
# 不出本机、不走公网。DB_HOST 填 host.docker.internal 即可。
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
volumes:
|
||||
- ${DATA_DIR:-../data}/backend:/data
|
||||
environment: &api-env
|
||||
DATABASE_URL: postgres://onlinejudge:${POSTGRES_PASSWORD:?}@${DB_HOST:-oj-postgres}:${DB_PORT:-5432}/onlinejudge
|
||||
DATABASE_URL: postgres://onlinejudge:${POSTGRES_PASSWORD:?}@oj-postgres:5432/onlinejudge
|
||||
# 密码拼进 URL,所以只能用 URL 安全的字符 —— 用 openssl rand -hex 32 生成
|
||||
REDIS_URL: redis://:${REDIS_PASSWORD:?请在 docker/.env 里设置 REDIS_PASSWORD}@${REDIS_HOST:-oj-redis}:${REDIS_PORT:-6379}
|
||||
REDIS_URL: redis://:${REDIS_PASSWORD:?请在 docker/.env 里设置 REDIS_PASSWORD}@oj-redis:6379
|
||||
JUDGE_SERVER_URL: http://oj-judge:8080
|
||||
JUDGE_SERVER_TOKEN: ${OJ2_JUDGE_TOKEN:?}
|
||||
JUDGE_CONCURRENCY: ${JUDGE_CONCURRENCY:-2}
|
||||
@@ -168,8 +135,6 @@ services:
|
||||
restart: always
|
||||
depends_on:
|
||||
- oj-api
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
volumes:
|
||||
- ${DATA_DIR:-../data}/backend:/data
|
||||
environment: *api-env
|
||||
|
||||
Reference in new issue
Block a user