Go to file
XPS\Micro 20a0f3d6af feat: Implement passwordless authentication with Magic Links
Major changes:
- Remove username and password_hash from User model
- Add MagicLinkToken table for one-time-use email authentication
- Implement Magic Link email sending with 15-minute expiration
- Update all auth endpoints (/login, /signup) to use email only
- Create verify-signup and verify-login pages for token verification
- Container URLs now use slug instead of username (e.g., /u-a3f9c2d1)
- Add rate limiting: max 3 Magic Links per email per hour
- Remove password reset functionality (no passwords to reset)

Backend changes:
- api.py: Complete rewrite of auth routes (magic link based)
- models.py: Remove username/password, add slug and MagicLinkToken
- email_service.py: Add Magic Link generation and email sending
- admin_api.py: Remove password reset, update to use email identifiers
- container_manager.py: Use slug instead of username for routing
- config.py: Add MAGIC_LINK_TOKEN_EXPIRY and MAGIC_LINK_RATE_LIMIT

Frontend changes:
- src/lib/api.ts: Update auth functions and User interface
- src/hooks/use-auth.tsx: Implement verifySignup/verifyLogin
- src/app/login/page.tsx: Email-only login form
- src/app/signup/page.tsx: Email-only signup form
- src/app/verify-signup/page.tsx: NEW - Signup token verification
- src/app/verify-login/page.tsx: NEW - Login token verification
- src/app/dashboard/page.tsx: Display slug instead of username

Infrastructure:
- install.sh: Simplified, no migration needed (db.create_all handles it)
- .env.example: Add MAGIC_LINK_TOKEN_EXPIRY and MAGIC_LINK_RATE_LIMIT
- Add IMPLEMENTATION-GUIDE.md with detailed setup instructions

Security improvements:
- No password storage = no password breaches
- One-time-use tokens prevent replay attacks
- 15-minute token expiration limits attack window
- Rate limiting prevents email flooding

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-01-31 16:19:22 +01:00
docs Update documentation for v0.3.0 (admin features) 2026-01-31 07:06:13 +01:00
frontend feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
user-template Initial project structure with documentation 2026-01-30 18:00:41 +01:00
user-template-next Fix user-template-next: add baseUrl and include lib/utils.ts 2026-01-30 23:28:11 +01:00
.dockerignore Initial project structure with documentation 2026-01-30 18:00:41 +01:00
.env.example feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
.gitignore fix: wrap useSearchParams in Suspense boundary for Next.js 14 compatibility 2026-01-31 10:46:58 +01:00
admin_api.py feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
api.py feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
app.py Add admin features and email verification 2026-01-31 07:01:51 +01:00
auth.py Fix auth.py: redirect to frontend instead of rendering templates 2026-01-30 22:08:36 +01:00
config.py feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
container_manager.py feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
decorators.py Add admin features and email verification 2026-01-31 07:01:51 +01:00
docker-compose.yml fix: change frontend healthcheck from wget to curl for Debian slim compatibility 2026-01-31 13:14:50 +01:00
Dockerfile Initial project structure with documentation 2026-01-30 18:00:41 +01:00
email_service.py feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
IMPLEMENTATION-GUIDE.md feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
install.sh feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
models.py feat: Implement passwordless authentication with Magic Links 2026-01-31 16:19:22 +01:00
README.md Initial project structure with documentation 2026-01-30 18:00:41 +01:00
requirements.txt Initial project structure with documentation 2026-01-30 18:00:41 +01:00

Container Spawner

Ein Flask-basierter Service zur automatischen Bereitstellung von isolierten Docker-Containern pro Benutzer mit Traefik-Integration. Benutzer registrieren sich, erhalten einen eigenen Container und eine personalisierte Subdomain.

Features

  • User-Management: Registrierung und Login mit sicherer Passwort-Speicherung
  • Automatisches Container-Spawning: Jeder User erhaelt einen eigenen Docker-Container
  • Dynamisches Routing: Traefik routet automatisch zu den User-Containern via Subdomain
  • Resource-Management: CPU- und RAM-Limits pro Container
  • Lifecycle-Management: Starten, Stoppen und Neustarten von User-Containern
  • Template-basiert: Neue User-Container aus vorgefertigten Images

Schnellstart

# Installation mit einem Befehl
curl -sSL https://gitea.iotxs.de/RainerWieland/spawner/raw/branch/main/install.sh | bash

Nach der Installation .env anpassen und erneut ausfuehren:

cp .env.example .env
nano .env  # Werte anpassen
bash install.sh

Voraussetzungen

  • Docker 20.10+
  • Docker Compose 2.0+
  • Traefik 2.x oder 3.x (laufend)
  • Bestehendes Docker-Netzwerk fuer Traefik

Dokumentation

Dokument Beschreibung
Installation Installationsanleitung und Updates
Architektur Technische Architektur und Komponenten
Sicherheit Sicherheitsrisiken und Massnahmen
Versionen Changelog und Versionierung
Bekannte Bugs Bekannte Probleme und Workarounds
Best Practices Dos and Don'ts

Projektstruktur

spawner/
├── app.py                 # Flask-Hauptanwendung
├── auth.py                # Authentifizierungs-Blueprint
├── container_manager.py   # Docker-Container-Management
├── models.py              # SQLAlchemy User-Modell
├── config.py              # Konfigurationsklassen
├── templates/             # Jinja2-Templates (Legacy)
├── frontend/              # Next.js Frontend
├── user-template/         # Docker-Template fuer User-Container
└── docs/                  # Dokumentation

Konfiguration

Alle Einstellungen erfolgen ueber Umgebungsvariablen in .env:

Variable Beschreibung
SECRET_KEY Flask Session Secret (generieren!)
BASE_DOMAIN Haupt-Domain (z.B. example.com)
SPAWNER_SUBDOMAIN Subdomain fuer Spawner-UI
TRAEFIK_NETWORK Docker-Netzwerk fuer Traefik
USER_TEMPLATE_IMAGE Docker-Image fuer User-Container

Siehe .env.example fuer alle Optionen.

Lizenz

MIT License - siehe Dokumentation fuer Details.


Version: 0.1.0 Repository: https://gitea.iotxs.de/RainerWieland/spawner