使用nginx和jdk部署halo2.0(包含console前端)
前言
halo2.0已经发布,目前很少看到有部署2.0版本的,且大部分都是通过官网进行docker
部署,今天来试一下不使用docker,仅用java -jar 和nginx启动halo2.0的前端与后端服务。
1、准备open-jdk17、Node.js 18、Gradle7.4
1.1 下载 open-jdk17.
1.2 下载Node.js 18.
1.3 下载Gradle7.4.
Node.js最好下载zip版本,.msi安装版本好像会覆盖自己电脑原有安装的node.js,如果你之前的node.js也是使用的.msi安装的话
gradle的安装与配置可以参考这个博客:
https://blog.csdn.net/qq_24678763/article/details/127648884
2、配置环境变量
Node.js 18需要配置到环境变量中,jdk与gradle在idea里面添加即可,详细配置相信大家都会,这里就不展开说了
如果gradle进行BUILD失败了,可以看下idea配置是否正确
此处的配置对应环境变量中的gradle_user_home路径
如果还不行,可以尝试在gradle.properties里加入 org.gradle.java.home=D:\software\Java\jdk-17.0.5(你的jdk目录)
3、启动halo及打包
3.1 启动
在idea里配置好jdk17和Gradle7.4后,项目会进行编译,然后就可以照着官网进行启动项目
3.1.1 将 Active Profiles 改为 dev,win,如图所示:
3.1.2 dev与win配置文件
# application-dev.yaml
server:
port: 8090
spring:
output:
ansi:
enabled: always
thymeleaf:
cache: false
halo:
console:
proxy:
endpoint: http://localhost:3000/
enabled: true
security:
initializer:
super-admin-username: admin
super-admin-password: admin
plugin:
runtime-mode: development # development, deployment
classes-directories:
- "build/classes"
- "build/resources"
lib-directories:
- "libs"
# 将地址改为对应目录,方便查找
work-dir: /data/service/halo/halo2-dev
#work-dir: ${user.home}/halo2-dev
logging:
level:
run.halo.app: DEBUG
org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler: DEBUG
springdoc:
api-docs:
enabled: true
swagger-ui:
enabled: true
show-actuator: true
management:
endpoints:
web:
exposure:
include: "*"
# application-win.yaml
spring:
r2dbc:
url: r2dbc:h2:file:///~/halo2-dev/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE
halo:
#work-dir: ${user.home}/halo2-dev
work-dir: /data/service/halo/halo2-dev
需要关注的配置,一个是work-dir: ${user.home}/halo2-dev,这个最好改为自己熟悉的地址,后续在服务器上运行也方便查找
另一个是
halo:
console:
proxy:
endpoint: http://localhost:3000/
enabled: true
这个配置需要明确的是,它针对的是开发环境使用的,部署到服务器不需要此配置
下面列一下当时提交这段代码的注释:
大概意思是:此功能应仅适用于开发环境,而不是生产环境。
OK,了解完这些后,我们就可以将halo服务启动起来,并且访问http://localhost:8090/能看到默认的主题即可
3.2 打包
在服务器上部署,我们使用application.yaml的配置文件,打包前,先修改对应的地址
server:
port: 8090
compression:
enabled: true
error:
whitelabel:
enabled: false
spring:
output:
ansi:
enabled: detect
r2dbc:
#url: r2dbc:h2:file:///${halo.work-dir}/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE
#username: admin
#password: 123456
url: r2dbc:h2:file:///~/halo2-dev/db/halo-next?MODE=MySQL&DB_CLOSE_ON_EXIT=FALSE
sql:
init:
mode: always
platform: h2
codec:
max-in-memory-size: 10MB
messages:
basename: config.i18n.messages
halo:
#external-url: "http://${server.address:localhost}:${server.port}"
# 如果是域名修改为http://yuming.com即可
external-url: "http://111.22.333.44:8090"
#work-dir: ${user.home}/.halo2
work-dir: /data/service/halo/.halo2
plugin:
plugins-root: ${halo.work-dir}/plugins
attachment:
resource-mappings:
- pathPattern: /upload/**
locations:
- migrate-from-1.x
springdoc:
api-docs:
enabled: false
logging:
file:
name: ${halo.work-dir}/logs/halo.log
logback:
rollingpolicy:
max-file-size: 10MB
total-size-cap: 1GB
max-history: 0
1、修改r2dbc下的数据库为自己对应数据库,我这边为图方便,还是使用的内置的h2数据库
2、修改work-dir为自己服务器上的目录,并且确保在服务器上执行命令的用户有创建文件的权限
3、修改external-url为自己服务器的ip+端口,至于为什么不使用原来的配置,在上面增加server.address=ip,是因为这样配置后,启动项目时会报错8090端口被占用,此处的错误原理没有细究,如果有知道的同学可以评论学习下
修改完配置文件后即可进行打包操作
打包点击右侧的Gradle,使用build目录下的bootJar即可
打完包后,相应的jar在目录build/libs下
4、启动console及打包
4.1 启动
启动console时,首先保证console所在目录的node版本是v18(配置环境变量即可)
console启动起来的端口,在vite.config.ts文件下配置,修改此处即可改变console的端口
注意:如果是开发环境,vite.config.ts下的端口配置必须和halo的application-dev.yaml下的endpoint相同
后续的操作在READMIN.md中都有
开发环境运行
# pnpm@7.0.0+
npm install -g pnpm
pnpm install
pnpm build:packages
pnpm dev
生产构建
pnpm build
使用pnmp dev启动后,访问http://localhost:8090/console即可看到后台页面
4.2 打包
在打包之前,需要修改.env.production文件
VITE_API_URL=http://111.22.333.44:8090
VITE_BASE_URL=/
需要注意VITE_API_URL必须是部署服务器的ip+端口
打包
pnpm build
打包完成,看到dist文件夹即可
5、部署
这边我准备了两种部署方式,一种是前后端单独部署,一种是前后端整合部署,下面我会单独说下这两种部署模式
注:以下涉及到的8090、3000等端口,都必须开通
5.1、vue+spring boot单独部署
5.1.1、上传文件
基于之前的打包,我们会获取前端的dist文件夹和halo后端的jar包,将这两个文件上传到自己的服务器上
通过前面地址,下载jdk17的zip解压版,将其传到服务器上
[admin@test-webapp-svr20 halo]$ pwd
/data/service/halo
[admin@test-webapp-svr20 halo]$ ll
total 91828
drwxr-xr-x 3 admin grpadmin 4096 Jan 5 16:01 dist
-rw-r--r-- 1 admin grpadmin 93995468 Jan 6 09:42 halo-2.1.0-SNAPSHOT.jar
drwxr-xr-x 7 admin grpadmin 4096 Jan 5 14:53 halo2-dev
drwxr-xr-x 3 admin grpadmin 4096 Jan 3 18:21 jdk17
-rw------- 1 admin grpadmin 9850 Jan 4 12:28 nohup.out
-rwxr-xr-x 1 admin grpadmin 515 Jan 5 14:50 start.sh
5.1.2、编写启动脚本start.sh
#!/bin/bash
PROJECT_NAME="halo-2.1.0-SNAPSHOT.jar"
echo "查询进程id-->${PROJECT_NAME}"
PID=`ps -ef | grep ${PROJECT_NAME} | awk '{print $2}'`
echo "得到进程ID:${PID}"
echo "结束进程"
for id in ${PID}
do
kill -9 ${id}
echo "killed ${id}"
done
echo "结束进程完成"
echo "启动服务"
BUILD_ID=dontKillMe nohup /data/service/halo/jdk17/jdk-17.0.5/bin/java -Xms4096m -Xmx4096m -Dfile.encoding=UTF-8 -jar ${PROJECT_NAME} > /dev/null 2>&1 &
echo "服务完成"
上面是一个简单的启动脚本,大家主要关注下最终的启动命令即可
因为我们要使用application.yaml配置启动,所以没有配置-Dspring.profiles.active,如果想指定单独的配置文件增加这个配置即可
例如使用dev和win启动:
/data/service/halo/jdk17/jdk-17.0.5/bin/java -Xms4096m -Xmx4096m -Dfile.encoding=UTF-8 -jar -Dspring.profiles.active=dev,win ${PROJECT_NAME} > /dev/null 2>&1 &
5.1.3、启动halo后端
# 在/data/service/halo下执行
[admin@test-webapp-svr20 halo]$ ./start.sh
# 启动起来后,进入/data/service/halo/.halo2目录 此配置对应applicat.yml的配置地址
[admin@test-webapp-svr20 halo]$ cd halo2-dev/.halo2
[admin@test-webapp-svr20 .halo2]$ ll
total 20
drwxr-xr-x 3 admin grpadmin 4096 Jan 5 16:07 attachments
drwxr-xr-x 2 admin grpadmin 4096 Jan 5 14:53 db
drwxr-xr-x 3 admin grpadmin 4096 Jan 5 14:53 indices
drwxr-xr-x 2 admin grpadmin 4096 Jan 6 02:24 logs
drwxr-xr-x 4 admin grpadmin 4096 Jan 5 16:08 themes
启动后,在网站上访问http:111.22.333.44:8090,看到初始主题即可
5.1.4、使用nginx配置console
首先将console打包的dist目录放到/data/service/halo目录下
[admin@test-webapp-svr20 halo]$ pwd
/data/service/halo
[admin@test-webapp-svr20 halo]$ ll
total 91828
drwxr-xr-x 3 admin grpadmin 4096 Jan 5 16:01 dist
-rw-r--r-- 1 admin grpadmin 93995468 Jan 6 09:42 halo-2.1.0-SNAPSHOT.jar
drwxr-xr-x 7 admin grpadmin 4096 Jan 5 14:53 halo2-dev
drwxr-xr-x 3 admin grpadmin 4096 Jan 3 18:21 jdk17
-rw------- 1 admin grpadmin 9850 Jan 4 12:28 nohup.out
-rwxr-xr-x 1 admin grpadmin 515 Jan 5 14:50 start.sh
其次打开服务器nginx的配置文件nginx.conf(简单配置)
server {
#与console下vite.config.ts的端口一致
listen 3000;
server_name localhost;
root /data/service/halo/dist/;
location / {
root /data/service/halo/dist/;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
}
到nginx的sbin目录下重启nginx
./nginx -s reload
重启后,在网站上访问http:111.22.333.44:3000,看到后端登录页面部署就成功了
注意:如果使用域名的形式,在nginx配置文件增加相应配置即可,但是在halo的application.yml配置文件中:external-url要为域名地址
5.2、vue+spring boot整合部署
使用vue+spring boot整合部署时,与之前的流程没有太大差别
主要是需要先进行console打包,将打包的dist文件夹,放到halo的resources-static目录下
后续流程与上面一致
先对halo进行打包,然后将打包的jar上传到服务器上进行运行即可
启动后,先访问http:111.22.333.44:8090/进入主题页面
访问http:111.22.333.44:8090/index.html 进入后台页面
2023-1-11 补充========================
5.3、官网部署
今日发现官网其实提供了如何部署console的方式,只是之前没有看到,后续的同学可以使用官方的方式部署,与5.2版本的方式其实大致一致
后续流程与上面一致
先对halo进行打包,然后将打包的jar上传到服务器上进行运行即可
启动后,先访问http:111.22.333.44:8090/进入主题页面
访问http:111.22.333.44:8090/console 进入后台页面
6、总结
使用jdk+nginx运行只是一种尝试方式,如果大家能用docker部署成功那是最好的~