高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

Heroku ─ Ruby 程式語言的最佳雲端環境

本篇文章已刊載於OpenFoundry電子報技術專欄,刊登之內容由專業的OpenFoundry團隊潤稿,此篇為原文。

你曾經用Ruby on Rails開發網站,但在國內找不到可以用的主機空間嗎? 或者你是新創公司,但初期還沒足夠資金投資在伺服器的硬體設備上嗎? 又或是沒有專職的MIS幫你管理伺服器嗎? 讓我們來看看Heroku吧!

簡介

用Ruby on Rails開發網站很快、很方便,但在台灣比較麻煩的是可以租用的主機空間並不好找,如果要自己架一台成本又太高,而且也有一定的技術門檻。目前市面上有不少PasS(Platform As A Service)的解決方案,例如Amazon的AWS(Amazon Web Services)雖然也是個不錯的解決方案,但還是得花一些時間想辦法安裝、設定到可以執行Rails的環境。如果你不想這麼麻煩,Heroku就是個很不錯的解決方案。不只是Ruby on Rails的程式,任何Rack程式都可以在Heroku執行(包括Ruby on Rails跟Sinatra都沒問題)。

費用及效能

選擇主機最在乎的,不外乎是費用及效能這兩件事。Heroku最讓人喜愛的地方之一,就是它有提供免費的額度可以用,網站空間部份,每個專案的限制是100MB,這對一般的小型的專案來說還滿夠用的;資料庫的部份,每個專案的資料庫大小限制則是5MB,而且有SQLite、MySQL、PostgreSQL可以選用。

至於效能基本上也不至於太差,對一個一般的網站來說,Heroku的1個dyno(Heroku的計價單位)差不多是可以處理10~50 request/second。如果覺得不夠用,也可以考慮它的付費方案來增加dyno數:

image

只要拉一下選項,調整dyno數,就可以知道每個月要花多少費用了。

申請

請到這裡填寫Email,不需要額外的費用。

image

填寫完成後應該不久就會收到一封啟用的認證信,點擊認證連結回到Heroku網站,設定登入密碼:

image

這樣就完成申請的程序了。

安裝

有兩個工具是使用Heroku會用得上的:Ruby以及Git。Ruby使用1.8或1.9版本皆可,個人建議使用1.9.2的版本,如果你不想在電腦裡裝太多版本的Ruby的話,也可參考這篇,使用RVM來安裝Ruby。

以下範例因為都是在RVM執行的,所以不會需要root權限,如果你用的是一般系統的Ruby的話,可能會需要sudo來取得root權限才能順利安裝。

裝好Git跟Ruby之後,Heroku有打包好的gem可以使用:

> gem install heroku
Fetching: rubyzip-0.9.5.gem (100%)
Fetching: heroku-2.15.3.gem (100%)
Successfully installed rubyzip-0.9.5
Successfully installed heroku-2.15.3
2 gems installed

建立專案

裝好Heroku之後,我們使用heroku create指令來建立一個空的專案:

> heroku create
Enter your Heroku credentials.
Email: eddie@eddie.com.tw
Password:
Could not find an existing public key.
Would you like to generate one? [Yn] n
Creating deep-spring-4010... done, stack is bamboo-mri-1.9.2
http://deep-spring-4010.heroku.com/ | git@heroku.com:deep-spring-4010

Heroku會在第一次建立專案的時候問你剛才申請的帳號密碼,如果你不想這麼麻煩,在上面的過程中它也會問你要不要建立一組public key,如果選擇Y就會引導你建立一組public key。

在一開始創建專案的時候,Heroku會自動幫你隨機產生一個名字,以上面的範例來看就是deep-spring-4010。再來我們打開瀏覽器,連上http://deep-spring-4010.heroku.com/,應該可以看到這個畫面:

image

如果上面這個deep-spring-4010的名字你不喜歡,也可以到Heroku網站後台去修改,或是直接在一開始建立的時候就指定名稱:

> heroku create hello_kitty

這樣就會幫你用hello_kitty這個名稱來建立專案,只要名稱沒有先被申請走,你就可以使用。Heroku還有提供更多其它方便的指令可以使用,詳細內容可參考Heroku的這篇說明

上傳你的應用程式

不像一般的網站空間是透過FTP上傳檔案,Heroku是透過Git來發佈的。不過在這之前,我們先來簡單的用Rails的scaffold來快速的建立一個簡單的小程式,待會我們要把這個簡單的程式上傳到Heroku上。

建立Rails專案

> rails new my_heroku_demo
.. 訊息略 ..

> cd my_heroku_demo
.. 訊息略 ..

> rails g scaffold Book title:string author:string publish_date:date

