- Express.js 기반 백엔드 API 서버 - MariaDB, Redis, phpMyAdmin Docker 환경 - Device 관리 기본 CRUD 구현 - Mac Mini M4 Pro 전용 설정 및 배포 스크립트 - 자동화된 설치 및 배포 시스템 - 완전한 문서화 및 실행 가이드
154 lines
5.2 KiB
Bash
154 lines
5.2 KiB
Bash
#!/bin/bash
|
|
|
|
# Mac Mini 홈 관리 시스템 배포 스크립트
|
|
|
|
set -e
|
|
|
|
# 설정
|
|
IMAGE_NAME="home-management-api"
|
|
CONTAINER_NAME="home_api"
|
|
BACKUP_DIR="/Users/hyungi/home-management-backups"
|
|
LOG_FILE="/Users/hyungi/home-management-logs/deploy.log"
|
|
COMMIT_HASH=${1:-"latest"}
|
|
DEPLOYMENT_ID=${2:-$(date +%Y%m%d_%H%M%S)}
|
|
|
|
# 로그 디렉토리 생성
|
|
mkdir -p "$(dirname "$LOG_FILE")"
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
echo "$(date): Mac Mini 배포 시작 - $DEPLOYMENT_ID (commit: $COMMIT_HASH)" | tee -a "$LOG_FILE"
|
|
|
|
# 배포 상태 보고 함수
|
|
function report_status() {
|
|
local status=$1
|
|
local message=$2
|
|
echo "$(date): [$status] $message" | tee -a "$LOG_FILE"
|
|
|
|
# 향후 Gitea webhook으로 상태 보고 가능
|
|
# curl -s -X POST http://git.hyungi.net/api/deployments/update \
|
|
# -H "Content-Type: application/json" \
|
|
# -d "{\"deployment_id\": \"$DEPLOYMENT_ID\", \"status\": \"$status\", \"message\": \"$message\"}" || true
|
|
}
|
|
|
|
# 1. Git 최신 코드 가져오기
|
|
report_status "pulling" "Git 최신 코드 가져오는 중"
|
|
git fetch origin
|
|
git reset --hard origin/main
|
|
|
|
# 2. 현재 컨테이너 상태 확인 및 백업
|
|
if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then
|
|
echo "현재 실행 중인 컨테이너 백업 중..." | tee -a "$LOG_FILE"
|
|
BACKUP_TAG="backup-$(date +%Y%m%d-%H%M%S)"
|
|
docker commit $CONTAINER_NAME $IMAGE_NAME:$BACKUP_TAG
|
|
report_status "backing_up" "백업 생성: $BACKUP_TAG"
|
|
|
|
# Graceful shutdown
|
|
echo "서비스 정리 중..." | tee -a "$LOG_FILE"
|
|
docker-compose -f docker-compose.mac-mini.yml down
|
|
fi
|
|
|
|
# 3. 새 이미지 빌드
|
|
report_status "building" "Docker 이미지 빌드 중"
|
|
docker-compose -f docker-compose.mac-mini.yml build --no-cache
|
|
|
|
# 4. 데이터베이스 및 Redis 시작
|
|
report_status "starting_db" "데이터베이스 서비스 시작 중"
|
|
docker-compose -f docker-compose.mac-mini.yml up -d mariadb redis
|
|
|
|
# 데이터베이스 연결 대기
|
|
echo "데이터베이스 연결 대기 중..." | tee -a "$LOG_FILE"
|
|
sleep 30
|
|
|
|
# 5. 새 API 컨테이너 시작
|
|
report_status "starting_api" "API 서버 시작 중"
|
|
docker-compose -f docker-compose.mac-mini.yml up -d api phpmyadmin
|
|
|
|
# 6. 헬스체크
|
|
report_status "health_check" "헬스체크 수행 중"
|
|
sleep 15
|
|
|
|
HEALTH_CHECK_PASSED=false
|
|
for i in {1..30}; do
|
|
if curl -f -s http://localhost:3000/health > /dev/null 2>&1; then
|
|
# API 기능 테스트
|
|
if curl -f -s http://localhost:3000/api/devices > /dev/null 2>&1; then
|
|
echo "$(date): 배포 성공!" | tee -a "$LOG_FILE"
|
|
report_status "success" "배포 완료"
|
|
HEALTH_CHECK_PASSED=true
|
|
|
|
# 성공 시 시스템 정보 기록
|
|
echo "시스템 정보:" | tee -a "$LOG_FILE"
|
|
docker-compose -f docker-compose.mac-mini.yml ps | tee -a "$LOG_FILE"
|
|
|
|
# 오래된 백업 이미지 정리 (7개 이상)
|
|
docker images | grep "$IMAGE_NAME:backup" | tail -n +8 | \
|
|
awk '{print $1":"$2}' | xargs -r docker rmi 2>/dev/null || true
|
|
|
|
break
|
|
fi
|
|
fi
|
|
echo "서비스 시작 대기 중... ($i/30)" | tee -a "$LOG_FILE"
|
|
sleep 2
|
|
done
|
|
|
|
# 7. 실패시 롤백
|
|
if [ "$HEALTH_CHECK_PASSED" = false ]; then
|
|
echo "$(date): 배포 실패! 롤백 진행 중..." | tee -a "$LOG_FILE"
|
|
report_status "rolling_back" "배포 실패, 롤백 중"
|
|
|
|
docker-compose -f docker-compose.mac-mini.yml down
|
|
|
|
# 최신 백업으로 롤백
|
|
LATEST_BACKUP=$(docker images | grep "$IMAGE_NAME:backup" | head -1 | awk '{print $2}')
|
|
if [ ! -z "$LATEST_BACKUP" ]; then
|
|
echo "백업 이미지로 롤백: $LATEST_BACKUP" | tee -a "$LOG_FILE"
|
|
|
|
# 백업 이미지로 임시 컨테이너 실행
|
|
docker run -d \
|
|
--name $CONTAINER_NAME \
|
|
--network host \
|
|
--restart unless-stopped \
|
|
-v /Users/hyungi/home-management-logs:/app/logs \
|
|
-v /Users/hyungi/home-management-data:/app/data \
|
|
-e NODE_ENV=production \
|
|
-e DB_HOST=localhost \
|
|
-e REDIS_HOST=localhost \
|
|
$IMAGE_NAME:backup-$LATEST_BACKUP
|
|
|
|
report_status "rolled_back" "롤백 완료: backup-$LATEST_BACKUP"
|
|
else
|
|
report_status "failed" "롤백 실패 - 백업 이미지 없음"
|
|
fi
|
|
|
|
exit 1
|
|
fi
|
|
|
|
# 8. 배포 후 정리 작업
|
|
echo "배포 후 정리 작업 중..." | tee -a "$LOG_FILE"
|
|
|
|
# 시스템 상태 확인
|
|
echo "=== 시스템 상태 ===" | tee -a "$LOG_FILE"
|
|
docker-compose -f docker-compose.mac-mini.yml ps | tee -a "$LOG_FILE"
|
|
|
|
echo "=== 디스크 사용량 ===" | tee -a "$LOG_FILE"
|
|
df -h | tee -a "$LOG_FILE"
|
|
|
|
echo "=== 메모리 사용량 ===" | tee -a "$LOG_FILE"
|
|
docker stats --no-stream | tee -a "$LOG_FILE"
|
|
|
|
# 네트워크 정보
|
|
echo "=== 네트워크 정보 ===" | tee -a "$LOG_FILE"
|
|
ifconfig | grep "inet " | grep -v 127.0.0.1 | tee -a "$LOG_FILE"
|
|
|
|
echo "🎉 Mac Mini 배포 완료!"
|
|
echo ""
|
|
echo "📊 접속 정보:"
|
|
echo "- API 서버: http://localhost:3000"
|
|
echo "- phpMyAdmin: http://localhost:8080"
|
|
echo ""
|
|
echo "🔍 상태 확인:"
|
|
echo "curl http://localhost:3000/health"
|
|
echo ""
|
|
echo "📝 로그 확인:"
|
|
echo "tail -f $LOG_FILE"
|
|
echo "docker-compose -f docker-compose.mac-mini.yml logs -f api" |