391 lines
13 KiB
Bash
Executable File
391 lines
13 KiB
Bash
Executable File
#!/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 <dev@example.com>"]
|
||
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단계: Starlette 버전 호환성 확인
|
||
# =============================================================================
|
||
log_step "15단계: Starlette 버전 호환성 확인"
|
||
|
||
log_info "Starlette 호환 버전 설치 중..."
|
||
poetry add "starlette>=0.40.0,<0.46.0"
|
||
|
||
log_success "Starlette 호환성 확인 완료"
|
||
|
||
# =============================================================================
|
||
# 16단계: PyTorch CPU 버전 설치
|
||
# =============================================================================
|
||
log_step "16단계: PyTorch CPU 버전 설치"
|
||
|
||
log_info "PyTorch CPU 버전 소스 추가 중..."
|
||
poetry source add pytorch-cpu https://download.pytorch.org/whl/cpu -p 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 버전 설치 완료"
|
||
|
||
# 종료 시간 계산
|
||
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 "설치 스크립트 완료! 🎊"
|
||
|