> rake db:migrate
==  CreateBooks: migrating ===================
-- create_table(:books)
        -> 0.0019s
==  CreateBooks: migrated (0.0023s) ==========

> rails s
.. 訊息略 ..

打開瀏覽器連上http://127.0.0.1:3000/books應該就能看到剛剛建立的頁面。

image

如果各位對Ruby on Rails不熟悉的話,建議可以參考一下Rails官網上的這篇文章Getting Started with Rails

部署

網站做好後,接下來就是要把東西上傳到Heroku上。請在剛剛建立的專案底下輸入指令:

> git init .
Initialized empty Git repository in /tmp/my_heroku_demo/.git/

> git add .

> git commit -m 'first commit'
.. 訊息略 ..

再來要把遠端的Heroku加進來:

> git remote add heroku git@heroku.com:deep-spring-4010.git

最後再一個git push指令,就可以把做好的東西"推"上Heroku:

> git push heroku master

接下來你應該會看到一些訊息,並且在Heroku上自動幫你安裝一些需要的gem。再來,因為我們有用到資料庫,所以也需要做一下rake db:migrate,不過跟在本機做的時候稍有不同:

> heroku rake db:migrate

這樣就會對Heroku上的資料庫做migration的動作了。完成之後,請打開瀏覽器輸入網址http://deep-spring-4010.heroku.com/,或是輸入heroku open,也會幫你打開預設的瀏覽器。

image

如果看到Rails預設的首頁的話,表示應用程式已經順便傳上去了。再來輸入網址http://deep-spring-4010.heroku.com/books,順利的話,你應該就可以看到剛剛寫好的程式了。

到這裡你大概就已經學會如何Heroku佈署你的Rails應用程式了。在Rails 3.1之前的版本應該都會滿順利的,但如果你用的是Rails 3.1的話(包括之後的版本),你可能不會這麼順利.. 讓我們繼續看下去。

問題

雖然Heroku很方便,但有個比較大的問題是Heroku是個"唯讀"的平台,所以如果你想類似檔案上傳或相簿功能的網站的話,上傳的東西需要另外想辦法傳到別的地方(例如上傳到Amazon的S3)。而在Rails 3.1之後引進了asset pipeline,靜態檔案會動態產生,而Heroku沒辦法讓你這樣做,所以,你需要先在本機先把asset編譯好之後再推一次上去:

> rake assets:precompile RAILS_ENV=productioran
.. 訊息略 ..

> git add .

> git commit -m 'add precompied assets'
.. 訊息略 ..

> git push heroku
.. 訊息略 ..

另外,如果你在做heroku rake db:migrate這個步驟的時候出現這個錯誤訊息的話:

> heroku rake db:migrate
rake aborted!
Please install the postgresql adapter: `gem install activerecord-postgresql-adapter` (pg is not part of the bundle. Add it to Gemfile.)

Tasks: TOP => db:migrate => db:load_config
(See full trace by running task with --trace)

請打開你的Gemfile,加上這一段:

group :production do
    gem "pg"
end

加完之後再執行:

> bundle install --without production

應該就可以正常運作了。

Heroku的後台管理

我們回到Heroku網站,登入之後可以看到目前有建立哪些app:

image

例如我們看看我們剛剛建立的那個deep-spring-4010

images

可以看到關於這個app的使用情況。如果這個專案不要了,也可以直接從後台刪除掉。

結論

Heroku提供了一個可以簡單、快速佈署Ruby應用程式的平台,不用自己維護主機,不需要的時候隨時可以停掉服務,或是萬一臨時要加大硬體需求或頻寬,只要線上刷卡就可以輕鬆解決,設定上相當簡單。

不過就以就費用來看的話,加大dyno數來應付更大需求是很方便,但它可能不會是最便宜的方案(甚至其實還滿貴的)。我個人覺得它很適合試一些簡單的小專案,或是一些臨時想到的idea,用Rails快速的idea做出來,再丟上Heroku的免費額度試一下大家的反應如何,如果真的越做越大的話,也許再考慮正式投資更多的預算或硬體。

畢竟開發專案,最重要的就是先把東西做出來,之後要做更大規模的,現在的雲端平台的延展性(Scalability)都還不錯,通常只要花錢就可以幾乎無痛昇級。

不久前Heroku還提供了對Facebook app的支援,對想要在Facebook上建立應用程式的人來說也是一大福音,連Ruby的發明者松本行弘也在不久前加入了Heroku,受聘為首席架構師,相信Heroku能提供的服務會越來越豐富。如果各位有在寫Ruby應用程式卻還苦於找不到地方放的話,建議不妨可以試試看Heroku。

Comments