diff --git a/DockerComposeShells/docker-compose-maintenance.yml b/DockerComposeShells/docker-compose-init.yml similarity index 68% rename from DockerComposeShells/docker-compose-maintenance.yml rename to DockerComposeShells/docker-compose-init.yml index a5f830e..89597ce 100644 --- a/DockerComposeShells/docker-compose-maintenance.yml +++ b/DockerComposeShells/docker-compose-init.yml @@ -28,6 +28,19 @@ services: 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 @@ -41,6 +54,7 @@ services: 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 @@ -49,16 +63,12 @@ services: depends_on: zookeeper: condition: service_healthy + pulsar-cluster-init: + condition: service_completed_successfully networks: - pulsar-net volumes: - pulsar-bookkeeper-data:/pulsar/data/bookkeeper - healthcheck: - test: ["CMD", "bin/bookkeeper", "shell", "bookiesanity"] - interval: 30s - timeout: 10s - retries: 5 - start_period: 60s broker: image: registry.cn-qingdao.aliyuncs.com/jisheyun/pulsar:4.0.6 @@ -109,7 +119,9 @@ services: zookeeper: condition: service_healthy bookie: - condition: service_healthy + condition: service_started + pulsar-cluster-init: + condition: service_completed_successfully networks: - pulsar-net volumes: @@ -122,6 +134,40 @@ services: retries: 5 start_period: 60s + 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: + condition: service_healthy + networks: + - pulsar-net + iotdb-standalone-service: image: registry.cn-qingdao.aliyuncs.com/jisheyun/iotdb:2.0.4-standalone hostname: iotdb-standalone diff --git a/DockerComposeShells/docker-compose.yml b/DockerComposeShells/docker-compose.yml index 89597ce..9a8f04a 100644 --- a/DockerComposeShells/docker-compose.yml +++ b/DockerComposeShells/docker-compose.yml @@ -28,19 +28,6 @@ services: 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 @@ -50,11 +37,10 @@ services: resources: limits: cpus: "2" - memory: 2g + memory: 4g 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 @@ -63,12 +49,16 @@ services: depends_on: zookeeper: condition: service_healthy - pulsar-cluster-init: - condition: service_completed_successfully networks: - pulsar-net volumes: - pulsar-bookkeeper-data:/pulsar/data/bookkeeper + healthcheck: + test: ["CMD", "bin/bookkeeper", "shell", "bookiesanity"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 60s broker: image: registry.cn-qingdao.aliyuncs.com/jisheyun/pulsar:4.0.6 @@ -79,7 +69,7 @@ services: resources: limits: cpus: "2" - memory: 2g + memory: 4g command: > /bin/bash -c "bin/apply-config-from-env.py conf/broker.conf && bin/pulsar broker" @@ -119,9 +109,7 @@ services: zookeeper: condition: service_healthy bookie: - condition: service_started - pulsar-cluster-init: - condition: service_completed_successfully + condition: service_healthy networks: - pulsar-net volumes: @@ -134,40 +122,6 @@ services: retries: 5 start_period: 60s - 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: - condition: service_healthy - networks: - - pulsar-net - iotdb-standalone-service: image: registry.cn-qingdao.aliyuncs.com/jisheyun/iotdb:2.0.4-standalone hostname: iotdb-standalone @@ -209,8 +163,8 @@ services: deploy: resources: limits: - cpus: "2.0" - memory: 2g + cpus: "1.0" + memory: 1g ports: - "${REDIS_PORT}:6379" volumes: @@ -260,8 +214,7 @@ services: deploy: resources: limits: - cpus: "2.0" - memory: 4g + memory: 8g ports: - "${ADMIN_API_PORT}:10500" volumes: @@ -292,7 +245,7 @@ services: resources: limits: cpus: "1.0" - memory: 2g + memory: 500mb ports: - "${ADMIN_WEB_PORT}:8080" stdin_open: true diff --git a/DockerComposeShells/start-pulsar.sh b/DockerComposeShells/start-pulsar.sh index c7cb9f1..012d05c 100644 --- a/DockerComposeShells/start-pulsar.sh +++ b/DockerComposeShells/start-pulsar.sh @@ -143,27 +143,7 @@ sleep 10 # 启动主服务 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 +docker compose docker-compose-init.yml up -d # 等待IoTDB启动完成 echo "⏳ 等待IoTDB服务启动完成..." @@ -220,4 +200,15 @@ echo " MySQL: mysql -h ${SERVER_IP} -P ${MYSQL_PORT} -uroot -p${MYSQL_ROOT_PAS echo " IoTDB: docker exec -it iotdb-standalone ./start-cli.sh -h iotdb-standalone -u root -p Lixiao@1980" echo "" echo "🎯 等待服务启动完成..." -echo "⏳ 请等待几分钟让所有服务完全启动" +echo "⏳ 请等待3分钟让所有服务完全初始化成功" +sleep 180 +echo "🎯 服务初始化完成..." +echo "⏳ 然后等待1分钟让所有服务完全停止 docker compose docker-compose-init.yml down" + +docker compose docker-compose-init.yml down + +sleep 60 +echo "🎯 初始化服务已经完成停止......" +echo "⏳ 最后再通过 启动最终生产环境,移除初始化依赖,等待服务最终启动完成。" + + docker compose up -d diff --git a/JiShe.IoT.Admin.sln b/JiShe.IoT.Admin.sln index 648327a..e54084e 100644 --- a/JiShe.IoT.Admin.sln +++ b/JiShe.IoT.Admin.sln @@ -276,9 +276,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DockerComposeShells", "Dock 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-init.yml = DockerComposeShells\docker-compose-init.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-db.sql = DockerComposeShells\mysql\init\init-db.sql + DockerComposeShells\iotdb\init\init-iot-db.sql = DockerComposeShells\iotdb\init\init-iot-db.sql DockerComposeShells\redis\conf\redis.conf = DockerComposeShells\redis\conf\redis.conf DockerComposeShells\start-pulsar.sh = DockerComposeShells\start-pulsar.sh EndProjectSection