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

Created by Terence Lee, @hone02

헤로쿠를 내려받습니다.

퀵스타트 가이드는 계정을 새로 발급뱓고 툴벨트를 설치하고 헤로쿠에 로그인하는 과정을 1부터 3까지 따라합니다.

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

앱을 준비합니다.

버전 컨트롤 시스템

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

git init
echo "public/uploads" >> .gitignore
echo "tmp" >> .gitignore
echo "logs" >> .gitignore
git add .
git commit -m "initial commit"

COACH: 버전 컨틀롤 시스템과 git 에 대해서 설명하기에 적절한 시기입니다. 그리고 .gitignore 파일을 설명하여 이 파일에 추가한 파일을 버전 콘트롤에서 빼는 이유를 알려줍니다.

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

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

gem 'sqlite3'

위의 내용을 아래와 같이

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

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

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

rails_12factor를 추가합니다.

다음으로 할일로, Gemfile에 rails_12factor를 추가하여 헤로쿠에서 사용하도록 구성합니다.

이 젬은 헤로쿠에 맞도록 레일스 프로젝트를 수정합니다. 예를 들어 에러 메시지 등 로그파일을 저장하는 방법과 스태틱 애셋(이미지 파일, 스타일시트, 자바스크립트 파일)에 대한 설정사항을 헤로쿠 시스템에서 작동하도록 일부 수정합니다.

Gemfile을 아래와 같이 수정합니다:

group :production do
  gem 'pg'
end

위의 내용을 아래와 같이

group :production do
  gem 'pg'
  gem 'rails_12factor'
end

수정하고 터미널에서 bundle을 실행합니다. Gemfile.lock 변경 사항을 버전 컨트롤에 추가합니다:

git commit -a -m "Added rails_12factor gem and updated Gemfile.lock"

COACH: 헤로쿠의 로그 방법과 헤로쿠를 처음 접하는 사람들이 낯설어하는 기능을 설명합니다.

앱을 배포합니다.

앱을 생성합니다.

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

Creating sheltered-refuge-6377... done, stack is cedar
http://sheltered-refuge-6377.herokuapp.com/ | git@heroku.com:sheltered-refuge-6377.git
Git remote heroku added

헤로쿠가 여러분의 앱을 “sheltered-refuge-6377”이라고 이름을 붙입니다.

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

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

Initializing repository, done.
Counting objects: 101, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (91/91), done.
Writing objects: 100% (101/101), 22.68 KiB | 0 bytes/s, done.
Total 101 (delta 6), reused 0 (delta 0)

-----> Ruby app detected
-----> Compiling Ruby/Rails
-----> Using Ruby version: ruby-2.0.0
-----> Installing dependencies using 1.6.3
       Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
       Fetching gem metadata from https://rubygems.org/..........
...
-----> Launching... done, v6
       http://sheltered-refuge-6377.herokuapp.com/ deployed to Heroku

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

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

다음으로 앞서 데이터베이스를 옮기는 명령어를 실습한 것처럼 터미널에서 heroku run rake db:migrate를 실행합니다.

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

끝으로

헤로쿠 플래폼에는 낯설어 보이는 고유하는 특징이 있습니다. 헤로쿠에서 돌아가는 애플리케이션의 환경은 이페머럴입니다. 이페머럴은 하루살이 꽃이나 곤충처럼 짧은 기간동안만 애플리케이션을 실행하면 만든 파일을 유지하는데 소스 코드를 다시 올리거나 앱을 재실행하면 예전 파일을 사용할 수 없습니다. 단, 데이터베이스에 저장하는 것은 계속 유지합니다.

이페머럴 파일시스템 Ephemeral filesystem

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

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

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

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

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

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

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