#!/bin/bash # setup.sh - Poetry 기반 Vector DB API 의존성 설치 스크립트 (홈 디렉토리 사용) set -e # 색상 설정 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # 옵션 기본값 SKIP_POETRY_INSTALL=false SKIP_PYTHON311_CHECK=false FORCE_REINSTALL=false RUN_AFTER_INSTALL=false # 함수 정의 log_info() { echo -e "${CYAN}ℹ️ $1${NC}"; } log_success() { echo -e "${GREEN}✅ $1${NC}"; } log_warning() { echo -e "${YELLOW}⚠️ $1${NC}"; } log_error() { echo -e "${RED}❌ $1${NC}"; } log_step() { echo -e "\n${BLUE}🔧 $1${NC}"; } # 사용법 표시 show_usage() { echo "사용법: $0 [옵션]" echo "" echo "옵션:" echo " --skip-poetry-install Poetry 설치 건너뛰기" echo " --skip-python311-check Python 3.11 확인 건너뛰기" echo " --force-reinstall 기존 환경 제거 후 재설치" echo " --run-after-install 설치 후 앱 자동 실행" echo " --help 이 도움말 표시" } # 파라미터 파싱 while [[ $# -gt 0 ]]; do case $1 in --skip-poetry-install) SKIP_POETRY_INSTALL=true shift ;; --skip-python311-check) SKIP_PYTHON311_CHECK=true shift ;; --force-reinstall) FORCE_REINSTALL=true shift ;; --run-after-install) RUN_AFTER_INSTALL=true shift ;; --help) show_usage exit 0 ;; *) log_error "알 수 없는 옵션: $1" show_usage exit 1 ;; esac done echo "========================================================" echo "🚀 Poetry 기반 Vector DB API 의존성 설치 (홈 디렉토리)" echo "========================================================" echo "설치 시작: $(date)" echo "작업 디렉토리: $(pwd)" echo "홈 디렉토리: $HOME" echo "사용자: $(whoami)" echo "" INSTALL_START=$(date +%s) # ============================================================================= # 1단계: Poetry 설치 확인 # ============================================================================= log_step "1단계: Poetry 설치 확인" if [ "$SKIP_POETRY_INSTALL" = true ]; then log_info "Poetry 설치 확인을 건너뜁니다." elif command -v poetry &> /dev/null; then POETRY_VERSION=$(poetry --version) log_success "Poetry 이미 설치됨: $POETRY_VERSION" else if [ -f /.dockerenv ]; then log_error "Docker 환경에서 Poetry를 찾을 수 없습니다." log_error "--skip-poetry-install 옵션을 제거하세요." exit 1 fi log_info "Poetry 설치 중..." sudo apt update sudo apt install -y python3-poetry # PATH 확인 export PATH="$HOME/.local/bin:$PATH" if command -v poetry &> /dev/null; then log_success "Poetry 설치 완료: $(poetry --version)" else log_error "Poetry 설치 실패" exit 1 fi fi # ============================================================================= # 2단계: Python 3.11 확인 # ============================================================================= log_step "2단계: Python 3.11 환경 확인" if [ "$SKIP_PYTHON311_CHECK" = false ]; then if command -v python3.11 &> /dev/null; then PYTHON311_VERSION=$(python3.11 --version) log_success "Python 3.11 발견: $PYTHON311_VERSION" else log_warning "Python 3.11이 설치되어 있지 않습니다." log_info "Python 3.11 설치 중..." sudo apt update sudo apt install -y python3.11 python3.11-venv python3.11-dev if command -v python3.11 &> /dev/null; then log_success "Python 3.11 설치 완료: $(python3.11 --version)" else log_error "Python 3.11 설치 실패" exit 1 fi fi fi # ============================================================================= # 3단계: Poetry 프로젝트 초기화 # ============================================================================= log_step "3단계: Poetry 프로젝트 초기화" # 기존 환경 제거 (강제 재설치 옵션) if [ "$FORCE_REINSTALL" = true ]; then log_info "기존 Poetry 환경 제거 중..." poetry env remove --all 2>/dev/null || true rm -f poetry.lock pyproject.toml 2>/dev/null || true fi # pyproject.toml이 없는 경우 초기화 if [ ! -f "pyproject.toml" ]; then log_info "Poetry 프로젝트 초기화 중..." # 현재 작업 디렉토리 확인 log_info "현재 작업 디렉토리: $(pwd)" # 비대화형 초기화 (홈 디렉토리 기준) cat > pyproject.toml << 'EOF' [tool.poetry] name = "vector-api" version = "1.0.0" description = "Vector DB API with AI/ML capabilities" authors = ["Developer "] packages = [{include = "app"}] [tool.poetry.dependencies] python = "^3.11" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" EOF log_success "pyproject.toml 생성 완료 (위치: $(pwd)/pyproject.toml)" else log_success "기존 pyproject.toml 사용 (위치: $(pwd)/pyproject.toml)" fi # ============================================================================= # 4단계: Poetry 가상환경 설정 (홈 디렉토리 사용) # ============================================================================= log_step "4단계: Poetry 가상환경 설정 (홈 디렉토리 사용)" log_info "Poetry 가상환경을 홈 디렉토리로 설정 중..." # 홈 디렉토리에 Poetry 관련 디렉토리 생성 mkdir -p ~/.cache/pypoetry/venvs ~/.cache/pypoetry/cache # Poetry 설정 - 가상환경을 홈 디렉토리로 이동 poetry config virtualenvs.in-project false poetry config virtualenvs.create true poetry config virtualenvs.path ~/.cache/pypoetry/venvs poetry config cache-dir ~/.cache/pypoetry/cache # 설정 확인 log_info "Poetry 설정 확인:" poetry config --list | grep -E "(virtualenvs|cache)" # 권한 확인 log_info "디렉토리 권한 확인:" ls -la ~/.cache/pypoetry/ 2>/dev/null || log_info "디렉토리가 아직 생성되지 않음" log_success "Poetry 가상환경 설정 완료" # ============================================================================= # 5단계: Python 3.11 환경 설정 # ============================================================================= log_step "5단계: Python 3.11 환경 설정" log_info "Poetry가 Python 3.11을 사용하도록 설정 중..." poetry env use python3.11 # 환경 정보 확인 POETRY_ENV_INFO=$(poetry config virtualenvs.path) log_success "Poetry 가상환경 기본 경로: $POETRY_ENV_INFO" log_info "현재 작업 디렉토리: $(pwd)" log_info "앱 디렉토리 확인: $([ -d "app" ] && echo "✅ app/ 디렉토리 존재" || echo "❌ app/ 디렉토리 없음")" # ============================================================================= # 6단계: 소스 우선순위 사전 설정 (중요!) # ============================================================================= log_step "6단계: 소스 우선순위 사전 설정" log_info "PyPI를 기본 소스로 확인 중..." # PyPI는 기본적으로 존재하므로 확인만 함 if poetry source show | grep -q "pypi"; then log_success "PyPI 소스 확인됨" else log_warning "PyPI 소스가 없습니다 (비정상)" fi log_success "소스 우선순위 사전 설정 완료" # ============================================================================= # 7단계: 기본 웹 프레임워크 설치 # ============================================================================= log_step "7단계: 기본 웹 프레임워크 설치" log_info "FastAPI 및 관련 패키지 설치 중..." poetry add "fastapi==0.115.9" poetry add uvicorn[standard] pydantic python-dotenv python-multipart log_success "웹 프레임워크 설치 완료" # ============================================================================= # 8단계: HTTP 클라이언트 설치 # ============================================================================= log_step "8단계: HTTP 클라이언트 설치" log_info "HTTP 클라이언트 설치 중..." poetry add aiohttp requests log_success "HTTP 클라이언트 설치 완료" # ============================================================================= # 9단계: 데이터 처리 라이브러리 설치 # ============================================================================= log_step "9단계: 데이터 처리 라이브러리 설치" log_info "NumPy, Pandas 설치 중..." poetry add numpy pandas log_success "데이터 처리 라이브러리 설치 완료" # ============================================================================= # 10단계: AI/ML 기초 라이브러리 설치 # ============================================================================= log_step "10단계: AI/ML 기초 라이브러리 설치" log_info "Tokenizers, Transformers 설치 중..." poetry add tokenizers transformers huggingface-hub log_success "AI/ML 기초 라이브러리 설치 완료" # ============================================================================= # 11단계: Sentence Transformers 설치 # ============================================================================= log_step "11단계: Sentence Transformers 설치" log_info "Sentence Transformers 설치 중..." poetry add sentence-transformers log_success "Sentence Transformers 설치 완료" # ============================================================================= # 12단계: Vector DB 라이브러리 설치 # ============================================================================= log_step "12단계: Vector DB 라이브러리 설치" log_info "ChromaDB, HNSW, DuckDB 설치 중..." poetry add chromadb hnswlib duckdb log_success "Vector DB 라이브러리 설치 완료" # ============================================================================= # 13단계: Claude API 라이브러리 설치 # ============================================================================= log_step "13단계: Claude API 라이브러리 설치" log_info "Anthropic Claude API 라이브러리 설치 중..." poetry add anthropic log_success "Claude API 라이브러리 설치 완료" # ============================================================================= # 14단계: 기타 필수 라이브러리 설치 # ============================================================================= log_step "14단계: 기타 필수 라이브러리 설치" log_info "기타 필수 라이브러리 설치 중..." poetry add typing-extensions sqlalchemy log_success "기타 필수 라이브러리 설치 완료" # ============================================================================= # 15단계: PyTorch CPU 버전 설치 # ============================================================================= log_step "15단계: PyTorch CPU 버전 설치" log_info "PyTorch CPU 버전 소스 추가 중..." poetry source add pytorch-cpu https://download.pytorch.org/whl/cpu --priority=supplemental log_info "PyTorch CPU 버전 설치 중..." poetry add torch --source pytorch-cpu poetry add torchvision --source pytorch-cpu poetry add torchaudio --source pytorch-cpu log_success "PyTorch CPU 버전 설치 완료" # ============================================================================= # 16단계: Starlette 버전 호환성 확인 # ============================================================================= log_step "16단계: Starlette 버전 호환성 확인" log_info "Starlette 호환 버전 설치 중..." poetry add "starlette>=0.40.0,<0.46.0" log_success "Starlette 호환성 확인 완료" # 종료 시간 계산 INSTALL_END=$(date +%s) INSTALL_TIME=$((INSTALL_END - INSTALL_START)) MINUTES=$((INSTALL_TIME / 60)) SECONDS=$((INSTALL_TIME % 60)) echo "" echo "🎉 Poetry 기반 Vector DB API 설치 완료!" echo "========================================================" echo "⏱️ 총 설치 시간: ${MINUTES}분 ${SECONDS}초" echo "📦 설치된 패키지 수: $(poetry show | wc -l)" echo "🐍 Python 환경: $(poetry run python --version)" echo "📁 환경 경로: $(poetry env info --path)" echo "🏠 작업 디렉토리: $(pwd)" echo "🏠 홈 디렉토리: $HOME" echo "" echo "🚀 다음 단계:" echo " 1. 가상환경 활성화:" echo " poetry shell" echo "" echo " 2. 애플리케이션 실행 (홈 디렉토리 기준):" echo " poetry run python app/main.py" echo "" echo " 3. 개발 서버 실행:" echo " poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload" echo "" echo "💡 유용한 명령어:" echo " - poetry show # 설치된 패키지 확인" echo " - poetry show --tree # 의존성 트리 확인" echo " - poetry add [패키지명] # 새 패키지 추가" echo " - poetry update # 패키지 업데이트" echo " - poetry env info # 환경 정보 확인" echo " - pwd # 현재 작업 디렉토리 확인" echo " - ls -la ~/.cache/pypoetry/venvs/ # Poetry 가상환경 확인" echo "" # 자동 실행 옵션 if [ "$RUN_AFTER_INSTALL" = true ]; then if [ -f "app/main.py" ]; then log_info "앱 자동 실행 중... (작업 디렉토리: $(pwd))" poetry run python app/main.py else log_warning "app/main.py 파일이 없어 자동 실행을 건너뜁니다." log_info "현재 디렉토리: $(pwd)" log_info "파일 목록: $(ls -la)" fi fi log_success "설치 스크립트 완료! 🎊"