프로젝트 배포 자동화를 위해 github action을 이용하여 백앤드 서버 배포를 하려고 합니다.
서버 배포에 앞서 먼저 저희 인프라 구조입니다.
github setting → Secrets and variables → actions → Repository secrets
에 등록하면 github action에서 사용할 수 있습니다.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
ssh -i $PUBLIC_SSH_PRIVATE_KEY $DEPLOY_USER@$PUBLIC_SERVER_IP "mkdir -p build"
와 같이 접속 후에 뒤에 명령을 제시해주면 명령을 수행한 뒤에 ssh의 연결을 즉시 종료합니다.ssh-keyscan -H $PUBLIC_SERVER_IP >> ~/.ssh/known_hosts
: known_host에 접속할 서버를 등록해야 서버에 ssh로 서버에 접속할 수 있습니다.mkdir -p ~/.ssh
echo "${{ secrets.PUBLIC_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
**SSH Agent란?**
ssh agent 는 private key를 메모리에 저장하는 프로그램.
**ssh client 에 private key를 노출하지 않으며, 주로 bastion host 를 통해 다른 서버에 접속하기 위해 사용됩니다.**
**Bastion Host란?**
외부에서 내부 네트워크에 접근할 수 있는 유일한 방법인 접근점이다.
**보안성이 높은 인프라(우리의 경우는 private 서버)와 외부 인터넷을 연결하는 중계 서버이다.**