# 后端部署

说明

本文档部署的服务器版本为centos7,项目编译打包用到了jdk 1.8.0_333maven 3.6.3,构建、推送镜像用到了docker 20.10.17

在后端部署之前请先完成中间件的部署,部署详细可以参考 中间件部署

# 问题指引

未指定maven版本导致打包出错 镜像启动报错
权限管理中权限数据不完整 点击登录按钮无法进入首页

# 文档指引

JetLinks-Pro Jar包部署 JetLinks-Pro Docker部署
JetLinks-Cloud Jar包部署 JetLinks-Cloud Docker部署

# 拉取源码

  1. 拉取JetLinks pro源码
 $ git clone -b master --recurse-submodules git@github.com:jetlinks-v2/jetlinks-pro.git

具体操作可参考源码获取

  1. 修改配置文件

配置文件示例可参考配置文件

  1. 使用maven命令将项目打包,在代码根目录执行:

linux或者macOS环境下打包:

./mvnw clean package -Dmaven.test.skip=true

windows环境下打包:

mvn clean package '-Dmaven.test.skip=true'
  1. 将jar包上传到需要部署的服务器上。

jar包文件地址: jetlinks-standalone/target/jetlinks-standalone.jar

  1. 使用java命令运行jar包
#启动时,使用默认配置文件
java -jar jetlinks-standalone.jar
# 启动时,修改配置文件中的参数,格式如下
java -jar jetlinks-standalone.jar {--配置文件中的参数}
#命令示例
java -jar jetlinks-standalone.jar --spring.elasticsearch.embedded.enabled=true
#启动时,指定外部配置文件,格式如下
java -jar jetlinks-standalone.jar --spring.config.location={外部配置文件全路径}
#命令示例
java -jar jetlinks-standalone.jar --spring.config.location=D:\code\jetlinks-pro\jetlinks-standalone\src\main\resources\application.yml

说明

在线部署和离线部署的区别:

在线部署:服务器在有网络环境,能够获取到镜像仓库中的镜像时,推荐使用在线部署,在dc配置文件中填写镜像仓库的地址就能直接拉取镜像到服务器上使用。

离线部署:服务器在无网络环境,无法获取到镜像仓库中的镜像时,只有使用离线部署,镜像就只能将镜像手动上传到服务器才能使用。

# docker在线部署

  1. 执行 jetlinks-pro\build-and-push-docker.sh路径下的脚本,脚本具体内容如下
#!/usr/bin/env bash
# 这个的镜像仓库地址需要替换为自己的镜像仓库地址
dockerImage="registry.cn-hangzhou.aliyuncs.com/jetlinks-demo/jetlinks-standalone:$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout)"
./mvnw -Dmaven.test.skip=true \
#以下的子模块若不需要打包可自行删除
-Pmedia -Pedge -Pctwing -Ponenet -Pdueros -Paliyun-bridge -Popc-ua -Pmodbus \
-Dmaven.build.timestamp="$(date "+%Y-%m-%d %H:%M:%S")" \
-Dgit-commit-id="$(git rev-parse HEAD)" \
-Pmedia -T 12 \
clean package
if [ $? -ne 0 ];then
    echo "构建失败!"
else
  cd ./jetlinks-standalone || exit
  docker build -t "$dockerImage" . && docker push "$dockerImage"
fi

提示

请自行准备存放docker镜像的镜像仓库,此处以阿里云仓库为例。
  1. 查看镜像是否推送成功

比较本地生成的digest和镜像仓库推送的digest是否一致,若保持一致则说明推送成功。

$ docker push registry.cn-hangzhou.aliyuncs.com/jetlinks-demo/jetlinks-standalone:2.0.0
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/jetlinks-demo/jetlinks-standalone]
187cb63c5a7d: Layer already exists
29c7de453b8e: Layer already exists
144903481aa9: Layer already exists
849ea2764450: Layer already exists
f49d20b92dc8: Layer already exists
fe342cfe5c83: Layer already exists
630e4f1da707: Layer already exists
9780f6d83e45: Layer already exists
2.0.0: digest: sha256:43d5c8582793f2b352bebb481c50c731d81701735f880478e6d05061c985ca5e size: 3259

java image

# docker离线部署

  1. 在根目录创建镜像打包脚本build-docker.sh,脚本内容如下:
