イントロ
自分で作ったサイトなら認証を簡単に入れられるでしょう。でもOSSで認証が備わっていないものに対して、認証を追加したいな〜って思ったことありませんか?
プルリクでわざわざ認証機能を追加するのも大変ですし、そもそもメンテナが認証機能を追加してくれないかもしれません。
そんな時に便利なのがTinyAuth!
traefikのミドルウェアとして動作し、簡単に認証機能を追加できるサービスです。
例えばnginxやapacheといった自分で作ったコンテナに対してtraefikのミドルウェアをcompose.ymlのラベルに追加するだけで、ログインしないと入れないサイトに早変わりします。
そのログインも前日の4日目のPocketIDと組み合わせることで、OIDC認証を簡単に追加できちゃいます!
TinyAuthの使い方
環境情報
$ docker version
Client: Docker Engine - Community
Version: 29.1.3
API version: 1.52
Go version: go1.25.5
Git commit: f52814d
Built: Fri Dec 12 14:49:51 2025
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 29.1.3
API version: 1.52 (minimum version 1.44)
Go version: go1.25.5
Git commit: fbf3ed2
Built: Fri Dec 12 14:49:51 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v2.2.0
GitCommit: 1c4457e00facac03ce1d75f7b6777a7a851e5c41
runc:
Version: 1.3.4
GitCommit: v1.3.4-0-gd6d73eb8
docker-init:
Version: 0.19.0
GitCommit: de40ad0
前提条件
- Dockerがインストールされていること
- Traefikが導入されていること(リバースプロキシサーバー)
- Let's EncryptでTLS証明書を自動発行できるようにしておくこと
手順
-
compose.ymlの作成domain.tldは自分のドメインに置き換えてください。
https://tinyauth.domain.tldでログイン/ログアウトしたり、保護したコンテナにアクセスしに行くと自動的にtinyauthにリダイレクトされます。compose.ymlservices: tinyauth: image: ghcr.io/steveiliop56/tinyauth:v4 container_name: tinyauth restart: unless-stopped networks: - traefik-network env_file: - .env environment: SECRET: ${TINYAUTH_SECRET} APP_URL: https://tinyauth.domain.tld PROVIDERS_AUTH_CLIENT_ID: ${TINYAUTH_AUTH_CLIENT_ID} PROVIDERS_AUTH_CLIENT_SECRET: ${TINYAUTH_AUTH_CLIENT_SECRET} PROVIDERS_AUTH_AUTH_URL: https://auth.domain.tld/authorize PROVIDERS_AUTH_TOKEN_URL: https://auth.domain.tld/api/oidc/token PROVIDERS_AUTH_USER_INFO_URL: https://auth.domain.tld/api/oidc/userinfo PROVIDERS_AUTH_SCOPES: openid email profile groups PROVIDERS_AUTH_NAME: Pocket ID OAUTH_AUTO_REDIRECT: auth # 保護されたサービスにアクセスしたときに自動的に認証画面にリダイレクトする volumes: - ./tinyauth-data:/data labels: traefik.enable: true traefik.http.routers.tinyauth.rule: Host(`tinyauth.domain.tld`) traefik.http.middlewares.tinyauth.forwardauth.address: http://tinyauth:3000/api/auth/traefik traefik.http.services.tinyauth.loadbalancer.server.port: 3000 traefik.http.routers.tinyauth.entrypoints: websecure traefik.http.routers.tinyauth.tls: true traefik.http.routers.tinyauth.tls.certResolver: cloudflare networks: - traefik-network networks: traefik-network: external: true -
.envファイルの作成TINYAUTH_AUTH_CLIENT_ID="" # PocketIDで発行したクライアントIDを設定 TINYAUTH_AUTH_CLIENT_SECRET="" # PocketIDで発行したクライアントシークレットを設定 -
TinyAuthの起動
下記コマンドを実行したらhttps://tinyauth.domain.tldにアクセスできる
docker compose up -d
備考(Traefik Dashboardの認証有効化)
前々回のTraefikですが、ダッシュボードはログインなしでアクセスできる状態のcompose.ymlしか紹介していません。
TinyAuthを使ってダッシュボードに認証を追加する場合は、下記のようにlabelsにforwardauthの設定を追加してください。
traefik.http.routers.<ルーター名>.middlewares: tinyauthの行を追加するだけで、traefikのダッシュボードに限らずなんでも簡単に認証を追加できます。
services:
traefik:
image: traefik:v3.6
container_name: traefik
restart: unless-stopped
ports:
- 80:80
- 443:443/tcp
volumes:
- ./traefik.yml:/etc/traefik/traefik.yml
- ./letsencrypt:/letsencrypt
environment:
TZ: Asia/Tokyo
TRAEFIK_CERTIFICATESRESOLVERS_cloudflare_ACME_EMAIL: ${CF_API_EMAIL}
CF_DNS_API_TOKEN: ${CLOUDFLARE_DNS_API_TOKEN}
CF_ZONE_API_TOKEN: ${CLOUDFLARE_ZONE_API_TOKEN}
dns:
- 1.1.1.1
networks:
- default
- traefik-network
labels:
traefik.enable: true
traefik.docker.network: traefik-network
# Dashboard & API Router
traefik.http.routers.dashboard.rule: Host(`domain.tld`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
traefik.http.routers.dashboard.service: api@internal
traefik.http.routers.dashboard.entrypoints: websecure
traefik.http.routers.dashboard.tls: true
traefik.http.routers.dashboard.tls.certResolver: cloudflare
+ traefik.http.routers.dashboard.middlewares: tinyauth # ここを追加するだけ
# Redirect router
traefik.http.routers.dashboard-redirect.rule: Host(`domain.tld`) && Path(`/`)
traefik.http.routers.dashboard-redirect.service: api@internal
traefik.http.routers.dashboard-redirect.entrypoints: websecure
traefik.http.routers.dashboard-redirect.tls: true
traefik.http.routers.dashboard-redirect.tls.certResolver: cloudflare
traefik.http.routers.dashboard-redirect.middlewares: dashboard-redirect
# Redirect middleware
traefik.http.middlewares.dashboard-redirect.redirectregex.regex: ^(https://[^/]+)/?$$
traefik.http.middlewares.dashboard-redirect.redirectregex.replacement: $${1}/dashboard/
traefik.http.middlewares.dashboard-redirect.redirectregex.permanent: true
depends_on:
socket-proxy:
condition: service_started
socket-proxy:
image: tecnativa/docker-socket-proxy
restart: unless-stopped
container_name: readonly-socket
environment:
CONTAINERS: 1 # コンテナ情報の読み取り(必須)
SERVICES: 0 # サービス情報の読み取り(Swarmモード用)
NETWORKS: 1 # ネットワーク情報の読み取り(必須)
# セキュリティ関連
POST: 0 # 作成禁止
DELETE: 0 # 削除禁止
BUILD: 0 # ビルド禁止
IMAGES: 0 # イメージ操作不要
VOLUMES: 0 # ボリューム操作不要
SYSTEM: 0 # システム情報不要
SECRETS: 0 # SECRETS不要
CONFIGS: 0 # Configs不要
PLUGINS: 0 # プラグイン不要
# Swarm関連は全て不要
SWARM: 0
NODES: 0
TASKS: 0
LOG_LEVEL: warning # default infoだと結構うるさい
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- default
networks:
default:
traefik-network:
external: true
TinyAuthの感想
- 良いところ
- Traefikのミドルウェアとして簡単に導入できる
- PocketIDなどのOIDCプロバイダーと簡単に連携できる
- 保護したいサービスに対して認証を追加するのが簡単
- 柔軟性が高い
- 背景画像の変更や、タイトルの変更が可能
- 複数のOIDCプロバイダーの追加や、ユーザーパスワード認証も可能
- 不満・使いこなせていないところ
- 特になし
以上でTinyAuthの紹介を終わり!
認証をかけたいWebサービスや、認証はあるけど任意なものなどに対して、共通の認証を追加するのにとても便利です。