Project/[약올림] Final Project

[초기 세팅 및 배포] Heroku 서버, DB 배포

HJChung 2021. 1. 22. 09:01

 

직접 배포를 하기 전에 Heroku에 대해 간단한 사용방법을 공부하고 정리해두었었다. 

그런데 역시나.. 직접 해보기 전까지는 절대 모른다 ㅎㅎㅎ HJ님이 도와주시지 않으셨다면 속이 터져 엉엉 울어버렸을 것이다. 

서버 배포와 RDS 사용을 해본 것을 정리해보려 한다. 

1. 준비

Heroku CLI설치 (Mac용)

#터미널
brew install heroku/brew/heroku

코드상에서 배포환경으로 변경해주어야 할 것은 변경하기

예를 들어

app = create_app(os.getenv('BOILERPLATE_ENV') or 'prod') #'dev'를 'prod'로

2. 서버 배포 - Flask로 구현된 사이트를 Heroku를 통해 배포하기 위한 준비단계

① 원래 사용하던 가상환경이나 아니면 배포만을 위한 가상환경을 따로 파서, 필요한 것들을 설치한다.

ex)gunicorn

#터미널
pip install gunicorn

② 서버에 올리지 않을 것들 .gitignore에 적어주기

#gitignore
settings.json
__pycache__
등...

※ feature 구현 등 코드 작업이 진행되는 Dev 브랜치에서는 개인정보 등 외부 노출이 되면 안되는 config 파일을 gitignore에 넣어야 한다. 그러나 배포시에는 이 config 정보를 서버 실행시 참조해야하므로 반드시 함께 올려주어야 한다. 즉, 배포시에는 gitignore에서 config.py 빼기!

③ 배포를 진행할 가상환경을 activate한 후 Heroku에 올릴 폴더위치로 간다. 그리고 나서 pip freeze명령어를 이용하여 requirements.txt 파일을 생성한다.
이 파일에는 해당 사이트에 필요한 패키지들을 명시할 수 있고, 헤로쿠는 이 파일에 적힌 패키지들을 클라우드 서버에 설치해준다.

※ 이때 패키지들간 버전이 맞지 않다거나 해당 모듈이 필요한데 없다거나 하면 에러가 발생하는데, 에러메세지를 잘 읽어보면 어떻게 변경해라는 것을 잘 알려준다. 

이렇게 말이다. ㅎㅎ 글러면 gastsms 0.3.3으로, scipy는 1.4.1로, tensorboard는 2.3.0으로 requirement를 수정해주먼 된다. 

④ 생성된 Procfile 에 서버실행파일을 명시해준다.

#Procfile
web: gunicorn 서버실행파일:app #우리는 manage.py가 서버실행파일이므로 web: gunicorn manage:app으로 해주었다. 

그런데 이렇게만 하면 충돌이 났다는 에러가 뜬다. 그래서 

#Porcfile
web: gunicorn --bind 0.0.0.0:$PORT 서버실행파일:app #web: gunicorn --bind 0.0.0.0:$PORT manage:app

 으로 "자체적으로 정해진 포트번호가 있는데 배포시에 헤로쿠가 주는 서버 포트와 충돌이 나서 어느 포트든 받겠다"는 것으로 변경해주면 해결된다 (HJ님 감사해요!)

 

⑤ Heroku 계정 로그인

#터미널
heroku login

⑥ Heroku에 저장소를 생성

#터미널
heroku create 저장소 이름

빌드팩 설치

어떤 환경에서 실행시킬지 맞춰주는 것이다. 나는 python을 사용하는 flask를 사용한 서버를 배포할 것이기 때문에

#터미널
heroku buildpacks:set heroku/python(nodejs면 nodejs... 등 heroku buildpack이라 검색해서 자신에게 맞은 것을 알아보자.)

heroku 사이트에 들어가서 내 개인 dashboard를 확인

 

위의 결과로 만들어진 앱이 있다. 이를 클릭

 

deploy 탭을 들어가면 아래와 같은 화면이 뜨고, 더 아래에 git 과 connect 한다.

깃헙 로그인 후 배포를 진행할 repo를 선택하고, 배포를 진행할 branch까지 설정한다. 

여기까지 서버 배포를 위한 준비는 다 되었다. 

3. 서버 배포 - 배포 해보기

방법 1) 내가 배포를 진행할 git repo의 특정 branch에 push시 자동 배포

위에서 <깃헙 로그인 후 배포를 진행할 repo를 선택하고, 배포를 진행할 branch까지 설정>하였다. 

그러면 해당 branch에 그냥 평소에 github에 commit, push 하는 것처럼

git add [커밋할 파일]
git commit -m [커밋 메세지]
git push origin [설정한 branch]

를 하면 자동으로 heroku에도 배포가 이루어진다.

※ 단 이때는 주의할 것이 있다. 

config파일을 gitignore에서 제외시켰기 때문에 이 파일도 깃헙 repo에 그대로 올라간다는 것이다. 편리한 방법이긴 하지만 보안에 별로 좋지 않은 것 같다

 

방법2) 헤로쿠 git 에 직접 배포

앞서 

⑥ Heroku에 저장소를 생성

