Skip to content
本页目录

 

ThingsKit物联网平台

开箱即用的物联网低代码平台

服务器配置

参考配置:ThingsKit运行环境要求

Linux Docker安装

部署包文件清单

物联网管理平台部署包内容如下图:

image-20230207105905344

_images: 离线部署所需的docker镜像文件

_makeFile: 程序运行所需环境的docker-compose脚本文件

_env_temp.conf:_docker-compose脚本文件中用到的环境变量,例如:账号、密码、访问地址等。

cert:证书文件存放目录,docker-compose映射了该目录

environment: 项目运行依赖软件的docker-compose目录,例如:pgsql、redis、nginx、tomcat等。

kafka:微服务模式需要的服务中心zookeeper和消息中间件kafka目录

yunteng:ThingsKit核心服务运行所需的docker-compose目录。

_workspace:ThingsKit物联网平台的部署包,该目录与服务器目录/var/_workspace等效。

web_server:ThingsKit服务端相关部署文件。

web_ui:ThingsKit前端相关部署文件。

data_view:ThingsKit大屏设计器相关部署文件。

draw:ThingsKit组态相关部署文件。

外网访问端口清单

清单文件中默认的端口如下,我们可以根据自己实际情况调整。

序号端口端口说明
120638数据库,postgresql
220637缓存工具,redis
39000、9001多媒体资源文件存储,minio
49527核心服务前端
58080核心服务后端
69528组态服务
71883设备接入之MQTT协议
85683/UDP设备接入之CoAP协议
98088设备接入之TCP协议
102181微服务服务中心
119091,9092,9093,9094消息中间件,kafka。

容器管理命令:docker-compose

进入依赖软件的docker-compose文件所在目录,执行如下命令


docker-compose up -d               #安装并启动
docker-compose restart             #重启

docker-compose ps                  #查看启动结果

docker-compose logs -f             #查看启动日志
docker-compose logs 软件名 -f       #查看启动日志

1
2
3
4
5
6
7
8
9

域名和SSL证书(可选)

证书可以在阿里云申请一年期的免费试用版。证书成功申请后我们下载Nginx版本的。

第一步:导入docker的镜像文件

_images文件上传到服务器,执行命令,将文件夹内的离线镜像导入docker。

shell
docker load -i *.tar

1
2

第二步:上传ThingsKit部署包

将部署包上传到服务器对应目录。

  1. 脚本文件_makeFile上传到服务器根目录。
  2. 将部署包内的目录_workspace上传到服务器/var目录。

容器编排目录上传效果如图:

image-20230207110318428

平台部署包上传效果如图:

image-20230207110424747

第三步:编辑docker的环境变量

根据实际情况编辑文件_makeFile/_env_temp.conf内的环境变量。

image-20221124123335620

shell
source _makeFile/_env_temp.conf

1
2

第四步:安装ThingsKit物联网平台的依赖软件

部署ThingsKit物联网平台之前,至少需要安装数据库、web服务器、缓存管理工具、对象存储软件。其它的软件可结合自身需要扩展安装。

  • 数据库:本教程使用基于PostgreSQL的TimescaleDB。也可以使用PostgreSQL、Cassandra等。
  • web服务器:本教程使用nginx。
  • 组态服务器:组态的war报使用tomcat部署。
  • 对象存储软件:本教程使用MinIO。

文件清单:docker-compose.yml

docker-compose文件内容如下,文件中的中文描述文字根据实际情况修改:

yaml
version: "3"
services:
  pgsql:
    container_name: pgsql
    image: timescale/timescaledb:2.6.1-pg13
    restart: always
    volumes:
      - /var/_datas/pgsql:/var/lib/postgresql/data
      - /var/_backups/pgsql:/var/_backups
    ports:
      - "${PGSQL_PORT}:5432"
    environment:
      - POSTGRES_PASSWORD=${USER_PASSWORD}
  redis:
    container_name: redis
    image: redis:7
    restart: always
    command: redis-server --requirepass ${USER_PASSWORD}
    volumes:
#      - /var/_datas/redis/conf:/etc/redis/redis.conf
      - /var/_datas/redis:/data
    ports:
      - "${REDIS_PORT}:6379"
