Aller au contenu principal

Auto-hébergement Formbricks

Ce n'est pas la configuration actuelle

Ce guide décrit un déploiement prévu qui ne fonctionne pas aujourd'hui. Cadensa utilise le cloud Formbricks (app.formbricks.com, Formbricks GmbH, Kiel, Allemagne — entité européenne stockant en Allemagne). Aucune instance auto-hébergée n'a jamais été en production, et surveys.cadensa.io n'en sert pas.

La liste faisant foi est la page des sous-traitants. Considérez ce qui suit comme une recette de déploiement, pas comme une description du système en production.

CADENSA utilise Formbricks pour les sondages NPS in-app et le bouton de feedback. Plutôt que le cloud Formbricks, nous hébergeons notre propre instance sur notre infrastructure EU — aucun transfert de données vers les États-Unis, conformité RGPD complète.

URL auto-hébergée : https://surveys.cadensa.io (Hetzner, Allemagne)


Pourquoi auto-héberger ?

Formbricks CloudAuto-hébergé (surveys.cadensa.io)
Emplacement des donnéesServeurs Formbricks (US/EU mixte)Hetzner Allemagne (EU uniquement)
Transfert vers les USPossibleAucun
RGPDDPA requisAucun DPA tiers nécessaire
Porte de consentementRequiseRequise (catégorie analytics)

Architecture

cadensa-frontend / cadensa-landing
└─ @formbricks/js SDK
└─ VITE_FORMBRICKS_APP_URL / NEXT_PUBLIC_FORMBRICKS_APP_URL
└─ https://surveys.cadensa.io
└─ Application Formbricks (Kubernetes : namespace formbricks)
└─ PostgreSQL 15 (StatefulSet : formbricks-postgres)

L'application Formbricks s'exécute dans son propre namespace Kubernetes (formbricks) avec un StatefulSet PostgreSQL dédié. Elle est exposée via nginx Ingress avec un certificat TLS Let's Encrypt.


Déploiement Kubernetes

Tous les manifestes se trouvent dans cadensa-k8s/k8s/formbricks/ :

FichierDescription
namespace.yamlNamespace formbricks
postgres-statefulset.yamlPostgreSQL 15, PVC 10 Gi
formbricks-configmap.yamlConfiguration non sensible (URL, hôte SMTP, etc.)
formbricks-sealed-secret.yamlModèle Sealed Secret (à remplacer par de vraies valeurs)
formbricks-deployment.yamlApplication Formbricks + Service
formbricks-ingress.yamlIngress nginx avec TLS (surveys.cadensa.io)

Premier déploiement

# 1. Générer les secrets
NEXTAUTH_SECRET=$(openssl rand -base64 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
POSTGRES_PASSWORD=$(openssl rand -base64 24)

# 2. Créer le Sealed Secret
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="<mot-de-passe-smtp>" \
-n formbricks --dry-run=client -o yaml \
| kubeseal --controller-namespace kube-system -o yaml \
> cadensa-k8s/k8s/formbricks/formbricks-sealed-secret.yaml

# 3. Appliquer les manifestes
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
Important

NEXTAUTH_SECRET et ENCRYPTION_KEY ne doivent jamais être modifiés après le premier déploiement — toutes les données de sondage sont chiffrées avec ces clés. Conservez-les en lieu sûr !

Mise à jour

# Modifier formbricks-deployment.yaml — mettre à jour le tag d'image
# image: formbricks/formbricks:v2.x.y
kubectl apply -f cadensa-k8s/k8s/formbricks/formbricks-deployment.yaml

Docker Compose (local / staging)

Pour les tests locaux ou les environnements de staging :

# 1. Copier et remplir le fichier env
cp cadensa-k8s/.env.formbricks.example cadensa-k8s/.env.formbricks
# Modifier .env.formbricks — remplacer toutes les valeurs CHANGE_ME

# 2. Démarrer
docker compose -f cadensa-k8s/docker-compose.formbricks.yml \
--env-file cadensa-k8s/.env.formbricks up -d

# Interface Formbricks : http://localhost:3001

Configuration de l'application

Après le premier déploiement, ouvrir https://surveys.cadensa.io et suivre l'assistant de configuration :

  1. Créer le compte administrateur
  2. Noter l'Environment ID : Settings → Developer → Environment
  3. Mettre à jour les variables d'environnement dans les deux applications :

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

Comment fonctionne l'intégration du SDK

Les deux applications initialisent le SDK JS de Formbricks de manière conditionnelle :

  • cadensa-frontend (src/main.tsx) : initialisé uniquement en mode PROD et seulement après que l'utilisateur a donné son consentement analytics
  • cadensa-landing (components/layout/FormbricksProvider.tsx) : initialisé après requestIdleCallback pour éviter d'entrer en concurrence avec les ressources du LCP

Le bouton de feedback (FeedbackButton.tsx) suit un événement feedback-button-clicked. Si le SDK n'est pas chargé, le bouton se rabat sur un lien mailto:feedback@cadensa.io.


Télémétrie

TELEMETRY_DISABLED=1 est défini dans la ConfigMap — Formbricks n'envoie aucune donnée d'utilisation au cloud Formbricks.


Données et RGPD

  • Emplacement des données : Hetzner, Allemagne (EU)
  • Aucun transfert vers les US (contrairement à Formbricks Cloud)
  • Réponses aux sondages stockées dans PostgreSQL — chiffrées au repos (chiffrement du volume Hetzner)
  • Demandes des personnes concernées : Interface admin Formbricks → People → Delete person
  • Conservation : configurable dans les paramètres Formbricks

Documentation connexe : FAQ Données et Sécurité