[Drupal 筆記] 透過 Drush 將網站資料同步

Jiajun Xu 發表於 三, 10/14/2020 - 02:01

最近應客戶的要求,研究起「如何將網站資料庫及檔案,同步到另台主機的備份站」這個議題。

原本很普通地想用半同步複製處理 MySQL、用 rsync 指令處理檔案;又爬了一圈文的時候才驚覺,Drupal 的神隊友:Drush,居然全都能一手包辦!基本上就是兩個指令:drush sql:syncdrush core:rsync。以下簡單介紹使用方式:

一、環境設定:Drush Site Aliases

不過在下指令之前,需要先設定 Drush Site Aliases。一般來說,我們通常是在儲存 Drupal 專案檔案的資料夾、也就是所謂 "docroot" 來執行 Drush 的;但如果你有好幾個專案,甚至各專案運行在不同的遠端環境、需要透過 SSH 來連結,那麼操作起來就變得很麻煩。Drush site aliases 就是為了處理這項問題而生的功能,我們可以透過 Yaml 設定檔,預先將把各個專案之路徑、SSH 登入資訊等設定值儲存起來,往後,只要在下 Drush 指令的時候加上 @[alias] ,就等同於直接在目標專案的路徑中執行 Drush,而不用常常切換路徑或主機。

以下示範如何自訂 Drush Site Aliases:

  1. 新增 ~/.drush/drush.yml ,告訴 Drush,我們的 aliases 相關設定放在哪裡:
drush:
  paths:
  alias-path:
    - '${env.home}/.drush/sites'

  1. ~/.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 的用途:

  • mainmirror 就是 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。

    1. 以上面設定檔為例,指令是:
    drush rsync @local.main @local.mirror
    
    
    1. 接下來我們要針對 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"。
      1. mode:相當於 rsync 的 flags。
      2. exclude-paths:相當於 rsync--exclude,但可以一次設定多個目標檔案和資料夾。
    1. 設定檔寫好之後呢,就可以直接下指令啦。此外我們還可以在 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
    
    

    收工!

    標籤 (Tags)