#    environment:
#      - requirepass=tieqi@redis#
#      - requirepass=tianz@redis            
  nginx:
    container_name: nginx
    image: nginx:1.23
    restart: always
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - /_makeFile/_cert/${TLS_FILE_PRIVATE}:/_makeFile/_cert/com.thingskit.key
      - /_makeFile/_cert/${TLS_FILE_PUBLIC}:/_makeFile/_cert/com.thingskit.pem
      - /var/_cache/nginx:/usr/cache/nginx
      - /var/_workspace/web_ui:/usr/share/nginx/html
    ports:
      - "${NGINX_PORT}:9527"
      - "${NGINX_PORT_SSL}:443"  
    environment:
      NGINX_PROXY_PASS_ADDRESS: ${NGINX_PROXY_PASS_ADDRESS} 
  tomcat:
    container_name: tomcat
    image: tomcat:jre11
    restart: always
    volumes:
      - ./tomcat.xml:/usr/local/tomcat/conf/server.xml
      - /var/_workspace/draw:/usr/local/tomcat/webapps
      - /var/_logs/tomcat:/usr/local/tomcat/logs
    ports:
      - "${PORT_TOMCAT}:8080"    
  minio:
    container_name: minio
    image: minio/minio:RELEASE.2021-07-12T02-44-53Z
    restart: always
    command: server --console-address ':9001' /data
    volumes:
#      - /_makeFile/_cert/${TLS_FILE_PRIVATE}:/root/.minio/certs/private.key
#      - /_makeFile/_cert/${TLS_FILE_PUBLIC}:/root/.minio/certs/public.crt
      - /var/_datas/minio:/data
#      - /var/_datas/minio/config:/root/.minio/
    ports:
      - "${MINIO_PORT}:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: ${USER_NAME} 
      MINIO_ROOT_PASSWORD: ${USER_PASSWORD} 
      MINIO_SERVER_URL: ${MINIO_URL}  


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

文件清单:nginx.conf

nginx配置文件的关键部分


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    client_max_body_size 50m;


    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    map $http_user_agent $samesite_attr {
        "~*chrome"	';Secure;SameSite=None';
    }

    #gzip  on;
    gzip on;
    gzip_min_length 500k;
    gzip_comp_level 9;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";
    
#    upstream thingskit{
#      server 127.0.0.1:8080;
#    }

    proxy_cache_path /usr/cache/nginx levels=1:2 keys_zone=thingskit:100m inactive=15d max_size=10g;
    server {
        listen       9527;
        server_name  localhost;
        charset utf-8;
        #access_log  logs/host.access.log  main;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
        location /large-designer {
            alias   /usr/share/nginx/dataview;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
           # add_header Cache-Control "no cache,no store";
        }
		
	    location /api/ {
	        proxy_set_header Host $http_host;
            proxy_set_header X-Forward-For $remote_addr;
            proxy_pass  http://访问服务的IP或域名:8080/api/;
            proxy_ssl_server_name on;
        
	    }
        location /thingskit-scada/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Forward-For $remote_addr;
            proxy_pass  http://访问服务的IP或域名:9528/;
                      
        }
        location /thingskit-scada/js/ { 
		  proxy_cache thingskit;                     #缓存
		  proxy_cache_key $uri$is_args$args;   #缓存文件名生成算法
		  proxy_cache_min_uses 1;              #被访问多少次才缓存		  
		  proxy_cache_valid 200 304 12h;  #特定缓存时效:专指(h:小时,d:天)
		  expires 30d;                     #默认缓存时效:通用(h:小时,d:天)			
                  proxy_set_header Host $http_host;
                  proxy_set_header X-Forward-For $remote_addr;
		  proxy_redirect off;
		  proxy_pass  http://访问服务的IP或域名:9528/js/;
        }

        location /api/ws/ {
	       proxy_pass              http://访问服务的IP或域名:8080/api/ws/;
           #下面三行是重点
           proxy_http_version      1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_connect_timeout  5s;
           proxy_read_timeout  300s;
           proxy_send_timeout  300s;
       
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }



    # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  localhost;
        charset utf-8;

	   add_header X-Frame-Options ALLOWALL;
	
        ssl_certificate      /_makeFile/_cert/com.thingskit.pem;
        ssl_certificate_key  /_makeFile/_cert/com.thingskit.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
        location /large-designer {
            alias   /usr/share/nginx/dataview;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
           # add_header Cache-Control "no cache,no store";
        }
	location /api/ {
	    proxy_set_header Host $http_host;
            proxy_set_header X-Forward-For $remote_addr;
            proxy_pass  http://访问服务的IP或域名:8080/api/;
            proxy_ssl_server_name on;
        
	}
        location /thingskit-scada/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Forward-For $remote_addr;
            proxy_pass  http://访问服务的IP或域名:9528/;
                      
        }
        location /thingskit-scada/js/ { 
		  proxy_cache thingskit;                     #缓存
		  proxy_cache_key $uri$is_args$args;   #缓存文件名生成算法
		  proxy_cache_min_uses 1;              #被访问多少次才缓存		  
		  proxy_cache_valid 200 304 12h;  #特定缓存时效:专指(h:小时,d:天)
		  expires 30d;                     #默认缓存时效:通用(h:小时,d:天)			
                  proxy_set_header Host $http_host;
                  proxy_set_header X-Forward-For $remote_addr;
		  proxy_redirect off;
		  proxy_pass  http://访问服务的IP或域名:9528/js/;
        }

        location /api/ws/ {
	   proxy_pass              http://访问服务的IP或域名:8080/api/ws/;
           #下面三行是重点
           proxy_http_version      1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "upgrade";
           proxy_connect_timeout  5s;
           proxy_read_timeout  300s;
           proxy_send_timeout  300s;
       
       }
