OJ 后端运行&部署教程
环境准备
- OJ 在线判题源码
- IDEA 你懂的教程
- Redis 安装包 链接: https://pan.baidu.com/s/1-QhCv0Crg2zvwG3ODxvv-Q 提取码: vmty
- MySQL 5.7 安装包链接 提取码:bbr5
- MySQL8.0 网盘安装包提取码:g17s
- RabbitMQ 3.1.2 安装包 官方链接 + Erlang 安装包 OTP25.3 官方链接
- Nacos官方下载链接
- Nacos网盘链接 https://pan.baidu.com/s/16J46flMD86ZdEn9r-npbEA 提取码:
9m72
本地启动
初始化数据
连接本地 MySQL
点击 Download 下载 driver files
输入,账号密码之后点击Test Connection 成功之后直接点击 OK
找到根目录 sql 目录下面的 create_table.sql
微服务版本在根目录 mysql-init
CTRL + A 右键选择 Execute
创建成功之后,我们右侧的 DataBase 里面有 yuoj 数据库还有其他六个表,如果没有找到的话就看 @localhost 右侧的 1 of 24 点击看看里面有没有 yuoj
运行非微服务版本
-
后端源码 下载非微服务
-
设置 Maven 完成 https://www.codefather.cn/post/1836689783992958977
使用 IDEA 打开项目
安装依赖
- 首先需要配置好本地
Mavne, 和阿里云镜像,要是没有配置的话可以看一下这篇文章
然后可以在 Build 看到正在下载依赖
选择 Java 版本
- 本地没有 JDK 可以直接
Download JDK - 本地有 JDK 但是没识别到
Add JDK from disk选着对应目录即可
修改配置文件
配置文件在 resources 目录
- application.yml 默认是本地运行时生效的配置
- application-prod.yml 当在服务器指定
--spring.profiles.active=prod才会生效,一般写线上配置,比如:线上 MySQL、Redis ... - application-test.yml 当在服务器指定
--spring.profiles.active=test才会生效
MySQL
▼yml复制代码spring: # 数据库配置 # todo 需替换配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/yuoj # yuoj 是数据库的名称 如果是远程 MySQL 例如: jdbc:mysql://192.129.11.11:3306/yuoj username: root # 用户名 password: 123456 # MySQL 设置的密码
Redis
▼yml复制代码spring: redis: database: 1 host: localhost # 如果线上改成线上 IP port: 6379 # Redis 具体运行端口,默认安装 6379 timeout: 5000 # password: 123456 # 密码,默认安装没有密码,如果服务器 Redis 有密码就修改这个
可以设置 UTF-8 让配置文件中文正常显示,如果还是不行的话就把配置文件里面的中文删除即可
本地运行
右下角会有 Lombok require enable annotation processing 直接点 Enable annotation processing 即可
启动成功
运行微服务版本
-
后端源码 下载非微服务
-
设置 Maven 完成 https://www.codefather.cn/post/1836689783992958977
安装依赖
安装 Nacos 2.2.0
- 官方下载链接
- 网盘链接 https://pan.baidu.com/s/16J46flMD86ZdEn9r-npbEA 提取码:
9m72
下载之后解压到常用安装软件的目录
进入到 nacos/bin 目录下
▼text复制代码cd nacos/bin
Windows
▼text复制代码startup.cmd -m standalone
Linux/mac
▼text复制代码sh startup.sh -m standalone
安装 RabbitMQ
1、安装 Erlang + RabbitMQ 先安装 Erlang
选择 是
2、安装 RabbitMQ 直接双击 exe 程序即可安装
3、启动 RabbitMQ
1)搜索 cmd -> 以管理员身份运行
2)进入 MQ 安装路径:C:\Program Files\RabbitMQ Server\rabbitmq_server-3.12.13\sbin
▼text复制代码cd "C:\Program Files\RabbitMQ Server\rabbitmq_server-3.12.13\sbin"
3)输入 rabbitmq-plugins.bat enable rabbitmq_management
▼text复制代码rabbitmq-plugins.bat enable rabbitmq_management
4)依次输入下面的命令
▼text复制代码rabbitmq-service.bat stop rabbitmq-service.bat install rabbitmq-service.bat start
5)然后可以直接在浏览器上 http://localhost:15672/mgmt
账号:guest
密码:guest
6)重启后这么启动呢?一般默认重启之后自启动
win + R 输入 services.msc
找到 RabbitMQ 右键 Start
启动成功
修改配置文件
配置文件在下面项目的 resources 目录
- yuoj-backend-judge-service
- yuoj-backend-question-service
- yuoj-backend-user-service
- application.yml 默认是本地运行时生效的配置
- application-prod.yml 当在服务器指定
--spring.profiles.active=prod才会生效,一般写线上配置,比如:线上 MySQL、Redis ... - application-test.yml 当在服务器指定
--spring.profiles.active=test才会生效
MySQL
▼yml复制代码spring: # 数据库配置 # todo 需替换配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/yuoj # yuoj 是数据库的名称 如果是远程 MySQL 例如: jdbc:mysql://192.129.11.11:3306/yuoj username: root # 用户名 password: 123456 # MySQL 设置的密码
Redis
▼yml复制代码spring: redis: database: 1 host: localhost # 如果线上改成线上 IP port: 6379 # Redis 具体运行端口,默认安装 6379 timeout: 5000 # password: 123456 # 密码,默认安装没有密码,如果服务器 Redis 有密码就修改
RabbitMQ
▼yml复制代码spring: rabbitmq: host: localhost # 服务器换成对应 IP + 端口 port: 5672 password: guest # 密码 username: guest # 账号
修改 Judge 请求沙箱地址
YuojBackendJudgeServiceApplication
位置:com.yupi.yuojbackendjudgeservice.judge.codesandbox.impl
修改成对应的虚拟机 IP 或者服务器 IP 地址
查看虚拟机 IP
▼text复制代码ifconfig
结果
▼text复制代码eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::a00:27ff:fe5c:ebac prefixlen 64 scopeid 0x20<link> ether 08:00:27:5c:eb:ac txqueuelen 1000 (Ethernet) RX packets 26284 bytes 2144348 (2.1 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 24776 bytes 1939930 (1.9 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 1558 bytes 115900 (115.9 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1558 bytes 115900 (115.9 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
这个 eth0 接口的 IP 地址是 192.168.1.10,也就虚拟机 IP 就是这个
BUG:
1、如果连接失败但确认虚拟机 sandbox 正常运行
运行下面 curl 检查是否运行成功
▼text复制代码curl -X POST "http://localhost:8090/executeCode" \ -H "Content-Type: application/json" \ -d '{ "code": "public class Main {\n public static void main(String[] args) {\n int a = Integer.parseInt(args[0]);\n int b = Integer.parseInt(args[1]);\n System.out.println(\"结果:\" + (a + b));\n }\n}", "language": "java", "inputList": ["1 2", "3 4"] }'
或者使用 IDEA HttpClient 进行测试
▼text复制代码### POST http://localhost:8090/executeCode Content-Type: application/json { "code": "public class Main {\n public static void main(String[] args) {\n int a = Integer.parseInt(args[0]);\n int b = Integer.parseInt(args[1]);\n System.out.println(\"结果:\" + (a + b));\n }\n}", "language": "java", "inputList": ["1 2", "3 4"] }
当然使用这种方式如果不把对应的接口的权限认证先注释掉,请求会报错
![]()
2、一般是防火墙的问题,首先确认自己的虚拟机是否开启防火墙
关闭 ufw 防火墙
▼text复制代码sudo ufw disable
启动
必备环境
1)MySQL
2)Redis
3)Nacos 运行状态
4)RabbitMQ
打开之后可以按照一下顺序进行启动
- YuojBackendGatewayApplication
- YuojBackendJudgeServiceApplication
- YuojBackendQuestionServiceApplication
- YuojBackendUserServiceApplication
启动成功效果
运行 sandbox
Linux 有两种选择
1、本地虚拟机 安装教程
2、远程服务器
我测试的远程服务器是 2 核 2G 但是开发不太卡,可能是我把能关的都关了的原因 + 再加上我设置了虚拟内存的缘故,但是有能力还是 2 核 4G
下面是我未启动 SpringBoot + 还有一个 Docker 占用情况
IDEA 远程连接 Linux
如果配置不高可能会报错,但是没大问题,直接选择
Continue Anyway还有一个原因,我设置了Linux 的
虚拟内存
选着根目录可以选择 /root/idea 路径,输入下面命令创建
▼text复制代码mkdir -p /root/idea
如何第二次打开呢?
安装 Java
Ubuntu
1、安装 Java
1)更新系统软件包
▼text复制代码sudo apt-get update
2)安装 OpenJDK 8
▼text复制代码apt-get install openjdk-8-jdk
输入
y回车
安装完成
2、验证是否安装成功
▼text复制代码java -version
▼text复制代码javac -version
CentOS 也是同理
1、更新系统软件包
▼text复制代码sudo yum update -y
2、安装 OpenJDK 8
▼text复制代码sudo yum install -y java-1.8.0-openjdk
3、验证 Java 是否安装成功
▼text复制代码java -version
▼text复制代码javac -version
安装 Maven
1、更新系统软件包
▼text复制代码sudo apt update
2、安装 Maven
▼text复制代码apt install maven -y
3、验证 maven 是否成功
▼text复制代码mvn -version
4、设置镜像
▼text复制代码vi /usr/share/maven/conf/settings.xml
最后把
▼xml复制代码<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
之后切换到命令行模式输入 :wq 即可退出保存成功
远程设置 Java 版本和 Maven
选择 Java 版本
选择自己本地安装的 Maven
/usr/share/maven 选择自己安装的 Maven
选择 User setting file 路径为 /usr/share/maven/conf/setting.xml
最后取消选择 Use setting from .mvn/maven.config
在 Terminal 里面输入
▼text复制代码mvn install
如果没有找到 Terminal 的话,找到设置 plugins
没用 IDEA 右侧的配置,是因为我配置不高很容易卡
安装 Docker
可以看鱼皮的文章,里面有安装虚拟机 Linux + 安装 Docker 的流程 《搞台虚拟机玩玩》
启动项目
上面都准备好之后,可以直接把 yuoj-code-sandbox 代码上传到虚拟机或者服务器上的 /root/idea 目录,就可以看到代码结构
启动成功
测试 sandbox
运行下面 curl 检查是否运行成功(当然 IP 不一定是 localhost 需要改成自己服务器的 IP 或者 虚拟机 的 IP)
1、首先需要把 sandbox 相关的权限校验注释掉

