logo
Published on

안쓰는 컴퓨터를 배포 서버로 만들기 (2)

Authors
  • avatar
    Name
    MJ
    Twitter

1편에서부터 이어집니다!

배포 자동화를 해봐요

현재 우분투 PC에 도메인과 포트를 연결했기 때문에, 로컬에서 서버를 띄우면 mj-dev.site으로 접속할 수 있습니다. 보고 계시는 블로그는 mdx 파일을 파싱해서 블로그의 게시글로 바꾸고 있습니다. 하지만, 블로그 게시글을 ubuntu pc에서 작성하기에는 vi를 써서 작성해야 하거나 ide 설정을 해주어야 합니다. 이러한 불편함을 해소하기 위해, 저는 맥북에서 게시글을 작성하고 있습니다. 맥북에서 게시글을 작성해서 github에 push하면, 우분투 PC에서 수동으로 pull하고 재실행하고 있습니다.

여전히 우분투 PC에서 수동으로 pull하고 재실행하는 것은 불편한 것 같습니다. 이를 해소하기 위해, github actions와 웹훅을 이용해서 자동으로 pull하고 재실행하도록 해보겠습니다. 다음과 같은 구조로 만들면 될 것 같습니다.

아키텍처

웹훅 서버 만들기

mj-dev.site:3100포트로 들어오는 요청을 처리하기 위해 express를 이용한 웹훅 서버를 만들어보겠습니다.

// POST /webhook/pull 요청이 들어오면 다음과 같이 처리합니다.
// 프로젝트 폴더로 이동하고 deploy 스크립트를 실행합니다.
const { stdout, stderr } = await exec(`cd [프로젝트 폴더] && ./deploy.sh`, {
  timeout: 2 * 60 * 1000,
})

// 3100번 포트로 앱을 시작합니다.
app.listen(3100, () => {
  console.log(`Webhook server listening on port ${PORT}`)
})

위와 같이 요약할 수 있고, 아무 서버나 요청할 수 없도록 인증 절차를 간단히 추가해주었습니다. 만일 코드가 궁금하다면 레포지토리 링크에서 전체 코드를 확인할 수 있습니다.

GitHub Actions 만들기

이제 블로그 게시글을 모두 작성하고, github에 push하면, github actions가 실행되도록 만들어보겠습니다.

name: Deploy to Ubuntu PC

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger deployment
        env:
          WEBHOOK_TOKEN: ${{ secrets.WEBHOOK_SECRET }}
        run: curl -X POST https://mj-dev.site/webhook/pull

이제 main 브랜치에 push하면, github actions가 실행되어 mj-dev.site/webhook/pull으로 요청을 보내게 됩니다. (nginx에서 3100번 포트 요청을 /webhook/pull로 프록시하도록 설정해두었습니다.)

deploy 스크립트 만들기

이제 deploy 스크립트를 만들어보겠습니다.

#!/bin/bash

# 1. 3000번 포트를 사용하는 프로세스 종료
PORT=3000
PIDS=$(sudo netstat -tulnp | grep :$PORT | awk '{print $7}' | cut -d/ -f1)

if [ -n "$PIDS" ]; then
    echo "Port $PORT is currently being used by processes: $PIDS. Terminating the processes..."
    for PID in $PIDS; do
        echo "Terminating process $PID..."
        sudo kill -9 $PID
        if [ $? -eq 0 ]; then
            echo "Process $PID terminated."
        else
            echo "Failed to terminate process $PID."
            exit 1
        fi
    done
else
    echo "Port $PORT is not in use."
fi

# 2. Git Pull
echo "Pulling latest changes from git repository..."
git pull

if [ $? -ne 0 ]; then
    echo "Git pull failed. Exiting..."
    exit 1
fi

# 3. 프로젝트 빌드
echo "Running pnpm run build..."
pnpm run build

if [ $? -ne 0 ]; then
    echo "Build failed. Exiting..."
    exit 1
fi

# 4. 서버 실행
echo "Starting the server with pnpm run serve..."
nohup pnpm run serve &

echo "Server started on port $PORT."

위와 같이 프로세스 종료 -> git pull -> 프로젝트 빌드 -> 서버 실행 순서로 스크립트를 작성하였습니다.

실행

이제 맥북에서 블로그 게시글을 작성하고, github에 push하면, github actions가 실행되어 우분투 PC에 자동으로 배포되는 것을 확인할 수 있습니다.

image

마치며

이렇게 안쓰는 컴퓨터를 배포 서버로 만들고 웹훅을 통해 자동으로 배포하는 방법을 알아보았습니다.

  • ddos 공격에 대비하기
  • cdn 기능 추가하기
  • 서버 자동화 스크립트 추가하기(code push 됐을 때 자동으로 서버 재시작)

이제 두 가지 문제가 남았습니다. ddos 공격에 대비하기와 cdn 기능 추가하기입니다. 이 문제들을 해결하면 더 안정적으로 서버를 운영할 수 있을 것 같습니다.