docker-compose를 이용한 django 프로젝트 배포(Feat.poetry)

김혁준·2023년 6월 2일
0
  • 파이썬 버전 3.11
    docker-compose: v2.11.2

  • 명령어 모음:

10dd
sudo cat /dev/null/ > debug.log
docker compose down -v
sudo docker compose up -d --build
sudo docker compose logs -f(오류 없는지 확인)
sudo docker volume ls
sudo docker compose down
sudo docker compose up -d
sudo docker compose stop
sudo docker ps
sudo docker ps -a
 poetry export -f requirements.txt > requirements.txt
sudo docker exec -it $container_id /bin/bash
rm -rf 폴더명
rm -rf 파일명
sudo docker volume prune
sudo docker compose restart backend
poetry export --without-hashes --format=requirements.txt > requirements.txt
sudo docker compose kill
sudo docker compose down --remove-orphans
  1. 백엔드 deploy 브랜치 생성 : git checkout -b feature/deploy > git push --set-upstream origin feature/deploy
  2. AWS EC2에 Linux 환경 구성 :
    1. 우측 상단 리전을 서울로 설정
    2. instance 생성 : ubuntu로 설정
      1. keypair 생성
      2. network 세팅 다 체크하기
      3. Configure storage 30gb로 체크
  3. git ignore : poetry.lock,pyproject.toml 추가하고 deploy branch에는 requirements.txt만 냅두기
  4. vscode에서 poetry export -f requirements.txt > requirements.txt 입력 후 push 그리고 pull
  5. django settings.py 설정
import os

# 환경변수에 따라 DEBUG모드 여부를 결정합니다.
DEBUG = os.environ.get('DEBUG', '0') == '1'

# 접속을 허용할 host를 설정합니다.
ALLOWED_HOSTS = ['backend', ]

# postgres 환경변수가 존재 할 경우에 postgres db에 연결을 시도합니다.
POSTGRES_DB = os.environ.get('POSTGRES_DB', '')
if POSTGRES_DB:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': POSTGRES_DB,
            'USER': os.environ.get('POSTGRES_USER', ''),
            'PASSWORD': os.environ.get('POSTGRES_PASSWORD', ''),
            'HOST': os.environ.get('POSTGRES_HOST', ''),
            'PORT': os.environ.get('POSTGRES_PORT', ''),
        }
    }

# 환경변수가 존재하지 않을 경우 sqlite3을 사용합니다.
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }

# CORS 허용 목록에 ec2 ip를 추가합니다.
CORS_ORIGIN_WHITELIST = ['http://$ec2_public_ip']
# ex) CORS_ORIGIN_WHITELIST = ['http://43.201.72.190']

# CSRF 허용 목록을 CORS와 동일하게 설정합니다.
CSRF_TRUSTED_ORIGINS = CORS_ORIGIN_WHITELIST
  1. ssh 연결
    1. 인스턴스 → 생성 한 인스턴스 id 클릭 → 보안 → 보안 그룹 클릭
    2. 인바운드 규칙 → 인바운드 규칙 편집 클릭
    3. 인바운드 규칙에 SSH가 존재하는지 확인합니다. 만약 설정이 없을 경우 직접 추가
    4. 터미널에서 ssh 연결하기
      1. 인스턴스 → 생성 한 인스턴스 id 클릭 → 퍼블릭 IPv4 주소 확인
      2. 터미널에서 ssh -i ./pem파일_이름.pem ubuntu@$퍼블릭IPv4주소
        1. 2에서 permission denied 오류가 생긴다면 : chmod 400 .pem 입력(경로 맞아야댐)
  2. ubuntu에서
    1. ifconfig 입력
      1. iconfig가 안먹힌다면 : sudo apt update,sudo apt install net-tools
    2. docker 패키지 설치 : sudo apt install docker.io -y
      1. docker-compose 설치 : sudo mkdir -p /usr/lib/docker/cli-plugins
      2. sudo curl -SL https://github.com/docker/compose/releases/download/{version(v.2.11.2)}/docker-compose-linux-x86_64 -o /usr/lib/docker/cli-plugins/docker-compose ( 버전은 https://github.com/docker/compose/releases 여기서 확인)
      3. sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose
      4. sudo docker compose version
  3. backend/Dockerfile 만들기
  4. django에서 my_settings.py는 깃허브에 안올라가니까 직접 도커 들어가서 만들어주기
  5. mkdir backend // cd backend // git clone -b {branch_name} --single-branch {저장소 URL} ./django
  6. vi django/config/settings.py 들가서 설정 settings.py를 푸쉬하고 클론하기(삭제할때는 rm -rf django이렇게)//그리고 pull 땡기면댐
  7. sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
  1. vi docker-compose.yml(명령어 drf_project >> config)
