Files
formeleon/templates/index.html
T
br 5fff17531d
Formeleon Deployment Pipeline / Deploy to Dev Environment (push) Successful in 1m1s
Formeleon Deployment Pipeline / Deploy to Production Environment (push) Skipped
i18 drin
mail drin
fehlende routen drin
prod-reife erreicht.
TODOS:

Deine aktuellen offenen TODOs
1. Rate-Limiting (Spam-Schutz VOR dem reCAPTCHA)
Das reCAPTCHA hält zwar Bots ab, aber wenn jemand böswillig ein Script schreibt, das 1.000 POST-Requests pro Sekunde an /api/v1/submissions sendet, muss dein Backend jedes Mal Google kontaktieren und die Datenbank befragen. Das frisst Server-Ressourcen.

Todo: Einbinden von Flask-Limiter und Absichern der API-Route (z.B. max. 10 Submissions pro Minute pro IP-Adresse oder Tenant).
2. Billing & Feature-Enforcement (Limits pro Tenant durchsetzen)
Die Mandanten-Architektur und das config-Feld im JSON existieren bereits. Aber wir erzwingen diese Limits aktuell nicht im Backend.

Todo: Im Dashboard (templates/admin/tenants/view.html) UI-Controls einbauen, um Feature-Flags für einen Tenant festzulegen:
max_forms (z.B. 1 für Free-User, 10 für Pro-User).
allow_instant_mail (Dürfen E-Mails an den Tenant gesendet werden?).
allow_autoresponder (Darf der Autoresponder für Endkunden genutzt werden?).
Todo: Diese Limits hart im Backend (beim Erstellen von Forms und beim Mailversand) kontrollieren. (Der Mailer prüft das zwar schon halbwegs, das UI zum Pflegen fehlt aber noch komplett).
3. E-Mail Templates aufwerten (HTML statt Plain-Text)
Bisher versendet der Service E-Mails als reinen Text (plain). Für eine professionelle SaaS-Lösung sollten diese Mails ansprechend aussehen.

Todo: Im services/mailer.py den MIMEMultipart so erweitern, dass er saubere HTML-Mails aus einem Jinja2-Template (templates/emails/...) generiert, inklusive Branding/Logo deines Services.
4. Frontend-Snippet "Graceful Degradation"
Das embed.js arbeitet aktuell sehr gut. Aber was ist, wenn das Formeleon-Backend mal für 5 Minuten down ist?

Todo: Einen sauberen Timeout im fetch einbauen und dem Endkunden auf der Webseite eine schöne, fallback HTML-Meldung anzeigen ("Entschuldigung, das Formular ist momentan nicht erreichbar"), anstatt dass sich das Script lautlos in der Console mit einem CORS/Network-Error verabschiedet.
5. CI/CD Pipeline (Deployment)
Wenn der Code fertig ist, willst du ihn sicher nicht immer händisch per git pull auf deinen Produktionsserver schieben und dort docker compose up tippen.

Todo: Eine simple Pipeline (Github Actions / Gitea Actions) anlegen, die den Code testet und automatisch auf dem Zielserver ausrollt.
2026-09-29 05:16:01 +02:00

127 lines
4.4 KiB
HTML

{# ==============================================================================
Formeleon - Multi-tenant Form Generator
Author: Björn Runden <br@runden.net>
Template: index.html
Description: Simple welcome page for root URL.
============================================================================== #}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{_('Formeleon - Form Generator')}}</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css">
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.welcome-container {
max-width: 800px;
margin: 0 auto;
padding: 4rem 2rem;
}
.welcome-card {
background: white;
border-radius: 1rem;
box-shadow: 0 20px 40px rgba(0,0,0,0.1);
padding: 3rem;
}
.welcome-card h1 {
color: #333;
font-weight: 700;
margin-bottom: 1rem;
}
.welcome-card p {
color: #666;
font-size: 1.1rem;
line-height: 1.6;
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border: none;
font-weight: 600;
}
.feature-list {
list-style: none;
padding: 0;
}
.feature-list li {
padding: 0.5rem 0;
display: flex;
align-items: center;
gap: 0.75rem;
}
.feature-list i {
color: #667eea;
font-size: 1.25rem;
}
</style>
</head>
<body>
<div class="welcome-container">
<div class="welcome-card text-center">
<div class="mb-4">
<i class="bi bi-file-earmark-text-fill" style="font-size: 4rem; color: #667eea;"></i>
</div>
<h1>Welcome to Formeleon</h1>
<p class="lead">Multi-tenant Form Generator with Bot Protection</p>
<hr class="my-4">
<div class="row mb-4">
<div class="col-md-6 mb-3">
<ul class="feature-list text-start">
<li><i class="bi bi-check-circle-fill"></i> Dynamic Form Generation</li>
<li><i class="bi bi-check-circle-fill"></i> Multi-Tenant Support</li>
<li><i class="bi bi-check-circle-fill"></i> reCAPTCHA v3 Protection</li>
</ul>
</div>
<div class="col-md-6 mb-3">
<ul class="feature-list text-start">
<li><i class="bi bi-check-circle-fill"></i> Zitadel OIDC Integration</li>
<li><i class="bi bi-check-circle-fill"></i> RESTful API</li>
<li><i class="bi bi-check-circle-fill"></i> Easy Embedding</li>
</ul>
</div>
</div>
<hr class="my-4">
<div class="d-grid gap-3">
<a href="/admin/" class="btn btn-primary btn-lg">
<i class="bi bi-speedometer2"></i> Dashboard
</a>
<a href="/admin/forms/" class="btn btn-outline-secondary btn-lg">
<i class="bi bi-file-earmark-text"></i> Manage Forms
</a>
<a href="/api/v1/status" class="btn btn-outline-info btn-lg">
<i class="bi bi-check-circle"></i> API Status
</a>
</div>
{% if dev_mode %}
<div class="mt-4 p-3 bg-warning bg-opacity-10 rounded">
<i class="bi bi-bug-fill text-warning"></i>
<strong>Development Mode</strong> is enabled
</div>
{% endif %}
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>