Alojamiento propio de Formbricks
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
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