Shellscript

소개

내가 쓰려고 만든 범용 스크립트

  • 빌드 스크립트
    • NextJS: deploy 폴더 생성
  • 배포 스크립트
    • Spring boot: S3를 이용한 JAR파일 다운로드 후, 실행
    • NextJS: S3를 이용한 ZIP 다운로드 후, Pm2 실행

NextJS Standalone 빌드 스크립트

Linux 용

bash
#!/bin/bash set -e APP_NAME="deploy" echo "🔨 Building Next.js..." npm run build #npm run build:dev #npm run build:prd echo "🧹 Cleaning old deploy directory..." rm -rf $APP_NAME mkdir -p $APP_NAME echo "📦 Copying standalone server..." cp -r .next/standalone/* $APP_NAME/ echo "📦 Copying static files..." mkdir -p $APP_NAME/.next cp -r .next/static $APP_NAME/.next/ echo "📦 Copying public folder..." cp -r public $APP_NAME/ echo "📦 Copying ecosystem config..." cp ecosystem.config.js $APP_NAME/ echo "✅ Standalone deploy package ready → ./$APP_NAME"

Windows 용

powershell
$APP_NAME = "deploy" Write-Host "🔨 Building Next.js..." npm run build # npx env-cmd -f .env.production npm run build # env-cmd -f .env.production npm run build Write-Host "🧹 Cleaning old deploy directory..." if (Test-Path $APP_NAME) { Remove-Item -Recurse -Force $APP_NAME } New-Item -ItemType Directory -Path $APP_NAME -Force | Out-Null Write-Host "📦 Copying standalone server..." Copy-Item -Recurse -Force ".next/standalone/*" $APP_NAME Write-Host "📦 Copying static files..." $nextPath = Join-Path $APP_NAME ".next" New-Item -ItemType Directory -Path $nextPath -Force | Out-Null Copy-Item -Recurse -Force ".next/static" $nextPath Write-Host "📦 Copying public folder..." Copy-Item -Recurse -Force "public" $APP_NAME Write-Host "📦 Copying ecosystem config..." Copy-Item -Force "ecosystem.config.js" $APP_NAME Write-Host "✅ Standalone deploy package ready → .\$APP_NAME"

배포 스크립트

  • 자주 쓰려고 만들어둔 쉘 스크립트

Spring Boot JAR 배포

bash
#!/bin/bash DEPLOY_PATH=/var/www/spring-boot LOG_PATH="$DEPLOY_PATH/deploy.log" echo "\n=== Deploy START ===" echo "\n=== Deploy START ===" >> $LOG_PATH # 변수 PORT=8080 EXTENSION=jar FILE_NAME=deploy FILE_FULLNAME="$FILE_NAME.$EXTENSION" FILE_PATH="$DEPLOY_PATH/$FILE_FULLNAME" TODAY=$(TZ=Asia/Seoul date +%Y%m%d) ITERATOR=0 TARGET_NAME="$FILE_NAME.$TODAY.$ITERATOR.$EXTENSION" TARGET_PATH="$DEPLOY_PATH/$TARGET_NAME" # 파일이 존재할 경우 루프를 돌며 인덱스 증가 while [ -e "$TARGET_PATH" ]; do ((ITERATOR++)) TARGET_NAME="$FILE_NAME_$TODAY.$ITERATOR.$EXTENSION" TARGET_PATH="$DEPLOY_PATH/$TARGET_NAME" echo "$ITERATOR" done # S3 정보 S3_PATH=s3://my-bucket/$FILE_FULLNAME # 기존 파일 백업 echo "[1] Backup File START" echo "[1] Backup File START" >> $LOG_PATH mv $FILE_PATH $TARGET_PATH echo "[1] Backup File COMPLETED - $FILE_FULLNAME -> $TARGET_NAME" echo "[1] Backup File COMPLETED - $FILE_FULLNAME -> $TARGET_NAME" >> $LOG_PATH # AWS S3 파일 가져오기 echo "[2] Download from AWS S3 START" echo "[2] Download from AWS S3 START" >> $LOG_PATH aws s3 cp $S3_PATH $FILE_PATH echo "[2] Downlaod from AWS S3 COMLETED - $S3_PATH -> $FILE_PATH" echo "[2] Downlaod from AWS S3 COMLETED - $S3_PATH -> $FILE_PATH" >> $LOG_PATH # 기존 실행한 프로세스 종료 echo "[3] Kill port START" echo "[3] Kill port START" >> $LOG_PATH fuser -k $PORT/tcp || true echo "[3] Kill port COMLETED" echo "[3] Kill port COMLETED" >> $LOG_PATH # 실행 단계 echo "[4] Jar START" echo "[4] Jar START" >> $LOG_PATH nohup java jar -Dspring.profiles.active=prd $FILE_PATH > /dev/null & echo "=== Deploy FINISHED ===" echo "=== Deploy FINISHED === >> $LOG_PATH

