#!/bin/bash # ========================= # 服务订阅模式一键启动脚本 # ========================= set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$ROOT_DIR" # 1. 校验 .env if [ ! -f "./.env" ]; then echo "❌ 配置文件 .env 不存在,请先创建(可复制 .env.example)。" exit 1 fi echo "📁 检查 .env 并规范换行符..." 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 # 2. 加载环境变量 set -a . ./.env set +a # 3. 校验关键变量 required_vars=( IOTDB_PORT IOTDB_ROOT_PASSWORD REDIS_PORT MYSQL_PORT MYSQL_ROOT_PASSWORD ADMIN_API_PORT ADMIN_WEB_PORT ) missing_vars=() for var in "${required_vars[@]}"; do if [ -z "${!var:-}" ]; then missing_vars+=("$var") fi done if [ ${#missing_vars[@]} -ne 0 ]; then echo "❌ 以下环境变量未设置: ${missing_vars[*]}" echo "💡 请在 .env 中补充这些变量后重试。" exit 1 fi # 4. 登录镜像仓库(如已登录可忽略错误) echo "=== Docker 镜像仓库登录(若已登录可忽略提示) ===" docker login --username=yunjichaobiao --password hub.jishe.com registry.cn-qingdao.aliyuncs.com || true # 5. 创建宿主机数据目录 echo "📁 创建数据目录..." 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/iotdb || true echo "🔗 创建本地目录链接..." mkdir -p ./redis/{outdata,conf} mkdir -p ./mysql/{conf,log,data} mkdir -p ./iotdb/{conf,data,logs} mkdir -p ./adminapi/{conf,logs} # 6. 修复权限 echo "🔧 修复 MySQL / Admin 日志目录权限..." sudo chown -R 1000:1000 ./mysql/data ./mysql/log || true sudo chmod -R 755 ./mysql/data ./mysql/log sudo chmod -R 755 ./adminapi/logs || true # 7. 启动订阅模式初始化栈 echo "🚀 第一步:启动服务订阅初始化栈 (docker-compose-service_sub_init.yml)" docker compose -f docker-compose-service_sub_init.yml up -d echo "⏳ 等待 IoTDB 容器启动..." sleep 15 # 8. 拷贝 IoTDB 配置 echo "📁 拷贝 IoTDB 配置目录..." docker cp iotdb-standalone:/iotdb/conf ./iotdb # 9. 设置时间戳精度 CONFIG_FILE=./iotdb/conf/iotdb-system.properties echo "⚙️ 配置 IoTDB 时间戳精度..." if [ -f "$CONFIG_FILE" ]; then if ! grep -q "timestamp_precision=ns" "$CONFIG_FILE"; then { echo "" echo "# ms 毫秒 / us 微秒 / ns 纳秒" echo "timestamp_precision=ns" } >> "$CONFIG_FILE" echo "✅ 已追加 timestamp_precision=ns" else echo "ℹ️ timestamp_precision=ns 已存在" fi else echo "⚠️ 未找到 $CONFIG_FILE,请确认 IoTDB 配置是否拷贝成功。" fi # 10. 清理 IoTDB 数据文件(保留 conf) echo "🧹 清理 IoTDB 本地数据/日志目录..." sudo rm -rf ./iotdb/data/* ./iotdb/logs/* || true # 11. 设置 IoTDB root 密码 echo "🔐 设置 IoTDB root 密码..." docker exec -i iotdb-standalone /bin/bash << EOF echo "等待 IoTDB 完全就绪..." sleep 10 echo "ALTER USER root SET PASSWORD '${IOTDB_ROOT_PASSWORD}';" | ./start-cli.sh -h iotdb-standalone EOF echo "✅ IoTDB 密码设置完成" # 12. 关闭初始化栈 echo "🛑 停止初始化栈..." docker compose -f docker-compose-service_sub_init.yml down echo "⏳ 等待 30 秒..." sleep 30 # 13. 启动服务订阅模式正式栈 echo "🚀 最终启动:docker-compose_service_sub.yml" docker compose -f docker-compose_service_sub.yml up -d echo "" echo "🎉 服务订阅模式环境启动完成!" echo "📋 关键连接信息:" echo " IoTDB RPC: localhost:${IOTDB_PORT} (root/${IOTDB_ROOT_PASSWORD})" echo " Redis: localhost:${REDIS_PORT}" echo " MySQL: localhost:${MYSQL_PORT}" echo " Admin API: http://localhost:${ADMIN_API_PORT}" echo " Admin UI : http://localhost:${ADMIN_WEB_PORT}" echo "" echo "🔧 常用命令:" echo " 查看状态 : docker compose -f docker-compose_service_sub.yml ps" echo " 查看日志 : docker compose -f docker-compose_service_sub.yml logs -f" echo " 停止服务 : docker compose -f docker-compose_service_sub.yml down" echo ""