本文へスキップ
Acecore

ヘッドレスCMS選定記 ― Pages CMS を選んだ理由と Turnstile によるボット対策

by Gui
目次
ヘッドレスCMS選定記 ― Pages CMS を選んだ理由と Turnstile によるボット対策

CMS の選定は地味ですが重要な意思決定です。この記事では、3つの CMS を実際に評価した過程と、お問い合わせフォームに Cloudflare Turnstile を導入したボット対策について紹介します。

CMS 選定の経緯

Astro で構築した静的サイトに CMS を導入する際、以下の3つを候補に挙げました。

Keystatic:最初の候補

Keystatic は型安全な CMS として注目していました。Astro との統合も公式にサポートされています。しかし、ローカルモードでの運用にはサーバーサイドランタイムが必要で、Cloudflare Pages の静的デプロイとの相性に難がありました。

Sveltia CMS:高機能だが重い

Sveltia CMS は Decap CMS(旧 Netlify CMS)のフォークで、モダンな UI と多機能さが魅力です。しかし、現時点でのプロジェクト規模(ブログ記事数本+固定ページ数枚)に対してはオーバースペックでした。将来的にコンテンツが増えた段階で再評価する予定です。

Pages CMS:採用

Pages CMS は GitHub リポジトリの Markdown ファイルを直接編集する軽量な CMS です。

採用の決め手は以下のとおりです:

  • セットアップが簡単.pages.yml を1ファイル追加するだけ
  • サーバー不要:GitHub API 経由で動作するため、追加のインフラが不要
  • Markdown ネイティブ:Astro のコンテンツコレクションとそのまま連携
  • GUI エディタ:非エンジニアのチームメンバーもブラウザから記事を編集可能
# .pages.yml
content:
  - name: blog
    label: ブログ
    path: src/content/blog
    type: collection
    fields:
      - name: title
        label: タイトル
        type: string
      - name: date
        label: 公開日
        type: date
      - name: tags
        label: タグ
        type: string
        list: true

Cloudflare Turnstile の導入

お問い合わせフォームのスパム対策として、Cloudflare Turnstile を導入しました。

なぜ reCAPTCHA ではなく Turnstile か

Google reCAPTCHA v2 はユーザーに画像選択を強制し、v3 はスコアベースですがプライバシー面で懸念があります。Cloudflare Turnstile は以下の点で優れています:

比較項目reCAPTCHA v2reCAPTCHA v3Turnstile
ユーザー操作画像選択が必要不要不要
プライバシーCookie ベース追跡行動分析最小限のデータ収集
パフォーマンス重い中程度軽い
料金無料(制限あり)無料(制限あり)無料(無制限)

実装方法

Turnstile の導入は驚くほど簡単です。

1. Cloudflare Dashboard でウィジェットを作成

Cloudflare Dashboard の「Turnstile」セクションからウィジェットを作成し、対象ホスト名(本番ドメインと localhost)を登録します。サイトキーが発行されます。

2. フォームにウィジェットを追加

<!-- Turnstile スクリプトの読み込み -->
<script
  src="https://challenges.cloudflare.com/turnstile/v0/api.js"
  async
  defer
></script>

<!-- フォーム内にウィジェットを配置 -->
<form action="https://ssgform.com/s/your-form-id" method="POST">
  <!-- フォームフィールド -->
  <input type="text" name="name" required />
  <textarea name="message" required></textarea>

  <!-- Turnstile ウィジェット -->
  <div
    class="cf-turnstile"
    data-sitekey="your-site-key"
    data-language="ja"
    data-theme="light"
  ></div>

  <button type="submit">送信</button>
</form>

data-language="ja" を指定すると、検証成功時に「成功しました!」と日本語で表示されます。data-theme="light" はサイトのデザインに合わせて背景色を制御するために指定します。

3. CSP ヘッダーの更新

Turnstile は iframe を使用するため、CSP で適切に許可する必要があります。

script-src: https://challenges.cloudflare.com
connect-src: https://challenges.cloudflare.com
frame-src: https://challenges.cloudflare.com

注意点:ウィジェット作成直後の伝播遅延

Cloudflare Dashboard でウィジェットを作成した直後は、サイトキーがグローバルに伝播するまで1〜2分かかります。その間は 400020 エラーが発生しますが、少し待てば解消します。

ssgform.com の活用

フォームの送信先には ssgform.com を使っています。静的サイトから使えるフォーム送信サービスで、以下の利点があります:

  • サーバーサイドコード不要
  • メール通知が自動で届く
  • Turnstile のトークン検証にも対応
  • 無料プランで十分な送信数

まとめ

CMS もボット対策も「必要最小限のものを選ぶ」という方針で統一しました。Pages CMS はセットアップ5分で導入でき、Turnstile は数行のHTMLを追加するだけで実装できます。シンプルな構成だからこそ、運用コストが低く保てています。

CMS の比較

Keystatic / Sveltia CMS

  • Keystatic はサーバーサイドランタイムが必要
  • Sveltia CMS は高機能だが学習コストが高い
  • どちらも Astro + Pages 構成にはオーバースペック
  • セットアップに時間がかかる

Pages CMS

  • GitHub リポジトリの Markdown を直接編集
  • GUI エディタで非エンジニアも記事更新可能
  • サーバーサイド不要で Pages と相性抜群
  • .pages.yml だけで設定完了
よくある質問
Pages CMS とは何ですか?
GitHub リポジトリの Markdown ファイルを GUI で直接編集できる軽量 CMS です。サーバー不要で .pages.yml だけで設定が完了し、非エンジニアでも記事更新ができます。
Cloudflare Turnstile は reCAPTCHA と何が違いますか?
Turnstile はユーザーに画像選択などの操作を求めず、バックグラウンドで自動検証します。UX を損なわず、プライバシーにも配慮され、無料で利用できます。
静的サイトでフォーム送信を処理するにはどうしますか?
ssgform.com や Formspree などの外部フォームサービスを利用すれば、サーバーサイドコード不要でフォーム送信を処理できます。Turnstile と組み合わせてスパム対策も可能です。
G

Gui

Acecore 代表。システム開発・Web制作・インフラ運用からIT教育まで幅広く手がけるエンジニア。 技術で人と組織の課題を解きほぐすのが好き。

システム開発 Web制作 インフラ運用 IT教育

運用・インフラのお悩みはありませんか?

サーバー構築からメール移行、セキュリティ対策まで、安定運用をサポートします。

関連記事

記事を検索