首先放上本次安装参考的文章:
这篇文章写的非常详细且易懂,像我这样的linux green hand都能上手搭建NOJ。但是按照作者的流程来会有一个问题,在后面会提到并且给出解决方法。
本文有大量地方借(抄)鉴(袭)该文,同时可能有很多地方表述不清,我的建议是先看上面的教程,而我的这篇仅仅是一点点补充。
2.官方文档
关于服务器
我按照教程安装了centOS7.8 64位,如果您不是该系统并且想更换,可以重装系统(腾讯云)变为该系统(同时会清空以前下载的文件,重装需慎重)。
开放端口
登录服务器
我是通过腾讯云--->云产品--->云服务器--->实例这样登录服务器的。您也可以用Xshell等安全终端模拟软件在您的电脑远程控制终端。
安装宝塔面板
//安装宝塔面板
[root@VM-0-13-centos ~]# yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
//终端查看宝塔面板
[root@VM-0-13-centos ~]# bt
//查看宝塔面板入口
[root@VM-0-13-centos ~]# /etc/init.d/bt default
在宝塔面板中安装必要的软件(注意软件版本)
然后软件商店--->应用搜索--->安装redis
<----注意---->当我们在宝塔面板上下载软件时,软件的所在目录并不是在/usr/local,而是在/www/server目录下。
将代码部署到服务器
关于NOJ源码,我选择了dev分支,您也可以通过view all branches 选择你想要的分支的源码。
1.先创建部署目录
[root@VM-0-13-centos ~]# cd /home
[root@VM-0-13-centos home]# mkdir OnlineJudge
[root@VM-0-13-centos home]# cd OnlineJudge
[root@VM-0-13-centos OnlineJudge]# ls
2.在上面的图中.Code--->Download ZIP右键复制链接地址
[root@VM-0-13-centos OnlineJudge]# wget https://github.com/ZsgsDesign/NOJ/archive/re/heads/dev.zip
讲道理 git clone 也可以下载,但是实际操作中我发现git clone速度奇慢。。。所以我就没用这个指令了。
3.解压--->改文件名
[root@VM-0-13-centos OnlineJudge]# unzip dev.zip //解压
[root@VM-0-13-centos OnlineJudge]# ls
dev.zip NOJ-dev
[root@VM-0-13-centos OnlineJudge]# rm -rf dev.zip //删除压缩包
[root@VM-0-13-centos OnlineJudge]# mv NOJ-dev Web //重命名
[root@VM-0-13-centos OnlineJudge]# ls
Web
将文件的中public目录设置为根目录
你的宝塔面板--->网站--->添加站点
(经过多次尝试,我发现得按照教程,把数据库账号和密码都设成codemaster,不然后面网站注册和登录,管理员面板功能会异常,但是为什么会这样我不是很懂)。
清除跨站攻击和伪静态
php配置
1.安装拓展
软件商店--->php7.4--->设置--->安装拓展
2.解除php禁用函数
软件商店--->php7.4--->设置--->禁用函数
注意: 运行composer 需要 PHP 5.3.2+以上版本
[root@VM-0-13-centos Web]# composer install
...
...
...//以上表示省略
Package manifest generated successfully.
112 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
[root@VM-0-13-centos Web]#
设置权限
[root@VM-0-13-centos Web]# pwd //当前目录
/home/OnlineJudge/Web
[root@VM-0-13-centos Web]# chown -R www:www ./ //www为nginx创建默认用户,如果你使用的是Apache之类(默认www-data)则按需修改该命令
修改 .env文件
[root@VM-0-13-centos Web]# pwd
/home/OnlineJudge/Web
[root@VM-0-13-centos Web]# cp .env.example .env //cop拷贝
[root@VM-0-13-centos Web]# vim .env //修改文件
如何修改.env
APP_URL=http://你的ip地址或者域名
SESSION_DOMAIN=null或者你的ip/域名
DB_USERNAME=创建网站时蛇者的数据库账号
DB_PASSWORD=数据库密码
DB_DATABASE=数据库名
在vim模式下一条一条查找实在是太麻烦了,您可以输入 /APP_URL这样快速找到想找的字段
退出vim模式
:wq 保存并退出
:q! 不保存并且强制退出
注意,此时的APP_KEY在后文会用到,但暂时不要保存,之后APP_KEY会被更新。(踩坑一)
访问网站
[root@VM-0-13-centos Web]# php artisan key:generate //这个选项更新了.env里的APP_KEY
Application key set successfully.
[root@VM-0-13-centos Web]# php artisan migrate //根据.env自动创建数据库等操作
Migration table created successfully.
...
Migrated: 2022_03_21_101359_create_authentication_log_table (66.28ms)
[root@VM-0-13-centos Web]# php artisan passport:install
Encryption keys generated successfully.
在php artisan key:generate后APP_KEY被更新,请把此时的APP_KEY记录下来。(在后文配置JudgerServer的docker-compose.yml中会用到)。
设置定时任务
linux设置定时任务的方法(自己总结)_weixin_30325793的博客-CSDN博客
[root@VM-0-13-centos ~]# crontab -e
在文件最后插入
* * * * * php /home/OnlineJudge/Web/artisan schedule:run
按道理来说,这个时候我们已经可以登录我们的网站了。
可是。。。
登录之后我们的网站变成了这样。
为什么会出现这个问题?请看这篇文章
laravel 报错The Mix manifest does not exist. - 心之所依 - 博客园
为了正常使用我们的网站,我们首先得运行Laravel Mix.而使用Laravel Mix 之前,我们还得先用yarn来安装其依赖。但是你输入yarn指令会显示command not found,因为yarn又需要用npm(nodejs的包管理器)来安装。
看最新的官方文档:
在最新的官方文档中显示必要的软件包括nodejs,可能是因为作者写教程是一年前那时候还不需要nodejs,而源码经过了一年的更新,现在需要nodejs。
(踩坑二)在网上找类似的安装教程时,尽量找比较新的教程。
接下来是解决方法
解决 linux 下安装 node 报: command not found - 腾讯云开发者社区-腾讯云
1.首先安装nodejs
sudo yum install epel-release
sudo yum install nodejs
node --version
2.安装npm和express
sudo yum install npm --enablerepo=epel
sudo npm install -g express
sudo npm install -g express-generator
3.检查版本信息
[root@VM-0-13-centos ~]# npm -v
8.5.5
[root@VM-0-13-centos ~]# node -v
v16.15.0
4.安装yarn
[root@VM-0-13-centos local]# npm install -g yarn
[root@VM-0-13-centos local]# yarn -v
1.22.19
5.安装Mix及其依赖
/package.json所在目录
[root@VM-0-13-centos ~]# cd /home/OnlineJudge/Web
//为yarn配置安装加速
[root@VM-0-13-centos Web]# yarn config set registry https://registry.npm.taobao.org
//安装依赖
[root@VM-0-13-centos Web]# yarn install
//在终端持续运行,监视resources文件夹下资源文件是否发生变化。在watch-poll命令运行情况下,一旦资源文件发生变化,Webpack会自动重新编译。
[root@VM-0-13-centos Web]# npm run watch-poll
ok,此时我们已经能够正常打开我们的网站了。
安装自带的OJ评测
cd /home/OnlineJudge/Web
php artisan babel:install noj
创建管理员
php artisan manage:create-admin
进入管理员面板
http://【IPADDRESS】/admin/auth/login
接着部署评测机和测试数据同步系统
首先先配置好docker环境
//安装docker
[root@VM-0-13-centos local]# curl -sSL https://get.daocloud.io/docker | sh
//安装docker-compose
[root@VM-0-13-centos OnlineJudge]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
[root@VM-0-13-centos OnlineJudge]# chmod +x /usr/local/bin/docker-compose
//检查是否安装成功
[root@VM-0-13-centos OnlineJudge]# docker -v
Docker version 20.10.17, build 100c701
You have new mail in /var/spool/mail/root
[root@VM-0-13-centos OnlineJudge]# docker-compose -v
docker-compose version 1.29.2, build 5becea4c
//启动docker服务,否则docker-compose无法执行
[root@VM-0-13-centos OnlineJudge]# systemctl start docker
搭建JudgeServer评测机器 GitHub - NJUPTAAA/NOJ_JudgeServer at dev
[root@VM-0-13-centos OnlineJudge]# wget https://github.com/NJUPTAAA/NOJ_JudgeServer/archive/refs/heads/dev.zip
//下一步是把你解压出来的文件改名成 JudgeServer
mv xxx JudgeServer
[root@VM-0-13-centos OnlineJudge]# cd JudgeServer
[root@VM-0-13-centos JudgeServer]# cp docker-compose.example.yml docker-compose.yml
[root@VM-0-13-centos JudgeServer]# vim docker-compose.yml
按照下面模板修改docker-compose.yml
version: '2'
services:
judge_server:
image: njuptaaa/judge_server //这里既可以指定REPOSITORY,也可以使用image的ID
restart: always
read_only: true
cap_drop:
- SETPCAP
- MKNOD
- NET_BIND_SERVICE
- SYS_CHROOT
- SETFCAP
- FSETID
tmpfs:
- /tmp
volumes:
- $PWD/tests/test_case:/test_case:ro
- $PWD/log:/log
# - $PWD/server:/code:ro
- $PWD/run:/judger
environment:
- BACKEND_URL=http://YOUR_IPADDRESS:3000/api/judge_server_heartbeat
- SERVICE_URL=http://YOUR_IPADDRESS:12358
- TOKEN=YOUR_APP_KEY //这里写你从.env文件那里记录的APP_KEY
ports:
- 12358:8080
$PWD和pwd的区别:
$PWD是变量,pwd是指令
echo $PWD 和 pwd, 都是查询当前目录
(小声bb:可能把.yml里面的$PWD直接改成文件的当前目录会更好,因为我没有这样做的时候,一直显示评测机器不可用,而这样改后,评测机就可用了---踩坑三)
关于镜像:
官方说明:
//可以先把镜像从docker仓库下载下来(一般下载下来的是最新版)
docker pull njuptaaa/judge_server
//你也可以指定从docker仓库下载最新版本的镜像
docker pull ghcr.io/njuptaaa/judge_server
//同样可以指定下载特定版本镜像
docker pull njuptaaa/judge_server:v0.3.1
//nightly最新,但是不稳定(可能有bug)
docker pull njuptaaa/judge_server:nightly
你可以先把镜像从docker仓库下载下来,docker images查看下载的镜像的id,然后在docker-compose.yml文件里面的image选项更改为你的本地镜像的id。不过你不下载镜像,docker-compose up -d 执行时也会完成从docker仓库下载镜像这个操作。
//查询镜像
docker images
//删除镜像
docker rmi (image ID)
//强制删除
docker rmi -f (image ID)
修改好docker-compose.yml后,启动容器
注:该命令可以自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
[root@VM-0-13-centos JudgeServer]# docker-compose up -d
Creating judge-server ... done //显示这个,容器启动成功
[root@VM-0-13-centos JudgeServer]# docker ps //查询本机所有的容器
//记录 njuptaaa/judge_server(就是你下载的镜像)的CONTAINER ID(后面管理员面板新增评测机会用到)
搭建数据同步系统
GitHub - NJUPTAAA/rsync: Sync tools for NOJ test cases. 米娜桑,this way
[root@VM-0-13-centos OnlineJudge]# wget https://github.com/NJUPTAAA/rsync/archive/refs/heads/master.zip
[root@VM-0-13-centos OnlineJudge]# unzip master.zip
//将压缩包解压两次,将解压后的文件分别改名为RsyncMaster,RsyncSlave
//分成两个,好管理
[root@VM-0-13-centos OnlineJudge]# ls
Web JudgeServer RsyncMaster RsyncSlave
一.RsyncMaster(推送测试数据)
[root@VM-0-13-centos OnlineJudge]# cd RsyncMaster
[root@VM-0-13-centos RsyncMaster]# cp docker-compose.mainservice.example.yml docker-compose.yml
docker-compose.yml
version: "3"
services:
noj-rsync-master:
image: njuptaaa/rsync
container_name: noj-rsync-master
volumes:
- /home/OnlineJudge/Web/storage/test_case:/test_case
- /home/OnlineJudge/Web/storage/logs:/log
(这两个地方的$PWD都要改成这样)
environment:
- RSYNC_MODE=master
- RSYNC_USER=ojrsync
- RSYNC_PASSWORD=CHANGE_THIS_PASSWORD
ports:
- "0.0.0.0:873:873"
二.RsyncSlave(接受测试数据到评测机)
[root@VM-0-13-centos OnlineJudge]# cd RsyncSlave
[root@VM-0-13-centos RsyncMaster]# cp docker-compose.mainservice.example.yml docker-compose.yml
version: "3"
services:
noj-rsync-slave:
image: njuptaaa/rsync
container_name: noj-rsync-slave
volumes:
- /home/OnlineJudge/JudgeServer/tests/test_case:/test_case
- /home/OnlineJudge/JudgeServer/data/rsync_log:/log
(这两个地方的$PWD也都要改)
environment:
- RSYNC_MODE=slave
- RSYNC_USER=ojrsync
- RSYNC_PASSWORD=CHANGE_THIS_PASSWORD
- RSYNC_MASTER_ADDR=你的ip地址/域名
配置评测机
管理员面板--->评测机--->新增
新增题目
题库--->题目
注意Test Cases,提交案例应该提交一个zip,并且其中含有.in(输入数据,可以放空,但不能没有)和.out(输出数据)两种文件
去宝塔面板,禁用pcntl_signal()
,pcntl_alarm()
两个函数
启动评测队列
[root@VM-0-13-centos ~]# cd /home/OnlineJudge/Web //进入你的工作目录
[root@VM-0-13-centos Web]# php artisan queue:work --queue=noj //启动评测队列
提交题目
( •̀ ω •́ )y搭建成功~
提交题目后可能会显示compile error。
我看到的原因有两种,一是no available judger ,可能是RsyncMaster/RsyncSlave容器构建有问题(检查RsyncXXX/docker-compose.yml里的$PWD有没有都修改);二是test case not found,可能是JudgeServer容器有问题。(检查JudgeServer.docker-compsoe.yml是否和上文模板相同)。
增删容器
//列出所有容器,找出错的那个的id
docker ps -a
//强制删除该容器
docker rm -f CONTAINER_ID
//然后就是修改对应的docker-compose.yml了,修改好后docker-compose up -d
//也记得检查一下镜像的版本
extra
当我们执行php artisan queue:work --queue=noj指令后,该指令会一直运行,我们不能再做其他的操作,除非ctrl+c退出该指令(但是会导致接受不到评测机接受不到评测信息,一直显示pending)。得到会长指点后,我学到可以用screen把评测队列在后台挂起,以下是操作过程。
后台挂起评测队列
screen使用_大大大zzc的博客-CSDN博客_screen
yum -y install screen
//创建screen任务
screen -s task_name
//列出本机所有screen任务
screen -ls
//进入指定screen任务
screen -r task_name/pid
//在screen中启动评测队列
php artisan queue:work --queue=noj
//ctrl+a+d,将screen挂到后台
看官方文档,还有一个软件,wkhtmltopdf我们没有下载。
这个软件的作用是把网页转成pdf,以下是wkhtmltopdf的使用方法。
//下载软件包
[root@VM-0-13-centos local]# wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox-0.12.6-1.centos7.x86_64.rpm
[root@VM-0-13-centos local]# yum install wkhtmltox-0.12.6-1.centos7.x86_64.rpm
//怎么用(例子)
[root@VM-0-13-centos Web]# wkhtmltopdf https://www.baidu.com test1.pdf
但是当你打开你下载的pdf查看时,你可能会发现有乱码或者方框(总之就是有bug)。
这是因为我们缺少中文字体文件,以下是解决方法。