결론은 안된다.

학교에서 대여해준 NHN Toast Cloud 서버가 8월 말에 사용이 중지된다는 얘기를 듣고 AWS에 입문해볼까 하다가 어차피 토이 프로젝트이니 이 정도는 NetlifyHeroku에 서비스해도 될 것 같아서 배포를 하려 했는데, 딱 거기서 생각을 멈췄어야 했다. 아직도 머리가 얼얼하다.

결론부터 말하자면 정적 웹(파일 업데이트가 없고 화면 view만 존재하는 웹)이 아니라면 헤로쿠든 네트리파이든 쓰면 안된다!!!

정확히 오후 한시부터 밤 열시까지 이 삽질을 했다.

안된다.

Flask는 기본적으로 파이썬을 개발용 웹으로 서비스해주기 때문에 gunicorn, wsgi같은 웹팩을 이용해서 사이트를 외부에 노출시켜야 한다.

플라스크 기반의 블로그가 네트리파이나 헤로쿠에서 잘 돌아가는 이유는, 지금 내가 쓰고 있는 헥소나 지킬과 같은 블로그 툴은 git push 과정으로 배포하는 방식이라 결국 푸시할 때마다 정적 뷰가 생성되기 때문에 잘 사용되는 것이다.

내가 옮기려는 Flask 앱은 이미지를 업로드하면 그 이미지를 분석해주는 서비스이기 때문에 이미지 “업로드”는 헤로쿠, 네트리파이와 같은 PaaS 클라우드에서는 할 수 없다..

네트리파이 개발자가 client-side가 아닌 server-side 앱은 호스팅이 안된다고 한다.

정적인 웹은 얼마든지 호스팅할 수 있다. 억울해서 이거라도 적어놓으려 한다.

안되지만,

파일 업로드 등의 로직이 없는 Static Web은 네트리파이, 헤로쿠에서 얼마든지 서비스할 수 있는데, 일단 Flask 앱은 다 만들었다고 가정하고 이를 조금만 바꿔보자.

네트리파이는 Flask-Freeze를 이용하면 되고, 헤로쿠는 gunicorn선에서 서비스할 수 있다. 네트리파이는 이 글에 잘 정리되어 있으니 따라하면 되고, 헤로쿠만 정리해보겠다.

헤로쿠에서 Flask 배포하기

우선 메인 앱(py)을 실행하는 부분이

1
2
if __name__ == '__main__':
app.run()

다음과 같이 되어 있는지부터 확인해보자. port를 임의로 건드리면 안된다.

또한 앱을 라우팅하는 파이썬 파일에는

1
app = Flask(__name__)

당연히 appFlask화 해야한다.

그리고 프로젝트 최상위 폴더에 gunicorn 관련 설정 파일을 하나 만드는데 확장자 없는 Procfile 파일을 만들어서

1
web: gunicorn <메인 앱 이름>:app

이렇게 한 줄의 텍스트를 넣고 저장한다. 이 Procfile을 헤로쿠에서 web으로 인식하고 gunicorn 기반으로 웹을 외부에 노출시키게 된다.

이제 requirements.txtruntime.txt만 설정하면 된다. 모두 프로젝트 최상위 폴더에 위치시킨다. 기본적으로 Flask와 웹팩 모듈들을 넣어준다. (파이썬 3.6.1 버전 기준이므로 버전에 맞게 바꿔준다)

requirements.txt

1
2
3
4
5
6
7
click==6.7
Flask==0.12.2
gunicorn==19.7.1
itsdangerous==0.24
Jinja2==2.9.6
MarkupSafe>1.0
Werkzeug==0.12.2

이제 파이썬 버전만 설정하면 정말 끝이다.

runtime.txt

1
python-3.6.1

이제 헤로쿠에 깃을 연결하고 배포하면 된다. 끝.

난 여기까지는 호스팅이 되는데 파일을 업로드하면 (당연히)

헤로쿠에서 파일 리퀘스트를 거부하는 500 Error가 발생한다.

이제 뭔가를 할 때는 되는지 안되는지부터 보고 삽질을 하던지 해야겠다.. 아무튼 내가 옮기려 했던 앱은 AWS에서 서비스 할 예정이다.