优化redis和sql组件的项目引入路径,解决初始化数据异常的问题。

This commit is contained in:
ChenYi 2025-08-29 10:34:46 +08:00
parent 659297937c
commit 3c5f21f31a
15 changed files with 3160 additions and 12 deletions

28
DockerComposeShells/.env Normal file
View File

@ -0,0 +1,28 @@
# 服务器配置
SERVER_IP=47.110.53.196
# Pulsar配置
PULSAR_BROKER_PORT=9093
PULSAR_ADMIN_PORT=9094
PULSAR_ZOOKEEPER_PORT=2181
# IoTDB配置
IOTDB_PORT=30710
# Redis配置
REDIS_PORT=30712
# MySQL配置
MYSQL_PORT=13306
# Admin API配置
ADMIN_API_PORT=28080
# Admin Web配置
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

@ -0,0 +1,146 @@
# Docker Compose 部署说明
## 概述
这是一个基于Docker Compose的微服务部署方案包含以下服务
- Pulsar 消息队列集群
- IoTDB 时序数据库
- Redis 缓存服务
- MySQL 关系数据库
- Admin API 管理接口
- Admin Web 管理界面
## 快速开始
### 1. 配置环境变量
复制 `env.example``.env` 并修改配置:
```bash
cp env.example .env
# 编辑 .env 文件修改服务器IP地址等配置
```
### 2. 启动服务
```bash
# 给启动脚本添加执行权限
chmod +x start-pulsar.sh
# 启动所有服务
./start-pulsar.sh
```
### 3. 查看服务状态
```bash
docker-compose -f docker-compose.yml ps
```
## 配置说明
### 环境变量配置 (.env)
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `SERVER_IP` | 服务器公网IP地址 | 47.110.53.196 |
| `PULSAR_BROKER_PORT` | Pulsar Broker端口 | 9093 |
| `PULSAR_ADMIN_PORT` | Pulsar Admin端口 | 9094 |
| `IOTDB_PORT` | IoTDB端口 | 30710 |
| `REDIS_PORT` | Redis端口 | 30712 |
| `MYSQL_PORT` | MySQL端口 | 13306 |
| `ADMIN_API_PORT` | Admin API端口 | 28080 |
| `ADMIN_WEB_PORT` | Admin Web端口 | 30711 |
| `PULSAR_ADMIN_USER` | Pulsar管理员用户名 | admin |
| `PULSAR_ADMIN_PASSWORD` | Pulsar管理员密码 | 0fd7afb8b0d04e6abc4fdfdac2190a79 |
| `IOTDB_ROOT_PASSWORD` | IoTDB root用户密码 | Lixiao@1980 |
| `MYSQL_ROOT_PASSWORD` | MySQL root用户密码 | JiShe!aqG#5kGgh&0 |
### 端口映射
| 服务 | 容器端口 | 宿主机端口 | 说明 |
|------|----------|------------|------|
| Zookeeper | 2181 | 2181 | Pulsar集群协调服务 |
| Pulsar Broker | 9093 | 9093 | Pulsar消息服务 |
| Pulsar Admin | 9094 | 9094 | Pulsar管理接口 |
| IoTDB | 6667 | 30710 | 时序数据库 |
| Redis | 6379 | 30712 | 缓存服务 |
| MySQL | 3306 | 13306 | 关系数据库 |
| Admin API | 10500 | 28080 | 管理接口 |
| Admin Web | 8080 | 30711 | 管理界面 |
## 部署到新服务器
### 1. 修改配置文件
编辑 `.env` 文件,修改以下关键配置:
```bash
# 修改为你的服务器IP地址
SERVER_IP=你的服务器IP地址
# 根据需要修改端口(避免端口冲突)
PULSAR_BROKER_PORT=9093
PULSAR_ADMIN_PORT=9094
# ... 其他端口配置
```
### 2. 启动服务
```bash
./start-pulsar.sh
```
### 3. 验证部署
脚本会自动显示连接信息,包括:
- 各服务的访问地址
- 用户名和密码
- 测试连接命令
## 常用命令
```bash
# 查看服务状态
docker-compose -f docker-compose.yml ps
# 查看服务日志
docker-compose -f docker-compose.yml logs -f [服务名]
# 停止所有服务
docker-compose -f docker-compose.yml down
# 重启特定服务
docker-compose -f docker-compose.yml restart [服务名]
# 查看服务资源使用情况
docker stats
```
## 故障排除
### 1. 端口冲突
如果遇到端口冲突,修改 `config.env` 中的端口配置,然后重启服务。
### 2. 权限问题
确保脚本有执行权限:
```bash
chmod +x start-pulsar.sh
```
### 3. 磁盘空间
确保有足够的磁盘空间用于数据存储:
```bash
df -h
```
### 4. 服务启动顺序
服务启动顺序由 `depends_on` 配置控制,如果某个服务启动失败,检查依赖服务是否正常。
## 安全建议
1. 修改默认密码
2. 限制网络访问
3. 定期更新镜像
4. 监控服务状态
5. 备份重要数据
## 支持
如有问题,请检查:
1. Docker和Docker Compose版本
2. 系统资源是否充足
3. 网络配置是否正确
4. 日志信息中的错误提示

