【技术文档】DOMjudge部署手册(Docker版)与ICPC-Tools配置

校程序设计竞赛的筹办期间决定使用DOMjudge作为评测系统,因此考虑进行本地部署,过程中通过官方手册、网上各类教程进行了学习与配置,但过程并非顺利,本文一方面为自己的部署过程的记录,另一方面也提供一种可能的部署方法以供参考。

本文采用docker进行安装,操作系统为Ubuntu20.04

1. 相关版本信息

操作系统:Ubuntu 20.04(所用镜像为ubuntu-20.04.6-desktop-amd64.iso)

DOMjudge:8.2.2

docker:26.1.2

2. 组成部分简述

DOMjudge的组成其实官方中文文档描述的相当清楚了,简单来说包含三个部分:数据库、domjudge server、judgehost。

domjudge server提供前后端服务,与数据库相连,同时统一控制一或多台judgehost,方式为轮询,因此在只有一台domjudge server的情况下,可能会收到网络瓶颈的影响。

judgehost为评测机,处理运行提交的代码并返回结果。

本文方法中以上三部分均由docker进行部署!!

3.准备工作

包括docker的安装与cgroups的配置,后者为了对进程的资源进行限制,实现docker容器间的隔离。

docker的安装

这里使用sh脚本的安装方式,指令如下。

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

这里可以进行一下镜像源的更换,最后执行以下指令使命令生效。

sudo systemctl daemon-reload
sudo systemctl restart docker

使用以下命令查看docker版本以验证安装是否成功。

docker version

例如下图所示,可以顺利打印版本信息,成功安装。

在这里插入图片描述

cgroups配置

使用vim或者vi等文本编辑工具编写/etc/default/grub的文件内容。

找到GRUB_CMDLINE_LINUX_DEFAULT,进行如下修改,并保存退出。

GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1 systemd.unified_cgroup_hierarchy=0"

例如下图所示。

在这里插入图片描述

执行以下命令更新grub配置。之后重启系统使配置生效。

update-grub

4. 数据库与前后端服务配置

数据库配置

使用命令如下,该命令将生成一个docker容器,其中运行mariadb,命名为dj-mariadb。

sudo docker run -d -it --name dj-mariadb -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_USER=domjudge -e CONTAINER_TIMEZONE=Asia/Shanghai -e MYSQL_PASSWORD=123 -e MYSQL_DATABASE=domjudge -p 13306:3306 mariadb --max-connections=1000 --max-allowed-packet=1073741824 --innodb-log-file-size=536870912

其中参数MYSQL_ROOT_PASSWORD和MYSQL_PASSWORD需要进行密码的指定。

–max-connections最大连接数设置为1000即可,–max-allowed-packet设置为1G(1073741824字节),–innodb-log-file-size设置为512M(536870912字节)。前者需要是最大测试点的2倍大小以上,后者为最大测试点10倍大小以上。

DOMjudge Server的配置

使用命令如下,

sudo docker run --link dj-mariadb:mariadb -d -it -e MYSQL_HOST=mariadb -e MYSQL_USER=domjudge -e MYSQL_DATABASE=domjudge -e CONTAINER_TIMEZONE=Asia/Shanghai -e MYSQL_PASSWORD=123 -e MYSQL_ROOT_PASSWORD=123 -p 80:80 --name domserver domjudge/domserver:latest

其中参数MYSQL_ROOT_PASSWORD和MYSQL_PASSWORD与数据库中指定的密码需要一致,数据库名称为dj-mariadb不变即可。其余-p参数是指定前端服务的开放端口,这里设置为80(其它也可以),则直接访问主机IP即可访问到。

最后的domjudge/domserver:latest设置了domserver的镜像版本为最新,可以指定版本,如domjudge/domserver:8.2.2,这个版本需要与后续的judgehost的配置一致。

后台访问

至此基于docker完成了数据库和前后端应用的配置。

对于前后端应用,直接访问IP:Port即可进入前端页面,有一个默认的管理员账户admin,对于admin的密码,执行以下命令可以获取

sudo docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret

对于密码,例如下图所示。

在这里插入图片描述

5. judgehost评测机配置

单评测机配置

指令如下

sudo docker run -d -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name judgehost-0 --link domserver:domserver --hostname judgedaemon-0 -e DAEMON_ID=0 -e JUDGEDAEMON_PASSWORD=KEYKEYKEY -e CONTAINER_TIMEZONE=Asia/Shanghai domjudge/judgehost:latest

其中–link指令指定了链接的前后端应用,–name指定了开启的容器名称,–hostname指定了当前评测机的名称(这在DOMjudge后台可以看到),DAEMON_ID指定占用的CPU核,。

由于是DOMjudge server统一控制,使用一个密钥KEY进行判别,即子段JUDGEDAEMON_PASSWORD的值,对于密钥KEY的获取方式,执行以下命令可以得到。

