몇일 전 항상 많은 도움을 주시는 이지호님과 만나 Heroku CLI의 여러 기능들을 보게 되었습니다. 기존에 인지하고 있던 Heroku는 생성부터 배포까지 번거로운 과정이 있다라는 이미지였고, 이로 인해 잘 사용하지 않았었는데, CLI로 간편하게 프로젝트 시작부터 배포까지 가능한 것을 보고 한번 사용해보기로 결심했습니다.

Heroku란?

git을 base로 Cloud PaaS 를 제공하는 곳으로, 홈페이지에서 간단한 이메일 인증으로 가입할 수 있습니다. 기본적으로 배포되는 서버는 무료로 제공되지만 사용자의 접속 여부에 따라 가동이 정지(30분간 이용이 없으면 sleep)되기 때문에, 활성 서비스로 운영하기 위해서는 유료 결제가 필요합니다. 유료 결제(월 $7)시 SSL을 기본 제공하고 domain을 커스텀할수 있어, 블로그 처럼 항상 운영 중인 서버가 없다면 유료 결제도 고려해볼만한 옵션입니다.

server(Heroku 내에서의 명칭은 Dyno)외에도 Database를 함께 사용할 수 있는데 마찬가지로 사용량에 따라 비용이 책정되어 저렴하게 이용 가능합니다. Heroku-cli 를 통해 해당 Database에 대한 관리와 연동이 가능하기 때문에 server와 함께 사용할 경우 더욱 편리합니다.

설치

맥에서는 brew를 통해 손쉽게 설치가 가능합니다. brew install heroku/brew/heroku 명령어로 바로 설치가 가능하고, 설치되는 즉시 CLI의 기능을 사용할 수 있습니다. 설치가 완료되면 heroku --version 명령어로 정상적으로 설치가 이루어졌는지 확인할 수 있습니다.

설치가 완료되면 heroku의 자동완성기능을 사용할지 여부에 대해 묻는데, oh-my-zsh와 bash 의 설정 방식이 다릅니다. Oh-my-zsh 를 기본 쉘로 사용할 경우 아래 코드를 .zshrc 파일 하단에 넣어준 후 명령어를 입력해야 합니다.

if type brew &>/dev/null; then
  FPATH=$(brew --prefix)/share/zsh/site-functions:$FPATH
fi

명령어 입력 후 저장한 뒤 heroku autocomplete --refresh-cache를 입력하면 브라우저 로그인을 통한 인증이 수행된 뒤 autocomplete 기능이 활성화 됩니다. (최초 설치시 위와 같은 과정으로 인해 로그인이 자동으로 진행되지만, 이후에는 heroku login 명령어를 통해 최초 로그인 후 계정 정보를 로컬(~/.netrc)에 보관합니다. )

Django App 배포해보기

설치가 완료되어 로그인을 진행하고 나면 간단하게 배포해볼 프로젝트를 만들어보고 시작할 수 있습니다. 로컬의 코드를 관리하는 부모 폴더에서 사용하는 virtual 환경(pyenv 혹은 virtualenv 혹은 둘다)를 이용하여 python 환경을 셋팅하고 Django와 gunicorn을 설치해줍니다. 이어서 명령어로 django project 생성과 git initialize 해줍니다.

pip install django gunicorn
django-admin startproject heroku
cd heroku
git init

생성된 경로에서 git remote -v를 통해 아무 저장소가 연결되어 있지 않음을 확인하고 heroku의 repository에 연동하여줍니다.

# heroku app 생성 명령어를 통해 heroku service에 배포할 프로젝트를 생성
heroku create {{app_name}}
# 현재 initialize 된 프로젝트의 git repository를 heroku로 연결
heroku git:remote -a {{app_name}}

# git repository가 연동되었는지 확인
git remote -v

Git 명령어의 결과로 fetch, push remote 서버가 등록된 것을 확인할 수 있습니다.

위 과정을 거치고 나면 heroku 서버에서 django가 실행될 수 있도록 gunicorn을 실행할 수 있는 파일을 제공해주어야 합니다. Django root 폴더에서 아래와 같이 수행할 수 있습니다.

echo 'web: gunicorn {{django_project_name}}.wsgi' > Procfile

또 heroku 서버가 이 프로젝트의 배포에 필요한 python 패키지를 인스톨할 수 있도록 아래 명령어로 requirements 파일을 생성하여 줍니다.

pip freeze > requirements.txt

Heroku 에서 배포시에는 heroku 앱의 이름으로 도메인이 제공되기 때문에 django settings.py 에서 이를 수정해주고 반영하는 것이 좋습니다.

# 변경 전 코드
ALLOWED_HOSTS = []

# 변경 후 코드
ALLOWED_HOSTS = ['{{heroku_app_name}}.herokuapp.com']

작업이 마무리되면 최종적으로 배포를 진행해줍니다. git add -A 로 소스코드를 git에 반영한 후 git commit -m "init"으로 커밋을, git push heroku master를 통해 소스코드를 heroku repository에 푸시합니다. 푸시를 하고나면 collect static 과정에서 오류가 발생할 수 있는데 heroku config:set DISABLE_COLLECTSTATIC=1 명령어를 통해 임의로 막은 후 다시한번 git push heroku master 명령어를 수행하여 배포를 마무리 할 수 있습니다. 배포가 완료되면 아래와 같은 알림문구 들이 뜨는데 released version 하단에 제공되는 링크로 접속하면 Django의 It worked! 를 보실 수 있습니다.

그래서 Heroku?

과거에 Heroku를 제대로 사용하는 방법이 무엇인지 몰랐을 때는 heroku에서 제공하는 Document만 보며 이해하려 했었는데, 직접 쓰는 걸 보고 해보니 이렇게 편한걸 이제 알았나 싶습니다. 글을 쓰기전 배포 과정을 한번 수행해본 후 바로 $7 카드결제를 질렀고, 어떤 프로젝트들을 올릴지, Database 연동은 언제해볼지 등을 고민하게 됩니다. 당장 회사에서 점심 식사 조 편성 페이지를 heroku로 전환할까 생각이 들만큼, 좋은 서비스라는 생각입니다.

Heroku에서는 서버에 접속하지 않아도 Django Shell 이나 manage.py 를 활용한 명령어를 전송할 수 있는데 다음 글에서는 이와 관련된 내용을 담아보려 합니다.