OJ项目部署上线笔记(前端+后端部署)
后端部署(yuoj-backend-microservice-master):
1、使用的服务器规格说明:我使用的是2核4g的服务器,2g内存的服务器可能运行不起来,服务器系统使用的是centos 7.9; ssh连接工具是 MobaXterm
2、后端部署可以先观看鱼皮的这个视频(看视频的时候先别操作,请看完下方部署注意事项后再操作):
https://www.bilibili.com/video/BV1Cp4y1F7eA/?spm_id_from=333.337.search-card.all.click
3、部署注意事项:
①在源码中的yuoj-backend-gateway模块中的Dockerfile文件中的EXPOSE 8104应该修改为EXPOSE 8101;
注:服务器的相关端口一定要开放!!!
②为防止服务器的内存小导致项目无法成功启动,请将项目中所有的Dockerfile文件中的启动命令里添加上JVM的内存参数设置,如图所示:
③由于oj项目的远程代码沙箱是作为一个项目独立运行的,也需要打包上线,所以应该将yuoj-backend-judge-service模块中的RemoteCodeSandbox类里的executeCode方法中的url路径进行修改,将红框中的localhost修改为服务器的ip地址(这是偷懒的做法);(应该修改url,让其可以动态的读取application-prod.yml里的值,具体做法可以参考鱼皮视频里提及的InitRabbitMqBean类里的写法);
注意:一定要开放服务器的8090端口!!!
④使用docker compose命令一次性启动项目中所有模块的时候,可能会出现某个项目无法成功启动,此时我们可以使用docker compose -f docker-
compose.service.yml up “模块名” -d 命令进行重新启动(就像鱼皮视频中演示的一样)
建议:使用docker compose -f docker-compose.service.yml up “模块名” -d 命令 一个模块一个模块地启动,防止某个模块因为内存分配不足导致启动失败。
注:可以使用docker ps -a 命令查看容器是否都处于运行状态
注:项目部署上线后,如果你在本地修改了某个模块的代码,要在本地重新打包,把jar包重新上传到服务器对应的位置上(即该模块在服务器上对应的目录的target目录里),然后要把该模块的容器停止了,然后删除该容器,然后再把该模块的镜像删除了,最后再使用docker compose命令重新构建容器
⑤服务器上下载的maven版本要在3.1以上,因为远程代码沙箱项目在服务器上打包的话,需要服务器上的maven的版本在3.1以上。(请自行搜索linux系统上如何下载对应版本的maven)
后端部署(yuoj-code-sandbox-master):
1、远程代码沙箱项目也是使用Docker部署的:
①在服务器的code文件下创建和项目名相同的目录 即/code/yuoj-code-sandbox-master/ (如图)
将yuoj-code-sandbox-master项目中的文件从本地都上传到服务器的/code/yuoj-code-sandbox-master/ 目录下,如图。 而后可以使用mvn命令进行打包(如果服务器上使用mvn命令打包失败,可以在本地打好jar包后,将整个项目重新上传到服务器)
然后在yuoj-code-sandbox-master目录下创建Dockerfile文件(如图)
Dockerfile文件里的内容:
▼text复制代码# 基础镜像 FROM openjdk:8-jdk-alpine # 将 jar 包添加到工作目录,比如 target/yuoj-backend-user-service-0.0.1-SNAPSHOT.jar ADD target/yuoj-code-sandbox-0.0.1-SNAPSHOT.jar . # 暴露端口 EXPOSE 8090 # 启动命令 ENTRYPOINT ["java","-Xms128m", "-Xmx256m","-jar","/yuoj-code-sandbox-0.0.1-SNAPSHOT.jar"]
②在服务器的code文件夹下创建docker-compose.service.yml文件,如图:
docker-compose.service.yml文件里的内容如下:
▼text复制代码version: '3' services: yuoj-code-sandbox-master: container_name: yuoj-code-sandbox-master build: context: ./yuoj-code-sandbox-master dockerfile: Dockerfile ports: - "8090:8090" networks: - mynetwork networks: mynetwork:
③在code目录下使用docker compose命令,如下:
▼text复制代码docker compose -f docker-compose.service.yml up yuoj-code-sandbox-master -d
④使用docker ps -a 命令查看yuoj-code-sandbox-master容器是否启动成功,若不成功请重新执行步骤③
使用docker ps -a 命令查看所有容器都正常运行则表明部署成功(也可以访问 ip:8101/doc.html 使用聚合文档验证)注意该ip为你自己服务器的公网ip
前端部署(yuoj-frontend-master):
1、在本地进入yuoj-frontend-master\generated\core里,点击OpenAPI.ts,修改OpenAPIConfig里的配置,如图:
注:如果是使用域名访问,请将BASE里的地址修改为 http://域名 (例如:http://www.oj.com) ; 如果是使用服务器的ip访问,就将BASE里的localhost改为服务器的公网ip地址;此外还需将WITH_CREDENTIALS里的值改为true,如图:
2、在终端运行 npm run build命令将项目进行打包,然后生成一个dist文件夹
3、在服务器的code目录下创建一个与前端项目同名的文件夹,即/code/yuoj-frontend-master/ 如图:
4、将刚刚在本地生成的dist文件夹,上传到服务器的yuoj-frontend-master目录下,如图:
此时前后端项目都已经部署到服务器上,但是还需要nginx进行代理转发(请自行搜索Linux系统如何下载nginx)
注意:一定要开放服务器的80端口
1、找到nginx.conf,修改nginx.conf里server块的配置
注意:如果nginx是使用yum命令下载的,server块在/etc/nginx/conf.d/下的default.conf文件里
server块修改如下(填写完server_name那行的ip后,ip后面是有个 ; 的):
注意:root后面的目录就是dist文件夹在服务器上的位置,
此外在location / 模块里还需添加try_files $uri $uri/ /index.html;
2、在正确的目录下使用 ./nginx -s reload 命令(使用该命令前请确保nginx已经启动)重新加载nginx的配置文件(例如nginx是使用yum下载的,应在/usr/sbin目录下使用该命令)
注意:如果使用./nginx -s reload 命令后报错,则按提示信息修改配置文件里的内容,然后再重新执行./nginx -s reload 命令
