搭建NOJ

首先放上本次安装参考的文章:

1.NOJ(南邮OJ)构建指北

这篇文章写的非常详细且易懂,像我这样的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+以上版本

​​什么是composer  

[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]# 

设置权限    

chown命令详解

[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会被更新。(踩坑一)

访问网站

什么是 artisan

[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环境

DaoCloud | 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)。

这是因为我们缺少中文字体文件,以下是解决方法。

wkhtmltopdf 中文空白乱码问题解决_了 义的博客-CSDN博客_wkhtmltopdf 中文乱码

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值