Rails 部署實踐 - 補上 Rails 教學缺少的一塊
在我們學習 Rails 的過程中,從安裝環境、設計系統到撰寫程式在市面上都已經有非常詳細的教學,然而到了部署階段受限於篇幅大多只有 Heroku 這個選項,很少有人針對 Rails 的部署深入討論。
這會是一系列的文章,你可以選擇訂閱弦而時習之來收到最新的文章更新,同時在未來如果有額外的內容,也會透過訂閱列表發送給有訂閱的讀者。
Pager 1
在我們學習 Rails 的過程中,從安裝環境、設計系統到撰寫程式在市面上都已經有非常詳細的教學,然而到了部署階段受限於篇幅大多只有 Heroku 這個選項,很少有人針對 Rails 的部署深入討論。
這會是一系列的文章,你可以選擇訂閱弦而時習之來收到最新的文章更新,同時在未來如果有額外的內容,也會透過訂閱列表發送給有訂閱的讀者。
過去幾年,使用容器技術(Container)來部署 Ruby on Rails 專案已經變成我個人最喜歡的方式之一。除了生態系完整之外,也有著容易安裝、部署環境,並且可以很好的維持部署環境乾淨的優點存在。
基於這樣的理由,在 Rails 部署實踐這一系列,我們會由 Rails 的容器部署方案最為起點開始討論可以使用的部署方案。
我們在以容器部署 Rails 的方案介紹了以容器化的方式部署 Rails 專案的方案,然而在部署之前我們還有不少前置準備需要處理。
如果你已經有部署過網站,很可能已經有大部分需要的條件,那麼可以考慮跳過這篇文章。如果是第一次準備部署,那麼可以先來看看這些需要預先準備的東西有哪些。
要將 Ruby on Rails 透過容器的方式部署,我們就需要讓我們的專案可以被容器化。這篇文章我們會採用最簡單的方式進行容器化,扣除掉有使用特殊的 Ruby Gem 的情況下,大多能夠透過這種方式完成容器化。
在 Rails 部署實踐 - 容器化 Rails 專案概述中,我們快速的介紹了將專案容器化的入門技巧,雖然我們可以製作出能夠運行的鏡像,卻沒辦法將它傳送到我們想要部署的環境中。
這篇文章會向大家介紹如何讓我們的伺服器可以獲取要部署的鏡像,並且加以部署。
要將網站使用容器技術部署,就需要有可以運行容器的伺服器。要滿足可以提供其他人連上使用、隨時提供服務以及能夠運行容器,選擇雲端服務上的 Linux 伺服器會是最適合的選項。
現在我們已經有建置好的專案鏡像並且可以被任意伺服器存取,同時也有了能夠運行容器的環境(以 Docker 為基礎)接下來只需要將我們的專案運行起來即可。
當我們透過 Docker Compose 在伺服器上將 Rails 運行起來後,基本上已經符合了部署的條件,也就是我們已經完成了一個可以提供服務的環境。
然而,在現代的網站部署中,使用 SSL 將使用者的連線加密已經是必備的條件,有 Let’s Encrypt 提供的免費憑證也能讓我們快速的搭建安全的網站服務。
在過去傳統的部署方式中,我們大多是單機的方式部署,因此網站如果發生障礙連不上,那麼就可以視為無法使用。
然而當我們有多個網站節點的時候,大多會使用負載平衡(Load Balancer)來將流量分散到不同的節點上,這個時候哪一個節點可以接受流量,就會仰賴健康檢查(Health Check)來回報狀態。
完成網站部署後,我們還需要持續的更新網站。然而如果只有一個節點的話,網站是會有一瞬間服務暫停的狀況,為了避免這樣的問題可以採取滾動更新(Rolling Upgrade)的方式處理。
過去我們需要仰賴人工切換,然而到了虛擬機、容器的階段就能夠透過預先安裝好環境來做到半自動、自動的處理。