Kurt Hsu's blog

The Rails developer in taiwan.


  • 首頁

  • 標籤

  • 分類

  • 歸檔

[Rails]Bootstrap制作漂亮flash

發表於 2018-05-04 更新於 2019-08-21 分類於 Rails , Gem

Rails有個內建的Flash還蠻好用的,但就是有點簡略,一開始還真不知道怎麼改他的畫面,先用簡單的例子理解它:

隨便創作一個method然後byebug:

controller.rb
1
2
3
4
def test
flash[:alert] = "Alert!"
byebug
end

此時在終端機下的byebug之下查看
$ flash
會出現
\<Set: {}>, @flashes={“alert”=>”Alert!”}, @now=nil>
就利用這個特性來客製一下flash的畫面吧!

在Rails最通用的三個flash分別是alert, notice, warning,現在我們看bootstrap的alert,然後挑選自己喜歡的顏色後,準備一個module給flash:
$ touch app/helpers/flashes_helper.rb
建立如下:

flashes_helper.rb
1
2
3
4
5
6
7
8
9
10
11
module FlashesHelper
FLASH_CLASSES = { alert: "danger", notice: "success", warning: "warning"}.freeze

def flash_class(key)
FLASH_CLASSES.fetch key.to_sym
end

def user_facing_flashes
flash.to_hash.slice "alert", "notice","warning"
end
end

現在還看不懂吧!我們先建立view:

view.html.erb
1
2
3
4
5
6
7
8
<% if flash.any? %>
<% user_facing_flashes.each do |key, value| %>
<div class="alert alert-dismissable alert-<%= flash_class(key) %>">
<button class="close" data-dismiss="alert">×</button>
<%= value %>
</div>
<% end %>
<% end %>

看到第一行if flash.any?如果真的有flash被創造出來才顯示

再來看到user_facing_flashes.each do |key, value|
user_facing_flashes是剛剛創造的helper
如果是剛剛的例子flash.to_hash會出現{“alert”=>”Alert!”}
完整的flash.to_hash.slice “alert”, “notice”,”warning”意思是把key等於這三個的hash都抓出來
意思是如果當前flash的key不包含這三個就會回傳空的hash
回去view看<%= value %>就是Alert!了!

最後<div class="alert alert-dismissable alert-<%= flash_class(key) %>">只是管理css
flash_class利用FLASH_CLASSES.fetch key.to_sym用key抓取value回傳
例如key是alert就會回傳她的vlaue是danger
所以render出了bootstrap的 alert-danger

[Rails]建立mailer和串接Mailgun發送郵件

發表於 2018-05-04 更新於 2020-05-17 分類於 Rails , mailer , Mailgun

參考文章:
Rails 實戰聖經
Rails Guides

前言


我們在創造Rails專案的時候其實已經有下列檔案:
app/mailsers/application_mailer.rb
app/views/mailer.html.erb
app/views/mailer.text.erb

基本上跟原本的網頁東西原理很像
app/mailsers裡面的東西就像是controller
app/views/mailer.html.erb就像是網頁的application.html.reb
app/views/mailer.text.erb則是因為不是所有客戶端都可以顯示 HTML 格式的信件所以有存文字檔

建立一個最簡單的mailer


$ rails generate mailer UserMailer
創造了:
app/mailers/user_mailer.rb
app/views/user_mailer
以及一些test檔

先修改主要的application_mailer檔案:

app/mailers/application_mailer.rb
1
2
3
4
class ApplicationMailer < ActionMailer::Base
default from: "from@example.com"
layout 'mailer'
end

default為設定寄信人的信箱

再來創造一個最簡單的welcome_email

app/mailers/user_mailer.rb
1
2
3
4
5
6
class UserMailer < ApplicationMailer
def welcome_email(email)
@email = email
mail(to: @email, subject: 'Welcome to My Awesome Site')
end
end

這時候剛剛創造的method是什麼名稱就在app/views/user_mailer資料夾創造一樣名稱的html:
$ touch app/views/user_mailer/welcome_email.html.erb

簡單做出html:

