개발 환경 서버에 구축하기 - ssh, rsync, fswatch, pm2

김지섭·2024년 1월 30일
0

MSA 아키텍처를 이용해서 총 24개의 pod를 운영해야되는 서비스를 개발중인데, 이를 모두 로컬 환경에 구축하고 개발을 하고 있었다. 코드 저장을 하면, 재시작이 되면서 Bootstrap 코드가 새로 돌게 되고, kafka에 새로 붙으면서 rebalance 되는 등 CPU 자원을 상당히 차지하고 있었고, 로컬 개발 환경 전체가 버벅이는 등 스트레스를 상당히 받고 있었다.

이에 따라서 실시간으로 코드 수정을 하면서 테스트를 해볼 수 있는 서버를 별도로 구축하여 rsync로 실시간 파일을 동기화하도록 구축하는 과정을 기록하면서 구성해보고자 한다.

rsync

로컬 환경의 코드를 서버로 실시간 전달을 하기 위해서 rsync를 사용할 예정이다.

MacOS 로컬 환경 설치

맥에는 기본적으로 설치되어있지만 최신버전을 사용하는 방법은 다음과 같다.

# Homebrew 설치
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# rsync 설치
brew install rsync

필자는 기본적으로 version 2.6.9 protocol version 29 가 설치되어있었고, brew 설치 이후 version 3.2.7 protocol version 31가 설치되었다. (2024.01. 기준)

Ubuntu 서버 환경 설치

서버에도 다음과 같이 설치한다.

sudo apt update
sudo apt install rsync
rsync --version

rsync 접속

SSH를 이용해서 rsync를 접속할 것이기 때문에, ssh 키 인증을 설정해두어야 한다.

rsync -az --delete --exclude-from=.rsyncignore --timeout=3 /local/path/ username@server:/remote/path/
  • -az: 아카이브 모드(a), 압축(z)
  • --delete: source 폴더에 삭제된 내용을 remote에서도 삭제되도록
  • --exclude-from=.rsyncignore: rsync를 통해서 감지하지 않을 파일들의 목록
  • --timeout=3: 3초 안에 작업이 완료되지 않으면 비정상으로 간주

fswatch

로컬 환경의 파일 변화를 감지하고 트리거하기 위해서 fswatch를 사용할 것이다.

# local 환경에서 fswatch 설치
brew install fswatch

# 파일 감지
fswatch --exclude "\.git" .

pm2

nodejs 프로세스를 관리하고 모니터링하는 도구로써, 여러 서비스의 로그를 하나의 터미널에서 볼 수 있도록 하기 위해서 사용할 예정이다.

# 서버 환경에서 pm2 설치
npm install pm2 -g

# pm2 기본 사용법
pm2 start yarn --name "service-name" -- start:dev --preserveWatchOutput
pm2 restart "service-name"
pm2 log

변경사항 자동 업로드하는 스크립트

# fswatch-rsync.sh
#!/bin/bash

# trap
function exit_sh() {
    echo "Ctrl+C detected. Exiting..."
    exit 2
}
trap "exit_sh" SIGINT

# 감지할 디렉토리 및 파일 지정
directory_to_watch="./"
script_to_run="./scripts/dev/rsync.sh"

rsync_code() {
  rsync -az --delete --exclude-from=.rsyncignore --timeout=3 ./ user@example.com:~/example 2>/dev/null
  if [ $? -eq 0 ]; then
    echo "✅"
    return 0
  else
    echo "❌"
    return 1
  fi
}

echo "[$(date '+%Y-%m-%d %H:%M:%S')] " | tr -d '\n'
rsync_code
fswatch --exclude "\.git" "$directory_to_watch" | while read -r file
do
  path=${file//$(pwd)/}
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $path " | tr -d '\n'
  rsync_code
done

여러 서비스를 한번에 pm2로 실행하는 스크립트

# pm2-start.sh
#!/bin/bash

# services 배열 정의
services=("a-service" "b-service")

# 배열을 순회하면서 각 서비스의 디렉토리에서 PM2로 프로세스 시작
for service in "${services[@]}"
do
  service_directory="./services/$service"
  
  # 디렉토리가 존재하는지 확인
  if [ -d "$service_directory" ]; then
    echo "Starting PM2 for service: $service"
    
    # PM2로 프로세스 시작
    (cd "$service_directory" && yarn && pm2 start yarn --name "$service" -- start:dev --preserveWatchOutput)
  else
    echo "Service directory not found: $service_directory"
  fi
done
  • --preserveWatchOutput 은 nestjs에서 start:dev 스크립트를 사용할 때 watch가 시작되면서 console 화면이 clear되게 되는데, 이를 방지하기 위해서 붙혀두었다.

사용방법

로컬 환경에서 ./fswatch-rsync.sh 를 실행해두면 다음과 같이 변경사항이 감지되면 업로드되고, 체크표시가 뜨게 된다.

서버 환경에서는 ./pm2-start.sh 를 실행하여 서비스를 동작시키고, pm2 log 명령어를 통해서 여러 서비스들의 로그를 확인하면 된다. 필요시 각각 pm2 조작을 통해서 개발을 이어나가면 된다.

0개의 댓글

관련 채용 정보