WordPress のバックアップを Docker に復元してみた

WordPress のバックアッププラグイン「BackWPup」で自動バックアップをしていますが、自分で戻せるのか試してみました。BackWPup Pro では無いので手動です。

サービス側も自動バックアップしている

このブログは CohoHa WING を利用しているので、サーバー側で過去14日分の自動バックアップが取られています。
操作の間違いや失敗があって戻したい場合はそれを利用する方が簡単・確実です。

復元先に Docker を使用

お試しサーバーは Docker で立ち上げるのがお手軽です。
なので、公式のサンプル等を参考に以下の docker-compose.yml を用意しました。
また、docker-compose.yml を置いたディレクトリに「mysql」「html」ディレクトリは手動で作成しておきます。

version: '3'

services:
  db:
    image: mysql@sha256:bbeff35b63bf28aeb024de309aab2d501f8aa30e94664d3840d55b36c8db53c8
    volumes:
      - ./mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - ./html:/var/www/html
    ports:
      - "80:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress

mysql のイメージが latest で無いのは Apple silicon に対応してない為で、回避策として latest(お試し時の最新) のダイジェストを指定しています。
起動してしばらく待つと、http://localhost/ で WordPress の初期設定ページ(言語選択)が開けました。
初期状態が確認できたので、一旦Dockerコンテナーは停止してバックアップから復元してみます。

バックアップのダウンロード

バックアップ対象の WordPress のメニューから、BackWPup → バックアップ を選択して、バックアップしたファイルをダウンロードします。
自分は .tar.gz にしているのでダウンロード後に解凍します。できたファイルとディレクトリは以下でした。(一部のファイル名は伏せ字)

backwpup_readme.txt
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pluginlist.2021-05-03.txt
error
index.php
license.txt
manifest.json
xxxxxxxxxxxxxx.sql
readme.html
wp-activate.php
wp-admin
wp-blog-header.php
wp-comments-post.php
wp-config-sample.php
wp-config.php
wp-content
wp-cron.php
wp-includes
wp-links-opml.php
wp-load.php
wp-login.php
wp-mail.php
wp-settings.php
wp-signup.php
wp-trackback.php
xmlrpc.php

バックアップから復元

解凍してできた、
・ xxxxxxxxxxxxxx.sql は mysql ディレクトリにコピー
・その他のファイルは html ディレクトリに上書きコピー
 但し、コピー先の wp-config.php は予め退避しておきます。後で内容のコピーに使います。

wp-config.php の修正

バックアップから戻した wp-config.php ファイルに、退避した wp-config.php の先頭から DB_COLLATE の定義がある範囲を上書きします。

<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

// a helper function to lookup "env_FILE", "env", then fallback
if (!function_exists('getenv_docker')) {
	// https://github.com/docker-library/wordpress/issues/588 (WP-CLI will load this file 2x)
	function getenv_docker($env, $default) {
		if ($fileEnv = getenv($env . '_FILE')) {
			return rtrim(file_get_contents($fileEnv), "\r\n");
		}
		else if (($val = getenv($env)) !== false) {
			return $val;
		}
		else {
			return $default;
		}
	}
}

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress') );

/** MySQL database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'example username') );

/** MySQL database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );

/**
 * Docker image fallback values above are sourced from the official WordPress installation wizard:
 * https://github.com/WordPress/WordPress/blob/f9cc35ebad82753e9c86de322ea5c76a9001c7e2/wp-admin/setup-config.php#L216-L230
 * (However, using "example username" and "example password" in your database is strongly discouraged.  Please use strong, random credentials!)
 */

/** MySQL hostname */
define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql') );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8') );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );

データベースの復元

xxxxxxxxxxxxxx.sql に URL が書かれている所があるので変更します。
https://kuma-emon.comhttp://localhost に置換しました。

Dockerコンテナーを起動し、mysqlのコンテナーに接続してファイルから復元します。

mysql -u wordpress -D wordpress -p < /var/lib/mysql/xxxxxxxxxxxxxx.sql

それなりに復元できたが

利用できないプラグインが(BackWPup)ありました。
デザインも初期値になったものがあり、管理画面から再設定が必要でした。

記事や画像は復元できたので、もしもの際に使えそうです。

コメント