• #cloudflare-access
  • #cloudflare-r2
  • #ssg
  • #build-optimization
  • #obs
  • #tokyo-soundscape
開発tokyo-onkeiメモ

Cloudflare AccessとR2でコンセプトサイトのインフラを整備した

前日までにNuxtで構築・デプロイしたoto archiveのコンセプトサイトに対して、アクセス制限、ビルド高速化、動画書き出し周りのインフラ整備を一気に進めた日。

Cloudflare Accessによるメール認証

コンセプトサイトは社外に公開したくないので、Cloudflare Accessでアクセス制限をかけた。

設定手順

  1. Cloudflare Zero Trust ダッシュボードを開く
  2. Access → Applications → セルフホスト型アプリケーションを作成
  3. パブリックホスト名に concept.otoarchive.com を設定
  4. Allow-emailポリシーを作成(Include: Email で許可するアドレスを指定)

これでサイトにアクセスすると、まずメールアドレスの入力を求められ、ワンタイムPINがメールで届く仕組みになる。パスワード管理が不要で、招待したい相手にはメールアドレスを登録するだけ。

無料プラン(Zero Trust Free)で50ユーザーまで使える。これはアカウント全体の合計なので、複数サイトに適用する場合は上限に注意。

conceptサイトのCloudflare Pagesデプロイ

Cloudflare Pagesに oto-concept プロジェクトを作成してデプロイした。前日のデプロイスクリプトをそのまま使い、カスタムドメインに concept.otoarchive.com を紐付けて完了。

ライブラリデータのR2移行でビルド高速化

問題

コンセプトサイトには5,850件のライブラリデータがあり、それぞれに個別ページを生成していた。SSGプリレンダリングで全ルートをビルドすると時間がかかる。前日時点で11,000ルート超のビルドだった。

解決: SPAモード + R2

ライブラリの一覧・詳細ページはSSGで静的生成する必要がない。データをCloudflare R2に置き、クライアントサイドで読み込むSPAモードに切り替えた。

// nuxt.config.ts
routeRules: {
  '/library/**': { ssr: false }  // SPAモードに設定
}

ライブラリデータの生成とアップロードは専用スクリプトにまとめた。

pnpm generate:library  # library.json生成 → R2アップロード

効果

  • プリレンダー対象: 11,732ルート → 38ルート
  • ビルド + デプロイ: 約1分10秒

ページ数が3桁減ったのでビルドが軽くなった。ライブラリデータはR2から取得するため、データ更新時もサイト全体のリビルドが不要になるという副次的なメリットもある。

R2の設定

CORSルール

concept.otoarchive.com からR2バケット(oto-assets)のデータをフェッチできるよう、wrangler CLIでCORSルールを設定した。

wrangler r2 bucket cors set oto-assets --rules '[...]'

カスタムドメイン

R2バケットに assets.otoarchive.com のカスタムドメインを設定した。R2のデフォルトURLよりも短く、将来的にCDN設定の柔軟性も確保できる。

動画書き出しの検討

コンセプトサイトの紹介動画を作るために、ブラウザ画面の録画方法を検討した。

試したアプローチ

  1. Playwrightの録画機能: VP8コーデック固定で、ビットレートが約1Mbpsしか出ない。4Kコンテンツには画質が足りない
  2. CDP(Chrome DevTools Protocol)スクリーンショット方式: フレームごとにスクリーンショットを撮って動画化する方法。4Kで2fps、1080pで5fps程度しか出ず、実用的ではない

結論: OBS録画が最善

プログラマティックな録画は画質・速度の両面で制約が大きい。結局、OBSで画面を録画し、Premiereで音声を合わせるのが一番品質が高く手早い。

OBSの設定は以下に落ち着いた。

  • エンコーダ: NVENC H.264
  • レート制御: CQP 18(高画質)
  • プリセット: P5 Slow
  • プロファイル: high
  • コンテナ: MKV(録画中クラッシュしてもファイルが壊れない)
  • 音声: 無音(Premiereで後から合わせる)

その他の整備

サブドメインローカル開発のドキュメント化

複数のNuxtプロジェクトを *.localhost のサブドメインで並行開発する手順をドキュメントにまとめた。ポート番号の使い分けや、nuxt.config.ts での devServer.port 設定など。

.gitignore整備

プロジェクトで使うファイル形式に合わせて除外設定を追加した。

  • .gpx / .m4a: フィールドワークの生データ
  • audio-analysis.json: 音声解析の中間ファイル
  • .wrangler/: wranglerのローカル状態
  • library.json: ビルド時に生成されるデータファイル

ふりかえり

R2 + SPAモードへの切り替えは効果が大きかった。SSGで全ページをプリレンダーする設計は、数十ページ規模なら問題ないが、数千ページになるとビルド時間が線形に伸びる。動的データはCDN(R2)に逃がしてクライアントで取得する方が、ビルドとデプロイのサイクルが速くなる。

Cloudflare Accessは設定が簡単で、無料枠も十分。パスワード管理の手間がなく、メールベースの認証はセキュリティと利便性のバランスがいい。

動画録画はプログラマティックにやろうとして遠回りしたが、OBSという定番ツールに戻ってきた。ブラウザ操作の自動化と画面録画は別の問題として切り分けたほうがいい。