헤로쿠에 장고 배포하기

sen·2022년 11월 17일
0

참고: https://zodlab.tistory.com/95

프로젝트를 대강 완성하고, 배포가 처음이기 때문에 안전하게 일찍 배포하기로 했다. 배포는 곧 유료로 바뀌긴 하지만 간편하고 사람들이 많이 사용하는 헤로쿠에서 하기로 했다. (사실 다른 무료 사이트에서 배포하다 개고생하고 돌아옴...)


배포를 위한 프로젝트 설정 변경

프로젝트는 리액트와 장고로 개발하고 있고, 데이터베이스는 장고 내장 디비(sqlite3)을 이용한다.

환경 변수

기존에 로컬에서 개발할 때는 비밀키를 따로 파일을 만들어 그 안에 내용을 넣고, 코드에서 꺼내 쓰는 방식을 사용했다. 해당 파일을 같이 배포할 순 없으므로 환경 변수에 설정하는 과정이 필요하다.

# 프로젝트 폴더 > settings.py
setattr(sys.modules[__name__], "SECRET_KEY", os.environ.get('SECRET_KEY'))
setattr(sys.modules[__name__], "EMAIL_HOST_PASSWORD", os.environ.get('EMAIL_HOST_PASSWORD'))

os.environ.get() 은 해당 키의 환경 변수 값을 가져오는 함수이다. 배포 시 환경 변수를 설정하는 단계에서 키-값을 알맞게 넣어주면 된다.


디버그

# 프로젝트 폴더 > settings.py
DEBUG = os.environ.get('DJANGO_DEBUG', 'False') == 'True'

환경변수 DJANGO_DEBUG 을 이용해 배포 / 로컬 환경에서 디버그 여부를 구분할 수 있다. 당연히 배포할 때는 디버그를 막아놔야 한다.


CORS

# 프로젝트 폴더 > settings.py
ALLOWED_HOSTS = ['devs-tory.herokuapp.com']

CORS_ORIGIN_WHITELIST = [
	...
    'https://devs-tory.herokuapp.com'
]

CORS_ALLOWED_ORIGINS = [
    ...
    'https://devs-tory.herokuapp.com'
]

CORS_ALLOW_CREDENTIALS = True

각각 백엔드 도메인 을 추가한다. https:// 에 유의해서 추가한다. ALLOWED_HOSTS 에만 추가하면 되는 걸로 알고 있지만, 혹시나 CORS 에러가 뜨면 짜증나니 안전하게 다른 곳에도 추가해주었다.

이미 리액트와 연결해서 개발하고 있었기 때문에 CORS 기본 설정은 되어있어서 해당 설명은 생략한다.


라이브러리

# 터미널
pip install dj-database-url gunicorn psycopg2-binary whitenoise

헤로쿠 배포에 필요한 패키지들을 설치한다. 이 중 whitenoise 는 크롤링 관련 패키지라 들어서 나는 따로 설치하지 않았다.


# 프로젝트 폴더 > settings.py
MIDDLEWARE = [
	...	
	'whitenoise.middleware.WhiteNoiseMiddleware'
]

whitenoise 를 설치했으면 해당 코드를 추가한다.


pip freeze > requirements.txt

설치된 라이브러리 목록을 requirements.txt 파일에 따로 저장한다.


데이터베이스

# 프로젝트 폴더 > settings.py
import dj_database_url # 최상단 선언부분에 입력

...
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
...

db_from_env = dj_database_url.config(conn_max_age=500) # DB 설정부분 아래에 입력
DATABASES['default'].update(db_from_env) # DB 설정부분 아래에 입력

헤로쿠에선 postgre 디비를 지원하기 때문에 데이터베이스 설정을 다음과 같이 변경해야 한다.

static 파일

프론트는 장고가 아닌 리액트에서 개발했기 때문에 정적 파일이 따로 없었다. 그래도 해당 절차를 거쳐야 한다.

python3 manage.py collectstatic

