Django + Docker + CI/CD 자동배포 구축기 (GitHub Actions, EC2 실전 완성)
✅ 전체 코드
아래는 Github Actions를 통한 main/release 브랜치 완전 자동 배포 예시
name: Deploy to EC2
on:
push:
branches:
- main
- release
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: SSH into EC2 and deploy with Docker Compose
env:
PRIVATE_KEY: ${{ secrets.EC2_PRIVATE_KEY }}
HOST: ${{ secrets.EC2_HOST }}
USER: ${{ secrets.EC2_USER }}
BRANCH: ${{ github.ref_name }}
run: |
mkdir -p ~/.ssh
echo "$PRIVATE_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa $USER@$HOST << EOF
cd ~/account-book
git fetch origin $BRANCH
git checkout $BRANCH
git pull origin $BRANCH
docker compose up -d --build
EOF
🛠 구현 흐름 ①: 전체 자동 배포 구조
- main, release 브랜치에 push하면 Github Actions가 자동 실행
- 워크플로우 내부에서 SSH로 EC2 접속 → git 최신화 → docker compose up -d --build까지 한 번에 처리
- 수동 배포도 지원(workflow_dispatch 옵션)
✅ 분석: 이 구조의 실무적 의미
- 수동 배포 실수, 반복작업, 협업 병목 완전 제거
- git push 한 번이면 곧바로 서버가 최신화되어 실시간 운영 가능
- 브랜치(main/release)별 서비스 환경 분리로 실서비스와 테스트 완전 독립 관리
- 별도 배포 솔루션, 비용 없이 Github Actions로 풀스택 자동화
🛠 구현 흐름 ②: Secrets/환경 변수 실무 관리법
- EC2_PRIVATE_KEY: EC2에 접속할 개인키(.pem 파일, 전체 복사/붙여넣기, 줄바꿈 포함)
- EC2_HOST: EC2 서버 퍼블릭 IP (예: 15.164.49.138)
- EC2_USER: 서버 사용자 계정(ubuntu)
- Github 저장소 > Settings > Secrets and variables > Actions에서 위 3개 각각 등록
⚠️ 실수 방지 팁
- 반드시 **개인키 전체(줄바꿈, BEGIN/END 포함)**를 복사/붙여넣기
- 퍼블릭키 등록하면 배포 절대 안 됨!
- 등록 전, 로컬에서 ssh -i로 EC2 접속 테스트 필수
🛠 구현 흐름 ③: 브랜치별 자동 분기 로직
- ${{ github.ref_name }}으로 현재 push된 브랜치(main/release) 정보를 서버에 전달
- 서버에서 git fetch/checkout/pull origin $BRANCH로 정확한 브랜치 기준으로 배포
- 여러 환경(실서비스/스테이징 등) 완벽 분리 운영
🔍 검증: 실제 배포/로그/동작 체크
- release 브랜치에 push 시 서버에서도 release 기준으로만 자동 배포 진행
- main도 동일하게 분리, 환경별 컨테이너 상태, 서비스 정상 동작 실시간 체크 가능
- docker compose up 로그/컨테이너/웹 접속까지 모든 결과 실시간 확인
⚠️ 실무 주의사항/실수 방지
- Secrets엔 꼭 **개인키 전체(줄바꿈, BEGIN/END 포함)**만!
- EC2 보안그룹 22번(SSH) 포트 오픈 필수
- 서버에 docker, docker compose, git 미리 설치 필요
- 서버 경로(cd ~/account-book)와 실제 프로젝트 경로 정확히 일치시킬 것
- 추가 명령(마이그레이션, collectstatic 등)은 필요시 워크플로우에 커맨드 추가
💡 실무 팁 & 확장 아이디어
- 체크/테스트용 워크플로우(checks.yml)로 배포 전 품질검증까지 자동화
- develop, feature 등 추가 브랜치별 자동화, 실서비스/테스트 분리 전략 가능
- 장애 대응/롤백: deploy.yml에 백업, 복구 명령 넣어 쉽게 전환
- Slack/이메일 등 알림 연동, 실시간 모니터링, SSL/Nginx/DB 백업 자동화도 확장 가능
✅ 실전 운영 결론
- 이제 git push(main/release)만 하면 서버까지 자동 배포 완료
- 운영자는 ssh 접속해서 up/pull 할 필요 없이 코드 관리에만 집중
- 실서비스, 테스트, 장애복구 모두 자동화로 실무 운영 표준화 가능
🎯 오늘 실무형 CI/CD 자동화 핵심 요약
- git push → 서버 자동 배포(브랜치별 분리, 실수 제로)
- 개발/운영 완전 분리, 협업도 쉬워짐
- 실전 DevOps 자동화! 실무에서 바로 써먹을 수 있는 핵심 노하우 마스터
'프로젝트' 카테고리의 다른 글
Gunicorn + Nginx 연동 프로세스별 정리 (1) | 2025.06.15 |
---|---|
Gunicorn이란? vs Nginx란? 아니죠 함께가야죠 (1) | 2025.06.14 |
Docker Hub 배포 실전 가이드 (실무 플로우/코드/명령 포함) (1) | 2025.06.14 |
🎯 AWS EC2 배포: GitHub 연동부터 Docker 빌드/실행까지 한눈에 정리 (0) | 2025.06.14 |
🐳 도커 “이미지”와 “컨테이너” 차이, 그리고 이미지 빌드 이유 (0) | 2025.06.14 |