Django + Docker + CI/CD 자동배포 구축기(GitHub Actions, EC2 실전 완성)

2025. 6. 14. 23:10·프로젝트

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
'프로젝트' 카테고리의 다른 글
  • Gunicorn + Nginx 연동 프로세스별 정리
  • Gunicorn이란? vs Nginx란? 아니죠 함께가야죠
  • Docker Hub 배포 실전 가이드 (실무 플로우/코드/명령 포함)
  • 🎯 AWS EC2 배포: GitHub 연동부터 Docker 빌드/실행까지 한눈에 정리
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (797)
      • Python (32)
      • 프로젝트 (114)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (154)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    chatgpterror
    college reunions
    americaparty
    newpoliticalparty
    life reflection
    smartphonedurability
    americanlaw
    urbantrends
    livebroadcast
    classaction
    hotcoffeecase
    basalcellcarcinoma
    btscomeback
    bts
    travel ban
    titaniumcase
    btsreunion
    remittance
    btsdischarge
    trumpmuskclash
    뷔
    btsjungkook
    homebartrend
    youngprofessionals
    RM
    gpterror
    lawsuitculture
    global politics
    chinanightlife
    self-growth
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Django + Docker + CI/CD 자동배포 구축기(GitHub Actions, EC2 실전 완성)
상단으로

티스토리툴바