#!/usr/bin/env bash # ============================================================================== # 서버 일회성: BillCare → BizCare git/배포 경로 전환 # 실행 위치: stock 서버 (aidev) # ============================================================================== set -euo pipefail export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:${PATH:-/usr/bin:/bin}" OLD_BARE="/Volumes/ADATA/git/BillCare.git" NEW_BARE="/Volumes/ADATA/git/BizCare.git" OLD_WT="/Users/aidev/apps/BillCare" NEW_WT="/Users/aidev/apps/BizCare" DEPLOY_SRC_CANDIDATES=( "${NEW_WT}/scripts/deploy.sh" "${OLD_WT}/scripts/deploy.sh" ) HOOK_SRC_CANDIDATES=( "${NEW_WT}/scripts/post-receive" "${OLD_WT}/scripts/post-receive" ) DEPLOY_DST="/Volumes/ADATA/git/deploy-bizcare.sh" HOOK_DST="${NEW_BARE}/hooks/post-receive" OLD_HOOK="${OLD_BARE}/hooks/post-receive" LOG="/Volumes/ADATA/logs/deploy/bizcare-migrate.log" mkdir -p "$(dirname "$LOG")" "$NEW_WT" exec > >(tee -a "$LOG") 2>&1 echo "======================================================" echo " BillCare → BizCare 마이그레이션 $(date '+%Y-%m-%d %H:%M:%S')" echo "======================================================" [ -d "$OLD_BARE" ] || { echo "ERROR: $OLD_BARE 없음"; exit 1; } # 1) BizCare.git bare 생성 (없으면 BillCare 미러) if [ ! -d "$NEW_BARE" ]; then echo "[1] BizCare.git 미러 생성" git clone --mirror "$OLD_BARE" "$NEW_BARE" else echo "[1] BizCare.git 존재 — BillCare 내용 fetch" git --git-dir="$NEW_BARE" fetch --all --prune || true # BillCare 최신 main 반영 git --git-dir="$NEW_BARE" fetch "$OLD_BARE" '+refs/heads/*:refs/heads/*' || true fi # 2) work-tree 동기화 echo "[2] work-tree 체크아웃 → $NEW_WT" git --git-dir="$NEW_BARE" --work-tree="$NEW_WT" checkout -f main # 3) deploy-bizcare.sh 설치 DEPLOY_SRC="" for c in "${DEPLOY_SRC_CANDIDATES[@]}"; do if [ -f "$c" ]; then DEPLOY_SRC="$c"; break; fi done [ -n "$DEPLOY_SRC" ] || { echo "ERROR: deploy.sh 소스 없음"; exit 1; } cp "$DEPLOY_SRC" "$DEPLOY_DST" chmod +x "$DEPLOY_DST" # BillCare 이름 스크립트도 동일 내용으로 맞춤 (구 훅 호환) cp "$DEPLOY_DST" /Volumes/ADATA/git/deploy-billcare.sh chmod +x /Volumes/ADATA/git/deploy-billcare.sh echo "[3] deploy-bizcare.sh 설치: $DEPLOY_DST" # 4) BizCare post-receive 설치 HOOK_SRC="" for c in "${HOOK_SRC_CANDIDATES[@]}"; do if [ -f "$c" ]; then HOOK_SRC="$c"; break; fi done [ -n "$HOOK_SRC" ] || { echo "ERROR: post-receive 소스 없음"; exit 1; } mkdir -p "$(dirname "$HOOK_DST")" cp "$HOOK_SRC" "$HOOK_DST" chmod +x "$HOOK_DST" echo "[4] BizCare post-receive 설치" # 5) BillCare.git 훅 → BizCare work-tree/배포로 리다이렉트 (구 remote 호환) cat > "$OLD_HOOK" <<'EOF' #!/usr/bin/env bash # BillCare.git 수신 → BizCare work-tree / deploy-bizcare.sh 로 위임 set -euo pipefail export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:${PATH:-/usr/bin:/bin}" # 수신은 BillCare.git 이지만 배포 정본은 BizCare export GIT_DIR="/Volumes/ADATA/git/BillCare.git" export WORK_TREE="/Users/aidev/apps/BizCare" DEPLOY_SCRIPT="/Volumes/ADATA/git/deploy-bizcare.sh" DEPLOY_LOG="/Volumes/ADATA/logs/deploy/bizcare-deploy.log" HOOK_TAG="[billcare→bizcare-post-receive]" mkdir -p "$(dirname "$DEPLOY_LOG")" "$WORK_TREE" echo "" echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG BillCare.git 수신 → BizCare 배포로 위임" while read -r OLDREV NEWREV REFNAME; do BRANCH_NAME="${REFNAME#refs/heads/}" echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG 브랜치: $BRANCH_NAME" # BizCare.git 에도 동일 커밋 반영 (정본 bare 동기화) if [ -d /Volumes/ADATA/git/BizCare.git ]; then git --git-dir=/Volumes/ADATA/git/BizCare.git fetch "$GIT_DIR" "+${REFNAME}:${REFNAME}" 2>/dev/null || true fi if [ "$BRANCH_NAME" = "main" ]; then export SERVICE_NAME="${SERVICE_NAME:-all}" # deploy 스크립트가 BizCare.git 을 기본으로 쓰므로 정본으로 전환 export GIT_DIR="/Volumes/ADATA/git/BizCare.git" if [ ! -x "$DEPLOY_SCRIPT" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG [ERROR] $DEPLOY_SCRIPT 없음" exit 1 fi "$DEPLOY_SCRIPT" 2>&1 | tee -a "$DEPLOY_LOG" EXIT_CODE=${PIPESTATUS[0]} [ "$EXIT_CODE" -eq 0 ] || exit "$EXIT_CODE" echo "$(date '+%Y-%m-%d %H:%M:%S') $HOOK_TAG 배포 완료 → https://bizcare.exdev.co.kr" fi done EOF chmod +x "$OLD_HOOK" echo "[5] BillCare.git 훅을 BizCare 배포 위임으로 교체" # 6) 구 billcare 컨테이너 정리 (포트 83/18082/3308 확보) echo "[6] 구 billcare 컨테이너 중지 + DB 볼륨 보존" if [ -f "$OLD_WT/docker-compose.yml" ]; then (cd "$OLD_WT" && docker compose down --remove-orphans) || true fi docker rm -f billcare-frontend billcare-backend billcare-mysql 2>/dev/null || true docker rm -f bizcare-frontend bizcare-backend bizcare-mysql 2>/dev/null || true # 라이브 데이터가 billcare_billcare_mysql 에 있으면 bizcare 프로젝트 볼륨으로 복사 LIVE_DB="billcare_billcare_mysql" LIVE_UP="billcare_billcare_uploads" NEW_DB="bizcare_bizcare_mysql" NEW_UP="bizcare_bizcare_uploads" if docker volume inspect "$LIVE_DB" >/dev/null 2>&1; then echo "[6b] MySQL 볼륨 복사: $LIVE_DB → $NEW_DB" docker volume create "$NEW_DB" >/dev/null docker run --rm -v "$LIVE_DB":/from:ro -v "$NEW_DB":/to alpine:3.20 \ sh -c 'if [ ! -f /to/ibdata1 ]; then cp -a /from/. /to/; echo copied-db; else echo target-db-exists-skip; fi' fi if docker volume inspect "$LIVE_UP" >/dev/null 2>&1; then echo "[6c] uploads 볼륨 복사: $LIVE_UP → $NEW_UP" docker volume create "$NEW_UP" >/dev/null docker run --rm -v "$LIVE_UP":/from:ro -v "$NEW_UP":/to alpine:3.20 \ sh -c 'mkdir -p /to; cp -a /from/. /to/; echo copied-uploads' fi # 7) BizCare 배포 실행 echo "[7] BizCare 배포 실행" export GIT_DIR="$NEW_BARE" export WORK_TREE="$NEW_WT" export SERVICE_NAME=all "$DEPLOY_DST" echo "======================================================" echo " 마이그레이션 완료" echo " bare : $NEW_BARE" echo " wt : $NEW_WT" echo " URL : https://bizcare.exdev.co.kr" echo " 로컬: git remote set-url origin ssh://aidev@stock.exdev.co.kr/Volumes/ADATA/git/BizCare.git" echo "======================================================"