Featured image of post 配置Domjudge and Judgehost(未完结)

配置Domjudge and Judgehost(未完结)

Configure Domjudge and Judgehost (Incomplete)

配置Domjudge and Judgehost(未完结)

写在前面

本文参考DOMJudge 部署教程 | Setiuo’s website

部署环境

domjudge/domserver: 9.0.0

domjudge/judgehost: 9.0.0

mariadb: 11.8.3

System: Ubuntu Server 24.04 LTS

前置工作

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

    1
    
    sudo nano /etc/default/grub
    

    GRUB_CMDLINE_LINUX_DEFAULT项目后面添加以下内容(若没有该项可以自己添加):

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

    重新加载一下 grub 配置

    1
    
    sudo update-grub
    

    重启系统

    1
    
    sudo reboot
    
  2. 安装 docker 和 docker-compose

    docker官方文档:

    Install | Docker Docs

    Install | Docker Docs

    我们使用的:

    • 设置 Docker 的存储库

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      
      # Add Docker's official GPG key:
      sudo apt-get update
      sudo apt-get install ca-certificates curl
      sudo install -m 0755 -d /etc/apt/keyrings
      sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
      sudo chmod a+r /etc/apt/keyrings/docker.asc
      
      # Add the repository to Apt sources:
      echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
        $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
        sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
      sudo apt-get update
      
    • 安装 Docker 软件包

      1
      
      sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
      
    • 验证 Docker

      1
      
       sudo docker run hello-world
      

      如果拉不下来镜像,可以在/etc/docker/daemon.json文件添加以下内容(默认可能没有/etc/docker/daemon.json文件,请自行创建)

      不保证可用,Docker的镜像在国内貌似没有一个正式的组织做。

      1
      2
      3
      4
      5
      6
      7
      
      {
          "registry-mirrors": [
             "docker.1panel.live",
             "docker.m.daocloud.io",
             "docker.1ms.run",
          ]
      }
      

      修改完成后执行命令重启docker:

      1
      
      sudo systemctl daemon-reload && systemctl restart docker
      
    • 把非root用户添加到docker的权限列表中

      1
      
      sudo usermod -aG docker <username>
      

      执行完后重新启动ssh或者终端。

      运行

      1
      
      docker ps
      

      正常输出即表示添加成功。

  • 检查版本来验证 Docker Compose 是否已正确安装

    1
    
    docker compose version
    

    Expected Outuput:

    1
    
    Docker Compose version vN.N.N
    

    接下来,我们在 /etc/docker-compose/ 目录下设置 docker-compose 项目,使得之后在此文件夹里的 docker-compose 项目都可以通过系统服务来进行管理。

    1
    
    sudo mkdir -p /etc/docker-compose
    

    接下来设置一下系统服务,我们创建 /etc/systemd/system/docker-compose@.service 文件

    1
    
    sudo nano /etc/systemd/system/docker-compose@.service
    

    添加以下内容:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    [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
    

    重新载入系统服务配置文件

    1
    
    sudo systemctl daemon-reload
    

配置Dpanel (Lite Version)(可选)

切换到home/dpanel/compose/Dpanel目录下,新建docker-compose.yaml文件,填入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
services:
  dpanel:
    image: dpanel/dpanel:lite
    container_name: dpanel # 更改此名称后,请同步修改下方 APP_NAME 环境变量
    restart: always
    ports:
      - 8807:8080 # 替换 8807 可更改面板访问端口
    environment:
      APP_NAME: dpanel # 请保持此名称与 container_name 一致
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /home/dpanel:/dpanel # 将 /home/dpanel 更改为你想要挂载的宿主机目录

执行

1
docker compose up -d

等待构建成功后访问127.0.0.1:8807即可看到Dpanel面板。

配置Mariadb Domjudge Judgehost(Docker)

Mariadb Domjudge

切换到home/dpanel/compose/Domjudge目录下,新建database.secret,填入

1
2
MYSQL_ROOT_PASSWORD=<YOUR PASSWORD>
MYSQL_PASSWORD=<YOUR PASSWORD>

这将设置你的Mariadb数据库密码。

新建docker-compose.yaml,填入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
services:
  dj-mariadb:
    container_name: dj-mariadb
    image: mariadb:lastest
    restart: unless-stopped
    ports:
      - "13306:3306"
    volumes:
      - ./database:/var/lib/mysql
    env_file: database.secret
    environment:
      - MYSQL_USER=domjudge
      - MYSQL_DATABASE=domjudge
      - CONTAINER_TIMEZONE=Asia/Shanghai
    command: --max-connections=1024 --max-allowed-packet=1G --innodb-snapshot-isolation=OFF --innodb-log-file-size=512M
    healthcheck:
      test: mysqladmin ping -h localhost -u $$MYSQL_USER --password=$$MYSQL_PASSWORD
      start_period: 10s
      interval: 5s
      timeout: 1s
      retries: 5

  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:ro
      - /sys/fs/cgroup/cpuset:/sys/fs/cgroup/cpuset:rw
      - /sys/fs/cgroup/memory:/sys/fs/cgroup/memory:rw
    env_file: judgehost.secret
    environment:
      - CONTAINER_TIMEZONE=Asia/Shanghai
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: dnsrr
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 5

接下来开始初始化 DOMjudge 和数据库

执行

1
sudo docker compose up -d dj-mariadb domserver

如果遇到提示

1
dj-mariadb unhealthy[×]

就执行(也可以通过Dpanel的图形化界面进入容器终端)

1
 docker compose exec dj-mariadb /bin/bash

进入容器后运行

1
2
sudo apt update
sudo apt install mysql-client

完成后Ctrl+D退出容器,再尝试执行

1
sudo docker compose up -d dj-mariadb domserver

正常状态为Healthy。

Judgehost

接下来输入以下指令获取 judgehost 的 API key

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

新建judgehost.secret,填入

1
JUDGEDAEMON_PASSWORD=<GET THIS FROM TERMINAL>

将获取到的 API key 替换 judgehost.secret 文件中的 <GET THIS FROM TERMINAL> 内容。

修改 docker-compose.yml 中 judgehost 服务中的 replicas 值,即可指定判题机个数

1
2
3
4
5
6
 judgehost:
  ...
      deploy:
        ...
        replicas: 2  //修改这里
        ...

然后运行指令启动所有服务

1
sudo docker compose up -d

至此, DOMjudge系统已经部署成功。

管理员账号:admin

密码需要通过如下命令获取:

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

在你确定了 DOMjudge 可以正常使用后,我们创建系统服务以设置开机启动

1
sudo systemctl enable docker-compose@domjudge.service

配置分布式 Judgehost (Docker)(待实践)

如果需要把评测机部署在另外一个Server上,同样需要安装docker

至于grub的设置,参考前文。

然后切换到一个任意可访问的文件位置(如果不安装Dpanel),新建docker-compose.yaml,填入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
services:
  judgehost:
    image: 'domjudge/judgehost:latest'
    links:
      - 'domserver:domserver'
    depends_on:
      domserver: { condition: service_healthy }
    privileged: true
    volumes:
      #- /sys/fs/cgroup:/sys/fs/cgroup:ro
      - /sys/fs/cgroup/cpuset:/sys/fs/cgroup/cpuset:rw
      - /sys/fs/cgroup/memory:/sys/fs/cgroup/memory:rw
    env_file: judgehost.secret
    environment:
      - CONTAINER_TIMEZONE=Asia/Shanghai
      - DOMSERVER_BASEURL=<yourDomjudgeIP>
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: dnsrr
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 5

注意:请添加DOMSERVER_BASEURL环境变量,具体参考以下官方说明:

  • DOMSERVER_BASEURL (defaults to http://domserver/): base URL where the domserver can be found. The judgehost uses this to connect to the API. Do not add api yourself, as the container will do this!

新建judgehost.secret,填入

1
JUDGEDAEMON_PASSWORD=<GET THIS FROM TERMINAL>

这里方法同上,不再赘述。

运行

1
sudo docker compose up -d

Domjudge后台看到judgehost即可。

配置Live V3(待完善)

调校与定制 |ICPC/live-v3 |DeepWiki

本作品采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可(CC BY-NC-SA 4.0)
文章浏览量:Loading
Powered By MC ZBD Studio
发表了47篇文章 · 总计82.91k字
载入天数...载入时分秒...
总浏览量Loading | 访客总数Loading

主题 StackJimmy 设计
由ZephyrBD修改