티스토리 뷰

INTRO

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들 천국이다.

왜 그래야하는 지 알 수 없는 것들 투성이다. 이유를 모르고 코드를 두드리는 것도 답답하지만 진행을 하다가 알게되는 것들도 존재한다.

온전한 이해보다 안전한 진행이 중요할 때가 있다. 코딩은 최대한 타이핑으로 접근하길 권장한다.

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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 29 30 31
글 보관함