130 lines
4.9 KiB
Bash
Executable File
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"
|