#!/usr/bin/env bash
#定义镜像名
dockerImage="jetlinks-standalone:$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout)"
#下列组件若不需要打包可自行刪去
-Pmedia -Pedge -Pctwing -Ponenet -Pdueros -Paliyun-bridge -Popc-ua -Pmodbus \
./mvnw -Dmaven.test.skip=true \
-Dmaven.build.timestamp="$(date "+%Y-%m-%d %H:%M:%S")" \
-Dgit-commit-id="$(git rev-parse HEAD)" \
-Pmedia -T 12 \
clean package
if [ $? -ne 0 ];then
    echo "构建失败!"
else
  cd ./jetlinks-standalone || exit
  docker build -t "$dockerImage" . 
fi
  1. 在根目录执行脚本./build-docker.sh

  2. 导出镜像 在本地导出,导出的镜像会到源码根目录下,命令格式如下:

docker save -o [命名].tar [镜像名:版本号]

代码示例如下:

docker save -o jetlinks-standalone.tar jetlinks-standalone:2.0.0
  1. 导入镜像 将导出的镜像传入服务器,再使用以下命令将镜像导入服务器
#导入命令格式
docker load -i [镜像名.tar]
#导入命令示例
docker load -i jetlinks-standalone.tar 

# 使用docker-compose文件启动容器

  1. 修改docker-compose文件

修改示例可参考docker-compose文件

  1. 运行docker-compose文件

将docker-compose文件分别上传到每台服务器,再使用docker-compose up -d命令创建并启动容器,最后使用docker ps -a命令验证容器是否启动成功

$ docker ps -a
CONTAINER ID   IMAGE                                                                                COMMAND                  CREATED          STATUS        
               PORTS                                                                                                                NAMES
f303fc2fbd67   registry.cn-hangzhou.aliyuncs.com/jetlinks-demo/jetlinks-standalone:2.0.0-SNAPSHOT   "./docker-entrypoint…"   23 seconds ago   Up 16 seconds 
               0.0.0.0:1883->1883/tcp, 0.0.0.0:8100-8110->8100-8110/tcp, 0.0.0.0:8845->8845/tcp, 0.0.0.0:8200-8210->8200-8210/udp   jetlinks-pro
4e883fed1d0d   registry.cn-shenzhen.aliyuncs.com/jetlinks/jetlinks-ui-vue:2.1.0-SNAPSHOT                     
"/docker-entrypoint.…"   4 days ago       Up 7 minutes  
               0.0.0.0:9000->80/tcp                                                                                                 jetlinks-pro-ui
84a9379e3944   kibana:7.17.3                                                                        "/bin/tini -- /usr/l…"   3 weeks ago      Up 8 minutes  
               0.0.0.0:5601->5601/tcp                                                                                               jetlinks-kibana      
6366d9063dd0   elasticsearch:7.17.3                                                                 "/bin/tini -- /usr/l…"   3 weeks ago      Up 7 minutes  
               0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp                                                                       jetlinks-elasticsearch
7bc603f1e897   postgres:11-alpine                                                                   "docker-entrypoint.s…"   6 weeks ago      Up 7 minutes  
               0.0.0.0:5432->5432/tcp                                                                                               jetlinks-postgres       
4bdba77584ce   redis:5.0.4                                                                          "docker-entrypoint.s…"   2 months ago     Up 7 minutes  
               0.0.0.0:6379->6379/tcp                                                                                               jetlinks-redis

说明

STATUS为up为容器启动成功,STATUS为Exited为容器启动失败。

容器启动失败示例如下:

c0ac281c2877   registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6          "/opt/emqttd/start.sh"   4 days ago       Exited (137) 2days ago        emq                                         
  1. 修改配置文件

配置文件示例可参考配置文件

  1. 修改打包脚本

修改/jetlinks-cloud/build-and-push-docker.sh路径下的打包脚本,修改内如如下:

#!/usr/bin/env bash
servers="$1"
if [ -z "$servers" ]||[ "$servers" = "all" ];then
servers="api-gateway-service,authentication-service,iot-service,file-service"
fi

IFS=","
arr=($a)

version=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
echo "start build : $servers : $version"
./mvnw -Dmaven.test.skip=true \
-Dmaven.build.timestamp="$(date "+%Y-%m-%d %H:%M:%S")" \
-Dgit-commit-id="$(git rev-parse HEAD)" \
-Pmedia -T 12 \
clean package
if [ $? -ne 0 ];then
    echo "构建失败!"
fi
  1. 执行打包脚本

在项目根路径执行

$ ./build.sh 
  1. 将四个服务的jar包上传到需要部署的服务器上。

jar包文件地址:

micro-services/api-gateway-service/target/applicatione.jar
micro-services/authentication-service/target/applicatione.jar
micro-services/file-service/target/applicatione.jar
micro-services/iot-service/target/applicatione.jar
  1. 使用java命令运行jar包,以api-gateway为例
