Files
OJ2/docker/compose.dev.yml
T
xuyueandClaude Opus 5.5 67590597f1 chore(部署): PostgreSQL 升到 18、Redis 升到 8,附生产库升级步骤
线上的库和服务器的 Redis 不归这几份 compose 管,要按 docs/deploy.md「PostgreSQL 升级」
在服务器上手工换;机房的 Redis 随下次部署换成 8。

本机拿 10-13 的生产备份演练过:恢复后生产库口令是 md5 哈希,18 只认 SCRAM,
不重新存一遍口令的话 api 和机房从网络连都会 password authentication failed。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:48:32 +08:00

98 lines
3.9 KiB
YAML
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.
# 本机开发用的依赖服务。判题沙箱单独放,因为它要挂载测试用例目录。
#
# 起: docker compose -f docker/compose.dev.yml up -d (= bun run db:up)
# 停: docker compose -f docker/compose.dev.yml down
# 清空:docker compose -f docker/compose.dev.yml down -v ← 会删掉库里的数据
#
# 起完库是空的,结构由迁移自己建:
#
# bun run db:migrate # 空库从 0000 自举出全部结构
# bun run seed:dev # 可选,建两个本机用的账号
#
# 以前这里挂一份 schema dump 当 initdb,现在不需要了 —— 0000 就是完整的建表迁移,
# 而且和「灌 dump + 打基线 + 跑迁移」跑出来的结构实测零差异(见 docs/database.md)。
#
# PostgreSQL 的大版本跟生产走(现在是 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:18-alpine
container_name: oj2-postgres
restart: unless-stopped
environment:
POSTGRES_DB: onlinejudge
POSTGRES_USER: onlinejudge
POSTGRES_PASSWORD: onlinejudge
ports:
- "127.0.0.1:5433:5432" # 5433 避开可能存在的本机 5432
volumes:
# 18 起镜像把数据目录挪到了 /var/lib/postgresql/18/docker,挂载点要是上一级。
# 还挂 .../data 的话 18 直接拒绝启动。卷名带版本号:16 的旧卷 oj2-pgdata 不认得,
# 换卷才不会撞(docker volume rm docker_oj2-pgdata 可以清掉)
- oj2-pgdata18:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U onlinejudge -d onlinejudge"]
interval: 5s
timeout: 3s
retries: 10
redis:
image: redis:8-alpine
container_name: oj2-redis
restart: unless-stopped
ports:
- "127.0.0.1:6380:6379" # 6380 避开可能存在的本机 6379
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10
judge:
# 自己构建的判题沙箱(上游 JudgeServer 1.6.1 + 新工具链,见 docker/judge/)。
# 上游停更在 2024-04,registry 上的 1.6.1 == latest,没有新版可拉。
# ⚠️ 这个 tag 不在任何 registry 上:本机 docker/judge/build.sh 构建,
# 服务器/机房用 docker load 装。镜像不在本地时 compose 会去 pull 然后报找不到。
image: oj2-judge-2
container_name: oj2-judge
restart: unless-stopped
read_only: true
cap_drop:
- SETPCAP
- MKNOD
- NET_BIND_SERVICE
- SYS_CHROOT
- SETFCAP
- FSETID
tmpfs:
- /tmp
ports:
- "127.0.0.1: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-pgdata18: