Description
Tinyauth est un reverse proxy d'authentification minimaliste pensé pour protéger des applications self-hosted qui n'exposent pas de mécanisme d'auth robuste. Concrètement, on le place devant une app (Grafana, Uptime Kuma, Homer, etc.) et il intercepte les requêtes pour exiger une connexion.
Fonctionnalités clés :
- ✅ Support OAuth2 / OIDC : Google, GitHub, GitLab, Generic OIDC
- ✅ Username/password classique avec hash bcrypt
- ✅ Multi-utilisateurs avec gestion des groupes
- ✅ Cookie de session sécurisé (HttpOnly, SameSite, expiration)
- ✅ Docker labels discovery : détecte automatiquement les apps à protéger
- ✅ Léger : binaire Go unique, consommation RAM <50 Mo
- ✅ Interface web pour la configuration
- ✅ 2FA TOTP (optionnel)
Public cible : utilisateurs qui exposent leur homelab via Traefik/NPM et veulent protéger rapidement plusieurs services sans configurer Authentik/Authelia à chaque fois. Tinyauth fait le strict minimum mais le fait bien.
Différenciation : face à [[app-authelia]] (plus complet mais plus lourd) ou [[app-authentik]] (Identity Provider complet), Tinyauth joue la carte du simple reverse proxy auth qui se branche en 5 minutes. Idéal pour les petites installations.
Installation
Docker Compose (standalone)
# docker-compose.yml
services:
tinyauth:
image: ghcr.io/steveiliop52/tinyauth:latest
container_name: tinyauth
restart: unless-stopped
environment:
- SECRET=change-me-long-random-string
- USERS_FILE=/app/users.json
- TINYAUTH_DOMAIN=https://auth.example.com
volumes:
- ./users.json:/app/users.json:ro
- tinyauth_data:/app/data
networks:
- proxy
app-to-protect:
image: my-app:latest
networks:
- proxy
labels:
- "tinyauth.enable=true"
- "tinyauth.users=admin,user1"
networks:
proxy:
external: true
volumes:
tinyauth_data:
Intégration avec Traefik
Tinyauth s'utilise typiquement comme middleware Traefik via les labels Docker :
services:
grafana:
image: grafana/grafana
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.grafana.rule=Host(`grafana.example.com`)"
- "traefik.http.routers.grafana.entrypoints=websecure"
- "traefik.http.routers.grafana.tls.certresolver=letsencrypt"
- "traefik.http.services.grafana.loadbalancer.server.port=3000"
- "tinyauth.enable=true" # protégé par tinyauth
- "tinyauth.users=admin,user1" # qui peut y accéder
Configuration
- Définir le secret :
openssl rand -hex 32→ mettre dansSECRET - Créer
users.jsonavec mots de passe bcrypt :{ "users": { "admin": "$2a$10$...", "user1": "$2a$10$..." } } - Configurer l'OAuth (optionnel) : variables
GOOGLE_OAUTH_CLIENT_ID,GITHUB_OAUTH_CLIENT_ID, etc. - Pointer DNS
auth.example.comvers le reverse proxy (Traefik/NPM) - Ajouter les labels Docker sur les services à protéger
- Premier login : créer le compte admin, tester l'accès à une app protégée
Alternatives
Open Source
| Alternative | Différence | Étoiles |
|---|---|---|
| [[app-authelia]] | Plus complet (2FA, WebAuthn, ACL fines), plus lourd | 25k |
| [[app-authentik]] | Identity Provider complet, SSO, providers multiples | 16k |
| [[app-oauth2-proxy]] | Spécifiquement proxy OAuth, pas d'UI native | 14k |
| [[app-cloudflared]] | Tunnel Cloudflare + Access pour auth | 14k |
Propriétaires
| Service | Modèle | Différence |
|---|---|---|
| Cloudflare Access | SaaS (gratuit jusqu'à 50 users) | Tinyauth en local vs Cloudflare-managed |
| Auth0 | Freemium | Identity Provider hébergé, pas reverse proxy |
| Okta | Payant | IdP enterprise, complexe pour homelab |
Sécurité
- ✅ Secret fort obligatoire (32+ bytes random)
- ✅ Hash bcrypt pour les passwords (jamais en clair)
- ✅ Cookies HttpOnly + Secure + SameSite=Strict
- ✅ Rate limiting sur les endpoints d'auth
- ⚠️ Single point of failure : si Tinyauth tombe, toutes les apps protégées sont inaccessibles
- ⚠️ Pas d'audit log natif : brancher sur [[app-loki]] ou [[app-glances]] pour le monitoring
- ⚠️ OIDC discovery : bien configurer
TINYAUTH_DOMAINpour les callbacks