cd ./micro-services/api-gateway-service/target/
#启动时,使用默认配置文件
java -jar jetlinks-applicatione.jar 
# 启动时,修改配置文件中的参数,格式如下
java -jar jetlinks-applicatione.jar {--配置文件中的参数}
#命令示例
java -jar jetlinks-applicatione.jar --spring.elasticsearch.embedded.enabled=true
#启动时,指定外部配置文件,格式如下
java -jar jetlinks-applicatione.jar --spring.config.location={外部配置文件全路径}
#命令示例
java -jar jetlinks-applicatione.jar --spring.config.location=D:\code\jetlinks-cloud-2.0\micro-services\api-gateway-service\src\main\resources\application.yml
  1. 修改打包脚本

修改/jetlinks-cloud/build-and-push-docker.sh路径下的打包脚本,修改内如如下:

#!/usr/bin/env bash
servers="$1"
if [ -z "$servers" ]||[ "$servers" = "all" ];then
servers="api-gateway-service,authentication-service,iot-service,file-service"
fi

IFS=","
arr=($a)

version=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
echo "start build : $servers : $version"
## 使用maven打包
./mvnw -Dmaven.test.skip=true \
-Dmaven.build.timestamp="$(date "+%Y-%m-%d %H:%M:%S")" \
-Dgit-commit-id="$(git rev-parse HEAD)" \
-Pmedia -T 12 \
clean package
if [ $? -ne 0 ];then
    echo "构建失败!"
else

#四个微服务分别构建镜像并推送到仓库
for s in ${servers}
do
 cd "./micro-services/${s}" || exit
 dockerImage="registry.cn-hangzhou.aliyuncs.com/jetlinks-demo/$s:$version"
 echo "build $s docker image $dockerImage"
 docker build -t "$dockerImage" . && docker push "$dockerImage"
 cd ../../
done

fi

提示

请自行准备存放docker镜像的镜像仓库,此处以阿里云仓库为例。
  1. 查看是否推送成功 java image

  2. 修改jetlinks-cloud/micro-services/docker-compose.yml路径下的docker-compose文件

修改示例可参考docker-compose文件示例

  1. 将docker-compose文件分别上传到服务器
  2. 使用docker-compose up -d命令创建并启动容器,使用docker ps -a命令验证容器是否启动成功 docker常用命令请参考docker常用命令
$ docker ps -a
CONTAINER ID   IMAGE                                                                                    COMMAND                  CREATED          STATUS    
                    PORTS                                            NAMES
06f023229b31   registry.cn-hangzhou.aliyuncs.com/jetlinks-cloud/api-gateway-service:2.0.0-SNAPSHOT      "./docker-entrypoint…"   34 seconds ago   Up 2 hours     
                                                    micro-services-api-gateway-service
3e22eddeb8a1   registry.cn-hangzhou.aliyuncs.com/jetlinks-cloud/iot-service:2.0.0-SNAPSHOT              "./docker-entrypoint…"   34 seconds ago   Up 2 hours  
                                                    micro-services-iot-service
44f7f46fc291   registry.cn-hangzhou.aliyuncs.com/jetlinks-cloud/file-service:2.0.0-SNAPSHOT             "./docker-entrypoint…"   34 seconds ago   Up 2 hours  
                                                    micro-services-file-service
ccaefa0d4c72   registry.cn-hangzhou.aliyuncs.com/jetlinks-cloud/authentication-service:2.0.0-SNAPSHOT   "./docker-entrypoint…"   34 seconds ago   Up 2 hours  
                                                    micro-services-authentication-service

说明

STATUS为up为容器启动成功,STATUS为Exited为容器启动失败。

容器启动失败示例如下

06f023229b31   registry.cn-hangzhou.aliyuncs.com/jetlinks-cloud/api-gateway-service:2.0.0-SNAPSHOT      "./docker-entrypoint…"   4 days ago       Exited (137) 2days ago     
                                                    micro-services-api-gateway-service                                         

# docker离线部署

在根目录创建镜像打包脚本build-docker.sh,脚本内容如下

#!/usr/bin/env bash
servers="$1"
if [ -z "$servers" ]||[ "$servers" = "all" ];then
servers="api-gateway-service,authentication-service,iot-service,file-service"
fi

IFS=","
arr=($a)

version=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
echo "start build : $servers : $version"
## 使用maven打包
./mvnw -Dmaven.test.skip=true \
-Dmaven.build.timestamp="$(date "+%Y-%m-%d %H:%M:%S")" \
-Dgit-commit-id="$(git rev-parse HEAD)" \
-Pmedia -T 12 \
clean package
if [ $? -ne 0 ];then
    echo "构建失败!"
