diff --git a/DockerComposeShells/docker-compose.yml b/DockerComposeShells/docker-compose.yml index 2e0d6ac..8003f82 100644 --- a/DockerComposeShells/docker-compose.yml +++ b/DockerComposeShells/docker-compose.yml @@ -230,11 +230,11 @@ services: volumes: - ./mysql/log:/var/log/mysql - ./mysql/data:/var/lib/mysql - # - ./mysql/init:/docker-entrypoint-initdb.d + - ./mysql/init:/docker-entrypoint-initdb.d command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - # - --user=mysql # 确保MySQL以mysql用户运行 + - --user=mysql # 确保MySQL以mysql用户运行 deploy: resources: limits: diff --git a/DockerComposeShells/iotdb/init/init-iot-db.sql b/DockerComposeShells/iotdb/init/init-iot-db.sql index f4f31d9..cfc9636 100644 --- a/DockerComposeShells/iotdb/init/init-iot-db.sql +++ b/DockerComposeShells/iotdb/init/init-iot-db.sql @@ -1,5 +1,5 @@ -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 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, MessageType STRING FIELD, IssueRawMessage STRING FIELD, IssuePayload STRING FIELD, ResponseRawMessage STRING FIELD, ResponsePayload STRING FIELD, TelemetrySource INT32 FIELD, IoTPlatform INT32 FIELD ) COMMENT 'DeviceTelemetryPacketTaskInfo' +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, MessageType STRING FIELD, IssueRawMessage STRING FIELD, IssuePayload STRING FIELD, ResponseRawMessage STRING FIELD, ResponsePayload STRING FIELD, TelemetrySource INT32 FIELD, IoTPlatform 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' \ No newline at end of file +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'; \ No newline at end of file diff --git a/DockerComposeShells/mysql/init/init-mysql-db.sql b/DockerComposeShells/mysql/init/init-db.sql similarity index 100% rename from DockerComposeShells/mysql/init/init-mysql-db.sql rename to DockerComposeShells/mysql/init/init-db.sql diff --git a/DockerComposeShells/start-pulsar.sh b/DockerComposeShells/start-pulsar.sh index 0577a04..a939967 100644 --- a/DockerComposeShells/start-pulsar.sh +++ b/DockerComposeShells/start-pulsar.sh @@ -5,10 +5,35 @@ if [ ! -f "./.env" ]; then echo "❌ 配置文件 .env 不存在,请先创建配置文件" echo "💡 可以复制 .env.example 为 .env 并修改配置" exit 1 -fi +fi echo "📁 使用 .env 配置文件,Docker Compose 将自动加载环境变量" +# 规范化 .env 的换行符为 LF,避免 CRLF 导致的 $'\r' 报错 +if command -v dos2unix >/dev/null 2>&1; then + dos2unix -q ./.env || true +else + sed -i 's/\r$//' ./.env 2>/dev/null || perl -pi -e 's/\r$//' ./.env 2>/dev/null || true +fi + +# 将 .env 中的变量导入当前 Shell,供脚本内使用 +set -a +. ./.env +set +a + +# 校验关键环境变量是否已加载 +missing_vars=() +[ -z "${PULSAR_ADMIN_USER}" ] && missing_vars+=(PULSAR_ADMIN_USER) +[ -z "${PULSAR_ADMIN_PASSWORD}" ] && missing_vars+=(PULSAR_ADMIN_PASSWORD) +[ -z "${SERVER_IP}" ] && missing_vars+=(SERVER_IP) +[ -z "${PULSAR_BROKER_PORT}" ] && missing_vars+=(PULSAR_BROKER_PORT) +[ -z "${PULSAR_ADMIN_PORT}" ] && missing_vars+=(PULSAR_ADMIN_PORT) +if [ ${#missing_vars[@]} -ne 0 ]; then + echo "❌ 以下环境变量未设置: ${missing_vars[*]}" + echo "💡 请在 .env 中补充这些变量后重试" + exit 1 +fi + echo "=== Docker 镜像仓库登录 ===" docker login --username=yunjichaobiao --password hub.jishe.com registry.cn-qingdao.aliyuncs.com @@ -31,9 +56,9 @@ fi # 创建认证配置 echo "🔐 创建Pulsar基本认证配置..." mkdir -p ./pulsar/auth -htpasswd -cmb ./pulsar/auth/.htpasswd \${PULSAR_ADMIN_USER} \${PULSAR_ADMIN_PASSWORD} +htpasswd -cmb ./pulsar/auth/.htpasswd ${PULSAR_ADMIN_USER} ${PULSAR_ADMIN_PASSWORD} -echo "✅ 认证配置完成 - 用户名: \${PULSAR_ADMIN_USER}, 密码: \${PULSAR_ADMIN_PASSWORD}" +echo "✅ 认证配置完成 - 用户名: ${PULSAR_ADMIN_USER}, 密码: ${PULSAR_ADMIN_PASSWORD}" # 创建数据目录 echo "📁 创建数据目录..." @@ -100,20 +125,20 @@ 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配置检查通过" +echo "⚙️ 检查MySQL配置..." +if [ ! -d "./mysql/init" ]; then + echo "❌ MySQL初始化脚本目录不存在,请检查" + exit 1 +fi -sleep 15 +if [ ! -f "./mysql/init/init-db.sql" ]; then + echo "❌ MySQL初始化脚本不存在,请检查" + exit 1 +fi + +echo "✅ MySQL配置检查通过" + +sleep 10 # 启动主服务 echo "第六步:🚀 启动 部署主脚本 ..." @@ -146,7 +171,8 @@ sleep 10 # 设置IoTDB密码 echo "第七步:🔐 设置IoTDB root用户密码..." -docker exec -i iotdb-standalone /bin/bash << 'EOF' +echo "ALTER USER root SET PASSWORD '${IOTDB_ROOT_PASSWORD}';" +docker exec -i iotdb-standalone /bin/bash << EOF # 等待IoTDB完全启动 echo "等待IoTDB服务就绪..." sleep 10 @@ -154,19 +180,19 @@ sleep 10 echo "IoTDB服务已就绪,开始设置密码和创建数据库..." # 使用非交互式方式创建表模型数据库 -echo "CREATE DATABASE jisheiotdata;" | ./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, MessageType STRING FIELD, IssueRawMessage STRING FIELD, IssuePayload STRING FIELD, ResponseRawMessage STRING FIELD, ResponsePayload STRING FIELD, TelemetrySource INT32 FIELD, IoTPlatform 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 +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_ROOT_PASSWORD}" | ./start-cli.sh -h iotdb-standalone echo "IoTDB密码设置完成" EOF -echo "✅ IoTDB密码设置完成 - 用户名: root, 密码: \${IOTDB_ROOT_PASSWORD}" +echo "✅ IoTDB密码设置完成 - 用户名: root, 密码: ${IOTDB_ROOT_PASSWORD}" echo "" echo "🎉 Pulsar 基本认证集群启动完成!" diff --git a/JiShe.IoT.Admin.sln b/JiShe.IoT.Admin.sln index 33c3407..648327a 100644 --- a/JiShe.IoT.Admin.sln +++ b/JiShe.IoT.Admin.sln @@ -278,7 +278,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DockerComposeShells", "Dock DockerComposeShells\docker-compose-iotdb-standalone.yml = DockerComposeShells\docker-compose-iotdb-standalone.yml DockerComposeShells\docker-compose.yml = DockerComposeShells\docker-compose.yml DockerComposeShells\iotdb\init\init-iot-db.sql = DockerComposeShells\iotdb\init\init-iot-db.sql - DockerComposeShells\mysql\init\init-mysql-db.sql = DockerComposeShells\mysql\init\init-mysql-db.sql + DockerComposeShells\mysql\init\init-db.sql = DockerComposeShells\mysql\init\init-db.sql DockerComposeShells\redis\conf\redis.conf = DockerComposeShells\redis\conf\redis.conf DockerComposeShells\start-pulsar.sh = DockerComposeShells\start-pulsar.sh EndProjectSection