JiShe.IOT.Admin/DockerComposeShells/start-service-sub.sh

142 lines
4.2 KiB
Bash
Raw Normal View History

2025-11-20 17:14:58 +08:00
#!/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 ""