2026年2月21日の開発日記
朝イチでClaude Codeをアップデートし、昨日の計画を引っ張り出すところから始まった。Better Authの認証基盤を本番に載せ、問題集に履歴・復習・アクセス制御を組み込み、独立型ダッシュボードを設計からデプロイまで通した。しかし、ユーザー体験を掘り下げた結果、同日中に独立型を捨てて1ドメイン統合型への方針転換を決めた。メール環境もゼロコストで立ち上げた。作って壊して学んだ1日だった。
今日やったこと
1. 認証基盤構築 + 問題集機能拡張
Better Auth + Google OAuthを21ファイル・1029行で実装し、D1に認証テーブル4つを作成した。GCP ConsoleでOAuth設定を済ませ、ポート3200でdevサーバーを固定。メール/パスワード認証はResendのコスト(無料100件/日→有料$20/月)を見てGoogle一本に絞った。
問題集は6フェーズで一気に拡張した。Question ID生成、回答履歴のD1永続化、復習ページ(章→セクション→問題の3階層)、アクセスレベル3段階制御、ランダム10問出題。Codex(GPT-5.3)にコードレビューを投げ、P1〜P3の3件を修正。
本番デプロイでBetter Auth v1.4+がAsyncLocalStorageを使う件にぶつかり、nodejs_compatフラグの1行を追加して解決した。
主な成果:
- Google OAuth認証の本番動作確認完了
- 回答履歴・復習・アクセス制御・ランダム出題の4機能を一括実装
- Codexレビューで未ログイン時のフィルタリング漏れ等を修正
詳細: Better Auth認証基盤の本番投入と問題集機能6フェーズ拡張の記録
2. 独立型ダッシュボード構築 → 1ドメイン統合型への方針転換
問題集アプリのユーザー・回答データを俯瞰するダッシュボードを独立アプリとして設計した。Nuxt 4 + Cloudflare Pages + D1構成で全20ファイルを作成し、本番デプロイまで通した。
しかし、マネタイズモデルとユーザー導線を掘り下げたところ、サブドメイン分離の問題(セッション分断、購入状態の把握困難、課金導線の分断)に気づき、同日中に独立型を廃止して1ドメイン統合型に転換する判断をした。管理画面はアプリ内の /admin/ ルートとして再構築する。
本番デプロイで踏んだ3つの罠(sessionテーブルのtokenカラム不足、SSR時のCookie転送問題、adminホワイトリスト問題)から得た知見は、/admin/ 構築時にそのまま活きる。
主な成果:
- 独立ダッシュボードのプロトタイプ完成(→ 方針転換で廃止決定)
- SSR + 認証のCookie転送問題(
useRequestFetch())など本番固有の知見を獲得 - 1ドメイン統合型の新アーキテクチャを設計・ドキュメント化
詳細: 独立型ダッシュボードを作って壊した日 — 1ドメイン統合型への方針転換
3. インフラ・ドメイン・メール環境整備
プライバシーポリシーと利用規約のページを作り、フッターに配置した。Chrome DevToolsで表示を確認。
Cloudflare Email Routingで独自ドメインの受信を設定し、Brevo(旧Sendinblue)でSMTP送信環境を構築した。Google Workspaceなしで独自ドメインメールの送受信が回る状態になった。
ドメイン戦略も整理した。info-accounting.comをメインのサービス販売ドメインに、app.eurekapu.comを現行Herokuアプリの移行先(Cloudflare Workers)に位置づけた。
主な成果:
- 法的ページ(プライバシーポリシー・利用規約)とフッターの整備
- 独自ドメインメール環境をゼロコストで構築
- 4ドメインの用途と移行方針をドキュメント化
詳細: 独自ドメインメール環境をCloudflare + Brevoで無料構築した話
4. 開発環境・テスト整備
VoltaのデフォルトNode.jsがv14.21.2でnpmと互換性がなかった問題をNode.js 22.22.0への更新で解決。Claude Codeのステータスラインにコンテキストウィンドウ使用量の表示を設定した。
eurekapu-nuxt4のテストスイートも整備した。typescriptパッケージ未インストールでESLintパーサーが機能しない問題を解消し、アクセス制御導入に伴うE2Eテストのchapter変更を実施。Playwright全24テストパス、全スイート合格まで持っていった。
主な成果:
- Volta + Node.js環境の正常化
- ESLint・E2Eテスト全パス
- ダッシュボードディレクトリのESLint ignore追加
詳細: 開発環境とテストスイートの整備
今日の学び
- 作ったものを同日中に壊す判断も正しい。ユーザー導線を掘り下げてサブドメイン分離の問題(セッション分断、購入状態把握困難)に気づけたのは、プロトタイプを本番に載せたからこそ
- Cloudflare Workersで
nodejs_compatフラグが抜けているとBetter AuthがAsyncLocalStorageでクラッシュする。compatibility_flagsの1行が生死を分ける - SSR時の
useFetchはCookieを自動転送しない。useRequestFetch()に切り替えると解決する - Cloudflare Email Routing + Brevoの組み合わせで、Google Workspaceなしに独自ドメインメールが運用できる
- Voltaのグローバルパッケージインストールはnpmでしか動かない。pnpmに変更するオプションはない
- Codex(GPT-5.3)のコードレビューは、未ログイン時のフィルタリング漏れなど自分では見落とす観点を拾ってくる
明日やること
- eurekapu-dashboard ディレクトリおよび関連リソースの削除
- eurekapu-nuxt4 に
/admin/ルートを構築(ダッシュボード機能の移植) - 購入管理テーブル(purchase, subscription)の設計
- Stripe審査完了後の決済機能統合
- 動画ホスティング選定と実装方針の決定