ステージングを本番へ反映する
時間がかかるのは反映そのものではなく、どこが違うのかを突き止める作業です。 目で比べているかぎり、この作業は終わりません。
Claude Code では、/mtb-migrate スキルがこの手順をまとめています。
頼み方
ステージング(stg)と本番(prod)で、テンプレートとカテゴリがどう違うか 出して。まだ何も変えないで。 差分を読んでから、反映するものを決めます。
1. 両方を書き出す
mtb dump --profile stg --dir ./dump/stg
mtb dump --profile prod --dir ./dump/prod
diff -ru ./dump/prod ./dump/stg同じ入力からは必ず同じバイト列が書き出されます。 ID・時刻・作成者は書き出さず、 突き合わせは basename や name などの自然キーで行うので、 diff に表示されたものは実際の差分です(環境どうしの同期)。
2. 運んでよいものと、いけないものを分ける
| ファイル | |
|---|---|
site.yaml | 運ぶべき設定 |
site-environment.yaml | host sitePath など運んではいけないもの |
system/plugins.yaml | 運べないが、違いが分かるだけで役に立つ |
system/text-filters.yaml | 受け側に無い書式の記事は読めません |
system/endpoints.yaml | 受け側に無い機能は、呼び出した時点で 404 |
先に人間が合わせておく設定
mt-config.cgi は API から読めません。EmailAddressMain(未設定だと メール送信が 500)、DeniedAssetFileExtensions(.js .html をアップロードできない 理由)、DefaultLanguage は差分に現れないので、移行の前に人間が両方の環境で合わせます。
カスタムブロック(be_block)も差分に現れません。 使っているなら テーマで運んでください。
3. 計画を合意する
差分を読んだら、反映するものを決めてから作業に入ります。この手順を飛ばすと、 「本番にしか無い設定」まで変更の対象に含めてしまいます。
エージェントには「差分の一覧を出して、反映するものとしないものに分けて、 理由を1行ずつ書いて」と頼むのがちょうどよい粒度です。
4. 反映する
| 差分の種類 | 反映の方法 |
|---|---|
| テンプレート | sites templates push |
| カテゴリ・フォルダ | sites categories create / update |
| カスタムフィールド | sites fields create / update |
| コンテンツタイプ | sites content-types create / fields create |
| サイトの構成ごと | テーマの適用(総入れ替え。作り込んだ後は不可) |
テンプレートなら、ステージングから pull したディレクトリを本番へ push します。
mtb sites templates pull 4 --dir ./templates --profile stg
mtb sites templates push 7 --dir ./templates --profile prodマニフェストの siteId が別サイトへの push を止めます
pull したディレクトリには元のサイトIDが記録されています。別のサイトへ push すると止まります(取り違えて上書きしないため)。意図して別のサイトへ移すなら マニフェストを直してください。
5. 確かめる
mtb dump --profile prod --dir ./dump/prod-after
diff -ru ./dump/prod-after ./dump/stg # 意図した差分だけが残っているか
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/保存できたことと、サイトに書き出されたことは別です。 書き出しまで確かめるなら --verify-publish を付けるか、mtb sites logs list <site> --level error を 見てください。
よくある症状と原因
| 症状 | 原因 |
|---|---|
| 差分がすべての行に出る | ID や時刻を含むファイルを自前で作っている(mtb dump を使う) |
| 当てたのに表示が変わらない | 再構築していない(公開と再構築) |
| 本番にだけ 500 が出る | 受け側に無いプラグインに依存したテンプレート(system/plugins.yaml を見る) |
| 記事の書式が崩れた | 受け側にその text filter が無い(system/text-filters.yaml) |