CreateField Blog

オープンソースを使って個人でWebサービスを開発・運営していたブログ

HerokuでWordPressを動かす方法

はじめに

WordPressはずいぶん前から流行っているPHP製のCMSで、ちょっとしたコーポレートサイトやブログサイトを非技術者でもある程度管理しやすいように作るにはいまだに便利です。

ただ、Ruby on RailsなどモダンなWeb開発手法に慣れていると、FTPでデプロイとかサーバー上のファイルを直接更新みたいなことはできるだけしたくないもんです。

2018年2月現在で、さくっとHerokuで動かせてGitHubで管理できるWordPress開発環境を構築する方法をまとめておきます。

なお、以下はmacOS Sierraでの作業手順です。

使えそうなものを探す

何事も何かを実装する前には、まず、GitHubで、最近の環境で、参考にできそうなもの、利用できそうなものを探します。

下記のものがよさげなので、こちらを使って作業を開始します。

GitHub - PhilippHeuer/wordpress-heroku: This project is a template for installing and running WordPress 4.9.x on Heroku.

WordPressをモダンな開発環境でいい感じにできる Bedrockっていうものがあるんだ、ふーんって思っておきます。

roots.io

ローカル開発環境構築

  • Composerのインストール
brew install homebrew/php/composer
  • MySQLのインストール
brew install mysql
mysql.server start
mysql_secure_installation # 適当にrootのパスワードを設定などする
sudo ln -s /usr/local/opt/mysql/homebrew.mxcl.mysql.plist /Library/LaunchAgents/
  • Redisのインストール
brew install redis
 ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
 launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

基本的に以下を見てやればいいだけです。

https://github.com/PhilippHeuer/wordpress-heroku/wiki/Deployment

git clone https://github.com/PhilippHeuer/wordpress-heroku
cd wordpress-heroku
composer install
mysql -uroot -p

some_databaseは適当に変えます。

mysql > create database `some_database`;

https://roots.io/salts.htmlEnv Formatのキーをコピーして、.envというファイルに以下を設定します。 passwordsome_databaseは、適当に変えます。

# DB Connection
CUSTOM_DB_URL=mysql://root:password@127.0.0.1:3306/some_database

# Redis
REDIS_URL='redis://127.0.0.1:6379'

# WP Settings
WP_ENV=development
WP_HOME=http://localhost:8080
WP_SITEURL=${WP_HOME}/wp

# Generate your keys here: https://roots.io/salts.html
AUTH_KEY='generateme'
SECURE_AUTH_KEY='generateme'
LOGGED_IN_KEY='generateme'
NONCE_KEY='generateme'
AUTH_SALT='generateme'
SECURE_AUTH_SALT='generateme'
LOGGED_IN_SALT='generateme'
NONCE_SALT='generateme'
  • 起動

macOSでは80番ポート使うのにroot権限が必要そうだったので8080で立ち上げます。

php wp-cli.phar server --host=0.0.0.0 --port=8080 --path=web

http://localhost:8080にアクセスして、適当にサイト名やパスワードを入れるとローカルでwordpressの画面にアクセスできるようになります。

Herokuにデプロイ

Herokuのアプリを作成します。ダッシュボードからでも良いです。

heroku create ${APP_NAME}

上記と同じようにhttps://roots.io/salts.htmlからキーをコピーして、herokuの環境変数に設定します。

heroku config:set \
AUTH_KEY='generateme' \
SECURE_AUTH_KEY=''generateme \
LOGGED_IN_KEY='generateme' \
NONCE_KEY='generateme' \
AUTH_SALT='generateme' \
SECURE_AUTH_SALT='generateme' \
LOGGED_IN_SALT='generateme' \
NONCE_SALT='generateme' \
--app ${APP_NAME}

アドオンを追加していきます。

heroku addons:create sendgrid:starter --app ${APP_NAME}
heroku addons:create scheduler:standard --app ${APP_NAME}
heroku config:set DISABLE_WP_CRON='true' --app ${APP_NAME}
heroku addons:open scheduler --app ${APP_NAME}
heroku addons:create jawsdb:kitefin --app ${APP_NAME}
heroku addons:create papertrail:choklad --app ${APP_NAME}
heroku addons:create heroku-redis:hobby-dev --app ${APP_NAME}

Herokuのファイルシステムではdynoが再起動されると、更新されたファイルが消えます。そのため、画像などのメディアは、Amazon S3のクラウドストレージにアップロードさせます。S3へのアクセス権限を持つアクセスキーをAWS_S3_URLの環境変数に指定します。

AWS_S3_URLは、s3://${アクセスキー}:${シークレットキー}@s3-${リージョン}.amazonaws.com/${バケット名}の形式を想定しているようです。

2018年2月1日現在のソースでは、シークレットキーにスラッシュが含まれている場合、parseに失敗したので、例えば、 https://github.com/PhilippHeuer/wordpress-heroku/pull/27/files のようにして回避しました。*1

heroku config:set \
AWS_S3_URL='s3://${アクセスキー}:${シークレットキー}@s3-${リージョン}.amazonaws.com/${バケット名}' \
--app ${APP_NAME}

これでHeroku側の設定は終わったので、gitのremoteに登録してプッシュすれば、デプロイは完了です。

heroku git:remote -a ${APP_NAME}
git push heroku master

後は、https://${APP_NAME}.herokuapp.com/ にアクセスして、初期インストールすれば、データベースが構築されます。

この状態だとcloneしてきた元のリポジトリのままなので、適当に自分たちのアプリ用に管理しやすいように整えてGitHub管理しましょう。

あと、composerがとても遅いので以下などを参考にして整えたほうがいいと思います。

qiita.com

最後に

次はプラグインあさったり、独自テーマを作ったりしていこうと思います。

ところで、私は、知的財産の商業化に関するスタートアップ IP Nexus(https://www.ipnexus.com)に関連するプロジェクトや特許の検索・分析プラットフォーム(https://patentfield.com)の開発などをしています。

今回のようなWebっぽいことからデータベース、検索、言語処理や機械学習などオールラウンドにしていますが、もっと検索、言語処理や機械学習などの方の作業の比重を大きくしたいです。

ということで、Web開発を手伝ってくれる人がいたら嬉しいです。データ分析や機械学習の方に興味があるという方でも有りです。ただし、現状、Web開発の比重の方がかなり大きいです。

興味があれば、Twitter(@naoa_y)かメール(naoya at patentfield.com)までご連絡ください。

*1:なお、今思うとS3が独自ドメインだとパースできない気がしますが、まあ必要になったら適宜対応すればよさそうという感じです。