해커톤 결선 기간이 절반 지나갔다. 한 달 동안 개발하면서 발생했던 서버 문제들을 정리해보려고 한다.
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 실패
docker-compose.yml
를 보면environment:
에 DATABASE_HOST: db
등을 지정한다.docker-compose.prod.yml
에는 db 컨테이너 없이 web만 있다.environment:
에 DJANGO_SETTINGS_MODULE: (생략).settings.prod
를 지정한다.서버(EC2 인스턴스)에 환경변수가 없어서 DB 연결에 실패했다.
그렇다고 .env 파일을 커밋할 수는 없으므로
임시방편으로 배포할 때마다 prod.py를 수정해서 환경변수 대신 값을 하드코딩으로 넣었다.
1) github 사이트에서 환경변수를 지정하고,
2) github action에서 .env 파일을 생성한다.
수정(연필 모양) 버튼 누르면 보안상 텅 비어 보인다. 기존 환경변수 중 하나만 수정하고 싶어도 항상 전체 .env 파일을 지정해야 한다.
github action의 workflow file을 수정해야 한다.
# Action Secret에 설정한 ENV_VARS 값을 .env 파일로 만듦
- name: create env file
run: |
touch .env
echo "${{ secrets.ENV_VARS }}" >> .env
마이그레이션 파일끼리 충돌하거나, 파일 내역과 DB 상태가 달라서 생기는 문제다.
MVP 개발 단계라 DB 구조(models.py
) 수정할 일이 많아서, 거의 배포할 때마다 문제가 발생했다. 찾아보니 다들 고통받고 있었다.
보통 이러면 docker 컨테이너가 다운된다. EC2 웹 서버에 web 컨테이너가 다운되어 있으므로, 웹 페이지에 접속하면 사이트에 연결할 수 없다고 뜬다.
Github Action을 이용해서 Github의 develop 브랜치에 커밋이 되면 → AWS EC2에 자동 배포되도록 해두었다.
이 과정에서 배포에 실패할 수도 있다.
workflow file을 보면 감이 올 것이다.
file의 name들이 아래 화면의 표시한 부분에 보이는 것이다.