レンサバのWordPressサイトを、既にWordPressコンテナを持っているVPSにデータベース共有で移行する

自分でタイトル見直して笑った。これやりたい人日本に何人いるんだろう。

なお、レンサバはカラフルボックス。カラフルボックスで管理しているWordPressのサイトを、VPSに移行する。ただし、VPSには既にWordPressのコンテナをたてている。WordPressのマルチサイトはめんどくさいが、データベースをいっぱいつくるのはRAM的に嫌なので、DBは共有する。そういうニッチな手順。

個人サイトの移行であんまり真面目にやってないので、サイトはダウンする。ダウンタイムは許容する。

目次

前提と構成

今回のやること

  • 現在、VPSでサイトAとサイトBを管理している(Docker管理)。VPSではCloudflare Tunnel経由でサイト公開している
  • サイトAとサイトBは同じDBを共有している
  • レンサバのカラフルボックスで管理しているサイトCを、VPSでサイトA、Bと一緒に管理したい
  • データベースは共有する
  • DNSは、リセラーとしてムームードメインで管理している
    • ムームードメインにはなんのこだわりもない。むしろ嫌な思い出すらある。完全に惰性

つまり現在の構成は以下だ。

graph TD mumu(ムームードメイン) cff(Cloudflare) mumu --> cff cff --> cf subgraph VPS wp1(サイトA) wp2(サイトB) db(データベース) cf(Cloudflare Tunnel) end cf --> wp1 cf --> wp2 wp1 -.-> db wp2 -.-> db mumu -->cldns subgraph カラフルボックス cldns(ドメイン管理) wp3(サイトC) end cldns --> wp3

これが以下のようになる。

graph TD mumu(ムームードメイン) cff(Cloudflare) mumu --> cff cff --> cf subgraph VPS wp1(サイトA) wp2(サイトB) wp3(サイトC) db(データベース) cf(Cloudflare Tunnel) end cf --> wp1 cf --> wp2 cf --> wp3 wp1 -.-> db wp2 -.-> db wp3 -.-> db

この絵を見て「???」となるなら、多分この記事はあまり役に立たない。しかしそもそもレンサバ使っている人がこんなことをするのか謎ではある。

この記事で説明しないこと

この記事には前提知識がある。以下のことはわかっている前提とする。

  • カラフルボックス、ムームードメインなどリセラー、レジストラの設定
  • Cloudflare Tunnelの設定
  • WordPressのバックアップ、復元の詳細手順
    • ローカルで練習することを強く推奨する
  • NSの向け先を変える意味
  • dockerの基本

この記事の内容は個人サイトとして最悪の事態を招く可能性があるので、わからないならやらないほうがいい。

LLMあたりに聞いてね。まぁこんなニッチな手順やる人はだいたいわかっている気はするが……。

バックアップ & 古いサイトかどうか判別できるマーカを残す

まずは当然ながらバックアップ。バックアップのやり方は好きにすればいいが、個人的には UpdraftPlus を使っている。バックアップデータはDropboxに置いている。正直無料で使うのは申し訳ないくらいなんだが、買い切りモデルがないし、無料プランで十分なんだよなぁという。

で、バックアップした後、「サイト引っ越し作業中です」みたいなマーカを残しておく。これによって、サイト引っ越し後、「マーカがあったら古いサイトを見ている、なかったら新しいサイトを見ている」と判別できる。

VPS側の準備

ダウンタイムはなんだかんだで短くしたいので、VPS側の下準備。

設定の確認

とりあえず docker-compose.ymlを確認する。以下はすでにサイト1,2があるとする。ポート番号は10880,10881とする。

