- 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에 이렇게 입력하면 보낼수 있다.