iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 29
0
自我挑戰組

Ruby on Rails 新手的30個問題!系列 第 29

Day_29 專案部署?AWS ?

嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,一樣有請今天的one piece:

(海賊王空島篇!雲上服務!)
昨天我們講到了 Heroku ,一個非常方便的平台,讓我們可以將專案給別人看到,但是 heroku 的限制還是有點多的,他雖然方便,但是並不適用於較複雜的專案,所以我們今天來說說 AWS!

AWS EC2

相較於 Paas 的 Heroku,AWS 是屬於 IaaS(Infrastructure as a service),簡單來說就是 Heroku 的基底(Heroku 事實上也是使用 AWS 的),只是 Heroku 幫你把環境的建置好了!

而 AWS ,提供了超~級多的服務,可以將你的 server 變得更方便、更安全(前提是要設定正確!)
網路上有人花了整整兩分鐘才把aws的服務「唱」完

咳咳,我們繼續回到部署的部分,其實不管是用aws或是gcp(google 出的web service),最重要的就是要先有一台主機讓專案在上面跑,若是使用AWS的話,請搜尋 EC2 ,它提供了不同區域的主機供你做租借,依照你的需求做選擇(有運算能力強的,有強調網路效率的...超多!)

而目前 AWS 有提供免費方案,EC2 是可以選擇一台 type 為 t2.micro 的主機,每個月有750小時供使用。(不過 micro 的記憶體只有 1G ,不太能跑較複雜的專案)

申請了 EC2 上的 主機(instance)(以下統稱 遠端主機)後,並且將基本設定全部設定完後,會生成一對SSH key給你,是用來讓你連線上這台 instance 做事的,請保管好,此生只有這一把,再也不會補發給你!

開啟遠端主機後,就相當於有一台全新的電腦,如果要讓 Rails 的專案在上面跑起來,就需要先安裝:
基本建置:

  1. Ruby
  2. Rails
  3. node.js
  4. 甚至是 postgresql
  5. 還有一些哩哩摳摳的小東西,像是 git、wget、curl、vim...等等等的系統小工具

部署工具
為了要讓專案動起來,還必須裝上:

  1. passenger
  2. nginx

passenger 是負責處理 Rails 專案的 Process 數量,而nginx 是負責處理 http 的 request 和 response。有關於 passenger,與nginx 的那些事,請參閱Rails 部署工具,原來是這樣

將專案推到 EC2 上

若要將專案丟到遠端主機上,是利用 GitHub。
我們需要從遠端主機上連線到我們專案的 GitHub 網頁,然後把專案 clone 下來。
為了要做到這件事,我們會需要在遠端主機上產生一把 ssh key(最好是先建立一個使用者),並將 public key 加入專案的 Deploy keys 裡,這樣才能正確的將專案給拉到 遠端主機上,而專案建立好後,就像是在本機開伺服器一樣仍然要bundle installrails db:createrails db:migrate...等等等。

Capistrano

如同上面說的,若要將專案的 server 正常啟動,必須要從 git clone
開始,再來bundle install...等等,超多步驟,此時我們就會需要方便的 gem , Capistrano ,來幫我們的忙,他是一個自動化部署的工具,有了它,我們會先將設定檔寫好,接著,只要簡單的一行指令cap production deploy,Capistrano 就幫你全部做好囉!

Capistrano 設定

在 gem file 裡放上:
gem 'capistrano', '3.14.1', require: false
為了設定方便,通常還會再加上以下幾個:

gem 'capistrano-bundler', '2.0.1'
# 幫你做 bundle install
gem 'capistrano-rails', '1.6.1'
# 相當於 assest、migrate ,幫你做 compile 跟 db:migrate
gem 'capistrano-passenger', '0.2.0'
# 幫你 重啟 passenger app
gem 'capistrano-upload-config', '~> 0.7.0'
# 幫你上傳被 gitignore 的檔案到遠端主機

別忘了 bundle install。接著,在終端機打上cap install,就會幫你長出幾個檔案

mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified

請先去Capfile.rb,做一些設定:

require "capistrano/bundler"
require "capistrano/rails"
require "capistrano/passenger"
require 'capistrano/upload-config'

這樣才會幫你下指令喔!

接著要去做部署的設定:

# config/deploy.rb 全域設定
lock "~> 3.10.1"

# 設定專案名稱
set :application, "do_deploy"

# 讓機器知道要到哪裡找我們的程式碼
set :repo_url, "git@github.com:shes50103/do_deploy.git"

# 放在 shared 中,那些不在版本控制中的檔案
append :linked_files, "config/database.yml", "config/secrets.yml", "config/settings.yml"

# 放在 shared 中,不同 release 之間共享的目錄
append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"
# config/deploy/production.rb 特殊環境設定
# 設定部署 Rails 的模式
set :rails_env, :production

# 決定要部署版本控制庫的哪一個 branch
set :branch, 'master'

# 決定部署到遠端伺服器哪個地方,從絕對路徑寫起
set :deploy_to, '/home/deploy/do_deploy.com'

# 使用本機的 ssh key 連線到遠端主機以 deploy 的 user 做部署
role :web, %w{deploy@178.128.xxx.xxx}
role :db, %w{deploy@178.128.xxx.xxx}

接著可以簡單地用 cap production deploy:check,來看一下基本設定是否有問題。若沒有噴錯誤訊息,就可以 cap production deploy,如此一來,就可以輸入 遠端主機的IP位置,看到我們的專案囉!

友善提醒:部署的過程中,會遇到專案、及環境的影響,可能會常常跑出錯誤訊息,這時請莫急莫慌莫害怕,仔細閱讀錯誤訊息,他會告訴你還缺什麼,接著一道一道解決就行囉!

其他有關部署的相關問題,一樣請參閱Rails 部署工具,原來是這樣

在更進階的一點的設定就要去買網域、設定ssl憑證,將遠端主機的 HTTPS port 打開....等,這個部分就讓我們用最後一天的一點篇幅來說說吧!

感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見!(倒數第二篇了!)


上一篇
Day_28 專案部署?Heroku ?
下一篇
Day_30 專案部署(續) & 結賽心得!
系列文
Ruby on Rails 新手的30個問題!30

尚未有邦友留言

立即登入留言