数据解析模块
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #!/bin/bash
  2. # IoT Platform 容器化一键部署脚本 (Podman)
  3. # 用法:
  4. # ./deploy.sh --build # 本地构建后部署
  5. # ./deploy.sh --jar path/to/jar # 使用指定 jar 部署
  6. # ./deploy.sh --build --jar path # 构建并使用指定 jar(覆盖)
  7. #
  8. # 环境变量:
  9. # SERVER_HOST 默认: 47.104.204.180
  10. # SERVER_USER 默认: root
  11. # REMOTE_DIR 默认: /opt/iot-platform
  12. set -e
  13. # 配置
  14. SERVER_HOST="${SERVER_HOST:-47.104.204.180}"
  15. SERVER_USER="${SERVER_USER:-root}"
  16. REMOTE_DIR="${REMOTE_DIR:-/opt/iot-platform}"
  17. APP_NAME="iot-platform"
  18. LOCAL_JAR=""
  19. DO_BUILD=false
  20. NO_ROLLBACK=false
  21. # 颜色
  22. RED='\033[0;31m'
  23. GREEN='\033[0;32m'
  24. YELLOW='\033[1;33m'
  25. NC='\033[0m'
  26. # 解析参数
  27. while [[ $# -gt 0 ]]; do
  28. case $1 in
  29. --build)
  30. DO_BUILD=true
  31. shift
  32. ;;
  33. --no-rollback)
  34. NO_ROLLBACK=true
  35. shift
  36. ;;
  37. --jar)
  38. LOCAL_JAR="$2"
  39. shift 2
  40. ;;
  41. --help|-h)
  42. echo "用法: ./deploy.sh [--build] [--no-rollback] [--jar <path>]"
  43. echo " --build 本地执行 mvn clean package"
  44. echo " --no-rollback 健康检查失败时不自动回滚,保留新版本用于排查"
  45. echo " --jar 指定要部署的 jar 文件路径"
  46. exit 0
  47. ;;
  48. *)
  49. echo "未知参数: $1"
  50. exit 1
  51. ;;
  52. esac
  53. done
  54. # 确定 jar 路径
  55. if [ "$DO_BUILD" = true ]; then
  56. echo -e "${YELLOW}[deploy] 开始本地构建...${NC}"
  57. cd "$(dirname "$0")/.."
  58. mvn clean package -pl iot-platform -am -Dmaven.test.skip=true
  59. LOCAL_JAR="iot-platform/target/iot-platform.jar"
  60. echo -e "${GREEN}[deploy] 构建完成: ${LOCAL_JAR}${NC}"
  61. fi
  62. if [ -z "$LOCAL_JAR" ]; then
  63. # 默认使用本地 target 下的 jar
  64. cd "$(dirname "$0")/.."
  65. LOCAL_JAR="iot-platform/target/iot-platform.jar"
  66. fi
  67. if [ ! -f "$LOCAL_JAR" ]; then
  68. echo -e "${RED}[deploy] 错误: 找不到 jar 文件: ${LOCAL_JAR}${NC}"
  69. exit 1
  70. fi
  71. JAR_NAME=$(basename "$LOCAL_JAR")
  72. TIMESTAMP=$(date +%Y%m%d-%H%M%S)
  73. BACKUP_NAME="${APP_NAME}-${TIMESTAMP}.jar"
  74. echo "========================================"
  75. echo "IoT Platform 部署"
  76. echo "========================================"
  77. echo "目标服务器: ${SERVER_USER}@${SERVER_HOST}"
  78. echo "远程目录: ${REMOTE_DIR}"
  79. echo "本地 JAR: ${LOCAL_JAR}"
  80. echo "========================================"
  81. # 步骤 1: 上传 JAR 到临时目录
  82. echo -e "${YELLOW}[1/6] 上传 JAR 到服务器...${NC}"
  83. ssh "${SERVER_USER}@${SERVER_HOST}" "mkdir -p ${REMOTE_DIR}/tmp ${REMOTE_DIR}/backup"
  84. scp "${LOCAL_JAR}" "${SERVER_USER}@${SERVER_HOST}:${REMOTE_DIR}/tmp/${JAR_NAME}"
  85. echo -e "${GREEN}[1/6] 上传完成${NC}"
  86. # 步骤 2: 备份当前版本
  87. echo -e "${YELLOW}[2/6] 备份当前版本...${NC}"
  88. ssh "${SERVER_USER}@${SERVER_HOST}" "
  89. if [ -f ${REMOTE_DIR}/${APP_NAME}.jar ]; then
  90. cp -a ${REMOTE_DIR}/${APP_NAME}.jar ${REMOTE_DIR}/backup/${BACKUP_NAME}
  91. echo ' 已备份: ${BACKUP_NAME}'
  92. ls -lh ${REMOTE_DIR}/backup/ | tail -5
  93. else
  94. echo ' 无现有版本,跳过备份'
  95. fi
  96. "
  97. echo -e "${GREEN}[2/6] 备份完成${NC}"
  98. # 步骤 3: 停止旧容器
  99. echo -e "${YELLOW}[3/6] 停止旧容器...${NC}"
  100. ssh "${SERVER_USER}@${SERVER_HOST}" "podman stop ${APP_NAME} >/dev/null 2>&1 && podman rm ${APP_NAME} >/dev/null 2>&1 || true"
  101. sleep 2
  102. echo -e "${GREEN}[3/6] 旧容器已清理${NC}"
  103. # 步骤 4: 替换 JAR 并构建镜像
  104. echo -e "${YELLOW}[4/6] 替换 JAR 并构建镜像...${NC}"
  105. ssh "${SERVER_USER}@${SERVER_HOST}" "
  106. cp ${REMOTE_DIR}/tmp/${JAR_NAME} ${REMOTE_DIR}/${APP_NAME}.jar
  107. chmod 644 ${REMOTE_DIR}/${APP_NAME}.jar
  108. rm -f ${REMOTE_DIR}/tmp/${JAR_NAME}
  109. echo ' 新 JAR:'
  110. ls -lh ${REMOTE_DIR}/${APP_NAME}.jar
  111. echo ' 构建镜像...'
  112. cd ${REMOTE_DIR} && podman build -t ${APP_NAME}:latest . >/dev/null 2>&1
  113. echo ' 镜像构建完成'
  114. podman images | grep ${APP_NAME}
  115. "
  116. echo -e "${GREEN}[4/6] 镜像构建完成${NC}"
  117. # 步骤 5: 启动容器
  118. echo -e "${YELLOW}[5/6] 启动容器...${NC}"
  119. ssh "${SERVER_USER}@${SERVER_HOST}" "
  120. podman run -d \
  121. --name ${APP_NAME} \
  122. --network host \
  123. --restart unless-stopped \
  124. -v ${REMOTE_DIR}/logs:/opt/iot-platform/logs \
  125. localhost/${APP_NAME}:latest >/dev/null 2>&1
  126. "
  127. sleep 5
  128. echo -e "${GREEN}[5/6] 容器已启动${NC}"
  129. # 步骤 6: 健康检查
  130. echo -e "${YELLOW}[6/6] 健康检查...${NC}"
  131. if ssh "${SERVER_USER}@${SERVER_HOST}" "bash ${REMOTE_DIR}/bin/health-check.sh localhost 8887 60"; then
  132. echo -e "${GREEN}[6/6] 健康检查通过,部署成功!${NC}"
  133. echo ""
  134. echo "========================================"
  135. echo "部署摘要"
  136. echo "========================================"
  137. echo "时间: ${TIMESTAMP}"
  138. echo "JAR: ${LOCAL_JAR}"
  139. echo "备份: ${BACKUP_NAME}"
  140. echo "状态: 成功"
  141. echo ""
  142. echo "容器状态:"
  143. ssh "${SERVER_USER}@${SERVER_HOST}" "podman ps | grep ${APP_NAME}"
  144. echo ""
  145. echo "查看日志:"
  146. echo " ssh ${SERVER_USER}@${SERVER_HOST} 'podman logs -f ${APP_NAME}'"
  147. exit 0
  148. else
  149. echo -e "${RED}[6/6] 健康检查失败!${NC}"
  150. if [ "$NO_ROLLBACK" = true ]; then
  151. echo -e "${YELLOW}[no-rollback] 已启用不回滚模式,保留新版本用于排查${NC}"
  152. echo -e "${YELLOW}排查命令:${NC}"
  153. echo " ssh ${SERVER_USER}@${SERVER_HOST} 'podman logs -f ${APP_NAME}'"
  154. echo " ssh ${SERVER_USER}@${SERVER_HOST} 'podman ps | grep ${APP_NAME}'"
  155. exit 1
  156. fi
  157. echo -e "${YELLOW}[rollback] 执行回滚...${NC}"
  158. ssh "${SERVER_USER}@${SERVER_HOST}" "podman stop ${APP_NAME} >/dev/null 2>&1 && podman rm ${APP_NAME} >/dev/null 2>&1 || true"
  159. if ssh "${SERVER_USER}@${SERVER_HOST}" "test -f ${REMOTE_DIR}/backup/${BACKUP_NAME}"; then
  160. echo -e "${YELLOW}[rollback] 恢复旧版本...${NC}"
  161. ssh "${SERVER_USER}@${SERVER_HOST}" "
  162. cp ${REMOTE_DIR}/backup/${BACKUP_NAME} ${REMOTE_DIR}/${APP_NAME}.jar
  163. cd ${REMOTE_DIR} && podman build -t ${APP_NAME}:latest . >/dev/null 2>&1
  164. podman run -d \
  165. --name ${APP_NAME} \
  166. --network host \
  167. --restart unless-stopped \
  168. -v ${REMOTE_DIR}/logs:/opt/iot-platform/logs \
  169. localhost/${APP_NAME}:latest >/dev/null 2>&1
  170. "
  171. sleep 5
  172. if ssh "${SERVER_USER}@${SERVER_HOST}" "bash ${REMOTE_DIR}/bin/health-check.sh localhost 8887 60"; then
  173. echo -e "${GREEN}[rollback] 回滚成功,旧版本已恢复${NC}"
  174. else
  175. echo -e "${RED}[rollback] 回滚后健康检查仍失败,请手动排查!${NC}"
  176. fi
  177. else
  178. echo -e "${RED}[rollback] 无备份可回滚,请手动修复!${NC}"
  179. fi
  180. exit 1
  181. fi