| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #!/bin/bash
- # 一键部署到新主机
- # 用法: ./deploy/deploy.sh [-i IP] [-u USER] [-p PASS] [-c] [-j N]
- # -i 目标机 IP (默认 192.168.1.243)
- # -u SSH 用户 (默认 root)
- # -p SSH 密码 (默认 123456)
- # -c 部署前先编译
- # -j 编译并行数 (默认 nproc)
- # -n 仅打包不部署 (dry-run)
- set -e
- DIR="$(cd "$(dirname "$0")/.." && pwd)"
- DEPLOY_DIR="$(cd "$(dirname "$0")" && pwd)"
- TARGET_IP="192.168.1.243"
- TARGET_USER="root"
- TARGET_PASS="123456"
- DO_BUILD=0
- DRY_RUN=0
- JOBS=${JOBS:-$(nproc)}
- usage() {
- cat << 'EOF'
- Usage: ./deploy/deploy.sh [options]
- Options:
- -i IP 目标机 IP (默认 192.168.1.243)
- -u USER SSH 用户 (默认 root)
- -p PASS SSH 密码 (默认 123456)
- -c 部署前先编译
- -j N 编译并行数 (默认 nproc)
- -n 仅打包不部署 (dry-run)
- -h 显示帮助
- EOF
- }
- while [ $# -gt 0 ]; do
- case "$1" in
- -i) TARGET_IP="$2"; shift ;;
- -u) TARGET_USER="$2"; shift ;;
- -p) TARGET_PASS="$2"; shift ;;
- -c) DO_BUILD=1 ;;
- -j) JOBS="$2"; shift ;;
- -n) DRY_RUN=1 ;;
- -h|--help) usage; exit 0 ;;
- *) echo "Unknown option: $1"; usage; exit 1 ;;
- esac
- shift
- done
- echo "=========================================="
- echo " 目标: $TARGET_USER@$TARGET_IP"
- echo "=========================================="
- echo ""
- # ---------- 检查 sshpass ----------
- if ! command -v sshpass >/dev/null 2>&1; then
- echo "[deploy] 安装 sshpass ..."
- if command -v apt-get >/dev/null 2>&1; then
- apt-get install -y -qq sshpass
- elif command -v yum >/dev/null 2>&1; then
- yum install -y sshpass
- elif command -v pacman >/dev/null 2>&1; then
- pacman -S --noconfirm sshpass
- else
- echo "ERROR: 无法自动安装 sshpass,请手动安装" >&2
- exit 1
- fi
- fi
- # ---------- 测试连通性 ----------
- echo "[deploy] 测试连通性: $TARGET_IP ..."
- if ! sshpass -p "$TARGET_PASS" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 \
- "$TARGET_USER@$TARGET_IP" "echo ok" >/dev/null 2>&1; then
- echo "ERROR: 无法连接 $TARGET_USER@$TARGET_IP" >&2
- echo " 检查: IP 是否正确、网络是否通、SSH 是否开启、密码是否正确" >&2
- exit 1
- fi
- echo "[deploy] 连接成功"
- echo ""
- # ---------- 编译 ----------
- if [ "$DO_BUILD" -eq 1 ]; then
- echo "[deploy] 编译中 (jobs=$JOBS) ..."
- "$DIR/build.sh" -j "$JOBS"
- echo ""
- fi
- # ---------- 打包 ----------
- echo "[deploy] 打包部署文件 ..."
- "$DEPLOY_DIR/pack.sh"
- TARBALL=$(ls -t "$DEPLOY_DIR"/*.tar.gz 2>/dev/null | head -1)
- if [ -z "$TARBALL" ]; then
- echo "ERROR: 打包失败,未找到 tarball" >&2
- exit 1
- fi
- TARBALL_NAME=$(basename "$TARBALL")
- echo "[deploy] 打包完成: $TARBALL_NAME"
- echo ""
- if [ "$DRY_RUN" -eq 1 ]; then
- echo "[deploy] dry-run 模式,跳过部署"
- echo " 手动部署: scp $TARBALL $TARGET_USER@$TARGET_IP:/tmp/"
- exit 0
- fi
- # ---------- 传输 ----------
- echo "[deploy] 传输到 $TARGET_IP:/tmp/ ..."
- sshpass -p "$TARGET_PASS" scp -o StrictHostKeyChecking=no \
- "$TARBALL" "$TARGET_USER@$TARGET_IP:/tmp/$TARBALL_NAME"
- echo "[deploy] 传输完成"
- echo ""
- # ---------- 远程安装 ----------
- echo "[deploy] 远程安装 ..."
- sshpass -p "$TARGET_PASS" ssh -o StrictHostKeyChecking=no \
- "$TARGET_USER@$TARGET_IP" << REMOTE
- set -e
- cd /tmp
- tar xzf $TARBALL_NAME
- cd rtsp_multi_view_deploy
- chmod +x install.sh
- ./install.sh
- REMOTE
- echo ""
- echo "=========================================="
- echo " 部署完成!"
- echo "=========================================="
- echo ""
- echo " 验证:"
- echo " ssh $TARGET_USER@$TARGET_IP 'systemctl status rtsp_multi_view'"
- echo " ssh $TARGET_USER@$TARGET_IP 'systemctl status auto-reboot'"
- echo ""
|