티스토리 뷰
(macOS)[python] django project Heroku app 배포(Deploy)하기
jinozpersona 2019. 10. 22. 20:53INTRO
Heroku 배포 전 사전 준비에서 localhost의 project를 일부 수정하여 GitHub 저장소에 배포하였다.
이전 포스트 https://jinozblog.tistory.com/15를 참고하면 된다.
- Heroku, GitHub 회원가입 및 설치
- jinozblog2019/jblog/settings.py 재설정
- .gitignre 생성 및 git add/commit/push
다음은 git 저장소에서 Heroku에 push할 차례이다.
localPC project -> git 저장소 -> Heroku
먼저 git remote에 heroku를 추가하자.
$ heroku login
$ heroku git:remote -a jinozblog2019
$ git remote -v
heroku https://git.heroku.com/jinozblog2019.git (fetch)
heroku https://git.heroku.com/jinozblog2019.git (push)
origin https://github.com/Jinoz/jinozblog2019.git (fetch)
origin https://github.com/Jinoz/jinozblog2019.git (push)
다음은 root 디렉토리인 jinozblog2019폴더, 즉 manage.py가 있는 곳에서 진행한다.
1. runtime.txt 생성 : Heroku 환경설정에 필요한 python version
Heroku에게 웹사이트에서 사용할 프로그래밍 언어를 알려줘야한다.
$ python3 -V
Python 3.7.4
--jinozblog2019/runtime.txt
python-3.7.4
2. Procfile 생성 및 gunicorn 설치 : Heroku web application 구동을 위한 프로세스 목록
--jinozblog2019/Profile
web: gunicorn jblog.wsgi --log-file -
Django와 함께 사용되는 용도로 Heroku에서 추천되는 HTTP server(Python WSGI HTTP Server) gnunicorn 설치
$ pip3 install gunicorn
3. whitenoise 설정 : Heroku /static/ 파일 관리
Heroku는 WhiteNoise 프로젝트를 이용하여 운영환경의 Gunicorn상에서 직접 정적 자원을 관리하는 것을 추천한다....고 한다.
$ pip3 install whitenoise
--jinozblog2019/jblog/settings.py
MIDDLEWARE = [
'whitenoise.middleware.WhiteNoiseMiddleware',
....
]
...
# Simplified static file serving.
# https://warehouse.python.org/project/whitenoise/
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_ROOT = os.path.join(BASE_DIR, 'jblog', 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
$ python3 manage.py collectstatic
admin에 필요한 statick file을 모아서 STATIC_ROOT인 jinozblog2019/jblog/static이 생성된다.
4. requirements.txt : Heroku 환경설정에 필요한 python 라이브러리
Heroku에게 python 개발에서 사용한 django version과 사전준비 및 위에서 설치한 package 목록을 생성해서 알려준다.
$ pip3 freeze > requirements.txt
$ cat requirements.txt
dj-database-url==0.5.0
Django==2.2.6
gunicorn==19.9.0
psycopg2-binary==2.8.4
pytz==2019.3
sqlparse==0.3.0
whitenoise==4.1.4
현재 tree를 살펴보면 다음과 같다.
.
├── Procfile
├── db.sqlite3
├── jblog
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-37.pyc
│ │ ├── settings.cpython-37.pyc
│ │ ├── urls.cpython-37.pyc
│ │ └── wsgi.cpython-37.pyc
│ ├── local_settings.py
│ ├── settings.py
│ ├── static
│ │ ├── admin
│ │ │ ├── css
│ │ │ ├── fonts
│ │ │ ├── img
│ │ │ └── js
│ │ └── staticfiles.json
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── post
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-37.pyc
│ │ ├── admin.cpython-37.pyc
│ │ ├── models.cpython-37.pyc
│ │ └── views.cpython-37.pyc
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_post_author.py
│ │ ├── __init__.py
│ │ └── __pycache__
│ │ ├── 0001_initial.cpython-37.pyc
│ │ ├── 0002_post_author.cpython-37.pyc
│ │ └── __init__.cpython-37.pyc
│ ├── models.py
│ ├── templates
│ │ ├── home.html
│ │ ├── post_detail.html
│ │ └── post_list.html
│ ├── tests.py
│ └── views.py
├── requirements.txt
└── runtime.txt
마지막으로 GitHub 저장소에 push하고 Heroku에 push하자
1) git push
$ git add .
$ git status
$ git commit -m "<commit message>"
$ git push -u origin master
GitHub 저장소를 새로고침해서 확인해보면 다음과 같다.
2) Heroku push
Heroku에 push를 진행한다.
$ git push heroku master
To https://git.heroku.com/jinozblog2019.git
* [new branch] master -> master
Heroku push중에 heroku config Error 발생 시 아래와 같이 입력/실행 후 위 push를 재진행한다.
$ heroku config:set DISABLE_COLLECTSTATIC=1
Setting DISABLE_COLLECTSTATIC and restarting ⬢ jinozblog2019... done, v3
DISABLE_COLLECTSTATIC: 1
DISABLE_COLLECTSTATIC를 원래대로 돌려놓는 명령어는 다음과 같다.
$ heroku config:unset DISABLE_COLLECTSTATIC
Unsetting DISUnsetting DISABLE_COLLECTSTATIC and restarting ⬢ jinozblog2019... done, v7
배포(deploy)된 파일을 migrate 하자
$ heroku run python manage.py migrate
다음 명령어를 수행하면 heroku app_name을 포함한 heroku domain으로 연결된다.
$ heroku open
https://jinozblog2019.herokuapp.com/
당연하지만 개발서버에서 작성된 post가 Heroku DB에 없기 때문에 main page에서 list 목록을 확인 할 수 없다.
관리자로그인을 위해 superuser를 생성 후 로그인하면 다음과 같은 CSRF 검증 실패를 만난다.
이유는 잘 모르겠지만 뒤로가기를 하면 제대로 로그인이 된다.
$ heroku run python manage.py createsuperuser
https://jinozblog2019.herokuapp.com/admin
관리자 로그인하면 다음과 같이 개발서버에서 최초 superuser로그인된 모습을 확인할 수 있다.
Heroku Deployment Error Issue
1) jinozblog2019/jblog/settings.py Error
- ALLOWED_HOSTS = ['*'] : 초기 setting ['.heroku.com'] push 후 DisallowedHost Error를 만난다.
- STATIC 설정 : whitenoise 제외 배포 시작, 수많은 오류로 이유를 모른채 적용하고 배포했다. 배포전 collectstatic을 진행해야한다.
아직도 위의 설정이 옳바른 건지는 잘 모르겠다. 더 나아가다보면 이유를 찾을 수 있을 거라 믿는다. Heroku에서
STATIC_ROOT를 지정하지 않으면 Error가 발생한다고 합니다.
- local_setting.py 백업 : settings.py를 위와같이 실행하면 localhost에서도 문제없이 실행된다. 백업은 안되도 된다.
- migrations 폴더 push : 개발서버에서 migrate한 내용일텐데 .gitignore에 추가해야하는 지 고민, 아직 제대로된 대답을 못얻었다.
2) runtime.txt, Procfile, requirements.txt, .gitignore 4종 파일 생성
- Procfile에서 <project name>.wsgi의 project name은 settings.py/urls.py/wsgi.py를 포함하는 폴더
- requirements.txt : psycopg2-binary==2.8.4외 psycopg2를 생성해야하나 고민, 결론은 없어도 됨.
GitHub에 push하는 작업에서는 오류가 없었는데 Heroku에 push하는 작업에서 오류가 많았다.
알고보면 위와같은 간단한 오류들이었을 지 모르지만 마주쳤을 때 heroku logs를 확인해도 이해할 수 없는 error들 천국이다.
왜 그래야하는 지 알 수 없는 것들 투성이다. 이유를 모르고 코드를 두드리는 것도 답답하지만 진행을 하다가 알게되는 것들도 존재한다.
온전한 이해보다 안전한 진행이 중요할 때가 있다. 코딩은 최대한 타이핑으로 접근하길 권장한다.
'python > Django' 카테고리의 다른 글
(macOS)[python] django project Heroku 배포 사전준비 - git push (0) | 2019.10.21 |
---|---|
(macOS)[python] django post_detail 구현하기 (0) | 2019.10.15 |
[python] django project 구성 및 용어 정리 - 진행중.... (0) | 2019.10.15 |
(macOS)[python] django post_list site에 구현하기 - 2/2 (0) | 2019.10.14 |
(macOS)[python] django post_list site에 구현하기 - 1/2 (0) | 2019.10.11 |
- Total
- Today
- Yesterday
- git
- Python
- 코로나19
- Pandas
- pyserial
- github
- arduino
- 라즈베리파이
- Django
- MacOS
- Model
- SSH
- DAQ
- r
- server
- ERP
- analysis
- sublime text
- vscode
- Templates
- CSV
- raspberrypi
- Regression
- Raspberry Pi
- 코로나
- DS18B20
- COVID-19
- template
- 자가격리
- 확진
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |