본문으로 건너뛰기

Nexus Aibot 배포 및 서비스 설정 가이드

1. 디렉토리 구조 및 전제 조건

  • JAR 파일 위치: /sorc001/nexus/aibot/aibot.jar
  • 로그 디렉토리: /logs001/nexus/aibot
  • 실행 사용자: sleepzz

2. 필요 디렉토리 생성

sudo mkdir -p /logs001/nexus/aibot
sudo chown -R sleepzz:sleepzz /logs001/nexus/aibot

3. systemd 서비스 유닛 파일 생성

sudo nano /etc/systemd/system/nexus-aibot.service 명령어를 실행하여 아래 내용을 입력해.

서비스 유닛 예시 내용

[Unit]
Description=Nexus Aibot Module Service
After=network.target

[Service]
User=sleepzz
# 작업 디렉토리
WorkingDirectory=/sorc001/nexus/aibot

# .env 파일을 읽어서 환경변수로 주입
EnvironmentFile=/sorc001/nexus/.env

# 실행 명령어
# -Dserver.port=8002 : 포트 강제 지정
# -Dspring.profiles.active=prod : 프로필 지정
ExecStart=/usr/bin/java -jar -Dserver.port=8002 -Dspring.profiles.active=prod /sorc001/nexus/aibot/aibot.jar

SuccessExitStatus=143
Restart=on-failure
RestartSec=5

# 로그 경로 (/logs001/nexus/aibot)
StandardOutput=append:/logs001/nexus/aibot/output.log
StandardError=append:/logs001/nexus/aibot/error.log

[Install]
WantedBy=multi-user.target

4. 서비스 등록 및 실행

# 데몬 리로드
sudo systemctl daemon-reload

# 부팅 시 자동 실행 등록
sudo systemctl enable nexus-aibot

# 서비스 시작
sudo systemctl start nexus-aibot

# 상태 확인
sudo systemctl status nexus-aibot

# 수정이 필요할 때
sudo nano /etc/systemd/system/nexus-aibot.service

5. 수동으로 .env 파일 생성 (필요시)

1) 실행 경로로 이동

cd /sorc001/nexus

2) .env 파일 생성 (내용에 토큰 정보 입력)

sudo nano .env 실행 후 아래 예시 내용을 본인 설정에 맞게 수정하여 입력해.

# Discord Bot Token
DISCORD_TOKEN_DEV=YOUR_DEV_DISCORD_BOT_TOKEN_HERE
DISCORD_TOKEN_PROD=YOUR_PROD_DISCORD_BOT_TOKEN_HERE

# Google Gemini API Key
GEMINI_API_KEY=YOUR_GEMINI_API_KEY_HERE

# Github Token for Vault Push
NEXUS_VAULT_PUSH_TOKEN=YOUR_GITHUB_TOKEN_HERE

3) 권한 설정

# 소유자는 jenkins, 그룹은 sleepzz로 지정
sudo chown jenkins:sleepzz /sorc001/nexus/.env

# 소유자(jenkins)와 그룹(sleepzz) 모두 읽고 쓰기 가능하게 설정
sudo chmod 660 /sorc001/nexus/.env

6. Jenkins에게 특정 서비스 실행 권한 부여

1) visudo 실행

sudo visudo

2) Jenkins 권한 설정 추가

파일 하단에 아래 내용을 추가해 (여러 명령은 콤마로 구분).

jenkins ALL=(ALL) NOPASSWD: /bin/systemctl restart nexus-aibot, /bin/systemctl start nexus-aibot, /bin/systemctl stop nexus-aibot

3) Jenkins 스크립트에서 실행

NOPASSWD: 설정 덕분에 비밀번호 없이 실행 가능해.

sudo /bin/systemctl restart nexus-aibot

7. 실행 확인

배포 후 로그를 실시간으로 확인하려면 아래 명령어를 사용해.

tail -f /logs001/nexus/aibot/output.log

8. Jenkins Deployment Script

Jenkins 파이프라인이나 Execute shell에 사용할 스크립트야.

#!/bin/bash

set -e # ❗ 오류 발생 시 즉시 중단

# 변수 설정
APP_NAME="nexus-aibot" # 앱 이름
SERVICE_NAME="nexus-aibot" # 서비스 파일 이름
WORK_DIR="/sorc001/nexus/aibot"
LOG_DIR="/logs001/nexus/aibot"
REPO_URL="git@github.com:sleepzzzzz/nexus.git"

echo "==========================================="
echo "🚀 ${APP_NAME} 배포 시작 (Method 2: Pre-Clean)"
echo "==========================================="

echo "📁 초기화 작업 시작..."

# 로그 디렉토리 확인 및 생성
if [ ! -d "${LOG_DIR}" ]; then
echo " - 로그 디렉토리 생성: ${LOG_DIR}"
mkdir -p ${LOG_DIR}
fi

# tmp 폴더 유지 및 내용물만 비우기
if [ ! -d "${WORK_DIR}/tmp" ]; then
echo " - tmp 폴더가 없어서 새로 생성합니다."
mkdir -p "${WORK_DIR}/tmp"
else
echo " - 기존 tmp 폴더 내용 비우기 (폴더는 유지)..."
cd "${WORK_DIR}/tmp" && ls -A | xargs -r rm -rf
fi

# Git Clone
echo "⬇️ 소스 코드 다운로드..."
git clone ${REPO_URL} "${WORK_DIR}/tmp"

echo "🚀 모듈 빌드 시작 (aibot)..."
cd "${WORK_DIR}/tmp"

# 실행 권한 부여
chmod +x gradlew

# aibot 모듈만 빌드
./gradlew clean :module-aibot:bootJar

echo "📦 배포할 JAR 이동..."
# 기존 jar 덮어쓰기
cp module-aibot/build/libs/*.jar "${WORK_DIR}/aibot.jar"

echo "🔁 서비스 재시작..."
sudo systemctl daemon-reload
sudo systemctl restart ${SERVICE_NAME}

echo "✨ 임시 빌드 파일은 디버깅을 위해 보존됩니다: ${WORK_DIR}/tmp"
echo "✅ ${APP_NAME} 배포 완료!"