升级net10成功,部署脚本适配postgresql数据库

This commit is contained in:
ChenYi 2026-01-16 17:11:31 +08:00
parent f6bb769797
commit 6e98f5d4a9
19 changed files with 293 additions and 193 deletions

View File

@ -0,0 +1 @@
jisheiotdata

View File

@ -4,7 +4,7 @@
"CorsOrigins": "https://*.IoT.com,http://localhost:4200,http://localhost:3100,http://localhost:80,http://10.10.70.11:4200,http://47.110.53.196:30711,http://192.168.111.174:30711"
},
"ConnectionStrings": {
"Default": "Data Source=mysql;Port=3306;Database=JiSheIoTProDB;uid=root;pwd=JiShe!aqG#5kGgh&0;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true;"
"Default": "Host=postgres;Port=5432;Database=jisheiotprodb;Username=postgres;Password=JiShe!aqG#5kGgh&0;Encoding=UTF8;Pooling=true;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=100;"
},
"Hangfire": {
"Redis": {

View File

@ -4,7 +4,7 @@
"CorsOrigins": "https://*.IoT.com,http://localhost:4200,http://localhost:3100,http://localhost:80,http://10.10.70.11:4200,http://47.110.53.196:30711,http://192.168.111.174:30711"
},
"ConnectionStrings": {
"Default": "Data Source=mysql;Port=3306;Database=JiSheIoTProDB;uid=root;pwd=JiShe!aqG#5kGgh&0;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true;"
"Default": "Host=postgres;Port=5432;Database=jisheiotprodb;Username=postgres;Password=JiShe!aqG#5kGgh&0;Encoding=UTF8;Pooling=true;Pooling=true;Minimum Pool Size=5;Maximum Pool Size=100;"
},
"Hangfire": {
"Redis": {

View File

@ -236,36 +236,38 @@ services:
networks:
- pulsar-net
mysql-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/mysql:8.4.6
container_name: mysql
hostname: mysql
restart: always
privileged: true
user: "1000:1000" # 使用宿主机用户ID
postgres-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/postgres:18.1-alpine
container_name: postgres
hostname: postgres
restart: unless-stopped
ports:
- "${MYSQL_PORT}:3306"
- "${POSTGRES_PORT:-5432}:5432"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
TZ: Asia/Shanghai
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-JiShe!aqG#5kGgh&0}
- POSTGRES_DB=${POSTGRES_DB:-jisheiotprodb}
- POSTGRES_INITDB_ARGS=--encoding=UTF8 --lc-collate=C --lc-ctype=C
- TZ=Asia/Shanghai
volumes:
- ./mysql/log:/var/log/mysql
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --user=mysql # 确保MySQL以mysql用户运行
- --binlog-expire-logs-seconds=604800 # 设置binlog保留7天7*24*60*60=604800秒
- ./postgresql/data:/var/lib/postgresql
- ./postgresql/init:/docker-entrypoint-initdb.d
deploy:
resources:
limits:
cpus: "2.0"
memory: 2g
stdin_open: true
tty: true
networks:
- pulsar-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "5"
admin-api-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/jishe.iot.admin:2025.1216.1440
@ -285,8 +287,8 @@ services:
stdin_open: true
tty: true
depends_on:
mysql-service:
condition: service_started
postgres-service:
condition: service_healthy
redis-service:
condition: service_started
iotdb-standalone-service:
@ -324,8 +326,8 @@ networks:
ipam:
driver: default
config:
- subnet: 172.23.0.0/16
gateway: 172.23.0.1
- subnet: 172.24.0.0/16
gateway: 172.24.0.1
volumes:
pulsar-zookeeper-data:

View File

@ -0,0 +1,18 @@
postgres:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/postgres:18.1-alpine
container_name: postgres
environment:
- POSTGRES_PASSWORD=JiShe!aqG#5kGgh&0
- POSTGRES_DB=jisheiotprodb
- POSTGRES_INITDB_ARGS=--encoding=UTF8 --lc-collate=C --lc-ctype=C
volumes:
- /mnt/dockerdata/postgresql/data:/var/lib/postgresql
ports:
- "5432:5432"
restart: unless-stopped
healthcheck:
# 修改为默认的 postgres 用户
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5

View File

@ -215,34 +215,32 @@ services:
max-size: "50m"
max-file: "3"
mysql-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/mysql:8.4.6
container_name: mysql
hostname: mysql
restart: always
privileged: true
user: "1000:1000" # 使用宿主机用户ID
postgres-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/postgres:18.1-alpine
container_name: postgres
hostname: postgres
restart: unless-stopped
ports:
- "${MYSQL_PORT}:3306"
- "${POSTGRES_PORT:-5432}:5432"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
TZ: Asia/Shanghai
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-JiShe!aqG#5kGgh&0}
- POSTGRES_DB=${POSTGRES_DB:-jisheiotprodb}
- POSTGRES_INITDB_ARGS=--encoding=UTF8 --lc-collate=C --lc-ctype=C
- TZ=Asia/Shanghai
volumes:
- ./mysql/log:/var/log/mysql
- ./mysql/data:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --binlog-expire-logs-seconds=604800 # 设置binlog保留7天7*24*60*60=604800秒
- ./postgresql/data:/var/lib/postgresql
deploy:
resources:
limits:
cpus: "2.0"
memory: 2g
stdin_open: true
tty: true
networks:
- pulsar-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
logging:
driver: "json-file"
options:
@ -266,8 +264,8 @@ services:
stdin_open: true
tty: true
depends_on:
mysql-service:
condition: service_started
postgres-service:
condition: service_healthy
redis-service:
condition: service_started
iotdb-standalone-service:
@ -315,8 +313,8 @@ networks:
ipam:
driver: default
config:
- subnet: 172.23.0.0/16
gateway: 172.23.0.1
- subnet: 172.24.0.0/16
gateway: 172.24.0.1
volumes:
pulsar-zookeeper-data:

View File

@ -63,34 +63,32 @@ services:
max-size: "50m"
max-file: "3"
mysql-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/mysql:8.4.6
container_name: mysql
hostname: mysql
restart: always
privileged: true
user: "1000:1000" # 使用宿主机用户ID
postgres-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/postgres:18.1-alpine
container_name: postgres
hostname: postgres
restart: unless-stopped
ports:
- "${MYSQL_PORT}:3306"
- "${POSTGRES_PORT:-5432}:5432"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
TZ: Asia/Shanghai
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-JiShe!aqG#5kGgh&0}
- POSTGRES_DB=${POSTGRES_DB:-jisheiotprodb}
- POSTGRES_INITDB_ARGS=--encoding=UTF8 --lc-collate=C --lc-ctype=C
- TZ=Asia/Shanghai
volumes:
- ./mysql/log:/var/log/mysql
- ./mysql/data:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --binlog-expire-logs-seconds=604800 # 设置binlog保留7天7*24*60*60=604800秒
- ./postgresql/data:/var/lib/postgresql/data
deploy:
resources:
limits:
cpus: "2.0"
memory: 2g
stdin_open: true
tty: true
networks:
- pulsar-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
logging:
driver: "json-file"
options:
@ -114,8 +112,8 @@ services:
stdin_open: true
tty: true
depends_on:
mysql-service:
condition: service_started
postgres-service:
condition: service_healthy
redis-service:
condition: service_started
iotdb-standalone-service:

View File

@ -53,36 +53,38 @@ services:
networks:
- pulsar-net
mysql-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/mysql:8.4.6
container_name: mysql
hostname: mysql
restart: always
privileged: true
user: "1000:1000" # 使用宿主机用户ID
postgres-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/postgres:18.1-alpine
container_name: postgres
hostname: postgres
restart: unless-stopped
ports:
- "${MYSQL_PORT}:3306"
- "${POSTGRES_PORT:-5432}:5432"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
TZ: Asia/Shanghai
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-JiShe!aqG#5kGgh&0}
- POSTGRES_DB=${POSTGRES_DB:-jisheiotprodb}
- POSTGRES_INITDB_ARGS=--encoding=UTF8 --lc-collate=C --lc-ctype=C
- TZ=Asia/Shanghai
volumes:
- ./mysql/log:/var/log/mysql
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --user=mysql # 确保MySQL以mysql用户运行
- --binlog-expire-logs-seconds=604800 # 设置binlog保留7天7*24*60*60=604800秒
- ./postgresql/data:/var/lib/postgresql/data
- ./postgresql/init:/docker-entrypoint-initdb.d
deploy:
resources:
limits:
cpus: "2.0"
memory: 2g
stdin_open: true
tty: true
networks:
- pulsar-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "5"
admin-api-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/jishe.iot.admin:2025.1216.1440
@ -102,8 +104,8 @@ services:
stdin_open: true
tty: true
depends_on:
mysql-service:
condition: service_started
postgres-service:
condition: service_healthy
redis-service:
condition: service_started
iotdb-standalone-service:

View File

@ -13,8 +13,10 @@ IOTDB_PORT=30710
# Redis配置
REDIS_PORT=30712
# MySQL配置
MYSQL_PORT=13306
# PostgreSQL配置
POSTGRES_PORT=5432
POSTGRES_PASSWORD=JiShe!aqG#5kGgh&0
POSTGRES_DB=jisheiotprodb
# Admin API配置
ADMIN_API_PORT=28080
@ -26,4 +28,3 @@ ADMIN_WEB_PORT=30711
PULSAR_ADMIN_USER=admin
PULSAR_ADMIN_PASSWORD=0fd7afb8b0d04e6abc4fdfdac2190a79
IOTDB_ROOT_PASSWORD=Lixiao@1980
MYSQL_ROOT_PASSWORD=JiShe!aqG#5kGgh&0

View File

@ -1,5 +1,7 @@
CREATE TABLE IF NOT EXISTS CTWingAepReceiveMessageEntity( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, PlatformTenantId STRING FIELD, ProductId STRING FIELD, ServiceId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD, IMSI STRING FIELD, IMEI STRING FIELD ) COMMENT 'CTWingAepReceiveMessageEntity';
CREATE DATABASE jisheiotdata;USE jisheiotdata;
CREATE TABLE IF NOT EXISTS DeviceTelemetryPacketTaskInfo( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, IoTPlatformProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, IoTPlatformProductName STRING FIELD, IoTPlatformAccountId STRING FIELD, AccountPhoneNumber STRING FIELD, IssueRawMessage STRING FIELD, IssuePayload STRING FIELD, ResponseRawMessage STRING FIELD, ResponsePayload STRING FIELD, TelemetrySource INT32 FIELD, IoTPlatform INT32 FIELD, RetryCount INT32 FIELD, LastIssueTime TIMESTAMP FIELD, IssueStatus INT32 FIELD ) COMMENT 'DeviceTelemetryPacketTaskInfo';
CREATE TABLE IF NOT EXISTS CTWingAepReceiveMessageEntity( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, PlatformTenantId STRING FIELD, ProductId STRING FIELD, ServiceId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD, IMSI STRING FIELD, IMEI STRING FIELD ) COMMENT 'CTWingAepReceiveMessageEntity' ;
CREATE TABLE IF NOT EXISTS OneNETReceiveMessageEntity( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, ProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, IsEncrypted BOOLEAN FIELD, PlaintextMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD ) COMMENT 'OneNETReceiveMessageEntity';
CREATE TABLE IF NOT EXISTS DeviceTelemetryPacketTaskInfo( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, IoTPlatformProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, IoTPlatformProductName STRING FIELD, IoTPlatformAccountId STRING FIELD, AccountPhoneNumber STRING FIELD, IssueRawMessage STRING FIELD, IssuePayload STRING FIELD, ResponseRawMessage STRING FIELD, ResponsePayload STRING FIELD, TelemetrySource INT32 FIELD, IoTPlatform INT32 FIELD, RetryCount INT32 FIELD, LastIssueTime TIMESTAMP FIELD, IssueStatus INT32 FIELD ) COMMENT 'DeviceTelemetryPacketTaskInfo' ;
CREATE TABLE IF NOT EXISTS OneNETReceiveMessageEntity( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, ProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, IsEncrypted BOOLEAN FIELD, PlaintextMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD ) COMMENT 'OneNETReceiveMessageEntity'

View File

@ -0,0 +1,25 @@
-- PostgreSQL 初始化脚本:创建应用程序用户
-- 此脚本会在数据库首次初始化时自动执行
-- 创建应用程序用户 iotmanage如果不存在
DO $$
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_user WHERE usename = 'iotmanage') THEN
CREATE USER iotmanage WITH PASSWORD 'Iage@Passo#43tMand123!';
RAISE NOTICE '用户 iotmanage 创建成功';
ELSE
RAISE NOTICE '用户 iotmanage 已存在';
END IF;
END
$$;
-- 授予数据库权限
-- 将 jisheiotprodb 数据库的所有权限授予 iotmanage 用户
GRANT ALL PRIVILEGES ON DATABASE jisheiotprodb TO iotmanage;
-- 授予创建数据库权限(如果需要)
ALTER USER iotmanage CREATEDB;
-- 注意schema 权限需要在连接到具体数据库后授予
-- 由于初始化脚本在创建数据库后执行schema 权限会在数据库创建后自动授予
-- 如果需要更细粒度的权限控制,可以创建单独的脚本文件

View File

@ -0,0 +1,17 @@
-- 授予 schema 权限给 iotmanage 用户
-- 此脚本会在数据库创建后执行,此时可以连接到具体数据库
-- 连接到 jisheiotprodb 数据库并授予权限
-- 注意:在初始化脚本中,每个 SQL 文件都会自动连接到 POSTGRES_DB 指定的数据库
-- 授予 public schema 的所有权限
GRANT ALL ON SCHEMA public TO iotmanage;
-- 设置默认权限:新创建的表和序列自动授予 iotmanage 用户
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO iotmanage;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO iotmanage;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO iotmanage;
-- 如果已有表,需要手动授予权限(在表创建后执行)
-- GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO iotmanage;
-- GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO iotmanage;

View File

@ -0,0 +1,58 @@
# PostgreSQL 初始化脚本说明
## 目录说明
`./postgresql/init/` 目录下的脚本会在 PostgreSQL 容器**首次启动**时自动执行。
## 执行规则
1. **仅执行一次**:只有当数据目录为空时才会执行
2. **执行顺序**:按文件名字母顺序执行
3. **支持格式**
- `.sh` - Shell 脚本
- `.sql` - SQL 脚本
- `.sql.gz` - 压缩的 SQL 脚本
## 用户说明
### postgres 用户
- **默认超级用户**,总是存在,无法删除
- 拥有所有权限
- 用于数据库管理操作
### iotmanage 用户
- **应用程序用户**,通过初始化脚本创建
- 拥有指定数据库的权限
- 用于应用程序连接
## 文件命名建议
建议使用数字前缀来确保执行顺序:
- `01-create-user.sql` - 创建用户
- `02-create-schema.sql` - 创建 schema
- `03-create-tables.sql` - 创建表结构
- `04-insert-data.sql` - 插入初始数据
## 注意事项
1. 如果数据目录已有数据,这些脚本**不会再次执行**
2. 如果需要重新初始化,需要删除数据目录:`rm -rf ./postgresql/data/*`
3. 脚本中的密码建议使用环境变量,不要硬编码
4. 确保脚本具有幂等性(可以安全地重复执行)
## 示例:使用环境变量
```sql
-- 从环境变量读取密码(需要在脚本中处理)
CREATE USER iotmanage WITH PASSWORD :'IOTMANAGE_PASSWORD';
```
## 验证用户
```bash
# 查看所有用户
docker exec -it postgres psql -U postgres -c "\du"
# 测试 iotmanage 用户连接
docker exec -it postgres psql -U iotmanage -d jisheiotprodb -c "SELECT current_user;"
```

View File

@ -62,25 +62,23 @@ echo "✅ 认证配置完成 - 用户名: ${PULSAR_ADMIN_USER}, 密码: ${PULSAR
# 创建数据目录
echo "📁 创建数据目录..."
sudo mkdir -p /mnt/dockerdata/appservice/{pulsar,redis,mysql,iotdb,adminapi}
sudo mkdir -p /mnt/dockerdata/appservice/{pulsar,redis,postgresql,iotdb,adminapi}
sudo mkdir -p /mnt/dockerdata/appservice/pulsar/{zookeeper-data,bookkeeper-data,pulsar-data}
sudo mkdir -p /mnt/dockerdata/appservice/{redis/{outdata,conf},mysql/{conf,log,data},iotdb/{conf,data,logs},adminapi/{conf,logs}}
sudo mkdir -p /mnt/dockerdata/appservice/{redis/{outdata,conf},postgresql/data,iotdb/{conf,data,logs},adminapi/{conf,logs}}
sudo chown -R 10000:0 /mnt/dockerdata/appservice/pulsar/
# 创建本地目录的软链接(如果不存在)
echo "🔗 创建本地目录链接..."
mkdir -p ./pulsar/{zookeeper-data,bookkeeper-data,pulsar-data,auth}
mkdir -p ./redis/{outdata,conf}
mkdir -p ./mysql/{conf,log,data}
mkdir -p ./postgresql/{data,init}
mkdir -p ./iotdb/{conf,data,logs}
mkdir -p ./adminapi/{conf,logs}
# 修复MySQL目录权限
echo "🔧 修复MySQL目录权限..."
sudo chown -R 1000:1000 ./mysql/data
sudo chown -R 1000:1000 ./mysql/log
sudo chmod -R 755 ./mysql/data
sudo chmod -R 755 ./mysql/log
# 修复PostgreSQL目录权限
echo "🔧 修复PostgreSQL目录权限..."
sudo chown -R 999:999 ./postgresql/data 2>/dev/null || true
sudo chmod -R 755 ./postgresql/data 2>/dev/null || true
sudo chmod -R 755 ./adminapi/logs
@ -124,19 +122,21 @@ sudo rm -rf ./iotdb/data/*
sudo rm -rf ./iotdb/logs/*
echo "✅ IoTDB数据目录已清理配置目录已保留"
# MySQL配置检查
echo "⚙️ 检查MySQL配置..."
if [ ! -d "./mysql/init" ]; then
echo "❌ MySQL初始化脚本目录不存在请检查"
exit 1
# PostgreSQL配置检查
echo "⚙️ 检查PostgreSQL配置..."
if [ ! -d "./postgresql/init" ]; then
echo "⚠️ PostgreSQL初始化脚本目录不存在将创建目录可选"
mkdir -p ./postgresql/init
fi
if [ ! -f "./mysql/init/init-db.sql" ]; then
echo "❌ MySQL初始化脚本不存在请检查"
exit 1
# PostgreSQL初始化脚本是可选的不强制要求
if [ -f "./postgresql/init/init-db.sql" ]; then
echo "✅ PostgreSQL初始化脚本已存在"
else
echo " PostgreSQL初始化脚本不存在可选将在首次启动时使用环境变量创建数据库"
fi
echo "✅ MySQL配置检查通过"
echo "✅ PostgreSQL配置检查通过"
# 删除服务订阅模式配置文件(如果存在)
echo "🗑️ 清理服务订阅模式配置文件..."
@ -170,7 +170,7 @@ sleep 10
echo "IoTDB服务已就绪开始创建表模型数据库和设置root账号密码..."
# 使用非交互式方式创建表模型数据库
echo "CREATE TABLE IF NOT EXISTS CTWingAepReceiveMessageEntity(time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, SubDevice STRING TAG, PlatformTenantId STRING FIELD, ProductId STRING FIELD, ServiceId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD, IMSI STRING FIELD, IMEI STRING FIELD ) COMMENT 'CTWingAepReceiveMessageEntity';CREATE TABLE IF NOT EXISTS DeviceTelemetryPacketTaskInfo(time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, SubDevice STRING TAG, IoTPlatformProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, IoTPlatformProductName STRING FIELD, IoTPlatformAccountId STRING FIELD, AccountPhoneNumber STRING FIELD, TelemetryType INT32 FIELD, IssueRawMessage STRING FIELD, IssuePayload STRING FIELD, ResponseRawMessage STRING FIELD, ResponsePayload STRING FIELD, TelemetrySource INT32 FIELD, IoTPlatform INT32 FIELD, RetryCount INT32 FIELD, LastIssueTime TIMESTAMP FIELD, IssueStatus INT32 FIELD ) COMMENT 'DeviceTelemetryPacketTaskInfo';CREATE TABLE IF NOT EXISTS OneNETReceiveMessageEntity(time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, SubDevice STRING TAG, ProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, IsEncrypted BOOLEAN FIELD, PlaintextMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD ) COMMENT 'OneNETReceiveMessageEntity';" | ./start-cli.sh -h iotdb-standalone -sql_dialect table
echo "CREATE DATABASE jisheiotdata;USE jisheiotdata;CREATE TABLE IF NOT EXISTS CTWingAepReceiveMessageEntity( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, PlatformTenantId STRING FIELD, ProductId STRING FIELD, ServiceId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD, IMSI STRING FIELD, IMEI STRING FIELD ) COMMENT 'CTWingAepReceiveMessageEntity' ;CREATE TABLE IF NOT EXISTS DeviceTelemetryPacketTaskInfo( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, IoTPlatformProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, IoTPlatformProductName STRING FIELD, IoTPlatformAccountId STRING FIELD, AccountPhoneNumber STRING FIELD, IssueRawMessage STRING FIELD, IssuePayload STRING FIELD, ResponseRawMessage STRING FIELD, ResponsePayload STRING FIELD, TelemetrySource INT32 FIELD, IoTPlatform INT32 FIELD, RetryCount INT32 FIELD, LastIssueTime TIMESTAMP FIELD, IssueStatus INT32 FIELD ) COMMENT 'DeviceTelemetryPacketTaskInfo' ;CREATE TABLE IF NOT EXISTS OneNETReceiveMessageEntity( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, ProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, IsEncrypted BOOLEAN FIELD, PlaintextMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD ) COMMENT 'OneNETReceiveMessageEntity'" | ./start-cli.sh -h iotdb-standalone -sql_dialect table
# 使用非交互式方式设置密码
echo "ALTER USER root SET PASSWORD '${IOTDB_ROOT_PASSWORD}';" | ./start-cli.sh -h iotdb-standalone
@ -188,7 +188,7 @@ echo " Pulsar Broker: ${SERVER_IP}:${PULSAR_BROKER_PORT}"
echo " Pulsar Admin: http://${SERVER_IP}:${PULSAR_ADMIN_PORT}"
echo " IoTDB: ${SERVER_IP}:${IOTDB_PORT} (root/${IOTDB_ROOT_PASSWORD})"
echo " Redis: ${SERVER_IP}:6379"
echo " MySQL: ${SERVER_IP}:${MYSQL_PORT}"
echo " PostgreSQL: ${SERVER_IP}:${POSTGRES_PORT:-5432} (postgres/${POSTGRES_PASSWORD:-JiShe!aqG#5kGgh&0})"
echo " Admin API: http://${SERVER_IP}:${ADMIN_API_PORT}"
echo " Admin UI: http://${SERVER_IP}:${ADMIN_WEB_PORT}"
echo " 用户名: ${PULSAR_ADMIN_USER}"
@ -202,7 +202,7 @@ echo ""
echo "🧪 测试连接:"
echo " Pulsar: curl -u ${PULSAR_ADMIN_USER}:${PULSAR_ADMIN_PASSWORD} http://${SERVER_IP}:${PULSAR_ADMIN_PORT}/admin/v2/clusters"
echo " Redis: redis-cli -h ${SERVER_IP} -p 6379 ping"
echo " MySQL: mysql -h ${SERVER_IP} -P ${MYSQL_PORT} -uroot -p${MYSQL_ROOT_PASSWORD} -e 'SELECT 1'"
echo " PostgreSQL: PGPASSWORD=${POSTGRES_PASSWORD:-JiShe!aqG#5kGgh&0} psql -h ${SERVER_IP} -p ${POSTGRES_PORT:-5432} -U postgres -d ${POSTGRES_DB:-jisheiotprodb} -c 'SELECT 1'"
echo " IoTDB: docker exec -it iotdb-standalone ./start-cli.sh -h iotdb-standalone -u root -p Lixiao@1980"
echo ""
echo "🎯 等待服务启动完成..."

View File

@ -42,22 +42,20 @@ echo "=== 采集端一键启动脚本 ==="
# 创建数据目录
echo "📁 创建数据目录..."
sudo mkdir -p /mnt/dockerdata/appservice/{redis,mysql,iotdb,adminapi}
sudo mkdir -p /mnt/dockerdata/appservice/{redis/{outdata,conf},mysql/{conf,log,data},iotdb/{conf,data,logs},adminapi/{conf,logs}}
sudo mkdir -p /mnt/dockerdata/appservice/{redis,postgresql,iotdb,adminapi}
sudo mkdir -p /mnt/dockerdata/appservice/{redis/{outdata,conf},postgresql/data,iotdb/{conf,data,logs},adminapi/{conf,logs}}
# 创建本地目录的软链接(如果不存在)
echo "🔗 创建本地目录链接..."
mkdir -p ./redis/{outdata,conf}
mkdir -p ./mysql/{conf,log,data}
mkdir -p ./postgresql/{data,init}
mkdir -p ./iotdb/{conf,data,logs}
mkdir -p ./adminapi/{conf,logs}
# 修复MySQL目录权限
echo "🔧 修复MySQL目录权限..."
sudo chown -R 1000:1000 ./mysql/data
sudo chown -R 1000:1000 ./mysql/log
sudo chmod -R 755 ./mysql/data
sudo chmod -R 755 ./mysql/log
# 修复PostgreSQL目录权限
echo "🔧 修复PostgreSQL目录权限..."
sudo chown -R 999:999 ./postgresql/data 2>/dev/null || true
sudo chmod -R 755 ./postgresql/data 2>/dev/null || true
sudo chmod -R 755 ./adminapi/logs
@ -101,19 +99,21 @@ sudo rm -rf ./iotdb/data/*
sudo rm -rf ./iotdb/logs/*
echo "✅ IoTDB数据目录已清理配置目录已保留"
# MySQL配置检查
echo "⚙️ 检查MySQL配置..."
if [ ! -d "./mysql/init" ]; then
echo "❌ MySQL初始化脚本目录不存在请检查"
exit 1
# PostgreSQL配置检查
echo "⚙️ 检查PostgreSQL配置..."
if [ ! -d "./postgresql/init" ]; then
echo "⚠️ PostgreSQL初始化脚本目录不存在将创建目录可选"
mkdir -p ./postgresql/init
fi
if [ ! -f "./mysql/init/init-db.sql" ]; then
echo "❌ MySQL初始化脚本不存在请检查"
exit 1
# PostgreSQL初始化脚本是可选的不强制要求
if [ -f "./postgresql/init/init-db.sql" ]; then
echo "✅ PostgreSQL初始化脚本已存在"
else
echo " PostgreSQL初始化脚本不存在可选将在首次启动时使用环境变量创建数据库"
fi
echo "✅ MySQL配置检查通过"
echo "✅ PostgreSQL配置检查通过"
# 处理 Admin API 配置文件
echo "📝 配置 Admin API 配置文件..."
@ -157,7 +157,7 @@ sleep 10
echo "IoTDB服务已就绪开始创建表模型数据库和设置root账号密码..."
# 使用非交互式方式创建表模型数据库
echo "CREATE TABLE IF NOT EXISTS CTWingAepReceiveMessageEntity(time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, SubDevice STRING TAG, PlatformTenantId STRING FIELD, ProductId STRING FIELD, ServiceId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD, IMSI STRING FIELD, IMEI STRING FIELD ) COMMENT 'CTWingAepReceiveMessageEntity';CREATE TABLE IF NOT EXISTS DeviceTelemetryPacketTaskInfo(time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, SubDevice STRING TAG, IoTPlatformProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, IoTPlatformProductName STRING FIELD, IoTPlatformAccountId STRING FIELD, AccountPhoneNumber STRING FIELD, TelemetryType INT32 FIELD, IssueRawMessage STRING FIELD, IssuePayload STRING FIELD, ResponseRawMessage STRING FIELD, ResponsePayload STRING FIELD, TelemetrySource INT32 FIELD, IoTPlatform INT32 FIELD, RetryCount INT32 FIELD, LastIssueTime TIMESTAMP FIELD, IssueStatus INT32 FIELD ) COMMENT 'DeviceTelemetryPacketTaskInfo';CREATE TABLE IF NOT EXISTS OneNETReceiveMessageEntity(time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, SubDevice STRING TAG, ProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, IsEncrypted BOOLEAN FIELD, PlaintextMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD ) COMMENT 'OneNETReceiveMessageEntity';" | ./start-cli.sh -h iotdb-standalone -sql_dialect table
echo "CREATE DATABASE jisheiotdata;USE jisheiotdata;CREATE TABLE IF NOT EXISTS CTWingAepReceiveMessageEntity( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, PlatformTenantId STRING FIELD, ProductId STRING FIELD, ServiceId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD, IMSI STRING FIELD, IMEI STRING FIELD ) COMMENT 'CTWingAepReceiveMessageEntity' ;CREATE TABLE IF NOT EXISTS DeviceTelemetryPacketTaskInfo( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, IoTPlatformProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, IoTPlatformProductName STRING FIELD, IoTPlatformAccountId STRING FIELD, AccountPhoneNumber STRING FIELD, IssueRawMessage STRING FIELD, IssuePayload STRING FIELD, ResponseRawMessage STRING FIELD, ResponsePayload STRING FIELD, TelemetrySource INT32 FIELD, IoTPlatform INT32 FIELD, RetryCount INT32 FIELD, LastIssueTime TIMESTAMP FIELD, IssueStatus INT32 FIELD ) COMMENT 'DeviceTelemetryPacketTaskInfo' ;CREATE TABLE IF NOT EXISTS OneNETReceiveMessageEntity( time TIMESTAMP TIME, IoTDataType STRING TAG, DeviceType STRING TAG, DeviceAddress STRING TAG, ProductId STRING FIELD, IoTPlatformDeviceOpenInfo STRING FIELD, MessageType STRING FIELD, Protocol STRING FIELD, RawMessage STRING FIELD, IsEncrypted BOOLEAN FIELD, PlaintextMessage STRING FIELD, ReceivedPayload STRING FIELD, ReceivedTimestamps INT64 FIELD ) COMMENT 'OneNETReceiveMessageEntity'" | ./start-cli.sh -h iotdb-standalone -sql_dialect table
# 使用非交互式方式设置密码
echo "ALTER USER root SET PASSWORD '${IOTDB_ROOT_PASSWORD}';" | ./start-cli.sh -h iotdb-standalone
@ -171,7 +171,7 @@ echo ""
echo "📋 连接信息:"
echo " IoTDB: ${SERVER_IP}:${IOTDB_PORT} (root/${IOTDB_ROOT_PASSWORD})"
echo " Redis: ${SERVER_IP}:6379"
echo " MySQL: ${SERVER_IP}:${MYSQL_PORT}"
echo " PostgreSQL: ${SERVER_IP}:${POSTGRES_PORT:-5432} (postgres/${POSTGRES_PASSWORD:-JiShe!aqG#5kGgh&0})"
echo " Admin API: http://${SERVER_IP}:${ADMIN_API_PORT}"
echo " Admin UI: http://${SERVER_IP}:${ADMIN_WEB_PORT}"
echo ""
@ -182,7 +182,7 @@ echo " 停止服务: docker compose down"
echo ""
echo "🧪 测试连接:"
echo " Redis: redis-cli -h ${SERVER_IP} -p 6379 ping"
echo " MySQL: mysql -h ${SERVER_IP} -P ${MYSQL_PORT} -uroot -p${MYSQL_ROOT_PASSWORD} -e 'SELECT 1'"
echo " PostgreSQL: PGPASSWORD=${POSTGRES_PASSWORD:-JiShe!aqG#5kGgh&0} psql -h ${SERVER_IP} -p ${POSTGRES_PORT:-5432} -U postgres -d ${POSTGRES_DB:-jisheiotprodb} -c 'SELECT 1'"
echo " IoTDB: docker exec -it iotdb-standalone ./start-cli.sh -h iotdb-standalone -u root -p Lixiao@1980"
echo ""
echo "🎯 等待服务启动完成..."

View File

@ -268,15 +268,15 @@ namespace JiShe.IoT.DeviceAggregation
/// </summary>
/// <param name="input"></param>
/// <param name="pushResult">推送结果原始信息</param>
/// <param name="securityKey">设备接入鉴权key</param>
/// <param name="platformPassword">设备接入鉴权key</param>
/// <returns></returns>
/// <exception cref="UserFriendlyException"></exception>
private async Task<DeviceManagementInfoDto> DeviceUpdateHandler(DeviceManagementInfoDto input, HttpDataResult pushResult, string securityKey = null)
private async Task<DeviceManagementInfoDto> DeviceUpdateHandler(DeviceManagementInfoDto input, HttpDataResult pushResult, string platformPassword = null)
{
UpdateDeviceInput updateDeviceInput = input.Adapt<UpdateDeviceInput>();
updateDeviceInput.IoTPlatformResponse = pushResult.Serialize();
updateDeviceInput.IsPlatformPushSuccess = true;
updateDeviceInput.SecurityKey = securityKey;
updateDeviceInput.PlatformPassword = platformPassword;
var updateResult = await deviceAppService.UpdateAsync(updateDeviceInput);

View File

@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
namespace JiShe.IoT.Migrations
{
[DbContext(typeof(IoTDbContext))]
[Migration("20260115084844_InitialCreate")]
[Migration("20260116085116_InitialCreate")]
partial class InitialCreate
{
/// <inheritdoc />
@ -435,8 +435,8 @@ namespace JiShe.IoT.Migrations
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
@ -468,8 +468,8 @@ namespace JiShe.IoT.Migrations
b.Property<string>("DisplayText")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("ExtraProperties")
.IsRequired()
@ -509,8 +509,8 @@ namespace JiShe.IoT.Migrations
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<DateTime>("CreationTime")
.HasColumnType("timestamp with time zone")
@ -528,12 +528,12 @@ namespace JiShe.IoT.Migrations
.HasColumnType("character varying(1024)");
b.Property<string>("DisplayText")
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("ExtendedAttribute")
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<bool>("IsEnabled")
.HasColumnType("boolean");
@ -731,11 +731,6 @@ namespace JiShe.IoT.Migrations
.HasColumnType("character varying(40)")
.HasComment("设备地址");
b.Property<string>("DeviceBrandCode")
.HasMaxLength(50)
.HasColumnType("character varying(50)")
.HasComment("设备品牌编码");
b.Property<string>("DeviceName")
.IsRequired()
.HasMaxLength(128)
@ -852,11 +847,6 @@ namespace JiShe.IoT.Migrations
.HasColumnType("text")
.HasComment("备注");
b.Property<string>("SecurityKey")
.HasMaxLength(256)
.HasColumnType("character varying(256)")
.HasComment("设备接入鉴权key");
b.Property<Guid?>("TenantId")
.HasColumnType("uuid")
.HasColumnName("TenantId")

View File

@ -109,8 +109,8 @@ namespace JiShe.IoT.Migrations
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
TenantId = table.Column<Guid>(type: "uuid", nullable: true),
Code = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false),
DisplayText = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false),
Code = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
DisplayText = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
Description = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: false),
ExtraProperties = table.Column<string>(type: "text", nullable: false),
ConcurrencyStamp = table.Column<string>(type: "character varying(40)", maxLength: 40, nullable: false),
@ -739,8 +739,6 @@ namespace JiShe.IoT.Migrations
DeviceThingModelDataId = table.Column<Guid>(type: "uuid", nullable: true, comment: "设备物模型数据Id"),
FirmwareVersion = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true, comment: "固件版本"),
UpgradeDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: true, comment: "升级日期"),
SecurityKey = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true, comment: "设备接入鉴权key"),
DeviceBrandCode = table.Column<string>(type: "character varying(50)", maxLength: 50, nullable: true, comment: "设备品牌编码"),
BusinessSystemDeviceDataId = table.Column<long>(type: "bigint", nullable: true, comment: "业务系统设备数据Id"),
ConcurrencyStamp = table.Column<string>(type: "character varying(40)", maxLength: 40, nullable: false),
CreationTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
@ -1205,12 +1203,12 @@ namespace JiShe.IoT.Migrations
{
Id = table.Column<Guid>(type: "uuid", nullable: false),
DataDictionaryId = table.Column<Guid>(type: "uuid", nullable: false),
Code = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: false),
Code = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false),
Order = table.Column<int>(type: "integer", nullable: false),
DisplayText = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true),
DisplayText = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
Description = table.Column<string>(type: "character varying(1024)", maxLength: 1024, nullable: true),
IsEnabled = table.Column<bool>(type: "boolean", nullable: false),
ExtendedAttribute = table.Column<string>(type: "character varying(64)", maxLength: 64, nullable: true),
ExtendedAttribute = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: true),
CreationTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
CreatorId = table.Column<Guid>(type: "uuid", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),

View File

@ -432,8 +432,8 @@ namespace JiShe.IoT.Migrations
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
@ -465,8 +465,8 @@ namespace JiShe.IoT.Migrations
b.Property<string>("DisplayText")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("ExtraProperties")
.IsRequired()
@ -506,8 +506,8 @@ namespace JiShe.IoT.Migrations
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<DateTime>("CreationTime")
.HasColumnType("timestamp with time zone")
@ -525,12 +525,12 @@ namespace JiShe.IoT.Migrations
.HasColumnType("character varying(1024)");
b.Property<string>("DisplayText")
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<string>("ExtendedAttribute")
.HasMaxLength(64)
.HasColumnType("character varying(64)");
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<bool>("IsEnabled")
.HasColumnType("boolean");
@ -728,11 +728,6 @@ namespace JiShe.IoT.Migrations
.HasColumnType("character varying(40)")
.HasComment("设备地址");
b.Property<string>("DeviceBrandCode")
.HasMaxLength(50)
.HasColumnType("character varying(50)")
.HasComment("设备品牌编码");
b.Property<string>("DeviceName")
.IsRequired()
.HasMaxLength(128)
@ -849,11 +844,6 @@ namespace JiShe.IoT.Migrations
.HasColumnType("text")
.HasComment("备注");
b.Property<string>("SecurityKey")
.HasMaxLength(256)
.HasColumnType("character varying(256)")
.HasComment("设备接入鉴权key");
b.Property<Guid?>("TenantId")
.HasColumnType("uuid")
.HasColumnName("TenantId")