📌

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 による透過的認証

  1. 未認証ユーザー: //auth/ (ログイン画面)
  2. 認証済みユーザー: //web (デフォルトサービス)
  3. 保護されたパス: /web, /hello など → 認証チェック → サービス

📝 まとめ

ChatGPTに聞くと、小〜中規模のプライベート環境で「とにかく早く・安く・アプリ改修ゼロで認証付きにしたい」ケースには十分有効とのことでした。

レポジトリ

https://github.com/k-hizaki/monoauth-base

Discussion