위 명령어로 배포를 위해 정적 파일을 모아준다.
평소 로컬에서 실행할 때는 runserver 명령어가 알아서 정적 파일을 다루어준다고 한다.


# 프로젝트 폴더 > settings.py
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

관련 설정도 해준다.


기타 파일

헤로쿠에 배포를 하기 위해 추가해야 하는 파일이 더 있다.

# 프로젝트 최상단 > runtime.txt
python-3.8.5 # python3 --version 을 통해 나온 버전을 입력

# 프로젝트 최상단 > Procfile
web: gunicorn 프로젝트명.wsgi --log-file -

우선 runtime.txt 에 사용하는 파이썬 버전을 입력한다. 그리고 Procfile 에 (확장자 없음) 해당 코드를 입력한다.


배포

찾아보면 대부분 헤로쿠 cli를 이용해 터미널에서 진행한다. 나는 데이터베이스 마이그레이션을 제외하고는 사이트에서 직접 해결했다.

사이트에서 배포

깃허브 계정으로 헤로쿠에 회원가입 후, 로그인 한다.

create new app 으로 앱을 만들고, 원하는 도메인 이름을 짓는다.

세가지 방법 중 깃허브를 이용해 배포할 장고 레포지토리를 연결한다. 그러면 빌드 후 프로젝트가 배포된다.


환경 변수

앱 내 메뉴 중 settings 에 들어가면 환경 변수를 설정할 수 있다. 위에서 설정한 환경 변수들을 알맞게 추가한다.

데이터베이스

로컬에서 데이터베이스를 마이그레이션 하는 것처럼, 배포할 때도 마이그레이션이 필요하다. 이건 사이트에서 진행하는 방법을 몰라서(...) 헤로쿠 cli를 설치해 진행했다.

https://devcenter.heroku.com/articles/heroku-cli

위 사이트를 참고해 cli를 설치한다.

# 프로젝트의 터미널
heroku login # 로그인
heroku git:remote -a devs-tory # 배포된 앱과 로컬 프로젝트 연결
git remote -v # 연결 확인

그리고 만약 우리처럼 깃허브에 따로 마이그레이션 관련 폴더를 올리지 않았다면 마이그레이션 파일들을 push 해 올려준다. (앱 > migrations > __init.py__)


heroku run python manage.py migrate # 배포 서버에 마이그레이션
heroku run python manage.py createsuperuser # 관리자 생성

이후 위 명령어를 실행하면 끝! 일줄 알았는데 마이그레이션 할 때 자꾸 다음과 같은 오류가 발생했다.

django.db.utils.ProgrammingError: relation "user" does not exist

구글링을 열심히 하다가 해결법을 발견했는데... 그 방법이

프로젝트의 url 주소를 주석 처리하기

였다. 어이없었지만 한 번 해봤다.

# 프로젝트 폴더 > urls.py
# urlpatterns = \
#     [path('admin/', admin.site.urls),
#      path('account/', include('account.urls')),
#      path('profile/', include('profiles.urls')),
#      path('mainfeed/', include('mainfeed.urls')),
#      path('search/', include('search.urls')),
#      ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

이렇게 로컬에서 주석 처리를 하고 바로 명령어를 다시 실행해보니 됐다. 엥? ㅋㅋㅋ 다행이지만 어이없다.

여기까지 하면 배포가 완료된다. 앞으로 배포 시 지정해둔 브랜치 (기본적으로 main) 내용이 바뀔 때마다 자동으로 바뀐 내용을 반영해 재배포된다.


사이트 깨우기

마지막으로, 헤로쿠로 배포한 사이트는 30분간 traffic이 발생하지 않으면 잠이 든다고 한다.

https://kaffeine.herokuapp.com/

따라서 위 사이트에서 우리 사이트 주소를 입력해 잠이 들지 않게 한다.

profile
𝙝𝙞 𝙩𝙝𝙚𝙧𝙚 😎

0개의 댓글