有点突发奇想,又有点心血来潮,想把之前做的CSU-OJ系统部署到服务器上,于是乎写下了这篇教程。

1.服务器购买

我是在腾讯云上购买的服务器,本来还在想这个2h4g的服务器也太贵了吧,一个月就要100米,然后群里有个老哥说可以买幻兽帕鲁的服务器,2h16g,一个月只要32,我直接说老哥你真牛,这波羊毛被你薅到了。于是我买了一个月的幻兽帕鲁的服务器,然后改装了一下。
服务器购买地址:服务器
服务器价格

2.服务器初始化

2.1 重装系统

首先进入控制台,在应用管理的界面找到重装系统,然后我们重装系统为 宝塔Linux面板 8.0.5 腾讯云专享版 ,用宝塔主打一个方便快捷。
然后我们在防火墙处开放8888端口,为了安全起见,可以编辑我们的可访问ip为我们主机的ip地址。
ip

2.2 装配环境

然后我们点击登录,在腾讯的命令行界面输入登入宝塔的命令(登录按钮旁边有命令),之后就可以进入宝塔界面了!
界面

我们在跳出来的基本配置安装弹窗中选择LNNP即可。(下图为安装完之后)
lnmp

顺便我们可以在面板设置->面板账户,面板密码界面把账号和密码修改一下。

3.部署规划

可以想一下我们项目需要什么依赖,路径地址是什么。
前端:http://ip

后端:http://ip/api 实际运行在8121端口,默认用nginx做转发(避免跨域问题的麻烦)。

代码沙箱 http://ip:8090/executeCode 运行在8080端口。

nginx:80端口

数据库:3306端口

Redis:6379端口

Java

Maven

4.安装依赖

搜索Redis,直接安装7.2.4 stable版本。
redis

4.1 安装MySQL数据库

首先得先检查一下我们防火墙的端口,要把3306端口开放一下。

然后在数据库界面添加一个新的数据库,添加完之后我们可以在IDEA或者Navicat上先连接这个数据库,然后我们再运行SQL文件.从而将数据库的数据导入到这个新建的远程数据库中去。
mysql

导入完之后就是这样子咯
导入

4.2 安装Redis依赖

我们可以先尝试访问一下Redis,发现是不可以访问的,这是因为我们的Redis没有设置访问权限
访问

我们要先在宝塔里面设置一下访问权限的问题。在Redis的设置,性能设置界面,我们先把我们的bind设置为0.0.0.0,让外网可以访问我们的redis,然后设置一下密码。这样我们的本机就可以访问redis了,(后续得修改,不能用0.0.0.0,不然会被入侵)。

如果还不行的话,可能是防火墙没有打开。

4.3 Java环境的安装

我们在宝塔->网站->Java项目中添加Java环境,我们选择添加jdk1.8.0
java

然后我们在命令行中安装maven,输入以下命令
maven

5.部署代码沙箱到服务器上去

首先我们在IDEA 的maven中执行package命令,将代码沙箱打包成一个jar包。
jar

打包完成之后我们可以现在本地测试一下,用java -jar 命令运行以下jar包看看可不可以。
如果没有问题的话,我们再将jar包上传到宝塔面板中去:
点击文件,然后在www/wwwroot目录下,我们将jar包拖上去就ok了。

上传完之后,我们就可以建立一个新的java项目了:
点击网站,然后添加Java项目,选择jar包,改端口为8090,然后设置开机自启,点击提交,就ok啦!
我们可以通过该页面的设置->项目日志,来查看项目的日志。由此判断项目是否处于运行状态中。

怎么判断能不能用呢?我们可以在我们的后端中,调用一下服务器ip+8090的端口,看看项目能否正常运行,可以的话,说明代码沙箱是部署成功的!
判断

提示一下,如果发现执行不了的话,可能是没有开放8090端口噢!
判断
通过就是ok的啦!

6.部署前端

  1. 修改跨域ip为服务器ip;
  2. 打包前端文件,命令是yarn build,如果遇到问题,可以自行百度一下,一般不会有问题;

我这里出现的问题是编译报错JavaScript heap out of memory,node内存溢出,Exit status 134。这个的话其实是js文件太大了,导致不能构建出来项目,解决方案就是 打开cmd窗口,然后输入 这条命令 即可。
setx NODE_OPTIONS --max_old_space_size=4096

  1. 然后我们进入宝塔面板,点击网站,点创建php项目(其实就是前端),然后我们将dist文件导入进去,设置好域名(没有域名的话可以先用ip代替)。这样前端就部署完成了。
  2. 这里可能有个坑,就是输入网址时nginx可能报404的错误,这是因为框架的路由,实际上是没有部署当前这个网址到nginx上的,所以我们得用一条命令转发到index.html上,具体命令我们可以查看这个网址:https://router.vuejs.org/guide/essentials/history-mode.html#nginx

7.部署后端

  1. 修改application.properties文件中的MySQL的url、用户名、密码;

  2. 修改redis的url、密码;

  3. 执行mvn的package命令,将项目打包成一个jar包;

  4. 可以先在本地上测试一下jar包,我这里出现了一个bug:
    bug
    排查之后发现,应该是文心一言的java版本,不能用1.8,得用17及以上的。

  5. 上传jar包到服务器上;(跟代码沙箱那一步是一样的)

  6. 这里我遇到了两个坑,我之前在防火墙那里设置了只能我的本机访问Redis和MySQL,然后部署上去我发现后端也访问不了,所以在防火墙那里还要加入服务器的ip允许策略。

  7. 在前端nginx那里加入以下命令,将api网址下的都转发到8121端口下。

    location /api {
    proxy_pass http://127.0.0.1:8121;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_buffering off;
    proxy_set_header Connection “”;
    }

8.前后端联调测试

测试一下基本流程,没有问题,舒服了,家人们~
完全体
后续的工作:可以把域名加进去,之前买了个域名,现在可以派上用场了。

绑定域名的话我打算再出一篇文章,内容包括:如何购买域名,如何在宝塔上绑定域名,如何在DNS服务商处解析DNS域名。

参考

https://juejin.cn/post/7266374030147076157

https://blog.csdn.net/Jacksun_huang/article/details/90054923