简介
SZYOJ是一个用于算法竞赛的在线评测系统。拥有这样一个平台之后,我们就可以在平台训练我们的算法能力。
安装前的准备
本教程基于Ubuntu 20.04.1 LTS,部分内容参考官方文档
请参考官方文档进行安装:https://github.com/syzoj/syzoj/wiki
也可参考下方,但是以官方文档为准,下方记录了安装过程中遇到的问题,如果遇到相同问题可参考解决。
安装宝塔面板
请参考:bt.cn
安装完成之后请暂时不要安装任何软件
安装node.js
在软件商店中找到PM2管理器,点击安装
安装完成之后更换nodejs版本为v10.23.1
<
安装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
安装网站端
安装系统依赖项
使用下方方式安装安装 MariaDB 10.3 与 Redis :
在宝塔面板的软件上的分别安装MariaDB和Redis即可,经测试Redis6可用。
安装命令行工具
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
创建数据库
这一步直接在宝塔里面创建数据库即可
运行
执行以下命令以在前台以调试模式运行 SYZOJ,可用于收集错误信息:
cd /opt/syzoj/web && node app.js
# 默认运行在127.0.0.1:5283
使用 systemd
测试完成之后可以添加到systemd开机自启
官方文档讲的有点浅显了
首先打开/etc/systemd/system
然后分别创建以下三个文件,注意是空白文件
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即可。
网友评论