#!/bin/bash # ============================================================================= # Todo-Project 시놀로지 배포 스크립트 # ============================================================================= set -e # 오류 발생 시 스크립트 중단 # 색상 정의 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 로그 함수 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 시놀로지 환경 확인 check_synology_environment() { log_info "시놀로지 환경 확인 중..." # Docker 설치 확인 if ! command -v docker &> /dev/null; then log_error "Docker가 설치되지 않았습니다. Container Manager 또는 Docker 패키지를 설치하세요." exit 1 fi # Docker Compose 확인 if ! command -v docker-compose &> /dev/null; then log_error "Docker Compose가 설치되지 않았습니다." exit 1 fi log_success "Docker 환경 확인 완료" } # 디렉토리 생성 create_directories() { log_info "시놀로지 디렉토리 구조 생성 중..." # 이미지 업로드 저장소 (volume1) sudo mkdir -p /volume1/todo-project/uploads sudo chmod 755 /volume1/todo-project/uploads sudo chown -R 1000:1000 /volume1/todo-project # 설정 및 데이터베이스 저장소 (volume3) sudo mkdir -p /volume3/docker/todo-project/config/migrations sudo mkdir -p /volume3/docker/todo-project/postgres sudo chown -R 999:999 /volume3/docker/todo-project/postgres sudo chown -R 1000:1000 /volume3/docker/todo-project/config log_success "디렉토리 구조 생성 완료" } # 환경 파일 설정 setup_environment() { log_info "환경 파일 설정 중..." if [ ! -f .env ]; then if [ -f env.synology.example ]; then cp env.synology.example .env log_warning ".env 파일이 생성되었습니다. 필수 설정을 수정하세요:" log_warning "- SECRET_KEY" log_warning "- POSTGRES_PASSWORD" log_warning "- CORS_ORIGINS (시놀로지 IP 추가)" echo read -p "환경 설정을 완료했습니까? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_error "환경 설정을 완료한 후 다시 실행하세요." exit 1 fi else log_error "env.synology.example 파일이 없습니다." exit 1 fi else log_success "기존 .env 파일을 사용합니다." fi } # 마이그레이션 파일 복사 copy_migrations() { log_info "데이터베이스 마이그레이션 파일 복사 중..." if [ -d backend/migrations ]; then sudo cp -r backend/migrations/* /volume3/docker/todo-project/config/migrations/ log_success "마이그레이션 파일 복사 완료" else log_warning "마이그레이션 파일이 없습니다." fi } # Docker 이미지 빌드 및 배포 deploy_application() { log_info "Todo-Project 배포 중..." # 기존 컨테이너 중지 및 제거 if docker-compose ps -q | grep -q .; then log_info "기존 컨테이너 중지 중..." docker-compose down fi # 이미지 빌드 및 컨테이너 시작 log_info "Docker 이미지 빌드 및 컨테이너 시작 중..." docker-compose up -d --build # 컨테이너 시작 대기 log_info "컨테이너 시작 대기 중..." sleep 30 # 헬스체크 log_info "서비스 상태 확인 중..." if curl -f http://localhost:9000/health &> /dev/null; then log_success "백엔드 서비스 정상 작동" else log_error "백엔드 서비스 오류" docker-compose logs backend exit 1 fi } # 배포 완료 안내 show_completion_info() { log_success "🎉 Todo-Project 시놀로지 배포 완료!" echo echo "=== 접속 정보 ===" echo "웹 인터페이스: http://$(hostname -I | awk '{print $1}'):${FRONTEND_PORT:-4000}" echo "API 서버: http://$(hostname -I | awk '{print $1}'):${BACKEND_PORT:-9000}" echo echo "=== 다음 단계 ===" echo "1. 웹 브라우저에서 접속하여 관리자 계정을 생성하세요" echo "2. 리버스 프록시 설정 (선택사항)" echo "3. 방화벽 설정 확인" echo echo "=== 유용한 명령어 ===" echo "로그 확인: docker-compose logs -f" echo "컨테이너 상태: docker-compose ps" echo "서비스 재시작: docker-compose restart" echo "완전 재배포: docker-compose down && docker-compose up -d --build" } # 메인 실행 함수 main() { echo "=== Todo-Project 시놀로지 배포 스크립트 ===" echo # 루트 권한 확인 if [ "$EUID" -ne 0 ]; then log_error "이 스크립트는 root 권한이 필요합니다. sudo로 실행하세요." exit 1 fi # 단계별 실행 check_synology_environment create_directories setup_environment copy_migrations deploy_application show_completion_info } # 스크립트 실행 main "$@"