You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

5.1 KiB

源码构建和配置

获取代码

git clone https://git.fanruan.com/fanruan/fair-web.git
git clone https://git.fanruan.com/fanruan/fair-judge-v3.git

本文的部署过程中将 web 端放在 /var/fair-web 目录,judge 端放在 /var/fair-judge-v3 目录。

安装依赖项

cd /var/fair-web
npm i
cd /var/fair-judge-v3
npm i
npm run build # 将TypeScript编译成JS

如果使用的root账户,执行 npm i 时则需要添加 --unsafe-perm 参数。

复制并修改配置文件

SYZOJ 可以指定运行所用配置文件的位置。为了便于统一管理,建议将配置文件统一放在 /etc/syzoj-config 目录下。

SYZOJ 提供了配置文件示例,我们首先将示例复制过去。

mkdir /mnt/syzoj-data /mnt/syzoj-bin /mnt/syzoj-tmp1 /etc/syzoj-congig
cd /var/syzoj-judge-v3
cp daemon-config-example.json /etc/syzoj-config/daemon.json
cp runner-shared-config-example.json /etc/syzoj-config/runner-shared.json
cp runner-instance-config-example.json /etc/syzoj-config/runner-instance1.json
cp frontend-config-example.json /etc/syzoj-config/frontend.json
cp /var/syzoj-web/config-example.json /etc/syzoj-config/web.json

创建 systemd 系统服务

分别在 /etc/systemd/system/ 目录下建立以下文件并写入以下内容。需要注意的是如果你是用 nvm 或其他方式安装了 Node.js,node 可执行文件的位置可能会有不同,请自行修改。

syzoj-web.service

[Unit]
Description=SYZOJ Online Judge
After=network.target mysql.service
Requires=mysql.service

[Service]
Type=simple
WorkingDirectory=/var/fair-web
User=syzoj
Group=syzoj
ExecStart=/usr/bin/node /var/fair-web/app.js -c /etc/syzoj-config/web.json

[Install]
WantedBy=multi-user.target

syzoj-judge-daemon.service

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

[Service]
Type=simple
WorkingDirectory=/var/fair-judge-v3
User=syzoj
Group=syzoj
ExecStart=/usr/bin/node /var/fair-judge-v3/lib/daemon/index.js -c /etc/syzoj-config/daemon.json

[Install]
WantedBy=multi-user.target

syzoj-judge-frontend.service

[Unit]
Description=SYZOJ Judge Frontend
After=network.target rabbitmq-server.service
Requires=syzoj-web.service rabbitmq-server.service

[Service]
Type=simple
WorkingDirectory=/var/fair-judge-v3
User=syzoj
Group=syzoj
ExecStart=/usr/bin/node /var/fair-judge-v3/lib/frontend-syzoj/index.js -c /etc/syzoj-config/frontend.json

[Install]
WantedBy=multi-user.target

syzoj-judge-runner@.service

[Unit]
Description=SYZOJ Runner %I
After=network.target rabbitmq-server.service redis-server.service
Requires=rabbitmq-server.service redis-server.service

[Service]
Type=simple
WorkingDirectory=/var/fair-judge-v3
User=root
Group=root
ExecStart=/usr/bin/node /var/fair-judge-v3/lib/runner/index.js -s /etc/syzoj-config/runner-shared.json -i /etc/syzoj-config/runner-instance-%i.json

[Install]
WantedBy=multi-user.target

欲启用系统服务,请在终端中键入以下命令:

systemctl enable syzoj-web
systemctl enable syzoj-judge-daemon
systemctl enable syzoj-judge-runner@1

创建 syzoj 系统用户

useradd syzoj
mkdir /home/syzoj
chown -R syzoj:syzoj /mnt/syzoj-data
chown -R syzoj:syzoj /mnt/syzoj-bin
chown -R syzoj:syzoj /mnt/syzoj-tmp1
chown -R syzoj:syzoj /var/syzoj-web
chown -R syzoj:syzoj /var/syzoj-judge-v3
chown -R syzoj:syzoj /home/syzoj

配置临时目录 SYZOJ 使用 tmpfs 挂载临时目录。你需要在 /etc/fstab 文件中加入以下内容。

/etc/fstab

The following items are for SYZOJ Judge:

tmpfs /mnt/syzoj-tmp1 tmpfs nodev,nosuid,size=384M 0 2 tmpfs /mnt/syzoj-bin tmpfs nodev,nosuid,size=1280M 0 2 tmpfs /mnt/syzoj-tmp2 tmpfs nodev,nosuid,size=384M 0 2 /etc/fstab 文件会在重启后生效。如果你不想立即重启,也可以自行挂载。具体方式请自行探索,这里不再赘述。

启动系统服务

systemctl start syzoj-web
systemctl start syzoj-judge-daemon
systemctl start syzoj-judge-frontend
systemctl start syzoj-judge-runner@1

执行后,如果启动成功,ps-ef | grep node 应该可以看到你的四个进程。如果没有看到,那么请自行查看日志或考虑使用 screen 进行调试。

如果启动成功,那么此时访问 http://服务器ip或域名 应该能打开 SYZOJ 的默认界面。你应该注册一个新用户并将其设置为管理员。

注册后,进入 MySQL Cli,键入以下命令,自行替换中括号内容。

USE syzoj; UPDATE user SET is_admin = 1 WHERE username = '[your_username]'; 刷新页面,应该能看到你的账户已经成了全站管理员。SYZOJ 的全站管理员权限只能通过更改数据库的方式添加或删除。

这时你可以加入题目并提交以测试评测端是否运行正常。如果成功评测并显示结果,那么恭喜你,你的 SYZOJ 部署成功。注意如果添加过题目又删除,那么自动增长的默认题目编号不会排除被删除的题目,所以请谨慎添加。如果确实添加错了题目,可以考虑将下一道新题目通过编辑错误题目的方式添加。