else

#四个微服务分别构建镜像并推送到仓库
for s in ${servers}
do
 cd "./micro-services/${s}" || exit
 #定义镜像名
 dockerImage="jetlinks-$s:$version"
 echo "build $s docker image $dockerImage"
 docker build -t "$dockerImage" .
 cd ../../
done
fi

在根目录执行脚本./build-docker.sh

# 导出镜像

导出的镜像会到源码根目录下,命令格式如下:

docker save -o [命名].tar [镜像名:版本号]

命令示例如下:

docker save -o jetlinks-api-gateway-service.tar jetlinks-api-gateway-service:2.0.0-SNAPSHOT
docker save -o jetlinks-authentication-service.tar jetlinks-authentication-service:2.0.0-SNAPSHOT
docker save -o jetlinks-iot-service.tar jetlinks-iot-service-service:2.0.0-SNAPSHOT
docker save -o jetlinks-file-service.tar jetlinks-file-service:2.0.0-SNAPSHOT
  1. 将docker-compose文件分别上传到每台服务器

  2. 导入镜像 使用以下命令将镜像导入服务器

#导入命令格式
docker load -i [镜像名.tar]
#导入命令示例
docker load -i jetlinks-api-gateway-service.tar 
docker load -i jetlinks-authentication-service.tar 
docker load -i jetlinks-iot-service.tar 
docker load -i jetlinks-file-service.tar 
  1. 使用docker-compose up -d命令创建并启动容器,使用docker ps -a命令验证容器是否启动成功 docker常用命令请参考docker常用命令
$ docker ps -a
CONTAINER ID   IMAGE                                                                                    COMMAND                  CREATED          STATUS    
                    PORTS                                            NAMES
06f023229b31   jetlinks-api-gateway-service:2.0.0-SNAPSHOT      "./docker-entrypoint…"   34 seconds ago   Up 2 hours     
                                                    micro-services-api-gateway-service
3e22eddeb8a1   jetlinks-iot-service:2.0.0-SNAPSHOT              "./docker-entrypoint…"   34 seconds ago   Up 2 hours  
                                                    micro-services-iot-service
44f7f46fc291   jetlinks-file-service:2.0.0-SNAPSHOT             "./docker-entrypoint…"   34 seconds ago   Up 2 hours  
                                                    micro-services-file-service
ccaefa0d4c72   jetlinks-authentication-service:2.0.0-SNAPSHOT   "./docker-entrypoint…"   34 seconds ago   Up 2 hours  
                                                    micro-services-authentication-service

说明

STATUS为up为容器启动成功,STATUS为Exited为容器启动失败。

容器启动失败示例如下:

06f023229b31   registry.cn-hangzhou.aliyuncs.com/jetlinks-cloud/api-gateway-service:2.0.0-SNAPSHOT      "./docker-entrypoint…"   4 days ago       Exited (137) 2days ago     
                                                    micro-services-api-gateway-service                                         

# 将镜像和配置文件传入服务器

使用命令启动项目 docker-compose up -d

# 常见问题

# 未指定maven版本导致打包出错

问题1

项目打包失败并出现以下错误:
[WARNING] Error injecting: org.springframework.boot.maven.RepackageMojo
java.lang.TypeNotPresentException: Type org.springframework.boot.maven.RepackageMojo not present

解决:指定api-gateway-serviceauthentication-serviceiot-servicefile-service四个模块pom文件中maven的版本,使maven版本和spring boot版本保持一致,例如:

<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <version>${spring.boot.version}</version>
</plugin>

# 镜像启动报错

问题2

Q: /usr/bin/env: ‘bash\r’: No such file or directory

java-docker-error

A: 执行打包命令之前,需要检查整个项目换行符,需将换行符换为LF,否则运行镜像时会报以下错

选中JetLinks-pro项目,修改整个项目换行符: java-docker-error

# 权限管理中权限数据不完整

问题3

Q: 非admin用户访问设备相关页面报错无权限。

power-warn.png

A: 在device-manager目录和things-manager目录下的pom文件中添加以下内容。

        <dependency>
            <groupId>org.hswebframework.web</groupId>
            <artifactId>hsweb-system-authorization-default</artifactId>
            <version>${hsweb.framework.version}</version>
        </dependency>

# 点击登录按钮无法进入首页,跳转到登录页面

问题4

Q: 点击登录按钮无法进入首页,跳转到登录页面

A: 检查每个节点、每个服务是否连接同一个redis服务或redis集群服务,redis服务是否持久化成功。