D O M j u d g e \Huge{DOMjudge} DOMjudge
文章目录
- 1、系统准备
-
- [设置cgroup(Linux Control Groups)](#设置cgroup(Linux Control Groups))
- [2. 安装 docker 和 docker-compose](#2. 安装 docker 和 docker-compose)
- [3. 部署DOMjudge](#3. 部署DOMjudge)
-
- [(1) 先 `cd` 到 `/etc/docker-compose/` 目录下,创建三个文件。](#(1) 先
cd到/etc/docker-compose/目录下,创建三个文件。) - [(2) 初始化 DOMjudge 系统和数据库](#(2) 初始化 DOMjudge 系统和数据库)
- [(3) 启动判题机](#(3) 启动判题机)
- [(1) 先 `cd` 到 `/etc/docker-compose/` 目录下,创建三个文件。](#(1) 先
- [4. 配置比赛](#4. 配置比赛)
第一次尝试在云服务器上搭建系统,选择 D O M j u d g e DOMjudge DOMjudge的原因是因为之前在比赛过程中的整体体验不错,正好可以作为协会的比赛系统留给以后的学弟学妹。
这次是在云服务器上部署的,系统是Ubuntu22.04,部署在docker-compose中。由于对Linux了解一般,部署过程中遇到了很多问题,现在就记录一下这次遇到的问题。
为什么没有选择其他oj?
其他在线测试系统有很多,无论从页面还是功能都很多,比如 H U S T O J HUSTOJ HUSTOJ, H y d r o Hydro Hydro。但是像 D O M j u d g e DOMjudge DOMjudge这样专门用来比赛的系统却不多, D O M j u d g e DOMjudge DOMjudge可以说是非常经典了,并且支持的功能和设置也很多。适合作为正式比赛oj来用。
D O M j u d g e DOMjudge DOMjudge的优势
- XPCP类的比赛,无论是省赛还是分站赛, D O M j u d g e DOMjudge DOMjudge可以说是十分常见了。这次搭好 D O M j u d g e DOMjudge DOMjudge,平时的训练赛可以在这上面上举行。
- D O M j u d g e DOMjudge DOMjudge支持比赛滚榜,倒计时等等很多插件,可扩展性强,对于正式比赛十分友好。
- D O M j u d g e DOMjudge DOMjudge上创建比赛,上传题目比较方便。
1、系统准备
Linux操作系统的服务器,我的是Ubuntu22.04。
下面的命令默认在非root用户下执行,因此需要root权限的需要在命令前加sudo,若用的root用户,可以不加。
官方文档上讲的十分详细,但是过于详细,对于新手来说可能并不是很友好,但还是强烈建议根据官方文档来进行部署。
在官方文档中,对于部署在本地以及部署在docker中都给出了教程,docker官方也有DOMjudge的安装教程。
DOM的部署共分四个方面:
- 数据库:后台数据库
- domserver:后台服务程序
- judgehost:后台评测机
- web:管理员的web端设置,比赛、题目、判题限制、用户、队伍
设置cgroup(Linux Control Groups)
-
编辑
/etc/default/grub文件(需要sudo权限)bashsudo vim /etc/default/grub -
在
GRUB_CMDLINE_LINUX_DEFAULT项目后面添加以下内容(若没有该项可以自己添加):bashGRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1 isolcpus=2 systemd.unified_cgroup_hierarchy=0" -
修改后重新加载一下
grub配置文件(没有该指令就跳过):textsudo update-grub -
重启系统:
textsudo reboot
等系统重启完成后就行了。
2. 安装 docker 和 docker-compose
docker现在国内的镜像源用不了,只能通过官网来安装,所以如果使用的自己电脑上的虚拟机,或是服务器在国内的,需要访问到外网才行。
还可以手动安装,详细教程参考docker官网,务必参照官方部署文档安装。
接下来,我们在 /etc/docker-compose/ 目录下设置 docker-compose 项目,使得之后在此文件夹里的 docker-compose 项目都可以通过系统服务来进行管理
text
sudo mkdir -p /etc/docker-compose
然后设置一下系统服务,我们创建 /etc/systemd/system/docker-compose.service 文件
text
sudo mkdir -p /etc/systemd/system/docker-compose.service
并用 vim 给该文件中添加以下内容:(同样要注意需要 sudo 权限)
bash
[Unit]
Description=%i service deployed with docker compose
Requires=docker.service
After=docker.service
[Service]
user=root
Type=simple
WorkingDirectory=/etc/docker-compose/%i
ExecStart=/usr/local/bin/docker-compose up --remove-orphans
[Install]
WantedBy=multi-user.target
按 Esc + : + w + q 保存后,接下来我们需要重新载入系统服务配置文件
bash
sudo systemctl daemon-reload
到这一步,我们的准备工作完成了。
3. 部署DOMjudge
(1) 先 cd 到 /etc/docker-compose/ 目录下,创建三个文件。
分别是:
database.secretdocker-compose.ymljudgehost.secret
用 vim 编辑器分别给上面的文件填入如下内容:
bash
MYSQL_ROOT_PASSWORD=<YOUR PASSWORD>
MYSQL_PASSWORD=<YOUR PASSWORD>
bash
version: "3.9"
services:
dj-mariadb:
container_name: dj-mariadb
image: mariadb:latest
restart: unless-stopped
ports:
- "13306:3306"
volumes:
- ./database:/var/lib/mysql
environment:
- MYSQL_USER=domjudge
- MYSQL_PASSWORD=514514
- MYSQL_DATABASE=domjudge
- MYSQL_ROOT_PASSWORD=514514
- CONTAINER_TIMEZONE=Asia/Shanghai
command: --max-connections=1024 --max-allowed-packet=1G --innodb-log-file-size=512M
healthcheck:
test: ["CMD", "/usr/local/bin/healthcheck.sh", "--su-mysql", "--connect", "--innodb_initialized"]
domserver:
container_name: domserver
image: domjudge/domserver:latest
restart: unless-stopped
ports:
- "80:80"
links:
- 'dj-mariadb:mariadb'
depends_on:
dj-mariadb: { condition: service_healthy }
env_file: database.secret
environment:
- MYSQL_HOST=mariadb
- MYSQL_USER=domjudge
- MYSQL_DATABASE=domjudge
- CONTAINER_TIMEZONE=Asia/Shanghai
judgehost:
image: 'domjudge/judgehost:latest'
links:
- 'domserver:domserver'
depends_on:
domserver: { condition: service_healthy }
privileged: true
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup
env_file: judgehost.secret
environment:
- CONTAINER_TIMEZONE=Asia/Shanghai
deploy:
mode: replicated
replicas: 1
endpoint_mode: dnsrr
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 5
bash
JUDGEDAEMON_PASSWORD=<GET THIS FROM TERMINAL>
(2) 初始化 DOMjudge 系统和数据库
首先自己设置一个数据库密码,替换掉 database.secret 文件中的 "<YOUR PASSWORD>" 内容;
然后只运行数据库和后端系统,得以获得判题机 judgehost 的 API key
bash
sudo docker-compose up -d dj-mariadb domserver
输入如下指令获取 judgehost 的 API key
bash
sudo docker exec -it domserver cat /opt/domjudge/domserver/etc/restapi.secret
将获取到的 API key 替换 judgehost.secret 文件中的 内容
(3) 启动判题机
文件默认创建两个判题机,请根据你的实际情况设置判题机的个数,最好 别超过 CPU 的核心数量
修改 docker-compose.yml 中 judgehost 服务中的 replicas 值,即可指定判题机个数
bash
...
judgehost:
...
deploy:
...
replicas: 2 //修改这里
...
...
然后运行指令启动所有服务
bash
sudo docker-compose up -d
过几秒后,我们打开docker列表,发现镜像都成功启动了(我只创建了一个判题机)

此时打开浏览器输入部署机器的 IP 地址即可访问 DOMjudge

管理员账号:admin
密码需要通过如下命令获取
bash
sudo docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret
在你确定了 DOMjudge 可以正常使用后,我们创建系统服务以设置开机启动
bash
sudo systemctl enable docker-compose@domjudge.service
至此, DOMjudge系统已经部署成功。
4. 配置比赛
至此,关于服务器端配置就已经完成了,之后的过程只需要在web端进行操作就行了。
完整的配置出一场比赛,需要实现一下功能:
- 配置比赛可选语言
- 配置题目数据(常规、specialjudge、交互)
- 配置比赛队伍及登陆账号(外部导入、web端手动添加)
设置比赛可选语言、导入题目、导入队伍和账号可以参考下面这两篇博客:
D O M j u d g e DOMjudge DOMjudge本身就已经给出了三个类型的题目各一道,我们可以通过在web端下载题目压缩包来了解上传题目需要的文件格式。
其他的就是关于比赛的一些设置了。
下面这是管理员账号的内容,赛前需要了解清楚。

https://zhuanlan.zhihu.com/p/617103690)
D O M j u d g e DOMjudge DOMjudge本身就已经给出了三个类型的题目各一道,我们可以通过在web端下载题目压缩包来了解上传题目需要的文件格式。
其他的就是关于比赛的一些设置了。
下面这是管理员账号的内容,赛前需要了解清楚。
外链图片转存中...(img-2jBVoRpv-1771420679645)