flask + heroku 배포(하다가 만났던 에러들)

sangeun jo·2022년 4월 21일
0
post-custom-banner

배포 준비

  1. runtime.txt 작성
python-'version'
#ex python-3.10.4
  1. gunicorn 설치

  2. requirements.txt 작성

pip list --format=freeze > requirements.txt

format 옵션을 주지 않으면 버전이 아니라 경로가 포함되는 경우가 생기는데 이것때문에 에러가 발생할 수도 있다. 그래서 경로 없이 깨끗한 파일을 얻고 싶다면 꼭 저 옵션을 줘야한다. 전에는 이걸 몰라서 일일이 손으로 경로 지우고 버전 적는 노가다를 했었다..

  1. Procfile 작성
web: gunicorn '메인 실행파일 이름(py붙이면 안됨)':app
#ex 메인실행파일이 main.py인 경우 web: gunicorn main:app

heroku 배포 시 주의점

  1. heroku는 동적으로 port를 할당하기 때문에 꼭 지정된 포트에서 시작하지 못할 수 있다. 이 경우 지연되다가 아예 서버를 시작하지 못할 수도 있다고 한다.
  2. host 옵션으로 0.0.0.0을 줘야한다.

=> 요약 app.run(host='0.0.0.0')

  1. 기타 앱, 데스크톱 혹은 TV용 구글 api 클라이언트 키를 사용할 경우 heroku에서 배포할 수 없다. 이거 몰라서 한 사흘 날림

배포 중 만났던 에러들

  1. gunicorn: error: unrecognized arguments: app:app
    나는 flask 앱에 데스크톱 용 구글 api client 계정을 연동하여 사용하고 있었다.
    데스크톱용 client 계정의 경우 브라우저가 자동으로 실행되고 사용자가 로그인을 하면 토큰을 받아오게 되는데 heroku는 실행할 수 있는 브라우저가 없었기 때문에 열리지 않았고, 응답을 하지 않은채로 계속 시간이 지나니 gunicorn에서 app을 찾을 수 없다는 에러를 낸 것이었다. 서비스 계정으로 바꾸고나니 에러 없이 잘 배포되었다.

  2. H10 - App crashed
    object-detection 의존성 문제
    어차피 데이터 분석하거나 컴퓨터 비전쪽 웹서비스가 아니라서 그냥 모듈을 requirements.txt에서 지우니 해결 되었다. 충돌 일어나는 모듈 중에 꼭 필요한 모듈이 아니라면 그냥 지워도 된다.

  3. code=H13 desc="Connection closed without response"
    페이지를 로드하지 못하고 30초 이상 지나면 에러로 표시된다.
    1번 문제를 해결하자 같이 고쳐졌지만 더 길게 설정할 수 있는 방법이 있다.

후기

배포하는데 총 5일정도 걸렸다. 모듈 충돌 문제만 아니었으면 더 빨리 배포할 수 있었을 것이다. 꼭 가상환경 사용하자...의존성 문제 때문에 개발할 때 너무 힘들다.
배포하는 과정에서 한 80%는 에러와 싸우는 과정인 것 같다. 다음에는 도커도 사용 해봐야겠다.

profile
코더가 아니라 개발자가 되자
post-custom-banner

0개의 댓글