今天試著將兩個手頭上已經沒在密集維護但偶有流量的網站移植到Heroku上來降低維護的成本,過程中相當輕鬆地將專案無痛轉移到Heroku之外,連資料都一起順利轉移過去了,以下是轉移步驟的簡介。

  1. 將專案納入git版本控管中,指令是git init
  2. 建立一個新的Heroku空間,指令是heroku create或是heroku create YOUR_APP_NAME
  3. 在config/environment.rb加上$KCODE='u'(避免中文編碼問題,我是加在第一行)
  4. 將所有檔案丟到Heroku上:git add . ; git commit -a -m "deploy to Heroku" ; git push heroku master

步驟其實很簡單,官方文件上應該也能找到更詳盡的教學,另外要注意的是,如果您的專案擁有自己的網址,希望能一併指到Heroku,還需要注意下列事項:

  1. 將DNS中的CNAME 指到proxy.heroku.com,或是將A Record指到75.101.163.44, 75.101.145.87, 174.129.212.2,Heroku的程式在新增custom domain name時會先檢查您的DNS Records。
  2. 請在Heroku的帳戶管理中輸入您的信用卡資料(custom domain name雖然是免費的服務,但要驗證信用卡)
  3. 使用heroku addons:add custom_domains指令啟用自定網址
  4. 使用heroku domains:add YOUR_DOMAIN_NAME來新增網址

當然,上述步驟可以不透過指令,直接在Heroku的管理介面完成。

我自己在移植的過程中遇到兩個問題,第一個是資料丟上Heroku之後都變成亂碼,但我的MySQL編碼就是UTF8了,實在沒道理,因此就嘗試加上$KCODE的設定,沒想到馬上管用。

第二個問題是資料如何丟到Heroku,步驟也很簡單:

  1. sudo gem install tap(tap就是讓你可以無痛轉移的關鍵Ruby gem)
  2. heroku db:push(如此一來就會把資料庫,包括schema、data、index完整送上Heroku)

其中要注意的是,Heroku設計的原意是讓你可以將開發過程中已有的測試資料(development環境)丟上Heroku一併測試,因此我目前沒有找到如何讀取production環境的參數,我自己的作法是在config/database.yml中將development的設定改為production的設定,讓程式去讀取production。

或是你也可以使用指令的方式指定任意的資料庫:heroku db:push mysql://YOUR_USER_NAME:YOUR_PASSWORD@localhost/DB_NAME

P.S. 當然,如果嫌Heroku不好用或是其他原因想要搬家,只要下heroku db:pull,就會把雲端上的資料撈回來放在development環境,我自己是用SQLite,資料就會倒進SQLite了,是不是很方便呢?:p