ai-review/review/setup.sh
2025-06-15 13:52:26 +00:00

280 lines
8.8 KiB
Bash
Executable File

#!/bin/bash
# setup.sh - Review Analysis API 환경 설정 스크립트
set -e
echo "🔍 Review Analysis API 환경 설정 시작..."
# 시스템 정보 확인
echo "📊 시스템 정보:"
echo " - OS: $(lsb_release -d | cut -f2)"
echo " - Python: $(python3 --version 2>/dev/null || echo 'Python3 미설치')"
echo " - pip: $(pip3 --version 2>/dev/null || echo 'pip3 미설치')"
# 필수 패키지 설치
echo ""
echo "📦 필수 패키지 설치 중..."
sudo apt update
sudo apt install -y python3-pip python3-venv unzip wget curl jq
# Chrome 브라우저 설치 (리뷰 분석용)
echo ""
echo "🌐 Chrome 브라우저 설치 확인 중..."
if ! command -v google-chrome &> /dev/null; then
echo "Chrome 브라우저 설치 중..."
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
sudo apt update
sudo apt install -y google-chrome-stable
echo "✅ Chrome 브라우저 설치 완료"
else
CHROME_VERSION=$(google-chrome --version)
echo "✅ Chrome 브라우저 이미 설치됨: ${CHROME_VERSION}"
fi
# ChromeDriver 설치
echo ""
echo "🚗 ChromeDriver 설치 중..."
if [ -f "/usr/local/bin/chromedriver" ]; then
echo "기존 ChromeDriver 제거 중..."
sudo rm -f /usr/local/bin/chromedriver
fi
CHROME_VERSION=$(google-chrome --version | grep -oP '\d+\.\d+\.\d+\.\d+' | cut -d'.' -f1)
echo "Chrome 주 버전: ${CHROME_VERSION}"
CHROMEDRIVER_VERSION=$(curl -s "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_${CHROME_VERSION}")
echo "ChromeDriver 버전: ${CHROMEDRIVER_VERSION}"
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR"
wget -q "https://storage.googleapis.com/chrome-for-testing-public/${CHROMEDRIVER_VERSION}/linux64/chromedriver-linux64.zip"
unzip -q chromedriver-linux64.zip
sudo mv chromedriver-linux64/chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
cd - > /dev/null
rm -rf "$TEMP_DIR"
echo "✅ ChromeDriver 설치 완료: $(chromedriver --version)"
# Python 버전 확인
PYTHON_VERSION=$(python3 -c "import sys; print('.'.join(map(str, sys.version_info[:2])))")
echo ""
echo "📍 Python 버전: ${PYTHON_VERSION}"
if [ "$(echo "${PYTHON_VERSION} < 3.8" | bc)" -eq 1 ]; then
echo "⚠️ Python 3.8 이상이 권장됩니다."
fi
# Python 가상환경 설정
echo ""
echo "🐍 Python 가상환경 설정 중..."
if [ ! -d "venv" ]; then
python3 -m venv venv
echo "✅ 가상환경 생성 완료"
else
echo "✅ 기존 가상환경 발견"
fi
# 가상환경 활성화 및 라이브러리 설치
echo "📚 Python 라이브러리 설치 중..."
source venv/bin/activate
# pip 업그레이드
pip install --upgrade pip
# 필요한 라이브러리 설치
if [ -f "app/requirements.txt" ]; then
pip install -r app/requirements.txt
echo "✅ requirements.txt에서 라이브러리 설치 완료"
else
echo "⚠️ app/requirements.txt 파일을 찾을 수 없습니다."
echo "🔧 기본 라이브러리들을 직접 설치합니다..."
pip install fastapi uvicorn beautifulsoup4 selenium webdriver-manager pydantic python-multipart lxml
fi
# 데이터 디렉토리 생성
echo ""
echo "📁 데이터 디렉토리 설정 중..."
mkdir -p data
chmod 755 data
echo "✅ 데이터 디렉토리 생성: $(pwd)/data"
# 환경변수 파일 생성 (예시)
echo ""
echo "⚙️ 환경변수 파일 생성 중..."
cat > .env << EOF
# 애플리케이션 설정
APP_TITLE=카카오맵 리뷰 분석 API
APP_VERSION=1.0.1
APP_DESCRIPTION=교육 목적 전용 - 실제 서비스 사용 금지
# 서버 설정
HOST=0.0.0.0
PORT=19000
LOG_LEVEL=info
# API 기본값 설정
DEFAULT_MAX_TIME=300
DEFAULT_DAYS_LIMIT=60
MAX_DAYS_LIMIT=365
MIN_MAX_TIME=60
MAX_MAX_TIME=600
# Chrome 브라우저 설정
CHROME_OPTIONS=--headless=new --no-sandbox --disable-dev-shm-usage --disable-gpu --window-size=1920,1080
SCROLL_CHECK_INTERVAL=5
SCROLL_NO_CHANGE_LIMIT=6
SCROLL_WAIT_TIME_SHORT=2.0
SCROLL_WAIT_TIME_LONG=3.0
# 법적 경고 메시지
LEGAL_WARNING_ENABLED=true
CONTACT_EMAIL=admin@example.com
# 건강 체크 설정
HEALTH_CHECK_TIMEOUT=10
# AI API 설정 (향후 Claude API 연동용)
# CLAUDE_API_KEY=your_claude_api_key_here
# 데이터베이스 설정 (향후 PostgreSQL 연동용)
# DB_HOST=localhost
# DB_PORT=5432
# DB_NAME=review_analysis
# DB_USERNAME=your_db_username
# DB_PASSWORD=your_db_password
EOF
echo "✅ .env 파일 생성 완료"
# 네트워크 연결 테스트
echo ""
echo "🌐 네트워크 연결 테스트 중..."
# 카카오맵 연결 테스트
if curl -s --connect-timeout 5 "https://place.map.kakao.com" > /dev/null; then
echo "✅ 카카오맵 서버 연결 가능"
else
echo "❌ 카카오맵 서버 연결 실패"
echo " 인터넷 연결 상태를 확인해주세요."
fi
# Selenium 및 Chrome 테스트
echo ""
echo "🧪 Selenium 및 Chrome 테스트 중..."
source venv/bin/activate
python3 -c "
try:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
print('✅ Selenium 모듈 import 성공')
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
try:
service = Service('/usr/local/bin/chromedriver')
driver = webdriver.Chrome(service=service, options=options)
driver.get('data:text/html,<html><body><h1>Test</h1></body></html>')
title = driver.title
driver.quit()
print('✅ Chrome WebDriver 테스트 성공')
except Exception as e:
print(f'❌ Chrome WebDriver 테스트 실패: {e}')
except ImportError as e:
print(f'❌ Selenium import 실패: {e}')
except Exception as e:
print(f'❌ 테스트 중 오류: {e}')
"
# Docker 설치 확인 (선택사항)
echo ""
echo "🐳 Docker 설치 확인 중..."
if command -v docker &> /dev/null; then
DOCKER_VERSION=$(docker --version)
echo "✅ Docker 설치됨: ${DOCKER_VERSION}"
# Docker 권한 확인
if docker ps &> /dev/null; then
echo "✅ Docker 권한 확인됨"
else
echo "⚠️ Docker 권한 없음. 다음 명령어로 권한을 추가하세요:"
echo " sudo usermod -aG docker $USER"
echo " newgrp docker"
fi
else
echo "⚠️ Docker가 설치되지 않음 (컨테이너 배포 시 필요)"
echo " 설치 방법: https://docs.docker.com/engine/install/ubuntu/"
fi
# 방화벽 설정 확인
echo ""
echo "🔥 방화벽 설정 확인 중..."
if command -v ufw &> /dev/null; then
UFW_STATUS=$(sudo ufw status | head -n1 | awk '{print $2}')
if [ "${UFW_STATUS}" = "active" ]; then
echo "🔥 UFW 방화벽 활성화됨"
if sudo ufw status | grep -q "19000"; then
echo "✅ 포트 19000 방화벽 규칙 확인됨"
else
echo "⚠️ 포트 19000 방화벽 규칙 없음"
echo " 다음 명령어로 포트를 열어주세요:"
echo " sudo ufw allow 19000"
fi
else
echo "✅ UFW 방화벽 비활성화됨"
fi
else
echo "✅ UFW 방화벽 미설치"
fi
echo ""
echo "🎉 환경 설정 완료!"
echo ""
echo "📋 다음 단계:"
echo "1. 가상환경 활성화:"
echo " source venv/bin/activate"
echo ""
echo "2. 환경변수 설정:"
echo " export DATA_DIR=\"./data\""
echo ""
echo "3. 애플리케이션 실행:"
echo " python app/main.py"
echo " 또는"
echo " uvicorn app.main:app --host 0.0.0.0 --port 19000 --reload"
echo ""
echo "4. 웹 브라우저에서 접속:"
echo " http://localhost:19000 (메인 페이지)"
echo " http://localhost:19000/docs (Swagger UI)"
echo " http://localhost:19000/health (헬스체크)"
echo ""
echo "5. API 테스트:"
echo " curl -X POST \"http://localhost:19000/analyze\" \\"
echo " -H \"Content-Type: application/json\" \\"
echo " -d '{\"store_id\":\"501745730\",\"days_limit\":7,\"max_time\":300}'"
echo ""
echo "⚠️ 중요 법적 경고사항:"
echo " 이 서비스는 교육 목적으로만 사용하세요!"
echo " 실제 웹사이트 크롤링은 법적 위험이 있습니다."
echo " 카카오 공식 API를 사용하는 것을 권장합니다: developers.kakao.com"
echo ""
echo "💡 문제 발생 시:"
echo " - 로그 확인: tail -f 로그파일"
echo " - 환경변수 확인: cat .env"
echo " - Chrome 확인: google-chrome --version"
echo " - ChromeDriver 확인: chromedriver --version"
echo ""
echo "🔧 설정 파일 위치:"
echo " - 환경변수: $(pwd)/.env"
echo " - 데이터 저장: $(pwd)/data/"
echo " - 애플리케이션: $(pwd)/app/"
deactivate 2>/dev/null || true
echo ""
echo "✅ Review Analysis API 환경 설정이 완료되었습니다!"