richie
6 years ago
2 changed files with 218 additions and 1 deletions
@ -1,7 +1,75 @@ |
|||||||
<p align="center"><img src="static/self/syzoj.png" width="250"></p> |
<p align="center"><img src="static/self/syzoj.png" width="250"></p> |
||||||
|
|
||||||
一个用于算法竞赛的在线评测系统。 |
一个用于算法学习和竞赛的在线评测系统,主要用于帆软开发和测试团队。 |
||||||
|
|
||||||
# 部署 |
# 部署 |
||||||
|
|
||||||
|
## 服务器要求 |
||||||
|
|
||||||
|
Ubuntu 18.04(64位) |
||||||
|
|
||||||
|
## 环境准备 |
||||||
|
|
||||||
|
评测机使用的沙箱需要使用boost库,因此需要安装boost |
||||||
|
|
||||||
|
``` |
||||||
|
apt install build-essential libboost-all-dev |
||||||
|
``` |
||||||
|
平台系统依赖NodeJS运行环境(目前测试下来仅支持8.x版本) |
||||||
|
``` |
||||||
|
apt install nodejs |
||||||
|
``` |
||||||
|
评测系统的前端和评测机之间通过rabbitmq通信,评测时需要使用7zip对用例进行解压 |
||||||
|
``` |
||||||
|
apt install rabbitmq-server p7zip-full |
||||||
|
``` |
||||||
|
web服务器 |
||||||
|
``` |
||||||
|
apt install nginx |
||||||
|
``` |
||||||
|
|
||||||
|
Redis 5.0.x版本 |
||||||
|
|
||||||
|
参见文档:[安装最新的Redis](https://www.howtoing.com/how-to-install-and-configure-redis-on-ubuntu-16-04)。 |
||||||
|
|
||||||
|
MariaDB 10.4版本 |
||||||
|
|
||||||
|
参见文档:[安装MariaDB](https://ywnz.com/linuxysjk/3871.html)。 |
||||||
|
|
||||||
|
安装完成后进入数据库命令行创建数据库 |
||||||
|
``` |
||||||
|
mysql -uroot -p |
||||||
|
``` |
||||||
|
``` |
||||||
|
CREATE DATABASE syzoj; |
||||||
|
ALTER DATABASE syzoj CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; |
||||||
|
CREATE USER 'syzoj'@'localhost' IDENTIFIED BY '[your_password]'; |
||||||
|
GRANT ALL ON syzoj.* TO 'syzoj'@'localhost'; |
||||||
|
FLUSH PRIVILEGES; |
||||||
|
``` |
||||||
|
|
||||||
|
## 修改内存控制内核选项 |
||||||
|
simple-sandbox 使用了 cgroup 来进行内存用量控制,该过程需要用到 memory.memsw(控制内存和交换空间的总用量)。一些 Linux 发行版的内核在默认情况下,没有启用这个内核选项,你需要手动启用它。 |
||||||
|
|
||||||
|
检查文件 /sys/fs/cgroup/memory/memory.memsw.usage_in_bytes 是否存在。如果不存在,你需要使用你的 grub 启用。 打开 /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" |
||||||
|
``` |
||||||
|
修改后执行 |
||||||
|
``` |
||||||
|
update-grub && reboot |
||||||
|
``` |
||||||
|
来更新 grub 配置并重启。重启后,重新检查文件 /sys/fs/cgroup/memory/memory.memsw.usage_in_bytes 是否存在。 |
||||||
|
|
||||||
|
## 部署沙箱 |
||||||
|
从[这个链接](https://fanruan-install.oss-cn-shanghai.aliyuncs.com/tools/sandbox/sandbox-rootfs-181202.tar.gz)下载 sandbox-rootfs,使用 root 权限解压到根目录下。 |
||||||
|
|
||||||
|
## 源码构建和配置 |
||||||
|
|
||||||
|
参见[这里](docs/install.md)。 |
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,149 @@ |
|||||||
|
# 源码构建和配置 |
||||||
|
|
||||||
|
## 获取代码 |
||||||
|
``` |
||||||
|
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 部署成功。注意如果添加过题目又删除,那么自动增长的默认题目编号不会排除被删除的题目,所以请谨慎添加。如果确实添加错了题目,可以考虑将下一道新题目通过编辑错误题目的方式添加。 |
Loading…
Reference in new issue