#!/usr/bin/env bash # 一键部署脚本:打包本地 workspace(排除模型与 .git),上传到远端并重启服务 set -euo pipefail SERVER="${SERVER:-120.55.190.8}" USER="${USER:-root}" # 强烈建议使用 SSH Key;如需密码方式,请通过环境变量传入: # export DEPLOY_PASS='your_password' PASS="${DEPLOY_PASS:-}" REMOTE_DIR="${REMOTE_DIR:-/root/workspace}" # 通过环境变量注入 Moonshot Key(不要写死在脚本里): # export MOONSHOT_API_KEY='sk-...' MOONSHOT_KEY="${MOONSHOT_API_KEY:-}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ARCHIVE="/tmp/nianjie_deploy_$(date +%Y%m%d%H%M%S).tar.gz" if ! command -v sshpass >/dev/null 2>&1; then echo "[ERROR] 需要安装 sshpass 以使用密码方式非交互上传/执行。" >&2 exit 1 fi if [ -z "${PASS}" ]; then echo "[ERROR] 未设置 DEPLOY_PASS(远端 SSH 密码)。" >&2 exit 1 fi if [ -z "${MOONSHOT_KEY}" ]; then echo "[WARN] 未设置 MOONSHOT_API_KEY:云端 AI 模式可能无法调用外部模型。" >&2 fi echo "[1/5] 打包本地 workspace -> ${ARCHIVE}" # macOS: 避免打包扩展属性导致远端 tar 警告 COPYFILE_DISABLE=1 tar -czf "${ARCHIVE}" \ --exclude='.git' \ --exclude='*/.git*' \ --exclude='minirag/minirag/cache' \ -C "${SCRIPT_DIR}" . echo "[2/5] 上传压缩包到 ${SERVER}:/root/" sshpass -p "${PASS}" scp -o StrictHostKeyChecking=no "${ARCHIVE}" "${USER}@${SERVER}:/root/" echo "[3/5] 远端处理(停服、清理、解压、重启)" sshpass -p "${PASS}" ssh -o StrictHostKeyChecking=no "${USER}@${SERVER}" MOONSHOT_KEY="${MOONSHOT_KEY}" bash -s <<'EOF' set -euo pipefail ARCHIVE="$(ls -t /root/nianjie_deploy_*.tar.gz | head -n1)" REMOTE_DIR="/root/workspace" MODEL_PATH="${REMOTE_DIR}/minirag/minirag/models" BACKUP_DIR="/root/model_backup_$(date +%s)" echo " - 查杀 8081 端口进程" if command -v lsof >/dev/null 2>&1; then if pids=$(lsof -t -i:8081 || true); then [ -n "$pids" ] && kill -9 $pids || true fi elif command -v fuser >/dev/null 2>&1; then fuser -k 8081/tcp || true fi echo " - 备份旧模型(如存在)" if [ -d "$MODEL_PATH" ]; then mkdir -p "$BACKUP_DIR" mv "$MODEL_PATH" "$BACKUP_DIR/" echo " 备份到 $BACKUP_DIR/models" fi echo " - 清空远端 workspace 目录" mkdir -p "$REMOTE_DIR" rm -rf "$REMOTE_DIR"/* echo " - 解压最新包到 workspace" tar -xzf "$ARCHIVE" -C "$REMOTE_DIR" echo " - 恢复模型" if [ -d "$BACKUP_DIR/models" ]; then mkdir -p "$REMOTE_DIR/minirag/minirag" rm -rf "$REMOTE_DIR/minirag/minirag/models" mv "$BACKUP_DIR/models" "$REMOTE_DIR/minirag/minirag/" || true echo " 模型已恢复" fi echo " - 后台重启服务(注入 MOONSHOT_API_KEY)" cd "$REMOTE_DIR/dialog" export MOONSHOT_API_KEY="${MOONSHOT_KEY:-}" nohup python3 app.py > app.log 2>&1 & echo " 启动完成,pid: $!" EOF echo "[4/5] 部署完成,包保留在 ${ARCHIVE}(本机)与 /root/(远端)" echo "[5/5] 结束"