OJ 后端运行&部署教程

环境准备

本地启动

初始化数据

连接本地 MySQL

image-20241030155405801 image-20241030155543228

点击 Download 下载 driver files

image-20241030155613559

输入,账号密码之后点击Test Connection 成功之后直接点击 OK

image-20241030155950071

找到根目录 sql 目录下面的 create_table.sql

微服务版本在根目录 mysql-init

image-20241101144139040 image-20241101130503929

CTRL + A 右键选择 Execute

image-20241101130928854 image-20241101131053215

创建成功之后,我们右侧的 DataBase 里面有 yuoj 数据库还有其他六个表,如果没有找到的话就看 @localhost 右侧的 1 of 24 点击看看里面有没有 yuoj

image-20241101131312947

运行非微服务版本

使用 IDEA 打开项目

image-20241030153313475 image-20241030153800902 image-20241030153859685

安装依赖

  • 首先需要配置好本地 Mavne, 和阿里云镜像,要是没有配置的话可以看一下这篇文章
image-20241101132208029

然后可以在 Build 看到正在下载依赖

image-20241101132248226

选择 Java 版本

image-20241101132905013 image-20241101133241046
  • 本地没有 JDK 可以直接 Download JDK
  • 本地有 JDK 但是没识别到 Add JDK from disk 选着对应目录即可

修改配置文件

配置文件在 resources 目录

image-20241101133355503
  • 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 让配置文件中文正常显示,如果还是不行的话就把配置文件里面的中文删除即可

image-20250225212643334

本地运行

image-20241101142811288

右下角会有 Lombok require enable annotation processing 直接点 Enable annotation processing 即可

image-20241101142832527

启动成功

image-20241101143152108

运行微服务版本

安装依赖

image-20241102143841113

安装 Nacos 2.2.0

下载之后解压到常用安装软件的目录

进入到 nacos/bin 目录下

text
复制代码
cd nacos/bin
image-20241102171050965

Windows

text
复制代码
startup.cmd -m standalone
image-20241102171233978

Linux/mac

text
复制代码
sh startup.sh -m standalone

安装 RabbitMQ

1、安装 Erlang + RabbitMQ 先安装 Erlang

image-20240927005741030

选择 是

image-20240927005735279 image-20240927005819602 image-20240927005835856 image-20240927005847403 image-20240927005941421

2、安装 RabbitMQ 直接双击 exe 程序即可安装

image-20240927010036491 image-20240927010100135 image-20240927010111401 image-20240927010146493 image-20240927010330897 image-20240927010355970 image-20240927010409998

3、启动 RabbitMQ

1)搜索 cmd -> 以管理员身份运行

image-20240927013101415

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
image-20240927014128347

4)依次输入下面的命令

text
复制代码
rabbitmq-service.bat stop rabbitmq-service.bat install rabbitmq-service.bat start
image-20240927014336375 image-20240927014510092 image-20240927014536826

5)然后可以直接在浏览器上 http://localhost:15672/mgmt

账号:guest

密码:guest

image-20240927014655951

6)重启后这么启动呢?一般默认重启之后自启动

win + R 输入 services.msc

找到 RabbitMQ 右键 Start

image-20240927183034440

启动成功

image-20240927183109001

修改配置文件

配置文件在下面项目的 resources 目录

  • yuoj-backend-judge-service
  • yuoj-backend-question-service
  • yuoj-backend-user-service
image-20241101133355503
  • 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

image-20250225210007861

修改成对应的虚拟机 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"] }
image.png

当然使用这种方式如果不把对应的接口的权限认证先注释掉,请求会报错

image.png

2、一般是防火墙的问题,首先确认自己的虚拟机是否开启防火墙

关闭 ufw 防火墙

text
复制代码
sudo ufw disable

启动

必备环境

1)MySQL

2)Redis

3)Nacos 运行状态

4)RabbitMQ

打开之后可以按照一下顺序进行启动

  1. YuojBackendGatewayApplication
  2. YuojBackendJudgeServiceApplication
  3. YuojBackendQuestionServiceApplication
  4. YuojBackendUserServiceApplication
image-20241105113419057

启动成功效果

image-20241105111942910

运行 sandbox

Linux 有两种选择

1、本地虚拟机 安装教程

2、远程服务器

我测试的远程服务器是 2 核 2G 但是开发不太卡,可能是我把能关的都关了的原因 + 再加上我设置了虚拟内存的缘故,但是有能力还是 2 核 4G

下面是我未启动 SpringBoot + 还有一个 Docker 占用情况

image-20241030154450834

IDEA 远程连接 Linux

image-20241030145617724 image-20241030145708772 image-20241030150532066

如果配置不高可能会报错,但是没大问题,直接选择 Continue Anyway

还有一个原因,我设置了Linux 的 虚拟内存

image-20241030150726620

选着根目录可以选择 /root/idea 路径,输入下面命令创建

text
复制代码
mkdir -p /root/idea
image-20241030151550986

如何第二次打开呢?

image-20241030145617724 image-20241030151740533 image-20241030152100328

安装 Java

