簡介

本篇文章說明如何將開發好的 Rails 網站程式部署到 Heroku 平台上,並包含 Production 與 Staging 兩種環境。

環境

Mac OS
Rails 4
Git: 假設 repo 裡面已有兩個 branch: production 和 staging,分別部署至 production 與 staging 兩種環境

步驟

申請 Heroku 帳號

先到 Heroku 申請賬號

安裝 Heroku toolbelt

接著到這裡下載安裝 Heroku toolbelt

登入 Heroku

開啓終端機輸入

1
heroku login

並輸入帳號密碼完成登入

建立 SSH key

1
ssh-keygen -t rsa

都按 Enter 直接用預設值即可

加入 SSH key

1
heroku keys:add

複製環境設定

進入專案目錄下執行

1
cp config/environments/production.rb config/environments/staging.rb

設定 databasee.yml

編輯 config/databasee.yml,設定如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
development:
adapter: "mysql2"
database: "db"
host : "127.0.0.1"
encoding : "utf8"
username : "username"
password : "password"

test:
adapter: "mysql2"
database: "db_test"
host : "127.0.0.1"
encoding : "utf8"
username : "username"
password : "password"

staging:
adapter: postgresql
encoding: unicode
pool: 5

production:
adapter: postgresql
encoding: unicode
pool: 5

我採用的是本機開發使用 mysql,部署到 heroku 使用 postgresql,因為 heroku 只支援 postgresql

加入 unicorn.rb

建立 config/unicorn.rb,設定如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true

before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end

defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
end

defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end

建立 Procfile

建立 Procfile,設定如下

1
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

部署的環境採用 unicorn 作為 Web server 以提供更好的效能

編輯 Gemfile

編輯 Gemfile,設定如下

1
2
3
4
5
6
7
8
group :test, :development do
gem 'mysql2'
end

group :staging, :production do
gem 'pg'
gem 'unicorn'
end

最後一行加入

1
ruby "2.1.1"

如果沒有加入也可以,heroku 目前會自動使用 ruby 2.0.0 版本執行

建立 heroku app

於專案目錄下執行:

1
2
heroku apps:create app-staging-name -r staging
heroku apps:create app-production-name -r production

其中 app-production-name 和 app-staging-name 是你要在 Heroku 上建立的 app 名稱,後面的 production 和 staging 是要在 repo 建立的 remote 名稱

部署

1
2
3
4
5
git push staging staging:master
heroku run rake db:migrate --app app-staging-name

git push production production:master
heroku run rake db:migrate --app app-production-name

設定 staging 環境變數

進入 Heroku 後台,在 Staging 的 App 設定中找到 [Reveal config vars] 的按鈕按下取得環境變數
Reveal config vars

接著將 production 的字樣改成 staging 就可以了
Reveal config vars