#터미널
heroku create 저장소 이름

을 해주었었다. 내 git repo가 아닌 여기로 직접 배포하는 것이다. 그러면 내 깃헙 repo에는 어떤 기록도 남지않기 때문에 config파일은 내 깃헙 repo에 올라가지 않는다.

먼저 위에서 heroku create로 생성된 도메인 주소와 깃 주소가 생성되었을 텐데 해당 깃 주소를 remote add한다. 

#터미널
git remote add heroku [heroku 깃 주소]

그러면 git remote -v로 확인해보면

이렇게 잘 되어있을 것이다. 

그러면

git add [커밋할 파일]
git commit -m [커밋 메세지]
git push heroku [설정한 branch] or git push heroku [설정한 branch]:main

을 하면 배포가 진행 된다.

 

그렇게 build가 성공적으로 잘 된다면

#터미널
heroku ps:scale web=1 : 서버 scale up
heroku ps:scale web=0 : 서버 scale down
heroku restart
heroku open

으로 배포된 서버를 실행시킬 수 있다. 

 

또한 에러가 발생한다면

#터미널
heroku logs --tail

명령어로 어디서 에러가 발생하는지를 알아볼 수 있다. 

 

※ 가끔 Compiled slug size: 579.7M is too large (max is 500M). 라는 이유로 build가 fail하게 되는 에러가 발생하기도 한다. 

이런 경우 공식문서는  .slugignore에 정적파일 같은 앱 실행시 불필요한 파일을 넣어서 slug크기를 줄이라고 권유한다. 

stackoverflow.com/questions/61062303/deploy-python-app-to-heroku-slug-size-too-large

실제 우리 서비스는 tensorflow 2.3을 requirements에 넣어주기 때문에 매우 용량이 커서 이러한 에러가 났었다. 그래서 .slugignore에는 최대한 정적 파일(jupyter notebook코드) 등을 넣어주고, https://stackoverflow.com/questions/61062303/deploy-python-app-to-heroku-slug-size-too-large

이 글을 보고 어짜피 gpu를 사용할 수도, 사용할 필요도 없기 때문에 tensorflow-cpu로 수정해 주었더니 389.9M으로 줄일 수 있었다. 

 

3. DB 배포

① 카드 등록

회원가입후에 해당 링크로 들어가서, 카드를 등록하면 한달에 1,000시간을 무료로 쓸 수 있다.

 dashboard.heroku.com/account/billing

 

② cleardb 생성

#터미널
heroku addons:create cleardb:ignite -a [서버 배포한 앱(즉, 위에서 'heroku create 저장소 이름' 으로 만들어준 저장소 이름]

③ grep으로 db 주소확보하기

#터미널
heroku config | grep CLEARDB_DATABASE_URL

을 하면 생성된 SQLALCHEMY_DATABASE_URI 정보를 알 수 있다. 

mysql:// "username" : "password"@ "host주소" / "database 이름" ?reconnect=true 와 같다. 

④ 세팅

#터미널
heroku config:set MYSQL_HOSTNAME=나의 host 주소

그리고 config파일에서도 Production환경에서 사용할 SQLALCHEMY_DATABASE_URI를 위에서 얻은 것으로 적어준다. 

⑤ clearDB에 모델 migration & upgrade로 반영시키기

migration 폴더도 함께 heroku 배포git에 올라갔으니

#터미널
heroku run python manage.py db upgrade

해주면 sequel pro로 확인해 보면 다 잘 들어갔음을 알 수 있다.  ㅎㅎㅎ

※ 헤로쿠 명령어

heroku restart

heroku open  #서버 실행 확인

heroku logs --tail  #서버 실행시 로그보기

heroku ps:stop run.1 #서버 실행 종료

heroku apps  #헤로쿠 서버 실행

heroku ps:scale web=1  #서버 scale up

heroku ps:scale web=0  #서버 scale down

heroku ps #상태확인

※ 발생할 수 있는 에러

my-medisharp.herokuapp.com/

 

FLASK RESTPLUS(RESTX) API BOILER-PLATE WITH JWT

 

my-medisharp.herokuapp.com

git commit -m 'Deploy/201209/:bulb:/git pull heroku main 후 conflic해결'   

git pull heroku main으로 pull 받은 뒤 conflict해결하면서 최신 코드로 수정하고

기존 방법대로 git push heroku Deploy:main 을 해주니 해결되었다. 

 


devcenter.heroku.com/articles/git#multiple-remotes-and-environments

 

Deploying with Git | Heroku Dev Center

Last updated 30 October 2020 Heroku manages app deployments with Git, the popular version control system. You definitely don’t need to be a Git expert to deploy code to Heroku, but it’s helpful to learn the basics. Prerequisites: Install Git and the He

devcenter.heroku.com

 

reference

 Heroku(헤로쿠) 가입, Heroku CLI 다운로드, 간단 사용법,

 Node.js 사이트 Heroku(헤로쿠)로 인터넷에 올리기,

 [AI웹 프로젝트]Heroku에 Flask배포

Push different branch to Heroku

Heroku mysql DB 생성해주기

Heroku 이용해서 flask 서버 배포하기