Formbricks Selbst-Hosting
CADENSA verwendet Formbricks für In-App-NPS-Umfragen und den Feedback-Button. Statt der Formbricks-Cloud betreiben wir eine selbst gehostete Instanz auf unserer EU-Infrastruktur — kein US-Datentransfer, vollständige DSGVO-Konformität.
Self-hosted URL: https://surveys.cadensa.io (Hetzner, Deutschland)
Warum selbst hosten?
| Formbricks Cloud | Selbst gehostet (surveys.cadensa.io) | |
|---|---|---|
| Datenspeicherung | Formbricks-Server (US/EU gemischt) | Hetzner Deutschland (nur EU) |
| US-Datentransfer | Möglich | Keiner |
| DSGVO | DPA erforderlich | Kein Drittanbieter-DPA nötig |
| Consent-Gate | Erforderlich | Erforderlich (Analytics-Kategorie) |
Architektur
cadensa-frontend / cadensa-landing
└─ @formbricks/js SDK
└─ VITE_FORMBRICKS_APP_URL / NEXT_PUBLIC_FORMBRICKS_APP_URL
└─ https://surveys.cadensa.io
└─ Formbricks-App (Kubernetes: formbricks-Namespace)
└─ PostgreSQL 15 (StatefulSet: formbricks-postgres)
Die Formbricks-App läuft in einem eigenen Kubernetes-Namespace (formbricks) mit einem dedizierten PostgreSQL-StatefulSet. Sie ist über nginx Ingress mit einem Let's Encrypt TLS-Zertifikat erreichbar.
Kubernetes-Deployment
Alle Manifeste befinden sich in cadensa-k8s/k8s/formbricks/:
| Datei | Beschreibung |
|---|---|
namespace.yaml | formbricks-Namespace |
postgres-statefulset.yaml | PostgreSQL 15, 10 Gi PVC |
formbricks-configmap.yaml | Nicht-sensible Konfiguration (URL, SMTP-Host, usw.) |
formbricks-sealed-secret.yaml | Sealed-Secret-Vorlage (mit echten Werten ersetzen) |
formbricks-deployment.yaml | Formbricks-App + Service |
formbricks-ingress.yaml | nginx Ingress mit TLS (surveys.cadensa.io) |
Erstmalige Bereitstellung
# 1. Geheimnisse generieren
NEXTAUTH_SECRET=$(openssl rand -base64 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
POSTGRES_PASSWORD=$(openssl rand -base64 24)
# 2. Sealed Secret erstellen
kubectl create secret generic formbricks-secrets \
--from-literal=DATABASE_URL="postgresql://formbricks:${POSTGRES_PASSWORD}@formbricks-postgres:5432/formbricks" \
--from-literal=NEXTAUTH_SECRET="${NEXTAUTH_SECRET}" \
--from-literal=ENCRYPTION_KEY="${ENCRYPTION_KEY}" \
--from-literal=SMTP_PASSWORD="<smtp-passwort>" \
-n formbricks --dry-run=client -o yaml \
| kubeseal --controller-namespace kube-system -o yaml \
> cadensa-k8s/k8s/formbricks/formbricks-sealed-secret.yaml
# 3. Manifeste anwenden
kubectl apply -f cadensa-k8s/k8s/formbricks/namespace.yaml
kubectl apply -f cadensa-k8s/k8s/formbricks/postgres-statefulset.yaml
kubectl apply -f cadensa-k8s/k8s/formbricks/formbricks-configmap.yaml
kubectl apply -f cadensa-k8s/k8s/formbricks/formbricks-sealed-secret.yaml
kubectl apply -f cadensa-k8s/k8s/formbricks/formbricks-deployment.yaml
kubectl apply -f cadensa-k8s/k8s/formbricks/formbricks-ingress.yaml
NEXTAUTH_SECRET und ENCRYPTION_KEY dürfen nach der ersten Bereitstellung nie geändert werden — alle Umfragedaten sind damit verschlüsselt. Sicher aufbewahren!
Aktualisierung
# formbricks-deployment.yaml bearbeiten — Image-Tag aktualisieren
# image: formbricks/formbricks:v2.x.y
kubectl apply -f cadensa-k8s/k8s/formbricks/formbricks-deployment.yaml
Docker Compose (lokal / Staging)
Für lokale Tests oder Staging-Umgebungen:
# 1. Env-Datei kopieren und ausfüllen
cp cadensa-k8s/.env.formbricks.example cadensa-k8s/.env.formbricks
# .env.formbricks bearbeiten — alle CHANGE_ME-Werte ersetzen
# 2. Starten
docker compose -f cadensa-k8s/docker-compose.formbricks.yml \
--env-file cadensa-k8s/.env.formbricks up -d
# Formbricks-UI: http://localhost:3001
Anwendungskonfiguration
Nach der ersten Bereitstellung https://surveys.cadensa.io öffnen und den Setup-Assistenten durchlaufen:
- Admin-Konto erstellen
- Environment ID notieren: Settings → Developer → Environment
- Umgebungsvariablen in beiden Apps aktualisieren:
cadensa-frontend (.env):
VITE_FORMBRICKS_ENV_ID=<environment-id-from-formbricks>
VITE_FORMBRICKS_APP_URL=https://surveys.cadensa.io
cadensa-landing (.env.local):
NEXT_PUBLIC_FORMBRICKS_ENV_ID=<environment-id-from-formbricks>
NEXT_PUBLIC_FORMBRICKS_APP_URL=https://surveys.cadensa.io
Telemetrie
In der ConfigMap ist TELEMETRY_DISABLED=1 gesetzt — Formbricks sendet keine Nutzungsdaten an die Formbricks-Cloud.
Daten & DSGVO
- Datenspeicherung: Hetzner, Deutschland (EU)
- Kein US-Datentransfer (im Gegensatz zur Formbricks Cloud)
- Umfrageantworten in PostgreSQL gespeichert — im Ruhezustand verschlüsselt (Hetzner-Volume-Verschlüsselung)
- Betroffenenanfragen: Formbricks Admin-UI → People → Delete person
- Aufbewahrung: In den Formbricks-Einstellungen konfigurierbar
Verwandte Dokumentation: Daten & Sicherheits-FAQ