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.
203 lines
6.5 KiB
Bash
203 lines
6.5 KiB
Bash
# =============================================================================
|
|
# Formeleon - Multi-tenant Form Generator
|
|
# Author: Björn Runden <br@runden.net>
|
|
# File: .env.example
|
|
# Description: Environment configuration template. Copy to .env and customize.
|
|
# =============================================================================
|
|
|
|
# =============================================================================
|
|
# APPLICATION SETTINGS
|
|
# =============================================================================
|
|
|
|
# Flask Environment: development, production, testing
|
|
FLASK_ENV=development
|
|
|
|
# Secret Key for Flask session management
|
|
# Generate with: python -c "import secrets; print(secrets.token_hex(32))"
|
|
SECRET_KEY=your-secret-key-change-in-production
|
|
|
|
# Enable/Disable Debug Mode
|
|
FLASK_DEBUG=true
|
|
|
|
# Development Mode - enables fake auth and mocking
|
|
DEV_MODE=true
|
|
|
|
# Mock Authentication Mode
|
|
# When MOCK_AUTH=true AND DEV_MODE=true, uses local mock users instead of Zitadel OIDC
|
|
# Useful for local development without external dependencies
|
|
MOCK_AUTH=false
|
|
|
|
# Application name
|
|
APP_NAME=formeleon
|
|
|
|
# Application port (default: 5000)
|
|
PORT=5000
|
|
|
|
# =============================================================================
|
|
# MOCK USER SETTINGS (used when MOCK_AUTH=true and DEV_MODE=true)
|
|
# =============================================================================
|
|
|
|
# Mock user credentials (only used in mock auth mode)
|
|
MOCK_USER_ID=mock_user_001
|
|
MOCK_USER_ROLE=admin
|
|
MOCK_USER_NAME=Mock Admin
|
|
MOCK_USER_EMAIL=mock@formeleon.local
|
|
MOCK_TENANT_ID=mock_tenant_001
|
|
|
|
# =============================================================================
|
|
# DEVELOPMENT USER SETTINGS (used when DEV_MODE=true but MOCK_AUTH=false)
|
|
# =============================================================================
|
|
|
|
# Dev Mode User Role (admin, tenant_admin, user, viewer)
|
|
DEV_USER_ROLE=admin
|
|
|
|
# Dev Mode Tenant ID
|
|
DEV_TENANT_ID=tenant_dev_123
|
|
|
|
# Dev Mode User Name
|
|
DEV_USER_NAME="Dev Admin"
|
|
|
|
# Dev Mode User Email
|
|
DEV_USER_EMAIL=dev@formeleon.local
|
|
# =============================================================================
|
|
# DATABASE SETTINGS
|
|
# =============================================================================
|
|
|
|
# SQLite (default for development)
|
|
# SQLALCHEMY_DATABASE_URI=sqlite:///instance/formeleon.db
|
|
|
|
# PostgreSQL
|
|
# SQLALCHEMY_DATABASE_URI=postgresql://username:password@localhost/formeleon
|
|
|
|
# MySQL
|
|
# SQLALCHEMY_DATABASE_URI=mysql+pymysql://username:password@localhost/formeleon
|
|
|
|
# Enable SQL query logging
|
|
SQLALCHEMY_ECHO=false
|
|
|
|
# =============================================================================
|
|
# ZITADEL OIDC SETTINGS
|
|
# =============================================================================
|
|
|
|
# Zitadel Issuer URL (OIDC Provider)
|
|
# Example: https://your-zitadel-instance.zitadel.cloud
|
|
ZITADEL_ISSUER=
|
|
|
|
# OIDC Client ID from Zitadel
|
|
ZITADEL_CLIENT_ID=
|
|
|
|
# OIDC Client Secret from Zitadel
|
|
ZITADEL_CLIENT_SECRET=
|
|
|
|
# Redirect URI for OIDC callback
|
|
# Default: http://localhost:5000/auth/callback
|
|
ZITADEL_REDIRECT_URI=http://localhost:5000/auth/callback
|
|
|
|
# OIDC Scopes (comma-separated)
|
|
# ZITADEL_SCOPES=openid,profile,email
|
|
|
|
# =============================================================================
|
|
# RECAPTCHA SETTINGS
|
|
# =============================================================================
|
|
|
|
# Google reCAPTCHA v3 Site Key (for client-side)
|
|
RECAPTCHA_SITE_KEY=
|
|
|
|
# Google reCAPTCHA v3 Secret Key (for server-side validation)
|
|
RECAPTCHA_SECRET_KEY=
|
|
|
|
# Minimum score threshold (0.0 - 1.0, default: 0.5)
|
|
RECAPTCHA_THRESHOLD=0.5
|
|
|
|
# Mock score for development mode (default: 0.9)
|
|
MOCK_RECAPTCHA_SCORE=0.9
|
|
|
|
# =============================================================================
|
|
# CORS SETTINGS
|
|
# =============================================================================
|
|
|
|
# Enable CORS (default: true)
|
|
ENABLE_CORS=true
|
|
|
|
# Allowed Origins (comma-separated, default: *)
|
|
ALLOWED_ORIGINS=*
|
|
|
|
# =============================================================================
|
|
# SESSION SETTINGS
|
|
# =============================================================================
|
|
|
|
# Session Cookie Secure (HTTPS only, default: false for development)
|
|
SESSION_COOKIE_SECURE=false
|
|
|
|
# Session Cookie SameSite (Lax, Strict, None)
|
|
SESSION_COOKIE_SAMESITE=Lax
|
|
|
|
# Session lifetime in seconds (default: 3600 = 1 hour)
|
|
PERMANENT_SESSION_LIFETIME=3600
|
|
|
|
# =============================================================================
|
|
# FILE UPLOAD SETTINGS
|
|
# =============================================================================
|
|
|
|
# Maximum upload size in bytes (default: 16MB = 16 * 1024 * 1024)
|
|
MAX_CONTENT_LENGTH=16777216
|
|
|
|
# Upload folder
|
|
UPLOAD_FOLDER=/tmp/formeleon_uploads
|
|
|
|
# Allowed file extensions (comma-separated)
|
|
# ALLOWED_EXTENSIONS=png,jpg,jpeg,gif,pdf,txt
|
|
|
|
# =============================================================================
|
|
# EMAIL SETTINGS (for notifications)
|
|
# =============================================================================
|
|
|
|
# SMTP Server
|
|
# SMTP_SERVER=localhost
|
|
# SMTP_PORT=587
|
|
# SMTP_USERNAME=
|
|
# SMTP_PASSWORD=
|
|
# SMTP_USE_TLS=true
|
|
# EMAIL_FROM=formeleon@yourdomain.com
|
|
|
|
# =============================================================================
|
|
# LOGGING SETTINGS
|
|
# =============================================================================
|
|
|
|
# Log Level: DEBUG, INFO, WARNING, ERROR, CRITICAL
|
|
# LOG_LEVEL=INFO
|
|
|
|
# =============================================================================
|
|
# PRODUCTION SETTINGS
|
|
# =============================================================================
|
|
|
|
# Default page size for paginated responses
|
|
DEFAULT_PAGE_SIZE=20
|
|
|
|
# Maximum page size for paginated responses
|
|
MAX_PAGE_SIZE=100
|
|
|
|
# =============================================================================
|
|
# NOTES FOR PRODUCTION
|
|
# =============================================================================
|
|
|
|
# For production deployment:
|
|
# 1. Set FLASK_ENV=production
|
|
# 2. Set FLASK_DEBUG=false
|
|
# 3. Set DEV_MODE=false
|
|
# 4. Set MOCK_AUTH=false
|
|
# 5. Set SESSION_COOKIE_SECURE=true
|
|
# 6. Set SESSION_COOKIE_SAMESITE=Strict
|
|
# 7. Configure proper ZITADEL_* settings
|
|
# 8. Configure proper RECAPTCHA_* settings
|
|
# 9. Use a production-ready database (PostgreSQL, MySQL)
|
|
# 10. Generate a strong SECRET_KEY
|
|
# 11. Restrict ALLOWED_ORIGINS to your specific domains
|
|
# 12. Set up proper HTTPS/TLS
|
|
|
|
# For local development without external services:
|
|
# 1. Set DEV_MODE=true
|
|
# 2. Set MOCK_AUTH=true (optional, for pure local mocking)
|
|
# 3. Optionally configure ZITADEL_* settings if you have a local Zitadel instance
|
|
COMPOSE_PROFILES=dev
|