chyam

[CI/CD] - GitHub Acitons와 Docker Compose로 Django+Celery 자동 배포 본문

Web & Backend

[CI/CD] - GitHub Acitons와 Docker Compose로 Django+Celery 자동 배포

chyam_eun 2025. 12. 2. 13:43

기존에는 Django 컨테이너 하나만 GCP의 Cloud Run 기능을 이용하여 배포했으나, 비동기 처리를 하기 위해 Celery와 Redis를 추가적으로 이용하게 되었습니다. 

이에 따라 여러 컨테이너를 한 번에 관리해야했고, 배포 스크립트를 docker-compose 방식으로 변경하게 되었습니다!

 

<기존 방식>

  • 단순히 Django를 Docker 이미지로 빌드하고 푸시하여 docker run으로 실행

<변경된 방식>

  • Git Pull을 통해 main에 있는 최신 코드를 서버로 내려받음
  • docker-compose.yml를 기반으로 Django, Redis, Celery 컨테이너를 한번에 실행 및 연결함

먼저 GitHub Actions에서 "deploy-to-gcp" 부분을 수정하였습니다.

GCP의 VM에 있는 SSH로 서버에 접속한 뒤, 프로젝트 폴더로 이동하여 docker-compose 명령어를 실행하여 자동으로 배포하도록 변경하였습니다!

...
deploy-to-gcp:
    name: Deploy to GCP (CD)
    needs: build-and-test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'

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

      # 1. SSH 접속을 위한 키 설정
      - name: Configure SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.GCP_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan -H ${{ secrets.GCP_HOST }} >> ~/.ssh/known_hosts

      # 2. 서버 접속 및 배포 스크립트 실행
      - name: Deploy via SSH (Docker Compose)
        run: |
          ssh ${{ secrets.GCP_USER }}@${{ secrets.GCP_HOST }} << 'EOF'
            # 실제 프로젝트 폴더로 이동 (폴더명 정확히!)
            cd /home/${{ secrets.GCP_USER }}/ssh에서 저장한 폴더이름 || exit 1
            
            # 최신 코드 받기
            echo "Pulling latest code..."
            git pull origin main
            
            # Docker Compose로 컨테이너 재빌드 및 실행
            # --build: 코드 변경 사항 반영을 위해 빌드
            # --force-recreate: 설정 변경 적용을 위해 강제 재생성
            echo "Running Docker Compose..."
            docker-compose up -d --build --force-recreate
            
            # 확실한 반영을 위해 Web 서비스 재시작
            echo "Restarting Web container..."
            docker-compose restart web
            
            # 불필요한 이미지 정리
            docker image prune -f
          EOF

 

두번째로 설정해주어야하는 것은 SSH 접속키 입니다!

위의 코드에 있는 GCP_USER, GCP_HOST, GCP_SSH_PRIVATE_KEY는 GitHub Acitons에 있는 아래부분에서 설정해주어야합니다.

 

New repository secret을 누른 뒤, Name에 GCP_USER를 써주고, 아래와 같이 내 아이디를 작성하면됩니다.

 

GCP_HOST는 GCP VM의 외부 IP주소를 적어주시고,

GCP_SSH_PRIVATE_KEY는 로컬에서 만든 개인키 내용을 전부 적어줘야합니다!

 

GCP_SSH_PRIVATE_KEY를 만드는 방법은 VS Code에서 아래와 같이 작성하시면 자동으로 생깁니다.

ssh-keygen -t rsa -b 4096 -C "ssh 접근시 사용하는 유저 아이디" -f ./github_action_key

 

4096은 비트 수를 의미하고, -f ./github_action_key는 파일 이름을 정해주는것입니다. 위를 실행하고 엔터를 두번 눌러주면 아래와같이 생성됩니다.

.pub이 붙은것이 공개 키로, GCP에 Compute Engine의 메타데이터를 누른뒤, SSH키를 누르고 .pub의 내용을 붙여넣어준 뒤 저장합니다. 

개인키는 GitHub Actions에서 설정하던 곳에 이름을 GCP_SSH_PRIVATE_KEY로 두고, 값을 붙여넣어줍니다! (-----BEGIN ~~~ 부터 ----END ~~~---- 라고 되어있습니다)

 

이렇게 설정을하게되면 로컬에서 코드를 수정하고 깃허브의 main에 Push하면 GitHub Actions를 통해 자동으로 배포할 수 있습니다!