从 0 到 1:HOJ 系统部署实操指南

该文提供了HOJ项目从本地到云服务器的完整部署步骤,包括前后端分离的Vue应用、DataBackup、Nacos配置、GoJudge判题机、JudegeServer的部署,以及涉及的环境变量设置、数据库导入和Docker容器管理等环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HOJ项目部署

采用的是前端Vue和后端DataBackup在本地部署
JudgeServer判题服务、GoJudge判题机、数据库和Nacos在云服务器部署
Redis在虚拟机部署(可在本地,可在服务器)

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、Nacos

Nacos部署在本地会出现一系列问题,后面会将nacos部署在云服务器,操作过程类似

2.1 环境准备

1)项目基本数据导入

在这里插入图片描述

2)Nacos环境配置

运行nacos.sql文件创建好naos数据库后,在数据库的users表中修改nacos的用户名和密码,由于nacos密码为加密后的密码,下面给出字符串“nacos”的加密后对应的字符串

 $2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jcCCJ1KH-1681295296802)(assets/image-20230412163038104.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RfWx2pVO-1681295296802)(assets/image-20230412163425293.png)]

修改nacos的配置文件,在conf文件夹内的application.properties里解开对应行的注释

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQPEg6ew-1681295296803)(assets/image-20230412163318078.png)]

配置完成后访问点击Console连接,按住Ctrl可以点击进去,账号密码均为nacos。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5bVy12K3-1681295296803)(assets/image-20230412163438892.png)]

出现以上内容为配置成功

2.2 修改配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nP9qUEyK-1681295296803)(assets/image-20230412163614808.png)]

1)修改application-prod.yml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DzJHVHnE-1681295296803)(assets/image-20230412164632481.png)]

修改application-prod.yml中的judge-token。将nacos中的judge-token配置copy到application-prod.yml中,否则会自动生成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCzkohOU-1681295296804)(assets/image-20230412164816502.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ttH9Spc2-1681295296804)(assets/image-20230412164706494.png)]

2)修改bootstrap.yml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vtd8namk-1681295296804)(assets/image-20230412165116843.png)]

3)修改上传文件路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ny5LW0eM-1681295296804)(assets/image-20230412171327266.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eX6Q4iQ6-1681295296805)(assets/image-20230412171340222.png)]

不修改会出现上传题目错误

2.3 启动环境

1)检查Redis、Nacos是否启动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1KZFSss1-1681295296805)(assets/image-20230412165313887.png)]

2)启动服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J5A0KUWO-1681295296805)(assets/image-20230412165247256.png)]

出现以下信息为启动成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7tX35X4-1681295296805)(assets/image-20230412165431404.png)]

3 本地部署hoj-vue前端

3.1 环境准备

1)下载Node.js

https://nodejs.org/zh-cn/download/

2)配置环境变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-raPxDl2N-1681295296806)(assets/image-20230412165815587.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SVgFg3VG-1681295296806)(assets/image-20230412170534833.png)]

出现以上内容,为启动成功

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9P2lrUc-1681295296806)(assets/image-20230412173223903.png)]

4.8 进入容器内安装编译环境

查看容器名

docker ps

进入容器

docker exec -it [容器名] /bin/bash

容器内安装gcc/g++ 编译环境

# 更新安装 apt
apt-get update
apt update
apt install gcc
apt install g++

5 云服务器部署JudegeServer、Nacos

把JudgeServer部署在本地会出现一系列问题:
题目上传到本地testcase文件夹里 而判题要在服务器里读testcase里的测试数据,路径不一致。

解决方案就是:将JudgeServer和GoJudge都部署在云服务器

先修改SandBoxRun中的SANBOX_BASE_URL
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5NaSyzz4-1681295296806)(assets/image-20230412181902610.png)]

5.1 安装JDK

5.1.1 下载JDK
sudo apt install openjdk-8-jre-headless
sudo apt install openjdk-8-jdk-headless

输入:java,javac 检验是否安装成功

5.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

重新加载配置文件

5.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)

5.3 将Nacos部署在云服务器

