Alojamiento propio de Formbricks
Esta guía describe un despliegue previsto que hoy no está en funcionamiento.
Cadensa utiliza la nube de Formbricks (app.formbricks.com, Formbricks GmbH,
Kiel, Alemania — entidad de la UE con almacenamiento en Alemania). Nunca ha
habido una instancia autoalojada en producción, y surveys.cadensa.io no sirve
ninguna.
La lista que prevalece es la página de subencargados. Trate lo siguiente como una receta de despliegue, no como una descripción del sistema en producción.
CADENSA utiliza Formbricks para encuestas NPS en la aplicación y el botón de comentarios. En lugar del cloud de Formbricks, ejecutamos una instancia propia en nuestra infraestructura EU — sin transferencia de datos a EE.UU., plena conformidad con el RGPD.
URL alojada: https://surveys.cadensa.io (Hetzner, Alemania)
¿Por qué alojar en propio?
| Formbricks Cloud | Propio (surveys.cadensa.io) | |
|---|---|---|
| Ubicación de datos | Servidores Formbricks (US/EU mixto) | Hetzner Alemania (solo EU) |
| Transferencia a EE.UU. | Posible | Ninguna |
| RGPD | Requiere DPA | Sin DPA de terceros |
| Puerta de consentimiento | Requerida | Requerida (categoría analytics) |
Arquitectura
cadensa-frontend / cadensa-landing
└─ @formbricks/js SDK
└─ VITE_FORMBRICKS_APP_URL / NEXT_PUBLIC_FORMBRICKS_APP_URL
└─ https://surveys.cadensa.io
└─ App Formbricks (Kubernetes: namespace formbricks)
└─ PostgreSQL 15 (StatefulSet: formbricks-postgres)
La aplicación Formbricks se ejecuta en su propio namespace de Kubernetes (formbricks) con un StatefulSet PostgreSQL dedicado. Se expone mediante nginx Ingress con certificado TLS de Let's Encrypt.
Despliegue en Kubernetes
Todos los manifiestos se encuentran en cadensa-k8s/k8s/formbricks/:
| Archivo | Descripción |
|---|---|
namespace.yaml | Namespace formbricks |
postgres-statefulset.yaml | PostgreSQL 15, PVC 10 Gi |
formbricks-configmap.yaml | Configuración no sensible (URL, host SMTP, etc.) |
formbricks-sealed-secret.yaml | Plantilla Sealed Secret (reemplazar con valores reales) |
formbricks-deployment.yaml | App Formbricks + Service |
formbricks-ingress.yaml | Ingress nginx con TLS (surveys.cadensa.io) |
Primer despliegue
# 1. Generar secretos
NEXTAUTH_SECRET=$(openssl rand -base64 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
POSTGRES_PASSWORD=$(openssl rand -base64 24)
# 2. Crear 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="<contrasena-smtp>" \
-n formbricks --dry-run=client -o yaml \
| kubeseal --controller-namespace kube-system -o yaml \
> cadensa-k8s/k8s/formbricks/formbricks-sealed-secret.yaml
# 3. Aplicar manifiestos
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 y ENCRYPTION_KEY no deben cambiarse nunca después del primer despliegue — todos los datos de encuestas están cifrados con estas claves. ¡Guárdalas en un lugar seguro!
Actualización
# Editar formbricks-deployment.yaml — actualizar el tag de imagen
# image: formbricks/formbricks:v2.x.y
kubectl apply -f cadensa-k8s/k8s/formbricks/formbricks-deployment.yaml
Docker Compose (local / staging)
Para pruebas locales o entornos de staging:
# 1. Copiar y rellenar el archivo env
cp cadensa-k8s/.env.formbricks.example cadensa-k8s/.env.formbricks
# Editar .env.formbricks — reemplazar todos los valores CHANGE_ME
# 2. Iniciar
docker compose -f cadensa-k8s/docker-compose.formbricks.yml \
--env-file cadensa-k8s/.env.formbricks up -d
# Interfaz Formbricks: http://localhost:3001
Configuración de la aplicación
Tras el primer despliegue, abrir https://surveys.cadensa.io y seguir el asistente de configuración:
- Crear la cuenta de administrador
- Anotar el Environment ID: Settings → Developer → Environment
- Actualizar las variables de entorno en ambas aplicaciones:
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
Cómo funciona la integración del SDK
Ambas aplicaciones inicializan el SDK de JS de Formbricks de forma condicional:
- cadensa-frontend (
src/main.tsx): se inicializa solo en modoPRODy solo después de que el usuario otorga el consentimiento deanalytics - cadensa-landing (
components/layout/FormbricksProvider.tsx): se inicializa trasrequestIdleCallbackpara no competir con los recursos del LCP
El botón de feedback (FeedbackButton.tsx) registra un evento feedback-button-clicked. Si el SDK no está cargado, el botón recurre a un enlace mailto:feedback@cadensa.io.
Telemetría
TELEMETRY_DISABLED=1 está definido en la ConfigMap — Formbricks no envía ningún dato de uso al cloud de Formbricks.
Datos y RGPD
- Ubicación de datos: Hetzner, Alemania (EU)
- Sin transferencia a EE.UU. (a diferencia de Formbricks Cloud)
- Respuestas a encuestas almacenadas en PostgreSQL — cifradas en reposo (cifrado de volumen Hetzner)
- Solicitudes de interesados: Interfaz admin Formbricks → People → Delete person
- Retención: configurable en los ajustes de Formbricks
Documentación relacionada: FAQ Datos y Seguridad