作成: 2026-06-27 / 対象: Cloudflare Workers・D1・Access への移行記録
health.lunelukkio.comだけを入口にしてCloudflare AccessのGoogle認証で本人限定にしました。移行中の「D1 binding変更後の空DB」と「Access callbackが無効なworkers.devへ戻る」問題は、どちらも設定上の識別子と実体の対応ずれが原因でした。処理の目的は変えず、常時起動サーバーとローカルファイルへの依存をCloudflareの実行環境へ置き換えました。Dashboardで行ったCloudflare設定の再現手順はHM-003、旧構成はHM-001: ローカル版の構成を参照してください。
| 領域 | Cloudflare版 | 確認 |
|---|---|---|
| API・保存 | TypeScript + Hono + D1、症状・地点CRUD | 実装済み |
| 気象 | Open-Meteo Geocoding / Historical / Forecast | 同期実装済み |
| 日時 | UTCで保存し、地点タイムゾーンで日次集計 | UI変換も対応 |
| 解析・出力 | Pearson、Spearman、p値、CSV | 実装済み |
| 検証 | 実D1を使うWorkers Vitest | 11件成功、build / lint成功 |
Accessを通過したリクエストだけがWorkerへ届きます。WorkerはD1を正本とし、必要な気象だけをOpen-Meteoから補完します。
MiniflareのローカルD1ファイルはD1の識別子に対応して作られます。初期migrationを誤った識別子で適用した後に正しいbindingへ差し替えたため、旧SQLiteにスキーマが残り、現bindingが参照する新SQLiteは空でした。データ削除ではなく参照先の分離です。
当初はAccessのdestinationにcustom domainとworkers.devの両方を登録していました。一方Worker側ではworkers.devを無効化済みだったため、認証後callbackがworkers.devへ戻ると「There is nothing here yet」になりました。destinationをcustom domainだけに揃えて解消しました。
| 確認項目 | 結果 | 意味 |
|---|---|---|
| 認証 | Googleのみ、本人限定、24時間 | 未認証通信はWorkerの前で停止 |
| 公開経路 | custom domainのみ | workers.devとpreview URLは無効 |
| 本番D1 | 8テーブルすべて0件 | 調査時点で不審な書込みなし |
| デプロイ履歴 | 既知の所有者のみ | 未知のデプロイなし |
| 侵入兆候 | 確認されず | 将来の安全を保証するものではない |
通常のWebアクセスだけで第三者がWorkerのプログラムを書き換えることはできません。注意すべき入口はCloudflare/GitHubアカウントの侵害、デプロイトークン流出、依存パッケージの供給網、将来追加する入力処理のXSSです。
| 段階 | 実施内容 | 検証 |
|---|---|---|
| A1 | ローカル版の機能とデータ構造を把握 | 既存フローを基準化 |
| A2 | D1作成、binding修正、migration適用 | 8テーブル・3インデックス |
| A3 | Hono / D1 API、気象同期、解析、CSV、React連携 | Vitest 11件、build、lint |
| A4 | custom domainへデプロイ | 旧workers.devが404 |
| A5 | Google IdPとAccess本人限定設定 | 未認証302、認証後表示 |
構成・テスト結果・調査結果は2026-06-27時点のプロジェクト作業記録に基づく。外部サービスの仕様は公式資料を参照。