内容
自作テーマを使って運用していたWordPressブログを別のサーバーに移すにあたり
gitでソースコード管理してdockerでデプロイするようにしてみました
テーマのソースコード管理はやりやすくなりますし
DBのポートを隠蔽できるのでセキュリティもちょっとだけ改善する気がします
1. 環境を作成
docker-compose.yml
WordPressとmysqlは公式のdockerコンテナがあるので環境は簡単につくれます
version: "3.9"
services:
db:
image: mysql:8.0
container_name: blog_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3306:3306"
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost -p$${MYSQL_ROOT_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 5
wordpress:
image: wordpress:6.5.4-php8.2-apache
container_name: blog_wordpress
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
ports:
- "8080:80"
volumes:
- ./wordpress:/var/www/html
後は起動するだけでコンテナが自動的に必要なファイルを生成して環境が完成します
docker compose up -d
.gitignoreを追加
WordPressのwp-contentやDBの永続化ファイルがモリモリ作成されます
要らないものは.gitignoreに書いておきます
# =========================
# Docker / 永続データ
# =========================
# MySQL の実データ(必ず除外)
mysql/
# WordPress 実行時に生成されるファイル群
wordpress/wp-content/uploads/
wordpress/wp-content/cache/
wordpress/wp-content/upgrade/
wordpress/wp-content/themes/twentytwentyone/
wordpress/wp-content/themes/twentytwentytwo/
wordpress/wp-content/themes/twentytwentythree/
wordpress/wp-content/themes/twentytwentyfour/
wordpress/wp-content/plugins/akismet/
wordpress/.htaccess
wordpress/wp-content/index.php
wordpress/wp-content/plugins/hello.php
wordpress/wp-content/plugins/index.php
wordpress/wp-content/themes/index.php
# =========================
# WordPress コア(公式イメージが自動生成)
# =========================
wordpress/wp-admin/
wordpress/wp-includes/
wordpress/index.php
wordpress/xmlrpc.php
wordpress/wp-*.php
wordpress/license.txt
wordpress/readme.html
# =========================
# 設定・秘密情報
# =========================
.env
.env.*
*.env
# =========================
# バックアップ・ダンプ
# =========================
*.sql
*.sql.gz
# =========================
# OS / Editor
# =========================
.DS_Store
Thumbs.db
.vscode/
.idea/
# =========================
# Logs
# =========================
*.log
2. 旧環境からバックアップする
以下の3つをバックアップします
対象ファイルをscpなどで回収するだけです
1: DB
2: アップロードしたファイル
3: テーマ
DB
DBの内容をSQLファイルに書き出してコピーします
mysqldump -u ユーザー名 -p パスワード > ~/wp_backup.sql
scp ユーザー名@xxx.xxx.xxx.xxx:~/wp_backup.sql ./wp_backup.sql
アップロードしたファイル
アップロードされたファイルはwp-content/uploadsに
保存されていますので、まるごとコピーしておきます
scp -r ユーザー名@xxx.xxx.xxx.xxx:/home/kusanagi/サイト名/DocumentRoot/wp-content/uploads ./wp-content/uploads
テーマ
テーマはwp-content/themes に保存されています
テーマごとにフォルダ分けされているので必要なものだけ回収します
scp -r ユーザー名@xxx.xxx.xxx.xxx:/home/kusanagi/サイト名/DocumentRoot/wp-content/themes/テーマ名 ./wp-content/themes/テーマ名
3. 新環境に復元する
DB
引っ越し先サーバーにsqlファイルを置いてインポートします
scp ./wp_backup.sql ユーザー名@xxx.xxx.xxx.xxx:~/wp_backup.sql
今回、docker-compose.ymlから起動しているので
docker compose exec -T db sh -lc \
'mysql -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' < ~/wp_backup.sql
アップロードしたファイル
scp -r ./wp-content/uploads ユーザー名@xxx.xxx.xxx.xxx:gitプロジェクトのパス/wordpress/wp-content/uploads
テーマ
scp -r ./wp-content/themes/テーマ名 ユーザー名@xxx.xxx.xxx.xxx:gitプロジェクトのパス/wordpress/wp-content/themes/テーマ名
4. localhostで開発できるようにする
localhostで動かそうとすると、以下の2つの問題が発生します
1. 内部リンクが本番環境のURLになってしまう
2. 管理ページがhttpsを強制する
上記については以下のように解決できます
1: hostsで名前解決を変更する
2: mkcertでhttps用の証明書を作る
hostsで名前解決を変更する
WordPressは基本的に本番環境URLの絶対パスで動作するように作られていて、/wp-adminのようなWordPressが制御する内部リンクも、画像などのメディアへのリンクも本番環境の絶対パスで動作します。WordPressが制御する内部リンクは設定に書き込むことで変更できますが、メディアへのリンクは記事データに直接書かれてしまっているので開発環境用にはURLを書き換えた開発用DBを用意することになってしまってイマイチに思えます
そこで、本番環境URLへのリクエストの名前解決をOSレベルで置き換えてしまおうと思います。Windowsの場合はC:\Windows\System32\drivers\etc\hostsに以下のように書くと、開発PCにおけるexample.comへのリクエストをOSが127.0.0.1として置き換えてくれます。実際にはご自分の開発対象のURLを記載してください
127.0.0.1 example.com
127.0.0.1 www.example.com
開発終了後に本番デプロイしたら記載を消して本来のURLにアクセスするようにします
mkcertでhttps接続するようにする
mkcertで証明書を登録する
mkcertで鍵を作ります
https://qiita.com/studio_haneya/items/3ea028a728de320f9249
example.com-key.pem
example.com.pem
以下の様に鍵ファイルを配置します
├─ nginx/
│ ├─ conf.d/
│ │ └─ wordpress.conf
│ ├─ keys/
│ │ ├─ example.com-key.pem
│ │ └─ example.com.pem
│ └─ .gitignore
├─ docker-compose-local.yml
└─ docker-compose.yml
docker-compose.yml
最初に作成したdocker-compose.ymlに環境変数を追加します
services:
nginx:
image: nginx:1.27-alpine
container_name: dev-nginx
restart: unless-stopped
depends_on:
- wordpress
ports:
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/keys:/etc/nginx/ssl:ro
nginxでTLS終端を作ります
example.comの部分はご自分のサイト名に変更してください
server {
listen 80;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/nginx/ssl/example.com.pem;
ssl_certificate_key /etc/nginx/ssl/example.com-key.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://wordpress:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
起動するときには以下のようになります
docker compose -f docker-compose.yml -f docker-compose-dev.yml up -d
5. その他
パスワードをリセットする
以下で1番目のユーザーのパスワードをTempPass123!に変更できますので、ログインした後に管理画面で適切なパスワードに変更してください
docker compose exec -w /var/www/html wordpress php -r '
require "wp-load.php";
wp_set_password("TempPass123!", 1);
echo "done\n";
'
まとめ
WordPressセットアップ済みのVPSを使った方がもっと簡単ですから、WordPressユーザーの多数派であろう非エンジニアの方はそちらを選択するのが合理的だと思います
サーバーを用意して自分でLAMP環境つくるのと比べるとかなり楽に環境がつくれますので、エンジニアが受託でWordPress開発をやるような場合には、このやり方はそれなりに選択肢になると思います
フロントエンドを書けるエンジニアが自分用にブログを作るのであれば、このWordPressの独特のお作法に制約されながら遅いブログを作るよりもヘッドレスCMS+SSGで書くのが合理的だと思います