프로젝트 배포

조호원·2020년 11월 19일
0

어느정도 개발이 진행중이던 시점에서 프론트와 앱 개발자들과 API를 연결할 필요가 생겼다. 그래서 Heroku 플랫폼에 한번 배포를 도전해보았다. 현자 타임 속에서 엄청난 삽질들을 기록해보고자 한다.

Procfile 파일 작성

Procfile은 heroku에서의 실행 명령어를 말한다. gunicorn이나 uwsgi와 같은 웹서버로 애플리케이션을 실행하기 위해선 명령어를 실행하여야 한다.
gunicorn 웹서버 같은 경우는 gunicorn manage:app을 실행하면 되는데, heroku가 실행하려면 Procfile안에 "web: gunicorn manage:app --log-file - " 라고 적어주면 끝난다. 참고로 끝에 --log-file - 를 입력하면 log를 기록할 수 있다. 배포에대한 자세한 이론은 방학 때쯤 날 잡고 열독해볼 생각이다.

venv에서 pyenv로

우선 구글링을 통해 헤로쿠 계정에 로그인하고 애플리케이션을 만든 뒤 Procfile를 작성했다. 하지만 requirements를 Heroku에 push하다 보니 계속해서 오류가 떴다. Heroku에서 호환되지 않는 패키지들이 있었기 때문이다. 내 괴짜 친구가 말하기를 venv는 구식이라서 잘 안쓰인다고 pyenv를 써보라했다. 나는 친구 말을 한번 믿어보기로하고 pyenv를 깔아보았다. 확실히 pyenv는 venv와는 달랐다. 우선 pyenv는 다양한 파이썬 버전을 설치해서 사용할 수 있었다. python2 와 python3, pypy까지 다양했고 pip list 명령을 실행한 결과, venv의 가상 환경은 설치하지도 않은 패키지들이 수 없이 많이 있었고 pyenv로 만든 가상환경에서는 딱 설치한 패키지만 보였다. 왜 그런지 자세한 이유는 알아보아야겠지만 결국 별
탈 없이 push할 수 있게되었다.

Heroku DB 연동

가장 힘들게 삽질했던 것 같다. 4 ~ 5일 정도 했던가 해결하고나니 허탈한 기분이 조금은 들었다. 일주일 정도는 삽질해야되는거 아닌가라는 사람들도(진정한 프로그래머들 존경합니다) 있겠지만 말이다.
그럼 본론으로 돌아와서 우선 Heroku에 애플리케이션을 만들고 (heroku create <app-name>) addons가 있는지 없는지 확인한다. (heroku addons) 아마 없을 텐데 그렇다면 addons를 만들어 준다. 이때 hobby-dev는 무료 버전이다. 하지만 테스트하기엔 충분할 것이라 생각되어 별 고민 없이 hobby-dev를 설정했다.(heroku addons:add heroku-postgresql:hobby-dev) addons을 추가하면 자동으로 heroku의 환경변수에 DATABASE_URL이 생성 되었을 것이다. (heroku config 명령어로 확인 가능) 여기까진 괜찮았을 것이다. 하지만 계속해서 SQLALCHEMY_DATABASE_URI가 없다는 것이다.

Flask-SQLAlchemy: Neither SQLALCHEMY_DATABASE_URI nor SQLALCHEMY_BINDS is set. Defaulting SQLALCHEMY_DATABASE_URI to “sqlite:///:memory:”

계속 구글링을 한 결과, 내가 환경변수 이름을 SQLALCHEMY_DATABASE_URI가 아닌 SQLALCHEMY_DATABASE_URL로 했던 것이다.... 다시는 이런 실수로 시간을 태우지 않겠다 다짐하니라.
하지만 아직도 API를 호출할 때마다 500을 리턴한다.

(psycopg2.errors.UndefinedTable) relation "server" does not exist

디비가 자꾸 없다길레 manage.py 파일에

if __name__ == '__main__':
    with app.app_context():
        db.create_all()
    manager.run()

db.create_all()을 호출해봤더니 API가 잘 호출되었다. 이 외에도 다양한 시도를 했었다. deploy라는 커스텀 커맨드도 만들어 보았다.

@manager.command
def deploy():
    from flask_migrate import upgrade
    upgrade()

이게 정말 오류를 고치는데 효과가 있었는지는 모르겠다. 무엇이 결정적으로 문제를 해결했는가, 무엇이 문제였는가에 대한 해답을 미래의 내가 꼭 찾아내기를 빈다.

Heroku에 migration 폴더 올리기

헤로쿠에 migration 폴더를 올리고 싶어서 나는 heroku run python manage.py db init 명령을 실행했다. 잘 실행되다가도
python manage.py db migrate를 실행하면 migration 파일이 없다고만 한다. 왜 그런지 알아보니 헤로쿠에서는 프로그래밍적으로 만들어진 파일은 모두 삭제한다는 것이다. 그래서 어떤 파일을이나 폴더를 헤로쿠에 올리고 싶다면 앞에서 봤듯이 git push heroku master를 사용하면 된다.

profile
세상을 바꾸는 사람

0개의 댓글