---
# System prepended metadata

title: 12th 鐵人賽 Day_29 專案部署？AWS ?
tags: [12th 鐵人賽]

---

---
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`，如此一來，就可以輸入 遠端主機的ＩＰ位置，看到我們的專案囉！


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

其他有關部署的相關問題，一樣請參閱[Rails 部署工具，原來是這樣](https://5xruby.tw/posts/rails-deploy/)

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

感謝各位看到這邊，若有任何建議，請各位不吝指教！我們明天見！(倒數第二篇了！)
![](https://i.imgur.com/PPbpd2b.gif)