
脱WordPress、Cloudflareへ引っ越し(第2回):無料プランの壁と、XMLの細切れ作戦
こんにちは、あるいはごきげんよう。
888FXです。
シリーズ「脱WordPress、始めました」、第2回。前回は自分のPCの中(ローカル環境)でEmDashを動かして、記事の引っ越しとデザインまで終わらせたところまで。今回はいよいよ、それをインターネットに出す話。
……の前に、ひとつ実話を。
小5の息子に「パパこれどうやるの?」と聞かれて、「コマンドプロンプトつかうんだよ」と答えたら、
「?コマンド…?あ、それってPowerShellのこと?」
「…はい。そうです。」
時代は変わった。黒い画面=コマンドプロンプト、の世代はもう古いらしい。なので今回もPowerShellでいきます(笑)。
目次
置き場所はCloudflare一択
公開先はCloudflare。実はプロップファームの比較サイトをすでにCloudflareで動かしていて、使い勝手は分かっている。EmDashもCloudflareで動かす前提の作りになっているし、小さいブログなら無料プランで収まる……はず。この「はず」が、あとで効いてくるんですけどね。
ドメインは「先に」Cloudflareへ
最初にやったのが、ドメイン(888fx.trade)の管理をCloudflareに移すこと。ドメインを買ったバリュードメイン側で、ネームサーバーをCloudflareのものに書き換えるだけ。

ポイントは、中身はまだWordPressのままにしておけること。Cloudflare側で「888fx.tradeはエックスサーバー(WordPress)へ」という設定を残しておけば、ブログは普通に表示され続ける。「え、そんなことできるの?」って思わず聞き返しました。ネームサーバーの切り替えは反映に時間がかかることもあるので、先に済ませておくと本番の切り替えが一瞬で終わる。これ、地味に効く小ワザ。
本番用のEmDashを作る
ローカルで作ったものとは別に、Cloudflare用のEmDashを新しく作ります。やることは前回と同じで、質問に答えるだけ。

違うのは「どこに置く?」の答えが「Cloudflare Workers」になるところ。テンプレートは前回と同じ「Starter」。

デザインのファイルは、ローカル版からそのままコピー。前回AIと作った見た目が、ここでそのまま生きてきます。
PowerShellからCloudflareにログイン
次はPCとCloudflareをつなぐ作業。npx wrangler login と打つとブラウザが開いて、「Wranglerがアカウントにアクセスしたがってます」の画面に。Wranglerは、Cloudflareを黒い画面から操作するための公式の道具。

「Authorize」を押せば完了。あとは npm run deploy で公開……と思ったら、最初に「workers.devのサブドメインを登録しますか?」と聞かれる。

ここは「Y」でOK。Cloudflareが無料でくれる仮のアドレス(〇〇.workers.dev)で、本番のドメインに切り替えるまでは、ここで中身を確認できます。
エラー祭りの始まり
で、ここからが本番。
画像の置き場所(R2)がない

「R2 bucket '888fx-media' not found」。R2というのは、Cloudflareの画像やファイルの置き場所。それを作ろうとしたら、今度は「ダッシュボードでR2を有効にして」と怒られる。
R2は無料枠(月10GBまで)の中なら0円。でも、有効にするにはカードの登録が必要。0円なのにカード……。最近は登録するのが怖いので、上限を決めたカードレスデビットにしました。いつでも止められるし、気持ち的にもラク。

「月額0ドル」で購入完了(笑)。あとは npx wrangler r2 bucket create 888fx-media で置き場所を作って、もう一度 npm run deploy。

今度は通った。……と思ったら、次。
「データベースの準備が必要です」
サイトを開くと「Database migrations are required」。データベースの中身の準備(マイグレーション)を、こちらから実行しないといけないらしい。ここで必要になるのが、CloudflareのAPIトークン。PowerShellからデータベースを触るための、合い鍵みたいなもの。

権限は「D1(データベース)の編集」だけ、期限は7日。合い鍵は必要最小限が鉄則。

作ったトークンは一度しか表示されないので、すぐコピー。そして絶対にスクショやブログに載せないこと(なので隠してます)。これをPowerShellに渡して、
npx emdash migrate --d1 888fx-blog途中で「ロックがかかっています」と止まったりもしたけど、エラー文をAIに見せたら解除のやり方が出てきて解決。
やっとセットアップ画面

ここからは前回と同じ。サイト名を入れて、アカウントを作って、パスキーで保護。

ローカルの時はサクッと終わったところに、ここまで来るのに何回エラーを見たことか……。
本題:記事の引っ越し
前回、一番伝えたかったのが「WordPressから移るなら、まずは標準のエクスポート」。今回もこれでいきます。最新の状態をもう一度書き出して、

EmDashの「インポート」に渡す。ローカルでは一発だったし、余裕でしょ。……と、

