一、写在前面
笔者为学校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系统的选修课把我难得要死,现在却感觉很简单,还有熟悉运维工作的内容,和开发确实有很多不一样
以后笔者会逐步提升技术能力,不只是在开发,各个方面都会学习