TIL. 최종프로젝트(14) 배포와 daphne

2023년 06월 21일 by barryjung

    TIL. 최종프로젝트(14) 배포와 daphne 목차

[오늘 한일]

  • 배포 진행

 

[오늘 배운점]

<daphne로 gunicorn대체하기>

gunicorn은 장고의 asgi 역할을 담당한다.

이는 장고 컨테이너에 gunicorn이 설치되며,

docker-compose.yml의 엔트리 포인트에서 gunicorn으로 장고가 실행되는 것으로 구현된다.

즉, 장고와 gunicorn이 한 컨테이너에 위치한다.

 

(추후에 정리된거지만)

어제 문제대로 gunicorn은 웹소켓과 HTTP통신을 구분하지 못한다.

튜터님께 질의한 결과 daphne로 gunicorn을 대체하라는 해답을 얻을수 있었다.

생각해보니 아주 잘될거 같은 방법이였다.

 

docker-compose내 엔트리 포인트를 아래처럼 daphne로 바꿔줬다.

gunicorn config.wsgi --workers=5 -b 0.0.0.0:8000
▼
daphne -b 0.0.0.0 -p 8000 config.asgi:application

결론적으로 daphne로 대체하여 잘 동작하였다.

 

 

gunicorn은 바로 잘 동작했던것에 반면, daphne는 장고 asgi파일에 조정이 필요했다.

#config/asgi.py
~(생략)
from channels.middleware import BaseMiddleware

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
django_asgi_app = get_asgi_application()

import battle.routing

우리는 의례적으로 모든 임포트를 상단에 작성했었다.

그러나 daphne로 구동을 시도하자, battle.routing을 임포트하기에

Installed apps가 정의 되지 않았다는 에러가 나왔다.

 

인터넷에 알아본 결과 생성한 앱의 경우 세팅 설정과

asgi_app설정이 끝난후에 임포트를 해야 한다고 했다.

그래서 위처럼 임포트 순서를 내려줬다.

 

daphne로 서버가 구동되자, 역시나 웹소켓 통신이 잘 되었다.

 


※ 작성한 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/
    env_file:
      - ./backend/han/.env
    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 && daphne -b 0.0.0.0 -p 8000 config.asgi:application"
    volumes:
      - ./backend/han/:/app/
      - /etc/localtime:/etc/localtime:ro
      - django_media:/app/media/
      - django_static:/app/static/
    env_file:
      - ./backend/han/.env
    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_static:/static/
    depends_on:
      - backend
    restart: always

  redis:
    container_name: redis
    image: redis:7.0.11
    ports:
      - 6379:6379
    volumes:
      - ./redis/data:/data
      - ./redis/conf/redis.conf:/usr/local/conf/redis.conf
    labels:
      - "name=redis"
      - "mode=standalone"
    restart: always
    command: redis-server /usr/local/conf/redis.conf

postgres, backend(daphne, 장고), nginx, redis가 구동되도록 각각 정의되어있다.

- redis는 별도로 depends_on 속성을 주지 않았는데, 문제 없이 잘 동작했다.

- 전에 말한대로, postgres와 backend에서 환경변수 파일을 참고하도록 했다.

- backend엔트리 포인트를 보면 daphne로 서버를 구동한걸 볼수있다.

- daphne구동전에 make migrations, migrate를 실시한다.

 

※ docker-compose가 up될때마다 make migrations와 migrate가 실행되지만,

실제 migrations파일과 DB내용이 계속 유지가 되기 때문에 첫 1회 빼고는 아무일 없이 넘어간다.

특히 postgres DB는 volume삭제를 하지 않는한 DB가 계속 유지된다.

 

※ 서버에 입력한 명령어 일괄

ssh -i (sshkey.pem파일) ubuntu@(서버IP)

sudo apt update
sudo apt upgrade

sudo apt install docker.io -y
sudo docker --version #Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3

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

sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

docker 작업전까지 입력한 명령어 일괄이다.

여기까지 설치하고 docker 파일들을 작성해줬다.

프로젝트 폴더는 git clone으로 내려받았다.

 

프로젝트 DB용 dumpdata JSON파일은 SCP라는 명령어로 전송했다.

SCP -i (sshkey.pem파일) 내파일디렉토리 ubuntu@서버IP:서버디렉토리

cmd에 이렇게 입력하면 보낼수 있다.