#!/usr/bin/env bash # # ITN-HUB 기동 스크립트 (nohup 방식). # # application.yml의 ${DB_URL} 같은 자리는 Spring이 "같은 이름의 환경변수"에서 찾아 채운다. # 그래서 java를 띄우기 전에 env 파일을 읽어 export 해두기만 하면 된다. # 비밀값을 java 명령 인자로 넘기면 `ps` 에 그대로 보이므로 반드시 환경변수로 준다. set -euo pipefail # ── 경로 (환경에 맞게 수정) ────────────────────────────────────────── JAVA_HOME_BIN=/home/hubAdmin/jdk-21.0.11/bin DEPLOY_PATH=/home/hubAdmin/deploy FILE_NM=itnhub-0.1.0.jar LOG_FILE_PATH=/home/hubAdmin/logs LOG_FILE_NM=itnhub.log PID_FILE=/home/hubAdmin/itnhub.pid # 서비스 포트. application.yml 기본값과 같은 8877이다. 여기만 바꾸면 기동·확인이 함께 따라간다. APP_PORT=8877 # 값이 든 파일. 소유자만 읽게 두고(chmod 600) 저장소에는 올리지 않는다. ENV_FILE=/home/hubAdmin/itnhub.env # ── 환경변수 주입 ──────────────────────────────────────────────────── if [ ! -f "$ENV_FILE" ]; then echo "환경변수 파일이 없습니다: $ENV_FILE" >&2 echo "deploy/itnhub.env.example 을 복사해 값을 채우세요." >&2 exit 1 fi # env 파일을 Windows에서 만들었다면 줄 끝에 캐리지 리턴(0x0D)이 남는다. 그대로 source 하면 # 값 끝에 그 문자가 붙어 DB 인증 실패나 포트 파싱 오류가 나고, 빈 줄에서는 # "command not found" 가 뜬다. 그래서 캐리지 리턴을 걷어낸 사본을 만들어 읽는다. # 원본 파일은 건드리지 않는다. ENV_TMP=$(mktemp) trap 'rm -f "$ENV_TMP"' EXIT tr -d '\015' < "$ENV_FILE" > "$ENV_TMP" # set -a 를 켜면 이후 대입되는 변수가 모두 export 된다(파일에 export를 안 써도 된다). set -a # shellcheck disable=SC1090 . "$ENV_TMP" set +a # 필수 8개가 비어 있으면 기동 도중에 죽으므로 여기서 먼저 걸러낸다. for v in DB_URL DB_USERNAME DB_PASSWORD MATTERMOST_URL MATTERMOST_TOKEN \ MATTERMOST_TEAM_ID APP_ADMIN_USERNAME APP_ADMIN_PASSWORD; do if [ -z "${!v:-}" ]; then echo "필수 환경변수가 비어 있습니다: $v ($ENV_FILE 확인)" >&2 exit 1 fi done # 서버 시간대가 UTC면 업무단계 도달 일시, 칸반의 D+n, 연락 이력 날짜가 9시간 어긋난다. export TZ="${TZ:-Asia/Seoul}" # Spring은 SERVER_PORT 환경변수를 server.port로 읽는다. # env 파일에 SERVER_PORT가 있으면 그 값이, 없으면 위의 APP_PORT가 쓰인다. export SERVER_PORT="${SERVER_PORT:-$APP_PORT}" JAVA_OPTS="${JAVA_OPTS:--Xms512m -Xmx1g -Duser.timezone=Asia/Seoul -Dfile.encoding=UTF-8}" # ── 중복 기동 방지 ─────────────────────────────────────────────────── if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then echo "이미 실행 중입니다 (PID $(cat "$PID_FILE")). 먼저 stop.sh 를 실행하세요." >&2 exit 1 fi mkdir -p "$LOG_FILE_PATH" # ── 기동 ───────────────────────────────────────────────────────────── # shellcheck disable=SC2086 # JAVA_OPTS는 여러 옵션이라 일부러 분리되게 둔다. nohup "$JAVA_HOME_BIN/java" $JAVA_OPTS -jar "$DEPLOY_PATH/$FILE_NM" \ >> "$LOG_FILE_PATH/$LOG_FILE_NM" 2>&1 & echo $! > "$PID_FILE" echo "기동 요청 완료 (PID $(cat "$PID_FILE"), 포트 $SERVER_PORT)" # ── 기동 확인 ──────────────────────────────────────────────────────── # actuator를 넣지 않아서 로그인 화면 200으로 확인한다. for _ in $(seq 1 60); do if curl -fs -o /dev/null "http://127.0.0.1:${SERVER_PORT}/login"; then echo "정상 기동 확인: http://127.0.0.1:${SERVER_PORT}/login" exit 0 fi sleep 1 done echo "60초 안에 응답이 없습니다. 로그를 확인하세요: $LOG_FILE_PATH/$LOG_FILE_NM" >&2 exit 1