version: '3.8'

volumes:
  postgres: {}
  django_media: {}
  django_static: {}

services:
  postgres:
    container_name: postgres
    image: postgres:14.5-alpine
    volumes:
      - postgres:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_DB
    restart: always

  backend:
    container_name: backend
    build: ./backend/
    entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py makemigrations && python manage.py migrate && gunicorn config.wsgi --workers=5 -b 0.0.0.0:8000"
    volumes:
      - ./backend/django/:/app/
      - /etc/localtime:/etc/localtime:ro
      - django_media:/app/media/ # nginx에서 media를 사용할 수 있도록 volume을 지정해줍니다.
      - django_static:/app/static/ # nginx에서 static을 사용할 수 있도록 volume을 지정해줍니다.
    environment: # django에서 사용할 설정들을 지정해줍니다.
      - DEBUG
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_HOST
      - POSTGRES_PORT
    depends_on:
      - postgres
    restart: always

  nginx:
    container_name : nginx
    image: nginx:1.25.0-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - django_media:/media/ # django의 media를 사용할 수 있도록 volume을 지정해줍니다.
      - django_static:/static/ # django의 static 사용할 수 있도록 volume을 지정해줍니다.
    depends_on:
      - backend
    restart: always
  1. .env 생성 :
DEBUG=1
POSTGRES_DB=django
POSTGRES_USER=user
POSTGRES_PASSWORD=P@ssw0rd
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
  1. 최상위폴더에서 mkdir nginx > vi nginx/default.conf
server {
  listen 80;
  server_name _; # 모든 도메인 혹은 ip로 들어오는 요청에 대해 처리해 줍니다.

  location / { # nginx로 요청이 들어왔을 때
    proxy_pass http://backend:8000/; # backend 컨테이의 8000번 포트로 전달합니다
.
  }

  location /static/ { # 브라우저에서 /static/ 경로로 요청이 들어왔을 때
    alias /static/; # /static/ 경로에 있는 파일들을 보여줍니다.
  }

  location /media/ { # 브라우저에서 /media/ 경로로 요청이 들어왔을 때
    alias /media/; # /media/ 경로에 있는 파일들을 보여줍니다.
  }
}
  1. 최상위폴더에서 vi backend/Dockerfile :
# python 3.11.2버전 이미지를 사용해 빌드
FROM python:3.11.2

# .pyc 파일을 생성하지 않도록 설정합니다.
ENV PYTHONDONTWRITEBYTECODE 1

# 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다.
ENV PYTHONUNBUFFERED 1

# /app/ 디렉토리를 생성합니다.
RUN mkdir /app/

# /app/ 경로를 작업 디렉토리로 설정합니다.
WORKDIR /app/

# requirments.txt를 작업 디렉토리(/app/) 경로로 복사합니다.
COPY ./django/requirements.txt .

# 프로젝트 실행에 필요한 패키지들을 설치합니다.
RUN pip install --no-cache-dir -r requirements.txt

# gunicorn과 postgresql을 사용하기 위한 패키지를 설치합니다.
RUN pip install gunicorn psycopg2
  1. 디렉토리 구조 맞는지 확인 :
path : /home/ubuntu/
        2. ├── backend
        3. │   ├── Dockerfile
        4. │   └── django # project directory
        5. ├── docker-compose.yml
        6. └── nginx
        7.     └── default.conf
  1. .env 적용됐는지 확인 :
    1. sudo docker exec -it backend /bin/bash 로 서버접속 후 어드민생성
    2. python manage.py shell
    3. from django.db import connections
    4. from pprint import pprint
    5. pprint(connections.databases)로 db확인

그리고 DEBUG=0으로 바꾸고 다시 빌드 후 위의 과정 반복 >> 결과가 다르면 .env파일이 잘 적용된거다.

  1. sudo docker compose logs -f > 오류없는지 확인
  2. aws ec2들어가서 Public IPv4 address 확인후 {Public IPv4 address}/admin 눌러서 잘 들어가지는지 확인

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN