deploy.sh 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #!/bin/bash
  2. # 一键部署到新主机
  3. # 用法: ./deploy/deploy.sh [-i IP] [-u USER] [-p PASS] [-c] [-j N]
  4. # -i 目标机 IP (默认 192.168.1.243)
  5. # -u SSH 用户 (默认 root)
  6. # -p SSH 密码 (默认 123456)
  7. # -c 部署前先编译
  8. # -j 编译并行数 (默认 nproc)
  9. # -n 仅打包不部署 (dry-run)
  10. set -e
  11. DIR="$(cd "$(dirname "$0")/.." && pwd)"
  12. DEPLOY_DIR="$(cd "$(dirname "$0")" && pwd)"
  13. TARGET_IP="192.168.1.243"
  14. TARGET_USER="root"
  15. TARGET_PASS="123456"
  16. DO_BUILD=0
  17. DRY_RUN=0
  18. JOBS=${JOBS:-$(nproc)}
  19. usage() {
  20. cat << 'EOF'
  21. Usage: ./deploy/deploy.sh [options]
  22. Options:
  23. -i IP 目标机 IP (默认 192.168.1.243)
  24. -u USER SSH 用户 (默认 root)
  25. -p PASS SSH 密码 (默认 123456)
  26. -c 部署前先编译
  27. -j N 编译并行数 (默认 nproc)
  28. -n 仅打包不部署 (dry-run)
  29. -h 显示帮助
  30. EOF
  31. }
  32. while [ $# -gt 0 ]; do
  33. case "$1" in
  34. -i) TARGET_IP="$2"; shift ;;
  35. -u) TARGET_USER="$2"; shift ;;
  36. -p) TARGET_PASS="$2"; shift ;;
  37. -c) DO_BUILD=1 ;;
  38. -j) JOBS="$2"; shift ;;
  39. -n) DRY_RUN=1 ;;
  40. -h|--help) usage; exit 0 ;;
  41. *) echo "Unknown option: $1"; usage; exit 1 ;;
  42. esac
  43. shift
  44. done
  45. echo "=========================================="
  46. echo " 目标: $TARGET_USER@$TARGET_IP"
  47. echo "=========================================="
  48. echo ""
  49. # ---------- 检查 sshpass ----------
  50. if ! command -v sshpass >/dev/null 2>&1; then
  51. echo "[deploy] 安装 sshpass ..."
  52. if command -v apt-get >/dev/null 2>&1; then
  53. apt-get install -y -qq sshpass
  54. elif command -v yum >/dev/null 2>&1; then
  55. yum install -y sshpass
  56. elif command -v pacman >/dev/null 2>&1; then
  57. pacman -S --noconfirm sshpass
  58. else
  59. echo "ERROR: 无法自动安装 sshpass,请手动安装" >&2
  60. exit 1
  61. fi
  62. fi
  63. # ---------- 测试连通性 ----------
  64. echo "[deploy] 测试连通性: $TARGET_IP ..."
  65. if ! sshpass -p "$TARGET_PASS" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 \
  66. "$TARGET_USER@$TARGET_IP" "echo ok" >/dev/null 2>&1; then
  67. echo "ERROR: 无法连接 $TARGET_USER@$TARGET_IP" >&2
  68. echo " 检查: IP 是否正确、网络是否通、SSH 是否开启、密码是否正确" >&2
  69. exit 1
  70. fi
  71. echo "[deploy] 连接成功"
  72. echo ""
  73. # ---------- 编译 ----------
  74. if [ "$DO_BUILD" -eq 1 ]; then
  75. echo "[deploy] 编译中 (jobs=$JOBS) ..."
  76. "$DIR/build.sh" -j "$JOBS"
  77. echo ""
  78. fi
  79. # ---------- 打包 ----------
  80. echo "[deploy] 打包部署文件 ..."
  81. "$DEPLOY_DIR/pack.sh"
  82. TARBALL=$(ls -t "$DEPLOY_DIR"/*.tar.gz 2>/dev/null | head -1)
  83. if [ -z "$TARBALL" ]; then
  84. echo "ERROR: 打包失败,未找到 tarball" >&2
  85. exit 1
  86. fi
  87. TARBALL_NAME=$(basename "$TARBALL")
  88. echo "[deploy] 打包完成: $TARBALL_NAME"
  89. echo ""
  90. if [ "$DRY_RUN" -eq 1 ]; then
  91. echo "[deploy] dry-run 模式,跳过部署"
  92. echo " 手动部署: scp $TARBALL $TARGET_USER@$TARGET_IP:/tmp/"
  93. exit 0
  94. fi
  95. # ---------- 传输 ----------
  96. echo "[deploy] 传输到 $TARGET_IP:/tmp/ ..."
  97. sshpass -p "$TARGET_PASS" scp -o StrictHostKeyChecking=no \
  98. "$TARBALL" "$TARGET_USER@$TARGET_IP:/tmp/$TARBALL_NAME"
  99. echo "[deploy] 传输完成"
  100. echo ""
  101. # ---------- 远程安装 ----------
  102. echo "[deploy] 远程安装 ..."
  103. sshpass -p "$TARGET_PASS" ssh -o StrictHostKeyChecking=no \
  104. "$TARGET_USER@$TARGET_IP" << REMOTE
  105. set -e
  106. cd /tmp
  107. tar xzf $TARBALL_NAME
  108. cd rtsp_multi_view_deploy
  109. chmod +x install.sh
  110. ./install.sh
  111. REMOTE
  112. echo ""
  113. echo "=========================================="
  114. echo " 部署完成!"
  115. echo "=========================================="
  116. echo ""
  117. echo " 验证:"
  118. echo " ssh $TARGET_USER@$TARGET_IP 'systemctl status rtsp_multi_view'"
  119. echo " ssh $TARGET_USER@$TARGET_IP 'systemctl status auto-reboot'"
  120. echo ""