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} 배포 완료!"