TIL_240111_도커로 백엔드 장고 배포(1/3)_Docker

Sol Lee·2024년 1월 11일
0

🫠 포폴용 팀프로젝트 배포

이제 정말 배포를 해야만 한다.
사실은 지난주에 했어야 됬는데

팀 프로젝트할 때 배포 담당하셨던 분은 따로 도커사용은 안 하셨던 것 같은데
나는 강의 보면서 따라해야해서 도커를 사용

다음에 또 배포할 일이 생길지 모르니 정리해두자.

백엔드 Django 배포

1️⃣ AWS EC2 인스턴트 생성

발표 당시에 정확하게 원인은 못 찾았지만 사이트가 엄청 느려서 고생했었음
실시간으로 보시던 튜터님이 문제 발생 이유가 둘 중 하나 일 것 같다고 하심

  1. 서버 인스턴스가 너무 낮은 등급이거나
  2. ai나 다른 기능이 동기로 개발되어있거나

아마 1번일 것 같다고 하셨어서
이번에는 프리티어인 t2.micro보다 높은 단계인 t2.medium으로 생성함.

그 외 설정은 os는 ubuntu, security group은 SSH, HTTPS, HTTP전부 허용해서 생성, storage는 30gb. 강의에서 나온 그대로 따라함.

2️⃣ SSH 접속

터미널로 ssh 접속, aws에서 바로 들어가는 방법도 있었던 것 같은데 강의를 그대로 따라해 보았다.

ssh -i {key pair pem파일 주소} ubuntu@{퍼블릭 ipv4 주소}

key pair pem 파일 파인더에서 드래그앤드랍해도 주소 입력되서 너무 편했다

연결하겠냐고 묻는 문구가 나오면 yes 입력!

정상적으로 접속되면 사진처럼 나옴

3️⃣ 도커 설치

docker 패키지 설치

sudo apt install docker.io -y

제대로 설치되었나 확인

sudo docker --version # 도커 버전 확인

docker compose 설치

sudo mkdir -p /usr/lib/docker/cli-plugins

sudo curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o /usr/lib/docker/cli-plugins/docker-compose

sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose

sudo docker compose version # 버전이 출력되면 정상!

4️⃣ docker로 nginx, django, postgresql 연동하기

0. 디렉토리 구조

path : /home/ubuntu/
├── backend
│   ├── Dockerfile
│   └── django # 여기에 프로젝트 코드가 들어감!
├── docker-compose.yml
└── nginx
    └── default.conf

1. nginx

nginx 디렉토리 안에 default.conf 파일 생성

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/ 경로에 있는 파일들을 보여줍니다.
  }
}

vim 컨닝 페이퍼:
i 쓰기모드, esc 읽기모드, :wq 저장하고 나가기, 숫자dd 숫자만큼 삭제

vim은 나중에 더 공부해보자

2. django + postgresql

2-1. backend 디렉토리 생성 후 안에 프로젝트 깃헙 소스코드 클론 받기

mkdir backend # 디렉토리 생성
cd backend/ # 디렉토리 안으로 이동
git clone {깃헙 주소} ./django # django 디렉토리 안에 클론 

# 위 설정을 따르지 않으면 뒤에 많은 파일의 경로들을 수정해야 함

2-2. 기본 세팅하기

# timezone 한국 시간대로 설정
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

# date 명령어로 UTC -> KST로 변경되었는지 확인 가능
vi backend/django/{프로젝트명}/settings.py
# ex) vi backend/django/teulang/settings.py

settings.py에 아래 내용 추가

# settings.py 

# 환경변수에 따라 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

STATIC_ROOT = BASE_DIR / "static" # 이미 있다면 추가 안해도 됨

굳이 vim으로 수정 안하고 미리 깃에 푸시하고 받아도 됨

.env 파일 추가
env파일은 깃에 올려두지 않으니 원래 위치에 직접 생성하기

vi backend/django/.env 

2-3. Dockerfile 생성

vi Dockerfile # backend 디렉토리 안에 만들어야 함! 경로 확인하고 생성

Dockerfile 안에 아래 내용 추가

# python 3.10.8버전 이미지를 사용해 빌드
FROM python:3.10.8

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

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

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

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

# opencv 설치에러 방지
RUN apt-get update
RUN apt-get -y install libgl1-mesa-glx

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

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

# gunicorn을 사용하기 위한 패키지를 설치합니다.
RUN pip install gunicorn psycopg2
# psycopg2: python에서 postgresql 연결할 때 쓰이는 패키지

2-4. docker-compose.yml 생성

vi docker-compose.yml # 루트 디렉토리에 있어야 함 위치확인하기!

아래 코드 붙여넣기 (프로젝트명 맞춰서 수정 필요!)

version: '3.8'

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

services:
  postgres:
    container_name: postgres
    image: postgres:14.5
    volumes:
      - postgres:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=P@ssw0rd
      - POSTGRES_DB=django
    restart: always

  backend:
    container_name: backend
    build: ./backend/
    entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn 프로젝트명.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=1
      - POSTGRES_DB=django
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=P@ssw0rd
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
    depends_on:
      - postgres
    restart: always

  nginx:
    container_name : nginx
    image: nginx:1.23.2
    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

3. 컨테이너 생성하기

sudo docker compose up --build -d # 컨테이너 실행시키기
sudo docker compose logs -f # 로그 확인하기

❗️❗️❗️ ip 주소로 들어가지는 지 확인! ❗️❗️❗️

🐳 docker 컨닝 페이퍼

sudo docker ps # 활성화된 컨테이너 확인하기
sudo docker ps -a # 컨테이너 전부 확인하기
sudo docker exec -it $container_id /bin/bash # 컨테이너 안으로 들어가기(터미널)
sudo docker compose stop # 중지
sudo docker compose down # 삭제
sudo docker compose restart # 재시작

🙃 반쪽 컨닝 페이퍼

로그 확인, vim, shell, 컨테이너 내부 등에서 밖으로 나갈 때
cntrol + c, :wq, exit(), exit 중 하나임

5️⃣ docker의 backend 컨테이너 내부로 들어가기

장고 슈퍼유저 생성하기

컨테이너 내부로 들어가기

sudo docker exec -it backend /bin/bash

admin 계정 생성

python manage.py createsuperuser

❗️❗️❗️ admin page 로그인 확인해보기! ❗️❗️❗️

postgrsql로 연결이 되었는지 확인하고 싶을 때

python manage.py shell

>>> from django.db import connections
>>> form pprint import pprint
>>> pprint(connections.databases)

다음편 링크 : 도커로 백엔드 장고 배포(2/3) AWS

profile
직업: 개발자가 되고 싶은 오레오 집사

0개의 댓글