View File

@ -0,0 +1,100 @@
{
"App": {
"SelfUrl": "http://localhost:44315",
"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"
},
"ConnectionStrings": {
"Default": "Data Source=mysql;Port=3306;Database=JiSheIoTProDB;uid=root;pwd=JiShe!aqG#5kGgh&0;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true;"
// //
// "PrepayDB": "server=rm-m5el3d1u1k0wzk70n2o.sqlserver.rds.aliyuncs.com,3433;database=jishe.sysdb;uid=v3sa;pwd=JiShe123;Encrypt=False;Trust Server Certificate=False",
// "EnergyDB": "server=rm-wz9hw529i3j1e3b5fbo.sqlserver.rds.aliyuncs.com,3433;database=db_energy;uid=yjdb;pwd=Kdjdhf+9*7ad222LL;Encrypt=False;Trust Server Certificate=False"
},
"Hangfire": {
"Redis": {
"Host": "redis:6379,password=1q3J@BGf!yhTaD46nS#",
"DB": "2"
}
},
"Redis": {
"Configuration": "redis:6379,defaultdatabase=5,password=1q3J@BGf!yhTaD46nS#"
},
"Kafka": {
"BootstrapServers": "47.110.62.104:9094,47.110.53.196:9094,47.110.60.222:9094",
"EnableFilter": true,
"EnableAuthorization": false,
"SaslUserName": "lixiao",
"SaslPassword": "lixiao@1980",
"KafkaReplicationFactor": 3,
"NumPartitions": 30,
"TaskThreadCount": -1
},
"Pulsar": {
"ServiceUrl": "pulsar://pulsar-broker:9093",
"WebUrl": "http://pulsar-broker:9094",
"UserName": "admin",
"TenantName": "1YMVZZkAkRArjxSD8457",
"Namespace": "OneNET",
"PulsarSecretKey": "0fd7afb8b0d04e6abc4fdfdac2190a79",
"PulsarSubscriptionCustomName": "sub",
"EnableTls": false,
"ValidateServerCertificate": false,
"ConnectionTimeout": 30,
"OperationTimeout": 30,
"KeepAliveInterval": 30,
"TaskThreadCount": 1,
"IsSubscriber": true,
"DefaultPartitions": 16,
"DefaultBundles": 16,
"EnableAutoCreation": true, //Topic
"TopicMode": "Static", //Dynamic
"EnableTopicTypeFilter": true, //Topic
"AllowedTopicTypes": [ "Static" ], //Topic
"AllowedClusters": [ "pulsar-cluster-1" ], //
"AdminRoles": [ "admin" ],
"EnableConsumerIdleCleanup": true,
"ConsumerIdleCleanupMinutes": 120,
"EnableProducerIdleCleanup": true,
"ProducerIdleCleanupMinutes": 60
},
"IoTDBOptions": {
"UserName": "root",
"Password": "Lixiao@1980",
"TreeModelClusterList": [ "iotdb-standalone:6667" ],
"TableModelClusterList": [ "iotdb-standalone:6667" ],
"PoolSize": 32,
"DataBaseName": "jisheiotdata",
"OpenDebugMode": true,
"UseTableSessionPoolByDefault": false
},
"ServerApplicationOptions": {
"ServerTagName": "JiSheCollectBus01",
"FirstCollectionTime": "2025-04-28 15:07:00",
"AutomaticVerificationTime": "16:07:00",
"AutomaticTerminalVersionTime": "17:07:00",
"AutomaticTelematicsModuleTime": "17:30:00",
"AutomaticDayFreezeTime": "02:30:00",
"AutomaticMonthFreezeTime": "03:30:00",
"DefaultProtocolPlugin": "T37612012ProtocolPlugin",
"VerifySignatureToken": "SIcPQnpMgaFDmNlIjNmzq5smshz7cKrh",
"DistributedMessage": 2
},
"Jwt": {
"Audience": "JiShe.IoT",
"SecurityKey": "dzehzRz9a8asdfaf43ghVD@d#fasdfaf567sdadfasdf=",
"Issuer": "JiShe.IoT",
"ExpirationTime": 2
},
"FreeRedisOptions": {
"ConnectionString": "redis:6379,password=1q3J@BGf!yhTaD46nS#,abortConnect=false,connectTimeout=30000,allowAdmin=true,maxPoolSize=500,defaultdatabase=14",
"UseDistributedCache": true
},
"FreeSqlProviderOptions": {
"UsePrepayDB": false,
"UseEnergyDB": false,
"PrintLog": false
},
"OneNETSecureReceiveOptions": {
"OneNETVerifySignatureToken": "SIcPQnpMgaFDmNlIjNmzq5smshz7cKrh",
"OneNETAesKey": "RPTEIGCA1KvDEXS1"
}
}

