서비스 하나를 처음부터 끝까지 완성했으면 배포까지 시켜보는게 인지상정이라 생각합니다.
배포도 여러 방법으로 할 수 있기 때문에 익숙한 것부터 익숙하지 않은 것까지 다 사용해보면 좋은 것 같아요.
그래서 이번에 저는 처음 듣는 HeroKu(헤로쿠)를 이용해서 배포하는 방법을 공부해 봅니다.
그럼 시작~!!
1. 헤로쿠 가입
- 일단 헤로쿠를 통한 배포를 진행하려면 헤로쿠 사이트의 계정이 필요합니다.
+ 회원가입을 진행해 줍니다.
+ 회원가입을 진행하면 이메일 인증이 필요한데요~ 이메일 인증까지 끝내줍니다. (이메일 인증 시, 비밀번호를 설정하게 됩니다!)
2. 헤로쿠 툴킷 다운로드
- 헤로쿠 툴킷을 설치하기 위해 사이트에서 다운 받아 설치해 줍니다.
+ 윈도우 또는 맥에 따라서 알맞은 툴킷 다운 및 설치합니다.
+ 윈도우의 경우는 설치 시 기본 설정 그대로 그냥 설치하면 될 것 같아요.
+ 설치가 제대로 됐는지 확인은 콘솔창 (cmd창)에서 확인 가능해요.
(Terminal)
# 헤로쿠가 잘 설치됐다면 버전이 잘 뜹니다.
$ heroku -version
3. 추가 모듈 설치
- 헤로쿠에서 사용하기 위해 우선 몇 가지 모듈을 추가로 설치해 봅니다.
(Terminal)
# 데이터베이스 환경 변수를 설정할 수 있게 도와주는 유틸리티 설치
pip install dj-database-url
# WSGI 미들웨어 설치
pip install gunicorn
# static(정적) 파일의 사용을 위한 미들웨어 설치
pip install whitenoise
# PostgreSQL 사용을 위한 모듈 설치
pip install psycopg2-binary
- 여기까지 필요한 모듈을 모두 설치했으면 이번에는 프로젝트의 전체 사용된 모듈 목록을 파일로 만들어 봅니다.
+ github에서 흔히 볼 수 있는 'requirements.txt' 파일 생성이에요!
# requirements.txt 파일 생성
pip freeze > requirements.txt
- settings.py 부분을 수정해 봅니다.
+ 'dj_database_url'을 사용하고 배포를 위한 작업을 합니다.
# config/settings.py
# 해당 라이브러리 임포트
import dj_database_url
# 배포를 위해 디버깅 모드와 호스트를 설정해줍니다.
DEBUG = False
ALLOWED_HOSTS = ['*']
+ 그리고 dj_database_url을 통해 데이터베이스 옵션을 추가하는데 'settings.py'에서 [DATABASES] 변수 이후로 옵션을 추가해야 합니다!! (그냥 맘편히 맨 뒤에 추가해버리기~)
# config/settings.py
# DATABASES 변수 이후로 추가 가능함
DATABASES['default'].update(dj_database_url.config(conn_max_age=500))
+ 정적 파일 사용을 위한 미들웨어 추가와 [STATIC_ROOT] 변수를 설정해 봅니다.
# config/settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware', # 여기 whitenoise 미들웨어를 추가합니다!!
]
# STATIC_ROOT 변수 선언
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
+ 루트 경로에 'Procfile' 파일과 'runtime.txt' 파일을 만들어 줍니다.
# Procfile
web: gunicorn config.wsgi
: Procfile은 아무런 확장자 없이 만들어 줍니다. (진짜 이상하긴 합니다. 확장자가 없다니!! 저는 파이참으로 생성하고 편집할 때 메모장으로 열어서 만들었어요!!)
: 웹 애플리케이션을 배포할 때 gunicorn <내가 만든 사이트>.wsgi 명령을 실행하는 것을 의미합니다.
# runtime.txt
python-3.8.10
+ 'runtime.txt' 파일은 어떤 파이썬 버전을 사용할지 지정하는 파일로 프로젝트의 가상환경 파이썬 버전에 맞춰서 해주시면 될 것 같아요!!
4. 헤로쿠에 업로드 하기
- 헤로쿠 + 깃 명령어를 통해 헤로쿠에 업로드를 진행해 봅니다.
+ 먼저 헤로쿠에 로그인을 해봅니다.
(Terminal)
heroku login
+ 위 명령어를 입력하고 난 후, 아무 키나 눌러주라고 하는데 누르면 웹 브라우저로 헤로쿠가 연동되면서 로그인해주면 됩니다.
+ git에 소스코드를 업로드해야 하기 때문에 'gitignore' 파일을 만들어서 업로드하지 않을 목록도 만들어 줍니다!
# .gitignore
# 제가 추가한 목록들 입니다.
/venv/
*.pyc
*~
__pycache__
db.sqlite3
.DS_Store
/.idea
/config/config.py
/media/
+ 그리고 git에 소스코드를 업로드 해주세요!!
# 처음이라면 git 연동부터
git init
git add -A
git commit -m "heroku upload"
+ 헤로쿠에 업로드할 공간을 생성해준 후 업로드해 줍니다.
# 헤로쿠에 리포지터리처럼 업로드 공간 만들기
(Terminal)
heroku create ongstagram-django
+ push 명령어를 통해서 git -> heroku로 소스코드를 업로드해 봅니다.
(Terminal)
git push heroku master
+ requirements.txt를 참고로 모듈을 설치하면서 업로드되는 것을 볼 수 있을거에요!!
** 여기서 [Using Python version specified in runtime.txt remote: ! Requested runtime (python-3.8.0) is not available for this stack (heroku-20).] 같은 에러가 발생한다면!!
: runtime.txt에 기재된 python 버전이 헤로쿠에서 사용 가능한 버전과 맞지 않아서 발생하는 에러입니다.
: 여기에서 헤로쿠가 제시하는 사용 가능한 runtime의 python 버전을 확인한 후 맞게끔 수정해주면 됩니다!!
** 위의 처리 이후에 다시 push를 하는데 [Error while running '$ python manage.py collectstatic --noinput'.] 이런 에러가 발생한다면 코드에서 사용되는 모듈이 제대로 push되지 않아서 발생하는 것으로 보입니다.
: 저같은 경우는 config 파일을 따로 만들었는데 해당 파일을 git에 업로드하지 않았습니다. 여기서 이 에러가 나타나더라구요. 하지만!! 공개버전으로 git에 올렸기 때문에 config 파일에는 소중한 시크릿키들이 있어서 올리면 안되는....
: 이 때, 해결 방안입니다.
(Terminal) # 헤로쿠 설정을 바꿔줍니다. heroku config:set DISABLE_COLLECTSTATIC=1
: 이렇게 헤로쿠 설정을 바꾼 후 다시 push를 해보면 다행히 헤로쿠에 업로드될 거에요!!
: 하지만 해당 파일이 없어서에 의한 문제라면 아마.. 이 다음부터 진행이 안될 수도 있을 겁니다. (임포트되는 파일이 없을 경우에 한해서!!)
5. 헤로쿠 초기화
- 헤로쿠에 소스코드를 업로드했으니 데이터베이스를 초기화해 줍니다.
+ django 처음 설정하듯이 비슷합니다.
(Terminal)
heroku run python manage.py migrate
- 데이터베이스를 초기화한 후, 관리자 꼐정도 생성해 줍니다.
(Terminal)
heroku run python manage.py createsuperuser
- 그럼 마지막으로 헤로쿠를 통해 웹페이지를 열어보면 끝!!
(Terminal)
heroku open
여기까지 헤로쿠(Heroku)를 이용한 배포였습니다.
헤로쿠는 특별한 서버 작업이 필요없어서?? 간편하긴 합니다.
비용도 비싼 편이 전혀 아니고 무료 버전이라도 아주 아주 아주 안좋은 사양까지도 아닙니다. 그러니까 프로젝트 배포에서 종종 써먹어도 될 것 같네요.
하지만!! 더 좋고 막강한 배포 방법들도 있으니 헤로쿠를 또 언제 쓸
'Django > etc.' 카테고리의 다른 글
[Publish]Django - Anywhere 배포하기 (0) | 2021.06.01 |
---|