domjudge部署流程

68 阅读7分钟

一、写在前面

笔者为学校ACM新生赛、校赛搭建domjudge比赛环境,为记录踩坑和总结得失,写此博客。

二、domjudge简述

domjudge是github上一个开源项目,包含数据库、web端、服务器和评测机,需要Linux上部署,作用是创建 ICPC类比赛并提供榜单服务

三、正式部署

1.构建Linux系统

笔者采用的是VMware虚拟机,流程为:在中科大源下载unbutu光盘映像文件(注意22.04前的版本docker已停止服务,所以镜像不能下太老的),笔者选择的是24.04版的。然后在VMware里构建新的虚拟机,选择稍后安装系统,然后按照流程指引安装系统即可。此外,首次安装需要下载VMware Tools才可以适配物理机屏幕且开放共享文件夹和共享剪贴板功能。安装VMware Tools步骤很简单,按照AI给的指令一步一步做即可

2.安装domjudge8.3.1

笔者本来想装现在最新的9.0.0,但是由于版本不同导致笔者借鉴的博客很多命令都用不了导致失败,我选择了妥协,依旧用8.3.1

(1)前期准备

这里直接提供指令,参考文章:kisuraop.github.io/posts/4cf21…

sudo apt-get update
sudo apt-get upgrade
sudo apt install acl zip unzip mariadb-server nginx php-fpm php-gd php-cli php-intl php-mbstring php-mysql php-curl php-json php-xml php-zip composer ntp
sudo apt install make gcc g++ debootstrap libcgroup-dev lsof procps libcurl4-gnutls-dev libjsoncpp-dev libmagic-dev
cd /opt/
sudo wget https://www.domjudge.org/releases/domjudge-8.3.1.tar.gz
sudo tar -zxvf domjudge-8.3.1.tar.gz

这段的作用是安装必要依赖和解压domjudge

(2)编译domjudge,配置数据库和web服务器

sudo apt install pkg-config
cd /opt/domjudge-8.3.1
sudo ./configure --prefix=/opt/domjudge --with-domjudge-user=root --withbaseurl=127.0.0.1
sudo make domserver

输入yes

sudo make install-domserver
cd /opt/domjudge/domserver
sudo bin/dj_setup_database -s install
sudo ln -s /opt/domjudge/domserver/etc/nginx-conf /etc/nginx/sitesenabled/domjudge
sudo
 ln -s /opt/domjudge/domserver/etc/domjudge-fpm.conf 
/etc/php/8.3/fpm/pool.d/domjudge.conf
sudo service php8.3-fpm reload

注意一下php的版本要对,最后一句有警告就按他说的做

