这篇文章中的内容可能已经过时,请等待后续文档更新。
这篇文档将指导您为 UOJ 社区版添加多个评测机。
在安装之前,请确保您已经通过安装了新版的 UOJ 社区版;在下文中,我们称该容器为 UOJ 容器。
在原 UOJ 容器所在物理机上安装
使用自动构建的镜像(推荐)
首先,请进入 UOJ 容器,并记录 /opt/uoj/judger/.conf.json
的内容。
执行下面的命令,从 Docker Hub 中获取评测机镜像:
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 。