services:
  # サイト1: メインサイト
  site1_wordpress:
    image: wordpress:latest
    ports:
      - "10880:80"
    environment:
      WORDPRESS_DB_HOST: wp_db
      WORDPRESS_DB_USER: ${SITE1_DB_USER}
      WORDPRESS_DB_PASSWORD: ${SITE1_DB_PASSWORD}
      WORDPRESS_DB_NAME: ${SITE1_DB_NAME}
    volumes:
      - site1_wordpress_data:/var/www/html
      - ./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini
    restart: always
    depends_on:
      - wp_db

  # サイト2: サブサイト
  site2_wordpress:
    image: wordpress:latest
    ports:
      - "10881:80"
    environment:
      WORDPRESS_DB_HOST: wp_db
      WORDPRESS_DB_USER: ${SITE2_DB_USER}
      WORDPRESS_DB_PASSWORD: ${SITE2_DB_PASSWORD}
      WORDPRESS_DB_NAME: ${SITE2_DB_NAME}
    volumes:
      - site2_wordpress_data:/var/www/html
      - ./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini
    restart: always
    depends_on:
      - wp_db

  # 共有データベース
  wp_db:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - wp_db_data:/var/lib/mysql
    restart: always

  # Cloudflareトンネル
  cloudflared_main:
    image: cloudflare/cloudflared:latest
    network_mode: "host"
    command: tunnel --no-autoupdate run --token ${CLOUDFLARED_TUNNEL_TOKEN_MAIN}
    restart: always

volumes:
  site1_wordpress_data:
  site2_wordpress_data:
  wp_db_data:

.envは以下とする。

# MariaDBルートパスワード
MYSQL_ROOT_PASSWORD=your_secure_root_password_here

# サイト1のデータベース設定
SITE1_DB_USER=site1_user
SITE1_DB_PASSWORD=your_secure_password_1
SITE1_DB_NAME=site1_db

# サイト2のデータベース設定
SITE2_DB_USER=site2_user
SITE2_DB_PASSWORD=your_secure_password_2
SITE2_DB_NAME=site2_db

# Cloudflareトンネルトークン(メインドメイン用)
CLOUDFLARED_TUNNEL_TOKEN_MAIN=your_cloudflare_tunnel_token_here

DBでユーザとテーブルの作成

データベース共有するので、ユーザとテーブルを手動で追加する。

コンテナに入る

docker ps  # コンテナ名を調べる
docker exec -it コンテナ名 mariadb -u root -p

パスワード聞かれるので答えて入る。

以下設定とその反映。

CREATE DATABASE データベース名;
CREATE USER 'ユーザ'@'%' IDENTIFIED BY 'パスワードをここに入力';
GRANT ALL PRIVILEGES ON データベース名.* TO 'ユーザ'@'%';
FLUSH PRIVILEGES;

SHOW DATABASES;
SELECT User, Host FROM mysql.user WHERE User = 'ユーザ';

EXIT;

ここでユーザとデータベース名とパスワードはひかえる。そして .env に追記する。

docker-compose.yml に設定を追加する。新サイトのポート番号は10882とする。

services:
  # サイト1: メインサイト
  site1_wordpress:
    image: wordpress:latest
    ports:
      - "10880:80"
    environment:
      WORDPRESS_DB_HOST: wp_db
      WORDPRESS_DB_USER: ${SITE1_DB_USER}
      WORDPRESS_DB_PASSWORD: ${SITE1_DB_PASSWORD}
      WORDPRESS_DB_NAME: ${SITE1_DB_NAME}
    volumes:
      - site1_wordpress_data:/var/www/html
      - ./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini
    restart: always
    depends_on:
      - wp_db

  # サイト2: サブサイト
  site2_wordpress:
    image: wordpress:latest
    ports:
      - "10881:80"
    environment:
      WORDPRESS_DB_HOST: wp_db
      WORDPRESS_DB_USER: ${SITE2_DB_USER}
      WORDPRESS_DB_PASSWORD: ${SITE2_DB_PASSWORD}
      WORDPRESS_DB_NAME: ${SITE2_DB_NAME}
    volumes:
      - site2_wordpress_data:/var/www/html
      - ./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini
    restart: always
    depends_on:
      - wp_db

  # サイト3: 追加サイト
  site3_wordpress:
    image: wordpress:latest
    ports:
      - "10882:80"
    environment:
      WORDPRESS_DB_HOST: wp_db
      WORDPRESS_DB_USER: ${SITE3_DB_USER}
      WORDPRESS_DB_PASSWORD: ${SITE3_DB_PASSWORD}
      WORDPRESS_DB_NAME: ${SITE3_DB_NAME}
    volumes:
      - site3_wordpress_data:/var/www/html
      - ./custom-php.ini:/usr/local/etc/php/conf.d/custom-php.ini
    restart: always
    depends_on:
      - wp_db

  # 共有データベース
  wp_db:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - wp_db_data:/var/lib/mysql
    restart: always

  # Cloudflareトンネル(メインドメイン用)
  cloudflared_main:
    image: cloudflare/cloudflared:latest
    network_mode: "host"
    command: tunnel --no-autoupdate run --token ${CLOUDFLARED_TUNNEL_TOKEN_MAIN}
    restart: always