cd /etc/nginx/sites-enabled
sudo rm default
sudo service nginx reload
cd /opt/domjudge/domserver
sudo chown www-data:www-data -R webapp/public/*

然后在本机linux上访问网站127.0.0.1/domjudge,可以看到已经有界面了

登录账号:admin

密码:

sudo cat /opt/domjudge/domserver/etc/initial_admin_password.secret

执行这条命令

(3)配置php和mysql

sudo apt install vim
cd /etc/php/8.3/fpm/pool.d
sudo vim domjudge.confBASH

打开此文件后找到

php_admin_value[memory_limit]

改成

php_admin_value[memory_limit] = 1024M

继续指令

sudo service php8.3-fpm reload
sudo vim /etc/mysql/conf.d/mysql.cnf

你会看到一行 [mysql] ,把它替换成以下内容:

[mysqld]
max_connections = 1000
max_allowed_packet = 512MB #两倍于题目测试数据大小
innodb_log_file_size = 2560MB #十倍于题目测试数据大小

继续指令

sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf

找到 max_allowed_packet = 1G ,取消这一行的注释。

继续指令

sudo systemctl restart mysql

验证:打开domjudge,点开config checker

(4)配置judgehost(docker版)

指令

sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl softwareproperties-common
curl
 -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key 
add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/dockerce/linux/ubuntu
$(lsb_release -cs) stable"
sudo apt-get update

实测ubuntu24.04版仍可用

若提示“密钥存储在过时的 trusted.gpg 密钥环中”则

cd /etc/apt
sudo cp trusted.gpg trusted.gpg.d
sudo apt-get update

安装docker

sudo apt-get install docker-ce
cd /etc/docker
sudo touch daemon.json
sudo vim daemon.json

粘贴:

{
 "registry-mirrors": ["https://docker.1ms.run"]
}

继续指令

sudo service docker restart
sudo vim /etc/default/grub

找到“GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"”替换成

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

继续指令

sudo cat /opt/domjudge/domserver/etc/restapi.secret

将这里获取的内容放在

sudo update-grub
sudo reboot
sudo docker run -d -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup --name 
judgehost-0 --network="host" -e DAEMON_ID=0 -e CONTAINER_TIMEZONE=Asia/Shanghai 
-e JUDGEDAEMON_PASSWORD=<domserver password> -e 
DOMSERVER_BASEURL=http://localhost/domjudge/ domjudge/judgehost:8.3.1

的上,注意"<>"也要被替换

验证:

如果要继续起judgehost的话,需要把--name和DAEMON_ID后的参数改掉

如果重启虚拟机,导致评测机全部掉线,可以在任意终端键入 sudo docker ps -a 查看 judgehost 的容器编号。 随后键入 sudo docker start ,就可以启动 judgehost 了。其中, 和 为 judgehost docker 容器编号的前四位(当然更长也行)。

3.公网访问

笔者是用学校前辈的云服务器做的公网访问,所以笔者视野只有我这边的操作,云服务器方面笔者不清楚

在github上下载frp:github.com/fatedier/fr…

然后把frpc-stg.toml执行了,等待服务器方面操作即可

四、domjudge的使用教学

domjudge没有汉化版,所以需要理解一些关键词

1.基础配置

Configuration settings → External systems → configuration data external。

Configuration settings → Scoring → Results remap: 将 output-limit 和 no-output 定向为 wrong-answer 。 save 之后如果提示你 Recalculate caches now,就点进去,之后同理。

Configuration settings → Judging → Enable parallel judging 关闭。

Configuration settings → Display → Show flags 关闭。

Configuration settings → Display → Allow team submission download 开启。 Configuration settings → Display → Show language versions 开启。

回到主页,进 Team Categories。 把 visible 的三个组别的 external ID 改成 beginner , advanced 和 observer ,代表零基础组, 有基础组,和打星组。然后把这三个组的 SortOrder 改成同一个数字。

2.队伍导入

队伍上传需要在 import / export 页面下,导入 teams.tsv 和 accounts.tsv 这两个文件。

在编辑这 两个文件时,需要使用UTF-8格式,否则上传失败或导致乱码。

上传顺序为先上传 teams.tsv,再上传 accounts.tsv。

teams.tsv 文件格式如下:

teams 1 唯⼀的队伍ID 唯⼀的外部ID team_category的ID 队名 校名 校名(短) 国家 唯⼀的校名外部ID

不同的信息之间使用 Tab 间隔。

accounts.tsv 文件格式:

⻆⾊(team, admin等) 名字 username password

accounts.tsv 导入的时候也会自动去挂队伍 ID,但方式是跳过 username 前面的非数字字符、再跳 过 0 以后,以剩下的数字字符作为对应的队伍 ID。 

3.题目上传

推荐在import.export以压缩包形式上传

压缩包格式:注意名字必须一致

│ domjudge-problem.ini
│ problem.pdf
│ problem.yaml
│
└─data
 └─secret
 1.ans
 1.in
 2.ans
 2.in
 3.ans
 3.in

problem.pdf:题面。

domjudge-problem.ini:存放该题的评测细节。对于传统题,里面只有时限,第二个颜色改不改都 没有什么影响,可以在 Contest 处自己指定。

problem.yaml:存放该题的评测细节。传统题中里面应该只有题目名字和内存限制(单位MB), name 是题目的名字,memory 是内存限制。

/data/secret:存放评测数据。注意一个 in 对应一个 ans。

/data/sample:存放样例,可供参赛选手下载。

注意压缩包必须在liunx中使用指令压缩,否则会报错

4.开比赛

Contest -> Add new contest 自己设置一下就好了。

建议不要设置 ”Deactive time"。后期比赛可以由自己手动完全结束。

除金银牌数量外,其他选项保 持默认。

下面是部分选项解析:

Runtime as score tiebreaker:程序运行时间显示在榜单上。建议选 "NO"(即默认)

Medals enabled:设置奖牌。这个根据需求自己调整。

Medal categories:可以获得奖牌的选手类型。

Enable public scoreboard:榜单公共可见。在不登录的情况下也可以查看榜单。

Open contest to all teams:比赛所有人可参加。根据需求自行设置。

下面是对选 no 的解析:

"Teams" :可参赛队伍。

"Team categories":可参赛选手类型。

Scoreboard warning message:榜单警示信息。如果填写此项,所填信息会在榜单处显示,无 论比赛是否开始。

五、滚榜 

滚榜在ICPC类比赛中是相当重要的,所以必须要做,只不过新生赛时是学长做的滚榜,我只是学习了过程

首先下载 resolver 工具:github.com/icpctools/i…

比赛结束后,首先在 Contest 页面 “Finalize” 这场比赛,随后使用下面的链接下载比赛数据:

http://domjudge公网网址/api/contests/比赛外部id/event-feed?stream=false

下载完成以后,在event-feed后加上  .json后缀

之后打开 awards.bat,并且在 Disk 里面找到 event-feed.json

打开以后就可以设置奖项这些信息,设置好以后,点击save,保存一个json文件,假设将其命名为 test.json,之后我们就要在bash环境下运行

ICPC_FONT="Microsoft Yahei" ./resolver.bat test.json

六、总结

笔者完全是站在巨人的肩膀上做这个事情,在外人眼里看起来做出一个比赛环境很厉害,实际上这里没有我自己的东西,使用的是开源软件,配置步骤也不是自己琢磨的,只是跟着前辈的博客做,最难的滚榜和公网访问也是学长做的,我只是辅助和学习。

不过在这个过程中我熟悉了Linux系统,大一上一门Linux系统的选修课把我难得要死,现在却感觉很简单,还有熟悉运维工作的内容,和开发确实有很多不一样

以后笔者会逐步提升技术能力,不只是在开发,各个方面都会学习