📝

CloudflareとmdBookとHonoでMarkdownドキュメントをちゃんと限定公開する

に公開

こんにちは、@key60228です。

この記事はAI Shift Advent Calendar 2025Hono Advent Calendar 2025の7日目の記事です。


この生成AI時代、ドキュメントもAIエージェントフレンドリーにGitとMarkdownで管理したいな〜〜でもあまりMarkdownに馴染みのないビジネスメンバーも簡単に確認できるよう、Webで見れるようにしておきたいな〜〜でもPublicにはしたくないな〜〜って考えてる方、いらっしゃるんじゃないでしょうか。

かくいう自分もその一人で、先日Cloudflare PagesとZero TrustとOIDC IdPとmdBookでサクッとMarkdownドキュメントを限定公開する記事を書きましたが、いくつかの課題が残ったままになっていました。

  • 現在はCloudflare PagesよりCloudflare Workersの利用が推奨されている[1]
  • Cloudflare Zero TrustのFreeプランだと50人までしか限定公開の対象にできない[2]
  • プロジェクト/ドキュメントが増える度に手作業が必要となり、トイル化している

そこで今回は改めてCloudflare WorkersとHonoで"ちゃんと"限定公開する記事を書きます!

やりたいこと (前回とほぼ同じ)

  • ドキュメントをgit管理下におきたい (≒ Markdownで書きたい)
  • ドキュメントをどこかにホスティングしたい
  • ホスティングしたドキュメントを閲覧できる人を制限したい (閲覧する人の属性はDeveloper、ML/DS、その他ビジネスメンバーと幅広い)
  • 公開対象者/範囲をスケーラブルにしたい <- new!
  • ドキュメントやプロジェクトが増えても極力手作業が発生しないようにしたい <- new!

リポジトリ

いいからモノを見せんかい、って方はこちら。

https://github.com/KEY60228/cloudflare-mdbook-hono

How to

OIDC IdPの準備

PKCEに対応しているOIDC IdPであればGoogleでもAuth0でもKeycloakでもなんでもOKです。

前回サイバーエージェントの社内認証/認可基盤のPERMANを使いましたが、今回は自前のZITADEL Cloudで試します。

ISSUER URLとClient IDを取得しておきます。 (詳細は省きます)

認証 & 配信サーバー / OIDC Clientの実装

今回のケースでは認証 & 静的配信サーバーとOIDC Clientを自前で実装する必要があります。

前回はCloudflare PagesとZero Trustに丸っとお任せしてましたが、今回はHonoを使って実装していきます。

今回提供するエンドポイントは以下の4つです。

  • ログイン
  • OIDCコールバック
  • ログアウト
  • 静的アセット配信

静的アセット配信エンドポイントにはmiddlewareを噛ませ、認証を通ったアクセスのみアセットに到達できるようにし、未認証のアクセスはログインエンドポイントにリダイレクトするようにします。

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/src/index.ts

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/src/middleware/auth.ts

ログイン、OIDCコールバック処理では、OAuth2.0 PKCEの仕組みにのっとり、code_verifier/code_challengeの生成・検証を行います。

認証に成功した場合はセッション情報をCloudflare KVに格納、ユーザーにはCookieを付与するようにしています。

こうしたmiddlewareやcookieをsimpleに実現できるのもHonoの良いところですね。

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/src/handler/login.ts

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/src/handler/callback.ts

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/src/util/session.ts

配信エンドポイントではCloudflare WorkersのStatic Assetsという機能を使ってドキュメントを配信します。

npm create cloudflare@latest で作成した際の初期パスである ./public をバインディングしています。

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/src/handler/serve.ts

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/wrangler.jsonc

ドキュメントの準備

前回同様、mdBookプロジェクトを作成し、ドキュメントを更新し、ビルドします。

デフォルトではビルドアセットは book に出力されますが、Static Assetsでバインディングしているパスに変更するようにしてください。

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/mdbook/book.toml

タイトルに盛り込んでこそしまいましたが、最終的にhtmlとなればDocusaurusでもMkDocsでもなんでもOKだと思います。

CI/CDの整備

GitHub ActionsでCI/CDも構築しました。

とはいえあまり大したことはしておらず、CIではmdBookのbuild、Honoのformat/type checkを、CDではmdBookのbuildとwrangler deployを行うようにしています。

もしこのリポジトリをforkする場合はGitHub Actionsのsecretに CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID を設定することをお忘れなきよう…

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/.github/workflows/ci.yaml

https://github.com/KEY60228/cloudflare-mdbook-hono/blob/27d7e181791e547ace2a45e110134dfd1fd51c4c/.github/workflows/cd.yaml

Secretの設定

Cloudflare Workersに対してSecretで ISSUERCLIENT_ID を設定しましょう。

コンソールからでもwrangler CLIからでもOKです。

動作確認

以上でプロジェクトのセットアップは完了です。

該当のドメインにアクセスすると、IdPのログイン画面にリダイレクトされ、ログインに成功した場合は正しくドキュメントを参照できるかと思います。

まとめ

元々Notionで管理していたドキュメントをMarkdown&Gitで管理したい!というモチベーションからスタートしたプロジェクトで、前回の内容でも必要十分ではありましたが、スケーラビリティとトイル削減のため今回改めて取り組むことにしました。

PRDなどをこのリポジトリで管理し、プロダクトリポジトリにsubmoduleとして取り込むことで、コーディングエージェントを使った開発を加速させることができるのでは?と画策しています。

リポジトリは汎用性を意識して実装したので、もし同じような悩みを抱えている方がいらっしゃったらscaffold的に使ってもらえたら嬉しいです!

https://github.com/KEY60228/cloudflare-mdbook-hono

宣伝

AI Shiftではエンジニアの採用に力を入れています!
少しでも興味を持っていただけましたら、カジュアル面談でお話しませんか?
(オンライン・19時以降の面談も可能です!)

【面談フォームはこちら】
https://hrmos.co/pages/cyberagent-group/jobs/1826557091831955459


脚注
  1. https://blog.cloudflare.com/full-stack-development-on-cloudflare-workers/ ↩︎

  2. 追加ユーザーは1シートあたり$3(!) https://www.cloudflare.com/plans/zero-trust-services/ ↩︎

AI Shift Tech Blog

Discussion