文章目录
- HOJ项目部署
- 1 项目准备
- 1.1 拉取HOJ项目到本地
- 1.2 项目包结构解读
- 2 后端部署DataBackup
- 2.1 环境准备
- 1)项目基本数据导入
- 2)Nacos环境配置
- 2.2 修改配置
- 1)修改application-prod.yml
- 2)修改bootstrap.yml
- 3)修改上传文件路径
- 2.3 启动环境
- 1)检查Redis、Nacos是否启动
- 2)启动服务器
- 3 前端部署hoj-vue
- 3.1 环境准备
- 1)下载Node.js
- 2)配置环境变量
- 3)验证是否安装成功
- 3.2 启动项目
- 4 部署GoJudge判题机
- 4.1 安装yum
- 4.2 安装GoLang环境配置环境变量
- 4.3 安装Docker
- 4.4 安装git命令
- 4.5 拉取GoJudge代码到云服务器
- 4.6 根据Dockerfile拉取了gojudge镜像(不需要)
- 4.7 根据镜像创建容器
- 4.8 进入容器内安装编译环境
- 5 部署JudgeServer
- 6 将JudegeServer部署在云服务器
- 6.1 安装JDK
- 6.1.1 下载JDK
- 6.1.2 配置环境变量
- 6.2 将JudegeServe打成Jar包,上传到云服务器
HOJ项目部署
采用的是后端DataBackup和JudgeServer和前端在本地部署,判题机GoJudge在云服务器部署
1 项目准备
1.1 拉取HOJ项目到本地
项目拉取地址:
https://gitee.com/himitzh0730/hoj.git
1.2 项目包结构解读
包结构解读:
-
hoj-springboot包为项目后端
- api包为项目所需pojo
- DataBackup包为后端业务
- JudgeServer包为判题业务
-
hoj-vue包为项目前端Vue
-
sandbox包为沙箱判题机,使用的是go-judge
-
sqlAndsetting包为数据库文件和nacos配置文件
2 后端部署DataBackup
2.1 环境准备
1)项目基本数据导入
2)Nacos环境配置
运行nacos.sql文件创建好naos数据库后,在数据库的users表中修改nacos的用户名和密码,由于nacos密码为加密后的密码,下面给出字符串“nacos”的加密后对应的字符串
$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu
修改nacos的配置文件,在conf文件夹内的application.properties里解开对应行的注释
配置完成后访问点击Console连接,按住Ctrl可以点击进去,账号密码均为nacos。
出现以上内容为配置成功
2.2 修改配置
1)修改application-prod.yml
修改application-prod.yml中的judge-token。将nacos中的judge-token配置copy到application-prod.yml中,否则会自动生成
2)修改bootstrap.yml
3)修改上传文件路径
不修改会出现上传题目错误
2.3 启动环境
1)检查Redis、Nacos是否启动
2)启动服务器
出现以下信息为启动成功
3 前端部署hoj-vue
3.1 环境准备
1)下载Node.js
https://nodejs.org/zh-cn/download/
2)配置环境变量
3)验证是否安装成功
查看node.js版本
node -v
3.2 启动项目
1)npm项目依赖组件安装
cmd进入前端vue项目的根目录(hoj/hoj-vue),输入命令
cnpm install
会根据前端项目的依赖关系下载好相关的组件,存在项目目录的node_modules文件夹下。
注意:一般git库会gitignore依赖组件,没有node_modules文件夹,这个文件夹太大,一般不push
2)npm项目编译
第一次启动需要编译,后续再启动,只需要进行第三步启动项目
cmd进入前端vue项目的根目录(hoj/hoj-vue),输入命令
npm run build
此时会对根目录下的package.json对build命令的定义进行编译,一般"build" = “webpack -p”。
3)启动项目:
cmd进入前端vue项目的根目录(hoj/hoj-vue),输入命令
npm run serve
出现以上内容,为启动成功
4 部署GoJudge判题机
注意使用校园网的话,Xshell会连不上的云服务器的,校园网屏蔽了一系列端口,包括20端口。
使用校园网可以将20端口改成别的。使用宝塔或VNC连接没问题
4.1 安装yum
sudo apt-get update
sudo apt-get install yum
4.2 安装GoLang环境配置环境变量
cd /usr/local/
#下载安装包
wget https://studygolang.com/dl/golang/go1.14.1.linux-amd64.tar.gz
#解压安装包
tar -zxvf go1.14.1.linux-amd64.tar.gz
#建立工作目录
mkdir -p /home/go/bin /home/go/pkg /home/go/src
配置环境变量:
#打开配置
vi /etc/profile
#在最下面添加
export GOROOT=/usr/local/go
export GOPATH=/home/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
#保存退出
:wq
#配置生效
source /etc/profile
#查看Go版本
go version
#查看配置
go env
4.3 安装Docker
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
4.4 安装git命令
sudo apt-get install git
sudo apt-get update
4.5 拉取GoJudge代码到云服务器
git clone https://github.com/criyle/go-judge.git
4.6 根据Dockerfile拉取了gojudge镜像(不需要)
docker build -f ./Dockerfile.exec -t go-Judge
4.7 根据镜像创建容器
docker run -d -it --rm --privileged --shm-size=256m -p 5050:5050 -p 5051:5051 criyle/executorserver -enable-grpc
查看进程是否存在
netstat -anp | grep 5050
netstat -anp | grep 5051
4.8 进入容器内安装编译环境
查看容器名
docker ps
进入容器
docker exec -it [容器名] /bin/bash
容器内安装gcc/g++ 编译环境
# 更新安装 apt
apt-get update
apt update
apt install gcc
apt install g++
5 部署JudgeServer
修改SandBoxRun中的SANBOX_BASE_URL
修改后可以进行判题。可以上传个题目,自测测一下C++编译环境。或者利用Postman进行测试
6 将JudegeServer部署在云服务器
把JudgeServer部署在本地会出现一系列问题:
题目上传到本地testcase文件夹里 而判题要在服务器里读testcase里的测试数据,路径不一致。
解决方案就是:将JudgeServer和GoJudge都部署在云服务器
6.1 安装JDK
6.1.1 下载JDK
sudo apt install openjdk-8-jre-headless
sudo apt install openjdk-8-jdk-headless
输入:java,javac 检验是否安装成功
6.1.2 配置环境变量
vim /etc/profile
进入后在文件末尾添加以下内容
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH
source /etc/profile
重新加载配置文件
6.2 将JudegeServe打成Jar包,上传到云服务器
1)使用Maven工具进行打包,打包前进行clean,后点击package
打包过程中会出现
Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.0.5:
repackage (default) on project hoj-judgeServer:
Execution default of goal
org.springframework.boot:spring-boot-maven-plugin:3.0.5:
repackage failed: Unable to load the mojo 'repackage'
in the plugin 'org.springframework.boot:spring-boot-maven-plugin:3.0.5' due to an API incompatibility:
org.codehaus.plexus.component.repository.exception.ComponentLookupException:
org/springframework/boot/maven/RepackageMojo has been compiled by
a more recent version of the Java Runtime (class file version 61.0),
this version of the Java Runtime only recognizes class file versions up to 52.0
这样一个错误,原因是:在spring-boot-maven-plugin:3.0.0-M1这个版本中没有goal这个api了
所以在pom.xml中添加spring-boot-maven-plugin的版本号即可
<version>2.3.3.RELEASE</version>
2)在需要部署判题服务的云服务器上创建文件夹来存储jar包和沙盒文件,同时还要判题过程中需要的文件夹
# 存放jar包与安全判题沙盒的目录
mkdir -p /hoj/server
# 存放用户提交的源代码
mkdir -p /hoj/run
# 存放题目的特殊判题源代码
mkdir -p /hoj/spj
# 判题过程中的日志文件夹
mkdir -p /hoj/log
# 存放题目的测试数据
mkdir -p /hoj/testcase
将打好的jar包放在/hoj/server
使用宝塔Java项目一键部署工具进行部署
自定义参数 --server.port=8088的前面要添加一个空格
要不然系统以为我们要运行的文件是xxx.jar–server.port=xxx 而不是 xxx.jar
(我们运行jar会执行java-jar xxx.jar --server.port=xxxx)