2、发送请求,可以使用 curl 或者 IDEA HttpClient 进行测试
▼text复制代码curl -X POST "http://localhost:8090/executeCode" \ -H "Content-Type: application/json" \ -d '{ "code": "public class Main {\n public static void main(String[] args) {\n int a = Integer.parseInt(args[0]);\n int b = Integer.parseInt(args[1]);\n System.out.println(\"结果:\" + (a + b));\n }\n}", "language": "java", "inputList": ["1 2", "3 4"] }'
或者使用 IDEA HttpClient 进行测试
▼text复制代码### POST http://localhost:8090/executeCode Content-Type: application/json { "code": "public class Main {\n public static void main(String[] args) {\n int a = Integer.parseInt(args[0]);\n int b = Integer.parseInt(args[1]);\n System.out.println(\"结果:\" + (a + b));\n }\n}", "language": "java", "inputList": ["1 2", "3 4"] }
3、服务器上如果多次运行可能会有很多 container 把对应 sandbox 测试启动的全部删除,可以执行下面的命令
▼text复制代码docker ps -a --filter "ancestor=openjdk:8-alpine" -q | xargs -r docker rm -f
部署上线
Linux 部署 Nacos
安装依赖环境
Ubuntu
1)更新系统软件包
▼text复制代码sudo apt-get update
2)安装对应的依赖 wget unzip Java
▼text复制代码sudo apt-get install wget unzip openjdk-8-jdk
CentOS
1)更新系统软件包
▼text复制代码sudo yum update -y
2)安装对应的依赖 wget unzip Java
▼text复制代码sudo yum install -y wget unzip java-1.8.0-openjdk
下载 Nacos
1、下载文件
1)进入工作目录
▼text复制代码cd ~
2)创建目录
▼text复制代码mkdir nacos
3)进入目录,并且下载 zip 文件
▼text复制代码wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.zip
这个速度可能会比较慢,可以本地下载好的上传到服务器上
2、解压文件
▼text复制代码unzip nacos-server-2.2.0.zip
3、设置数据库
先创建一个数据库
▼mysql复制代码CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
然后在对应数据库下执行 nacos/conf/mysql-schema.sql 建表语句
然后修改 nacos/conf/application.properties 的内容
下面是源文件内容
修改成
▼properties复制代码### If use MySQL as datasource: spring.datasource.platform=mysql ### Count of DB: # db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=nacos # mysql 用户名 db.password.0=nacos # mysql 密码
4、进入 bin 目录启动
▼text复制代码cd nacos/bin
▼text复制代码sudo bash startup.sh -m standalone
这里如果是 Ubuntu 的话一定要用 bash startup.sh -m standalone 如果是 sh 会报错 Caused by: java.net.UnknownHostException: jmenv.tbsite.net at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
5、访问 web 管理页面
首先要把服务器的 8848 打开,如果有宝塔 8848
http://服务器IP:8848/nacos/index.html
6、关闭 Nacos
▼text复制代码sudo bash shutdown.sh
Linux 原生安装 RabbitMQ
安装 DNF
1、
▼text复制代码yum install epel-release
2、
▼text复制代码yum install dnf
安装成功
安装 RabbitMQ
1、指定仓库
▼text复制代码sudo dnf install -y https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm
2、安装 rabbitmq 默认会安装 erlang
▼text复制代码sudo dnf install -y rabbitmq-server-3.3.5-34.el7
3、开启 web 管理页面
▼text复制代码sudo rabbitmq-plugins enable rabbitmq_management
4、启动 RabbitMQ
▼text复制代码sudo systemctl start rabbitmq-server
5、查看运行状态
▼text复制代码systemctl status rabbitmq-server
6、设置开机自启动
▼text复制代码sudo systemctl enable rabbitmq-server
登录 web 管理界面
默认账号、密码都是 guest
要是报错就自己再仔细看看是不是输入错误了
创建用户&禁用默认用户远程访问
- 创建用户
- 允许远程连接
重要
关闭允许 guest 用户远程访问,为了安全
Docker 部署 Nacos
如果速度比较慢的话可以设置一下 register 教程
1、下载镜像
▼dockerfile复制代码docker pull nacos/nacos-server:v2.2.0
2、查看 image
▼dockerfile复制代码docker images
3、初始化数据库
可以找到本地 nacos/conf/mysql-schema.sql
先创建数据,在使用数据库进行创建 sql
▼text复制代码CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
4、启动 Nacos
▼dockerfile复制代码docker run \ --name nacos \ -d \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ --restart=always \ -e MYSQL_SERVICE_USER=root \ -e MYSQL_SERVICE_PASSWORD=密码 \ -e MYSQL_SERVICE_HOST=127.0.0.1 \ -e MYSQL_SERVICE_DB_NAME=nacos_config \ -e MODE=standalone \ nacos/nacos-server:v2.2.0
启动成功!
Docker 安装 RabbitMQ
Docker 安装就相对简单很多了!
1、下载 rabbitmq
▼text复制代码docker pull rabbitmq:3.12.13-management
2、运行 rabbitmq
▼text复制代码docker run -d --name=rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.12.13-management
3、登录 web 管理界面
地址: http://服务器IP:15672
账号、密码默认 guest
4、看上面关于 创建用户&禁用默认用户远程访问 章节
上线
修改配置文件,参考上面本地运行【修改配置文件】
后面参考这个 『 后端部署(通用) 』

