HIRO GEAR
自作インフラ Astro WordPress Web開発

WordPressからAstroへ完全移行した記録 ── PHPの脆弱性・重厚なCMSを手放し、AIと共創する超軽量ブログへ

WordPressからAstroへ完全移行した記録 ── PHPの脆弱性・重厚なCMSを手放し、AIと共創する超軽量ブログへ

これまで自宅のRaspberry Piサーバー上で、Dockerコンテナを用いた WordPress(ワードプレス) によるブログ運営を続けてきた。

しかし、サイトの規模が大きくなり、日々の知的生産の母艦であるObsidianや自作AIエージェントとの連携が進むにつれ、従来の重厚な動的CMSに対する「違和感」と「運用のストレス」が無視できないレベルになっていた。

今回、そのWordPressを完全に卒業し、現代的な静的サイトジェネレーター(SSG)である Astro(アストロ) へと完全移行した。

本記事では、なぜ世界で最も普及しているWordPressを手放したのか、どのような課題をAstroで解決したのか、そしてAIエージェントと共創する新時代のブログ運用設計について記録を残す。


1. WordPressを卒業した3つの根本理由

WordPressは世界中で使われている素晴らしいソフトウェアだが、個人の思考や技術をスマートに記録・発信したい私にとって、次第にオーバースペックかつ重荷となっていた。

① PHPとデータベースが抱える「構造的な脆弱性不安」

WordPressは、アクセスがあるたびにPHPが動き、MariaDB/MySQLデータベースから記事データを引っ張ってきてHTMLを組み立てる「動的CMS」だ。 さらに、管理画面(/wp-login.php)が外部に公開されているため、世界中のボットから常にブルートフォース(総当たり攻撃)や脆弱性スキャンの標的にされ続ける。

個人ブログを平穏に運営したいだけなのに、定期的なプラグイン更新、コアアップデート、データベースの整合性チェックに追われるのは精神衛生上よろしくない。「そもそもサーバー上でPHPもDBも動かさなければ、攻撃される隙そのものが消滅するのではないか」 という思いが強くなっていった。

② バックアップの煩雑さと復元の重さ

WordPressのバックアップは意外と面倒だ。

  • 記事や設定が入った MySQLデータベースのダンプ(.sql)
  • アップロードした画像群(/wp-content/uploads/)

この2系統を整合性を保ちながら保存しなければならず、万が一サーバーがクラッシュした際のリストア作業も手間がかかる。「ファイル数個をコピペすれば元通り」というシンプルさとは程遠かった。

③ 「ここまでの複雑さは不要」という割り切り

ブロックエディタ(Gutenberg)の複雑な装飾、重たいJavaScript、肥大化するCSS。 私が必要としていたのは、「PCでもスマートフォンでも、ストレスなく一瞬で読めるミニマルな美しさ」 であり、豪華絢爛なプラグインの森ではなかった。


2. なぜAstroを選んだのか? ── 最小限のHTML/CSSと圧倒的な自由度

静的サイトジェネレーターには Hugo や Next.js など多数の選択肢があるが、その中で Astro を選んだ決定打は以下の3点だった。

① ピュアなHTML/CSS/Tailwindで「自分好みに育てられる」

多くのCMSやモダンフロントエンドは、フレームワーク特有のブラックボックスな作法に縛られがちだ。 しかしAstroは、素のHTMLとCSS(Tailwind CSS)の直感をそのまま活かしてコンポーネントを組み立てられる。 「和紙の温かみを感じる下地」や「天体星図の上品なグリッド」といった独自の美意識も、最小限のCSSで思い通りに実装できた。

② アイランドアーキテクチャによる「クライアントJS実質ゼロ」

Astroの最大の特徴は、デフォルトでクライアントサイドのJavaScriptを一切ブラウザに送らない点にある。 生成されるのは純粋なHTMLとCSSだけ。そのため、ページの初回読み込みや画面遷移が 1ms〜5ms(体感ゼロ秒) という異次元の速さで完了する。

③ Markdown / Content Collections による堅牢な型安全

記事はすべてローカルのプレーンなMarkdownファイル(.md)として管理される。 TypeScriptのスキーマ定義(Zod)により、タグの形式や公開日、アイキャッチ画像の指定漏れなどがビルド時に自動検証されるため、記事の品質が常に高く保たれる。


