본문 바로가기
개발툴

시놀로지 NAS에 웹 서버 배포 및 운영

by 탁구치는 개발자 2024. 5. 23.

 

사이드 프로젝트로 스크래핑 시스템을 만들어서 운영중에 있다.

원하는 사이트의 컨텐츠 정보를 주기적으로 스크래핑하여 메일이나 텔레그램으로 전송해 주는 역할을 하고 있는데 spring boot 기반으로 동작한다.

 

아래와 같이 매일 원하는 정보를 수신한다.

메일 수신함

 

수신된 정보를 열어보면 '조회수가 높은' or '투표수가 많은' 컨텐츠 데이터를 추출하여 메일로 전송해 준다.

메일 상세 내용

 

그럼 이제부터 스크래핑 시스템이 NAS 까지 어떻게 자동 배포되는지를 정리해 본다.

스크래핑 서버는 우리집 NAS에서 기동된다.

우리집 네트워크 환경

 

자동 배포되는 방식

  1. 코드 수정
  2. github 저장소에 push
  3. webhook 트리거 발생
  4. webhook 에 등록되어 있는 jenkins url로 HTTP POST 요청을 보냄
  5. jenkins 빌드 작업 시작
  6. jenkins에서 git 플러그인을 이용하여 github repository 최신 코드를 pull 받는다.
  7. 가져온 소스를 기반으로 빌드, 테스트 진행
  8. jar 파일 생성
  9. SSH 를 이용하여 jar 파일을 특정 디렉토리에 업로드
  10. shell script 실행하여 서버 restart 처리

나 혼자 사용하는 서비스 이기 때문에 최대한 간단한 방식으로 빌드 및 배포 구성하였다.

그럼 자동 배포를 하기 위한 각각의 설정들을 살펴보자.

 

 

Jenkins 설정

Jenkins가 NAS에 설치되어 있는 상태이다. (docker 로 운영)

배포되는 프로젝트의 Item은 기본적으로 만들어져 있다고 가정한다.

 

1. 생성되어 있는 프로젝트 아이템의 구성 메뉴 클릭

 

2. Github project에 체크, project url 입력

 

3. 소스 코드 관리 영역에서 Git 체크

Repository URL 을 입력하고, Credentials 정보 또한 추가해 준다.

배포 브랜치는 master 로 지정하였다.

 

4. 빌드 후 SSH 파일 업로드

빌드가 완료되면 jar 파일이 생성되고, 해당 파일을 SSH 프로토콜을 이용하여 특정 디렉토리에 업로드 한다.

업로드가 완료되면 Exec command 설정에 등록되어 있는 start_server.sh 스크립트가 동작하게 된다.

 

아래는 start_server.sh 코드이다.

demo_application 프로세스가 구동되어 있으면 kill 한 후, jenkins 로부터 전달 받은 BUILD_NUMBER 디렉토리를 생성한다.

생성한 디렉토리에 jar 파일을 위치시킨다.

BUILD_NUMBER 디렉토리에 심볼릭 링크를 생성해 준다.

마지막으로 java 명령어를 통해 spring boot 서버를 구동한다.

#!/bin/bash

if [ $# -ne 1 ]; then
        echo "script need 1 parameter"
        exit 1
fi

PID=$(ps -eaf | grep demo_application | grep -v grep | awk '{print $2}')
if [[ "" != "$PID" ]]; then
        echo "killing $PID"
        kill -9 $PID
fi

JAVA_HOME=/var/services/homes/demo/java/jdk-17
MY_APP_PATH=/var/services/homes/demo/app
MY_APP_FILE=demo_application.jar
BUILD_NUMBER=$1

mkdir -p ${MY_APP_PATH}/${BUILD_NUMBER}
cp ${MY_APP_PATH}/demo_application-0.0.1-SNAPSHOT.jar ${MY_APP_PATH}/${BUILD_NUMBER}/${MY_APP_FILE}

cd ${MY_APP_PATH}
rm -rf default
ln -s ${BUILD_NUMBER} default
cd default

nohup ${JAVA_HOME}/bin/java -jar -Xms512m -Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/services/homes/demo/app/heapdump -Dspring.profiles.active=live ${MY_APP_FILE} 1>/dev/null 2>&1 &

 

SSH 서버 설정은 Jenkins 관리 > System 에서 진행하면 된다.

 

5. telegram 배포 완료 메세지 전송 처리

정상적으로 배포가 완료됐는지를 확인하고 싶어 telegram 으로 배포 완료 메세지를 수신 받게 설정했다.

 

 

Github Webhook 설정

프로젝트 > Settings > Webhooks 설정에 들어가면 Payload URL을 입력할 수 있다.

jenkins 주소를 입력해 준다.

 

 

이것으로 끝이다.

정리해 보니 별로 한 게 없어 보이네?

내 기억으로 자동 배포를 구성할 때 삽질을 많이 했던 구간이 jenkins 셋팅이였다.

SSH 설정, 사용자 credentials 처리 등에서 애먹었던 기억이 새록새록 난다.

 

요즘에는 Github Actions Workflow 를 이용하여 빌드하고, 빌드된 jar 파일을 SSH를 이용하여 원격 서버로 전송할 수 있다고 한다.

시간날 때 Jenkins 를 빼고, Github Actions Workflow로 넘어가 봐야 겠다.