posts

deploy.sh

Oct 1, 2025 updated Oct 1, 2025 architecturedeploymentdocker

#!/bin/bash
set -e

# 인자 검증: 반드시 'develop' 또는 'prod'를 인자로 입력
if [ $# -lt 1 ]; then
  echo "Usage: $0 [develop|prod]"
  exit 1
fi

profile=$(echo "$1" | tr '[:upper:]' '[:lower:]')

# 프로파일에 따라 변수 설정
case "$profile" in
  develop)
    EC2_HOST="<ec2-host>"
    COMPOSE_FILE="dev.compose.yml"
    ;;
  prod)
    EC2_HOST="<ec2-host>"
    COMPOSE_FILE="prod.compose.yml"
    ;;
  *)
    echo "Invalid profile. Please use 'develop' or 'prod'."
    exit 1
    ;;
esac

# -------------------------
# 변수 설정
# -------------------------
APP_NAME="tw-support-tools"
VERSION="latest"  # 필요 시 버전 파일에서 읽어올 수 있음
LOCAL_IMAGE_NAME="${APP_NAME}:${VERSION}"
REMOTE_IMAGE_PATH="/home/ec2-user/${APP_NAME}.tar"
# EC2에 전송할 compose 파일 경로 (EC2 쪽에 복사될 경로)
DOCKER_COMPOSE_PATH="/home/ec2-user/${COMPOSE_FILE}"
PEM_FILE="<deploy-key>.pem"      # EC2 접속용 PEM 파일 (경로 확인)
DEPLOY_USER="ec2-user"

echo "==== Profile: $profile ===="
echo "==== EC2 Host: $EC2_HOST ===="
echo "==== Compose File: $COMPOSE_FILE ===="

# -------------------------
# 1. Docker 이미지 빌드 (Linux/amd64 플랫폼으로 빌드)
# -------------------------
echo "==== Docker 이미지 빌드 (프로덕션) 시작 ===="
docker build --platform linux/amd64 -t "$LOCAL_IMAGE_NAME" -f docker/prod.dockerfile ..
echo "==== Docker 이미지 빌드 완료 ===="

# -------------------------
# 2. Docker 이미지 tar 파일로 저장
# -------------------------
echo "==== Docker 이미지 tar 파일로 저장 중 ===="
docker save -o "${APP_NAME}.tar" "$LOCAL_IMAGE_NAME"
echo "==== 이미지 저장 완료: ${APP_NAME}.tar ===="

# -------------------------
# 3. EC2에 파일 전송 (이미지 tar와 해당 compose 파일)

# -------------------------
echo "==== EC2에 파일 전송 시작 ===="
scp -i "$PEM_FILE" "${APP_NAME}.tar" "$DEPLOY_USER@$EC2_HOST:$REMOTE_IMAGE_PATH"
scp -i "$PEM_FILE" "docker/${COMPOSE_FILE}" "$DEPLOY_USER@$EC2_HOST:$DOCKER_COMPOSE_PATH"
echo "==== 파일 전송 완료 ===="

# 로컬 tar 파일 삭제 (선택 사항)
rm "${APP_NAME}.tar"

# -------------------------
# 4. EC2에서 이미지 로드 및 컨테이너 재시작
# -------------------------
echo "==== EC2에서 배포 실행 ===="
ssh -i "$PEM_FILE" "$DEPLOY_USER@$EC2_HOST" << 'EOF'
  set -e
  echo "==== 기존 컨테이너 종료 ===="
  docker-compose -f /home/ec2-user/compose*.yml down || true

  echo "==== 기존 이미지 삭제 ===="
  docker images --filter=reference='tw-support-tools:*' --format "{{.ID}}" | xargs -r docker rmi -f

  echo "==== Docker 이미지 로드 중 ===="
  docker load -i /home/ec2-user/tw-support-tools.tar

  echo "==== Docker Compose 실행 ===="
  docker-compose -f /home/ec2-user/compose*.yml up -d

  echo "==== 불필요한 Docker 리소스 정리 ===="
  docker system prune -f || true
EOF

echo "==== $profile 환경 배포 완료 ===="