附录
# 附录
以下不是IoTCenter产品安装所必须的步骤,给需要使用的人作为参考
# 目录结构
bin:用于存放网关服务运行执行程序、进程、AES加密工具、各子系统厂家SDK文件。
CurveData:用于存放软件接入设备的历史曲线记录文件。
data:用于存放软件后台功能配置文件。
database:用于存放软件初始数据库文件,包括SQLite数据库、MySQL数据库脚本。
dll:用于存放各子系统和设备协议解析的动态库解码器(驱动)文件。
IoTCenterWeb:用于存放Web客户端程序和守护程序。
log:用于存放网关程序日志文件。
# 数据库加密工具
# GWEncrypt.dll
用户及数据库密码等敏感信息需加密存储,此加密工具主要用于加密存储配置文件中的数据库密码以及加密数据库中的用户等敏感信息。在加密过程中,目前主要有3种加密方式。
使用敢为许可文件对机密数据进行加密,该功能适用于在部署敢为网关的环境下,下同。
使用双重混合加密机制,该方式需要两组密钥,一个64位的元密钥+一个64位的工作密钥,适用于不同项目间要加密配置文件的需求。
使用简单AES128的简单加密,该加密方式由于AES128位安全性不高,不推荐使用。
操作步骤
使用敢为许可加密字符串:该通过输入一组足够复杂的密钥,并使用敢为许可文件对该密钥进行加密,适用于需要调用服务端进行隐私数据加密的场景。
该工具运行方式:Windows环境:
D:\ganwei\iotcenter\bin\GWEncrypt.exeLinux环境:
/opt/ganwei/iotcenter/dotnet/dotnet /opt/ganwei/iotcenter/bin/GWEncrypt.dll输入命令【1】
再输入待加密字符串
输入回车。
记录提示后的加密字符
升级数据表:该用以实现对默认数据库进行初始化操作。
输入命令【2】
输入y。
等待升级完成。
指定密钥加密:使用一个AES128位加密算法对字符串进行加密,密钥长度为16位。(不推荐使用)。
生成随机AES密钥:由于加密算法为AES512位,需要64位密码,特提供快速生成随机密钥的功能,该功能用以生成从AES128到AES4096各种不同算法的密钥。操作流程为选择【4】,再选择对应复杂程度的字符串组合。保存AES元密钥:由运维人员制作用于系统本地加密文件中存储的基础元密钥信息。该密钥保存在bin/system/目录下,是用来保护系统关键配置文件的根密钥,确保配置文件安全。
输入命令【5】.
按提示,输入一个AES512的密钥,该密钥长度为64位。输入完成后,工具自动保存元密钥到本地目录下。
保存AES用户工作密钥:由用户制作第二级密钥保护机制,以便确保关键配置文件安全。该密钥保存在bin/user目录下。参考生成AES元密钥的制作过程。
使用高级AES加密字符串:使用上述两级AES加密机制,对用户输入的足够复杂的字符串进行加密。输入命令【7】。
输入待加密字符串完成加密过程。
# 网关配置文件
# appsettings.json
网关配置文件,位于IoTCenter\bin目录中,主要用于配置网关Grpc端口、会话密钥、消息订阅Key等。
Port:网关端口。
ZMQSubscribeKey:ZMQ实时消息订阅Key。
# AlarmCenterProperties.xml
网关核心配置文件,位于IoTCenter\data\AlarmCenter中,主要用于配置网关端口、ZMQ消息端口、历史曲线存储、数据库连接存储等。
HostServer:网关GRPC端口和ZMQ消息端口配置。
AlarmCenter.Gui.OptionPanels.DatabaseOptions:历史曲线存储配置。
AlarmCenter.Gui.OptionPanels.RecordDataOptions:数据库连接配置。
# Web配置文件
# appsettings.json
Web配置文件,位于IoTCenter\IoTCenterWeb\publish中,主要用于网关地址配置、网关ZMQ配置、SSL证书配置、WebAPI配置、黑白名单配置邮件配置等。
Authentication:Web会话权限配置。
address:网关端口。
WebApi:WebAPI配置。
BlackWhiteListMiddleware:黑白名单配置。
Email:邮件配置。
# 守护程序
# restart.sh
网关进程守护程序,位于IoTCenter\IoTCenterWeb\shell中,主要用于Linux操作系统中网关进程异常中断、停止时,自动重启网关进程,保证平台的稳定运行。
restart.sh
Linux中使用方法:
执行cd和ll命令进入shell目录,查看当前目录是否存在守护进程;
cd /opt/ganwei/IoTCenter3.1.12.2/IoTCenter/IoTCenterWeb/shell/ ll
执行chmod 777 restart.sh为守护程序赋予可执行权限,赋予权限后文件名会变绿权限会变更为可执行;
chmod 777 restart.sh ll
执行nohup ./restart.sh > /dev/null 2>&1 &命令后台进程运行守护程序;
nohup ./restart.sh > /dev/null 2>&1 &
执行ps -ef|grep restart命令查看是否网关守护程序是否成功执行;
ps -ef|grep restart
# restartweb. sh
Web进程守护程序,位于IoTCenter\IoTCenterWeb\shell中,主要用于Linux操作系统中网关进程异常中断、停止时,自动重启网关进程,保证平台的稳定运行。
file_name:守护程序重启网关进程的日志文件
file_name:
/opt/ganwei/IoTCenter/IoTCenterWeb/shell/web.log
cd路径
/opt/ganwei/IoTCenter/IoTCenterWeb/publish
Linux中使用方法:
执行cd和ll命令进入shell目录,查看当前目录是否存在守护进程;
cd /opt/ganwei/IoTCenter3.1.12.2/IoTCenter/IoTCenterWeb/shell/ ll
执行chmod 777 restartweb.sh为守护程序赋予可执行权限,赋予权限后文件名会变绿权限会变更为可执行;
chmod 777 restartweb.sh ll
执行nohup ./restartweb.sh > /dev/null 2>&1 &命令后台进程运行守护程序;
nohup ./restartweb.sh > /dev/null 2>&1 &
执行ps -ef|grep restartweb命令查看是否网关守护程序是否成功执行;
ps -ef|grep restartweb
# Docker容器的离线安装
在可以连接互联网的情况下,可以在线安装Docker《Linux下Docker安装部署》 (opens new window),当遇到内网服务器没有办法进行在线安装时需要使用离线安装的方法。下面主要介绍离线安装的方法。
# 下载安装包
创建工作文件夹
mkdir /opt/docker
docker安装包下载地址:https://download.docker.com/linux/static/stable/x86_64/ (opens new window)
进入下载地址,下载相应的版本,比如18.06.3,将下载好的文件放到/opt/docker目录下
# 创建系统配置文件
创建文件
使用如下命令创建文件:
vim /opt/docker/docker.service
或者
touch docker.service
文件内容如下:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
点击docker.service下载文件
# 创建安装脚本
安装脚本
使用如下命令创建文件:
vim /opt/docker/install.sh
或者
touch install.sh
文件内容:
#!/bin/sh
echo '解压tar包...'
tar -xvf $1
echo '将docker目录移到/usr/bin目录下...'
cp docker/* /usr/bin/
echo '将docker.service 移到/etc/systemd/system/ 目录...'
cp docker.service /etc/systemd/system/
echo '添加文件权限...'
chmod +x /etc/systemd/system/docker.service
echo '重新加载配置文件...'
systemctl daemon-reload
echo '启动docker...'
systemctl start docker
echo '设置开机自启...'
systemctl enable docker.service
echo 'docker安装成功...'
docker -v
点击install.sh下载文件
# 创建卸载脚本
卸载脚本
使用如下命令创建文件:
vim /opt/docker/uninstall.sh
或者
touch uninstall.sh
文件内容:
#!/bin/sh
echo '删除docker.service...'
rm -f /etc/systemd/system/docker.service
echo '删除docker文件...'
rm -rf /usr/bin/docker*
echo '重新加载配置文件'
systemctl daemon-reload
echo '卸载成功...'
点击uninstall.sh下载文件
# 安装
解压
解压
使用命令:
tar -xf docker-18.06.3-ce.tgz
将docker 相关命令拷贝到 /usr/bin,方便直接运行命令
cp docker/* /usr/bin/
注册系统服务
将docker注册成系统服
为docker.service增加可执行权限
chmod +x /etc/systemd/system/docker.service systemctl daemon-reload
启动docker
启动docker
systemctl start docker
查看docker版本
# 常用命令
查看容器命令:
docker ps
或docker ps -a
进入容器命令:
docker exec -it [容器ID] bash
重启容器命令:
docker stop [容器ID]
查看容器日志:
docker logs [容器ID]
退出容器命令:
exit
查看空间命令:
df -h
查看文件夹占用命令:
du -sh *
查看文件日期:
ls -l
删除文件或文件夹命令:
rm -rf [文件名]
(慎用)编辑文件命令:
vim [文件名]
复制文件命令:
cp -rf 文件名
查看服务器环境:
uname -a
# 部署多网关
当在一台服务器上需要部署多套IoTCenter软件时,需要进行多网关部署。
拷贝安装部署的目标文件到新文件夹(不包括运行时)
在修改以下配置后,按照安装步骤进行配置
视频教程
# 网关appsettings.json配置
需修改网关端口配置,同时每套软件的网关端口和Web中的网关端口需保持一致:
# 网关AlarmCenterProperties.xml配置
历史曲线文件存储路径Hostory_CurveStorePathvalue="D:\ganwei\IoTCenter\CurveData"
Hostory_CurveStorePathvalue="D:\ganwei\IoTCenter\CurveData"
数据库路径SQLite.DefaultPathvalue="D:\ganwei\IoTCenter\database\Database.db"
SQLite.DefaultPathvalue="D:\ganwei\IoTCenter\database\Database.db"
需确保网关端口唯一HttpPort value="4001"
HttpPort value="4001"
ZMQ端口MQSubPort value="15566"
MQSubPort value="15566"
# Web客户端appsettings.json配置
ZMQ消息端口和地址,"NetMQPort": "5566",
需修改Web客户中的网关端口
需修改Web客户中的端口"AllowOrigins": [ "http://127.0.0.1:44380","https://127.0.0.1:44380",”http://127.0.0.1:44381 (opens new window)”]
"HttpPort": "44381",
"HttpsPort": "44380",
网关相关配置保持一致: "address": "http://localhost:4001/",
# 服务定义文件
修改两套软件的服务定义文件中关于相关路径配置的部分
windows:修改services\regist.bat
linux:修改 services\regist.sh,IoTCenter.service,IoTCenterWeb.service
# 项目软件迁移部署
视频教程:
项目软件迁移部署操作步骤
找到项目软件关联使用的数据库,然后进行备份操作,最后打包拷贝软件和数据库备份文件;
在“D:\ganwei\IoTCenter\database”路径下找到备份数据库文件进行还原;
如果迁移的服务器已经安装过IoTCenter 6.0,建议先卸载IoTCenter 6.0软件服务,然后再重新安装;
拿到授权文件放到bin后,执行“原始用户数据(mysql).sql”脚本,初始化用户名和密码。
在“D:\ganwei\IoTCenter\IoTCenterWeb\publish”路径下找到“appsettings.json”文件;
"IsManyLoginEnabled": "true", "WebVersionInfo": "6.0", "ApplicationPartName": "IoTCenter.Web.", "IsAutoUpgradeData": "true", "IsAesUpdateSuccess": "false", "IsInitMaintainPwd": "false",
修改
"IsAesUpdateSuccess":
为"false"
;重启软件服务和web服务.
# 切换数据库
视频教程
首先需要在需要连接的数据库中添加一个新的数据库实例。
在配置管理-平台配置中有数据库切换功能,将mysql数据库信息填写在下列输入框中,如果数据库中没有执行初始化脚本,可以勾选新建数据,这样会自动执行初始化脚本,然后点击保存,即可切换成功。
# Linux开放端口命令总览
Linux开放端口命令
- 开启防火墙:
systemctl start firewalld
- 开放指定端口:
firewall-cmd --zone=public --add-port=44380/tcp --permanent
- 重启防火墙:
firewall-cmd --reload
- 查看指定端口:
netstat -ntulp |grep 3306
- 查看指定端口是否开启:
firewall-cmd --query-port=3306/tcp
- 查看全部已开启端口:
firewall-cmd --zone=public --list-ports
# 视频教程:
# Windows环境下安装MySQL
# Linux环境下在线安装部署MySQL
# Linux环境下离线安装部署MySQL
# MySQL备份、还原备份、数据批量导入
# IoTCenter6.0守护程序使用
# 账号清单
人机账号
提示
系统默认用户名及密码请联系相关人员获取
机机账号
数据库配置
配置位置:ganwei/IoTCenter/data/AlarmCenter/AlarmCenterProperties.xml
SQLite数据库
用户名 | 密码 | 配置建议 |
---|---|---|
无 | 无 | SQLite数据库位置应与实际数据库位置一致(IoTCenter软件包自带SQLite数据库:database目录下的Database.db)。启用数据库为True,不启用为False。 |
MySQL数据库
用户名 | 密码 | 配置建议 |
---|---|---|
任一已创建好的MySQL用户 | 经过GWEncrypt.dll(或GWEncrypt.exe)加密后的MySQL密码 | 连接MySQL服务时IP建议为内网IP。 MySQL连接时的端口号为MySQL服务的端口号,默认为3306。 启用数据库为True,不启用为False。 MySQL连接用户名为任一已创建好的、有数据库权限的用户,不建议使用root账号。 |
容器化部署账号
虚机部署运行服务的OS账号
提示
系统默认用户名及密码请联系相关人员获取
容器中运行服务的OS账号
用户名 | 密码 | 配置建议 |
---|---|---|
ganweiuser | 无 | 无,用于容器化部署时,运行服务的默认账号。 |
35009(容器id) mysql | 无,用于容器化部署时,运行服务的默认账号。 |
MySQL数据库
用户名 | 密码 | 配置建议 |
---|---|---|
iot | 无,用于容器化部署时,使用MySQL数据库的默认账号。 | |
root | MySQL启动时自动生成的账号 | |
mysql.infoschema | 不涉及 | MySQL内置账号 |
mysql.session | 不涉及 | MySQL内置账号 |
mysql.sys | 不涉及 | MySQL内置账号 |
IoTCenter账号
用户名 | 密码 | 配置建议 |
---|---|---|
built_acc | 无,用于华为智慧园区默认内置的门禁系统访问账号。 |
密钥更新
密钥清单
序号 | 模块名 | 密钥算法实用功能描述 | 密钥存储位置 | 是否更新 |
---|---|---|---|---|
1 | Web模块 | 对登录的用户口令进行加密传输 | pems目录下的private_key.pem文件 pems目录下的public_key.pem文件 | 无需更新,每次服务启动时将自动生成。 |
2 | Web模块 | 1、SSL安全证书的秘钥加密; 2、会话秘钥; 3、使用AES128算法对用户个人隐私数据进行加密; 4、对用户登录的密码采用SHA512+AES128进行加密; 5、许可维护解密。 | bin目录下的AlarmCenter.shd文件 | 更新 |
3 | GRPC服务 | 会话秘钥使用AES512+PDKDF2加密 | bin目录下的System.Tools.Access.Meta.dll文件 bin目录下的System.Tools.Access.Str.dll | 文件更新 |
更新方式
AlarmCenter.shd更新
更新方式:将新的AlarmCenter.shd文件替换至..IoTCenterbin目录下。
更新时间:一般项目上申请的临时授权为3个月,研发及测试人员申请的临时授权文件有效期为1年,需根据不同情况进行更新。项目验收后申请的永久授权无需更新。
GRPC服务会话密钥更新
更新方式:通过平台维护工具GWEncrypt.dll来维护(查看1.2.1章节)。
# 证书更新
证书清单
序号 | 证书名 | 证书存储位置 | 是否更新 |
---|---|---|---|
1 | Https证书 | ../IoTCenter/IoTCenterWeb/publish/SSL/ssl.pfx | 更新 |
更新方式
更新方式:将新的https证书替换至../IoTCenter/IoTCenterWeb/publish/SSL/目录下即可。
更新时间:通过https://localhost:44380/访问时,可以查看到https证书的详情,可查看有效期,到期前及时更换。
# Logo替换和标题更名
Logo替换
Logo格式要求
替换LOGO之前,如果不确认尺寸,到IoTCenter/IoTCenterWeb/publish/wwwroot/static/Images/目录下检查对应名称LOGO的尺寸大小
Logo位置 | Logo格式 | Logo命名 |
---|---|---|
登录页Logo | PNG/svg格式,背景透明,大小为: 200X50(6.0版本) | loginLogo.svg |
登录页底部Logo | PNG格式,背景透明,大小为: 32X32 | logo.png |
首页Logo | PNG/svg格式,背景透明,大小为: 165X46(6.0版本) | logos0-qh.svg |
Logo替换方式
将新的Logo图片按上述要求制作。
将制作好的Logo图片放到IoTCenter/IoTCenterWeb/publish/wwwroot/static/Images/ 目录下替换原文件。
标题更名
浏览器标题更名
标题位置:
更名方法:
修改IoTCenter/IoTCenterWeb/publish/wwwroot/static/json/目录下的config.json文件。
登录页底部标题更名
标题位置:
更名方法:
修改IoTCenter/IoTCenterWeb/publish/wwwroot/static/json/目录下的config.json文件。
# 自动生成新证书
cd切换到IoTCenter/IoTCenterWeb/publish/目录下。
执行赋权命令:chmod +x crf.sh
开启证书自动更新开关。
打开appsettings.json文件,设置SSLAutoGenerate为true。
重启IoTCenterWebApi.dll服务,新证书生成成功。
# mkcert生成证书流程
由于某些机制要求,需服务端启用严格的https证书,且证书签名需与服务器ip匹配,且不支持不安全的openssl证书,需使用mkcert来制作证书。
IoTCenter网关https证书配置
修改IoTCenterdataAlarmCenterAlarmCenterProperties.xml的相关节点。(配置仅供参考,不可直接使用)
<Properties name="HostServer">
<EnableGrpc value="true" />
<HostIpAddr value="127.0.0.1" /> //127.0.0.1仅限于本机访问,外网访问需设置为固定Ip地址,ioc应用场景不建议使用0.0.0.0全网公开端口
<HttpPort value="4000" />
<HttpsPort value="14001" /> //需启用Https端口,默认未启用。
<MQPort value="" />
<MQSubPort value="" />
<HttpsCertFile value="keystore.p12" /> //证书文件名
<HttpsPassword
value="MjAyMjA2MjKq/gXx1s1IEp+U+w5poBQVBHtEmzkf3YleWDy1wcDfBCcz2XyhXgmT4BX6X/GrwMad0M1/fObF9fIaty4acxfGOh+GH/GsjcUKs+vCRiHYSM5WHN7FL"/> //Https证书密码
</Properties>
本地安装mkcert
点击下载mkcert
初始化
在mkcert.exe
所在目录下运行 mkcert -install
命令以初始化
生成证书
运行命令
mkcert -p12-file keystore.p12 -pkcs12 localhost "localhost" localhost localhost 127.0.0.1 ::1
命令行定义
localhost替换为服务器的机器(主机)名,windows和linux都可以
127.0.0.1替换为服务器IP
举例如下图,所需生成证书命令为:
mkcert -p12-file keystore.p12 -pkcs12 ecs-a26a-0004 "ecs-a26a-0004" ecs-a26a-0004 ecs-a26a-0004 139.159.199.230 ::1
证书验证
将生成后的keystore.p12文件放置到服务端IoTCenterbinssl目录下。使用GWEncrypt工具对mkcert密码(默认为changeit
)进行加密,并配置在HttpsPassword节点,重启IoTCenter 网关服务端GWHost进程。
本地同步部署证书并运行(双击打开之后,一直默认下一步既可)
若证书可用,通过https访问网关端口时,其连接状态将显示为【连接是安全的】
mkcert默认密码为changeit
,如需修改,可先生成pem证书,再用pem证书使用固定密码加密生成p12证书
# K8S下部署iotcenter
安装包中有iotcenter镜像和mysql镜像,分为arm和x86,共四个镜像,在image文件夹中。InstallTool包含安装和升级脚本,在resourceFile中有相应的yaml文件。
Yaml文件说明
在resourceFile文件夹中iotcenter和mysql两个镜像包的yaml文件,其中mysql-password.yaml和mysql-password-arm.yaml分别对应两个不同架构cpu下传入的密码,在执行安装脚本时会自动判断选择传入相应的密码字符串,
一键安装脚本使用方法
首先cd到insatll.sh的目录,然后按照镜像版本和nfs储存地址或者本地储存配置需要传入的参数。
sh install.sh "repoURL="mydockerhub.com:5000/cube-repo-space"|imageTag="6.0.0.1"|namespace="iot"|nfsVip="10.2.0.13"|nfsPath="/var/ganwei/""
需要传入的参数
repoURL=""|imageTag=""|namespace="iot"|nfsVip=""|nfsPath=""
升级脚本需要传入的参数
repoURL=""|imageTag=""|namespace="iot"
nfsPath参数在后面跟了一个目录
{{nfsPath}}ganwei
{{nfsPath}}mysql
安装和升级脚本说明
安装脚本接收到传入的参数后将在resourceFile文件夹中生成对应的yaml文件,之后通过对环境的判断,自动选择需要执行的yaml文件开始部署,首先会创建node和命名空间,之后开始部署mysql,之后部署iotcenter。
升级脚本首先通过传入的参数只更新resourceFile中文件夹中的iotcenter-deployment.yaml文件,最后通过kubectlapply -f
命令更新yaml文件,k8s通过新的deployment文件拉取新的镜像,完成更新。本包的脚本未涉及到数据库的版本更新和表的更新。
手动安装方法
在没有执行脚本之前,在resourceFile文件夹中只有yaml.j2的文件,需要手动安装需要将resource文件夹中的yaml.j2文件的j2去掉,之后按照对照表中将参数补全;
其中iotcenter-deploymentyaml文件内spec.template.spec.containers.image中传入的参数需要改成
{{repoURL}}iotcenter-euler:{{imageTag}}
或者ARM架构下改成
{{repoURL}}iotcenter-euler-aarch64:{{imageTag}}
再将参数手动改入到文件中。
传入参数和yaml文件对照表
yaml文件名 | repoURL | imageTag | namespace | nfsVip | nfsPath |
---|---|---|---|---|---|
iotcenter-deployment.yaml | √ | √ | √ | ||
iotcenter-pv.yaml | √ | √ | |||
mysql-pv.yaml | √ | √ |
修改之后,将对应的镜像导入对应的仓库;
在执行如下命令;
创建node
kubectl label node minikube iotServer=iot
创建命名空间
kubectl create namespace iot
部署mysql数据库
kubectl apply -f mysql-pv.yaml
kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-configmap.yaml
kubectl apply -f mysql-password.yaml(ARM架构执mysql-password-arm.yaml)
kubectl apply -f mysql-deployment.yaml
部署iotcenter
kubectl apply -f iotcenter-pv.yaml
kubectl apply -f iotcenter-pvc.yaml
kubectl apply -f iotcenter-configmap.yaml
kubectl apply -f iotcenter-deployment.yaml
手动升级方法
将resourceFile文件夹中的iotcenter-deployment.yaml文件中的spec.template.spec.containers.image传入的参数需要改成
{{repoURL}}iotcenter-euler:{{imageTag}}
或者ARM架构下改成
{{repoURL}}iotcenter-euler-aarch64:{{imageTag}}
,在将新版本的镜像的imageTag信息填入到参数中,rupoURL,nfsVip和nfsPath,保持不变。
之后执行kubectl apply -f
iotcenter-configmap.yaml更新资源文件,之后会自动拉取新的镜像,当新的pod,之后旧pod会自行删除。