自動化・効率化

GitHubを非公開にしただけでは下書き保護にならない|Cloudflare Pagesで公開物を分ける方法

更新

このブログのGitHubリポジトリは非公開ですが、それだけでは記事の下書きを公開サイトから守る仕組みにはなりません。

Cloudflare Pagesはビルド後の出力ディレクトリを公開するため、そこへ下書きHTMLを出してしまえば、元リポジトリが非公開でも公開サイトから読める状態になります。

非公開リポジトリと公開サイトは別

GitHubの非公開リポジトリは、許可されたユーザーだけがリポジトリ内容を閲覧できる設定です。

一方、Cloudflare PagesのGit連携では、リポジトリを元にビルドし、指定したビルド出力ディレクトリの内容をウェブサイトとして公開します。

そのため、「GitHubが非公開だから下書きHTMLを生成しても安全」とは考えず、公開ビルドの出力自体から下書きを除外するようにしました。

記事にdraft / publishedを持たせる

各記事データに公開状態を持たせています。

{
  "status": "draft"
}

公開を決めた記事だけpublishedへ変更し、通常ビルドではpublishedの記事だけを対象にします。

未来日時も公開しない

公開状態がpublishedでも、公開日時が未来の場合は出力しないようにしています。

これにより、予約公開用の原稿を先にリポジトリへ保存しても、指定日時より前のビルドでは公開されません。

ただし、時刻が来ただけでCloudflare Pagesが自動再ビルドするわけではないので、実際の予約公開には別途デプロイのきっかけが必要です。

公開物はdistだけに分離する

このブログでは、Cloudflare Pagesの公開対象をdistディレクトリにしています。

記事の元JSON、WordPress移行用スナップショット、下書きデータなどはdistへコピーしません。

Cloudflare公式でも、Pagesは指定したビルド出力ディレクトリの内容をサイトとしてアップロードすると説明しています。

公開記事の本文から、うっかり下書きURLへリンクしてしまう事故も防ぐ必要があります。

そこでビルド後に全ローカルリンクを検査し、公開出力に存在しないURLへリンクしていた場合はビルドを失敗させるようにしています。

タイトルや本文の混入も検査する

下書きページ自体を出力しなくても、関連記事一覧や検索用データへ下書きタイトルが混ざる可能性があります。

このブログでは、下書きの記事タイトルやURLが公開HTMLに含まれていないかもビルド時に検査します。

下書きプレビューも本番と分ける

下書きを確認するためのプレビュー出力は、本番用distとは別ディレクトリへ作ります。

また、CIやCloudflare上では下書きプレビューを生成しないよう制限し、公開環境に下書きが出ないようにしています。

まとめ

  • GitHubリポジトリの非公開設定と公開サイトの出力は別に考える
  • 下書きはビルド対象から除外する
  • 未来日時の記事も公開出力へ含めない
  • 公開物は専用ディレクトリへ分離する
  • 下書きURLへのリンクやタイトル混入も自動検査すると安全

WordPress.comからCloudflare Pagesへ移行した構成はこちら

参考情報

関連記事

← ホームへ戻る