会话存在 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>
95 lines
3.6 KiB
YAML
95 lines
3.6 KiB
YAML
# 本机开发用的依赖服务。判题沙箱单独放,因为它要挂载测试用例目录。
|
||
#
|
||
# 起: 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:
|