Files
OJ2/docker/.env.example
yuetsh cbff292551 feat(切换): compose 支持「只换前后端」,接着用旧栈的 postgres/redis
演练把一件事盖住了:当时是把生产 dump 恢复进 `OJ2/data/postgres` 的,
所以没人发现新 compose 在 `OJ2/docker/` 下,`../data` 解析出来是 `OJ2/data`,
而旧栈用的是 `<部署目录>/data`(服务器上是 `/root/OJDeploy/data`)。

照原手册切过去,postgres 会在一个空目录上初始化一个全新的空库 —— 站点起得来,
但没有用户没有题、判题全挂、题面图片 404。旧数据完好,回滚正常,但当天会白吓一场。

## 改法

三组 env 旋钮,默认值保持原样,不影响本机和演练那条路:

    DATA_DIR    所有数据卷的根,默认 ../data
    DB_HOST/PORT      默认 oj-postgres:5432
    REDIS_HOST/PORT   默认 oj-redis:6379

postgres 和 redis 挪进 `profiles: ["local-data"]`,默认不起 —— 否则会跟旧栈
那两个抢 5445 / 5446。配套给 depends_on 加 `required: false`:实测严格的
depends_on 碰上未启用的 profile 会让整个 project 直接 invalid,不是可选项。
代价写进注释了:自带数据形态下 postgres 起不来时 compose 只警告不中止。

给 api / worker 加 host-gateway 映射,DB_HOST 填 host.docker.internal 就行,
不用去猜 docker0 的网段。数据库流量不出本机。

school 那套的 7 个挂载点同样换成 DATA_DIR —— 机房那台也有自己的旧数据目录,
测试点和题面图片都在里面,同一个坑。

## 验证

用 docs/specs/schema.sql 起了个发布在宿主机 5445 的 postgres 冒充旧栈:
正好 4 个容器(没有 postgres/redis)、oj-api healthy、首页与 /api/site
/api/problems 200、未登录进后台 401。读写两个方向都验了 —— 那个库的
pg_stat_activity 里有来自 172.17.0.1 的 postgres.js 连接,judge_server 表里
也出现了新判题机写进去的心跳行。

四份 compose 的 `config -q` 全通过。

手册第三、四、六节按这个形态重写:停旧栈改成只 stop oj-backend / oj-judge
(旧判题机会争 data/judge_server/run,旧 backend 占着 8080),回滚变成把这两个
再 start 起来,数据库进程全程不停。

**DATA_DIR 漏填不会报错**(它有默认值),是切换当天唯一会静默走歪的地方,
手册里给了 `config | grep source:` 的自查和两种症状的区分。

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

53 lines
2.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部署用的环境变量。拷成 .env服务器或 .env.school机房后填。
#
# cp docker/.env.example docker/.env
#
# 仓库里不留任何真实密钥。带 `:?` 的变量没设置时 docker compose 会直接报错退出,
# 不会静默起一个用弱默认值的服务。
# 数据库口令。机房那套连的是服务器的库,两边必须一致。
POSTGRES_PASSWORD=
# 判题机 token。后端和判题机容器读的是同一个变量自己生成
# openssl rand -hex 32
OJ2_JUDGE_TOKEN=
# 判题并发。受判题沙箱能力限制,不是越大越好。
# 服务器 2机房机器宽裕可以给 4。
JUDGE_CONCURRENCY=2
# DeepSeek key用于题解 AI 分析。留空则 AI 功能不可用(其余功能不受影响)。
AI_KEY=
# --- 数据在哪 ---
#
# 这三个变量决定新栈是「自带 postgres/redis」还是「接着用旧栈的」。
#
# DATA_DIR 是所有数据卷的根(库、测试点、上传的图片、判题机日志)。
# **不设的话默认是 `../data`,也就是 `OJ2/data` —— 不是部署目录的 `data/`。**
# 沿用旧数据时必须写成旧目录的绝对路径,例如服务器上:
#
# DATA_DIR=/root/OJDeploy/data
#
# 不设它就等于开一套空数据:空库(站点没有用户没有题)、没有测试点、题面图片 404。
DATA_DIR=
# 库和 redis 的位置。留空 = 用本 compose 自己起的容器(要加 `--profile local-data`)。
# 沿用旧栈那两个容器时这样填(它们已经把端口发布在宿主机上了):
#
# DB_HOST=host.docker.internal
# DB_PORT=5445
# REDIS_HOST=host.docker.internal
# REDIS_PORT=5446
#
# host.docker.internal 由 compose 里的 extra_hosts 映射到 host-gateway不出本机。
# 机房那套没有本地库DB_HOST 不填时默认指向服务器(默认值在 compose.school.yml 里)。
DB_HOST=
DB_PORT=
REDIS_HOST=
REDIS_PORT=
# --- 只有机房那套需要 ---
# 机房走 http 直连 IP没有 TLS必须 false否则 Cookie 发不回来。
COOKIE_SECURE=false