--- title: 12th 鐵人賽 Day_29 專案部署?AWS ? tags: 12th 鐵人賽 --- # 12th 鐵人賽 Day_29 專案部署?AWS ? 嗨!各位朋友大家好,打給後,歹嘎吼,胎尬喉,我是阿圓,一樣有請今天的one piece: ![](https://i.imgur.com/s8pJQcM.jpg) (海賊王空島篇!雲上服務!) 昨天我們講到了 Heroku ,一個非常方便的平台,讓我們可以將專案給別人看到,但是 heroku 的限制還是有點多的,他雖然方便,但是並不適用於較複雜的專案,所以我們今天來說說 AWS! ![](https://i.imgur.com/W3uYOFc.png) ## AWS EC2 相較於 Paas 的 Heroku,AWS 是屬於 IaaS(Infrastructure as a service),簡單來說就是 Heroku 的基底(Heroku 事實上也是使用 AWS 的),只是 Heroku 幫你把環境的建置好了! 而 AWS ,提供了超~級多的服務,可以將你的 server 變得更方便、更安全(前提是要設定正確!) 網路上有人花了整整兩分鐘才把aws的服務「唱」完 <iframe width="560" height="315" src="https://www.youtube.com/embed/BtJAsvJOlhM" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> 咳咳,我們繼續回到部署的部分,其實不管是用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 部署工具,原來是這樣](https://5xruby.tw/posts/rails-deploy/) ## 將專案推到 EC2 上 若要將專案丟到遠端主機上,是利用 GitHub。 我們需要從遠端主機上連線到我們專案的 GitHub 網頁,然後把專案 clone 下來。 為了要做到這件事,我們會需要在遠端主機上產生一把 ssh key(最好是先建立一個使用者),並將 public key 加入專案的 Deploy keys 裡,這樣才能正確的將專案給拉到 遠端主機上,而專案建立好後,就像是在本機開伺服器一樣仍然要`bundle install`、`rails db:create`、`rails db:migrate`...等等等。 ## Capistrano 如同上面說的,若要將專案的 server 正常啟動,必須要從 `git clone` 開始,再來`bundle install`...等等,超多步驟,此時我們就會需要方便的 gem , Capistrano ,來幫我們的忙,他是一個自動化部署的工具,有了它,我們會先將設定檔寫好,接著,只要簡單的一行指令`cap production deploy`,Capistrano 就幫你全部做好囉! ### Capistrano 設定 在 gem file 裡放上: ` gem 'capistrano', '3.14.1', require: false` 為了設定方便,通常還會再加上以下幾個: ```ruby= 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`,就會幫你長出幾個檔案 ```bash= 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`,做一些設定: ```ruby= require "capistrano/bundler" require "capistrano/rails" require "capistrano/passenger" require 'capistrano/upload-config' ``` 這樣才會幫你下指令喔! 接著要去做部署的設定: ```ruby= # 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" ``` ```ruby= # 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 部署工具,原來是這樣](https://5xruby.tw/posts/rails-deploy/) 在更進階的一點的設定就要去買網域、設定ssl憑證,將遠端主機的 HTTPS port 打開....等,這個部分就讓我們用最後一天的一點篇幅來說說吧! 感謝各位看到這邊,若有任何建議,請各位不吝指教!我們明天見!(倒數第二篇了!) ![](https://i.imgur.com/PPbpd2b.gif)