#!/bin/bash # ============================================================================= # KB Workflow 环境一键安装脚本 # ============================================================================= # 功能: 检查并安装 kb-workflow 技能所需的全部环境依赖 # 支持: Ubuntu/Debian 系统 # # 使用方法: # ./install-env.sh # 检查环境并提示安装命令(检查模式) # ./install-env.sh --auto # 自动安装所有缺失依赖(自动模式) # ============================================================================= # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } log_section() { echo "" echo -e "${BLUE}========================================${NC}" echo -e "${BLUE}$1${NC}" echo -e "${BLUE}========================================${NC}" } # 获取脚本目录 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DEFAULT_KB_PATH="${HOME}/work/knowledge-base" # 解析参数 AUTO_MODE=false if [ "$1" = "--auto" ]; then AUTO_MODE=true log_info "自动安装模式" fi # 检测 Linux 发行版 detect_distro() { if [ -f /etc/os-release ]; then . /etc/os-release echo "$ID" elif [ -f /etc/debian_version ]; then echo "debian" elif [ -f /etc/redhat-release ]; then echo "rhel" fi } DISTRO=$(detect_distro) # 检查命令是否存在 command_exists() { command -v "$1" > /dev/null 2>&1 } # 检查 Python 包 check_python_package() { python3 -c "import $1" 2>/dev/null } # ============================================================================= # 1. 检查系统依赖 # ============================================================================= log_section "第一步: 检查系统依赖" MISSING_DEPS=() # 检查 Python3 if command_exists python3; then PYTHON_VERSION=$(python3 --version | cut -d' ' -f2) log_success "Python3 已安装: $PYTHON_VERSION" else log_warn "Python3 未安装" MISSING_DEPS+=("python3") fi # 检查 pip3 if python3 -m pip --version > /dev/null 2>&1 || command_exists pip3; then log_success "pip3 已安装" else log_warn "pip3 未安装" MISSING_DEPS+=("python3-pip") fi # 检查 ffmpeg if command_exists ffmpeg; then log_success "ffmpeg 已安装" else log_warn "ffmpeg 未安装" MISSING_DEPS+=("ffmpeg") fi # 检查 tesseract if command_exists tesseract; then log_success "Tesseract OCR 已安装" else log_warn "Tesseract OCR 未安装" MISSING_DEPS+=("tesseract-ocr") fi # 检查 git if command_exists git; then log_success "Git 已安装" else log_warn "Git 未安装" MISSING_DEPS+=("git") fi # ============================================================================= # 2. 自动安装系统依赖(自动模式) # ============================================================================= if [ ${#MISSING_DEPS[@]} -gt 0 ]; then if [ "$AUTO_MODE" = true ]; then log_section "自动安装系统依赖" log_info "检测到系统: $DISTRO" case "$DISTRO" in ubuntu|debian) log_info "更新包列表..." sudo apt-get update -qq log_info "安装依赖: ${MISSING_DEPS[*]}" sudo apt-get install -y -qq "${MISSING_DEPS[@]}" tesseract-ocr-chi-sim tesseract-ocr-eng ;; fedora|rhel|centos) log_info "更新包列表..." sudo dnf check-update -y || true log_info "安装依赖: ${MISSING_DEPS[*]}" sudo dnf install -y "${MISSING_DEPS[@]}" tesseract-langpack-chi_sim tesseract-langpack-eng ;; arch) log_info "安装依赖: ${MISSING_DEPS[*]}" sudo pacman -S --noconfirm "${MISSING_DEPS[@]}" tesseract-data-chi_sim tesseract-data-eng ;; *) log_error "不支持的系统: $DISTRO" exit 1 ;; esac log_success "系统依赖安装完成" MISSING_DEPS=() else log_section "需要安装的系统依赖" echo "" echo "检测到以下依赖未安装:" for dep in "${MISSING_DEPS[@]}"; do echo " - $dep" done echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "请运行以下命令安装:" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" echo -e "${YELLOW}sudo apt-get update${NC}" echo -e "${YELLOW}sudo apt-get install -y ${MISSING_DEPS[*]} tesseract-ocr-chi-sim tesseract-ocr-eng${NC}" echo "" fi fi # ============================================================================= # 3. 检查 Python 依赖 # ============================================================================= log_section "第二步: 检查 Python 依赖" PYTHON_PACKAGES=( "httpx:httpx" "aiohttp:aiohttp" "requests:requests" "Pillow:PIL" ) MISSING_PY_PKGS=() for pkg_info in "${PYTHON_PACKAGES[@]}"; do pkg_name=$(echo "$pkg_info" | cut -d':' -f1) import_name=$(echo "$pkg_info" | cut -d':' -f2) if check_python_package "$import_name" 2>/dev/null; then log_success "$pkg_name 已安装" else log_warn "$pkg_name 未安装" MISSING_PY_PKGS+=("$pkg_name") fi done # 检查特殊包 check_python_package "playwright" 2>/dev/null && log_success "playwright 已安装" || MISSING_PY_PKGS+=("playwright") check_python_package "easyocr" 2>/dev/null && log_success "easyocr 已安装" || MISSING_PY_PKGS+=("easyocr") check_python_package "pytesseract" 2>/dev/null && log_success "pytesseract 已安装" || MISSING_PY_PKGS+=("pytesseract") # ============================================================================= # 4. 自动安装 Python 依赖(自动模式) # ============================================================================= if [ ${#MISSING_PY_PKGS[@]} -gt 0 ]; then if [ "$AUTO_MODE" = true ]; then log_section "自动安装 Python 包" log_info "安装: ${MISSING_PY_PKGS[*]}" pip3 install --user "${MISSING_PY_PKGS[@]}" -q log_success "Python 包安装完成" # 安装 Playwright 浏览器 if [[ " ${MISSING_PY_PKGS[*]} " =~ " playwright " ]]; then log_info "安装 Playwright Chromium 浏览器..." python3 -m playwright install chromium log_success "Chromium 浏览器安装完成" fi MISSING_PY_PKGS=() else echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "需要安装以下 Python 包:" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" for pkg in "${MISSING_PY_PKGS[@]}"; do echo " - $pkg" done echo "" echo "请运行以下命令安装:" echo "" echo -e "${YELLOW}pip3 install --user ${MISSING_PY_PKGS[*]}${NC}" if [[ " ${MISSING_PY_PKGS[*]} " =~ " playwright " ]]; then echo "" echo -e "${YELLOW}安装完 playwright 后,还需要运行:${NC}" echo -e "${YELLOW} python3 -m playwright install chromium${NC}" fi echo "" fi fi # ============================================================================= # 5. 创建知识库目录结构 # ============================================================================= log_section "第三步: 创建知识库目录结构" KB_BASE_PATH="${KB_BASE_PATH:-$DEFAULT_KB_PATH}" log_info "知识库路径: $KB_BASE_PATH" mkdir -p "$KB_BASE_PATH"/{archive/{subscriptions,pending},metadata,content/{downloads,subtitles},analyzed} log_success "目录结构创建完成" # ============================================================================= # 6. 环境变量配置提示 # ============================================================================= log_section "第四步: 环境变量配置" if [ -z "$KB_BASE_PATH_SET" ]; then log_warn "KB_BASE_PATH 环境变量未设置" echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "建议添加到 ~/.bashrc 或 ~/.zshrc:" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" echo -e "${YELLOW}export KB_BASE_PATH=\"$KB_BASE_PATH\"${NC}" echo "" else log_success "KB_BASE_PATH 已设置: $KB_BASE_PATH" fi # 创建环境变量示例文件 ENV_FILE="${SCRIPT_DIR}/.env.example" cat > "$ENV_FILE" << 'EOF' # KB Workflow 环境变量配置 export KB_BASE_PATH="~/work/knowledge-base" # 可选: B站 Cookie(用于下载会员视频) # export BILIBILI_COOKIE="SESSDATA=xxx; bili_jct=xxx" # 可选: AI 分析配置 # export AI_API_KEY="your-api-key" # export AI_PROVIDER="openai" # 或 zhipu, minimax # export AI_MODEL="gpt-4" # 可选: Git 配置 # export KB_GIT_USER="Your Name" # export KB_GIT_EMAIL="your@email.com" EOF log_info "环境变量示例已保存到: $ENV_FILE" # ============================================================================= # 7. 完成总结 # ============================================================================= log_section "安装完成" echo "" if [ ${#MISSING_DEPS[@]} -eq 0 ] && [ ${#MISSING_PY_PKGS[@]} -eq 0 ]; then echo -e "${GREEN}✅ 所有依赖已安装完成!${NC}" else echo -e "${YELLOW}⚠️ 部分依赖需要手动安装${NC}" echo "" if [ ${#MISSING_DEPS[@]} -gt 0 ]; then echo "系统依赖:" echo -e "${YELLOW}sudo apt-get install -y ${MISSING_DEPS[*]} tesseract-ocr-chi-sim tesseract-ocr-eng${NC}" fi if [ ${#MISSING_PY_PKGS[@]} -gt 0 ]; then echo "" echo "Python 包:" echo -e "${YELLOW}pip3 install --user ${MISSING_PY_PKGS[*]}${NC}" fi fi echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "使用方法:" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo " export KB_BASE_PATH=\"~/work/knowledge-base\" echo " python3 kb_workflow.py --check --url \"[URL]\"" echo ""