mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-03-31 16:20:28 +02:00
207 lines
6.0 KiB
Bash
207 lines
6.0 KiB
Bash
#!/bin/bash
|
||
|
||
set -euo pipefail
|
||
|
||
# CyberStrikeAI 一键部署启动脚本
|
||
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
cd "$ROOT_DIR"
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 打印带颜色的消息
|
||
info() { echo -e "${BLUE}ℹ️ $1${NC}"; }
|
||
success() { echo -e "${GREEN}✅ $1${NC}"; }
|
||
warning() { echo -e "${YELLOW}⚠️ $1${NC}"; }
|
||
error() { echo -e "${RED}❌ $1${NC}"; }
|
||
|
||
echo ""
|
||
echo "=========================================="
|
||
echo " CyberStrikeAI 一键部署启动脚本"
|
||
echo "=========================================="
|
||
echo ""
|
||
|
||
CONFIG_FILE="$ROOT_DIR/config.yaml"
|
||
VENV_DIR="$ROOT_DIR/venv"
|
||
REQUIREMENTS_FILE="$ROOT_DIR/requirements.txt"
|
||
BINARY_NAME="cyberstrike-ai"
|
||
|
||
# 检查配置文件
|
||
if [ ! -f "$CONFIG_FILE" ]; then
|
||
error "配置文件 config.yaml 不存在"
|
||
info "请确保在项目根目录运行此脚本"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查并安装 Python 环境
|
||
check_python() {
|
||
if ! command -v python3 >/dev/null 2>&1; then
|
||
error "未找到 python3"
|
||
echo ""
|
||
info "请先安装 Python 3.10 或更高版本:"
|
||
echo " macOS: brew install python3"
|
||
echo " Ubuntu: sudo apt-get install python3 python3-venv"
|
||
echo " CentOS: sudo yum install python3 python3-pip"
|
||
exit 1
|
||
fi
|
||
|
||
PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}')
|
||
PYTHON_MAJOR=$(echo "$PYTHON_VERSION" | cut -d. -f1)
|
||
PYTHON_MINOR=$(echo "$PYTHON_VERSION" | cut -d. -f2)
|
||
|
||
if [ "$PYTHON_MAJOR" -lt 3 ] || ([ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 10 ]); then
|
||
error "Python 版本过低: $PYTHON_VERSION (需要 3.10+)"
|
||
exit 1
|
||
fi
|
||
|
||
success "Python 环境检查通过: $PYTHON_VERSION"
|
||
}
|
||
|
||
# 检查并安装 Go 环境
|
||
check_go() {
|
||
if ! command -v go >/dev/null 2>&1; then
|
||
error "未找到 Go"
|
||
echo ""
|
||
info "请先安装 Go 1.21 或更高版本:"
|
||
echo " macOS: brew install go"
|
||
echo " Ubuntu: sudo apt-get install golang-go"
|
||
echo " CentOS: sudo yum install golang"
|
||
echo " 或访问: https://go.dev/dl/"
|
||
exit 1
|
||
fi
|
||
|
||
GO_VERSION=$(go version | awk '{print $3}' | sed 's/go//')
|
||
GO_MAJOR=$(echo "$GO_VERSION" | cut -d. -f1)
|
||
GO_MINOR=$(echo "$GO_VERSION" | cut -d. -f2)
|
||
|
||
if [ "$GO_MAJOR" -lt 1 ] || ([ "$GO_MAJOR" -eq 1 ] && [ "$GO_MINOR" -lt 21 ]); then
|
||
error "Go 版本过低: $GO_VERSION (需要 1.21+)"
|
||
exit 1
|
||
fi
|
||
|
||
success "Go 环境检查通过: $(go version)"
|
||
}
|
||
|
||
# 设置 Python 虚拟环境
|
||
setup_python_env() {
|
||
if [ ! -d "$VENV_DIR" ]; then
|
||
info "创建 Python 虚拟环境..."
|
||
python3 -m venv "$VENV_DIR"
|
||
success "虚拟环境创建完成"
|
||
else
|
||
info "Python 虚拟环境已存在"
|
||
fi
|
||
|
||
info "激活虚拟环境..."
|
||
# shellcheck disable=SC1091
|
||
source "$VENV_DIR/bin/activate"
|
||
|
||
if [ -f "$REQUIREMENTS_FILE" ]; then
|
||
info "安装/更新 Python 依赖..."
|
||
pip install --quiet --upgrade pip >/dev/null 2>&1 || true
|
||
|
||
# 尝试安装依赖,捕获错误输出
|
||
PIP_LOG=$(mktemp)
|
||
if pip install -r "$REQUIREMENTS_FILE" >"$PIP_LOG" 2>&1; then
|
||
success "Python 依赖安装完成"
|
||
else
|
||
# 检查是否是 angr 安装失败(需要 Rust)
|
||
if grep -q "angr" "$PIP_LOG" && grep -q "Rust compiler\|can't find Rust" "$PIP_LOG"; then
|
||
warning "angr 安装失败(需要 Rust 编译器)"
|
||
echo ""
|
||
info "angr 是可选依赖,主要用于二进制分析工具"
|
||
info "如果需要使用 angr,请先安装 Rust:"
|
||
echo " macOS: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh"
|
||
echo " Ubuntu: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh"
|
||
echo " 或访问: https://rustup.rs/"
|
||
echo ""
|
||
info "其他依赖已安装,可以继续使用(部分工具可能不可用)"
|
||
else
|
||
warning "部分 Python 依赖安装失败,但可以继续尝试运行"
|
||
warning "如果遇到问题,请检查错误信息并手动安装缺失的依赖"
|
||
# 显示最后几行错误信息
|
||
echo ""
|
||
info "错误详情(最后 10 行):"
|
||
tail -n 10 "$PIP_LOG" | sed 's/^/ /'
|
||
echo ""
|
||
fi
|
||
fi
|
||
rm -f "$PIP_LOG"
|
||
else
|
||
warning "未找到 requirements.txt,跳过 Python 依赖安装"
|
||
fi
|
||
}
|
||
|
||
# 构建 Go 项目
|
||
build_go_project() {
|
||
info "下载 Go 依赖..."
|
||
go mod download >/dev/null 2>&1 || {
|
||
error "Go 依赖下载失败"
|
||
exit 1
|
||
}
|
||
|
||
info "构建项目..."
|
||
if go build -o "$BINARY_NAME" cmd/server/main.go 2>&1; then
|
||
success "项目构建完成: $BINARY_NAME"
|
||
else
|
||
error "项目构建失败"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 检查是否需要重新构建
|
||
need_rebuild() {
|
||
if [ ! -f "$BINARY_NAME" ]; then
|
||
return 0 # 需要构建
|
||
fi
|
||
|
||
# 检查源代码是否有更新
|
||
if [ "$BINARY_NAME" -ot cmd/server/main.go ] || \
|
||
[ "$BINARY_NAME" -ot go.mod ] || \
|
||
find internal cmd -name "*.go" -newer "$BINARY_NAME" 2>/dev/null | grep -q .; then
|
||
return 0 # 需要重新构建
|
||
fi
|
||
|
||
return 1 # 不需要构建
|
||
}
|
||
|
||
# 主流程
|
||
main() {
|
||
# 环境检查
|
||
info "检查运行环境..."
|
||
check_python
|
||
check_go
|
||
echo ""
|
||
|
||
# 设置 Python 环境
|
||
info "设置 Python 环境..."
|
||
setup_python_env
|
||
echo ""
|
||
|
||
# 构建 Go 项目
|
||
if need_rebuild; then
|
||
info "准备构建项目..."
|
||
build_go_project
|
||
else
|
||
success "可执行文件已是最新,跳过构建"
|
||
fi
|
||
echo ""
|
||
|
||
# 启动服务器
|
||
success "所有准备工作完成!"
|
||
echo ""
|
||
info "启动 CyberStrikeAI 服务器..."
|
||
echo "=========================================="
|
||
echo ""
|
||
|
||
# 运行服务器
|
||
exec "./$BINARY_NAME"
|
||
}
|
||
|
||
# 执行主流程
|
||
main
|