app/views/user_mailer/welcome_email.html.erb
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1>Welcome!!!</h1>
<p>
You have successfully signed up here
</p>
<p>Thanks for joining and have a great day!</p>
</body>
</html>

再來可以先嘗試在rails console看有沒有東西:
$ rails c
$ UserMailer.welcome_email("example@test.com")

此時如果真的用送出去的指令:
$ UserMailer.welcome_email("example@test.com").deliver!
則會報錯

由於在本地端永遠不會真的送出郵件,利用letter_opener這個gem可以模擬信件在遊覽器上面

Gemfile
1
gem 'letter_opener', group: :development

$ bundle install

修改config/environments/development.rb環境檔:

config/environments/development.rb
1
2
3
4
…(略)
config.action_mailer.default_url_options = { host: 'localhost:3000' }
config.action_mailer.delivery_method = :letter_opener
end

$ rails c
$ UserMailer.welcome_email("example@test.com").deliver!
應該可以成功看到模擬畫面!

串接mailgun


我的專案是利用Capistrano部署在linnode上

註冊完mailgun後他會給一個免費的domain帶有亂碼sandboxdxxxx….mailgun.org,打開之後有以下訊息:

  • IP Address
  • SMTP Hostname
  • Default SMTP Login
  • API Base URL
  • Default Password
  • API Key

修改production.rb:

config/environments/production.rb
1
2
3
4
5
…(略)
config.action_mailer.default_url_options = { :host => '你的网域名称,暂时还没有就填IP地址' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = config_for(:email).symbolize_keys
end

mailer會需要mailer.yml這隻檔案,但為了避免自己的密碼被看到,創造一個空的檔案:
$ touch config/email.yml

然後修改deploy.rb檔案:

deploy.rb
1
append :linked_files, "config/database.yml", "config/secrets.yml", "config/email.yml"

代表說等等他會去伺服器上面路徑~/jdstore/shared/config/裡面找這些檔案

到伺服器上:
$ touch 專案名稱/shared/config/email.yml
輸入以下資訊:

email.yml
1
2
3
4
5
6
7
8
production:
address: "smtp.mailgun.org"
port: 587
domain: "mailgun.org"
authentication: "plain"
user_name: "postmaster@sandboxXXXXXX.mailgun.org"
password: "XXXXX"
enable_starttls_auto: true

user_name替換成mailgun上的Default SMTP Login
password替換成mailgun上的Default Password

回到本地端commit一版push到github上面後deploy
$ cap production deploy

[Devops]letsencrypt申請https (Nginx in Ubuntu 16.04)

發表於 2018-05-01 更新於 2020-01-19 分類於 Devops

使用前建議:
安裝並設定好Nginx和管理好DNS,可以參考這篇文章:[Devops]管理DNS並設定Nginx做出漂亮的網址


letsencrypt可以直接申請免費的憑證,全程只要在自己的主機上下command就好。

到首頁GETTING STARTED之後他會建議使用Shell的人使用Certbot去遵循安裝步驟,很人性化的直接給你選使用什麼樣的web server在什麼樣的系統主機,我在這邊是使用Nginx on Ubuntu 16.04(xenial)

進入到自己的root,如果不是的話以下的command line前面都要加上sudo獲得root權限。

首先先使用apt安裝certbot的套件:
$ apt-get update
$ apt-get install software-properties-common
$ add-apt-repository ppa:certbot/certbot
$ apt-get update
$ apt-get install python-certbot-nginx 下這行之後他會建議安裝一些python的東西,回答Y給他安裝吧!

再來要設定在nginx上面:
certbot --nginx
這行自動設定在nginx的config檔上面,如果不喜歡他擅自更動檔案的話可以下:
certbot --nginx certonly

再來他會問一些問題:
1.Enter email address
輸入自己的email

2.會給網址請你去看條款並問是否同意
Y

3.想要哪個網域有https認證
他會列出Nginx你之前設定過的網域,輸入數字代碼即可

4.是否要讓訪問這個一定要有https認證,取消http
這邊我是選2

再來會給你一些重要資訊,譬如說私鑰它放在哪個資料夾,極度建議去備份。

再來打開自己的網頁,應該就成功嘍!


最後這個免費憑證是90天,會建議60天以後上去查看或更新,輸入以下指令:
certbot renew --dry-run
應該就可以更新嘍!

[Devops]管理DNS並設定Nginx做出漂亮的網址

發表於 2018-04-30 更新於 2019-12-29 分類於 Devops

所需:

購買一個網域,網路上例如linode這種平台都會提供賣網域的服務,我則是在goDaddy買的。

什麼是Nginx?
Nginx是一種web server,普遍有名的還有Apache等等,這篇紀錄如何用Nginx管理DNS(Domain name system),就是當這個主機接收到什麼domain時會開啟什麼頁面。

可以想像web server是一個主機門口的遊覽器接待,只要是使用遊覽器訪問(request)這個主機一定要先通過這個接待的帶領,他最重要的工作如下:
1.拿取http(s)協定
2.帶領客戶端找到他要的東溪

管理DNS


先購買一個網域,例如購買了 test.com這個網域,最容易混淆也最常用的類型是A和CNAME。

簡單的來說:
A類型是引導到主機IP位置。
CNAME類型是引導到別的網域,雖然也可以直接打IP但很不建議這麼做。
參考文章:
Differences between the A, CNAME, ALIAS and URL records

在GoDaddy進入到DNS 管理管理頁面,左上角可以看到自己網域的名稱,例如test.com。
如果新增或編輯A和CNAME都需要輸入名稱和值。

名稱是subdomain,一個網域可以創造很多個subdomain
值是真正要導向的IP或別的網域

subdomain又是什麼?
他可以利用同一個網域做出辨識度較高的網址

例如我有三個主機:
第一個主機是服飾店——–IP是111.111.111.11
第二個主機是動物用品店—IP是222.222.222.22
第三個主機是部落格——–IP是333.333.333.33

此時我可以新增三個A類型

名稱 值 輸出Domain
store.clothes 111.111.111.11 store.clothes.test.com
store.animal 222.222.222.22 store.animal.test.com
blog 333.333.333.33 blog.test.com

當然為了一個專案開一台主機實在是太浪費了,我們可以只在一台主機上利用Nginx導向不同的專案,後面會再提到。

如果是要導去別的域名建議使用CNAME,例如我在別人做的部落格註冊了自己的部落格:

名稱 值 輸出Domain
blog awsomeblog blog.test.com

但導過去之後網址還是會依別人的平台為主,但至少在收尋引擎上收尋test blog會比較容易找到自己的blog!
再傳給別人blog網址的時候也比較漂亮。

小小trick,如果再GoDaddy管理DNS假設在A類型名稱新增一個@:

名稱 值 輸出Domain
@ 111.111.111.11 test.com

就可以在CNAME這樣使用:

名稱 值 輸出Domain
store @ store.test.com

但當然不建議這樣使用啦~

設定Nginx


如何安裝請參考 [Devops]安裝數據庫和Nginx + Passenger 網站服務器

可以觀察/etc/nginx/nginx.conf檔案,可以在http底下建立server物件,指定什麼樣的domain訪問這個主機會開啟什麼樣的專案出來,就如同主機入口的招待一樣。

不過通常會習慣建立一個資料夾去處理各個server然後引入到nginx.conf這個檔案裡面去,他也會有一個sites-enabled的資料夾推薦放置在這。

假如沒有的話就自行建立(資料夾名稱sites-enabled可以自訂):
$ mkdir /etc/nginx/sites-enabled

然後檢查nginx.conf檔案有沒有include進來:

/etc/nginx/nginx.conf
1
2
3
4
5
6
…(略)
http {
…(略)
include /etc/nginx/sites-enabled/*;
}
...(略)

到自己的主機上面使用root,新增或修改/etc/nginx/sites-enabled/rails-recipes.conf
rails-recipes為當初自己設定的名稱:

rails-recipes.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name store.test.com animal.store.test.com; # 用你自己的服务器 IP 位置可以多個用空格分開就好

root /home/deploy/jdstore/current/public; # 用你自己的项目名称位置

passenger_enabled on;

passenger_min_instances 1;

location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
}

listen就是port
server_name就是剛剛管理DNS創立的domain,可以多個用空格分開就好!
root就是專案的資料夾

所以像剛剛管理DNS提到的一個主機放多個專案就是在 /etc/nginx/sites-enabled這個資料夾裡面建立,例如:
store.clothes.conf
store.animal.conf
blog.conf

最後都設定好的話下nginx指令跑更新:
$ sudo service nginx restart
沒報錯的話他不會有反應,有的話就去檢查設定再下一次這行指定。

如果設定好之後通常就可以使用自己創立的domain訪問看看,但創造domian可能會等至多48小時,以前比較常發生這種事情,不過現在通常是不到一分鐘就好了。

參考文章:
Ruby on Rails 實戰聖經
Nginx 多網站配置

[Devops]服務器監控服務

發表於 2018-04-29 更新於 2019-08-21 分類於 Devops

網站 Uptime 監控


以下這些第三方服務,可以每隔幾分鐘檢查你指定的 URL 是否正常回應(不需要額外安裝Gem),如果連不上可以透過 E-mail 通知你。免費的方案就夠用了,如果需要短信通知或增加檢查頻率,則需要付費。

https://uptimerobot.com/
https://www.statuscake.com/
https://tools.pingdom.com/
https://www.pagerduty.com

Rails 異常監控


以下這些第三方服務,可以在 Rails 發生異常 (exception) 時,主動通知及紀錄下這個錯誤例外(exception),好讓我可以進行追踪除錯。

https://rollbar.com
https://airbrake.io
https://sentry.io
https://www.honeybadger.io
這些服務都有提供 gem 可以安裝,按照註冊流程應該就可以完成。

效能監控


以下這些第三方服務,會紀錄監控網站程式的效能,例如網站的回應速度,協助你分析哪些部分需要做最佳化改善:

https://www.skylight.io/
https://newrelic.com/
https://appsignal.com/
這些服務都有提供 gem 可以安裝,按照註冊流程應該就可以完成。

[Devops]伺服器數據庫備份

發表於 2018-04-29 更新於 2019-08-21 分類於 Devops

通常我們要備份的東西有三個:
code 把專案上傳在github就已經很夠
數據庫這是最重要的需要匯出
使用者上傳的檔案如果專案有上傳檔案的功能就需要

MySQL手動備份


如果有使用者上傳的檔案請先放到下面這個資料夾:
/home/deploy/rails-recipes/shared/public/system

再來把MySQL數據庫匯出:
$ mysqldump -u root -p 專案名稱 > 檔案名稱.sql
參數 -u root 表示用數據庫的 root 帳號、-p 表示要輸入密碼、匯出專案數據庫到.sql這個檔案

把剛剛匯出的檔案gzip壓縮:
$ gzip 檔案名稱.sql

完成MySQL數據庫備份檔案,這隻檔案就可以備份在其他地方!

再來把備份的檔案匯入的話先解壓縮:
$ gunzip 檔案名稱.sql

匯入MySQL數據庫:
$ mysql -u root -p 專案名稱 < 檔案名稱.sql

PostreSQL手動備份


如果有使用者上傳的檔案請先放到下面這個資料夾:
/home/deploy/rails-recipes/shared/public/system

再來把PostreSQL數據庫匯出:
$ pg_dump -W -U postgres -h localhost 專案名稱 > 檔案名稱.sql

把剛剛匯出的檔案gzip壓縮:
$ gzip 檔案名稱.sql

完成PostreSQL數據庫備份檔案,這隻檔案就可以備份在其他地方!

再來把備份的檔案匯入的話先解壓縮:
$ gunzip 檔案名稱.sql

匯入MySQL數據庫:
$ psql -W -U postgres -h localhost 專案名稱 < 檔案名稱.sql

自動備份


使用https://github.com/backup/backup 這個Ruby 工具可以幫助我們設定好自動備份,可以參考https://gist.github.com/ihower/5a28624f9420fb9a7c49 這會備份整個mysql 數據庫,打包壓縮整個/ srv 目錄,上傳到指定的AWS S3 bucket,最後寄送email 通知完成。

在服務器上執行 crontab -e 可以編輯例行性工作排程(crontab),以下是一個每日凌晨 4:30 自動執行的範例:
$ 30 4 * * * /bin/bash -l -c '/usr/local/bin/backup perform -t my_backup -c /home/ihower/Backup/config.rb'

[Linode]Linode防火墙

發表於 2018-04-29 更新於 2019-08-21 分類於 Linode , Linux

Linode 並沒有內建防火牆功能,可以用 ufw 來設定 Linux 要開放哪些 Port。

以下是開放 Port 3000, 80, 443 的指令:
$ sudo apt-get install ufw
$ sudo ufw default deny
$ sudo ufw allow 3000
$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw enable 啟用防火牆
$ sudo ufw status 顯示目前狀態

如果發現網站被特定IP攻擊,也可以用 ufw 來丟棄特定來源的數據包:
$ sudo ufw insert 1 deny from <要ban掉的IP>
$ sudo ufw reload

[Rails]檢視Capistrano部署Rails專案的log和伺服器

發表於 2018-04-29 更新於 2019-08-21 分類於 Rails , Gem

假設已經部署成功後進入該主機

專案log


檢查專案log
$ cd ~/專案名稱/current
$ tail -n 500 log/production.log 可以顯示500行
$ tail -f log/production.log可以不斷顯示下去

檢查Nginx的錯誤
$ su root 總之需要root權限
$ vim /var/log/nginx/error.log

系統狀態


$ free -h顯示內存
$ df -h顯示硬碟剩餘空間
$ sudo passenger-status顯示Passenger狀態
$ sudo passenger-memory-stats顯示Passenger內存狀態

$ top系統狀態
最上面的load average 三個數字分別代表最近1分鐘、5分鐘和15分鐘的系統平均負載。數字越小越好,表示系統不忙。如果你的服務器只有單顆 CPU,那這個數字應該要小於1。兩顆CPU則要小於2。

$ ps ax有點像打開系統管理員可以看到正在執行的程式
$ sudo kill -9 <PID>可以強制刪除該程序,這是最後手段

Nginx重啟指令


默認安裝完以及開機後,就會啟動 Nginx。如果有修改 Nginx 設定檔,需要重開 Nginx。
$ sudo service nginx start啟動
$ sudo service nginx stop停止
$ sudo service nginx restart重啟

如果只是要重開 Rails,可以不重開 Nginx。在你的 Rails 目錄下(例如 /home/deploy/rails-recipes/current 這個目錄)執行 touch tmp/restart.txt 即可,這樣 Passenger 就會知道要重新加載 Rails,而不需要重開 Nginx。

進 rails console


到部署專案的使用者帳號
$ cd ~/專案名稱/current
$ bundle exec rails c production

如何在遠端跑 rake?


例如想在服務器上執行 rake db:seed:
到部署專案的使用者帳號
$ cd ~/專案名稱/current
$ RAILS_ENV=production bundle exec rake db:seed

整理 Log 檔案


Linux 內建有 logrotate 工具,可以定期清空和壓縮 Log 檔案。如果你不整理的話,Rails 的 production.log 會不斷成長到撐爆硬盤空間。

用 root 權限新增 /etc/logrotate.d/rails 檔案,內容如下:

/etc/logrotate.d/rails
1
2
3
4
5
6
7
8
/home/deploy/專案名稱/shared/log/*.log {
monthly
dateext
missingok
rotate 65535
notifempty
copytruncate
}

daily 表示每天整理,也可以改成 weekly 或 monthly
dateext 表示檔案補上 rotate 的日期
missingok 表示如果找不到 log 檔也沒關係
rotate 表示保留65535份,建議如果硬盤空間夠的話,就不要砍log檔了,以供未來備查
compress 表示壓縮起來,默認用 gzip
delaycompress 表示延後壓縮直到下一次 rotate
notifempty 表示如果 log 檔是空的,就不 rotate
copytruncate 先複製 log 檔的內容後,在清空的作法,因為有些程式一定 log 在本來的檔名,例如 rails。另一種方法是 create。

如果是daily可以等明天或者是執行:
$ sudo /usr/sbin/logrotate -f /etc/logrotate.conf
應該可以看到rails 項目下的 log/production.log 被依日期拆開了。

[Nginx]Nginx 設定

發表於 2018-04-29 更新於 2019-12-29 分類於 Nginx

假設已經利用Capistrano部署了一個Rails專案到雲端伺服器上,請參考文章:[Rails] Capistrano 部署rails專案到 linode

在伺服器上用root權限編輯/etc/nginx/nginx.conf:

/etc/nginx/nginx.conf
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
  # 让 Nginx 可以读到环境变量 PATH,Rails 需要这一行才能调用到 nodejs 来编译静态档案
+ env PATH;

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
worker_connections 768;
# multi_accept on;
}

http {

# 关闭 Passenger 和 Nginx 在 HTTP Response Header 的版本资讯,减少资讯洩漏
+ passenger_show_version_in_header off;
+ server_tokens off;

# 设定档案上传可以到100mb,默认只有1Mb超小气的,上传一张图片就爆了
+ client_max_body_size 100m;

gzip on;
gzip_disable "msie6";

# 最佳化 gzip 压缩
+ gzip_comp_level 5;
+ gzip_min_length 256;
+ gzip_proxied any;
+ gzip_vary on;
+ gzip_types application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/xml text/plain text/javascript text/x-component;

# 打开 passenger 模组
- # include /etc/nginx/passenger.conf;
+ include /etc/nginx/passenger.conf;

# 下略

在伺服器上用root權限編輯/etc/nginx/sites-enabled/rails-recipes.conf 這個檔案(檔名可以自訂無所謂):
$ /etc/nginx/sites-enabled/rails-recipes.conf

/etc/nginx/sites-enabled/rails-recipes.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name xxx.xxx.xxx.xx; # 用你自己的服务器 IP 位置

root /home/deploy/rails-recipes/current/public; # 用你自己的项目名称位置

passenger_enabled on;

passenger_min_instances 1;

location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
}

設定完之後:
sudo service nginx restart
就成功了!

小補充:
如果 Nginx 設定檔格式不對,例如結尾少了分號 ;,那麼 sudo service nginx restart 會失敗,Nginx 服務器就死掉了。這時候請回頭修好設定檔,然後執行 sudo service nginx start 就會啟動 Nginx 了。如果無法啟動請檢查 /etc/nginx/nginx.conf 和 /etc/nginx/sites-enabled/rails-recipes.conf。

[Rails] Capistrano 部署rails專案到 linode

發表於 2018-04-29 更新於 2019-12-29 分類於 Rails , Gem

總的來說Capistrano會做到下列事情:
1.抓取Github上的最新版本
2.自動bundle 安装套件、 跑數據庫 migration、 編譯 assets 編譯等等
3.在deploy新版本的時候舊有的版本仍然可以運行,使用者感受不大

開始之前linode上的主機要先裝好Rails環境和數據庫,可以參考下面先前的文章:
[Ubuntu]Ubuntu系統更新和安装 Linux 和 Rails 套件
[Devops]安裝數據庫和Nginx + Passenger 網站服務器

先在自己的專案進行設定


安裝數據庫類型的gem和capistrano
MySQL的數據庫的話安裝mysql2
PostgreSQL的數據庫的話安裝pg

修改Gemfile:

Gemfile
1
2
3
4
5
6
7
8
9
10
gem 'mysql2'  # mysql2 和 pg 择一安装即可
gem 'pg'

group :development, :test do
gem 'capistrano-rails'
gem 'capistrano-passenger'

gem 'rspec-rails'
gem 'byebug', platform: :mri
end

$ bundle install

再來開始安裝和設定capistrano:
$ cap install
此時會自動產生檔案

把剛剛產生的檔案做一些設定:

Capfile
1
2
3
4
5
  require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git

+ require 'capistrano/rails'
+ require 'capistrano/passenger'

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
+ sh "ssh-add"

# config valid only for current version of Capistrano
lock "3.8.1"

- set :application, "my_app_name"
+ set :application, "rails_recipes" # 請用你自己的項目名稱

- set :repo_url, "git@example.com:me/my_repo.git"
+ set :repo_url, "git@github.com:xxxxxxxxxx/rails-recipes.git" # 請用你自己項目的git位置

# Default branch is :master
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp

# Default deploy_to directory is /var/www/my_app_name
# set :deploy_to, "/var/www/my_app_name"
+ set :deploy_to, "/home/deploy/rails-recipes" # 這樣服務器上代碼的目錄位置,放在 deploy 帳號下。 請用你自己的項目名稱。

# Default value for :format is :airbrussh.
# set :format, :airbrussh

# You can configure the Airbrussh format using :format_options.
# These are the defaults.
# set :format_options, command_output: true, log_file: "log/capistrano.log", color: :auto, truncate: :auto

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
- # append :linked_files, "config/database.yml", "config/secrets.yml"
+ append :linked_files, "config/database.yml", "config/secrets.yml"

# Default value for linked_dirs is []
- # append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"
+ append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"

+ set :passenger_restart_with_touch, true

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }

# Default value for keep_releases is 5
- # set :keep_releases, 5
+ set :keep_releases, 5

修改 config/deploy/production.rb 設定要用哪一個 branch 放在linode伺服器上,以及伺服器的地址:

config/deploy/production.rb
1
2
3
+ set :branch, "master"
- # server "example.com", user: "deploy", roles: %w{app db web}, my_property: :my_value
+ server "xxx.xxx.xxx.xx", user: "deploy", roles: %w{app db web}, my_property: :my_value

都設定完了之後可以開始嘗試著建立Capistrano 需要的架構目錄在linode伺服器上:
$ cap production deploy:check
會看到一個 ERROR 說伺服器上缺少一些檔案, 再來要到linode服務器上新增這些檔案

在linode伺服器上設定檔案


這裡我創造了一個使用者deploy專門deploy這篇文章的Rails 專案!

$ touch /home/deploy/rails-recipes/shared/config/database.yml
rails-recipes請修改自己的專案名稱

再來如果是MySQL數據庫:

/home/deploy/rails-recipes/shared/config/database.yml
1
2
3
4
5
6
7
production:
adapter: mysql2
encoding: utf8mb4
database: rails_recipes
host: localhost
username: root
password: xxxxxxxxxx

再來如果是PostgreSQL數據庫:

rails-recipes/shared/config/database.yml
1
2
3
4
5
6
7
production:
adapter: postgresql
pool: 25
database: rails_recipes
host: localhost
username: postgres
password: xxxxxxxxxx

password是數據庫的密碼

再來到本地端的專案拿取Capistrano deploy需要的key
$ rake secret

回到linode伺服器上面新增檔案:
$ touch /home/deploy/rails-recipes/shared/config/secrets.yml

/home/deploy/rails-recipes/shared/config/secrets.yml
1
2
production:
secret_key_base: keyxxxxxxxxxx

把剛剛在本地端拿取的key貼到secret_key_base裡面

這時候再一次在本地端用Capistrano check deploy 一次:
$ cap production deploy:check
就不會再噴ERROR了!

如果沒有跟ERROR在本地端用Capistrano執行deploy:
cap production deploy
第一次部署可能需要到數十分鐘,且可能因為網路或伺服器CPU等級比較差而失敗,可以再多跑幾遍即可。

成功了以後之後要更新版本的話,只要保持此專案的Github為最新版本即可,因為他是去抓Github專案的版本去doploy,一樣在本地端下cap production deploy即可。

小補充:
在 config/deploy.rb 的設定中,linked_files 和 linked_dirs 就是在配置部署過程中,需要將這些 shared 下的檔案和目錄,連結到新的 releases 目錄裡面去。

最後也可以參考如何設定Nginx設定
[Nginx]Nginx 設定

1…678…18

Kurt Hsu

Progress One Percent Every Day
171 文章
55 分類
163 標籤
RSS
© 2020 Kurt Hsu
由 Hexo 強力驅動 v3.8.0
|
主題 – NexT.Muse v7.3.0