#!/bin/bash # =================================================================== # TK Factory Services - 원격 롤백 스크립트 (맥북에서 실행) # =================================================================== # 사용법: ./scripts/rollback-remote.sh # 설정: ~/.tk-deploy-config # =================================================================== set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" CONFIG_FILE="$HOME/.tk-deploy-config" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' # === 인자 확인 === TARGET_HASH="${1:-}" if [ -z "$TARGET_HASH" ]; then echo "사용법: ./scripts/rollback-remote.sh " echo "" echo "예시:" echo " ./scripts/rollback-remote.sh abc1234" echo " ./scripts/rollback-remote.sh abc1234567890" echo "" echo "최근 커밋 목록:" cd "$(dirname "$0")/.." git log --oneline -10 exit 1 fi # === 설정 로드 === if [ ! -f "$CONFIG_FILE" ]; then echo -e "${RED}ERROR: 설정 파일이 없습니다: $CONFIG_FILE${NC}" exit 1 fi source "$CONFIG_FILE" for var in NAS_HOST NAS_USER NAS_DEPLOY_PATH NAS_SUDO_PASS; do if [ -z "${!var}" ]; then echo -e "${RED}ERROR: $CONFIG_FILE에 $var 가 설정되지 않았습니다${NC}" exit 1 fi done DOCKER="/usr/local/bin/docker" ssh_cmd() { ssh -o ConnectTimeout=10 "${NAS_USER}@${NAS_HOST}" "$@" } nas_docker() { ssh_cmd "cd ${NAS_DEPLOY_PATH} && echo '${NAS_SUDO_PASS}' | sudo -S ${DOCKER} $*" 2>&1 } # === 커밋 유효성 확인 === cd "$PROJECT_DIR" FULL_HASH=$(git rev-parse "$TARGET_HASH" 2>/dev/null || echo "") if [ -z "$FULL_HASH" ]; then echo -e "${RED}ERROR: 유효하지 않은 커밋 해시입니다: ${TARGET_HASH}${NC}" exit 1 fi TARGET_SHORT="${FULL_HASH:0:7}" TARGET_MSG=$(git log -1 --format='%s' "$FULL_HASH") TARGET_DATE=$(git log -1 --format='%ci' "$FULL_HASH") # === 현재 NAS 상태 확인 === echo "=== TK Factory Services - 원격 롤백 ===" echo "" NAS_HASH=$(ssh_cmd "cd ${NAS_DEPLOY_PATH} && git log -1 --format='%H'" 2>/dev/null || echo "") NAS_SHORT="${NAS_HASH:0:7}" NAS_MSG=$(ssh_cmd "cd ${NAS_DEPLOY_PATH} && git log -1 --format='%s'" 2>/dev/null) echo -e " NAS 현재: ${YELLOW}${NAS_SHORT}${NC} - ${NAS_MSG}" echo -e " 롤백 대상: ${CYAN}${TARGET_SHORT}${NC} - ${TARGET_MSG}" echo -e " 커밋 날짜: ${TARGET_DATE}" if [ "$FULL_HASH" = "$NAS_HASH" ]; then echo "" echo -e "${GREEN}이미 해당 버전입니다.${NC}" exit 0 fi echo "" read -p "롤백을 진행하시겠습니까? [y/N] " confirm if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then echo "롤백이 취소되었습니다." exit 0 fi # === 롤백 실행 === echo "" echo -e "${CYAN}[1/3] NAS 코드 롤백${NC}" ssh_cmd "cd ${NAS_DEPLOY_PATH} && git fetch origin && git checkout ${FULL_HASH}" echo -e " ${GREEN}완료${NC}" echo "" echo -e "${CYAN}[2/3] Docker 컨테이너 재빌드${NC}" echo " (빌드에 시간이 걸릴 수 있습니다...)" echo "" nas_docker "compose up -d --build" echo "" echo " nginx 프록시 컨테이너 재시작..." nas_docker "restart tk-gateway tk-system2-web tk-system3-web" echo "" echo -e "${CYAN}[3/3] 배포 검증${NC} (15초 대기)" sleep 15 echo "" echo "=== Container Status ===" nas_docker "compose ps --format 'table {{.Name}}\t{{.Status}}'" || true # 배포 로그 기록 TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') ssh_cmd "echo '${TIMESTAMP} | ${TARGET_SHORT} | ROLLBACK: ${TARGET_MSG}' >> ${NAS_DEPLOY_PATH}/DEPLOY_LOG" echo "" echo -e "${GREEN}롤백 완료!${NC}" echo " 버전: ${TARGET_SHORT} - ${TARGET_MSG}" echo "" echo -e "${YELLOW}주의: NAS가 detached HEAD 상태입니다.${NC}" echo " 다음 정상 배포 시 자동으로 main 브랜치로 복귀합니다."