Github Action으로 백앤드 서버 배포하기

프로젝트 배포 자동화를 위해 github action을 이용하여 백앤드 서버 배포를 하려고 합니다.

서버 배포에 앞서 먼저 저희 인프라 구조입니다.

스크린샷 2024-11-13 오후 2.07.08.png

깃허브 액션 환경 세팅

image.png

SCP로 빌드 파일을 전달하는 배포 방식

name: Deploy Backend

on:
    push:
        branches: [develop]

jobs:
    build-backend:
        runs-on: ubuntu-latest
        name: Deploy Backend

        steps:
            - name: Checkout repository
              uses: actions/checkout@v4

            - name: Set up Node.js
              uses: actions/setup-node@v4
              with:
                  node-version: 'node'

            - name: Install pnpm
              run: npm install -g pnpm

            - name: Install dependencies
              run: pnpm install --no-frozen-lockfile

            - name: Build backend
              run: cd apps/backend && pnpm run build

            - name: Upload build artifacts # 빌드 산출물 업로드
              uses: actions/upload-artifact@v3
              with:
                  name: build-artifacts # 빌드 산출물 이름
                  path: ㅁbuild/ # 빌드 산출물이 위치한 경로

    deploy-backend:
        needs: build-backend
        runs-on: ubuntu-latest
        name: Deploy Backend

        steps:
            - name: Download build artifacts
              uses: actions/download-artifact@v3
              with:
                  name: build-artifacts
                  path: build

            - name: Access To Public Server
              run: |
                  PUBLIC_SSH_PRIVATE_KEY: ${{ secrets.PUBLIC_SSH_PRIVATE_KEY }}    # GitHub에 등록해둔 SSH 프라이빗 키
                  DEPLOY_USER: ${{ secrets.DEPLOY_USER }}            # 유저 이름
                  PUBLIC_SERVER_IP: ${{ secrets.PUBLIC_SERVER_IP }}                # 서버 IP

                  ssh -i $PUBLIC_SSH_PRIVATE_KEY $DEPLOY_USER@$PUBLIC_SERVER_IP "mkdir -p build"
                  scp -i $PUBLIC_SSH_PRIVATE_KEY -r build/* $DEPLOY_USER@$PUBLIC_SERVER_IP:build

# public server에 접속된 상태가 아니므로 오류가 난다.
            - name: Access To Private Server
              run: |
                  PRIVATE_SSH_KEY_PATH: ${{ secrets.PRIVATE_SSH_KEY_PATH }}    # SSH 프라이빗 키 위치
                  DEPLOY_USER: ${{ secrets.DEPLOY_USER }}            # 유저 이름
                  PRIVATE_SERVER_IP: ${{ secrets.PRIVATE_SERVER_IP }}                # 서버 IP
                  DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }}            # 서버 내의 배포 경로

                  ssh -i $PRIVATE_SSH_KEY_PATH $DEPLOY_USER@$PRIVATE_SERVER_IP "mkdir -p $DEPLOY_PATH"
                  scp -i $PRIVATE_SSH_KEY_PATH -r build/* $DEPLOY_USER@$PRIVATE_SERVER_IP:$DEPLOY_PATH

mkdir -p ~/.ssh
echo "${{ secrets.PUBLIC_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa

SSH Agent && Bastion Host

**SSH Agent란?**
ssh agent 는 private key를 메모리에 저장하는 프로그램.
**ssh client 에 private key를 노출하지 않으며, 주로 bastion host 를 통해 다른 서버에 접속하기 위해 사용됩니다.**
**Bastion Host란?** 
외부에서 내부 네트워크에 접근할 수 있는 유일한 방법인 접근점이다. 
**보안성이 높은 인프라(우리의 경우는 private 서버)와 외부 인터넷을 연결하는 중계 서버이다.**