여러분이 만든 앱을 헤로쿠로 올립니다.

Created by Terence Lee, @hone02

헤로쿠를 내려받습니다.

루비로 헤로쿠 시작하기의 “소개”와 “준비 하기”를 따라서 가입하고, 헤로쿠 CLI를 설치한 다음, 로그인합니다.

COACH: 헤로쿠로 배포하는 방법과 기존의 서버로 배포하는 방법을 비교하여 설명합니다.

앱을 준비합니다.

버전 컨트롤 시스템

여러분이 만든 코드를 버전 컨트롤에 담아야 합니다. 터미널에서 아래와 같이 실행할 수 있습니다:

git init
git add .
git commit -m "initial commit"

COACH: 버전 컨틀롤 시스템과 git 에 대해서 설명하기에 적절한 시기입니다.

데이터베이스를 업데이트합니다.

맨 먼저 할 일은 헤로쿠에서 사용할 데이터베이스를 준비해야 합니다. 개발할 때 사용하는 데이터베이스와 다릅니다. Gemfile 을 아래와 같이 수정합니다:

gem 'sqlite3'

위의 내용을 아래와 같이

group :development do
  gem 'sqlite3'
end
group :production do
  gem 'pg'
end

수정하고 bundle install --without production 터미널에서 실행하여 환경에 따라 젬을 구성합니다.

git add .git commit -m "Use postgres as production database"를 꼭 실행합니다. 수정사항을 마스터 브랜치에 반영한 다음 헤로쿠로 올리기 위해서 입니다.

COACH: 관계형 데이터베이스 관리 시스템 DBMS 를 설명하고, 헤로쿠에서 사용하는 포스트그레스큐엘 PostgreSQL에 대해 자세히 알려줍니다.

앱을 배포합니다.

앱을 생성합니다.

헤로쿠 앱을 생성하기 위해 터미널에서 heroku create를 실행합니다. 실행 결과는 아래와 같습니다:

Creating app... done, ⬢ young-reaches-87845
https://young-reaches-87845.herokuapp.com/ | https://git.heroku.com/young-reaches-87845.git

헤로쿠가 여러분의 앱을 “young-reaches-87845”이라고 이름을 붙입니다.

코드를 헤로쿠로 올립니다.

다음으로 헤로쿠로 코드를 올리려면 터미널에서 git push heroku master를 실행합니다. 실행결과는 아래와 같습니다:

Counting objects: 115, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (97/97), done.
Writing objects: 100% (115/115), 25.62 KiB | 0 bytes/s, done.
Total 115 (delta 10), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.2.4
remote: -----> Installing dependencies using bundler 1.11.2
remote:        Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
remote:        Fetching gem metadata from https://rubygems.org/..........
remote:        Fetching version metadata from https://rubygems.org/...
remote:        Fetching dependency metadata from https://rubygems.org/..
remote:        Installing concurrent-ruby 1.0.2
...
remote: -----> Launching...
remote:        Released v5
remote:        https://young-reaches-87845.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/young-reaches-87845.git
 * [new branch]      master -> master

원격 깃저장소에 푸시 명령어로 소스 코드를 올리듯이 헤로쿠에 푸시하면 위와 같이 “Launching…” 이라고 떠야 배포 작업이 끝납니다.

데이터베이스를 옮깁니다.

다음으로 앞서 로컬에서 데이터베이스를 옮기는 명령(마이그레이션)어를 실습한 것처럼 헤로쿠의 데이터베이스를 옮겨야 합니다:

heroku run rails db:migrate

명령어를 실행한 다음, 앱의 url 주소를 브라우저에 붙여넣습니다. 위에서는 https://young-reaches-87845.herokuapp.com/입니다. 터미널에서 heroku open 실행하면 앱의 url 주소로 브라우저가 열립니다.

끝으로

헤로쿠 플래폼에는 낯설어 보이는 고유한 특징이 있습니다. 헤로쿠에서 돌아가는 애플리케이션의 환경은 이페머럴입니다. 이페머럴은 파일(테이터베이스에 저장한 정보는 예외)을 애플리케이션에서 만들어도 애플리케이션을 재시작하면 사라져 버립니다. (예, 헤로쿠로 새버전을 올리는 경우)

이페머럴 파일시스템 Ephemeral filesystem

(https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem)

헤로쿠에서 돌아가는 최소 단위인 다이노 dyno 마다 하나씩 이페머럴 파일시스템이 있습니다. 그리고 다이노에는 가장 최근에 올린 소스 코드만 반영합니다. 프로그램을 하나씩 실행하듯이 다이노를 실행하고 다이노가 실행하는 동안 프로세스가 사용하는 파일시스템은 임시 저장 공간입니다. 같은 다이노라고 하더라도 프로세스가 다르면 한 프로세스가 만든 파일을 다른 프로세스가 사용할 수 없습니다. 그리고 다이노를 정지하거나 재시작하는 순간 그동안 사용한 파일을 날려버립니다. 예를 들어, 애플리케이션을 배포할 때와 다이노 관리 정책에 따라 하루에 한번정도 다이노가 바뀔 때 파일이 사라집니다.

튜토리얼을 따라서 만들어 본 에서 아이디어 레코드에 파일을 첨부하면, 새로운 파일에 결과를 쓰고 서버의 public/uploads 폴더로 업로드합니다. 헤로쿠의 이페머럴 스토리지는 아래와 실행하면 파일이 사라지는 상황을 마주칩니다:

  1. 터미널에서 heroku open를 실행합니다.
  2. 아이디어를 새로 만들고 이미지 파일을 첨부합니다.
  3. 터미널에서 heroku restart를 실행합니다.
  4. 웹브라우저에서 좀 전에 만든 아이디어로 가서 페이지 새로 고침 버튼를 누르면 앞서 첨부한 이미지가 사라져버립니다.
이페머럴 스토리에서 운영하는 방법

이러한 방법은 애플리케이션을 실제로 운영하기에 적합하지 않아 보입니다. 따라서 재시작하더라도 파일을 계속 유지할 수 있는 대안을 소개합니다.

가장 많이 쓰는 방법으로 아마존 S3(Simple Storage Service), 랙스페이스 클라우드 파일즈와 같은 클라우드 호스팅 서비스를 사용합니다. 이러한 서비스는 1기가바이트에 0.1 달러 미만으로 저렴합니다. 여기서 ‘클라우드’라는 표현은 애플리케이션이 하드디스크와 같은 저장장치를 사용하듯이 어디서나 파일을 호스팅할 수 있다는 의미입니다.

이러한 기능은 튜토리얼의 범위를 벗어나므로 더 자세한 내용은 아래에 있는 링크를 참고합니다:

언제든지 여러분에게 정보와 도움이 필요할 때 도우미가 도와드릴 수 있겠습니다.