TrellisでWordPressを仮想化してVPSに丸ごとデプロイする手順メモ
「Trellis」を使えば、WordPressの開発環境を丸ごと仮想化し、本体も含めてComposerで管理し、デプロイも1コマンドで済ませることができる。DockerではなくVagrantを使うので注意。
更新履歴
2021/08/28
- プラグインをインストールするコマンドのタイポを修正
- テーマのコンパイルについて追記
Trellisのサイト
以下は2021年8月1日現在の内容。随時Roots公式のドキュメントを確認すること。あとVagrantやAnsible周辺の依存関係にも注意しないといけない。
前提となるものを用意
- VirtualBoxとVagrant
- PHPとComposer
- Trellis CLI
AnsibleはTrellisのファイルを使って導入します!
Trellisでローカル開発環境を構築
trellis new example.com
Ansible導入
pip install -r trellis/requirements.txt
これで Trellisで使えるバージョンの Ansibleが手に入る。あとmacOSなら今後のデプロイに必要なpasslib
が手に入る。
CGIキャッシュ有効化
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キャッシュを有効化する。
暗号化
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に戻した。(ここでリアル三日浪費した)
初回起動時に
- VMのイメージをダウンロードする
- Vagrantが起動
- からのPHPとWordPressのインストール
をするため、めちゃくちゃ時間がかかる。
roleがないエラー
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
プラグインを入れられる。
有効化を忘れないこと。
おすすめプラグイン
{
...(前略)
"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に登録
上記記事にRootsのアフィリエイトリンクがあり、DigitalOceanのお試しクレジットが$100手に入る。そこからサインアップする。
アカウント作成後、PayPalで本人確認用の支払いをする。
Droplets作成
「Deploy a virtual machine」を選択。
上記記事はちょっと古く、今はUbuntu20で大丈夫。月5ドルのスペックを選ぶ。重そうだがCGIキャッシュでどうにかして軽くするらしい。
データセンターはシンガポール。時間がないのでSSH鍵はid_isa.pub
を選んだが、この鍵はtrellis/group_vars/all/users.yml
で変更可能。
Dropletが起動した。
プロビジョニング
Floating IPの設定
動的IPを割り振るため、「Floating IP: Enable now」をクリックする。
「Assign Floating IP」。
[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にレポジトリと公開鍵を追加
プライベートレポジトリを作って、ルートディレクトリを丸ごとコミットする。
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
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
が出たら終わり。
クローンができない場合
調べてみるとクローンに失敗するという報告が多い。どうやらクローンのタスクのログがオフになっているので有効化する。
- 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をローカルに同期する
WP-CLI
を入れる。
https://roots.io/plugins/sync-script/
wpコマンドに自信がないので、こちらのスクリプトに頼っている。
ローカルでテーマをコンパイルしてしまう
「Rootsエコシステム」を最大限活かすには「Sage」テーマを活用するのがベスト。
しかし、デプロイするとSageテーマのビルドコマンドが走らない(真っ白になる)場合がある。
そんな時は、こちらのtrellis/deploy-hooks/build-before.yml
の説明に従おう。
このファイルには「Install npm dependencies」「Install Composer dependencies」「Copy production assets」のタスクが書かれていて、アンコメントすればデプロイ前にyarn build:production
が実行される。
参考
Discussion