DOMjudge搭建记录

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) 启动判题机)
  • [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的优势

  1. XPCP类的比赛,无论是省赛还是分站赛, D O M j u d g e DOMjudge DOMjudge可以说是十分常见了。这次搭好 D O M j u d g e DOMjudge DOMjudge,平时的训练赛可以在这上面上举行。
  2. D O M j u d g e DOMjudge DOMjudge支持比赛滚榜,倒计时等等很多插件,可扩展性强,对于正式比赛十分友好。
  3. D O M j u d g e DOMjudge DOMjudge上创建比赛,上传题目比较方便。

1、系统准备

Linux操作系统的服务器,我的是Ubuntu22.04。

下面的命令默认在非root用户下执行,因此需要root权限的需要在命令前加sudo,若用的root用户,可以不加。

官方文档上讲的十分详细,但是过于详细,对于新手来说可能并不是很友好,但还是强烈建议根据官方文档来进行部署。

在官方文档中,对于部署在本地以及部署在docker中都给出了教程,docker官方也有DOMjudge的安装教程。

DOM的部署共分四个方面:

  1. 数据库:后台数据库
  2. domserver:后台服务程序
  3. judgehost:后台评测机
  4. web:管理员的web端设置,比赛、题目、判题限制、用户、队伍

设置cgroup(Linux Control Groups)

  1. 编辑/etc/default/grub文件(需要 sudo 权限)

    bash 复制代码
    sudo vim /etc/default/grub
  2. GRUB_CMDLINE_LINUX_DEFAULT 项目后面添加以下内容(若没有该项可以自己添加):

    bash 复制代码
    GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1 isolcpus=2 systemd.unified_cgroup_hierarchy=0"
  3. 修改后重新加载一下 grub 配置文件(没有该指令就跳过):

    text 复制代码
    sudo update-grub
  4. 重启系统:

    text 复制代码
    sudo 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.secret
  • docker-compose.yml
  • judgehost.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)

相关推荐
坂田民工4 小时前
RK3566 AB升级功能
linux·rk3566·buildroot·ab升级
SakitamaX4 小时前
LVS(Linux virual server)介绍与实验
linux·运维·lvs
小义_4 小时前
【Docker】知识八
linux·docker·云原生
开开心心_Every5 小时前
CDR版本转换工具,支持多版本互转免升级软件
linux·运维·服务器·云原生·edge·pdf·serverless
czxyvX5 小时前
009-Linux程序地址空间
linux
苏宸啊5 小时前
进程的概念
linux
yuezhilangniao5 小时前
程序人生-杂谈-简单对比一下 学霸和linux科学设计
linux·程序人生·职场和发展
只想恰口饭5 小时前
程序人生-Hello’s P2P
linux·c语言·ubuntu
hoperest5 小时前
程序人生-Hello‘s P2P
linux·c语言·程序人生·ubuntu