Initial vault setup
This commit is contained in:
@@ -0,0 +1,216 @@
|
||||
---
|
||||
title: Mantræ
|
||||
created: 2026-06-06
|
||||
updated: 2026-06-06
|
||||
type: app
|
||||
tags: [catalogue, reverse-proxy, traefik, ui, dns, go, svelte]
|
||||
confidence: medium
|
||||
contested: false
|
||||
sources: [https://selfh.st/apps/?tag=Reverse+Proxy, https://github.com/MizuchiLabs/mantrae]
|
||||
---
|
||||
|
||||
# 🚦 Mantræ
|
||||
|
||||
> **Web UI pour gérer la configuration dynamique de Traefik (routers, services, middlewares) avec intégration DNS automatique Cloudflare / PowerDNS / Technitium / Pi-hole**. Inspiré de Nginx Proxy Manager et Pangolin, 100 % Traefik-native.
|
||||
|
||||
## 📋 Informations Générales
|
||||
|
||||
| Champ | Valeur |
|
||||
| :--- | :--- |
|
||||
| **Site web** | [mizuchilabs.github.io/mantrae](https://mizuchilabs.github.io/mantrae/) |
|
||||
| **GitHub** | [MizuchiLabs/mantrae](https://github.com/MizuchiLabs/mantrae) |
|
||||
| **License** | MIT |
|
||||
| **Langage** | TypeScript (41.9 %), Svelte (34.3 %), Go (20.7 %) |
|
||||
| **Étoiles GitHub** | 491 ⭐ |
|
||||
| **Dernière MAJ** | 2026-04-14 (v0.8.9) |
|
||||
| **Catégorie** | [[cat-reverse-proxy|Reverse Proxy]], UI, Traefik, DNS |
|
||||
|
||||
## 📝 Description
|
||||
|
||||
**Mantræ** (par MizuchiLabs, mainteneur @d34dscene) est un **gestionnaire web de la configuration dynamique Traefik** : il présente une UI propre (Svelte) pour créer **routers, services, middlewares** sans éditer de YAML, et **intègre la gestion DNS automatique** avec 4 providers (Cloudflare, PowerDNS, Technitium, Pi-hole) pour pousser les records en même temps que les routes.
|
||||
|
||||
⚠️ **Note importante** : Mantræ n'est **pas** un dashboard Traefik (il ne monitore pas l'état des routes). C'est un **gestionnaire de configuration** : Traefik se connecte à Mantræ pour fetcher sa dynamic config. La nuance est importante.
|
||||
|
||||
⚠️ **Note de roadmap** : depuis 2025, le développement a été **transféré** vers [Tether](https://github.com/MizuchiLabs/tether) (même équipe). Mantræ reste maintenu pour les correctifs mais les nouvelles features vont sur Tether.
|
||||
|
||||
**Caractéristiques principales** :
|
||||
|
||||
- ✅ **Web UI Svelte** moderne, dark/light mode, ergonomique
|
||||
- ✅ **Gestion routers** : règles Host/Path/Headers, entrypoints, TLS
|
||||
- ✅ **Gestion middlewares** : rate-limit, basicauth, headers, redirect, stripPrefix, etc.
|
||||
- ✅ **Gestion services** : load balancer, weighted, mirroring
|
||||
- ✅ **DNS auto** : Cloudflare, PowerDNS, Technitium, Pi-hole (push du record A/CNAME quand un nouveau router est créé)
|
||||
- ✅ **Agent `mantraed`** : déploie un agent sur chaque host Docker qui **synchronise les labels** des containers vers Mantræ (alternative aux labels Docker classiques)
|
||||
- ✅ **Authentification intégrée** : user/password + sessions
|
||||
- ✅ **API REST** documentée (OpenAPI)
|
||||
- ✅ **Binaire Go standalone** : installation simple, pas de runtime Node requis en production
|
||||
|
||||
**Public cible** : utilisateurs de Traefik qui veulent **une UI web dédiée** pour gérer leur config **sans dépendre de Docker labels** exclusivement. Particulièrement adapté pour des setups **non-Docker** (Traefik en binaire natif sur VM) où l'auto-discovery Docker n'est pas utilisable.
|
||||
|
||||
## 🚀 Installation
|
||||
|
||||
### Option 1 : Docker Compose (recommandé)
|
||||
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
version: '3.8'
|
||||
services:
|
||||
mantrae:
|
||||
image: ghcr.io/mizuchilabs/mantrae:latest
|
||||
container_name: mantrae
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8080:8080"
|
||||
volumes:
|
||||
- ./data:/data # base SQLite + config
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
networks:
|
||||
- proxy
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
||||
```
|
||||
|
||||
### Variante Traefik (exposer Mantræ derrière Traefik)
|
||||
|
||||
```yaml
|
||||
# docker-compose.yml (variante)
|
||||
version: '3.8'
|
||||
services:
|
||||
mantrae:
|
||||
image: ghcr.io/mizuchilabs/mantrae:latest
|
||||
container_name: mantrae
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./data:/data
|
||||
environment:
|
||||
- TZ=Europe/Paris
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.docker.network=proxy"
|
||||
- "traefik.http.routers.mantrae.rule=Host(`traefik.example.com`)"
|
||||
- "traefik.http.routers.mantrae.entrypoints=websecure"
|
||||
- "traefik.http.routers.mantrae.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.services.mantrae.loadbalancer.server.port=8080"
|
||||
- "traefik.http.routers.mantrae.middlewares=auth@docker"
|
||||
networks:
|
||||
- proxy
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
external: true
|
||||
```
|
||||
|
||||
### Option 2 : Binaire natif (install script)
|
||||
|
||||
```bash
|
||||
curl -fsSL https://raw.githubusercontent.com/mizuchilabs/mantrae/main/install.sh | sh
|
||||
mantrae --version
|
||||
mantrae # démarre le serveur
|
||||
```
|
||||
|
||||
### Configuration Traefik (statique) pour consommer Mantræ
|
||||
|
||||
```yaml
|
||||
# traefik.yml (statique)
|
||||
providers:
|
||||
http:
|
||||
endpoint: "http://mantrae:8080/api/v1/traefik-config"
|
||||
pollInterval: 10s
|
||||
```
|
||||
|
||||
### Variante : agent `mantraed` pour la découverte Docker
|
||||
|
||||
```yaml
|
||||
# Sur chaque host avec Docker
|
||||
version: '3.8'
|
||||
services:
|
||||
mantraed:
|
||||
image: ghcr.io/mizuchilabs/mantraed:latest
|
||||
container_name: mantraed
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
environment:
|
||||
- MANTRAE_URL=https://traefik.example.com
|
||||
- MANTRAE_API_KEY=your-api-key
|
||||
```
|
||||
|
||||
## ⚙️ Configuration Initiale
|
||||
|
||||
1. **Lancer Mantræ** et accéder à `http://YOUR_HOST:8080`.
|
||||
2. **Créer le compte admin** au premier démarrage.
|
||||
3. **Configurer un provider DNS** (optionnel mais typique) : Cloudflare API token ou PowerDNS API.
|
||||
4. **Configurer Traefik** pour pointer sur `http://mantrae:8080/api/v1/traefik-config`.
|
||||
5. **Créer un router** depuis l'UI : Host, port backend, middlewares, DNS auto (si configuré).
|
||||
6. **Créer un service** (load balancer si multi-backend) ou laisser Mantræ le déduire du router.
|
||||
7. **Attacher des middlewares** (rate-limit, headers, etc.).
|
||||
8. **Tester** : un curl sur le host configuré doit renvoyer le service backend.
|
||||
|
||||
> 💡 **Reset password oublié** : `mantrae reset --password newpassword`
|
||||
|
||||
## 🔄 Alternatives
|
||||
|
||||
### Open Source
|
||||
|
||||
- [[app-traefik]] — UI native de Traefik (lecture seule)
|
||||
- [[app-nginx-proxy-manager]] — concurrent direct sur l'idée (UI complète Nginx)
|
||||
- [[app-pangolin]] — UI orientée tunnels/ressources, intègre Traefik
|
||||
- [[app-middleware-manager]] — concurrent direct (focus middlewares)
|
||||
- **GloboDNS** (DNS) — pas un proxy manager
|
||||
- **Portainer** (Docker) — orienté containers, pas proxy
|
||||
|
||||
### Propriétaires (ce que Mantræ remplace)
|
||||
|
||||
- **Cloudflare Workers + Dashboard**
|
||||
- **AWS API Gateway** (en partie)
|
||||
- **Cloudflare Access** (UI auth)
|
||||
- **Kong Manager EE** (édition enterprise)
|
||||
- **Traefik Enterprise** (abandonné)
|
||||
|
||||
### Comparaison rapide
|
||||
|
||||
| Critère | Mantræ | Middleware Manager | Nginx Proxy Manager | Pangolin |
|
||||
| :--- | :--- | :--- | :--- | :--- |
|
||||
| Reverse proxy | Traefik | Traefik | Nginx | Traefik (managé) |
|
||||
| Routers/Services UI | ✅ | Partiel | ✅ (Hosts) | ✅ (Resources) |
|
||||
| Middlewares UI | ✅ | ✅ (full) | Partiel | Limité |
|
||||
| DNS auto | ✅ (4 providers) | ❌ | ❌ | Partiel |
|
||||
| Agent Docker | ✅ (mantraed) | ❌ | ❌ | ❌ |
|
||||
| Licence | MIT | MIT | MIT | Custom |
|
||||
| Stabilité | ⚠️ (v0.8, dev → Tether) | ✅ (v4.5) | ✅ (v2.x) | ✅ |
|
||||
|
||||
**Verdict** : **Mantræ** pour qui veut **DNS auto + UI Traefik native + agent Docker** dans un seul outil. **Middleware Manager** pour qui veut la **gestion de middlewares la plus complète**. **Nginx Proxy Manager** pour la **stabilité long terme** sur Nginx. **Pangolin** pour la couche **tunnels + auth** au-dessus.
|
||||
|
||||
> ⚠️ **À surveiller** : la transition vers **Tether** est en cours. Pour un nouveau projet, vérifier l'état de Tether vs Mantræ avant de partir.
|
||||
|
||||
## 🔐 Sécurité
|
||||
|
||||
- **Auth UI** : user/password + sessions, obligatoire
|
||||
- **API key `mantraed`** : rotation possible depuis l'UI Mantræ
|
||||
- **Bind sur localhost** ou derrière reverse proxy HTTPS : ne pas exposer le port 8080 directement
|
||||
- **DNS provider tokens** : scope minimum (Zone:DNS:Edit par exemple sur Cloudflare, pas Global API Key)
|
||||
- **Permissions `./data`** : `chmod 700`, backups réguliers (DB SQLite)
|
||||
- ⚠️ **Mantræ écrit la config dynamique** : un attaquant qui compromet l'UI peut rediriger tout le trafic → **2FA recommandé** + restriction IP sur l'UI
|
||||
- **HTTPS obligatoire** : l'UI contient des secrets (API keys DNS)
|
||||
- **Agent `mantraed` en `ro` sur le Docker socket** : limiter la surface d'attaque
|
||||
|
||||
## 📚 Ressources
|
||||
|
||||
- [Documentation Mantræ](https://mizuchilabs.github.io/mantrae/)
|
||||
- [GitHub MizuchiLabs/mantrae](https://github.com/MizuchiLabs/mantrae)
|
||||
- [Discussion : transition vers Tether](https://github.com/MizuchiLabs/mantrae/discussions/253)
|
||||
- [Repo Tether (successeur)](https://github.com/MizuchiLabs/tether)
|
||||
- [Reddit r/selfhosted: Traefik UI](https://www.reddit.com/r/selfhosted/comments/1jlaz0t/discovered_traefik_http_provider_gui/)
|
||||
- [Sponsor @d34dscene sur Ko-fi](https://ko-fi.com/d34dscene)
|
||||
|
||||
## Pages Liées
|
||||
|
||||
- [[cat-reverse-proxy]] — Catégorie Reverse Proxy
|
||||
- [[app-traefik]] — Le reverse proxy sous-jacent
|
||||
- [[app-middleware-manager]] — Concurrent direct (HHF Technology)
|
||||
- [[app-pangolin]] — Voisin (tunnels + auth)
|
||||
- [[comparatif-reverse-proxy]] — Comparaison détaillée
|
||||
- [[dns-automation]] — Concepts DNS-as-code
|
||||
Reference in New Issue
Block a user