castad-pre-v0.3/castad-data/start.sh

130 lines
4.9 KiB
Bash
Executable File

#!/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 캐시 삭제 (코드 변경 반영)
find server/instagram -name "*.pyc" -delete 2>/dev/null
find server/instagram -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null
# 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 --yes 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"