因為常常在要佈署網站時,有一些相似的流程,想說紀錄一下。這是個簡單的筆記,也許有遺漏的地方,請多多指出。
Linux Distribution
對於 Production Server ,我比較喜歡用穩定一點的 CentOS ,但是很多別人的伺服器都是 Ubuntu LTS ,所以基本上這個 Guide 算是通用。一般我的網站都是放在 Linode 新加坡的機器上。
使用的 Capistrano 相關套件
其實除了這段比較針對 Rails 之外,其他的部份不只是用 Ruby on Rails ,我也是用這個環境跟 Capistrano 佈署手上的 django Project 。
1 2 3 4 5 6 7 8 |
|
我用的 Solution 是:
- Web Server: nginx
- Rack Server: puma
- Ruby Version: RVM
- Database: PosrgreSQL
這篇的舉例是用 Ruby on Rails 為主,之前有碰到一點點 Python ,會另外介紹。不過大部份應該是共通的。
設定 Deploy User 跟 SSH Keys
1 2 3 4 5 |
|
記得照這篇的說明把剛剛生成的 deploy key 的 .ssh/id_rsa.pub
的內容放上去。
這個 User 並沒有設定密碼,預設的 /etc/ssh/sshd_config
的 PermitEmptyPasswords
應該是 no
保險起見可以檢查一下。這樣就只能透過 public key 驗證。通常我會有另外一個常用的可以 sudo 的 user 在機器上。
我喜歡把 App 都放在 /home/deploy
裡面,每個網站就直接拿網址當作資料夾名稱,若同網址有不同的 stage 用底線在後面加註。如: some-good-app.example.org, some-good-app.example.org_staging 。
關閉 SELinux
SELinux 是一個進階的安全模組,但是因為設定複雜、限制不少,一般的 Linux distribution 都是預設關閉的。但是 RedHat 系的 CentOS 及 Fedora 預設是把 SELinux 開啟的,可以參考這個把他關掉。45.2.7. Enable or Disable SELinux。慶幸的是 linode 的一開始就是關掉的。
Nginx 設定
網站設定檔路徑
設定的部份,一般來說會把機器上的各個 App 的設定檔放在 /etc/nginx/sites-available
,然後要 enable 的 App 呢,就利用指到到 sites-available
裡面的設定檔的 Symbol link ,然後放在 /etc/nginx/sites-enabled
。我們要做的是在 /etc/nginx/nginx.conf
裡 include sites-enabled
這個資料夾。
1 2 3 4 5 6 7 |
|
設定 nginx 執行的 user
一般來說 nginx 是用 www-data 這個 user 來執行,我們要把他改成 deploy 。
就在 nginx.conf 的最前面,把 user 改成 deploy 。
1
|
|
Nginx 網站設定檔
再來就是針對我們要 deploy 的 App 的設定檔。這裡給一個有 https 的設定,跟 http 的設定範例。這個設定檔包含一些常見的設定。我還想弄把 static 跟 動態網域分開的,但是我目前還沒玩過,用過之後再來補上設定。
這些設定都是要放在 /etc/nginx/sites-available
底下,通常名字就一樣取網址+底線+ stage 。
要 enable 的站就像這樣做符號連結:
1
|
|
https 的範例:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
http 的範例:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
管理 Nginx 服務
1
|
|
如果設定檔有錯誤,在 status 裡會提到。
PostgreSQL 與 database.yml
安裝完後,可以直接啟動 PostgreSQL 的服務。
1 2 |
|
Postgres 方便的是可以直接用 shell 來管理,要 su
到 postgres
使用者。這裡先建立我們要用到的 user 。而且本機使用也可以不設定 db 密碼。
1 2 |
|
這樣一來, database.yml 就能方便的這樣設定,因為如果沒有設定 user 就會找跟 deploy user 一樣的 user ,在這裡就是 deploy
這個 user 。
在你的開發機上也許有其他相應的 user 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Capistrano
安裝
1 2 |
|
他會幫你生成下列檔案(取自官方 Github 的 README):
1 2 3 4 5 6 7 8 9 |
|
設定
Capfile
Capfile 是設定要用哪些 capistrano 相關的 package 。記得,這些 package 都要在 Gemfile 被 include 到。
他已經預設有一些範例了,這是我通常用的。
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 26 27 28 29 30 |
|
Deploy.rb
config/deploy.rb
是主要的設定檔。其實蠻容易理解的,把該設定的東西填進去就好。
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 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
Stages
預設的 Rails 是有 development, test, production 等三個 stage ,但是一般我們都會再加一個 staging 的 stage 來在上 production 前測試, Capistrano 預設的也是這樣。所以我們要在 Rails 裡也加上這個 stage 。
1
|
|
剛剛我們設定的 database.yml
已經包含 staging 這個 stage 了。
每個 stage 在 config/deploy/
裡都有對應的 .rb
的設定檔。
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
|
Deploy!
做好所有準備之後,我們就可以來 deploy 了。他就會很神奇的把東西從你的 git 拉下來,然後建好檔案,安裝完相關 gem ,跑完 migration ,編完 assets ,還會啟動/重啟 puma server 。
1
|
|
這樣可以看有什麼 task 可以做:
1
|
|
Custom Task
你可以在 lib/capistrano/tasks
裡自己寫 rake task 。下一次介紹 python 的 capistrano deployment 會介紹到。