Django 커머스 보일러플레이트 시리즈 |
(1) 프로젝트 요구사항과 다이어그램 모델링 |
(2) 장고/DRF 모델, 시리얼라이저, 뷰 |
(3) 유닛 테스트, drf-yasg API 문서화 |
(4) Nginx 웹 서버와 도커 컴포즈, AWS ECS 배포 |
(5) GitHub Actions CI/CD |
안녕하세요, 판다타입니다.
한동안 파이썬 웹 프레임워크 삼대장 플라스크(Flask), 장고(Django), 패스트API(FastAPI) 중, 회사에서는 사용하지 않는 장고를 이용해 e-커머스(e-commerce) 제작에 사용할 수 있는 보일러플레이트(boilerplate)를 만들어보았습니다. 진행한지는 꽤 되어서 한꺼번에 몰아서 작성하다보니 자세한 설명을 하기는 어렵고... 여러분의 장고 프로젝트 작성에 도움이 될까 하여 간단하게 몇 가지를 정리해보았습니다. 자세한 소스코드는 Djarf GitHub 저장소를 참고해주시고, 궁금한 점은 댓글이나 메일로 문의해주세요.
Requirements.txt: 도커(Docker) 컨테이너 안에서 편리한 파이썬 라이브러리 설치를 위한 설정 파일
# requirements.txt
Django>=4.1.7
djangorestframework>=3.14.0
drf-yasg>=1.21.5
gunicorn>=20.1.0
httpie>=3.2.1
mysqlclient>=2.1.1
Nginx: 장고 앱에 접근하는 요청들을 관리하고 정적 페이지를 제공하는 웹 서버 (Nginx 공식문서 참고)
# nginx/nginx.conf
worker_processes auto; # 프로세스 수를 자동 설정
events {
worker_connections 1024; # 최대 접근 가능한 요청 수
}
http {
upstream djarf {
server djarf:8000; # 아래 proxy_pass로 전달할 포트
}
server {
listen 80; # HTTP로 접근할 경우
location / {
proxy_pass http://djarf; # 위 upstream으로 요청 전달
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
Dockerfile: 도커 이미지를 생성하고 컨테이너를 만들기 위한 설정 파일
# Dockerfile
FROM python:3.8.16 # 파이썬 이미지를 DockerHub로부터 받아서 상속
WORKDIR /app # 도커 컨테이너 가상환경 내 작업폴더 경로
COPY . /app # Git repository 내 모든 파일을 작업폴더로 복사 = git clone
RUN pip install --upgrade pip
RUN pip install -r requirements.txt # requirements.txt로 파이썬 라이브러리 설치
# 환경변수 지정: 장고 암호화 키, DB 비밀번호, RDS DB IP
ARG DJANGO_SECRET_KEY # 도커 컴포즈에서 넣어줄 환경변수
ENV DJANGO_SECRET_KEY $DJANGO_SECRET_KEY # 넣어준 환경변수를 도커 컨테이너 환경변수로 지정
ARG DB_PASSWORD
ENV DB_PASSWORD $DB_PASSWORD
ARG DB_HOST
ENV DB_HOST $DB_HOST
ENV DJARF_PROD true # Production 용도라는 의미의 환경변수 추가, djarf/settings.py 참고
RUN mkdir logs # 로깅을 위한 폴더 추가
RUN python manage.py collectstatic --noinput # 배포 시 CORS 해결을 위한 static 파일 설정
EXPOSE 8000 # 도커 컨테이너의 8000번 포트를 열어줌
# gnicorn WSGI 8개 프로세스, 8개 스레드로 모든 IP에 대해 8000번 포트를 열어줌
ENTRYPOINT gunicorn --bind 0.0.0.0:8000 --workers 8 --threads 8 djarf.wsgi
# nginx/Dockerfile
FROM nginx:1.24.0
COPY nginx.conf /etc/nginx/nginx.conf
도커 컴포즈(Docker compose): 여러 도커 컨테이너를 연결하기 위한 설정 파일 (도커 컴포즈 공식 문서 참고)
# compose.yaml
version: "3"
services:
djarf: # 웹 애플리케이션 서비스
build:
context: . # 이 폴더의 Dockerfile 실행
args: # 환경변수를 Dockerfile 인자로 넣어주어 도커 컨테이너의 환경변수로 설정하게 함
DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY}
DB_PASSWORD: ${DB_PASSWORD}
DB_HOST: ${DB_HOST}
image: ${ECR_URI}/djarf:latest
server: # 웹 서버 서비스
build: ./nginx # nginx/Dockerfile 실행
image: ${ECR_URI}/djarf-server:latest # 추후 AWS ECR에 이미지 자동 배포
ports: [ "80:80" ] # 80번 포트를 열어서 연결해줌
depends_on: [ djarf ] # djarf 서비스에 종속됨
links: [ djarf ] # djarf 서비스에 연결됨
도커 컴포즈를 실행하여 AWS ECS 배포
docker compose up --build # 도커 컴포즈 컨테이너를 띄워봄
# AWS ECS CLI 설치
curl -Lo /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-darwin-amd64-latest
sudo chmod +x /usr/local/bin/ecs-cli
# 도커 컴포즈 설정에 따라 AWS ECS로 배포
ecs-cli compose --file compose.yaml --project-name djarf create --cluster-config djarf
# 클러스터 생성 -> 태스크 정의를 compose.yaml로 생성 -> 서비스 생성 -> EC2 보안그룹 들어가서 변경
# 업데이트 (서비스만 가능, 태스크는 불가능)
# 설정 변경 시 업데이트
aws ecs update-service --service djarf --task-definition djarf --cluster djarf --force-new-deployment
참고한 글들
'개발 > 웹' 카테고리의 다른 글
Django 커머스 보일러플레이트 - (5) GitHub Actions CI/CD (0) | 2023.05.04 |
---|---|
Django 커머스 보일러플레이트 - (3) 유닛 테스트, drf-yasg API 문서화 (0) | 2023.05.02 |
Django 커머스 보일러플레이트 - (2) 장고/DRF 모델, 시리얼라이저, 뷰 (0) | 2023.05.01 |
Django 커머스 보일러플레이트 - (1) 프로젝트 요구사항과 다이어그램 모델링 (0) | 2023.04.30 |
Flask Microservice 구축 - GitHub Actions로 CI/CD 시스템 구축 (2) | 2023.03.01 |
댓글