sudo docker exec -it domserver cat /opt/domjudge/domserver/etc/restapi.secret
多评测机部署

只需要修改–name、–hostname、DAEMON_ID三者即可。

首先可以手动配置,当然这太麻烦了(其实也没有多麻烦,要几个评测机打几遍就好了,容器run起来之后随时可以关闭启用),也可以使用docker-compose,但我在配置过程中出现了错误,未解决,遂放弃使用docker-compose的多评测机的配置方法。

使用了最古老最简单的的shell脚本循环的方式。。如下(dom_start_judgehost.sh)。

执行sh dom_start_judgehost.sh KEY num。即可完成多评测机的部署,KEY为前面步骤获取的密钥KEY,num为准备开启的评测机的数目。

#!/bin/bash
key=$1
judgehostnum=$2
for hostid in $(seq $judgehostnum)
do
	sudo docker run -d -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup --name judgehost-$hostid --link domserver:domserver --hostname judgedaemon-$hostid -e DAEMON_ID=$hostid -e CONTAINER_TIMEZONE=Asia/Shanghai -e JUDGEDAEMON_PASSWORD=$key domjudge/judgehost:latest
done

6. 手动检查

主要检查docker中的容器是否都处于正常运行状态。使用命令sudo docker ps -a查看。例如下图所示。其中开启了8个评测机judgehost、1个数据库、一个DOMjudge server,并且都处于正常运行中。

在这里插入图片描述
访问IP,通过admin用户进入后台,可以使用Administrator中的Config checker进行检查。

7. 比赛配置

DOMjudge的后台功能相当强大,琢磨一阵子后基本了解如何使用。

队伍信息导入

需要使用tsv文件进行导入,分为队伍导入和用户导入两部分,对应文件名为teams.tsv和accounts.tsv。

先导入teams.tsv。其中第一行仅包含两个内容:teams和一个1;第二行开始,用八个数据来描述一个队伍,依次为id、ICPCid、队伍类型、队伍名称、校名、校名缩写、国家、校名id。其中id为唯一标识一个队伍的id,但经过尝试,虽然将其设置为不重复值,但是导入DOMjudge后仍为自动生成的id值;ICPCid可以任意进行设置,若无特殊需要;队伍类型固定为3,即参赛者;队名根据实际情况选定;校名、校名缩写、国家等内容若无特殊需要可以设置为空;校名id一般为学校缩写。

可以先在Excel中进行数据的处理,随后复制到tsv文件中(记事本打开即可),建议写上校名id以凑满八个位置,不然还需要键入四个tab。例如以下处理方式。(可能存在一种方式可以设置好team的id,注意复制到记事本后需要确保第一行没有额外的空格或者tab)

在这里插入图片描述

其次导入accounts.tsv。其中第一行包含accounts和1。从第二行开始,每条记录用四个数据描述:第一个固定为team;第二个为用户名称,我选用该队的队员名称组合作为用户名称;第三个为用户名;第四个为密码。例如下图。

在这里插入图片描述
注意,由于用户和队伍是分别导入的,因此有一个将用户和队伍进行配对的规则,即看用户的用户名,去掉开头的字母和前缀0,取非零的数字得到的结果,即为挂载的队伍id,例如team037会挂载id为37的队伍。

由于我导入team后,系统自动分配了队伍id,从37开始,因此我的用户用户名从team037开始。对于密码,开始设置了一样的密码后再导入,DOMjudge提供了密码的随机生成功能,上图即为随机生成后的密码。

赛题配置

下载DOMjudge中的示例赛题文件夹,其中包含problem.pdf(题面)、domjudge-problem.ini(赛题的一些基础配置,如时限、颜色等)、problem.yaml(一般包含题目名称)、data文件夹(数据)。对于data文件夹,其中可以有sample文件夹和secret文件夹,其中sample中的数据可以被选手下载,secret中的数据即为评测数据。需要注意测试数据需要以in和ans为后缀。

需要注意,重新压缩文件时要选择以上文件进行压缩,不要选择整个文件夹进行压缩,即要做到:解压你的zip文件后,得到以上具体文件而非一个包含以上文件的文件夹。

比赛设置

对于单次比赛,直接在DOMjudge后台进行contest设置即可,配置过程比较简单,包括比赛开始时间、比赛结束时间、封榜解榜时间、赛题、赛题对应颜色、开放的队伍等。

8. 性能说明

压力测试

开启8个评测机,每个评测机占用单核CPU,设置30个并发进程,一秒请求约4次可AC代码,评测队列几乎没有在queued的。

增加并发进程到50左右,或设置TLE代码,会导致评测队列拥挤,但还是测得过来的。(如下图,宏观来看一秒钟约能过20个O(1)评测,一次刷新能测完100次提交左右)

在这里插入图片描述
结论即,评测机压力不大,主要瓶颈在于网络,测试时使用的百兆网口,100个并发请求狂交代码3分钟左右(就像是100个队伍不写代码疯狂交题的感觉,显然这是不容易出现的情况)后,出现以下状况。于是只能重启容器。

在这里插入图片描述

比赛效果

60队+输出类签到题,没有queued压力,同时评测机所在主机还开了CDS供榜单的显示。

9. ICPC-Tools

比赛中使用ICPC-Tools进行榜单的实时显示。

需要配置三部分内容:CDS(Contest Data Server)、presentation admin、presentation client。

CDS连接到DOMjudge,通过特定的API用户访问比赛信息,presentation admin连接至CDS,进行presentation client的统一控制,presentation client连接至CDS,用于具体内容的显示。

官方网站为:The ICPC Tools | Home

CDS

首先要在DOMjudge中创建一个用户,具有API reader、API writer、Source code reader三个权限,记其用户名和密码分别为cdsuser和cdspwd(可能要符合DOMjudge的密码复杂性规则)。

从官网下载CDS,选用版本为CDS v2.5.1082,开始选定为Stable版本但始终有问题。

在这里插入图片描述
解压下载到的压缩包,记为cds,进入cds/usr/servers/cds/config/cdsConfig.xml,进行内容的修改,大致内容如下。

<cds>
    <!-- location为数据存储的位置,建议为当前用户目录下的某个文件夹,不需要root权限 -->
    <contest location="/home/nbuacm/contest-data" recordReactions="false">
        <!-- url中,domjudgeip为DOMjudge所在的IP,cid为连接比赛的ID,在DOMjudge后台查看即可 -->			<!-- 注意不要使用https,一般DOMjudge服务不支持该协议 -->
        <!-- user和password即为在DOMjudge中创建的cds用户 -->
        <ccs
            url="http://domjudgeip/api/contests/cid"
            user="cdsuser"
            password="cdspwd" />
    </contest>
</cds>

保存后回到cds文件夹所在目录,执行cds/bin/server start cds以启动cds服务器,可以看到cds服务器启动的字样,可以将start换成stop以关闭服务器。服务开放在8443端口,需要使用https协议访问,即访问https://ip:8443,其中ip即为本机的IP。使用浏览器访问该IP,应当能够顺利进入到CDS的后台,能够查看到比赛的相关数据,对于CDS后台的管理员,账号密码默认为admin和adm1n(一般在目录cds/usr/servers/cds/users.xml中,如下图所示)。

在这里插入图片描述
有文章说不建议将CDS和DOMjudge放在一个主机上,但对于小规模比赛来说,应当是无压力的,可以进行适当的压力测试以验证。

Presentation Admin

称其为显示管理器。同样需要下载客户端,可在官网中下载,两个版本似乎都能够顺利运行。

在这里插入图片描述
显示管理器可以运行在Windows平台上,需要安装java1.8及以上(本人测试使用java17,能够顺利运行)。下载到文件压缩包后解压,包含内容如下。
在这里插入图片描述
使用以下命令进行启动,其中cdsip为CDS服务器所在的主机IP,注意使用https协议,默认的显示管理器的admin账号和密码为presAdmin和padm1n。

ICPC_FONT="Microsoft Yahei" ./presAdmin.bat https://cdsip:8443 presAdmin padm1n

对于上述命令,需要在Bash环境中运行,可以安装一个Git Bash进行运行。顺利的话可以进入显示管理器的客户端界面,如下所示,其中左边部分为连接到同一个CDS的presentation client,右边为显示的样式。

在这里插入图片描述

presentation client

为显示内容的设备,需要安装java1.8及以上(没试过java1.8,本人安装的是java17)。对于下载的版本,使用了最新版v2.5.1082,对于稳定版v2.4.727,出现报错状况,未能成功运行。

在这里插入图片描述

运行命令如下,其中cdsip为CDS所在主机的IP,需要注意要加上/api,账号密码为默认即可,设置–name参数以进行多个显示终端的区分。

ICPC_FONT="Microsoft Yahei" ./client.bat https://cdsip:8443/api/ presentation presentat1on --name "Site 1"

顺利运行的话应当能够直接进入全屏显示的界面,同时在presentation admin中也能够看到指定的设备出现,如下图所示。

在这里插入图片描述
在控制客户端中选择select all即可选择所有被控client,选择右侧显示样式点击apply即可完成显示。如下图所示,为测试的效果,一台被控主机接出三个屏幕以显示倒计时、榜单等信息。

在这里插入图片描述

10. 其它说明

内容可能有不完善,而且可能会因为更新而导致有些操作不可用,配置总是个繁琐的过程,有问题者可以积极提问。本文也参考了很多现有文章的方法,最终找到一个可行的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值