自分でタイトル見直して笑った。これやりたい人日本に何人いるんだろう。
なお、レンサバはカラフルボックス。カラフルボックスで管理しているWordPressのサイトを、VPSに移行する。ただし、VPSには既にWordPressのコンテナをたてている。WordPressのマルチサイトはめんどくさいが、データベースをいっぱいつくるのはRAM的に嫌なので、DBは共有する。そういうニッチな手順。
個人サイトの移行であんまり真面目にやってないので、サイトはダウンする。ダウンタイムは許容する。
前提と構成
今回のやること
- 現在、VPSでサイトAとサイトBを管理している(Docker管理)。VPSではCloudflare Tunnel経由でサイト公開している
- サイトAとサイトBは同じDBを共有している
- レンサバのカラフルボックスで管理しているサイトCを、VPSでサイトA、Bと一緒に管理したい
- データベースは共有する
- DNSは、リセラーとしてムームードメインで管理している
- ムームードメインにはなんのこだわりもない。むしろ嫌な思い出すらある。完全に惰性
つまり現在の構成は以下だ。
これが以下のようになる。
この絵を見て「???」となるなら、多分この記事はあまり役に立たない。しかしそもそもレンサバ使っている人がこんなことをするのか謎ではある。
この記事で説明しないこと
この記事には前提知識がある。以下のことはわかっている前提とする。
- カラフルボックス、ムームードメインなどリセラー、レジストラの設定
- 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ってインターネットの根幹なんだなと思った。インターネットは脆いよ。

コメント