#       location ^~ /openUrl/ {
#	  proxy_pass http://$arg_destip;
#       }
	
     }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192

文件清单(组态必选):tomcat.xml

tomcat的配置文件中,主要修改tomcat的访问端口和默认访问项目。

xml
<Host name="localhost"  appBase="webapps" 
		unpackWARs="true" autoDeploy="true">
  <Context path="" crossContext="true" docBase="draw" reloadable="true" /> 

  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
		   prefix="localhost_access_log" suffix=".txt"
		   pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
1
2
3
4
5
6
7
8

安装并启动

docker-compose的脚本文件如果使用了环境变量的,需要执行命令source _env_temp.conf临时使环境变量生效。

cd /_makeFile/environment
docker-compose up -d --remove-orphans     #启动容器
docker-compose logs -f                    #查看容器启动日志

1
2
3
4

验证启动结果

第五步:部署ThingsKit-服务端

ThingsKit物联网平台由核心服务、设备传输服务、组态和管理界面等服务组成。部署方式不一样,下面我们分别说明他们的部署。

创建数据库

利用数据库管理工具(例如:navicat),远程连接数据库。执行命令创建数据库实例thingsKit

sql

CREATE DATABASE "thingskit" WITH OWNER "postgres" ENCODING 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' TEMPLATE template0;

1
2
3

执行命令后生成数据库信息如下图:

image-20230516145229810

核心服务部署

默认为单机模式部署项目。

文件清单:docker-compose.yml

yaml
version: '3'
services:

 ########################################################
 ## 单机模式ThingsKit【核心服务】#########################
 ########################################################
  monolith:
    image: thingskit:v1.1.0
    restart: always
    ports:
      - "${PORT_IOT}:8080"
      - "${PORT_MQTT}:1883"
      - "${PORT_TCP}:8088"
      - "5683:5683/udp"
    volumes:
      - /var/_workspace/web_server:/app
      - /var/_logs/thingskit/monolith:/var/log/thingsboard
      - /var/_workspace/web_server/data:/application/src/main/data
    container_name: monolith
    environment:
      TB_SERVICE_TYPE: monolith # monolith or tb-core or tb-rule-engine;tb-transport
      APP_VERSIONBASE: v1.1.0     #平台版本号
#      TB_SERVICE_ID: test     #全局唯一的服务ID,需要满足UUID格式。默认为服务器名
      
     # 集群模式取消注释,配置服务中心
      ZOOKEEPER_ENABLED: false
      ZOOKEEPER_URL: ${ZOOKEEPER_URL}
      ZOOKEEPER_NODES_DIR: /thingsKit
      # 集群模式取消注释,配置缓存。
      CACHE_TYPE: caffeine                 # caffeine(单机模式可用) or redis 
      REDIS_HOST: ${REDIS_URL}
      REDIS_PORT: ${REDIS_PORT}
      REDIS_PASSWORD: ${REDIS_PASSWORD}
      # 集群模式取消注释,配置消息中间件。
      TB_QUEUE_TYPE: in-memory                 # in-memory(单机模式可用) or kafka  or rabbitmq 
      TB_KAFKA_SERVERS: ${KAFKA_URL}
      
      DATABASE_TS_TYPE: timescale          #cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
      DATABASE_TS_LATEST_TYPE: timescale   #cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
      SPRING_DATASOURCE_URL: "${PGSQL_URL}/thingsKit"
      SPRING_DATASOURCE_USERNAME: ${PGSQL_NAME} 
      SPRING_DATASOURCE_PASSWORD: ${PGSQL_PASSWORD} 
      MINIO_URL: ${MINIO_URL}
      MINIO_NAME: ${USER_NAME}
      MINIO_PWD: ${MINIO_PASSWORD} 
      ACCOUNT_EMAIL_SUFFIX: thingskit.com
      ACCOUNT_PASSWORD_FORCE_RESET: true
      DEFAULT_PASSWORD: 123456
