🏗️
概念 #アーキテクチャ #Astro #Cloudflare 📚 ブログサイト構築

ブログサイト構築 — 全体アーキテクチャ

Astro + Cloudflare Pages で構築した技術ブログの全体設計。SSG・Cloudflare エコシステム・OGP自動生成の関係を俯瞰する

このシリーズについて

本ブログ(octomblog)の構築で採用した技術・設計の記録。 なぜその選択をしたかに焦点を当て、同種のサイトを構築する際の参考にできるようまとめる。

全体構成

ブラウザ

  ├─ 静的ページ(HTML/JS/CSS)── Cloudflare Pages CDN(全世界エッジ配信)
  │   └─ ビルド時に全コンテンツを静的生成(getStaticPaths / prerender)
  │       ├─ Markdown → HTML 変換(Astro Content Collections)
  │       └─ OGP 画像生成(Satori + @resvg/resvg-js)→ dist/ogp/**/*.png

  └─ 動的API(/api/views/...)── Cloudflare Pages Functions
      └─ Cloudflare KV に閲覧数を read/write

技術スタック

技術役割
フレームワークAstro v6SSG ビルド・コンポーネント管理
コンテンツ管理Markdown + frontmatter記事・Docs の管理
OGP画像生成Satori + @resvg/resvg-jsタイトル入り PNG をビルド時生成
スタイリングTailwind CSS v4ユーティリティファースト CSS
検索Pagefindビルド後に全文インデックスを生成
ホスティングCloudflare PagesCDN + Functions の統合プラットフォーム
動的APICloudflare Pages Functions閲覧数カウント
永続化Cloudflare KV閲覧数の保存

設計の基本方針

「ビルド時にできることはビルド時に」

ランタイムのコンピューティングコストをゼロに近づけるため、できる限りビルド時に処理する。

  • Markdown → HTML: ビルド時変換(SSG)
  • OGP 画像: ビルド時 PNG 生成(Satori)
  • 検索インデックス: ビルド後 Pagefind 生成
  • サイトマップ: ビルド時 sitemap.xml 生成

閲覧数カウントだけは書き込み操作を要するため Cloudflare KV + Pages Functions で動的処理。

Functional Core, Imperative Shell

Astro コンポーネントは「データ取得(I/O)」「変換ロジック」「描画」が混在しやすい。 src/lib/ に純粋関数を切り出し、ページは I/O の調停役に徹する設計にした。

src/lib/          ← 純粋関数(副作用ゼロ・テスト容易)
src/pages/        ← I/O 調停(getCollection + lib + コンポーネント)
src/components/   ← 描画層(props → HTML)

シリーズ構成

#タイトル内容
1全体アーキテクチャ(本ドキュメント)スタック選定・設計方針
2SSG と MPA の設計Astro の静的生成と部分的クライアント処理
3Cloudflare ホスティングPages・Functions・KV の連携
4OGP 画像の自動生成Satori + resvg のビルド時生成
5Cloudflare D1 入門リレーショナルDBをエッジで使う選択肢