roj2 是一个基于 Node.js、TypeScript、MongoDB 和外部 judge_server 的在线评测系统。项目提供服务端渲染页面、JSON API、后台评测调度器和 judge 通信驱动,适合校内 OJ、课程训练和小规模题库管理场景。
- 用户注册、登录、会话管理
- 管理员用户审核
- 题目列表、题目详情、题面 Markdown HTML 渲染
- 提交代码、提交列表、提交详情
- 评测结果、测试点结果和提交源码展示
- 管理端题目、用户、提交入口
- MongoDB 持久化存储
- 独立
judge-dispatcher后台评测调度 judge-driverTCP 协议客户端- Docker / Docker Compose 部署
- GHCR 镜像自动构建发布
Browser
-> api-server
-> MongoDB
-> judge-dispatcher
-> judge_server
核心模块:
apps/api-server:HTTP API、页面路由、Pug 模板渲染apps/judge-dispatcher:从 MongoDB 抢占待评测提交,发送给judge_serverpackages/db:MongoDB 数据访问层packages/shared:共享领域类型、状态常量和状态映射packages/judge-driver:judge_serverTCP JSON 协议客户端packages/markdown-renderer:题面 Markdown 渲染
api-server 和 judge-dispatcher 不直接通信。二者通过 MongoDB 的 submissions 集合协作:
PENDING_DISPATCH -> SENT_TO_JUDGE -> JUDGING -> FINISHED / FAILED
- Node.js 25+
- npm
- Docker
- Docker Compose
- MongoDB,默认可由 Compose 启动
judge_server_cpp镜像或源码仓库
推荐使用安装脚本准备 judge_server、构建镜像并拉起服务:
./install.sh可以在一个空目录中执行安装脚本。脚本会在当前目录创建部署所需资源:
judge_server_cpp/
roj2/
docker-compose.yaml
.env
judge_server_config.json
judge_server_testData/
安装过程中会询问 Docker 镜像加速器,默认使用 ghcr.nju.edu.cn,也可以改成其他加速或关闭代理。
更新代码、重建镜像并重启服务:
./install.sh update清理相关容器和本地构建镜像:
./install.sh clear安装完成后访问:
http://127.0.0.1:3300/problems
默认种子账号:
admin / admin123456
demo / demo123456
安装脚本会在部署目录创建:
judge_server_config.json
judge_server_testData/
Compose 会把它们挂载到 judge-server 容器:
judge_server_config.json -> /opt/boxtest/config/config.json
judge_server_testData/ -> /opt/boxtest/testData
题目测试数据目录格式:
judge_server_testData/<pid>/data
默认题目放在仓库内:
packages/db/default_problems/<pid>/content.md
packages/db/default_problems/<pid>/metadata.json
packages/db/default_problems/<pid>/data/
执行 install.sh 时,会把默认题目的 data/ 复制到 judge_server_testData/<pid>/data。
修改 judge_server 配置或测试数据后,建议重启整套服务:
docker compose down
docker compose up -d本仓库提供 docker-compose.yaml,包含:
mongodbjudge-serverapi-serverjudge-dispatcher
使用 GHCR 镜像启动:
docker compose up -d默认 .env.example 会把容器内的 API 3000 端口映射到宿主机 3300:
API_HOST_PORT=3300
查看日志:
docker compose logs -f judge-server judge-dispatcher api-server停止服务:
docker compose down默认镜像:
ghcr.io/rainboyoj/roj2:latest
ghcr.io/rainboyoj/judge-server-cpp:latest
如需指定其他镜像:
IMAGE_NAME=ghcr.io/rainboyoj/roj2:latest \
JUDGE_SERVER_IMAGE_NAME=ghcr.io/rainboyoj/judge-server-cpp:latest \
docker compose up -d代码 push 到 GitHub 的 master / main 分支后,GitHub Actions 会自动构建并发布镜像到 GitHub Container Registry。
镜像地址:
ghcr.io/rainboyoj/roj2:latest
ghcr.io/rainboyoj/judge-server-cpp:latest
拉取镜像:
docker pull ghcr.io/rainboyoj/roj2:latest
docker pull ghcr.io/rainboyoj/judge-server-cpp:latest可用 tag:
latest:默认分支最新镜像master/main:分支镜像sha-<commit-sha>:提交镜像v*:版本 tag 镜像
如果 GHCR package 未设置为 public,拉取前需要登录:
docker login ghcr.io安装依赖:
npm install初始化种子数据:
npm run seed启动 API 服务:
npm run dev:api启动评测调度器:
npm run dev:dispatcher常用检查:
npm test
npm run typecheck如果已经通过 install.sh 拉起了 Docker 服务,并且只想快速修改前端页面或 API 代码,可以使用:
./quick_start_for_test.sh这个脚本会停止 Docker 中的 roj-api-server 和 roj-judge-dispatcher,复用仍在运行的 roj-mongodb 与 roj-judge-server,然后在本地启动:
npm run dev:api
npm run dev:dispatcher
默认访问地址仍是:
http://127.0.0.1:3300/problems
更多细节见 docs/quick_start_for_test.md。
如果要把 /home/rainboy/mycode/problems/roj 里的题目批量导入当前 OJ,可以直接运行:
npm run import:roj脚本会交互式询问 OJ 地址、admin 账号、ROJ 题目目录和题号范围。它会:
- 自动检查题目是否已存在,存在则更新,不存在则创建
- 读取
content.md、readme.md或statement.md作为题面 - 将测试数据同步到
ROJ_JUDGE_TESTDATA_ROOT
默认测试数据目录是:
/home/rainboy/roj_test_dir/judge_server_testData
更多细节见 docs/import-roj-problems.md。
常用环境变量:
| 变量 | 默认值 | 说明 |
|---|---|---|
HOST |
0.0.0.0 |
API 监听地址 |
PORT |
3000 |
API 监听端口 |
MONGODB_URI |
mongodb://127.0.0.1:27017 |
MongoDB 地址 |
MONGODB_DB |
roj_demo |
MongoDB 数据库名 |
JUDGE_SERVER_HOST |
127.0.0.1 |
judge_server 地址 |
JUDGE_SERVER_PORT |
8000 |
judge_server 端口 |
JUDGE_RESPONSE_TIMEOUT_MS |
30000 |
judge 响应超时 |
JUDGE_POLL_INTERVAL_MS |
500 |
dispatcher 轮询间隔 |
JUDGE_LEASE_MS |
30000 |
submission 抢占租约时间 |
docs/judge_flow_source_reading.md:一次评测的完整源码链路docs/source-reading-guide.md:源码阅读顺序packages/judge-driver/README.md:judge TCP 客户端说明docs/docker_one_key_build_and_run.md:Docker 一键构建部署说明docs/windows_docker_desktop_install.md:Windows + Docker Desktop 安装教程docs/quick_start_for_test.md:本地快速调试 Docker 部署服务
当前仓库未声明开源许可证。使用、分发或部署前请先确认项目授权。