🌊

TrellisでWordPressを仮想化してVPSに丸ごとデプロイする手順メモ

commits9 min read

「Trellis」を使えば、WordPressの開発環境を丸ごと仮想化し、本体も含めてComposerで管理し、デプロイも1コマンドで済ませることができる。DockerではなくVagrantを使うので注意。

更新履歴

zenn-cliで更新しているのですが、ファイル名を変えたせいで記事が再公開になってしまいました... いいねして下さった方、本当に申し訳ありません。

2021/08/28

  • プラグインをインストールするコマンドのタイポを修正
  • テーマのコンパイルについて追記

Trellisのサイト

https://roots.io/trellis/

以下は2021年8月1日現在の内容。随時Roots公式のドキュメントを確認すること。あとVagrantやAnsible周辺の依存関係にも注意しないといけない。

前提となるものを用意

AnsibleはTrellisのファイルを使って導入します!

Trellisでローカル開発環境を構築

trellis new example.com

Ansible導入

pip install -r trellis/requirements.txt

これで Trellisで使えるバージョンの Ansibleが手に入る。あとmacOSなら今後のデプロイに必要なpasslibが手に入る。

CGIキャッシュ有効化

https://roots.io/docs/trellis/master/fastcgi-caching/#example-cache-configurations
trellis/group_vars/production/wordpress_sites.yml
    cache:   
-      enabled: false
+      enabled: true
+      duration: 30s
+      skip_cache_uri: /wp-admin/|/wp-json/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml
+      skip_cache_cookie: comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in

本番だけCGIキャッシュを有効化する。

暗号化

https://roots.io/docs/trellis/master/vault/

vault.ymlというファイルがいくつかあり、DBのパスとかが平文で書いてある。

危険すぎるので、Ansibleの暗号化機能(をTrellis CLIで呼ん)で暗号化する。

trellis vault encrypt --files=group_vars/production/vault.yml production

上記コマンドで本番用の鍵を暗号化できる。

trellis vault edit group_vars/production/vault.yml

編集はこう。

VM起動

ルートフォルダで以下のコマンドを実行。

trellis up

ここで VirtualBox関連のミスがあると途中で落ちる。 macOS Montereyベータだと失敗したので、仕方なくBig Surに戻した。(ここでリアル三日浪費した)

初回起動時に

  1. VMのイメージをダウンロードする
  2. Vagrantが起動
  3. からのPHPとWordPressのインストール

をするため、めちゃくちゃ時間がかかる。

roleがないエラー

https://zenn.dev/sasigume/articles/ansible-netrc-error

AnsibleでVMをセットアップする際、roleのインストールがうまくいかん場合がある。詳細は上記記事。

VM終了コマンド

trellis down

VMのWordPressをいじる

WPがインストールできたら、trellis/group_vars/development/wordpress_sites.ymlで指定したダミーアドレスで閲覧できるようになる。

なお、初期設定だと管理ユーザはadminで、パスワードはtrellis/group_vars/development/vault.ymlに書いてある。

プラグインのインストール

Bedrockが入っているため、全部Composerで済ませてしまう。なお、trellis upした後に「ComposerやWP CLIはVM内でやってね!」というメッセージが出ているので、VMに入って作業する。

trellis ssh development
# または cd trellis && vagrant ssh

上記コマンドでVMに入れる。

vagrant@example:~$ cd /srv/www/example.com/current

VMの/src/www/example.com/currentが、ローカルのsiteディレクトリと同期されている。

vagrant@example:/srv/www/example.com/current$ composer require wpackagist-plugin/disable-json-api:*

例えばこうすればdisable-json-apiプラグインを入れられる。

有効化を忘れないこと。

おすすめプラグイン
composer.json
{
    ...(前略)
    "wpackagist-plugin/disable-json-api": "*",
    "wpackagist-plugin/classic-editor": "*",
    "wpackagist-plugin/advanced-ads": "*",
    "wpackagist-plugin/advanced-custom-fields": "*",
    "wpackagist-plugin/all-in-one-seo-pack": "*",
    "wpackagist-plugin/amazon-auto-links": "*",
    "wpackagist-plugin/cloudflare": "*",
    "wpackagist-plugin/custom-post-type-ui": "*",
    "wpackagist-plugin/search-regex": "*",
    "wpackagist-plugin/shortcoder": "*",
    "wpackagist-plugin/wp-multibyte-patch": "*",
    "wpackagist-plugin/table-of-contents-plus": "*",
    "wpackagist-plugin/wp-githuber-md": "*",
    "wpackagist-plugin/wp-pagenavi": "*",
    "wpackagist-plugin/wp-super-cache": "*",
    "wpackagist-plugin/duracelltomi-google-tag-manager": "*"
}

要検証: SiteKitがうまくいかない

SiteKitプラグインの開発者用設定を、テスト用アドレスから認証できない。仕方なくTag Manager単体でプラグインを入れた。

VPSを用意

DigitalOceanに登録

