SZYOJ是一个用于算法竞赛的在线评测系统。拥有这样一个平台之后,我们就可以在平台训练我们的算法能力。

image-20210115233512730

安装前的准备

本教程基于Ubuntu 20.04.1 LTS,部分内容参考官方文档

请参考官方文档进行安装:https://github.com/syzoj/syzoj/wiki

也可参考下方,但是以官方文档为准,下方记录了安装过程中遇到的问题,如果遇到相同问题可参考解决。

安装宝塔面板

请参考:bt.cn

安装完成之后请暂时不要安装任何软件

安装node.js

在软件商店中找到PM2管理器,点击安装

image-20210115221132750

安装完成之后更换nodejs版本为v10.23.1

image-20210115221216300

安装yarn

参考:https://yarn.bootcss.com/docs/install/#debian-stable

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn

通过如下命令测试 Yarn 是否安装成功:

yarn --version

安装网站端

安装系统依赖项

如果使用宝塔面板,那么请不要参考https://github.com/syzoj/syzoj/wiki/%E7%BD%91%E7%AB%99%E7%AB%AF%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97#%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F%E4%BE%9D%E8%B5%96%E9%A1%B9

使用下方方式安装安装 MariaDB 10.3 与 Redis :

在宝塔面板的软件上的分别安装MariaDB和Redis即可,经测试Redis6可用。

image-20210115222203764

安装命令行工具

7z:

这个必须安装,不然导入题目会出错
sudo apt-get install p7zip-full

pygmentize

sudo apt-get install pygmentize

clang-format

sudo apt-get install clang-format

下载

创建存放 SYZOJ 程序的目录并下载安装 SYZOJ。

rm -rf /opt/syzoj /etc/systemd/system/syzoj*
mkdir -p /opt/syzoj
cd /opt/syzoj
git clone https://github.com/syzoj/syzoj web
cd web
yarn

配置

从配置文件模板创建用于 SYZOJ 网站端的配置文件。

mkdir -p /opt/syzoj/config
cp /opt/syzoj/web/config-example.json /opt/syzoj/config/web.json
ln -s ../config/web.json /opt/syzoj/web/config.json

编辑 /opt/syzoj/web/config.json,如下是您可能需要修改的一些配置项。其中名称加粗的配置项是您很有可能需要修改的。

  • title:网站的标题。显示在网站每个页面的左上角与标题栏中。
  • hostname:网站端监听的 IP 地址。如果您按照本教程配置 Nginx 反向代理,请保留默认值 127.0.0.1,否则,如果您希望 SYZOJ 网站能够从本机之外访问,请改为 ::
  • port:网站端监听的 TCP 端口。
  • db:数据库的连接方式。
  • session_secret:为安全起见,请使用随机密钥填写。
  • judge_token:为安全起见,请使用随机密钥填写。
  • google_analytics:如果您使用 Google Analytics 统计您的 SYZOJ 网站访问数据,请设置为 Google 提供的形如 UA-XXXXXXXX-X 的字符串。保留默认值将禁用 Google Analytics。

创建独立的目录用于存放数据和临时文件,这将便于您对网站的维护:

mv /opt/syzoj/web/uploads /opt/syzoj/data
ln -s ../data /opt/syzoj/web/uploads
mkdir /opt/syzoj/sessions
ln -s ../sessions /opt/syzoj/web/sessions

创建数据库

这一步直接在宝塔里面创建数据库即可

image-20210115222633264

运行

执行以下命令以在前台以调试模式运行 SYZOJ,可用于收集错误信息:

cd /opt/syzoj/web && node app.js
# 默认运行在127.0.0.1:5283

image-20210115220734995

使用 systemd

测试完成之后可以添加到systemd开机自启

官方文档讲的有点浅显了

首先打开/etc/systemd/system

然后分别创建以下三个文件,注意是空白文件

image-20210115222855865

syzojweb.service 网站端自启服务

syzoj-judge-daemon.service 评测机daemon

syzoj-judge-runner.service 评测机runner

首先编辑syzojweb.service,这个是网站端,另外两个是评测端,后面会讲到。

[Unit]
Description=SYZOJ web service
After=network.target mysql.service rc-local.service
Requires=mysql.service rc-local.service

[Service]
Type=simple
WorkingDirectory=/opt/syzoj/web
User=syzoj
Group=syzoj
ExecStart=/usr/bin/env NODE_ENV=production /usr/bin/node /opt/syzoj/web/app.js -c /opt/syzoj/config/web.json
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

部署评测端

准备沙箱

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

在其中

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

之后加入 cgroup_enable=memory swapaccount=1,变为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cgroup_enable=memory swapaccount=1"

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

update-grub && reboot

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

这里建议使用科学的上网方式下载下来这个沙箱包,然后放到OSS或者又拍云存储,然后将下方的下载链接替换为加速的链接即可。
wget -O /sandbox-rootfs.tar.xz https://github.com/syzoj/sandbox-rootfs/releases/download/181202/sandbox-rootfs-181202.tar.gz

建议在下载后检验文件的 MD5 值,如果您的下载无误,输出应为 09fe4fc407e4580e9ae4de8e2af5918e sandbox-rootfs.tar.xz

使用以下命令校验md5:

md5sum /sandbox-rootfs.tar.xz

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

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

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

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

安装系统依赖项

sudo apt install xxx # 下方的包名
  • build-essential
  • libboost-all-dev
  • redis-serve
  • rabbitmq-server

下载评测端

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

mkdir -p /opt/syzoj
cd /opt/syzoj
git clone https://github.com/syzoj/judge-v3
mv judge-v3 judge
cd judge
yarn
yarn run 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

首先打开/etc/systemd/system,然后编辑我们上方创建好的另外两个service文件

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=/usr/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=/usr/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 Pages 10

开关前端以及评测机的方式

我们可以使用调试模式开启前台服务,但是会占用一个终端,现在我们配置的service文件就派上了用场:

开启前台web服务:
systemctl start syzojweb
默认运行在127.0.0.1:5283

开启评测机daemon服务
systemctl start syzoj-judge-daemon

开启评测机runner服务
systemctl start syzoj-judge-runner

注册开机自启:
systemctl enable syzojweb
systemctl enable syzoj-judge-daemo
systemctl enable syzoj-judge-runner

关闭服务:
systemctl stop syzojweb
systemctl stop syzoj-judge-daemo
systemctl stop syzoj-judge-runner

遇到的问题及解决方式

评测显示NOTESTCASE

按照官方wiki的路径来一般不会出现这个问题

评测时一直出现wating

这个问题是评测机没有正常运行导致的,使用上方的命令运行即可。

出现无法删除题目,无权限删除题目的问题

这个是路径授权用户的问题,请将data文件夹授权给运行syzoj程序的用户

宝塔MariaDB和命令行装的MariaDB-server冲突导致无法启动

参考:https://blog.csdn.net/w3045872817/article/details/77334886

删除mysql服务

然后删除宝塔安装的mysql

rm -rf /www/server/mysql

然后在宝塔面板重新安装Mariadb即可。

待续...
微信公众号
最后修改:2021 年 01 月 15 日 11 : 36 PM
如果您觉得我的文章有帮助,请随意赞赏!