#!/bin/bash # # CaStAD 배포 스크립트 # 로컬에서 castad1.ktenterprise.net으로 배포 # # ═══════════════════════════════════════════════════════════════ # 설정 # ═══════════════════════════════════════════════════════════════ SERVER="castad1.ktenterprise.net" SERVER_USER="castad" # 서버 사용자 REMOTE_PATH="/home/${SERVER_USER}/castad" # 서버 경로 LOCAL_PATH="$(cd "$(dirname "$0")" && pwd)" # 색상 GREEN='\033[0;32m' CYAN='\033[0;36m' YELLOW='\033[1;33m' RED='\033[0;31m' BOLD='\033[1m' NC='\033[0m' log() { echo -e "${GREEN}[Deploy]${NC} $1"; } error() { echo -e "${RED}[ERROR]${NC} $1"; } info() { echo -e "${CYAN}[INFO]${NC} $1"; } # ═══════════════════════════════════════════════════════════════ # 빌드 # ═══════════════════════════════════════════════════════════════ do_build() { log "프론트엔드 빌드 중..." cd "$LOCAL_PATH" npm run build if [ $? -ne 0 ]; then error "빌드 실패!" exit 1 fi info "빌드 완료" } # ═══════════════════════════════════════════════════════════════ # 서버로 파일 전송 # ═══════════════════════════════════════════════════════════════ do_upload() { log "서버로 파일 전송 중..." # 제외할 파일/폴더 EXCLUDES="--exclude=node_modules --exclude=.git --exclude=*.log --exclude=pids --exclude=logs --exclude=server/database.sqlite --exclude=server/downloads --exclude=server/temp --exclude=.env" # rsync로 동기화 rsync -avz --progress $EXCLUDES \ "$LOCAL_PATH/" \ "${SERVER_USER}@${SERVER}:${REMOTE_PATH}/" if [ $? -ne 0 ]; then error "파일 전송 실패!" exit 1 fi info "파일 전송 완료" } # ═══════════════════════════════════════════════════════════════ # 서버에서 설치 및 재시작 # ═══════════════════════════════════════════════════════════════ do_install() { log "서버에서 의존성 설치 중..." ssh "${SERVER_USER}@${SERVER}" << 'REMOTE_SCRIPT' cd /home/castad/castad # npm 의존성 설치 echo "=== 프론트엔드 의존성 설치 ===" npm install --legacy-peer-deps --silent echo "=== 백엔드 의존성 설치 ===" cd server && npm install --legacy-peer-deps --silent && cd .. echo "=== 완료 ===" REMOTE_SCRIPT if [ $? -ne 0 ]; then error "서버 설치 실패!" exit 1 fi info "서버 설치 완료" } do_restart() { log "서버 재시작 중..." ssh "${SERVER_USER}@${SERVER}" << 'REMOTE_SCRIPT' cd /home/castad/castad ./startserver.sh restart REMOTE_SCRIPT info "서버 재시작 완료" } # ═══════════════════════════════════════════════════════════════ # 전체 배포 # ═══════════════════════════════════════════════════════════════ do_full_deploy() { echo "" echo -e "${BOLD}${CYAN}╔════════════════════════════════════════════════════════╗${NC}" echo -e "${BOLD}${CYAN}║ CaStAD 배포 시작 ║${NC}" echo -e "${BOLD}${CYAN}║ Target: ${SERVER} ║${NC}" echo -e "${BOLD}${CYAN}╚════════════════════════════════════════════════════════╝${NC}" echo "" do_build do_upload do_install do_restart echo "" echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ 배포 완료! ║${NC}" echo -e "${GREEN}║ URL: https://${SERVER} ║${NC}" echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}" echo "" } # ═══════════════════════════════════════════════════════════════ # 도움말 # ═══════════════════════════════════════════════════════════════ show_help() { echo "" echo -e "${BOLD}CaStAD 배포 스크립트${NC}" echo "" echo -e "${CYAN}사용법:${NC}" echo " ./deploy.sh " echo "" echo -e "${CYAN}명령어:${NC}" echo " deploy - 전체 배포 (빌드 → 업로드 → 설치 → 재시작)" echo " build - 로컬 빌드만" echo " upload - 파일 업로드만" echo " install - 서버 의존성 설치" echo " restart - 서버 재시작만" echo "" echo -e "${CYAN}설정:${NC}" echo " 서버: ${SERVER}" echo " 사용자: ${SERVER_USER}" echo " 경로: ${REMOTE_PATH}" echo "" echo -e "${YELLOW}사전 준비:${NC}" echo " 1. SSH 키 설정: ssh-copy-id ${SERVER_USER}@${SERVER}" echo " 2. 서버에 .env 파일 생성" echo " 3. Nginx 설정 (nginx.castad.conf 참고)" echo " 4. SSL 인증서 설정 (Let's Encrypt)" echo "" } # ═══════════════════════════════════════════════════════════════ # 메인 # ═══════════════════════════════════════════════════════════════ case "$1" in deploy) do_full_deploy ;; build) do_build ;; upload) do_upload ;; install) do_install ;; restart) do_restart ;; *) show_help ;; esac