https://roots.io/guides/using-trellis-to-provision-and-deploy-to-digitalocean-droplets/

上記記事にRootsのアフィリエイトリンクがあり、DigitalOceanのお試しクレジットが$100手に入る。そこからサインアップする。

アカウント作成後、PayPalで本人確認用の支払いをする。

Droplets作成

「Deploy a virtual machine」がDropletsかな? と思ったらやっぱりそうだった。

上記記事はちょっと古く、今はUbuntu20で大丈夫。月5ドルのスペックを選ぶ。重そうだがCGIキャッシュでどうにかして軽くするらしい。

データセンターはシンガポール。時間がないのでSSH鍵はid_isa.pubを選んだが、この鍵はtrellis/group_vars/all/users.ymlで変更可能。

Dropletが起動した。

プロビジョニング

Floating IPの設定

動的IPを割り振るため、「Floating IP: Enable now」をクリックする。

「Assign Floating IP」。

trellis/hosts/production
[production]
割り当てられたIP

[web]
割り当てられたIP

IPが割り当てられるので、こんな感じで設定する。

プロビジョニングの実行

まずPHPやWordPressをサーバーにセットアップし、デプロイ用のwebユーザを作る。

trellis provision production

鍵のパスフレーズを聞かれる。

全自動で設定されていく。CPU使用率が不安。

PLAY RECAP ****************************************************************************************************************
(Floating IP)            : ok=129  changed=81   unreachable=0    failed=0    skipped=64   rescued=0    ignored=0   
localhost                  : ok=0    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

PLAY RECAPが出たら終わり。

プロビジョニング中によくある間違い

SSH鍵が合ってない

前述した通り、デプロイに使う秘密鍵は、trellis/group_vars/all/user.ymlで設定する。これがDropletsと合っているか確かめる。

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED

エラーログにある通り、SSHのknown_hostsを一旦クリアしないといけない。

ssh-keygen -R (Floating IP)

デプロイ

プロビジョニングでサーバーが整ったら、いよいよデプロイだ。

GitHubにレポジトリと公開鍵を追加

プライベートレポジトリを作って、ルートディレクトリを丸ごとコミットする。

trellis/group_vars/production/wordpress_sites.yml
wordpress_sites:
  example.com:
    site_hosts:
      - canonical: example.com
        redirects:
          - www.example.com
    local_path: ../site
    branch: main
    repo: git@github.com:あなたのユーザー名/example.com.git
trellis/group_vars/all/users.yml
users:
  - name: "{{ web_user }}"
    groups:
      - "{{ web_group }}"
    keys:
-      - "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
+      # - "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
-      # - https://github.com/user.keyss
+      - https://github.com/あなたのユーザー名.keys

次に上記のファイルを編集する。特にブランチ名には注意。

また、公開鍵をGitHubアカウントに追加しておく。

デプロイする

trellis deploy production

なおプロビジョニングができていないと「web? 誰やお前! 鍵なんか出されても困るわ!」と門前払いされる。

PLAY RECAP ***********************************************************************************************
(Floating IP)            : ok=30   changed=13   unreachable=0    failed=0    skipped=41   rescued=0    ignored=0   
localhos

例によってPLAY RECAPが出たら終わり。

クローンができない場合

調べてみるとクローンに失敗するという報告が多い。どうやらクローンのタスクのログがオフになっているので有効化する。

trellis/roles/deploy/tasks/update.yml
- name: Clone project files
# (中略)
-  ignore_errors: true
+  ignore_errors: false
-  no_log: true
+  no_log: false

自分の場合はsubmodulesのブランチを指定していなかったことが原因だった。(参考)

DNS設定前にアクセスする

ローカルでドメインを偽装すればいい。

sudo vi /etc/hosts
IP example.com
IP www.example.com

これでexample.comにアクセスすればWPのインストール画面が出る。

本番環境のDBをローカルに同期する

https://wp-cli.org/

WP-CLIを入れる。

https://roots.io/plugins/sync-script/

wpコマンドに自信がないので、こちらのスクリプトに頼っている。

ローカルでテーマをコンパイルしてしまう

「Rootsエコシステム」を最大限活かすには「Sage」テーマを活用するのがベスト。

しかし、デプロイするとSageテーマのビルドコマンドが走らない(真っ白になる)場合がある。

https://github.com/roots/trellis/blob/master/deploy-hooks/build-before.yml

そんな時は、こちらのtrellis/deploy-hooks/build-before.ymlの説明に従おう。

このファイルには「Install npm dependencies」「Install Composer dependencies」「Copy production assets」のタスクが書かれていて、アンコメントすればデプロイ前にyarn build:productionが実行される。

参考

https://zenn.dev/yamatoiizuka/articles/bb104dac791368

https://roots.io/guides/using-trellis-to-provision-and-deploy-to-digitalocean-droplets/

https://qiita.com/ttsuru/items/4d893b30b2be3f0e5e2f

https://discourse.roots.io/t/err-empty-response/6225/3
GitHubで編集を提案

Discussion

ログインするとコメントできます