「インポート失敗」。……え?
無料プランの壁「CPU 10ミリ秒」
原因は、Cloudflare Workersの無料プランの制限。1回の処理で使えるCPU時間は10ミリ秒まで。記事を一気に取り込むような重い処理は、途中で打ち切られてしまう。
ただ、EmDashのインポートは「段階的に進み、中断した場合も再実行できます」。つまり、失敗してももう一回押せば続きから。

押して、止まって、また押して。48/69、のように少しずつ進んで、記事67件はなんとか完了。ちなみに、記事一覧を「1ページ100件表示」にしたら、それも重すぎて……

Error 1102。管理画面ですら制限に引っかかる(笑)。20件表示に戻したら直りました。
問題は画像191枚
記事はなんとかなったけど、画像はそうはいかない。WordPressから画像を1枚ずつダウンロードしてR2に入れる処理なので、もっと重い。


何回押しても「No result received from media import」。ここで選択肢は2つ。
- 月5ドルの有料プランに1か月だけ入って、一気に取り込む
- 無料のまま、何か工夫する
5ドルなら払ってもいい。けど、ここで僕は気になった。「XMLって、分解できないの?」
XMLを細切れにする作戦
WordPressのエクスポートファイル(XML)は、ただの文字のファイル。中身は「記事」「画像」の情報が1件ずつ並んでいるだけ。なら、画像だけを少しずつに分けたファイルを何個も作って、1個ずつ取り込めばいい。分けるのはAIにお願い。

最初は15枚ずつ、13ファイル。……それでも止まる。5枚ずつ、2枚ずつ、最後は1枚ずつ(笑)。細かくするほど通るようになっていきました。
ひとつ、ハマったのが「インポートを開始」のボタンが押せないこと。画像だけのファイルだと、「取り込む記事がない」と判断されるらしい。そこで、どのファイルにも小さな固定ページを1件だけ混ぜておく。取り込み済みのものは自動でスキップされるので、何回混ぜても増えません。こういう抜け道を一緒に考えてくれるのも、AI相手のいいところ。

で、最終的に画像は191枚中184枚。残りの7枚は重複してまとめられた……と、この時は思っていました。この7枚が、次回ちょっとした事件になります。
workers.devで、新しいブログが動いた

Cloudflareの仮のアドレスで、新しいブログが表示されました。ローカルで作った見た目もそのまま。トップのフィルター、目次、パンくずも全部動いている。
あとは「もっと見る」ボタンや「読みもの」の枠、日本語のメニューなどを足しながら、本番への切り替えを待つだけ。
これから引っ越す人へ:1か月だけでも課金を
PHPの件のあたりから、EmDash+Cloudflareを紹介する動画や記事が一気に増えました。でも、どれも「AIと一緒に、簡単なサイトを新しく作ってみた」がほとんど。今あるサイトを引っ越した話や、「移行のデータ量の限界」の話は、一切聞いたことがない。考えてみれば、そりゃそうだよな、って話なんですけどね。
このブログ、記事は67件。100ページにも届かない、小さいブログです。それでもこれだけ細切れにして、何回もボタンを押して、やっと引っ越せた。5000ページのアフィサイトなんて、1枚ずつ分割してたら日が暮れる……どころか年が明ける(笑)。ある程度の規模のサイトを無料のまま移すのは現実的じゃない、と思います。
なので、ブログやサイトの引っ越しなら、移行する月だけでも有料プラン(Workers Paid、月5ドル)に入るのがおすすめ。CPUの制限がぐっと緩むので、XMLを分けたり、何十回もボタンを押したりする手間がまるごと消えます。終わったら無料に戻してもいいし、そのまま払い続けても、国内のレンタルサーバーと比べて高くはない。
ひとつ注意するなら、メール。Cloudflareにはメールボックスを置く機能がないので、そのドメインでメールを使っている人は、今のサーバーにメールだけ残すなど、別に考えておく必要があります。
まとめ:小さいブログなら無料でも、なんとかなる
今回つまずいたのは、このあたり。
- R2(画像の置き場所)は0円でも、有効にするにはカード登録が必要
- データベースの準備には、APIトークン(合い鍵)が必要。権限と期限は最小限に
- 無料プランはCPU 10ミリ秒の壁。記事の取り込みは「もう一回押せば続きから」
- 画像はXMLを細切れにして取り込む。各ファイルに固定ページを1件混ぜるのがコツ
- ある程度の規模なら、移行する月だけ有料プランにした方が早い
どれもエラー画面をAIに見せて、一緒に考えながら解決。今回は月5ドルを払わずに済んだけど、それはこのブログが小さかったから。手間と時間を考えたら、5ドルは安いと思います。
次回は、いよいよ本番の切り替え。ドメインをWordPressからEmDashに向けた瞬間、画像が消えた話から。……そう、この記事はもう、EmDashからお届けしています。