Saltar al contenido principal

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 CloudPropio (surveys.cadensa.io)
Ubicación de datosServidores Formbricks (US/EU mixto)Hetzner Alemania (solo EU)
Transferencia a EE.UU.PosibleNinguna
RGPDRequiere DPASin DPA de terceros
Puerta de consentimientoRequeridaRequerida (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/:

ArchivoDescripción
namespace.yamlNamespace formbricks
postgres-statefulset.yamlPostgreSQL 15, PVC 10 Gi
formbricks-configmap.yamlConfiguración no sensible (URL, host SMTP, etc.)
formbricks-sealed-secret.yamlPlantilla Sealed Secret (reemplazar con valores reales)
formbricks-deployment.yamlApp Formbricks + Service
formbricks-ingress.yamlIngress 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
Importante

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:

  1. Crear la cuenta de administrador
  2. Anotar el Environment ID: Settings → Developer → Environment
  3. 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