NextJS standalone 배포

bash
#!/bin/bash DEPLOY_PATH=/var/www/standalone LOG_PATH="$DEPLOY_PATH/deploy.log" echo "=== Deploy START ===" echo "=== Deploy START ===" >> $LOG_PATH # 변수 EXTENSION=zip PM2_NAME=my-service PM2_CONFIG="$DEPLOY_PATH/release/ecosystem.config.js" FILE_NAME=deploy FILE_FULLNAME="$FILE_NAME.$EXTENSION" FILE_PATH="$DEPLOY_PATH/$FILE_FULLNAME" TODAY=$(TZ=Asia/Seoul date +%Y%m%d) ITERATOR=0 TARGET_NAME="$FILE_NAME.$TODAY.$ITERATOR.$EXTENSION" TARGET_PATH="$DEPLOY_PATH/$TARGET_NAME" # 파일이 존재할 경우 루프를 돌며 인덱스 증가 while [ -e "$TARGET_PATH" ]; do ((ITERATOR++)) TARGET_NAME="$FILE_NAME.$TODAY.$ITERATOR.$EXTENSION" TARGET_PATH="$DEPLOY_PATH/$TARGET_NAME" echo "$ITERATOR" done # S3 정보 S3_PATH=s3://jm-s3-private/deploy/$FILE_FULLNAME # 기존 파일 백업 echo "[1] Backup File START" echo "[1] Backup File START" >> $LOG_PATH mv $FILE_PATH $TARGET_PATH echo "[1] Backup File COMPLETED - $FILE_FULLNAME -> $TARGET_NAME" echo "[1] Backup File COMPLETED - $FILE_FULLNAME -> $TARGET_NAME" >> $LOG_PATH # AWS S3 파일 가져오기 echo "[2] Download from AWS S3 START" echo "[2] Download from AWS S3 START" >> $LOG_PATH aws s3 cp $S3_PATH $FILE_PATH echo "[2] Downlaod from AWS S3 COMLETED - $S3_PATH -> $FILE_PATH" echo "[2] Downlaod from AWS S3 COMLETED - $S3_PATH -> $FILE_PATH" >> $LOG_PATH # 기존 directory 삭제 echo "[3] release dir remove START" echo "[3] release dir remove START" >> $LOG_PATH rm -rf $DEPLOY_PATH/release/ echo "[3] release dir remove COMLETED" echo "[3] release dir remove COMLETED" >> $LOG_PATH # 압축 파일 해제 echo "[4] unzip START" echo "[4] unzip START" >> $LOG_PATH unzip $FILE_PATH -d release/ echo "[4] unzip COMLETED" echo "[4] unzip COMLETED" >> $LOG_PATH # 실행 단계 echo "[5] pm2 START" echo "[5] pm2 START" >> $LOG_PATH if pm2 show "$PM2_NAME" > /dev/null 2>&1; then echo "$PM2_NAME is running or exists. Restart" echo "$PM2_NAME is running or exists. Restart" >> $LOG_PATH pm2 restart "$PM2_NAME" else pm2 start "$PM2_CONFIG" fi echo "=== Deploy FINISHED ===" echo "=== Deploy FINISHED ===" >> $LOG_PATH