📌
traefik+monorepo+supabaseな透過的認証アーキテクチャ
はじめに
認証画面付きのインフラってスケールめんどくさくないですか?
自分のニーズとしては閉じたオレオレ環境と安いPaaSでやりたいだけなんですが。
コンテナ毎に言語や環境も自由な色々なワールドを作りたいのに、都度認証の組み込みをやる必要があって骨が折れます。
シンプルさを維持しながら自動認証がついて、スケーラブルなインフラを構築できないか?ということで、やってみました。
設計思想
1. 統合コンテナアプローチ
- Traefik と 認証画面 を1つのコンテナに統合
- PaaS環境での単一コンテナデプロイを実現
- monorepoでパッケージを増やしても簡単に拡張できるようにする
2. 自動サービス検出
- 環境変数
INTERNAL_URL_*
からサービスを自動検出 - 新しいサービス追加時の設定変更を最小化
- 動的ルーティング設定の自動生成
3. 透過的認証
- ForwardAuth による認証チェック
- アプリケーション側での認証実装不要(未認証時、自動でリダイレクト)
- 統一された認証体験
主要概念
- Traefik: リバースプロキシ・SSL終端・ルーティング
- 認証サーバー+Supabase: Hono + Supabase Auth による ForwardAuth 実装
- monorepo: Dockerベースのmonorepoアーキテクチャ
プロジェクト構造
monoauth-base/
├── infra/ # インフラ設定
│ ├── auth/ # 認証サーバー (Hono + Supabase)
│ ├── traefik/ # Traefik設定
│ │ ├── traefik.yml # メイン設定
│ │ └── dynamic.template.yml # 動的ルーティング設定
│ └── start.sh # 統合起動スクリプト
├── packages/ # アプリケーションパッケージ
│ └── xxx/ # 任意のパッケージxxx
├── docker-compose.yml # 本番用構成
├── Dockerfile # Traefik+Auth統合コンテナ
├── package.json # ルートパッケージ
└── pnpm-workspace.yaml # pnpmワークスペース設定
認証フロー
認証システム
ForwardAuth による透過的認証
-
未認証ユーザー:
/
→/auth/
(ログイン画面) -
認証済みユーザー:
/
→/web
(デフォルトサービス) -
保護されたパス:
/web
,/hello
など → 認証チェック → サービス
📝 まとめ
ChatGPTに聞くと、小〜中規模のプライベート環境で「とにかく早く・安く・アプリ改修ゼロで認証付きにしたい」ケースには十分有効とのことでした。
レポジトリ
Discussion