手動アップロードの名残をゼロに:hikarinotama.com を2日でGitOps化した記録
はじめに
自分のドメイン hikarinotama.com を久しぶりに覗いてみたら、思っていたより散らかっていた。
- サイトはMacのフォルダから手動アップロードで公開されていて、GitHubに原本がない
wwwを付けると壊れた古いサーバーに飛ぶ- 使っていないはずのメール設定がDNSに残っている
OpenShiftの現場では「Gitにあるものが正、手作業は最小限」というGitOpsの考え方で動いている。それなのに自分の個人ドメインは真逆の運用だった。紺屋の白袴である。
この記事は、それを2日かけて片付けた作業ログだ。
全体像:作業前と作業後
【作業前】
hikarinotama.com
├── @ → Pages(Macから手動アップ) ← 原本がMacの中だけ
├── www → 壊れた旧サーバー(nginxエラー)
└── メール → 使っていないのにMX・SPFが旧サーバーを指したまま
【作業後】
hikarinotama.com(Cloudflare DNS)
├── @ → Pages「hikarinotama-dev」 本店(GitHub連携)
├── www → 301で本店へ 門番
├── blog → Pages「myfavorite-com」 ブログ(GitHub連携・PRで更新)
├── lab → Workers「emdash-lab」 EmDash練習場(GitHub連携・D1/R2)
└── メール → SPF -all + DMARC reject なりすまし防止
DNSの変更履歴 … リポジトリの dns/ フォルダにコミット
たとえるなら、1つの土地に本店・ブログ館・実験工房の3棟を建て、すべての設計図をGitHubという金庫にしまった、という状態だ。
0. 原本をMacからGitHubへ移す
最初にやったのは、Macにしかなかったサイトのソースをprivateリポジトリに上げること。
- コミット履歴はローカルにあったので、秘密情報が追跡されていないか確認してからGitHubへpush
- Cloudflare PagesにGitHub連携の新プロジェクトを作成(フレームワークはAstroプリセット)
- 独自ドメインを旧プロジェクトから新プロジェクトへ付け替え
- 試しにページタイトルを1行変えてpush → 自動でビルド・デプロイされることを確認
これで「正しい設計図(source of truth)」の置き場所がMacからGitHubに移った。Macが壊れても、リポジトリをつなぎ直せば同じサイトを建て直せる。
1. www を本店へ301転送
www.hikarinotama.com は古いレンタルサーバーを指したままで、開くとnginxのエラーが出ていた。
- CloudflareのRedirect Rulesで
www→https://hikarinotama.comへ301転送 - 転送が効くことを確認してから、古いAレコードを**ダミーのAAAA(
100::)**に置き換え
ルールはDNSのレコードが「プロキシ経由(オレンジ雲)」でないと発動しないので、行き先のないダミーを置いてCloudflareに一度受け取らせるのがポイント。
curl -sI https://www.hikarinotama.com | head -3
# HTTP/2 301
# location: https://hikarinotama.com/
2. 使っていないメールの片付けとなりすまし対策
このドメインでメールは使っていない。だからMXを消して終わり……ではない。
| 設定 | 役割 | 対応 |
|---|---|---|
| MX | どこで受け取るか | 削除 |
| SPF | どこから送ってよいか | v=spf1 -all(どこからも送らない) |
| DMARC | ニセモノをどう扱うか | p=reject(捨ててください) |
MXを消しても、誰かが ○○@hikarinotama.com を名乗ってメールを送ること自体は止められない。止めるには、郵便局に「うちは手紙を出さない家です。うちの名前の手紙は全部ニセモノなので捨ててください」と届け出ておく必要がある。それがSPFとDMARCだ。
メールを使わないドメインほど、SPF/DMARCは大事。 使っていない家は、持ち主が気づかないうちに悪用されやすいからだ。
3. ブログを blog.hikarinotama.com に
このブログ(myfavorite.com)のPagesプロジェクトに、カスタムドメイン blog.hikarinotama.com を追加した。
ついでに見つかったのが、Astroの設定ファイルの site: がテンプレートの初期値 example.com のままだった問題。RSSやOGPのURLがおかしくなる原因になる。
ここで初めて、ブランチを切ってPRを出してマージする流れを自分で通した。
git switch -c fix/site-url
# astro.config.mjs の site を修正
git commit -m "config: set site url"
git push -u origin fix/site-url
# GitHubでPR作成 → 差分確認 → マージ
mainに直接pushしていた頃と比べると、変更が「差分」という形で一度目に入るのが安心感につながる。現場で毎日やっているレビューの意味が、自分のリポジトリで腹に落ちた。
4. lab.hikarinotama.com に EmDash を建てる
CloudflareのCMS「EmDash」の練習場を、Macでゼロから作り直した。
- privateリポジトリを作り、Cloudflare WorkersのGit連携で自動デプロイ
- データベースはD1、画像置き場はR2(R2は無料枠でも支払い方法の登録が必要だった)
- 他と名前がぶつからないよう、リソース名は
emdash-labで統一 wrangler.jsoncのroutesでlab.hikarinotama.comを割り当て- 管理者の初期設定は本番ドメイン上でパスキー登録(プレビューURLで登録すると本番で使えない)
- 設定後、
workers.devとプレビューURLは無効化して入口を1つに
ちなみにこのブログ本体は、EmDashに移さずMarkdown+Gitのままにしている。EmDashはデータベースが正、このブログはGitが正。どちらが優れているかではなく、設計思想が違うので用途で使い分ける。
5. DNSの変更履歴もGitで残す
DNSを触るたびに、Cloudflareの画面からExport(今のDNSを丸ごとテキストで書き出し)して、サイトのリポジトリの dns/ フォルダにコミットした。
cp ~/Downloads/hikarinotama.com.txt dns/hikarinotama.com.zone
git --no-pager diff
git commit -am "dns: add blog and lab subdomains"
git push
本格的にやるならTerraformなどでDNS自体をコードで管理するところだが、まずは**「いつ何を変えたか」がGitの履歴で追える**だけでも大きい。アルバムに写真を1枚ずつ貼っていくイメージだ。
6. 旧プロジェクトの削除(1日置いてから)
最後に、手動アップロード時代の旧Pagesプロジェクトを削除した。すぐには消さず、新しい本店が一晩問題なく動いたのを見てからにした。
消す前の確認は3つ。
- 本店が
HTTP/2 200を返している - 旧プロジェクトのCustom domainsが空(看板が外れている)
- 削除画面のプロジェクト名が旧のほう(
-site)で、新(-dev)と取り違えていない
削除後、旧プロジェクトの pages.dev アドレスは名前ごと引けなくなった。404すら返らない、番地そのものが地図から消えた状態だ。
ここで「Cloudflareのプロジェクトを消したら、GitHubのリポジトリも消えるのでは?」と一瞬不安になった。答えは消えない。GitHubが原本(source of truth)で、Cloudflareはそれを読み取って店を建てる大工にすぎない。大工さんとの契約を解いても、金庫の中の設計図には指一本触れられない。
振り返り
| 学び | 一言で |
|---|---|
| GitOps | 原本の置き場所を決めると、壊すのも建て直すのも怖くなくなる |
| SPF/DMARC | 使わないドメインこそ「出さない家です」と届け出る |
| PR | 個人リポジトリでも、差分を一度目で見る価値がある |
| 削除 | 1日置く、名前を声に出して確認する |
| DNSキャッシュ | 反映されないときは dig @<Cloudflareのネームサーバー> で権威側を直接見る |
現場で学んだGitOpsを、自分の小さな土地に持ち帰って実践できた2日間だった。手動アップロードの名残はこれでゼロ。次は lab のEmDashで、データベースを定期的にエクスポートしてGitに残す仕組みを試してみたい。