volumes:
  site1_wordpress_data:
  site2_wordpress_data:
  site3_wordpress_data:  # 追加
  wp_db_data:

そして .envは以下のようになる。

# MariaDBルートパスワード
MYSQL_ROOT_PASSWORD=your_secure_root_password_here

# サイト1のデータベース設定
SITE1_DB_USER=site1_user
SITE1_DB_PASSWORD=your_secure_password_1
SITE1_DB_NAME=site1_db

# サイト2のデータベース設定
SITE2_DB_USER=site2_user
SITE2_DB_PASSWORD=your_secure_password_2
SITE2_DB_NAME=site2_db

# サイト3のデータベース設定 (追加分)
SITE3_DB_USER=site3_user
SITE3_DB_PASSWORD=your_secure_password_3
SITE3_DB_NAME=site3_db

# Cloudflareトンネルトークン(メインドメイン用)
CLOUDFLARED_TUNNEL_TOKEN_MAIN=your_cloudflare_tunnel_token_here

そしてここまでの動作を確認するためコンテナ起動。

docker compose up -d

既にあるサイトにアクセスして、問題なく動作していることを確認。

なんとかしてWordPressの初期設定をする

localhostなら問題ないが、VPS上にあるとそのまま直にはいけない。まぁやり方は色々あると思うんだが、ここでは既存のCloudflareで管理するドメインより、一時作業のサブドメインを払い出して、トンネル経由で初期画面を設定する。さすがに管理者ユーザとパスワードだけは設定しないといけないからね。

終わったら、「設定」からWordPressアドレスとサイトアドレスを、本来のドメインに変更する。これによって本来のドメインにぶっ飛ばされるため、移行管理画面には入れない。

Cloudflareの準備

オンボードの追加

アカウントホームより、オンボードを追加する。現在のDNSをスキャンする。Aレコードとかは多分いらないので削除する。このへんは適切にやる。

NSの設定(ダウンタイム発生)

さてここからはダウンタイム発生となるが、NSの向け先を変更する。これによって、当然ながらサイトはめっちゃ不安定になる。ってかまぁ、落ちているのが正常、という状態。

設定はレジストラまたはリセラー次第となる。僕はムームードメインを惰性で使っているが、ドメイン一覧からドメインを選択すると、ネームサーバを取得できるようになる。

この設定をした段階で、サイトが新サイトと旧サイトの両方が参照されるようになる

CloudflareがNS向いたことを確認次第、トンネルを掘れるようになる。NSの設定後、トイレにいって戻ってきたらもう認識していた。はやい。Zero TrsutよりCloudflare Tunnelのパブリックホストで急いで設定。

新サイトで復元

新サイトにアクセスする。このとき、ゲストプロファイルなどを使うと、新サイトが参照されやすい。新サイトにアクセスしたら急いで復元。復元後は、元サイトにつけたマーカの有無で、旧サイトか新サイトのどちらを参照しているかが今後はわかる。

うまくいけば数分くらいのダウンタイムで済む

以上。

ムームードメインの思い出

ところでムームードメインの嫌な思い出はこれ。

ただこれは、ムームードメインよりも.xyzのレジストリ側の責任が大きいとは思う。

この時に、DNSってインターネットの根幹なんだなと思った。インターネットは脆いよ。

この記事をいいなと思っていただけた方、よければ高評価・チャンネル登録……はないので、コメント・SNSでシェア・ブックマーク、RSSフィード登録を、よろしくお願い致します。

コメント

コメントする

目次