현제의 현재이야기

[DevOps] django channel 연결기 본문

Infra

[DevOps] django channel 연결기

현재의 현제 2023. 7. 30. 16:15

소켓을 개발할 필요가 생겨서 우리 서버에 django-channel을 연결해보았다.

애초에 gunicorndms wsgi로 동기 서버를 담당하는 것이었다.

비동기 서버를 돌려야했기에 daphne 서버로 돌리기로 마음먹었다.  서버가 커지면 컨테이너 두개를 돌리고

동기는 gunicorn django 서버, 비동기는 daphne 서버로 포트를 달리해서 compose에 올리라고 했다.

그런데 해커톤 서버에 그렇게까지 할 필요는 없을 것 같아서 daphne 서버만 사용하기로 했다.

 redis:
    image: redis:7
    ports:
        - "6379:6379"

우선 레디가 필요하니 레디스를 올리고

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('redis', 6379)],  
        },
    },
}

settings.py에 설정해주었다.

#!/bin/bash
python manage.py collectstatic --no-input
daphne -b 0.0.0.0 -p 8000 hackathon.asgi:application

docker-compose의 command는 하나밖에 못한다길래 sh을 만들어서 dapnhe 서버를 돌려주었다.

근데 권한 문제가 생기길래 docker image가 생성될 때 아예 권한을 줘버렸다.

FROM python:3.9.6

ENV PYTHONUNBUFFERED 1

RUN apt-get -y update && apt-get -y install vim apt-utils && apt-get clean
RUN mkdir /project
ADD . /project

WORKDIR /project

RUN pip install --upgrade pip
RUN pip install -r requirements.txt
RUN chmod +x start.sh

daphne 서버는 동기식 asgi도 야무지게 처리해준다길래 일단은 이놈만 사용하다가 문제되면 두개를 올려야겠다.


import os
from channels.routing import URLRouter
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter
import test.routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hackathon.settings')

django_asgi_app = get_asgi_application()

application = ProtocolTypeRouter({
    "http": django_asgi_app,
    "websocket": URLRouter(
        test.routing.websocket_urlpatterns
    )
})

이렇게 asgi.py를 설정해주면 daphne 서버에서 다 처리해준다고 한다. 짱짱

이제 channels를 통해서 택시 알람을 만들 차례!

Comments