Files
aiagent/install.sh
renjianbo beff3fac8d fix: delete agent 500 error + dynamic personality + deployment guide
- Fix delete agent 500: clean up FK records (agent_llm_logs, permissions,
  schedules, executions, team_members) and unbind goals/tasks before delete
- Remove hardcoded personality templates in Android, replace with dynamic
  system prompt generation from name + description
- Set promptSectionsEnabled=false to bypass PromptComposer for personality
- Add Tencent Cloud Linux deployment guide (Docker Compose)
- Accumulated backend service updates, frontend UI fixes, Android app changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-29 01:17:21 +08:00

205 lines
7.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# ═══════════════════════════════════════════════════════════════════════════════
# 天工智能体平台 — 一键安装脚本
# 用法: bash install.sh
# ═══════════════════════════════════════════════════════════════════════════════
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
banner() {
echo ""
echo -e "${CYAN}╔══════════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ 天工智能体平台 — 一键安装向导 ║${NC}"
echo -e "${CYAN}╚══════════════════════════════════════════════╝${NC}"
echo ""
}
info() { echo -e "${GREEN}[✓]${NC} $*"; }
warn() { echo -e "${YELLOW}[!]${NC} $*"; }
error() { echo -e "${RED}[✗]${NC} $*"; exit 1; }
# ─── 1. 前置检查 ─────────────────────────────────────────────────────────────
banner
echo "正在检查系统环境..."
# Docker
if ! command -v docker &>/dev/null; then
error "未找到 Docker。请先安装 Docker: https://docs.docker.com/get-docker/"
fi
info "Docker 已安装: $(docker --version)"
# Docker Compose (v2)
if docker compose version &>/dev/null; then
COMPOSE="docker compose"
elif command -v docker-compose &>/dev/null; then
COMPOSE="docker-compose"
else
error "未找到 Docker Compose。请安装 Docker Compose v2"
fi
info "Docker Compose 可用: $COMPOSE"
# 磁盘空间
avail_gb=$(df -BG . | tail -1 | awk '{print $4}' | sed 's/G//')
if [ "${avail_gb:-0}" -lt 5 ]; then
warn "磁盘可用空间不足 5GB ($avail_gb GB),建议至少保留 10GB"
else
info "磁盘可用空间: ${avail_gb} GB"
fi
# ─── 2. 环境配置 ─────────────────────────────────────────────────────────────
echo ""
echo -e "${CYAN}── 配置环境变量 ──${NC}"
echo ""
ENV_FILE="./backend/.env"
COMPOSE_FILE="./docker-compose.prod.yml"
# 检查是否已有 .env
if [ -f "$ENV_FILE" ]; then
echo -e "${YELLOW}检测到已有 .env 文件: $ENV_FILE${NC}"
read -r -p "是否覆盖配置?(y/N): " OVERWRITE
if [[ ! "$OVERWRITE" =~ ^[Yy] ]]; then
info "保留现有 .env 配置"
else
NEED_CONFIG=true
fi
else
NEED_CONFIG=true
fi
if [ "${NEED_CONFIG:-false}" = true ]; then
# 从模板复制
if [ -f "./backend/.env.example" ]; then
cp "./backend/.env.example" "$ENV_FILE"
info "已从 .env.example 创建 .env"
else
touch "$ENV_FILE"
fi
echo ""
echo "请输入以下配置(直接回车使用默认值):"
# MySQL 密码
read -r -p "MySQL root 密码 [change-me]: " MYSQL_PASS
MYSQL_PASS=${MYSQL_PASS:-change-me}
# JWT 密钥
read -r -p "JWT 密钥(留空自动生成): " JWT_KEY
JWT_KEY=${JWT_KEY:-$(openssl rand -hex 32 2>/dev/null || echo "prod-jwt-$(date +%s)")}
# 应用密钥
read -r -p "应用 SECRET_KEY留空自动生成: " APP_KEY
APP_KEY=${APP_KEY:-$(openssl rand -hex 32 2>/dev/null || echo "prod-secret-$(date +%s)")}
# AI API Key
read -r -p "DeepSeek API Key: " DS_KEY
read -r -p "OpenAI API Key可选: " OAI_KEY
# 外部URL
read -r -p "外部访问地址 [http://localhost]: " EXT_URL
EXT_URL=${EXT_URL:-http://localhost}
# 写入 .env
cat > "$ENV_FILE" << EOF
APP_NAME=天工智能体平台
APP_VERSION=1.0.0
DEBUG=False
SECRET_KEY=${APP_KEY}
DATABASE_URL=mysql+pymysql://root:${MYSQL_PASS}@mysql:3306/agent_db?charset=utf8mb4
REDIS_URL=redis://redis:6379/0
JWT_SECRET_KEY=${JWT_KEY}
JWT_ALGORITHM=HS256
JWT_ACCESS_TOKEN_EXPIRE_MINUTES=30
CORS_ORIGINS=http://localhost:8038,http://localhost:3000
EXTERNAL_URL=${EXT_URL}
DEEPSEEK_API_KEY=${DS_KEY}
OPENAI_API_KEY=${OAI_KEY}
HSTS_ENABLED=True
WORKFLOW_MAX_STEPS_PER_RUN=2000
WORKFLOW_MAX_LLM_INVOCATIONS_PER_RUN=200
WORKFLOW_MAX_TOOL_CALLS_PER_RUN=500
MEMORY_PERSIST_DB_ENABLED=True
EOF
info "配置已写入 $ENV_FILE"
fi
# ─── 3. 构建与启动 ───────────────────────────────────────────────────────────
echo ""
echo -e "${CYAN}── 构建镜像并启动服务 ──${NC}"
echo ""
# 导出环境变量供 docker compose 使用
export MYSQL_ROOT_PASSWORD
export JWT_SECRET_KEY
export SECRET_KEY
export OPENAI_API_KEY
export DEEPSEEK_API_KEY
export EXTERNAL_URL
info "正在构建镜像..."
$COMPOSE -f "$COMPOSE_FILE" build --pull
echo ""
info "正在启动服务..."
$COMPOSE -f "$COMPOSE_FILE" up -d
echo ""
info "等待服务就绪..."
sleep 5
# ─── 4. 验证 ─────────────────────────────────────────────────────────────────
echo ""
echo -e "${CYAN}── 验证服务状态 ──${NC}"
echo ""
$COMPOSE -f "$COMPOSE_FILE" ps
echo ""
# 健康检查
BACKEND_OK=false
for i in $(seq 1 30); do
if curl -sf http://localhost:8037/docs >/dev/null 2>&1; then
BACKEND_OK=true
break
fi
sleep 2
done
if $BACKEND_OK; then
info "后端服务健康 (http://localhost:8037/docs)"
else
warn "后端服务可能尚未就绪,请稍后检查: docker compose -f docker-compose.prod.yml logs backend"
fi
# ─── 5. 完成 ─────────────────────────────────────────────────────────────────
echo ""
echo -e "${GREEN}╔══════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ 安装完成! ║${NC}"
echo -e "${GREEN}╠══════════════════════════════════════════════╣${NC}"
echo -e "${GREEN}║ 前端: http://localhost:8038 ║${NC}"
echo -e "${GREEN}║ 后端: http://localhost:8037/docs ║${NC}"
echo -e "${GREEN}║ 默认账号: admin / 123456 ║${NC}"
echo -e "${GREEN}╠══════════════════════════════════════════════╣${NC}"
echo -e "${GREEN}║ 管理命令: ║${NC}"
echo -e "${GREEN}║ 查看日志: docker compose -f docker-compose.prod.yml logs -f${NC}"
echo -e "${GREEN}║ 重启服务: docker compose -f docker-compose.prod.yml restart${NC}"
echo -e "${GREEN}║ 停止服务: docker compose -f docker-compose.prod.yml down${NC}"
echo -e "${GREEN}║ 升级: bash upgrade.sh ${NC}"
echo -e "${GREEN}║ 卸载: bash uninstall.sh ${NC}"
echo -e "${GREEN}╚══════════════════════════════════════════════╝${NC}"
echo ""