212 lines
6.5 KiB
Bash
Executable File
212 lines
6.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# setup.sh - Restaurant API 환경 설정 스크립트
|
|
|
|
set -e
|
|
|
|
echo "🍽️ Restaurant 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 curl wget jq
|
|
|
|
# Python 버전 확인
|
|
PYTHON_VERSION=$(python3 -c "import sys; print('.'.join(map(str, sys.version_info[:2])))")
|
|
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 aiohttp pydantic python-multipart python-dotenv
|
|
fi
|
|
|
|
# 데이터 디렉토리 생성
|
|
echo ""
|
|
echo "📁 데이터 디렉토리 설정 중..."
|
|
mkdir -p data
|
|
chmod 755 data
|
|
echo "✅ 데이터 디렉토리 생성: $(pwd)/data"
|
|
|
|
# 환경변수 파일 생성 (예시)
|
|
echo ""
|
|
echo "⚙️ 환경변수 파일 생성 중..."
|
|
cat > .env << EOF
|
|
# 카카오 API 설정
|
|
KAKAO_API_KEY=5cdc24407edbf8544f3954cfaa4650c6
|
|
|
|
# 서버 설정
|
|
HOST=0.0.0.0
|
|
PORT=18000
|
|
LOG_LEVEL=info
|
|
|
|
# 기본 검색 설정
|
|
DEFAULT_QUERY=음식점
|
|
DEFAULT_REGION=서울
|
|
DEFAULT_SIZE=15
|
|
MAX_PAGES=10
|
|
|
|
# 파일 설정
|
|
OUTPUT_FILE=restaurant.json
|
|
DATA_DIR=./data
|
|
|
|
# 요청 설정
|
|
REQUEST_DELAY=0.1
|
|
REQUEST_TIMEOUT=30
|
|
EOF
|
|
echo "✅ .env 파일 생성 완료"
|
|
|
|
# 네트워크 연결 테스트
|
|
echo ""
|
|
echo "🌐 네트워크 연결 테스트 중..."
|
|
|
|
# 카카오 API 연결 테스트
|
|
if curl -s --connect-timeout 5 "https://dapi.kakao.com" > /dev/null; then
|
|
echo "✅ 카카오 API 서버 연결 가능"
|
|
else
|
|
echo "❌ 카카오 API 서버 연결 실패"
|
|
echo " 인터넷 연결 상태를 확인해주세요."
|
|
fi
|
|
|
|
# API 키 유효성 간단 테스트
|
|
echo ""
|
|
echo "🔑 API 키 유효성 테스트 중..."
|
|
API_KEY="5cdc24407edbf8544f3954cfaa4650c6"
|
|
TEST_RESPONSE=$(curl -s -w "%{http_code}" -o /dev/null \
|
|
-H "Authorization: KakaoAK ${API_KEY}" \
|
|
--data-urlencode "query=카카오프렌즈&size=1" \
|
|
"https://dapi.kakao.com/v2/local/search/keyword.json")
|
|
|
|
if [ "${TEST_RESPONSE}" = "200" ]; then
|
|
echo "✅ API 키 유효성 확인 완료"
|
|
elif [ "${TEST_RESPONSE}" = "401" ]; then
|
|
echo "❌ API 키 인증 실패"
|
|
echo " .env 파일의 KAKAO_API_KEY를 확인해주세요."
|
|
elif [ "${TEST_RESPONSE}" = "000" ]; then
|
|
echo "⚠️ 네트워크 연결 문제로 API 키 테스트 불가"
|
|
else
|
|
echo "⚠️ API 키 테스트 실패 (HTTP ${TEST_RESPONSE})"
|
|
fi
|
|
|
|
# .env 파일 로딩 테스트
|
|
echo ""
|
|
echo "🔧 .env 파일 로딩 테스트 중..."
|
|
python3 -c "
|
|
from dotenv import load_dotenv
|
|
import os
|
|
load_dotenv()
|
|
port = os.getenv('PORT', '8000')
|
|
data_dir = os.getenv('DATA_DIR', './data')
|
|
print(f'✅ .env 파일 로딩 성공')
|
|
print(f' - PORT: {port}')
|
|
print(f' - DATA_DIR: {data_dir}')
|
|
" 2>/dev/null && echo "✅ python-dotenv 동작 확인" || echo "❌ python-dotenv 설치 필요: pip install python-dotenv"
|
|
|
|
# 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 "18000"; then
|
|
echo "✅ 포트 18000 방화벽 규칙 확인됨"
|
|
else
|
|
echo "⚠️ 포트 18000 방화벽 규칙 없음"
|
|
echo " 다음 명령어로 포트를 열어주세요:"
|
|
echo " sudo ufw allow 18000"
|
|
fi
|
|
else
|
|
echo "✅ UFW 방화벽 비활성화됨"
|
|
fi
|
|
else
|
|
echo "✅ UFW 방화벽 미설치"
|
|
fi
|
|
|
|
echo ""
|
|
echo "🎉 환경 설정 완료!"
|
|
echo ""
|
|
echo "📋 다음 단계:"
|
|
echo "1. 가상환경 활성화:"
|
|
echo " source venv/bin/activate"
|
|
echo ""
|
|
echo "2. 애플리케이션 실행:"
|
|
echo " python app/main.py"
|
|
echo " 또는"
|
|
echo " uvicorn app.main:app --host 0.0.0.0 --port 18000 --reload"
|
|
echo ""
|
|
echo "3. 웹 브라우저에서 접속:"
|
|
echo " http://localhost:18000 (메인 페이지)"
|
|
echo " http://localhost:18000/docs (Swagger UI)"
|
|
echo " http://localhost:18000/health (헬스체크)"
|
|
echo ""
|
|
echo "4. API 테스트:"
|
|
echo " curl -X POST \"http://localhost:18000/collect\" \\"
|
|
echo " -H \"Content-Type: application/json\" \\"
|
|
echo " -d '{\"query\":\"치킨\",\"region\":\"서울\",\"pages\":2}'"
|
|
echo ""
|
|
echo "💡 문제 발생 시:"
|
|
echo " - 로그 확인: tail -f 로그파일"
|
|
echo " - 환경변수 확인: cat .env"
|
|
echo " - .env 로딩 확인: python -c \"from dotenv import load_dotenv; load_dotenv(); import os; print(os.getenv('PORT'))\""
|
|
echo " - 네트워크 확인: curl https://dapi.kakao.com"
|
|
echo ""
|
|
echo "🔧 설정 파일 위치:"
|
|
echo " - 환경변수: $(pwd)/.env"
|
|
echo " - 데이터 저장: $(pwd)/data/"
|
|
echo " - 애플리케이션: $(pwd)/app/"
|
|
|
|
deactivate 2>/dev/null || true
|
|
echo ""
|
|
echo "✅ 환경 설정이 완료되었습니다!" |