View File

@ -0,0 +1,38 @@
{
"Serilog": {
"Using": [
"Serilog.Sinks.Console",
"Serilog.Sinks.File"
],
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Warning",
"Volo.Abp": "Warning",
"Hangfire": "Warning",
"DotNetCore.CAP": "Warning",
"Serilog.AspNetCore": "Warning",
"Microsoft.EntityFrameworkCore": "Warning",
"Microsoft.AspNetCore": "Warning"
}
},
"WriteTo": [
{
"Name": "Console"
},
{
"Name": "File",
"Args": {
"path": "logs/logs-.txt",
"rollingInterval": "Hour"
}
}
]
},
"ExcludeSwaggerGroup": [
"FileManagement",
"NotificationManagement",
"CodeManagement",
"TemplateManagement"
] // Swagger
}

View File

@ -0,0 +1,36 @@
services:
iotdb-standalone:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/iotdb:2.0.4-standalone
hostname: iotdb-standalone
container_name: iotdb-standalone
restart: "no"
deploy:
resources:
limits:
cpus: "8"
memory: 16g
ports:
- "30710:6667"
environment:
- cn_internal_address=iotdb-standalone
- cn_internal_port=10710
- cn_consensus_port=10720
- cn_seed_config_node=iotdb-standalone:10710
- dn_rpc_address=iotdb-standalone
- dn_internal_address=iotdb-standalone
- dn_rpc_port=6667
- dn_internal_port=10730
- dn_mpp_data_exchange_port=10740
- dn_schema_region_consensus_port=10750
- dn_data_region_consensus_port=10760
- dn_seed_config_node=iotdb-standalone:10710
privileged: true
volumes:
- ./iotdb/data:/iotdb/data
- ./iotdb/logs:/iotdb/logs
networks:
- iotdb-net
networks:
iotdb-net:
driver: bridge

View File

