diff --git a/scripts/prod/start-all-linux-force.sh b/scripts/prod/start-all-linux-force.sh new file mode 100755 index 00000000..908d3fd5 --- /dev/null +++ b/scripts/prod/start-all-linux-force.sh @@ -0,0 +1,288 @@ +#!/bin/bash + +echo "============================================" +echo "WACE 솔루션 - 전체 서비스 시작 (강제 업데이트) - Linux" +echo "============================================" + +echo "" +echo "🚀 최신 코드로 백엔드와 프론트엔드를 강제 업데이트하여 시작합니다..." +echo "" + +# 시스템 정보 출력 +echo "시스템 정보:" +echo " OS: $(uname -s)" +echo " Architecture: $(uname -m)" +echo " Kernel: $(uname -r)" +echo "" + +# Docker 및 Docker Compose 버전 확인 +echo "Docker 환경 확인:" +docker --version 2>/dev/null || echo " ❌ Docker가 설치되지 않았습니다." +docker-compose --version 2>/dev/null || echo " ❌ Docker Compose가 설치되지 않았습니다." +echo "" + +# Git 상태 확인 +echo "============================================" +echo "0. Git 상태 확인 및 최신 코드 동기화" +echo "============================================" + +echo "현재 Git 상태:" +git status --porcelain + +echo "" +echo "현재 브랜치: $(git branch --show-current)" +echo "최신 커밋: $(git log -1 --oneline)" + +# 수정된 파일이 있는지 확인 +if [ -n "$(git status --porcelain)" ]; then + echo "" + echo "⚠️ 수정된 파일이 있습니다. 다음 중 선택하세요:" + echo "1. 수정사항을 커밋하고 계속" + echo "2. 수정사항을 임시 저장(stash)하고 계속" + echo "3. 수정사항을 무시하고 강제 리셋 후 계속" + echo "4. 현재 상태로 빌드 계속" + echo "" + read -p "선택하세요 (1-4): " choice + + case $choice in + 1) + echo "변경사항을 커밋합니다..." + git add . + git commit -m "Auto commit before deployment - $(date)" + ;; + 2) + echo "변경사항을 임시 저장합니다..." + git stash push -m "Auto stash before deployment - $(date)" + ;; + 3) + echo "변경사항을 무시하고 강제 리셋합니다..." + git reset --hard HEAD + git clean -fd + ;; + 4) + echo "현재 상태로 계속합니다..." + ;; + *) + echo "잘못된 선택입니다. 현재 상태로 계속합니다..." + ;; + esac +fi + +# 원격 저장소에서 최신 코드 가져오기 +echo "" +echo "원격 저장소에서 최신 코드를 가져옵니다..." +git fetch origin +current_branch=$(git branch --show-current) +git pull origin $current_branch || echo "⚠️ Pull 실패 - 현재 상태로 계속합니다." + +# 기존 컨테이너 및 이미지 완전 정리 +echo "" +echo "============================================" +echo "1. 기존 서비스 완전 정리 중..." +echo "============================================" + +# 모든 관련 컨테이너 중지 및 제거 +echo "기존 컨테이너 중지 및 제거 중..." +docker-compose -f docker/prod/docker-compose.backend.prod.yml down -v --remove-orphans 2>/dev/null || true +docker-compose -f docker/prod/docker-compose.frontend.prod.yml down -v --remove-orphans 2>/dev/null || true + +# 관련 컨테이너 강제 제거 +docker stop pms-backend-prod pms-frontend-linux 2>/dev/null || true +docker rm pms-backend-prod pms-frontend-linux 2>/dev/null || true + +# 관련 이미지 제거 (캐시 무효화) +echo "기존 이미지 제거 중..." +docker rmi $(docker images | grep -E "(pms-|erp-node)" | awk '{print $3}') 2>/dev/null || true + +# Docker 시스템 정리 +echo "Docker 시스템 정리 중..." +docker system prune -f --volumes 2>/dev/null || true +docker builder prune -f 2>/dev/null || true + +# 네트워크 재생성 +echo "네트워크 재생성..." +docker network rm pms-network 2>/dev/null || true +docker network create pms-network 2>/dev/null || echo "네트워크 생성 실패 - 기본 네트워크 사용" + +# 백엔드 먼저 시작 +echo "" +echo "============================================" +echo "2. 백엔드 서비스 시작 중..." +echo "============================================" + +# 백엔드 의존성 체크 +echo "백엔드 의존성 확인 중..." +if [ ! -f "backend-node/package.json" ]; then + echo "❌ backend-node/package.json을 찾을 수 없습니다." + exit 1 +fi + +if [ ! -f "backend-node/src/app.ts" ]; then + echo "❌ backend-node/src/app.ts를 찾을 수 없습니다." + exit 1 +fi + +# 백엔드 빌드 (캐시 무시) +echo "백엔드 이미지 빌드 중... (캐시 무시)" +docker-compose -f docker/prod/docker-compose.backend.prod.yml build --no-cache --pull + +if [ $? -ne 0 ]; then + echo "❌ 백엔드 빌드 실패" + exit 1 +fi + +echo "백엔드 서비스 시작 중..." +docker-compose -f docker/prod/docker-compose.backend.prod.yml up -d + +echo "" +echo "⏳ 백엔드 서비스 안정화 대기 중... (45초)" +sleep 45 + +# 백엔드 상태 확인 +echo "백엔드 서비스 상태 확인:" +docker-compose -f docker/prod/docker-compose.backend.prod.yml ps + +# 백엔드 로그 확인 +echo "" +echo "백엔드 최근 로그:" +docker-compose -f docker/prod/docker-compose.backend.prod.yml logs --tail=10 + +# 프론트엔드 시작 +echo "" +echo "============================================" +echo "3. 프론트엔드 서비스 시작 중..." +echo "============================================" + +# 프론트엔드 의존성 체크 +echo "프론트엔드 의존성 확인 중..." +if [ ! -f "frontend/package.json" ]; then + echo "❌ frontend/package.json을 찾을 수 없습니다." + exit 1 +fi + +if [ ! -f "frontend/next.config.mjs" ]; then + echo "❌ frontend/next.config.mjs를 찾을 수 없습니다." + exit 1 +fi + +echo "프론트엔드 이미지 빌드 중... (캐시 무시)" +docker-compose -f docker/prod/docker-compose.frontend.prod.yml build --no-cache --pull + +if [ $? -ne 0 ]; then + echo "❌ 프론트엔드 빌드 실패" + exit 1 +fi + +echo "프론트엔드 서비스 시작 중..." +docker-compose -f docker/prod/docker-compose.frontend.prod.yml up -d + +echo "" +echo "⏳ 프론트엔드 서비스 안정화 대기 중... (30초)" +sleep 30 + +# 프론트엔드 상태 확인 +echo "프론트엔드 서비스 상태 확인:" +docker-compose -f docker/prod/docker-compose.frontend.prod.yml ps + +# 프론트엔드 로그 확인 +echo "" +echo "프론트엔드 최근 로그:" +docker-compose -f docker/prod/docker-compose.frontend.prod.yml logs --tail=10 + +echo "" +echo "============================================" +echo "🎉 모든 서비스가 시작되었습니다!" +echo "============================================" +echo "" +echo "📊 서비스 접속 정보:" +echo " [DATABASE] PostgreSQL: http://39.117.244.52:11132" +echo " [BACKEND] Spring Boot: http://localhost:8080/api" +echo " [FRONTEND] Next.js: http://localhost:5555" +echo "" + +# 서비스 헬스체크 +echo "" +echo "🏥 서비스 헬스체크 수행 중..." +echo "" + +# 백엔드 헬스체크 (최대 2분 대기) +echo "백엔드 헬스체크..." +backend_healthy=false +for i in {1..24}; do + if curl -s -f http://localhost:8080/health >/dev/null 2>&1; then + echo " ✅ 백엔드 서비스 정상" + backend_healthy=true + break + else + echo " ⏳ 백엔드 응답 대기 중... ($i/24)" + sleep 5 + fi +done + +if [ "$backend_healthy" = false ]; then + echo " ❌ 백엔드 헬스체크 실패" + echo " 백엔드 로그:" + docker-compose -f docker/prod/docker-compose.backend.prod.yml logs --tail=20 +fi + +# 프론트엔드 헬스체크 (최대 1분 대기) +echo "프론트엔드 헬스체크..." +frontend_healthy=false +for i in {1..12}; do + if curl -s -f http://localhost:5555 >/dev/null 2>&1; then + echo " ✅ 프론트엔드 서비스 정상" + frontend_healthy=true + break + else + echo " ⏳ 프론트엔드 응답 대기 중... ($i/12)" + sleep 5 + fi +done + +if [ "$frontend_healthy" = false ]; then + echo " ❌ 프론트엔드 헬스체크 실패" + echo " 프론트엔드 로그:" + docker-compose -f docker/prod/docker-compose.frontend.prod.yml logs --tail=20 +fi + +# 최종 상태 요약 +echo "" +echo "============================================" +echo "🎯 배포 완료 요약" +echo "============================================" +echo "" +echo "Git 정보:" +echo " 브랜치: $(git branch --show-current)" +echo " 커밋: $(git log -1 --oneline)" +echo " 상태: $(git status --porcelain | wc -l) 개의 수정된 파일" +echo "" +echo "서비스 상태:" +if [ "$backend_healthy" = true ]; then + echo " ✅ 백엔드: 정상" +else + echo " ❌ 백엔드: 오류" +fi + +if [ "$frontend_healthy" = true ]; then + echo " ✅ 프론트엔드: 정상" +else + echo " ❌ 프론트엔드: 오류" +fi + +echo "" +echo "🔧 유용한 명령어:" +echo " 전체 로그 확인: docker-compose -f docker/prod/docker-compose.backend.prod.yml -f docker/prod/docker-compose.frontend.prod.yml logs -f" +echo " 백엔드 로그: docker-compose -f docker/prod/docker-compose.backend.prod.yml logs -f" +echo " 프론트엔드 로그: docker-compose -f docker/prod/docker-compose.frontend.prod.yml logs -f" +echo " 컨테이너 상태: docker ps" +echo " 서비스 중지: ./stop-all-linux.sh" +echo "" + +if [ "$backend_healthy" = true ] && [ "$frontend_healthy" = true ]; then + echo "🎯 성공! 브라우저에서 http://localhost:5555 을 확인하세요." +else + echo "⚠️ 일부 서비스에 문제가 있습니다. 로그를 확인해주세요." +fi + +echo "" +read -p "계속하려면 Enter 키를 누르세요..." diff --git a/scripts/prod/start-all-linux.sh b/scripts/prod/start-all-linux.sh index cf2d90fb..a2de431f 100644 --- a/scripts/prod/start-all-linux.sh +++ b/scripts/prod/start-all-linux.sh @@ -45,7 +45,7 @@ docker network create pms-network 2>/dev/null || echo "네트워크가 이미 # 백엔드 빌드 및 시작 echo "백엔드 이미지 빌드 중..." -docker-compose -f docker/prod/docker-compose.backend.prod.yml build --no-cache +docker-compose -f docker/prod/docker-compose.backend.prod.yml build --no-cache --pull echo "백엔드 서비스 시작 중..." docker-compose -f docker/prod/docker-compose.backend.prod.yml up -d @@ -65,7 +65,7 @@ echo "2. 프론트엔드 서비스 시작 중..." echo "============================================" echo "프론트엔드 이미지 빌드 중..." -docker-compose -f docker/prod/docker-compose.frontend.prod.yml build --no-cache +docker-compose -f docker/prod/docker-compose.frontend.prod.yml build --no-cache --pull echo "프론트엔드 서비스 시작 중..." docker-compose -f docker/prod/docker-compose.frontend.prod.yml up -d