如果将Nacos部署在本地,DataBackup部署在本地。JudgeServer和GoJudge部署在云服务器。会导致JudgeServer无法访问私有ip的nacos,所以将nacos也需要部署在云服务器。

1)宝塔的docker拉取镜像和创建容器很方便,从仓库中拉取镜像,输入镜像名后自动拉取到本地
在这里插入图片描述
跟本地镜像添加容器就可以了
在这里插入图片描述

由于我的服务器内容很小,如果在创建容器的时候不限制内存,守护线程oom killer杀掉了nacos线程。
所以一定在添加容器的时候限制内容!!!

docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=64m -e JVM_XMX=64m -e JVM_XMN=16m -p 8848:8848 -d nacos/nacos-server

2)利用Navicat连接云服务器的数据库,导入nacos.sql和hoj.sql

连接云服务器可能会出现一直连接不上的情况,大多是因为root的登录权限不够,只限于本地登录,不可远程访问, 更改ip登录权限

mysql -u root -p
use mysql;
select user,host from user;
# 查看自己root对应的host字段值是否是“%”,默认一般是localhost,则需要将localhost改为%,输入下面mysql指令更改:
update user set host = "%" where user = "root";
flush privileges;

3)修改nacos中users表的登录信息
4)修改nacos的配置文件
与本地部署类似,不再赘述。

5.4 重启DataBackup服务

1)重启的时候注意要把项目中的所有**@Value(“${hoj.judge.token}”)**注释掉,否则读取不到(可以通过debug的方式找到所有)。
2)启动成功后,访问部署在云服务器的Nacos控制台,会出现以下配置
在这里插入图片描述
修改application-prod.yml中的judge-token。将nacos中的judge-token配置copy到application-prod.yml中,否则会自动生成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCzkohOU-1681295296804)(assets/image-20230412164816502.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ttH9Spc2-1681295296804)(assets/image-20230412164706494.png)]

【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于SpringBoot+SpringCloud+Vue的在线代码评委系统(OJ)源码+数据库+项目说明.zip # README-CN # OJ系统 开始开发 ## 环境准备 ​ 运行此程序必须要有**Ubuntu**系统, ​ Linux 内核版本 >= 3.10 ​ jdk1.8版本, ​ mysql8.0, ​ redis。 ### go-judge系统运行 **gojudge所需要的端口是5050** <a href="">go_judge手册</a>. 在Docker上运行 ~~~bash docker run -it --rm --privileged --shm-size=256m -p 5050:5050 criyle/executorserver ~~~ #### c/c++语言环境测试 **接下来我们打开postman进行测试已post形式发送请求http://IP:5050/run携带参数** ~~~java { "cmd": [{ "args": ["/usr/bin/g++", "Main.cc", "-o", "a"], "env": ["PATH=/usr/bin:/bin"], "files": [{ "content": "" }, { "name": "stdout", "max": 10240 }, { "name": "stderr", "max": 10240 }], "cpuLimit": 10000000000, "memoryLimit": 104857600, "procLimit": 50, "copyIn": { "Main.cc": { "content": "#include <iostream>\nusing namespace std;\nint main() {\nint a, b;\ncin >> a >> b;\ncout << a + b << endl;\n}" } }, "copyOut": ["stdout", "stderr"], "copyOutCached": ["Main.cc", "a"], "copyOutDir": "1" }] } ~~~ **我们服务器会给我们返回** ~~~bash [ { "status": "Accepted", "exitStatus": 0, "time": 726910000, "memory": 55812096, "runTime": 787566071, "files": { "stderr": "", "stdout": "" }, "fileIds": { "Main.cc": "4EK46KIB", "a": "LR567VHA" } } ] ~~~ **接下来我们根据Main的Id对他进行run** ~~~bash { "cmd": [{ "args": ["a"], "env": ["PATH=/usr/bin:/bin"], "files": [{ "content": "1 1" }, { "name": "stdout", "max": 10240 }, { "name": "stderr", "max": 10240 }], "cpuLimit": 10000000000, "memoryLimit": 104857600, "procLimit": 50, "strictMemoryLi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖虎不秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值