Appearance
服务器配置 ¶
参考配置:ThingsKit运行环境要求
Linux Docker安装 ¶
部署包文件清单 ¶
物联网管理平台部署包内容如下图:
_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组态相关部署文件。
外网访问端口清单 ¶
清单文件中默认的端口如下,我们可以根据自己实际情况调整。
序号 | 端口 | 端口说明 |
---|---|---|
1 | 20638 | 数据库,postgresql |
2 | 20637 | 缓存工具,redis |
3 | 9000、9001 | 多媒体资源文件存储,minio |
4 | 9527 | 核心服务前端 |
5 | 8080 | 核心服务后端 |
6 | 9528 | 组态服务 |
7 | 1883 | 设备接入之MQTT协议 |
8 | 5683/UDP | 设备接入之CoAP协议 |
9 | 8088 | 设备接入之TCP协议 |
10 | 2181 | 微服务服务中心 |
11 | 9091,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
2
3
4
5
6
7
8
9
域名和SSL证书(可选) ¶
证书可以在阿里云申请一年期的免费试用版。证书成功申请后我们下载Nginx版本的。
第一步:导入docker的镜像文件 ¶
将_images
文件上传到服务器,执行命令,将文件夹内的离线镜像导入docker。
shell
docker load -i *.tar
1
2
2
第二步:上传ThingsKit部署包 ¶
将部署包上传到服务器对应目录。
- 脚本文件
_makeFile
上传到服务器根目录。 - 将部署包内的目录
_workspace
上传到服务器/var
目录。
容器编排目录上传效果如图:
平台部署包上传效果如图:
第三步:编辑docker的环境变量 ¶
根据实际情况编辑文件_makeFile/_env_temp.conf
内的环境变量。
shell
source _makeFile/_env_temp.conf
1
2
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
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
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 "%r" %s %b" />
</Host>
1
2
3
4
5
6
7
8
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
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
2
3
执行命令后生成数据库信息如下图:
核心服务部署 ¶
默认为单机模式部署项目。
文件清单: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
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
2
3
4
5
验证部署结果 ¶
可以访问到接口文档时,说明微服务组件部署成功。
第六步(可选):部署组态中心 ¶
部署服务 ¶
将安装文件draw.war
上传到服务器/var/_workspace/tomcat
目录。然后重启tomcat容器即可。
shell
docker restart tomcat #重启组态容器
docker logs tomcat --tail=200 -f #查看组态启动日志
1
2
2
验证部署结果 ¶
直接访问tomcat默认界面会弹出如下效果图。
第七步:部署ThingsKit-管理界面 ¶
修改Nginx配置文件 ¶
在nginx的配置文件nginx.conf
中搜索关键字访问服务的IP或域名
并将其替换为访问对应服务所需的真是IP或域名。
shell
cd /_makeFile/environment
vi nginx.conf
1
2
3
4
2
3
4
部署包(可选):大屏设计器 ¶
将安装文件view.zip
解压后,上传到服务器/var/_workspace/data_view
目录。
部署包:管理界面 ¶
先将安装包dist.zip
解压。解压后目录如图。
修改配置 ¶
修改与前端配合的后端信息,例如:后端API、websocket接口等。
需要修改的配置项包括4个,清单如下:
VITE_GLOB_API_URL
——访问的服务端接口地址VITE_GLOB_UPLOAD_URL
——多媒体文件上传接口地址VITE_GLOB_WEB_SOCKET
——数据实时刷新接口地址,基于websocketVITE_GLOB_CONTENT_SECURITY_POLICY
——接口是否启用安全协议SSL
sed -i 's/demo.thingskit.com/你的IP/g' _app.config.js
1
2
3
2
3
将dist
目录内的全部文件上传到服务器/var/_workspace/web_ui
目录。
部署服务 ¶
shell
docker restart nginx #重启nginx容器
docker logs nginx --tail=200 -f #查看管理界面日志
1
2
2
验证部署结果 ¶
第八步:测试ThingsKit物联网平台是否安装成功 ¶
物联网平台、管理页面都成功部署后。我们就可以开始使用系统了。
*注意:
- 如果切换了配置文件中的邮箱后缀
ACCOUNT_EMAIL_SUFFIX
,需要同步修改数据库表tb_user
中字段email
的邮箱后最。 - 验证平台是否安装成功,推荐使用浏览器**
firefox
**。使用chrome浏览器内核的浏览器有概率出现http协议自动转https的情况。
访问地址:http://我们的服务器公网IP:9527
账号:sysadmin
密码:Sysadmin@123
1
2
3
4
5
6
7
2
3
4
5
6
7
平台是否安装成功验收清单 ¶
- 默认账号是否能成功登录
- 默认账号是否可以在菜单租户角色中新建租户角色
- 默认账号是否可以在菜单租户列表中新建租户
- 默认账号是否可以为租户租户管理员
- 租户管理员是否可以在菜单平台定制中上传LOGO图片
- 租户管理员是否可以在菜单账号管理中新建客户
- 租户管理员是否可以在菜单组织管理中新建组织
- 租户管理员是否可以在菜单设备管理>产品中创建产品
- 租户管理员是否可以在菜单设备管理>产品>详情>物模型管理中编辑和发布物模型
- 租户管理员是否可以在菜单设备管理>设备列表中新建设备
- 设备连接平台后设备管理>设备列表中对应设备的
状态
是否为在线 - 设备推送遥测数据后设备管理>设备列表>详情中的
物模型数据
是否可以看到最新的遥测数据 - 租户管理员是否可以在菜单可视化管理>组态中心中设计并预览大屏信息。
- 租户管理员是否可以在菜单可视化管理>大屏设计器中设计并预览大屏信息。