AWS GitHub Actions 배포 ( docker 구성 )

MinJung3453·2025년 11월 15일

작업 기록

목록 보기
1/2

AWS t3.micro 버전에서 Jenkins를 사용하기 무리가 있어보인다..
용량을 늘려서 실행은 되지만, 관리자 포탈이 매우 느리고 빌드가 오래 걸리는 문제가 있다.

그리하여 깃에서 실행해 사용할 수 있는 GitHub Actions을 사용하고자 한다.
Jenkins는 서버에서 빌드되지만 GitHub Actions는 깃에서 빌드되어 올라간다.

도커로 실행 환경을 구성하고 GitHub Actions로 자동 배포할 예정이다.

gitHub Action에서 사용할 환경 변수 지정

  1. 깃 레파지토리에 배포할 소스를 업로드 한다.
  2. 배포할 레파지토리의 Settings → secrets and variables → Actions 에 접근한다.
  3. 대상 서버 host, ssh 접근 key, 접근 user 정보 등 환경 구성 config를 추가한다.

이제 GitHub Actions 실행 yml 파일을 생성하겠다.
.github/workflows 파일 내 yml 파일을 생성하면 Actions탭에 배포될 작업에 대하여 리스트가 추가된다.

간단한 문법을 설명하자면

name: 워커 플로우 이름
env: 워커 플로우 내 환경변수 설정
jobs: 워크플로우 내부의 작업들
  deploy-build:
    runs-on: ubuntu-latest
 steps: 실제로 실행되는 명령 또는 action

나는 ssh 인증서 발급 → frontend, backend 소스 빌드 → docker container 생성 ( nginx, frontend, backend, redis, mongoDB, mysql ) → 헬드 체크 순서로 실행되도록 구성하였다.

gitHub Action .yml 파일 생성

  1. 첫 실행 시 aws로 ssh 연결을 시도한다.
    아래 환경변수 들은 "gitHub Action에서 사용할 환경 변수 지정" 참고하면 된다.
- name: Prepare Project
  uses: appleboy/ssh-action@v1.2.0
  env:
    EC2_HOST: ${{ secrets.EC2_HOST }}
    EC2_USER: ${{ secrets.EC2_USER }}
    EC2_KEY: ${{ secrets.EC2_KEY }}
    PAT_TOKEN: ${{ secrets.PAT_TOKEN }}
  with:
    host: ${{ env.EC2_HOST }}
    username: ${{ env.EC2_USER }}
    key: ${{ env.EC2_KEY }}
    port: 22
    timeout: 600s
    command_timeout: 15m
    debug: true
    script: |
      git config --global user.name "GitHub Actions"
      git config --global user.email "actions@github.com"

      if [ -d ~/bookTalkTok-web ]; then
        cd ~/bookTalkTok-web
        git fetch origin
        git reset --hard origin/main
      else
        git clone https://$PAT_TOKEN@github.com/${{ github.repository }}.git ~/****
        cd ~/****
      fi
  1. ssl 인증서 생성
    **** 부분에 설정할 웹 도메인을 넣으면된다.
    aws 도메인 설정 방법은 다른 게시글에 정리하겠다.
- name: Setup SSL Certificates
  env:
  uses: appleboy/ssh-action@v1.2.0
  with:
    script:

      cd ~/*******/deployment 
      mkdir -p nginx/ssl
      sudo cp /etc/letsencrypt/live/****/fullchain.pem nginx/ssl/cert.pem
      sudo cp /etc/letsencrypt/live/****/privkey.pem nginx/ssl/key.pem
      sudo chown -R $USER:$USER nginx/ssl/
      chmod 644 nginx/ssl/cert.pem
      chmod 600 nginx/ssl/key.pem
  1. docker container 생성
    컨테이너 별 환경설정 및 스크립트 소스는 /deployment에 따로 분리하였다.
    해당 스크립트에 대한 게시글에 정리하겠다.
- name: Deploy Application with Domain
  env:
  uses: appleboy/ssh-action@v1.2.0
  with:
    script: 
      cd ~/***/deployment   

      # Docker 정리
      sudo docker system prune -f
      sudo docker volume prune -f

      # Docker 이미지 빌드
      sudo docker-compose -f docker-compose.aws.yml build --no-cache frontend

      # 컨테이너 실행
      sudo docker-compose -f docker-compose.aws.yml up -d
  1. 배포될 소스 빌드
echo "🔨 Frontend 빌드 실행 중..."
          if timeout 1800 sudo docker-compose -f docker-compose.aws.yml build --no-cache frontend >/dev/null 2>&1; then
            echo "✅ Frontend 빌드 성공"
          else
            echo "❌ Frontend 빌드 실패"
            echo "📋 Frontend 빌드 로그 확인 중..."
            sudo docker-compose -f docker-compose.aws.yml build --no-cache frontend 2>&1 | tail -20
            exit 1
          fi
  1. 빌드 소스 기반으로 docker container 실행
sudo docker-compose -f docker-compose.aws.yml up -d
  1. 헬드 체크
if curl -f --connect-timeout 10 "http://localhost:3000" 2>/dev/null; then
        frontend_status="✅"
      fi
  • 배포 후 서버에 접근하여 실행된 컨테이너 리스트를 확인하면 된다.
docker ps

  • 도커 컨테이너 별 로그 확인
docker logs -f 컨테이너 이름
profile
닷넷 4년차 개발자. nestjs, spring boot로 이직 준비 중

0개의 댓글