[백엔드] 서버 배포 시 자주 발생하는 문제들 (AWS EC2, Github Action, Docker, Django)

2-pi-r·2025년 8월 4일
0

해커톤 결선 기간이 절반 지나갔다. 한 달 동안 개발하면서 발생했던 서버 문제들을 정리해보려고 한다.

개발 환경 (백엔드)

  • Django: Python 기반 웹 프레임워크
    • Django REST framework: RestFul API 개발을 위한 라이브러리
    • Django Channels: WebSocket 통신을 위한 라이브러리
    • Daphne: Django Channels를 지원하는 HTTP/WebSocket 서버
  • Swagger: RESTful API 설계, 문서화, 테스트를 위한 프레임워크
  • MySQL: 관계형 데이터베이스
  • Docker: 개발 환경 관리, 배포
  • AWS
    • EC2: 웹 서버 운영
    • RDS: 데이터베이스 운영
  • Github Action: CI/CD 파이프라인 구축 (Github의 develop 브랜치에 커밋이 되면 → AWS EC2에 자동 배포되도록)

서버 배포 시 자주 발생하는 문제들

문제가 정말정말 자주 발생했다. 유형은 거의 정해져 있었다.

1. DB 연결 실패
2. Django 마이그레이션 파일 충돌 (DB 관련)
3. github action 실패

1. DB 연결 실패

우리 팀이 DB에 연결한 방법

  • 로컬에서 (docker의 db 컨테이너)
    • docker-compose.yml를 보면
    • db 컨테이너에서 DB의 host, port 등을 지정하고
    • web 컨테이너에서 environment:DATABASE_HOST: db 등을 지정한다.
  • 서버에서 (settings/prod.py + 환경변수)
    • docker-compose.prod.yml에는 db 컨테이너 없이 web만 있다.
    • web 컨테이너에서 environment:에 DJANGO_SETTINGS_MODULE: (생략).settings.prod를 지정한다.
    • settings/prod.py에서 DB의 host, port 등을 환경변수로 지정한다.
    • 환경변수는 .env 파일에 있는데, gitignore에 넣어두고 커밋하지 않는다.

문제 및 원인

서버(EC2 인스턴스)에 환경변수가 없어서 DB 연결에 실패했다.
그렇다고 .env 파일을 커밋할 수는 없으므로
임시방편으로 배포할 때마다 prod.py를 수정해서 환경변수 대신 값을 하드코딩으로 넣었다.

해결 방법

1) github 사이트에서 환경변수를 지정하고,
2) github action에서 .env 파일을 생성한다.

1) 환경변수 지정하기

수정(연필 모양) 버튼 누르면 보안상 텅 비어 보인다. 기존 환경변수 중 하나만 수정하고 싶어도 항상 전체 .env 파일을 지정해야 한다.

2) .env 파일 생성

github action의 workflow file을 수정해야 한다.

      # Action Secret에 설정한 ENV_VARS 값을 .env 파일로 만듦
      - name: create env file
        run: |
          touch .env
          echo "${{ secrets.ENV_VARS }}" >> .env

2. Django 마이그레이션 파일 충돌 (DB 관련)

문제 및 원인

마이그레이션 파일끼리 충돌하거나, 파일 내역과 DB 상태가 달라서 생기는 문제다.

MVP 개발 단계라 DB 구조(models.py) 수정할 일이 많아서, 거의 배포할 때마다 문제가 발생했다. 찾아보니 다들 고통받고 있었다.

  • develop 브랜치에 내 작업 브랜치를 머지할 때
    • 보통 팀원이 그 사이에 push해둔 마이그레이션 파일들과 내 브랜치의 마이그레이션 파일이 충돌
    • 파일명이 같으면 git에서 충돌이 나지만, 파일명이 다르면 충돌 없이 머지된다. 이러나 저러나 문제다. ① git 충돌이랑, ② Django 마이그레이션 파일 충돌은 별개이기 때문이다.
    • ① 해결해서 머지하면 EC2 서버로 배포되지만, 서버에서 ② 문제가 발생했다. 내가 해결한 마이그레이션 파일들 상태와 서버 DB 상태가 달랐기 때문.
  • develop에서 새 작업 브랜치를 파서, 내 로컬에서 개발을 시작할 때
    • 내 로컬 DB 상태와 마이그레이션 파일 상태가 달라서 충돌

서버 상태

보통 이러면 docker 컨테이너가 다운된다. EC2 웹 서버에 web 컨테이너가 다운되어 있으므로, 웹 페이지에 접속하면 사이트에 연결할 수 없다고 뜬다.

해결 방법

[Django] 마이그레이션 충돌 해결

3. Github Action 실패

문제

Github Action을 이용해서 Github의 develop 브랜치에 커밋이 되면 → AWS EC2에 자동 배포되도록 해두었다.

이 과정에서 배포에 실패할 수도 있다.

로그 확인 방법

Github 사이트 - Action에서

로그 확인 (어디서 실패했는지)

(+) 로그 보는 법

workflow file을 보면 감이 올 것이다.

file의 name들이 아래 화면의 표시한 부분에 보이는 것이다.

해결 예시

(다음 게시글) [Github Action] 기존 Docker 컨테이너 삭제 안 되는 문제 해결

0개의 댓글