3. 構築した新アーキテクチャ(Cloudflare Tunnel × Nginx 静的配信)

移行にあたって構築した本番公開の全体構成は以下の通りだ。

flowchart TD
    subgraph Client ["読者・閲覧環境"]
        Browser["ブラウザ (PC / スマホ)"]
    end

    subgraph Raspi ["Raspberry Pi 自宅サーバー"]
        Nginx["Nginx (ポート 80)"]
        Dist["/data/hiro-gear-astro/dist/<br>(超軽量 静的HTML・アセット群)"]
        Tunnel["Cloudflare Tunnel (cloudflared)"]
    end

    Browser -->|https://hiro-gear.com| CF["Cloudflare Edge"]
    CF <-->|暗号化トンネル| Tunnel
    Tunnel <-->|ローカル転送| Nginx
    Nginx -->|ゼロオーバーヘッド直接配信| Dist
  • Node.jsの常駐すら不要な完全静的配信: npm run build で生成された静的ファイル群を、Nginxが直接配信する構成を採用した。 これにより、ブログ配信にかかるCPU負荷は0%、メモリ消費も0MB。 WordPressコンテナとデータベースを停止できたことで、Raspberry Piの空きメモリが一気に約1GB解放された。

4. AIエージェントに「ブログ運用ルール」を学習させる新運用

今回の移行における最大の収穫は、「AIエージェントと共創するブログ運用フロー」 を確立できたことだ。

WordPressの管理画面を人間がポチポチ操作するスタイルをやめ、AIエージェントのスキル(ナレッジ)として以下の4大ルールを徹底的に覚えさせた。

ルール項目具体的な規定内容
タグ付けの一本化従来の「カテゴリー」を廃止し、ビジョン直結の4軸(自作インフラ/AI・エージェント/手帳・知的生産/ライフ・日常工作)+個別技術タグ(2〜3個)に一本化。
目次の構造化H2/H3の2階層のみに限定。要点が伝わる具体的なフレーズで見出しを構成。
サムネイルの統一16:9横長ワイド。和モダン✕天体星図✕テックの世界観を保つプロンプト型を固定化し、画像内テキストは入れない。
プライバシー防壁画像のExif位置情報をPillowで完全ストリップ。ナンバープレートや生活圏、自宅内部IP・機材呼称の露出を厳禁化。

日々の思考メモ(Obsidian)から記事の素案を起こし、AIエージェントに「この記事を推敲して、アイキャッチ画像を生成して公開して」と指示するだけで、ルールを完全に遵守した最高品質の記事がわずか数分でデプロイされる体制が整った。


5. バックアップ計画の劇的な進化 ── 「Gitがすべて」の世界へ

WordPress時代に頭を悩ませていたバックアップは、信じられないほどシンプルになった。

  • Gitリポジトリがバックアップそのもの: 記事本文(Markdown)、画像アセット、サイトのデザインコード、ビルド設定のすべてが単一のGitリポジトリ(/data/hiro-gear-astro)に集約されている。
  • 1コマンドで別マシンへ二重バックアップ: 記事を書いた後は git commit して、開発用ワークステーションへ git push するだけ。
  • 1分で復元可能なディザスタリカバリ: 仮にRaspberry Piが物理的に全損しても、新しいハードウェアで git clone して npm run build を叩けば、わずか1分で100%同一のブログが蘇る。データベースの復元やパーミッション調整に悩まされる日々は完全に過去のものとなった。

6. まとめ:引き算が生み出した、思考に集中できる場所

WordPressからAstroへの移行は、単なるWebフレームワークの乗り換えではなく、「不要な複雑さを手放し、本当に大切なコンテンツと思索に集中するための引き算」 だった。

  • セキュリティ: PHPもDBもログイン画面もないため、脆弱性への不安がゼロに。
  • パフォーマンス: ページ表示はミリ秒単位。モバイルでもPCでも極めて快適。
  • 保守性: ファイルとGitだけで完結し、バックアップと復元が最高にイージー。
  • 拡張性: AIエージェントと連携し、手帳(Obsidian)から直結した執筆・公開フローが完成。

「自分のサーバーで、自分でコントロールできるシンプルなブログを持ちたい」「AI時代に合ったスマートな知的生産の出口を作りたい」と考えている人にとって、AstroとMarkdownによる静的サイト構成は、間違いなく現時点で最も美しく、最強の選択肢の一つだと確信している。