Ubuntu

设置Ubuntu阿里镜像

1、安装 Java

1)更新系统软件包

text
复制代码
sudo apt-get update

2)安装 OpenJDK 8

text
复制代码
apt-get install openjdk-8-jdk
image-20241029223613203

输入 y 回车

安装完成

image-20241029223720069

2、验证是否安装成功

text
复制代码
java -version
image-20241029223814933
text
复制代码
javac -version
image-20241029223931023

CentOS 也是同理

设置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
image-20241029225400055

3、验证 maven 是否成功

text
复制代码
mvn -version
image-20241029225621875

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>
image-20241029231552258

之后切换到命令行模式输入 :wq 即可退出保存成功

远程设置 Java 版本和 Maven

选择 Java 版本

image-20241029232642335 image-20241029232736197

选择自己本地安装的 Maven

image-20241029230352354

/usr/share/maven 选择自己安装的 Maven

image-20241029230907030

选择 User setting file 路径为 /usr/share/maven/conf/setting.xml

image-20241029230721299

最后取消选择 Use setting from .mvn/maven.config

image-20241029231001319

Terminal 里面输入

text
复制代码
mvn install
image-20241030143518918

如果没有找到 Terminal 的话,找到设置 plugins

image-20241030144252694 image-20241030144300849
image-20241030142733818 image-20241030142957504

没用 IDEA 右侧的配置,是因为我配置不高很容易卡

image-20241030143325959

安装 Docker

可以看鱼皮的文章,里面有安装虚拟机 Linux + 安装 Docker 的流程 《搞台虚拟机玩玩》

启动项目

上面都准备好之后,可以直接把 yuoj-code-sandbox 代码上传到虚拟机或者服务器上的 /root/idea 目录,就可以看到代码结构

image-20241029232919502

启动成功

image-20241029233045507

测试 sandbox

运行下面 curl 检查是否运行成功(当然 IP 不一定是 localhost 需要改成自己服务器的 IP 或者 虚拟机 的 IP)

1、首先需要把 sandbox 相关的权限校验注释掉 image.png

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"] }
image.png

3、服务器上如果多次运行可能会有很多 container 把对应 sandbox 测试启动的全部删除,可以执行下面的命令

text
复制代码
docker ps -a --filter "ancestor=openjdk:8-alpine" -q | xargs -r docker rm -f

部署上线

Linux 部署 Nacos

安装依赖环境

Ubuntu

设置Ubuntu阿里镜像

1)更新系统软件包

text
复制代码
sudo apt-get update

2)安装对应的依赖 wget unzip Java

text
复制代码
sudo apt-get install wget unzip openjdk-8-jdk

CentOS

设置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
image-20241103170938289

3、设置数据库

先创建一个数据库

mysql
复制代码
CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

然后在对应数据库下执行 nacos/conf/mysql-schema.sql 建表语句

然后修改 nacos/conf/application.properties 的内容

下面是源文件内容

image-20241103225328866

修改成

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
image-20241103171138299
text
复制代码
sudo bash startup.sh -m standalone
image-20241103171102914

这里如果是 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
image-20241103214451131

Linux 原生安装 RabbitMQ

安装 DNF

1、

text
复制代码
yum install epel-release
image-20241009203545454

2、

text
复制代码
yum install dnf
image-20241009203632789

安装成功

image-20241009203651254

安装 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
image-20241009211123061

3、开启 web 管理页面

text
复制代码
sudo rabbitmq-plugins enable rabbitmq_management

4、启动 RabbitMQ

text
复制代码
sudo systemctl start rabbitmq-server

5、查看运行状态

text
复制代码
systemctl status rabbitmq-server
image-20241009212252468

6、设置开机自启动

text
复制代码
sudo systemctl enable rabbitmq-server

登录 web 管理界面

http://服务器IP:15672

image-20241009214139890

默认账号、密码都是 guest

要是报错就自己再仔细看看是不是输入错误了

创建用户&禁用默认用户远程访问

  • 创建用户
  • 允许远程连接
image-20241009200510767 image-20241009200822956 image-20241009200851259

重要

关闭允许 guest 用户远程访问,为了安全

image-20241009201040420 image-20241009201140735

Docker 部署 Nacos

如果速度比较慢的话可以设置一下 register 教程

1、下载镜像

dockerfile
复制代码
docker pull nacos/nacos-server:v2.2.0
image-20241105000313361

2、查看 image

dockerfile
复制代码
docker images

3、初始化数据库

可以找到本地 nacos/conf/mysql-schema.sql

先创建数据,在使用数据库进行创建 sql

text
复制代码
CREATE DATABASE nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
image-20241105004509708

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

启动成功!

image-20241105010150373

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
image-20241009213651818

3、登录 web 管理界面

地址: http://服务器IP:15672

账号、密码默认 guest

image-20241009214146062

4、看上面关于 创建用户&禁用默认用户远程访问 章节

上线

修改配置文件,参考上面本地运行【修改配置文件】

后面参考这个 『 后端部署(通用) 』

相关专栏

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
leikooo
下载 APP