본문 바로가기
개발 공부/Django

django channels - Heroku deploy

by 느림보어른 2021. 7. 15.

서문

Django channels tutorial로 만든 real-time chat을 Heroku에 배포해본 과정을 정리했다.

 

real-time chat은 Django, Redis, ASGI를 사용하기에 다른 기술 스텍을 사용한 프로젝트와 배포 과정이 다를 수 있다.

0. 사전 준비

  • github과 연동된 프로젝트
  • Heroku 가입

1. Heroku

heroku app 생성

redis 추가

생성한 app의 대시보드에서 Resource항목에 Heroku Redis를 추가한다.

Github 연동

Deploy항목에서 Deployment method를 Github으로 선택하고 App connected to GitHub에서 배포할 레포지토리를 선택한 뒤 아래의 Manual deploy에서 배포용 branch를 선택한다.

2. Static 폴더 추가

root 폴더에 static 폴더와 staticfiles 폴더를 생성한다. settings.py에서의 설정은 아래에서 진행한다.

3. settings.py 설정

DEBUG

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

settings.py에서 DEBUG 항목을 False로 변경한다.

ASGI_APPLICATION

Django_channels 공식 문서에서 tutorial로 제공한 django chat의 asgi.py에 몇 가지 수정이 있었다. 해당 부분은 후에 따로 정확히 공부하여 정리할 것이다.

ALLOWED_HOSTS

ALLOWED_HOSTS = ['.herokuapp.com/', '127.0.0.1']

settins.py의 ALLOWED_HOSTS를 위와 같이 수정한다. Heroku에 배포하면 '.herokuapp.com/' 도메인으로 제공되기에 이 host를 추가한다.

CHANNEL_LAYERS

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [os.environ.get('REDIS_URL', 'redis://localhost:6379')],
        },
    },
}

tutorial 상에서는 docker의 redis를  사용했지만 heroku에 deploy할 때는 heroku에서 제공하는 redis를 사용할 것이기에 위와 같이 변경한다.

Static 설정

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.2/howto/static-files/

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.9/howto/static-files/
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'

# Extra places for collectstatic to find static files.
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

settings.py의 static 폴더에 대한 설정을 위와 같이 수정한다.

SECRET_KEY

settings.py의 SECRET_KEY는 공개된 상태로 Django를 실행하면 Django의 보안 보호 기능이 대부분 해제되고 권한 상승 및 원격 코드 실행 취약성이 발생할 수 있다. 따라서 이를 별도의 환경변수로 저장하여 관리해야한다.

Heroku에 SECRET_KEY 저장

app 대시보드의 Settings에서 Config Vars에 SECRET_KEY를 저장한다.

settings.py에서 SECRET_KEY 불러오기

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']

settings.py의 SECRET_KEY를 위와 같은 코드로 불러온다. 나의 경우 Heroku에서 SECRET_KEY를 DJANGO_SECRET_KEY란 이름으로 저장했다.

4. Procfile

Heroku 앱에는 시작 시 앱에서 실행할 명령을 지정하는 Procfile이 포함되어 있다. Procfile을 사용하여 다음을 포함한 다양한 프로세스 유형을 선언할 수 있다.

  • 앱의 웹 서버
  • 여러 유형의 woerker 프로세스
  • A singleton process, such as a clock(?)
  • 새 릴리스를 배포하기 전에 실행할 작업
release: python manage.py migrate
web: daphne config.asgi:application --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py runworker channels --settings=config.settings -v2

5. requirements.txt

pip freeze > requirements.txt

해당 명령어를 통해 프로젝트에 필요한 패키지 목록을 저장한다.

최종 배포

위의 작업을 마무리 했으면 결과물을 github에 push하고 heroku에 들어가 app 대시보드에서 배포용 brach를 deploy하면 된다.

A. 오류 확인 방법

Heroku에 배포했지만 오류가 발생할 시 오류에 대한 정보는 다음과 같이 확인할 수 있다.

  1. View logs에 접속  
    app 대시보드의 오른쪽 상단에 More의 View logs를 클릭한다.
  2. log 확인

View logs에서 app의 log를 확인할 수 있다.

B. 내 Github

https://github.com/Donghyeonkim981214/django_chat/tree/deploy_to_heroku

 

Donghyeonkim981214/django_chat

django chat app with django channels. Contribute to Donghyeonkim981214/django_chat development by creating an account on GitHub.

github.com

C. 출처

https://www.youtube.com/watch?v=zizzeE4Obc0 

https://devcenter.heroku.com/categories/working-with-django

 

Working with Django | Heroku Dev Center

 

devcenter.heroku.com