#!/bin/bash # 主部署脚本:打包 + 上传 + 部署 # 用法: bash deploy.sh <项目目录> <项目名> set -e SCRIPT_DIR="$(dirname "$0")" CONFIG_FILE="$HOME/.openclaw/cloud-deploy.json" PROJECT_DIR="$1" CONTACT_ID="$2" PROJECT_NAME="$3" if [ -z "$PROJECT_DIR" ] || [ -z "$CONTACT_ID" ] || [ -z "$PROJECT_NAME" ]; then echo "用法: bash deploy.sh <项目目录> <项目名>" exit 1 fi if [ ! -d "$PROJECT_DIR" ]; then echo "错误:项目目录不存在: $PROJECT_DIR" exit 1 fi # 首次使用自动初始化配置 if [ ! -f "$CONFIG_FILE" ]; then echo "📝 首次使用,自动初始化配置..." bash "$SCRIPT_DIR/init-config.sh" fi # 确保已注册 TOKEN=$(python3 -c "import json; t=json.load(open('$CONFIG_FILE')).get('token'); print(t if t else '')" 2>/dev/null) if [ -z "$TOKEN" ]; then echo "🔑 首次使用,正在注册..." bash "$SCRIPT_DIR/register.sh" "$CONTACT_ID" TOKEN=$(python3 -c "import json; print(json.load(open('$CONFIG_FILE'))['token'])" 2>/dev/null) fi API_URL=$(python3 -c "import json; print(json.load(open('$CONFIG_FILE'))['apiUrl'])") # 打包 echo "📦 打包项目..." PACK_OUTPUT=$(bash "$SCRIPT_DIR/pack.sh" "$PROJECT_DIR" "$PROJECT_NAME") TAR_FILE=$(echo "$PACK_OUTPUT" | tail -1) if [ ! -f "$TAR_FILE" ]; then echo "错误:打包失败" exit 1 fi # 部署 echo "🚀 上传并部署中..." START_TIME=$(date +%s) RESPONSE=$(curl -s --max-time 120 \ -X POST "$API_URL/deploy" \ -H "Authorization: Bearer $TOKEN" \ -F "file=@$TAR_FILE" \ -F "contactId=$CONTACT_ID" \ -F "projectName=$PROJECT_NAME" 2>/dev/null) END_TIME=$(date +%s) DURATION=$((END_TIME - START_TIME)) # 清理临时文件 rm -f "$TAR_FILE" if [ -z "$RESPONSE" ]; then echo "❌ API 无响应" exit 1 fi # 检查结果 SUCCESS=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('success', False))" 2>/dev/null) if [ "$SUCCESS" = "True" ]; then URL=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('url',''))" 2>/dev/null) DIR_NAME=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('dirName',''))" 2>/dev/null) DEPLOY_ID=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('id',''))" 2>/dev/null) echo "" echo "✅ 部署成功!" echo "" echo "🌐 访问地址:$URL" echo "📂 目录名:$DIR_NAME" echo "🆔 部署ID:$DEPLOY_ID" echo "⏱️ 部署耗时:${DURATION} 秒" else ERROR=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('error','unknown'))" 2>/dev/null) MSG=$(echo "$RESPONSE" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('message',''))" 2>/dev/null) echo "❌ 部署失败: $ERROR - $MSG" exit 1 fi