| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- C언어 덱
- auto 키워드
- 백준 파이썬
- const화
- 원형 연결 구조 연결된 큐
- 입출력 관리자
- 문제해결 단계
- l-value참조자
- 회전 및 자리 이동 연산
- c언어 괄호검사
- 괄호 검사 프로그램
- 값/참조/주소에 의한 전달
- IPv4 주소체계
- r-value참조자
- 문자형 배열
- 네트워크 결합
- C언어 계산기 프로그램
- 운영체제 기능
- 주기억장치
- 알고리즘 조건
- const l-value참조자
- getline()함수
- C언어 스택 연산
- 프로그래머스 배열만들기4
- string유형
- 프로그래머스 푸드 파이트 대회
- 유형 변환
- 범위 기반 for문
- 논리 연산
- LAN의 분류
- Today
- Total
chyam
[CI/CD] - GitHub Acitons와 Docker Compose로 Django+Celery 자동 배포 본문
[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를 통해 자동으로 배포할 수 있습니다!
'Web & Backend' 카테고리의 다른 글
| [Django & Redis & Celery] - 비동기 작업 큐 (0) | 2025.11.21 |
|---|---|
| [HTML] - SNS URL 공유 시 미리보기(Open Graph) (2) | 2025.11.21 |