Skip to content

评测端部署指南

Menci‮ edited this page Nov 16, 2021 · 20 revisions

前言

如果您正在一台从未部署过 SYZOJ 的服务器上部署 SYZOJ 评测端,请确保您已经完成网站端部署指南中的步骤。或者,评测端也可被部署在不同于网站端的服务器上,请自行处理数据同步(推荐使用 Syncthing)。

准备沙箱

SYZOJ 的评测全部在沙箱中进行。其沙箱实现基于 Linux 内核中一些不默认开启的特性,您需要在引导器中添加一些参数来开启这些特性,以 Ubuntu 的默认引导器 GRUB 2 为例,编辑 /etc/default/grub

在其中

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

之后加入 cgroup_enable=memory swapaccount=1 systemd.unified_cgroup_hierarchy=0 syscall.x32=y,变为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cgroup_enable=memory swapaccount=1 systemd.unified_cgroup_hierarchy=0 syscall.x32=y"

运行以下命令更新 GRUB 2 的配置,然后重新启动。

update-grub && reboot

官方提供的沙箱根文件系统基于 Ubuntu 18.04,默认提供对 SYZOJ 网站端中所列的编程语言的评测支持。因为下载沙箱根文件系统所需的时间可能较长,我们把它放到第一步 —— 在下载的过程中,您可以进行其他步骤。

wget -O /sandbox-rootfs.tar.xz https://github.com/syzoj/sandbox-rootfs/releases/download/210521/sandbox-rootfs-210521.tar.xz

建议在下载后检验文件的 MD5 值,如果您的下载无误,输出应为 882b3de905107f5116b227c90c4b8857

将下载好的沙箱根文件系统解压。

mkdir -p /opt/syzoj/sandbox/rootfs
cd /opt/syzoj/sandbox/
tar xvf /sandbox-rootfs.tar.xz

建立一些沙箱需要使用的文件夹。

mkdir -p /opt/syzoj/sandbox/{bin,tmp1}

安装系统依赖项

SYZOJ 评测端需要 Node.js 10,并且包含一些依赖 Boost 库的 C++ 代码,你需要安装基本的编译环境(build-essential)和 Boost 库 libboost-all-dev。依赖的服务有 redis-serverrabbitmq-server

准备 Node.js 10

使用以下命令下载 Node.js 10 并解压:

mkdir -p /opt/syzoj
wget -O /tmp/node-v10.24.1-linux-x64.tar.xz https://nodejs.org/dist/latest-v10.x/node-v10.24.1-linux-x64.tar.xz
tar xf /tmp/node-v10.24.1-linux-x64.tar.xz -C /tmp
mv /tmp/node-v10.24.1-linux-x64 /opt/syzoj/node10
# 如果没有部署过网站端,则安装 yarn
PATH=/opt/syzoj/node10/bin:$PATH /opt/syzoj/node10/bin/npm install yarn -g

下载

使用以下命令创建存放 SYZOJ 评测端程序的目录并从 GitHub 下载 SYZOJ 评测端。

cd /opt/syzoj
git clone https://github.com/syzoj/judge-v3
mv judge-v3 judge
cd judge
PATH=/opt/syzoj/node10/bin:$PATH yarn
PATH=/opt/syzoj/node10/bin:$PATH yarn build

配置

使用以下命令创建用于 SYZOJ 评测端的配置文件。

cd /opt/syzoj
cp judge/daemon-config-example.json config/daemon.json
cp judge/runner-shared-config-example.json config/runner-shared.json
cp judge/runner-instance-config-example.json config/runner-instance.json

如下是您可能需要修改的一些配置项。其中名称加粗的配置项是您很有可能需要修改的。

  • daemon.json
    • ServerUrl:网站端的 Url。
    • ServerToken:需要与网站端 judge_token 相同。
    • TestData:如果您在不同于网站端的主机上部署评测端,请改为本地的数据目录(注意:您需要自行同步测试数据)。
  • runner-shared.json
    • DebugMessageDisplayLimit:调试信息显示字节数的限制。
    • OutputLimit:用户输出显示字节数的限制。
    • StderrDisplayLimit:用户标准错误输出显示字节数的限制。
    • DataDisplayLimit:测试数据输出显示字节数的限制。
    • CompilerMessageLimit:编译信息显示字节数的限制。
    • SpjTimeLimit:Special Judge 的时间限制。
    • SpjMemoryLimit:Special Judge 的内存限制。

使用 systemd

syzoj-judge-daemon.service

[Unit]
Description=SYZOJ judge daemon service
After=network.target rabbitmq-server.service redis-server.service
Requires=rabbitmq-server.service redis-server.service

[Service]
Type=simple
WorkingDirectory=/opt/syzoj/judge
User=syzoj
Group=syzoj
ExecStart=/opt/syzoj/node10/bin/node /opt/syzoj/judge/lib/daemon/index.js -c /opt/syzoj/config/daemon.json

[Install]
WantedBy=multi-user.target

syzoj-judge-runner.service

[Unit]
Description=SYZOJ judge runner service
After=network.target rabbitmq-server.service redis-server.service
Requires=rabbitmq-server.service redis-server.service

[Service]
Type=simple
WorkingDirectory=/opt/syzoj/judge
User=root
Group=root
ExecStart=/opt/syzoj/node10/bin/node /opt/syzoj/judge/lib/runner/index.js -s /opt/syzoj/config/runner-shared.json -i /opt/syzoj/config/runner-instance.json

[Install]
WantedBy=multi-user.target