关于搭建 domjudge 还有其他一些 ICPC Tool 之类的事

总之看官方文档看得简直谜语人……

总结一下:有 DOMjudge 7.3.3, Judgehost, Resolver, Presentation
至于还需要啥后面再看……
这里就记录一下搭建过程,中途还被喷了不会用 docker QAQ

搭建环境:
DOMserver: Ubuntu 20.04(64)
Judgehost: Ubuntu 20.04(64)
CDS: Ubuntu 20.04(64)
Presentation Clients: win10(64)
Presentation Admin: win10(64)
打印机:HP LaserJet M1136 MFP
Win10: 需要支持 bash 环境,以及含有 jdk1.8 及以上
下面从刚重装完系统开始一步一步搞吧(

Domjudge 7.3.3

环境依赖

总之官网上面说的都很谜语人,仿佛默认你都把所有依赖都装好了一样(
首先,默认已经把该换的源都换好了,就执行

sudo apt-get upgrade
sudo apt-get update

然后就开始愉快地装各种依赖了,执行

sudo apt install gcc g++ make zip unzip mariadb-server \
        apache2 php php-cli libapache2-mod-php php-zip \
        php-gd php-curl php-mysql php-json php-xml php-intl php-mbstring \
        acl bsdmainutils ntp phpmyadmin python-pygments \
        libcgroup-dev linuxdoc-tools linuxdoc-tools-text \
        groff texlive-latex-recommended texlive-latex-extra \
        texlive-fonts-recommended texlive-lang-european composer
sudo apt install enscript

执行过程中安装时选择 apache2,在建立 MySQL 时也顺便就把账号密码都搞了。接下来执行

sudo apt install libcurl4-gnutls-dev libjsoncpp-dev libmagic-dev
sudo phpenmod json

于是,你要的依赖都建好啦!

编译 DOMjudge 7.3.3

编译这一步说实话,还是搞了有一点久的……

首先需要创建一个非 root 用户,并且拥有 sudo 权限,执行

useradd -m <username>
passwd <username>

然后输入新用户的密码,之后

vi /etc/sudoers

里面 root 这一行下面加上一行,格式同 root 一行,只是 root 改成用户名。
下面都用 <username> 表示上面新建的用户名。

在 /home/<username>/ 下面下载 DOMjudge

wget https://www.domjudge.org/releases/domjudge-7.3.3.tar.gz

然后解压:

tar -zxvf domjudge-7.3.3.tar.gz

然后

cd /home/<username>/domjudge-7.3.3/

之后就开始编译,执行如下命令:

sudo ./configure --prefix=/home/<username>/domjudge --with-domjudge-user=root --with-baseurl=127.0.0.1
make domserver && sudo make install-domserver

如果要生成更多文档,执行如下命令:

make docs && sudo make install-docs

但至少我这步失败了 233 好像是因为 python 的问题?所以这一步(指生成文档)失败了也不用管。

至此也就编译成功啦

配置数据库

sudo /home/<username>/domjudge/domserver/bin/dj_setup_database -u root install

配置 Web 服务器

cd /home/<username>/domjudge/domserver
sudo ln -s /home/<username>/domjudge/domserver/etc/apache.conf /etc/apache2/conf-available/domjudge.conf
sudo a2enmod rewrite
sudo a2enconf domjudge
sudo systemctl reload apache2
sudo chown www-data:www-data -R webapp/var/*

现在,内网的话就可以访问 http://127.0.0.1/domjudge 然后就看到如下类似界面

反正差不多就行……
此时可以用用户名 admin 和

/home/<username>/domjudge/domserver/etc/initial_admin_password.secret

内的密码来登录管理后台了。

如果是第三方服务器,比如阿里云啥的,要用公网 ip 访问的话检查一下有没有开放 80 端口。

配置 MySQL

执行:

vi /etc/mysql/conf.d/mysql.cnf

然后里面追加下面内容

[mysqld]
max_connections = 1000
max_allowed_packet = 16MB
innodb_log_file_size = 48MB

其中 max_allowed_packet 数值改成两倍于题目测试数据文件的大小,innodb_log_file_size 数值改成十倍于题目测试数据文件的大小。
若使用的是 mariadb,则 /etc/mysql/mariadb.conf.d/50-server.cnf 中 max_allowed_packet 一项也需要修改。

之后执行

sudo systemctl restart mysql

配置 Apache2

vi /etc/apache2/apache2.conf

搜索 KeepAlive 关键字,将其值设为 Off,并在其后新增一行内容:

MaxClients 1000

然后退出,执行

sudo systemctl restart apache2

至此,DOMserver 的配置全部完毕!更多内容可以参考 https://github.com/minorcong/cn-xcpc-docs/blob/master/domserver.md

另外,注意修改下 /etc/php/php版本号/php.ini 的内容,默认上传限制是 2M

Judgehost (docker)

表示实在受不了不用 docker 直接嗯搭的折磨了……所以 Judgehost 就直接用 docker 搭算了(

下载 docker

curl -sSL https://get.daocloud.io/docker | sh

设置 cgroups

然后需要设置本机 cgroups,编辑 /etc/default/grub 文件,将下面这行

GRUB_CMDLINE_LINUX_DEFAULT=""

修改为

GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1"

之后执行

update-grub

然后再重启机子即可,之后检查下 /proc/cmdline 里面有无对应 log,有的话就好耶~
如果没有的话,有些机子可能会被 /etc/default/grub.d/ 里面的东西覆盖,在 update-grub 可以看到 Sourcing 了哪些文件,都检查一下,凡是有 GRUB_CMDLINE_LINUX_DEFAULT 的地方都改一下即可。

运行 Judgehost

接下来就是直接在 docker 里面运行 Judgehost。命令如下:

docker run -d -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name judgehost-0 --hostname judgedaemon-0 -e DAEMON_ID=0 -e CONTAINER_TIMEZONE=Asia/Shanghai -e JUDGEDAEMON_PASSWORD=<domserver password> -e DOMSERVER_BASEURL=<domjudge url> domjudge/judgehost:latest

其中 domserver password 是在

/home/<username>/domjudge/domserver/etc/restapi.secret

里面,domjudge url 就是 domserver 对应的地址,最后要加个 / 符号。

如果要配置多台 Judgehost,就把上面 judgehost-0, judgedaemon-0, 对应编号一起改了,依次递增即可。如果一台机子 CPU 是多核(物理核)的话,核心编号就是 DAEMON_ID,从 0 开始编号。

然后在 domjudge 后台管理界面就应该看得到几个 Judgehost 了,像这样

好,终于把这杀千刀的 Judgehost 配置好了(

配置打印机

这次用的打印机据说有点老了,但还是能用就行。

通过 USB 连接上打印机之后,执行

sudo apt install hplip

除了与 root 用户有关的那个选项注意一下其他一路默认即可。

之后再安装

sudo apt install hplip-gui

之后在打印机连接的情况下再安装

sudo apt install hp-plugins

之后执行

sudo hp-setup

如果没有图形的界面的话,执行

sudo hp-setup -i

然后选择 USB,之后会自动寻找到该打印机,一路安装好即可。

之后去 DOMjudge 后台,找到 print_command(在 Configuration 啥的地方),里面加上一句

enscript -b [username] -a 0-10 -f Courier9 [file] 2>&1

其中 username 就是用户名,0~10 就是每次请求只打印前 10 页。

之后,找个用户来登录,就可以看到上面有个 Print,如图

就可以愉快打印啦~

配置 ICPC Tools

这是个甚么东西?主要就是用来显示一些东西用的,总的来说配好了的话还挺有那味的(

这一部分主要参照 官方文档,但这上面也有一点小错误,这里就整理下吧。

配置 CDS

CDS 又叫 Contest Data Server,主要用以比赛后台的一些管理服务,得先配置好这个才能用其他 Tools(Resolver 除外)。

首先,在 DOMjudge 后台创建一个账号,并且分配其角色为 API reader、API writer、Source code reader,记录下用户名和密码(下面用户名和密码分别称为 usercds 和 usercdspwd)。

之后,在需要运行 CDS 的机子上下载并安装 CDS(这个东西占用资源较大,不太建议把 DOMserver 和 CDS 放一起,当然机子够神的话也无所谓),链接在这里(CDS v2.3.491)
下载好了之后解压,把 wlp 目录重命名为 cds,方便好认些。

接下来,修改 cds/usr/servers/cds/config/cdsConfig.xml,里面所有的内容替换成如下:

<cds>
    <!-- Set location= to a directory that the user running the CDS can write to -->
    <contest location="/home/cds/contest-data" recordReactions="false">
        <!-- Set the url to the URL of your DOMjudge installation, followed by /api/contests/<cid>, where <cid> is your CID or external ID -->
        <!-- Set the user and password to the user you created in the previous step -->
        <ccs
            url="https://www.domjudge.org/demoweb/api/contests/nwerc18"
            user="cds"
            password="somepassword" />
    </contest>
</cds>

其中 location 替换成一个不需要 root 就能访问或者修改的目录(比如

/home/<username>/cds/contest-data

),url 就是

<domjudge url>/api/contests/<contest cid>

,其中 contest cid 就是下面这个

另外还有 user 和 password,分别就对应 usercds 和 usercdspwd。

接下来修改 cds/usr/servers/cds/users.xml,里面的所有用户名不能修改,否则会很麻烦,把所有密码修改一下,为了安全(不修改也可以,但不推荐)。

接下来就可以运行

cds/bin/server start cds

来启动 CDS 了,关闭的话把 start 换成 stop 即可(没有 restart)。
之后,访问

https://<server ip>:8443/

,这里需要保证 8443 端口开放,直接就 ip:8443 即可。忽略 SSL 警告,就会看到如下界面:

点右上角 login,用 users.xml 里面 admin 的信息来登录。

至此,CDS 算是弄好啦

配置 presentation admin

这又是个甚么东西?可以看 这份文档。总之就是个屏幕显示后台管理工具,可以管理多个 Client 的屏幕显示。

这个东西可以装在任意一台电脑上,点这里下载Presentation Admin v2.3.491,并且据说在 macOS 和 Windows 下更不容易挂?

我是在 Windows 下弄的,下载解压之后,在 bash 环境下在该目录内运行(没有 bash 可以装个 git)

ICPC_FONT="Microsoft Yahei" ./presAdmin.sh https://<server ip>:8443/ presAdmin <presAdmin password>

其中 presAdmin 还有其密码见 users.xml,server ip 就是上面说的那个 ip:8443。

要记得一定要加个 ICPC_FONT=”Microsoft Yahei” ,否则可能中文支持有问题。后面 ICPC Tools 所有东西都要加个这个。

之后,会出现这个界面

如果一直显示 Disconnected 就重新试一下。

配置 presentation clients

上面这张图左边一个 Client 都没有,接下来来配置。

同样,这一步我还是选择了一台 Windows 来配置的。下载地址Presentation Client v2.3.491,官方文档见 这里

之后解压,还是在 bash 环境下在该目录下运行

ICPC_FONT="Microsoft Yahei" ./client.sh https://<server ip>:8443/ presentation <presentation password> --name <client name>

其中 presentation 及密码见 users.xml,最后的 name 是指这台 client 的名称,可以不加。

这样执行完之后,会看到整个屏幕都是下面这个

以及 presentationAdmin 这边也多了一台 Client

然后就可以愉快体验辣(

配置 Resolver(滚榜)

这一步也是很多坑……

一场比赛结束后,首先在 DOMjudge 上 Finalize 这场比赛,之后去

http://<domjudge url>/api/contests/<cid>/event-feed?stream=false

下载 event-feed。下载完之后,加一个 .json 后缀名,之后来下载 Resolvers,这一步还是在 Windows 上面搞。

之后打开 awards.bat,并且在 Disk 里面找到 event-feed.json,这一步可能会提示这个

一般来说是没有 Finalize 的问题,但也有可能 Finalize 了也有这个。这里不管,点右上角 Save,保存一个 json 文件,姑且命名为 test.json。

之后仍然在 bash 环境下运行

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

注意:这一步不要./resolver.sh,亲测有点问题。最后的 –test 是在有前面那个 Warning 的情况下加的。

然后就可以愉快滚榜啦,具体操作见官方文档

References

CN-XCPC-DOCS
计算机 · DOMjudge Docker 配置
Connecting the ICPC Tools with DOMjudge
ICPC Tools
docker hub – domjudge
DOMjudge Manual 7.3
ICPCToy – DOMjudge

关于搭建 domjudge 还有其他一些 ICPC Tool 之类的事》上有4个想法

  1. 求救为什么配置Judgehost的时候一直提示这行语句缺少一个选项呢,孩子要傻了
    docker run -d -it –privileged -v/sys/fs/cgroup:/sys/fs/cgroup:ro –name judgehost-0 –hostname judgedaemon-0 -eDAEMON_ID=0 -e CONTAINER_TIMEZONE=Asia/Shanghai -e JUDGEDAEMON_PASSWORD=pllC68wxHGJCM3am -e DOMSERVER_BASEURL=123456/domjudge/judgehost:latest (ip是填好的)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注