setup_env_centos8.sh 5.38 KB
#!/usr/bin/env bash
# =============================================================================
# OmniShopAgent - CentOS 8 环境准备脚本
# 准备 Python 3.12、Docker、依赖及虚拟环境
# =============================================================================
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
VENV_DIR="${VENV_DIR:-$PROJECT_ROOT/venv}"
PYTHON_VERSION="${PYTHON_VERSION:-3.12}"

echo "=========================================="
echo "OmniShopAgent - CentOS 8 环境准备"
echo "=========================================="
echo "项目目录: $PROJECT_ROOT"
echo "虚拟环境: $VENV_DIR"
echo "Python 版本: $PYTHON_VERSION"
echo "=========================================="

# -----------------------------------------------------------------------------
# 1. 安装系统依赖
# -----------------------------------------------------------------------------
echo "[1/4] 安装系统依赖..."
sudo dnf install -y \
    gcc \
    gcc-c++ \
    make \
    openssl-devel \
    bzip2-devel \
    libffi-devel \
    sqlite-devel \
    xz-devel \
    zlib-devel \
    readline-devel \
    tk-devel \
    libuuid-devel \
    curl \
    wget \
    git \
    tar

# -----------------------------------------------------------------------------
# 2. 检查 Docker(可选)
# -----------------------------------------------------------------------------
echo "[2/4] 检查 Docker..."
if ! command -v docker &>/dev/null; then
    echo "  安装 Docker..."
    sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 2>/dev/null || {
        sudo dnf install -y dnf-plugins-core
        sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    }
    sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    sudo systemctl enable docker
    sudo systemctl start docker
    sudo usermod -aG docker "$USER" 2>/dev/null || true
    echo "  Docker 已安装。请执行 'newgrp docker' 或重新登录以使用 docker 命令。"
else
    echo "  Docker 已安装: $(docker --version)"
fi

# -----------------------------------------------------------------------------
# 3. 安装 Python 3.12
# -----------------------------------------------------------------------------
echo "[3/4] 安装 Python $PYTHON_VERSION..."

USE_CONDA=false
if command -v python3.12 &>/dev/null; then
    echo "  Python 3.12 已安装"
elif command -v conda &>/dev/null; then
    echo "  使用 conda 创建 Python $PYTHON_VERSION 环境..."
    conda create -n shop_agent "python=$PYTHON_VERSION" -y
    USE_CONDA=true
    echo "  Conda 环境已创建。请执行: conda activate shop_agent"
    echo "  然后手动执行: pip install -r $PROJECT_ROOT/requirements.txt"
    echo "  跳过 venv 创建..."
else
    echo "  从源码编译 Python $PYTHON_VERSION..."
    sudo dnf groupinstall -y 'Development Tools'
    cd /tmp
    PY_URL="https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.0.tgz"
    PY_TGZ="Python-${PYTHON_VERSION}.0.tgz"
    [ -f "$PY_TGZ" ] || wget -q "$PY_URL" -O "$PY_TGZ"
    tar xzf "$PY_TGZ"
    cd "Python-${PYTHON_VERSION}.0"
    ./configure --enable-optimizations --prefix=/usr/local
    make -j "$(nproc)"
    sudo make altinstall
    cd /tmp
    rm -rf "Python-${PYTHON_VERSION}.0" "$PY_TGZ"
fi

# -----------------------------------------------------------------------------
# 4. 创建虚拟环境并安装依赖(非 conda 时)
# -----------------------------------------------------------------------------
if [ "$USE_CONDA" = true ]; then
    echo "[4/4] 已使用 conda,跳过 venv 创建"
else
    echo "[4/4] 创建虚拟环境与安装 Python 依赖..."

    PYTHON_BIN=""
    for p in python3.12 python3.11 python3; do
        if command -v "$p" &>/dev/null; then
            VER=$("$p" -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' 2>/dev/null || echo "0")
            if [[ "$VER" == "3.1"* ]] || [[ "$VER" == "3.12"* ]]; then
                PYTHON_BIN="$p"
                break
            fi
        fi
    done

    if [ -z "$PYTHON_BIN" ]; then
        echo "  错误: 未找到 Python 3.10+。若使用 conda,请先执行: conda activate shop_agent"
        echo "  然后手动执行: pip install -r $PROJECT_ROOT/requirements.txt"
        exit 1
    fi

    if [ ! -d "$VENV_DIR" ]; then
        echo "  创建虚拟环境: $VENV_DIR"
        "$PYTHON_BIN" -m venv "$VENV_DIR"
    fi

    echo "  激活虚拟环境并安装依赖..."
    set +u
    source "$VENV_DIR/bin/activate"
    set -u
    pip install -U pip
    pip install -r "$PROJECT_ROOT/requirements.txt"
    echo "  Python 依赖安装完成。"
fi

# 配置 .env
if [ ! -f "$PROJECT_ROOT/.env" ]; then
    echo ""
    echo "  创建 .env 配置文件..."
    cp "$PROJECT_ROOT/.env.example" "$PROJECT_ROOT/.env"
    echo "  请编辑 $PROJECT_ROOT/.env 配置 OPENAI_API_KEY 等参数。"
fi

echo ""
echo "=========================================="
echo "环境准备完成!"
echo "=========================================="
echo "下一步:"
echo "  1. 编辑 .env 配置 OPENAI_API_KEY、SEARCH_API_BASE_URL 等"
echo "  2. (可选)下载数据: python scripts/download_dataset.py"
echo "  3. 启动应用: ./scripts/start.sh"
echo ""
echo "激活虚拟环境: source $VENV_DIR/bin/activate"
echo "=========================================="