多评测机配置

这篇文档将指导您为 UOJ 社区版添加多个评测机。

在安装之前,请确保您已经通过安装了新版的 UOJ 社区版;在下文中,我们称该容器为 UOJ 容器。

在原 UOJ 容器所在物理机上安装

使用自动构建的镜像(推荐)

首先,请进入 UOJ 容器,并记录 /opt/uoj/judger/.conf.json 的内容。

执行下面的命令,从 DockerHub 中获取评测机镜像:

sudo docker pull universaloj/uoj-system:judger

请新建文件 judger_env.list,请根据下文说明替换下面的文件内容:

UOJ_PROTOCOL=http
UOJ_HOST=<uoj_host>
JUDGER_NAME=<judger_name>
JUDGER_PASSWORD=<judger_pwd>
SOCKET_PORT=2333
SOCKET_PASSWORD=<socket_pwd>

您需要替换:

  • <judger_name>:新评测机的名称,不应与之前的评测机重复,仅可由小写字母和数字组成。
  • <uoj_host>:UOJ 容器的容器 IP
  • 可通过 docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container_id> 来获得名为 <container_id> 的容器的 IP
  • <judger_pwd>:评测机密码,可以不修改。
  • <socket_pwd>:通讯密码,应与您在第一步中从 UOJ 容器中获得的密码相同。

接下来,在 judger_env.list 所在目录下,执行下面的命令来启动评测机。其中,请将 <judger_name> 替换为评测机的名称。

sudo docker run --name <judger_name> -dit --env-file judger_env.list --cap-add SYS_PTRACE universaloj/uoj-system:judger

启动后,请您查看新启动的评测容器的 IP 并记录下来。之后,您应该进入 UOJ 容器中的 mysql 中的 app_uoj233 数据库, 并将新的评测机的信息用以下命令加入数据库(请不要在网页端后台操作添加):

insert into judger_info (judger_name, password, ip) values ('<judger_name>', '<judger_pwd>', '<judger_ip>');

最后,退出 mysql 和 docker。

此时,如果配置正确,您应该可以在网页端看到新的评测机了。您可以通过同时提交数个死循环程序,来检查多个评测机是否工作正常。

注意:对于每道题,您需要在新评测机配置完成后点击题目管理页面中的“检查配置并同步数据”来将数据同步到每台评测机。

使用 Dockerfile 手动构建

首先,您需要查看 UOJ 容器的 judger 配置并按照其配置配置新的评测机。请先在终端中进入一个临时文件夹,用于存放临时文件。之后,您需要从 UOJ 容器中复制出/opt/uoj/judger/.conf.json

docker cp uoj:/opt/uoj/judger/.conf.json ./conf.json

然后,请您编辑复制出的 conf.json,修改:

  • uoj_host:UOJ 容器的容器IP(某容器的IP可通过命令docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-id>来获取) 。
  • jugder_name:新评测机的名称,不应与之前的评测机重复,仅可由小写字母和数字组成。
  • judger_password:密码,可以不修改。

下一步,您需要通过 Dockerfile 构建新 judger 的镜像。

新建一个名为 Dockerfile 的文件,其内容如下:

FROM ubuntu:18.04
MAINTAINER MascoSkray <MascoSkray@gmail.com>
ARG CLONE_ADDFLAG

WORKDIR /opt
#Update apt and install git
RUN apt-get update && apt-get install -y git
#Clone the latest UOJ Community verison to local
RUN git clone https://github.com/UniversalOJ/UOJ-System.git --depth 1 --single-branch ${CLONE_ADDFLAG} uoj
#Install environment and set startup script
COPY conf.json /opt/uoj/judger/.conf.json
RUN cd uoj/install/judger && sh install.sh -p && echo "\
#!/bin/sh\n\
if [ ! -f \"/opt/uoj/judger/.conf.json\" ]; then\n\
  cd /opt/uoj/install/judger && sh install.sh -i\n\
fi\n\
service ntp start\n\
su judger -c \"/opt/uoj/judger/judge_client start\"\n\
exec bash\n" >/opt/up && chmod +x /opt/up

ENV LANG=C.UTF-8 TZ=Asia/Shanghai
EXPOSE 2333
CMD /opt/up

该 Dockerfile 相对于原始文件,仅增加了将我们修改过的 conf.json 复制到容器的相应位置的代码。在某些国家,由于某些限制,可能导致 clone 过程执行过慢,您可以考虑将仓库手动克隆到您所在国家的代码托管网站。

使用如下命令构建该镜像:

docker build -f Dockerfile .

在经历漫长的等待后,如果构建过程正常,您将可以看到:

Successfully built <image-id>

请记录下 <image-id>

然后,您需要使用刚才构建的镜像启动一个新的评测容器:

docker run -dit --name <judger-name> --cap-add SYS_PTRACE <image-id>

启动后,请您查看新启动的评测容器的 IP 并记录下来。之后,您应该进入 UOJ 容器中的 mysql 中的 app_uoj233, 并将新的评测机的信息加入数据库(请不要在网页端后台操作添加):

insert into judger_info (judger_name, password, ip) values ('<judger_name>', '<judger_password>', '<judger_ip>');

退出 mysql ,按组合键 Ctrl+P+Q 离开并不停止容器。

此时,如果配置正确,您应该可以在网页端看到新的评测机了。

注意:对于每道题,您需要在新评测机配置完成后点击题目管理页面中的“检查配置并同步数据”来将数据同步到每台评测机。

如果需要安装更多评测机,不需要重新构建镜像。请直接使用刚才的命令从之前的镜像启动一个新的 judger 容器。然后,进入这个新的 judger 容器,并编辑 /opt/uoj/judger/.conf.json 为新 judger 的信息。之后,保存文件、退出容器并重启该容器。然后按照第四步的方式将新的评测机加入数据库。

不在原 UOJ 容器所在物理机上安装

我们将 UOJ 容器所在的服务器称作主服务器。

建议主机与评测机在同一内网下,否则数据同步将消耗大量的网络资源。

在此情况下,大体按照前面的方式进行安装,并进行以下修改:

  • uoj_host 修改为主服务器的物理机内网 IP 。
  • 启动新评测机的命令中添加:-p 2333:2333
  • 将评测机加入数据库时填写的 IP 为新评测机容器的物理机内网 IP 。


[CC协议 BY-NC-SA] 署名 - 非商业性使用 - 相同方式共享 @ UOJ部署指北 2018
Home apps close