Files
OJ2/docker/compose.dev.yml
T
xuyueandClaude Opus 5.5 5813981bb1 fix(部署): Redis 强制口令,外接形态部署前实测
会话存在 Redis 里(session:<token> → 用户 id),能连上它就能伪造任意用户包括超管的
登录态。旧栈起的 oj-redis 发布在 0.0.0.0:5446、不带口令,2026-09-27 从公网实测
PING 得通。

- compose.debian.yml:REDIS_URL 用 ${REDIS_PASSWORD:?} 带上口令,缺了直接报错;
  自带数据形态的 oj-redis 加 --requirepass,端口只发布在 127.0.0.1
- deploy.sh:外接形态下实测「不带口令连不上、带 docker/.env 的口令连得上」,
  任一条不满足就中止部署
- clear-sessions.sh:从 docker/.env 读口令走 REDISCLI_AUTH;口令为空时不带 -e
  (空的 REDISCLI_AUTH 会发一条 AUTH "",实测会报一行 AUTH failed)
- compose.dev.yml:三个端口只绑 127.0.0.1
- docs/deploy.md 加「Redis 口令」一节:给旧栈 redis 加口令的一次性步骤

旧栈那份 compose 不在本仓库,线上 redis 的口令要照手册在服务器上手工加;
加之前 deploy.sh 会一直拦着。机房的 redis 不发布端口,不需要口令。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 14:51:52 +08:00

95 lines
3.6 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 固定 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:
- "127.0.0.1:5433:5432" # 5433 避开可能存在的本机 5432
volumes:
- oj2-pgdata:/var/lib/postgresql/data
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:
- "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-pgdata: