#!/bin/bash # 색상 정의 GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' CYAN='\033[0;36m' BOLD='\033[1m' NC='\033[0m' log() { echo -e "${GREEN}[CastAD]${NC} $1"; } error() { echo -e "${RED}[ERROR]${NC} $1"; } warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } info() { echo -e "${CYAN}[INFO]${NC} $1"; } # 사용 가능한 포트 찾기 find_available_port() { local START_PORT=$1 local PORT=$START_PORT local MAX_TRIES=20 local TRIES=0 while [ $TRIES -lt $MAX_TRIES ]; do if ! lsof -i:$PORT >/dev/null 2>&1; then echo $PORT return 0 fi PORT=$((PORT + 1)) TRIES=$((TRIES + 1)) done # 최후의 수단: 랜덤 포트 echo $((START_PORT + RANDOM % 1000)) } # 스크립트 경로로 이동 cd "$(dirname "$0")" echo "" echo -e "${BOLD}${CYAN}╔════════════════════════════════════════════════════════╗${NC}" echo -e "${BOLD}${CYAN}║ CastAD - 펜션 AI 마케팅 영상 제작 플랫폼 ║${NC}" echo -e "${BOLD}${CYAN}╚════════════════════════════════════════════════════════╝${NC}" echo "" # 1. 사용 가능한 포트 찾기 (기존 프로세스 회피) log "사용 가능한 포트 탐색 중..." BACKEND_PORT=$(find_available_port 3001) FRONTEND_PORT=$(find_available_port 3000) # 백엔드와 프론트엔드 포트가 같으면 프론트엔드 포트 재탐색 if [ "$BACKEND_PORT" -eq "$FRONTEND_PORT" ]; then FRONTEND_PORT=$(find_available_port $((FRONTEND_PORT + 1))) fi export PORT=$BACKEND_PORT export VITE_BACKEND_PORT=$BACKEND_PORT export VITE_PORT=$FRONTEND_PORT export FRONTEND_URL="http://localhost:$FRONTEND_PORT" info "Backend Port: ${BOLD}$BACKEND_PORT${NC}" info "Frontend Port: ${BOLD}$FRONTEND_PORT${NC}" info "Frontend URL: ${BOLD}$FRONTEND_URL${NC}" # 2. 필수 파일 확인 if [ ! -f ".env" ]; then warn ".env 파일이 없습니다. .env.example을 참고하여 생성해주세요." fi if [ ! -f "server/client_secret.json" ]; then warn "server/client_secret.json 없음 - YouTube 자동 업로드가 작동하지 않습니다." fi # 3. 의존성 설치 (필요시) if [ ! -d "node_modules" ] || [ ! -d "server/node_modules" ]; then log "패키지 설치 중..." npm install --legacy-peer-deps --silent cd server && npm install --legacy-peer-deps --silent && cd .. fi # 4. Python Instagram 서비스 설정 INSTAGRAM_SERVICE_PORT=5001 if lsof -i:$INSTAGRAM_SERVICE_PORT >/dev/null 2>&1; then info "Instagram 서비스가 이미 실행 중입니다 (포트 $INSTAGRAM_SERVICE_PORT)" else if [ -f "server/instagram/instagram_service.py" ]; then log "Instagram 서비스 시작 중..." # Python 의존성 확인 if ! python3 -c "import instagrapi" 2>/dev/null; then warn "Instagram Python 의존성 설치 중..." pip install --break-system-packages -q -r server/instagram/requirements.txt 2>/dev/null || \ pip install -q -r server/instagram/requirements.txt 2>/dev/null fi # Instagram 서비스 백그라운드 실행 cd server/instagram python3 instagram_service.py & INSTAGRAM_PID=$! cd ../.. sleep 2 if curl -s http://localhost:$INSTAGRAM_SERVICE_PORT/health >/dev/null 2>&1; then info "Instagram 서비스 시작됨 (PID: $INSTAGRAM_PID)" else warn "Instagram 서비스 시작 실패 - Instagram 자동 업로드가 작동하지 않습니다." fi else warn "Instagram 서비스 파일 없음 - Instagram 자동 업로드가 작동하지 않습니다." fi fi # 5. 실행 echo "" log "서버를 시작합니다..." echo -e "${CYAN}─────────────────────────────────────────────────────────${NC}" echo -e " ${BOLD}Frontend${NC}: http://localhost:${FRONTEND_PORT}" echo -e " ${BOLD}Backend${NC}: http://localhost:${BACKEND_PORT}" echo -e " ${BOLD}Instagram${NC}: http://localhost:${INSTAGRAM_SERVICE_PORT}" echo -e " ${BOLD}관리자${NC}: admin / admin123" echo -e "${CYAN}─────────────────────────────────────────────────────────${NC}" echo "" # concurrently로 동시 실행 (환경변수 명시적 전달) npx concurrently \ --names "VITE,NODE" \ --prefix-colors "cyan,green" \ "VITE_BACKEND_PORT=$BACKEND_PORT npx vite --port $FRONTEND_PORT" \ "cd server && PORT=$BACKEND_PORT node index.js"