@ -0,0 +1,319 @@
services:
zookeeper:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/pulsar:4.0.6
container_name: zookeeper
hostname: zookeeper
restart: unless-stopped
deploy:
resources:
limits:
cpus: "2"
memory: 2g
command: >
/bin/bash -c
"bin/apply-config-from-env.py conf/zookeeper.conf &&
bin/pulsar zookeeper"
environment:
- PULSAR_MEM=-Xms512m -Xmx512m -Dcom.sun.management.jmxremote -Djute.maxbuffer=10485760
ports:
- "${PULSAR_ZOOKEEPER_PORT}:${PULSAR_ZOOKEEPER_PORT}"
networks:
- pulsar-net
volumes:
- pulsar-zookeeper-data:/pulsar/data/zookeeper
healthcheck:
test: ["CMD", "bin/pulsar-zookeeper-ruok.sh"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
pulsar-cluster-init:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/pulsar:4.0.6
container_name: pulsar-cluster-init
hostname: pulsar-cluster-init
command: >
/bin/bash -c
"bin/pulsar initialize-cluster-metadata --cluster pulsar-cluster-1 --zookeeper zookeeper:${PULSAR_ZOOKEEPER_PORT} --configuration-store zookeeper:${PULSAR_ZOOKEEPER_PORT} --web-service-url http://\${SERVER_IP}:\${PULSAR_ADMIN_PORT} --broker-service-url pulsar://\${SERVER_IP}:\${PULSAR_BROKER_PORT} || echo 'Cluster metadata already exists'"
depends_on:
zookeeper:
condition: service_healthy
networks:
- pulsar-net
bookie:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/pulsar:4.0.6
container_name: pulsar-bookie
hostname: pulsar-bookie
restart: unless-stopped
deploy:
resources:
limits:
cpus: "2"
memory: 2g
command: >
/bin/bash -c
"bin/apply-config-from-env.py conf/bookkeeper.conf &&
(bin/bookkeeper shell metaformat -n --force || echo 'Bookie already formatted') &&
bin/pulsar bookie"
environment:
- PULSAR_MEM=-Xms1g -Xmx1g -XX:MaxDirectMemorySize=1g
- BOOKIE_MEM=-Xms1g -Xmx1g -XX:MaxDirectMemorySize=1g
- PULSAR_PREFIX_zkServers=zookeeper:${PULSAR_ZOOKEEPER_PORT}
depends_on:
zookeeper:
condition: service_healthy
pulsar-cluster-init:
condition: service_completed_successfully
networks:
- pulsar-net
volumes:
- pulsar-bookkeeper-data:/pulsar/data/bookkeeper
broker:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/pulsar:4.0.6
container_name: pulsar-broker
hostname: pulsar-broker
restart: unless-stopped
deploy:
resources:
limits:
cpus: "2"
memory: 2g
command: >
/bin/bash -c
"bin/apply-config-from-env.py conf/broker.conf && bin/pulsar broker"
environment:
- PULSAR_MEM=-Xms1g -Xmx1g -XX:MaxDirectMemorySize=1g
- PULSAR_PREFIX_clusterName=pulsar-cluster-1
- PULSAR_PREFIX_zookeeperServers=zookeeper:${PULSAR_ZOOKEEPER_PORT}
- PULSAR_PREFIX_configurationStoreServers=zookeeper:${PULSAR_ZOOKEEPER_PORT}
- PULSAR_PREFIX_bookkeeperClientPort=3181
- PULSAR_PREFIX_brokerServicePort=${PULSAR_BROKER_PORT}
- PULSAR_PREFIX_webServicePort=${PULSAR_ADMIN_PORT}
- PULSAR_PREFIX_advertisedAddress=${SERVER_IP}
- PULSAR_PREFIX_managedLedgerDefaultEnsembleSize=1
- PULSAR_PREFIX_managedLedgerDefaultWriteQuorum=1
- PULSAR_PREFIX_managedLedgerDefaultAckQuorum=1
- PULSAR_PREFIX_allowAutoTopicCreation=true
# 启用非持久化主题
- PULSAR_PREFIX_enableNonPersistentTopics=true
# 基本认证配置
- PULSAR_PREFIX_authenticationEnabled=true
- PULSAR_PREFIX_authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationProviderBasic
- PULSAR_PREFIX_basicAuthConf=file:///pulsar/auth/.htpasswd
# Broker自身的认证配置
- PULSAR_PREFIX_brokerClientAuthenticationPlugin=org.apache.pulsar.client.impl.auth.AuthenticationBasic
- PULSAR_PREFIX_brokerClientAuthenticationParameters={"userId":"${PULSAR_ADMIN_USER}","password":"${PULSAR_ADMIN_PASSWORD}"}
# 授权配置
- PULSAR_PREFIX_authorizationEnabled=false
- PULSAR_PREFIX_allowAutoTopicCreationType=partitioned
- PULSAR_PREFIX_allowAnonymousAccess=false
# 非持久化主题特殊配置
- PULSAR_PREFIX_allowNonPersistentTopics=true
- PULSAR_PREFIX_nonPersistentTopicsEnabled=true
ports:
- "${PULSAR_BROKER_PORT}:${PULSAR_BROKER_PORT}"
- "${PULSAR_ADMIN_PORT}:${PULSAR_ADMIN_PORT}"
depends_on:
zookeeper:
condition: service_healthy
bookie:
condition: service_started
pulsar-cluster-init:
condition: service_completed_successfully
networks:
- pulsar-net
volumes:
- pulsar-broker-data:/pulsar/data
- ./pulsar/auth:/pulsar/auth
pulsar-init:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/pulsar:4.0.6
container_name: pulsar-init
hostname: pulsar-init
command: >
/bin/bash -c
"
# 等待broker就绪
until bin/pulsar-admin --admin-url http://pulsar-broker:${PULSAR_ADMIN_PORT} --auth-plugin org.apache.pulsar.client.impl.auth.AuthenticationBasic --auth-params '{\"userId\":\"\${PULSAR_ADMIN_USER}\",\"password\":\"\${PULSAR_ADMIN_PASSWORD}\"}' clusters list; do
echo 'Waiting for Pulsar broker to be ready...'
sleep 5
done;
# 创建租户和命名空间
bin/pulsar-admin --admin-url http://pulsar-broker:${PULSAR_ADMIN_PORT} --auth-plugin org.apache.pulsar.client.impl.auth.AuthenticationBasic --auth-params '{\"userId\":\"\${PULSAR_ADMIN_USER}\",\"password\":\"\${PULSAR_ADMIN_PASSWORD}\"}' tenants create public --allowed-clusters pulsar-cluster-1 -r admin || echo 'Tenant public already exists';
bin/pulsar-admin --admin-url http://pulsar-broker:${PULSAR_ADMIN_PORT} --auth-plugin org.apache.pulsar.client.impl.auth.AuthenticationBasic --auth-params '{\"userId\":\"\${PULSAR_ADMIN_USER}\",\"password\":\"\${PULSAR_ADMIN_PASSWORD}\"}' namespaces create public/default || echo 'Namespace public/default already exists';
# 创建非持久化主题
bin/pulsar-admin --admin-url http://pulsar-broker:${PULSAR_ADMIN_PORT} --auth-plugin org.apache.pulsar.client.impl.auth.AuthenticationBasic --auth-params '{\"userId\":\"\${PULSAR_ADMIN_USER}\",\"password\":\"\${PULSAR_ADMIN_PASSWORD}\"}' topics create non-persistent://public/default/default-topic || echo 'Topic non-persistent://public/default/default-topic already exists';
# 设置命名空间策略
echo 'Setting namespace policies...';
bin/pulsar-admin --admin-url http://pulsar-broker:${PULSAR_ADMIN_PORT} --auth-plugin org.apache.pulsar.client.impl.auth.AuthenticationBasic --auth-params '{\"userId\":\"\${PULSAR_ADMIN_USER}\",\"password\":\"\${PULSAR_ADMIN_PASSWORD}\"}' namespaces set-subscription-types-enabled public/default --types NonDurable;
bin/pulsar-admin --admin-url http://pulsar-broker:${PULSAR_ADMIN_PORT} --auth-plugin org.apache.pulsar.client.impl.auth.AuthenticationBasic --auth-params '{\"userId\":\"\${PULSAR_ADMIN_USER}\",\"password\":\"\${PULSAR_ADMIN_PASSWORD}\"}' namespaces set-message-ttl public/default --messageTTL 0;
bin/pulsar-admin --admin-url http://pulsar-broker:${PULSAR_ADMIN_PORT} --auth-plugin org.apache.pulsar.client.impl.auth.AuthenticationBasic --auth-params '{\"userId\":\"\${PULSAR_ADMIN_USER}\",\"password\":\"\${PULSAR_ADMIN_PASSWORD}\"}' namespaces set-retention public/default --sizeLimit -1 --timeLimit -1;
echo 'Pulsar initialization completed with Basic Authentication!';
"
depends_on:
- broker
networks:
- pulsar-net
iotdb-standalone-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/iotdb:2.0.4-standalone
hostname: iotdb-standalone
container_name: iotdb-standalone
restart: always
deploy:
resources:
limits:
cpus: "8"
memory: 16g
ports:
- "${IOTDB_PORT}:6667"
environment:
- cn_internal_address=iotdb-standalone
- cn_internal_port=10710
- cn_consensus_port=10720
- cn_seed_config_node=iotdb-standalone:10710
- dn_rpc_address=iotdb-standalone
- dn_internal_address=iotdb-standalone
- dn_rpc_port=6667
- dn_internal_port=10730
- dn_mpp_data_exchange_port=10740
- dn_schema_region_consensus_port=10750
- dn_data_region_consensus_port=10760
- dn_seed_config_node=iotdb-standalone:10710
privileged: true
volumes:
- ./iotdb/conf:/iotdb/conf
- ./iotdb/data:/iotdb/data
- ./iotdb/logs:/iotdb/logs
networks:
- pulsar-net
redis-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/redis:8.0.2-alpine3.21
container_name: redis
restart: always
hostname: redis
deploy:
resources:
limits:
cpus: "2.0"
memory: 2g
ports:
- "${REDIS_PORT}:6379"
volumes:
- ./redis/outdata:/data
- ./redis/conf:/etc/redis/conf
command: redis-server /etc/redis/conf/redis.conf
stdin_open: true
tty: true
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
ports:
- "${MYSQL_PORT}:3306"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
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用户运行
deploy:
resources:
limits:
cpus: "2.0"
memory: 2g
stdin_open: true
tty: true
networks:
- pulsar-net
admin-api-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/jishe.iot.admin:2025.0827.1536
container_name: admin-api
hostname: admin-api
restart: always
deploy:
resources:
limits:
cpus: "2.0"
memory: 4g
ports:
- "${ADMIN_API_PORT}:10500"
volumes:
- ./adminapi/conf:/app/configs
- ./adminapi/logs:/app/logs
stdin_open: true
tty: true
depends_on:
- mysql-service
- redis-service
- iotdb-standalone-service
- pulsar-init
networks:
- pulsar-net
admin-web-service:
image: registry.cn-qingdao.aliyuncs.com/jisheyun/jishe.iot.ui:2025.0819.2313
container_name: admin-web
hostname: admin-web
restart: always
deploy:
resources:
limits:
cpus: "1.0"
memory: 2g
ports:
- "${ADMIN_WEB_PORT}:8080"
stdin_open: true
tty: true
depends_on:
- admin-api-service
networks:
- pulsar-net
networks:
pulsar-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.23.0.0/16
gateway: 172.23.0.1
volumes:
pulsar-zookeeper-data:
driver: local
driver_opts:
type: none
o: bind
device: ./pulsar/zookeeper-data
pulsar-bookkeeper-data:
driver: local
driver_opts:
type: none
o: bind
device: ./pulsar/bookkeeper-data
pulsar-broker-data:
driver: local
driver_opts:
type: none
o: bind
device: ./pulsar/pulsar-data

View File

@ -0,0 +1,29 @@
# 服务器配置
# 修改为你的服务器IP地址
SERVER_IP=47.110.53.196
# Pulsar配置
PULSAR_BROKER_PORT=9093
PULSAR_ADMIN_PORT=9094
PULSAR_ZOOKEEPER_PORT=2181
# IoTDB配置
IOTDB_PORT=30710
# Redis配置
REDIS_PORT=30712
# MySQL配置
MYSQL_PORT=13306
# Admin API配置
ADMIN_API_PORT=28080
# Admin Web配置
ADMIN_WEB_PORT=30711
# 认证信息
PULSAR_ADMIN_USER=admin
PULSAR_ADMIN_PASSWORD=0fd7afb8b0d04e6abc4fdfdac2190a79
IOTDB_ROOT_PASSWORD=Lixiao@1980
MYSQL_ROOT_PASSWORD=JiShe!aqG#5kGgh&0

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,197 @@
#!/bin/bash
# 检查环境变量配置文件
if [ ! -f "./.env" ]; then
echo "❌ 配置文件 .env 不存在,请先创建配置文件"
echo "💡 可以复制 .env.example 为 .env 并修改配置"
exit 1
fi
echo "📁 使用 .env 配置文件Docker Compose 将自动加载环境变量"
echo "=== Docker 镜像仓库登录 ==="
docker login --username=yunjichaobiao --password hub.jishe.com registry.cn-qingdao.aliyuncs.com
echo "=== 采集端一键启动脚本 ==="
# 检查htpasswd是否安装
if ! command -v htpasswd &> /dev/null; then
echo "❌ htpasswd 未安装,正在安装..."
if command -v apt &> /dev/null; then
sudo apt update && sudo apt install -y apache2-utils
elif command -v yum &> /dev/null; then
sudo yum install -y httpd-tools
else
echo "❌ 无法自动安装htpasswd请手动安装后重试"
exit 1
fi
fi
# 创建认证配置
echo "🔐 创建Pulsar基本认证配置..."
mkdir -p ./pulsar/auth
htpasswd -cmb ./pulsar/auth/.htpasswd \${PULSAR_ADMIN_USER} \${PULSAR_ADMIN_PASSWORD}
echo "✅ 认证配置完成 - 用户名: \${PULSAR_ADMIN_USER}, 密码: \${PULSAR_ADMIN_PASSWORD}"
# 创建数据目录
echo "📁 创建数据目录..."
sudo mkdir -p /mnt/dockerdata/appservice/{pulsar,redis,mysql,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 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 ./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
sudo chmod -R 755 ./adminapi/logs
# 第一步启动IoTDB独立服务获取配置
echo "🚀 第一步启动IoTDB独立服务获取配置..."
docker compose -f docker-compose-iotdb-standalone.yml up -d
# 等待IoTDB启动完成
echo "⏳ 等待IoTDB服务启动完成..."
sleep 10
# 第二步:拷贝配置目录
echo "📁 第二步拷贝IoTDB配置目录..."
docker cp iotdb-standalone:/iotdb/conf ./iotdb
echo "✅ IoTDB配置目录拷贝完成"
# 第三步:修改时间戳精度配置
echo "⚙️ 第三步修改IoTDB时间戳精度配置..."
if [ -f "./iotdb/conf/iotdb-system.properties" ]; then
# 检查是否已经包含配置
if ! grep -q "timestamp_precision=ns" ./iotdb/conf/iotdb-system.properties; then
# 添加换行和说明
echo "" >> ./iotdb/conf/iotdb-system.properties
echo "# ms 毫秒 us 微秒 ns 纳秒" >> ./iotdb/conf/iotdb-system.properties
echo "timestamp_precision=ns" >> ./iotdb/conf/iotdb-system.properties
echo "✅ 时间戳精度配置已添加timestamp_precision=ns"
else
echo " 时间戳精度配置已存在"
fi
else
echo "❌ 配置文件不存在,请检查配置目录"
fi
# 第四步停止IoTDB独立服务
echo "🛑 第四步停止IoTDB独立服务..."
docker compose -f docker-compose-iotdb-standalone.yml down
# 第五步清理IoTDB数据目录保留配置目录
echo "🧹 第五步清理IoTDB数据目录保留配置目录..."
sudo rm -rf ./iotdb/data/*
sudo rm -rf ./iotdb/logs/*
echo "✅ IoTDB数据目录已清理配置目录已保留"
# MySQL配置检查
#echo "⚙️ 检查MySQL配置..."
#if [ ! -d "./mysql/init" ]; then
# echo "❌ MySQL初始化脚本目录不存在请检查"
# exit 1
#fi
#
#if [ ! -f "./mysql/init/init-db.sql" ]; then
# echo "❌ MySQL初始化脚本不存在请检查"
# exit 1
#fi
#
#echo "✅ MySQL配置检查通过"
sleep 15
# 启动主服务
echo "第六步:🚀 启动 部署主脚本 ..."
# 检查是否是Pulsar重启
if [ -d "./pulsar/zookeeper-data" ] && [ "$(ls -A ./pulsar/zookeeper-data)" ]; then
echo "⚠️ 检测到Pulsar数据目录已存在可能是重启操作"
echo "🧹 清理Pulsar状态数据以确保正常启动..."
# 停止可能运行的服务
docker compose down
# 清理Pulsar状态数据保留数据目录
echo "清理Zookeeper状态..."
sudo rm -rf ./pulsar/zookeeper-data/*
echo "清理BookKeeper状态..."
sudo rm -rf ./pulsar/bookkeeper-data/*
echo "清理Pulsar broker状态..."
sudo rm -rf ./pulsar/pulsar-data/*
echo "✅ Pulsar状态数据已清理"
sleep 5
fi
docker compose up -d
# 等待IoTDB启动完成
echo "⏳ 等待IoTDB服务启动完成..."
sleep 10
# 设置IoTDB密码
echo "第七步:🔐 设置IoTDB root用户密码..."
docker exec -i iotdb-standalone /bin/bash << 'EOF'
# 等待IoTDB完全启动
echo "等待IoTDB服务就绪..."
sleep 10
echo "IoTDB服务已就绪开始设置密码和创建数据库..."
# 使用非交互式方式创建表模型数据库
echo "CREATE DATABASE jisheiotdata;" | ./start-cli.sh -h iotdb-standalone -sql_dialect table
# 使用非交互式方式设置密码
echo "ALTER USER root SET PASSWORD '\${IOTDB_ROOT_PASSWORD}';" | ./start-cli.sh -h iotdb-standalone
# 等待一下再执行确认密码
sleep 2
echo "\${IOTDB_ROOT_PASSWORD}" | ./start-cli.sh -h iotdb-standalone
echo "IoTDB密码设置完成"
EOF
echo "✅ IoTDB密码设置完成 - 用户名: root, 密码: \${IOTDB_ROOT_PASSWORD}"
echo ""
echo "🎉 Pulsar 基本认证集群启动完成!"
echo ""
echo "📋 连接信息:"
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 " Admin API: http://\${SERVER_IP}:\${ADMIN_API_PORT}"
echo " Admin UI: http://\${SERVER_IP}:\${ADMIN_WEB_PORT}"
echo " 用户名: \${PULSAR_ADMIN_USER}"
echo " 密码: \${PULSAR_ADMIN_PASSWORD}"
echo ""
echo "🔧 常用命令:"
echo " 查看状态: docker compose ps"
echo " 查看日志: docker compose logs -f"
echo " 停止服务: docker compose down"
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} -u root -p\${MYSQL_ROOT_PASSWORD} -e 'SELECT 1'"
echo " IoTDB: docker exec -it iotdb-standalone ./start-cli.sh -h iotdb-standalone -u root -p Lixiao@1980"
echo ""
echo "🎯 等待服务启动完成..."
echo "⏳ 请等待几分钟让所有服务完全启动"

View File

@ -270,6 +270,17 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiShe.ServicePro.ModelBinde
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiShe.ServicePro.DistributedMessageCenter", "JiShe.ServicePro\frameworks\src\JiShe.ServicePro.DistributedMessageCenter\JiShe.ServicePro.DistributedMessageCenter.csproj", "{C51F35A8-5BF8-8E2F-96B2-B62E3BCF8273}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DockerComposeShells", "DockerComposeShells", "{8FE7CFC6-BA2A-4717-941C-0C227EB151B9}"
ProjectSection(SolutionItems) = preProject
DockerComposeShells\.env = DockerComposeShells\.env
DockerComposeShells\adminapi\conf\appsettings.Development.json = DockerComposeShells\adminapi\conf\appsettings.Development.json
DockerComposeShells\adminapi\conf\appsettings.json = DockerComposeShells\adminapi\conf\appsettings.json
DockerComposeShells\docker-compose-iotdb-standalone.yml = DockerComposeShells\docker-compose-iotdb-standalone.yml
DockerComposeShells\docker-compose.yml = DockerComposeShells\docker-compose.yml
DockerComposeShells\redis\conf\redis.conf = DockerComposeShells\redis\conf\redis.conf
DockerComposeShells\start-pulsar.sh = DockerComposeShells\start-pulsar.sh
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -860,6 +871,7 @@ Global
{12DCB751-4433-B3F1-67D3-0F15E3E2BC8B} = {72493AF2-CDAA-40A7-98AB-B8AA2B05965E}
{6A26D2DE-215B-CB11-F882-3984B2EE7AA6} = {72493AF2-CDAA-40A7-98AB-B8AA2B05965E}
{C51F35A8-5BF8-8E2F-96B2-B62E3BCF8273} = {72493AF2-CDAA-40A7-98AB-B8AA2B05965E}
{8FE7CFC6-BA2A-4717-941C-0C227EB151B9} = {2C4A6DB8-8D9E-42E6-B7C3-1EDB7B3DE22E}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F}

View File

@ -27,7 +27,6 @@ namespace JiShe.IoT
typeof(FileManagementApplicationModule),
typeof(IoTDBManagementApplicationModule),
typeof(ServiceProFreeRedisProviderModule),
typeof(ServiceProFreeSqlProviderModule),
typeof(CTWingManagementApplicationModule),
typeof(OneNETManagementApplicationModule),
typeof(DeviceManagementApplicationModule)

View File

@ -1,21 +1,21 @@
{
"ConnectionStrings": {
"Default": "Data Source=47.110.53.196;Port=13306;Database=JiSheIoTProDB;uid=root;pwd=JiShe!aqG#5kGgh&0;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true;"
"Default": "Data Source=192.168.111.42;Port=13306;Database=JiSheIoTProDB;uid=root;pwd=JiShe!aqG#5kGgh&0;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true;"
},
"IoTDBOptions": {
"UserName": "root",
"Password": "Lixiao@1980",
//"TreeModelClusterList": [ "47.110.53.196:6667", "47.110.60.222:6667", "47.110.62.104:6667" ],
//"TableModelClusterList": [ "47.110.53.196:6667", "47.110.60.222:6667", "47.110.62.104:6667" ],
"TreeModelClusterList": [ "47.110.53.196:30710" ],
"TableModelClusterList": [ "47.110.53.196:30710" ],
//"TreeModelClusterList": [ "192.168.111.42:6667", "47.110.60.222:6667", "47.110.62.104:6667" ],
//"TableModelClusterList": [ "192.168.111.42:6667", "47.110.60.222:6667", "47.110.62.104:6667" ],
"TreeModelClusterList": [ "192.168.111.42:30710" ],
"TableModelClusterList": [ "192.168.111.42:30710" ],
"PoolSize": 32,
"DataBaseName": "jisheiotdata",
"OpenDebugMode": true,
"UseTableSessionPoolByDefault": false
},
"FreeRedisOptions": {
"ConnectionString": "47.110.53.196:30712,password=1q3J@BGf!yhTaD46nS#,abortConnect=false,connectTimeout=30000,allowAdmin=true,maxPoolSize=500,defaultdatabase=14",
"ConnectionString": "192.168.111.42:30712,password=1q3J@BGf!yhTaD46nS#,abortConnect=false,connectTimeout=30000,allowAdmin=true,maxPoolSize=500,defaultdatabase=14",
"UseDistributedCache": true
},
"ServerApplicationOptions": {

View File

@ -1,8 +1,7 @@
using JiShe.ServicePro.CTWingManagement;
using JiShe.ServicePro.DeviceManagement;
using JiShe.ServicePro.DynamicMenuManagement;
using JiShe.ServicePro.FileManagement;
using JiShe.ServicePro.FreeSqlProvider;
using JiShe.ServicePro.FileManagement;
using JiShe.ServicePro.IoTDBManagement;
using JiShe.ServicePro.OneNETManagement;
using JiShe.ServicePro.TemplateManagement;
@ -18,7 +17,6 @@ namespace JiShe.IoT
typeof(DynamicMenuManagementDomainSharedModule),
typeof(FileManagementDomainSharedModule),
typeof(IoTDBManagementDomainSharedModule),
typeof(ServiceProFreeSqlProviderModule),
typeof(CTWingManagementDomainSharedModule),
typeof(OneNETManagementDomainSharedModule),
typeof(ServiceProCoreModule),

View File

@ -23,7 +23,6 @@
<ProjectReference Include="..\..\JiShe.ServicePro\modules\TemplateManagement\src\JiShe.ServicePro.TemplateManagement.Domain.Shared\JiShe.ServicePro.TemplateManagement.Domain.Shared.csproj" />
<ProjectReference Include="..\..\JiShe.ServicePro\modules\OneNETManagement\src\JiShe.ServicePro.OneNETManagement.Domain.Shared\JiShe.ServicePro.OneNETManagement.Domain.Shared.csproj" />
<ProjectReference Include="..\..\JiShe.ServicePro\frameworks\src\JiShe.ServicePro.Core\JiShe.ServicePro.Core.csproj" />
<ProjectReference Include="..\..\JiShe.ServicePro\frameworks\src\JiShe.ServicePro.FreeSqlProvider\JiShe.ServicePro.FreeSqlProvider.csproj" />
</ItemGroup>
@ -37,7 +36,6 @@
<PackageReference Include="JiShe.ServicePro.FileManagement.Domain.Shared" />
<PackageReference Include="JiShe.ServicePro.IoTDBManagement.Domain.Shared" />
<PackageReference Include="JiShe.ServicePro.DeviceManagement.Domain.Shared" />
<PackageReference Include="JiShe.ServicePro.FreeSqlProvider" />
<PackageReference Include="JiShe.ServicePro.Core" />
<PackageReference Include="JiShe.ServicePro.CTWingManagement.Domain.Shared" />
<PackageReference Include="JiShe.ServicePro.OneNETManagement.Domain.Shared" />

View File

@ -2,6 +2,7 @@ using JiShe.ServicePro.CTWingManagement;
using JiShe.ServicePro.DeviceManagement;
using JiShe.ServicePro.DynamicMenuManagement;
using JiShe.ServicePro.FileManagement;
using JiShe.ServicePro.FreeSqlProvider;
using JiShe.ServicePro.IoTDBManagement;
using JiShe.ServicePro.OneNETManagement;
using JiShe.ServicePro.TemplateManagement;
@ -20,6 +21,7 @@ namespace JiShe.IoT
typeof(DynamicMenuManagementDomainModule),
typeof(CTWingManagementDomainModule),
typeof(OneNETManagementDomainModule),
typeof(ServiceProFreeSqlProviderModule),
typeof(DeviceManagementDomainModule)
)]
public class IoTDomainModule : AbpModule