#!/bin/bash # API 서버 배포 및 실행 스크립트 # 사용법: sudo ./runApi.sh # 필요한 경로/파일이 다를 경우 아래 변수만 수정하세요. set -euo pipefail JAR_NAME="${JAR_NAME:-apiServer-0.0.1-SNAPSHOT.jar}" PID_FILE="${PID_FILE:-/home/api.pid}" RUN_DIR="${RUN_DIR:-/home/run}" BUILD_DIR="${BUILD_DIR:-/home/build}" BACKUP_DIR="${BACKUP_DIR:-/home/backup}" JAVA_BIN="${JAVA_BIN:-/home/openjdk17/bin/java}" # SCOUTER_AGENT="${SCOUTER_AGENT:-/home/scouter/agent.java/scouter.agent.jar}" # SCOUTER_CONF="${SCOUTER_CONF:-/home/scouter/agent.java/conf/scouter.conf}" SPRING_PROFILE="${SPRING_PROFILE:-real}" timestamp() { date +"%Y%m%d_%H%M%S" } log() { echo "[runApi] $*" } ensure_paths() { mkdir -p "$RUN_DIR" "$BACKUP_DIR" "$BUILD_DIR" } stop_app() { if [[ -f "$PID_FILE" ]]; then local pid pid=$(cat "$PID_FILE" 2>/dev/null || true) if [[ -n "${pid:-}" ]] && ps -p "$pid" > /dev/null 2>&1; then log "기존 프로세스 종료: $pid" kill -9 "$pid" || true else log "PID 파일은 있으나 실행 중인 프로세스가 없습니다." fi rm -f "$PID_FILE" else log "종료할 PID 파일이 없습니다." fi } backup_old() { local current="$RUN_DIR/$JAR_NAME" if [[ -f "$current" ]]; then local backup="$BACKUP_DIR/oldApi_$(timestamp).jar" log "기존 JAR 백업 -> $backup" mv "$current" "$backup" else log "백업할 기존 JAR이 없습니다." fi } copy_new() { local source="$BUILD_DIR/$JAR_NAME" local target="$RUN_DIR/$JAR_NAME" # 소스와 타겟이 같으면 복사 불필요 if [[ "$source" == "$target" ]]; then if [[ -f "$target" ]]; then log "배포된 JAR 확인 -> $target" return 0 else log "새 JAR을 찾을 수 없습니다: $target" exit 1 fi fi if [[ ! -f "$source" ]]; then log "새 JAR을 찾을 수 없습니다: $source" exit 1 fi log "새 JAR 복사 -> $target" cp "$source" "$target" } start_app() { local target="$RUN_DIR/$JAR_NAME" log "애플리케이션 시작" local log_dir="${LOG_DIR:-/home/log/core}" local log_file="${LOG_FILE:-$log_dir/apiServer.log}" mkdir -p "$log_dir" nohup "$JAVA_BIN" \ -Duser.timezone=GMT+09:00 \ -Dspring.profiles.active="$SPRING_PROFILE" \ -jar "$target" \ >> "$log_file" 2>&1 & echo $! > "$PID_FILE" log "시작 완료 (PID: $(cat "$PID_FILE"))" } main() { ensure_paths stop_app backup_old copy_new start_app log "배포 완료" } main "$@"