#!/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 ""