DOMJudge 部署教程
DOMJudge 部署教程
本文解决了部署DOMJudge时遇到的三个问题:
- judgehost(评测机)无法正常运行
- mariadb无法正常运行(unhealthy)
- docker compose命令不同
部分步骤根据遇到的问题进行了更改
部署DOMJudge的版本为:8.2.3
mariadb版本为:11.6.2
系统版本为:Ubuntu 22.04
注意:以下部署步骤均使用root用户进行,非root用户可能需要添加其它安装步骤。因为使用了root用户,所以以下命令的
sudo
可以省略
安装vim:
sudo apt update
sudo apt install vim
编辑 /etc/default/grub 文件 (需要 sudo 权限)
sudo vim /etc/default/grub
在 GRUB_CMDLINE_LINUX_DEFAULT 项目后面添加以下内容(若没有该项可以自己添加):
GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1 isolcpus=2 systemd.unified_cgroup_hierarchy=0"
修改后重新加载一下 grub 配置文件(没有该指令就跳过):
sudo update-grub
重启系统:
sudo reboot
安装 docker 和 docker-compose
1.可以参照 docker 官方部署文档安装 docker 和 docker-compose:
2.如果你的系统也是Ubuntu 22.04,可以按照以下步骤安装
(1) 设置 Docker 的存储库
# 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
(2) 安装 Docker 软件包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
(3) 通过运行镜像来验证安装是否成功:hello-world
sudo docker run hello-world
如果拉不下来镜像,可以在
/etc/docker/daemon.json
文件添加以下内容(默认可能没有/etc/docker/daemon.json
文件,请自行创建)
{
"registry-mirrors": [
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
修改完成后执行命令重启docker:
systemctl daemon-reload && systemctl restart docker
(4) 检查版本来验证 Docker Compose 是否已正确安装
docker compose version
预期输出:
Docker Compose version vN.N.N
接下来,我们在 /etc/docker-compose/ 目录下设置 docker-compose 项目,使得之后在此文件夹里的 docker-compose 项目都可以通过系统服务来进行管理
sudo mkdir -p /etc/docker-compose
接下来设置一下系统服务,我们创建 /etc/systemd/system/docker-compose@.service 文件
sudo vim /etc/systemd/system/docker-compose@.service
并用 vim 给该文件中添加以下内容:(同样要注意需要 sudo 权限)
如果你是没用过 vim 的新手,你需要知道的是,vim 需要按 i 才会切换成编辑模式
[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 保存后,接下来我们需要重新载入系统服务配置文件
sudo systemctl daemon-reload
到这一步,我们的准备工作完成了。
部署DOMjudge
(1) 先 cd 到 /etc/docker-compose/ 目录下,创建三个文件。
分别是:
database.secret
docker-compose.yml
judgehost.secret
database.secret填入如下内容(将=后面的字段改成自己的密码):
MYSQL_ROOT_PASSWORD=<YOUR PASSWORD>
MYSQL_PASSWORD=<YOUR PASSWORD>
docker-compose.yml填入如下内容:
注意,这部分与原链接不同。原来的教程中部署运行judgehost会出现cgroup目录的读取权限问题,针对该问题增加了
/sys/fs/cgroup/cpuset:/sys/fs/cgroup/cpuset:rw
和/sys/fs/cgroup/memory:/sys/fs/cgroup/memory:rw
挂载设置
version: "3.9"
services:
dj-mariadb:
container_name: dj-mariadb
image: mariadb:11.6.2
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-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:8.2.3
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:8.2.3'
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
judgehost.secret填入如下内容(<GET THIS FROM TERMINAL>需要替换,后面会介绍
):
JUDGEDAEMON_PASSWORD=<GET THIS FROM TERMINAL>
(2) 初始化 DOMjudge 系统和数据库
自己设置一个数据库密码,替换掉 database.secret 文件中的 <YOUR PASSWORD>
内容;
然后只运行数据库和后端系统,得以获得判题机 judgehost 的 API key
sudo docker compose up -d dj-mariadb domserver
关于数据库的设置与原文不同:我们安装的mariadb是11.6.2版本,如果在执行
sudo docker-compose up -d dj-mariadb domserver
后提示dj-mariadb处于unhealthy状态,则需要进入到dj-mariadb容器中,手动安装一下mysql-client:
docker compose exec dj-mariadb /bin/bash
进入dj-mariadb后执行:
sudo apt update
sudo apt install mysql-client
安装完成后Ctrl+D退出容器,再尝试执行sudo docker-compose up -d dj-mariadb domserver
,正常状态为Healthy
启动判题机
接下来输入以下指令获取 judgehost 的 API key
sudo docker exec -it domserver cat /opt/domjudge/domserver/etc/restapi.secret
将获取到的 API key 替换 judgehost.secret 文件中的 <GET THIS FROM TERMINAL>
内容
文件默认创建两个判题机,请根据你的实际情况设置判题机的个数,最好 别超过 CPU 的核心数量
修改 docker-compose.yml 中 judgehost 服务中的 replicas 值,即可指定判题机个数
judgehost:
...
deploy:
...
replicas: 2 //修改这里
...
然后运行指令启动所有服务
sudo docker compose up -d
此时打开浏览器输入部署机器的 IP 地址即可访问 DOMjudge
管理员账号:admin
密码需要通过如下命令获取
sudo docker exec -it domserver cat /opt/domjudge/domserver/etc/initial_admin_password.secret
在你确定了 DOMjudge 可以正常使用后,我们创建系统服务以设置开机启动
sudo systemctl enable docker-compose@domjudge.service
至此, DOMjudge系统已经部署成功。
若你想了解更多信息,可以访问下面的网站:
部署完成后可以使用的快捷命令:
启动所有容器
sudo docker compose up -d
关闭所有容器
docker stop $(docker ps -q)