Files
OJ2/docker/compose.dev.yml
T
xuyueandClaude Opus 5 b7adf2993d fix(阶段3): 去掉判题机 token 的弱默认值
F5:token 校验实现本身是对的(用了 timingSafeEqual),问题是缺省值
"oj2-dev-token" 写死在仓库里 —— 写死在仓库里的 token 等于没有 token。

后端改为对齐旧后端 options/options.py:93 的 fail-safe:
env 缺失时生成随机值并在启动日志里告警,判题机连不上,但不会静默用弱默认值。
compose 改为 ${OJ2_JUDGE_TOKEN:?...},未设置直接报错退出。

本地开发怎么设写在 docker/compose.dev.yml 顶部与 .env.example 里:
两个变量名不同(判题机镜像认 TOKEN,后端认 JUDGE_SERVER_TOKEN)但值必须相同。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 01:59:27 -06:00

85 lines
3.0 KiB
YAML

# 本机开发用的依赖服务。判题沙箱单独放,因为它要挂载测试用例目录。
#
# 起: docker compose -f docker/compose.dev.yml up -d
# 停: docker compose -f docker/compose.dev.yml down
# 清空:docker compose -f docker/compose.dev.yml down -v ← 会删掉库里的数据
#
# PostgreSQL 固定 16,与生产版本(16.10)一致 —— 别图新换 17/18,
# 开发环境用了生产不支持的特性,要到切换那天才炸。
#
# 判题机 token 必须自己生成,仓库里不留默认值。第一次起服务前:
#
# TOKEN=$(openssl rand -hex 32)
# echo "OJ2_JUDGE_TOKEN=$TOKEN" >> docker/.env # docker compose 读这里
# echo "JUDGE_SERVER_TOKEN=$TOKEN" >> .env # 后端读这里,两边必须一致
#
# 两个变量名不同但值必须相同:TOKEN 是判题机镜像认的名字,JUDGE_SERVER_TOKEN 是后端认的名字。
# 忘了设 OJ2_JUDGE_TOKEN 的话 docker compose 会直接报错退出;忘了设 JUDGE_SERVER_TOKEN
# 的话后端会随机生成一个并在启动日志里告警,判题机心跳会被 403 挡掉。
services:
postgres:
image: postgres:16-alpine
container_name: oj2-postgres
restart: unless-stopped
environment:
POSTGRES_DB: onlinejudge
POSTGRES_USER: onlinejudge
POSTGRES_PASSWORD: onlinejudge
ports:
- "5433:5432" # 5433 避开可能存在的本机 5432
volumes:
- oj2-pgdata:/var/lib/postgresql/data
# 首次启动时自动灌入生产库结构(仅结构,无数据)
- ../docs/specs/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U onlinejudge -d onlinejudge"]
interval: 5s
timeout: 3s
retries: 10
redis:
image: redis:7-alpine
container_name: oj2-redis
restart: unless-stopped
ports:
- "6380:6379" # 6380 避开可能存在的本机 6379
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10
judge:
image: registry.cn-hongkong.aliyuncs.com/oj-image/judge:1.6.1
container_name: oj2-judge
restart: unless-stopped
read_only: true
cap_drop:
- SETPCAP
- MKNOD
- NET_BIND_SERVICE
- SYS_CHROOT
- SETFCAP
- FSETID
tmpfs:
- /tmp
ports:
- "8081:8080"
volumes:
- ../data/test_case:/test_case:ro
- ../data/judge_server/log:/log
- ../data/judge_server/run:/judger
environment:
SERVICE_URL: http://oj2-judge:8080
BACKEND_URL: http://host.docker.internal:3000/api/judge-server/heartbeat
# 没有默认值是故意的:写死在仓库里的弱 token 等于没有 token。
# 未设置时 docker compose 直接报错,不会静默起一个人人可连的判题机。
TOKEN: ${OJ2_JUDGE_TOKEN:?请先设置 OJ2_JUDGE_TOKEN,见本文件顶部注释}
extra_hosts:
- "host.docker.internal:host-gateway"
mem_limit: 512m
volumes:
oj2-pgdata: