Image

最近應客戶的要求,研究起「如何將網站資料庫及檔案,同步到另台主機的備份站」這個議題。
原本很普通地想用半同步複製處理 MySQL、用 rsync 指令處理檔案;又爬了一圈文的時候才驚覺,Drupal 的神隊友:Drush,居然全都能一手包辦!基本上就是兩個指令:drush sql:sync 跟 drush core:rsync。以下簡單介紹使用方式:
一、環境設定:Drush Site Aliases
不過在下指令之前,需要先設定 Drush Site Aliases。一般來說,我們通常是在儲存 Drupal 專案檔案的資料夾、也就是所謂 "docroot" 來執行 Drush 的;但如果你有好幾個專案,甚至各專案運行在不同的遠端環境、需要透過 SSH 來連結,那麼操作起來就變得很麻煩。Drush site aliases 就是為了處理這項問題而生的功能,我們可以透過 Yaml 設定檔,預先將把各個專案之路徑、SSH 登入資訊等設定值儲存起來,往後,只要在下 Drush 指令的時候加上 @[alias] ,就等同於直接在目標專案的路徑中執行 Drush,而不用常常切換路徑或主機。
以下示範如何自訂 Drush Site Aliases:
- 新增
~/.drush/drush.yml
,告訴 Drush,我們的 aliases 相關設定放在哪裡:
drush:
paths:
alias-path:
- '${env.home}/.drush/sites'
- 在
~/.drush/
新增sites
資料夾,接著新增設定檔*.site.yml
,例如local.site.yml
,寫下設定:
main:
root: /var/www/otakupapa/web
uri: https://www.otakupapa.org/
mirror:
host: 55.66.77.88
user: jiajun
root: /var/www/otakupapa/web
uri: https://self.otakupapa.xyz
ssh:
options: '-p 5566'
簡單介紹各 elements 的用途:
- main 和 mirror 就是 alias,main 是本地專案,mirror 是遠端專案。
root
是目標專案的 docroot 資料架路徑,uri
是目標專案的域名。- SSH:因為我們是透過 SSH 連線來管理 mirror 專案,因此要在 alias 設定裡加入
host
、user
、ssh: options
等 SSH 的相關參數。其中 host 係指遠端主機的 IP 或域名;user 係指 SSH 登入時的使用者名稱;ssh: options
係指使用 SSH 連線時的其他參數,像這裡是 port 號。
儲存設定檔之後,可以透過 drush site:alias
列出所有 Drush aliases,來確認設定是否成功:
$ drush site:alias
'@local.main':
root: /var/www/events/web
uri: 'https://www.otakupapa.space/'
'@local.mirror':
host: 55.66.77.88
user: jiajun
root: /var/www/events/web
uri: 'https://self.otakupapa.xyz'
ssh:
options: '-p 5566'
所以我們剛剛設定的兩個 aliases,在 Drush 裡使用時就是寫做 @local.main 和 @local.mirror。
二、同步檔案:core:rsync
在 aliases 設定好之後,同步檔案就很簡單了。基礎寫法是:drush core:rsync [來源 alias] [目的 alias] 。預設同步路徑是 Drupal 專案的 docroot。
- 以上面設定檔為例,指令是:
drush rsync @local.main @local.mirror
- 接下來我們要針對 rsync 來給 site.yml 加入更多參數:
main:
root: /var/www/otakupapa/web
uri: https://www.otakupapa.org/
mirror:
host: 55.66.77.88
user: jiajun
root: /var/www/otakupapa/web
uri: https://self.otakupapa.xyz
ssh:
options: '-p 5566'
command:
core:
rsync:
options:
mode: rlptz
exclude-paths: 'css:js:asset_injector:tmp:php:styles'
- site.yml 裡還可以使用
common
這個參數,它的意思是:當我們對這個 alias 指向的專案執行特定指令的時候,會自動添加的參數。像這裡就是:每當執行core:rsync
的時候,就會自動加入mode
和exclude-paths
相關設定。 - core:rsync 支援四種 rsync 參數,這邊用到兩種:"mode" 和 "exclude-paths"。
- mode:相當於
rsync
的 flags。 - exclude-paths:相當於
rsync
的--exclude
,但可以一次設定多個目標檔案和資料夾。
- mode:相當於
- 設定檔寫好之後呢,就可以直接下指令啦。此外我們還可以在 aliases 後面加上
:%files
,把目標目錄由 docroot 改為 files(甚至寫成:%files/images
,指向 files 的子目錄之類的都可以)。至於其他參數,全都寫在 site.yml 裡面了,指令看起來很精簡:
drush rsync @local.main:%files @local.mirror:%files
三、同步資料庫:sql:sync
drush sql:sync @local.main @local.mirror
收工!