#      WECHAT_APP_ID: 微信小程序APP_ID
#      WECHAT_APP_SECRET: 微信小程序APP_SECRET
      FRP_SERVER_ADDRESS: ${FRP_URL}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

部署服务

docker-compose的脚本文件如果使用了环境变量的,需要执行命令source _env_temp.conf临时使环境变量生效。

shell
cd /_makeFile/yunteng/core
docker-compose up -d --remove-orphans
docker-compose logs -f  #查看启动日志


1
2
3
4
5

验证部署结果

可以访问到接口文档时,说明微服务组件部署成功。

image-20230509105056742

第六步(可选):部署组态中心

部署服务

将安装文件draw.war上传到服务器/var/_workspace/tomcat目录。然后重启tomcat容器即可。

shell
docker restart tomcat               #重启组态容器
docker logs tomcat --tail=200 -f    #查看组态启动日志
1
2

验证部署结果

直接访问tomcat默认界面会弹出如下效果图。

image-20230510143209623

第七步:部署ThingsKit-管理界面

修改Nginx配置文件

在nginx的配置文件nginx.conf中搜索关键字访问服务的IP或域名并将其替换为访问对应服务所需的真是IP或域名。

shell
cd /_makeFile/environment
vi nginx.conf


1
2
3
4

image-20230506113758732

部署包(可选):大屏设计器

将安装文件view.zip解压后,上传到服务器/var/_workspace/data_view目录。

部署包:管理界面

先将安装包dist.zip解压。解压后目录如图。

image-20221219200711541

修改配置

修改与前端配合的后端信息,例如:后端API、websocket接口等。

需要修改的配置项包括4个,清单如下:

  1. VITE_GLOB_API_URL——访问的服务端接口地址
  2. VITE_GLOB_UPLOAD_URL——多媒体文件上传接口地址
  3. VITE_GLOB_WEB_SOCKET——数据实时刷新接口地址,基于websocket
  4. VITE_GLOB_CONTENT_SECURITY_POLICY——接口是否启用安全协议SSL
sed -i 's/demo.thingskit.com/你的IP/g' _app.config.js


1
2
3

image-20230207130135014

dist目录内的全部文件上传到服务器/var/_workspace/web_ui目录。

部署服务

shell
docker restart nginx               #重启nginx容器
docker logs nginx --tail=200 -f    #查看管理界面日志
1
2

验证部署结果

第八步:测试ThingsKit物联网平台是否安装成功

物联网平台、管理页面都成功部署后。我们就可以开始使用系统了。

*注意

  1. 如果切换了配置文件中的邮箱后缀ACCOUNT_EMAIL_SUFFIX,需要同步修改数据库表tb_user中字段email的邮箱后最。
  2. 验证平台是否安装成功,推荐使用浏览器**firefox**。使用chrome浏览器内核的浏览器有概率出现http协议自动转https的情况。

访问地址:http://我们的服务器公网IP:9527

账号:sysadmin

密码:Sysadmin@123

1
2
3
4
5
6
7

平台是否安装成功验收清单

  1. 默认账号是否能成功登录
  2. 默认账号是否可以在菜单租户角色中新建租户角色
  3. 默认账号是否可以在菜单租户列表中新建租户
  4. 默认账号是否可以为租户租户管理员
  5. 租户管理员是否可以在菜单平台定制中上传LOGO图片
  6. 租户管理员是否可以在菜单账号管理中新建客户
  7. 租户管理员是否可以在菜单组织管理中新建组织
  8. 租户管理员是否可以在菜单设备管理>产品中创建产品
  9. 租户管理员是否可以在菜单设备管理>产品>详情>物模型管理中编辑和发布物模型
  10. 租户管理员是否可以在菜单设备管理>设备列表中新建设备
  11. 设备连接平台后设备管理>设备列表中对应设备的状态是否为在线
  12. 设备推送遥测数据后设备管理>设备列表>详情中的物模型数据是否可以看到最新的遥测数据
  13. 租户管理员是否可以在菜单可视化管理>组态中心中设计并预览大屏信息。
  14. 租户管理员是否可以在菜单可视化管理>大屏设计器中设计并预览大屏信息。