Instalación de Formbricks en un VPS: Tu propio constructor de formularios y encuestas
TL;DR
En esta guía técnica detallada, configuraremos paso a paso Formbricks, un potente constructor de formularios y encuestas de código abierto, en tu propio servidor virtual o dedicado (VPS/dedicated). Aprenderás cómo preparar el servidor, instalar todos los componentes necesarios a través de Docker Compose, configurar el dominio y HTTPS con Caddy, y asegurar copias de seguridad y mantenimiento regulares. Como resultado, obtendrás una plataforma de recopilación de datos totalmente controlada, privada y escalable, independiente de los servicios en la nube de terceros.
- Formbricks se instalará en tu servidor VPS/dedicado utilizando Docker Compose para una máxima aislación y facilidad de gestión.
- Configuraremos acceso seguro a través de HTTPS con emisión y renovación automática de certificados Let's Encrypt gracias a Caddy.
- Se abordarán los pasos básicos para fortalecer la seguridad del servidor, incluyendo la configuración del firewall y las claves SSH.
- Recibirás recomendaciones para elegir la configuración de VPS adecuada y aprenderás cuándo considerar un servidor dedicado.
- Desarrollaremos una estrategia de copia de seguridad y recuperación de datos, y daremos consejos para el mantenimiento del sistema.
Qué configuramos y por qué
Instalaremos Formbricks, una herramienta moderna de código abierto para crear formularios, encuestas y recopilar feedback. Permite crear encuestas interactivas, incrustarlas en sitios web, enviarlas por correo electrónico y analizar las respuestas. La característica principal de Formbricks que utilizaremos es la capacidad de autoalojamiento (self-hosted) en tu propio servidor.
Al final, obtendrás una plataforma completamente funcional para crear y gestionar encuestas, que funcionará en tu VPS. Esto te dará control total sobre los datos, su seguridad y confidencialidad, lo cual es especialmente importante dadas las crecientes exigencias de privacidad y protección de la información.
¿Para qué sirve esto? Imagina que eres un desarrollador, un emprendedor o el propietario de una pequeña empresa. Necesitas recopilar feedback de los usuarios regularmente, realizar investigaciones de mercado o simplemente crear formularios de contacto. Muchos servicios en la nube (Google Forms, Typeform, SurveyMonkey) son convenientes, pero alojan tus datos en sus propios servidores, a menudo en jurisdicciones que no te convienen, y con limitaciones de funcionalidad o número de respuestas en los planes gratuitos. Además, su costo puede aumentar rápidamente con el uso.
Formbricks autoalojado en un VPS ofrece las siguientes ventajas:
- Control total sobre los datos: Todos los datos se almacenan en tu servidor, y solo tú decides cómo gestionarlos. Esto es crítico para cumplir con GDPR, HIPAA y otras regulaciones.
- Ahorro de costes: Después de la configuración inicial, solo pagas por el VPS, lo que a menudo es significativamente más barato que las suscripciones a servicios comerciales, especialmente con grandes volúmenes de uso.
- Flexibilidad y personalización: Puedes modificar el código fuente de Formbricks, integrarlo con tus otros sistemas, personalizar la marca sin restricciones.
- Rendimiento: Puedes optimizar el servidor según tus necesidades, asegurando una alta velocidad de operación y disponibilidad del servicio.
- Independencia: No dependes de cambios en las políticas, precios o disponibilidad de servicios de terceros.
Por supuesto, una solución autoalojada requiere ciertos conocimientos técnicos y tiempo para la configuración y el mantenimiento. Pero esta guía está diseñada para simplificar al máximo este proceso, proporcionándote todos los pasos y comandos necesarios.
Qué configuración de VPS se necesita para esta tarea
Formbricks, al ser una aplicación web moderna, utiliza Docker Compose para orquestar varios servicios: un backend Node.js, un frontend Next.js, PostgreSQL para la base de datos y Redis para el almacenamiento en caché. Esto significa que para su funcionamiento estable se requiere una configuración de VPS que no sea la más mínima.
Requisitos mínimos (para un proyecto pequeño, hasta 1000 respuestas al mes):
- Procesador (CPU): 2 núcleos (vCPU). Formbricks puede ser bastante intensivo en recursos durante la compilación y al procesar un gran número de solicitudes.
- Memoria RAM: 4 GB. Esto es crítico. PostgreSQL, Redis, los procesos de Node.js y el propio Docker consumen una parte significativa de la memoria. Menos de 4 GB puede provocar ralentizaciones o fallos.
- Espacio en disco: 50 GB NVMe SSD. SSD acelera significativamente el funcionamiento de la base de datos y las imágenes de Docker. NVMe es preferible para un mejor rendimiento. 50 GB es un buen punto de partida para el sistema operativo, las imágenes de Docker y los datos de Formbricks.
- Red: Puerto de 100 Mbps o 1 Gbps. Para la mayoría de los propósitos, 100 Mbps será suficiente, pero 1 Gbps siempre es mejor para una carga rápida.
Plan de VPS recomendado (para proyectos medianos, hasta 10 000 respuestas al mes y varios usuarios activos):
- Procesador (CPU): 4 núcleos (vCPU).
- Memoria RAM: 8 GB.
- Espacio en disco: 100-150 GB NVMe SSD.
- Red: Puerto de 1 Gbps.
Para estas características, se puede considerar un VPS con las características indicadas. Es importante elegir un proveedor que ofrezca unidades SSD fiables y una red estable.
Cuándo se necesita un servidor dedicado y no un VPS:
- Carga muy alta: Esperas decenas o cientos de miles de respuestas al mes, miles de usuarios activos simultáneamente.
- Requisitos estrictos de rendimiento: Necesitas un rendimiento garantizado sin "ruido de vecinos" (cuando otros VPS en el mismo servidor físico afectan tu trabajo).
- Requisitos específicos de hardware: Necesitas CPU, GPU especiales, volúmenes muy grandes de RAM (32 GB+) o espacio en disco (varios TB) que son difíciles de obtener en un VPS.
- Control total sobre el hardware: Para requisitos especiales de seguridad o auditoría, cuando se necesita acceso al hardware físico.
En la mayoría de los casos para Formbricks, especialmente al principio, un VPS con 4-8 GB de RAM y 2-4 vCPU será más que suficiente. Si te encuentras con la necesidad de un servidor dedicado, considera uno adecuado.
Ubicación: en qué influye
La elección de la ubicación del VPS tiene varios aspectos clave:
- Latencia: Cuanto más cerca esté el servidor de tu audiencia objetivo (usuarios que completarán los formularios), menor será la latencia y más rápida la carga de los formularios.
- Legislación: Si recopilas datos personales, asegúrate de que la ubicación del servidor cumpla con los requisitos legales de tu país o de los países donde se encuentran tus usuarios (por ejemplo, GDPR en Europa).
- Costo: Los precios de los VPS pueden variar según la ubicación.
Se recomienda elegir una ubicación que esté geográficamente cerca de la mayoría de tus usuarios para garantizar la mejor experiencia de usuario.
Preparación del servidor
Antes de instalar Formbricks, es necesario realizar una configuración básica y fortalecer la seguridad de su VPS. Utilizaremos la distribución Ubuntu 24.04 LTS (Noble Numbat), que será relevante y compatible hasta 2026. Si utiliza una distribución diferente, los comandos pueden variar ligeramente.
1. Conexión por SSH
Conéctese a su nuevo VPS como usuario root, utilizando la dirección IP proporcionada por su proveedor de hosting:
ssh root@ВАШ_IP_АДРЕС
En la primera conexión, el sistema puede preguntar si confía en el host. Escriba yes.
2. Actualización del sistema
Siempre comience actualizando el gestor de paquetes y los paquetes instalados a las últimas versiones. Esto garantizará que tenga todas las correcciones de seguridad y estabilidad más recientes.
sudo apt update && sudo apt upgrade -y
Este comando actualiza la lista de paquetes disponibles y luego instala todas las actualizaciones sin solicitar confirmación.
3. Creación de un nuevo usuario con permisos sudo
Trabajar como usuario root no es seguro. Crearemos un nuevo usuario y le otorgaremos permisos para ejecutar comandos con sudo.
adduser formbricksuser # Creamos un nuevo usuario con el nombre formbricksuser
usermod -aG sudo formbricksuser # Añadimos el usuario al grupo sudo para que pueda ejecutar comandos como root
Durante el proceso de creación del usuario, se le pedirá que establezca una contraseña e introduzca información adicional (que puede omitir pulsando Enter).
4. Configuración de claves SSH para el nuevo usuario
Para mejorar la seguridad, se recomienda utilizar claves SSH en lugar de contraseñas para iniciar sesión. Primero, genere una clave SSH en su máquina local si aún no tiene una:
ssh-keygen -t ed25519 -C "[email protected]" # En su máquina local
Luego, copie la clave pública al servidor para el nuevo usuario. Reemplace formbricksuser y ВАШ_IP_АДРЕС con sus propios valores.
ssh-copy-id formbricksuser@ВАШ_IP_АДРЕС # En su máquina local
Si ssh-copy-id no está disponible o no funciona, puede copiar la clave manualmente. Primero, inicie sesión en el servidor como formbricksuser (todavía con contraseña):
ssh formbricksuser@ВАШ_IP_АДРЕС # Nos conectamos como nuevo usuario
mkdir -p ~/.ssh # Creamos el directorio .ssh si no existe
chmod 700 ~/.ssh # Establecemos los permisos correctos para el directorio
nano ~/.ssh/authorized_keys # Abrimos el archivo para editar
Pegue el contenido de su clave pública (normalmente del archivo ~/.ssh/id_ed25519.pub en su máquina local) en el archivo authorized_keys abierto y guarde (Ctrl+X, Y, Enter). Luego, establezca los permisos correctos para el archivo:
chmod 600 ~/.ssh/authorized_keys
exit # Salimos del servidor
5. Deshabilitar el inicio de sesión con contraseña para root y el inicio de sesión con contraseña en general (opcional, pero recomendado)
Una vez que haya verificado que puede iniciar sesión como el nuevo usuario con la clave SSH, deshabilite el inicio de sesión con contraseña para root y, preferiblemente, deshabilite completamente el inicio de sesión con contraseña para todos los usuarios, permitiendo solo las claves SSH. Esto aumenta significativamente la seguridad.
sudo nano /etc/ssh/sshd_config # Abrimos el archivo de configuración del servidor SSH
Encuentre y modifique las siguientes líneas (o agréguelas si no existen):
# Prohibir el inicio de sesión para root con contraseña
PermitRootLogin prohibit-password
# Deshabilitar el inicio de sesión con contraseña para todos los usuarios
PasswordAuthentication no
# Habilitar el uso de claves SSH
PubkeyAuthentication yes
Guarde los cambios y reinicie el servidor SSH:
sudo systemctl restart sshd
IMPORTANTE: Antes de salir de la sesión SSH actual, abra una nueva ventana de terminal e intente conectarse al servidor como formbricksuser, utilizando su clave SSH. Si el inicio de sesión es exitoso, significa que todo está configurado correctamente y puede cerrar la sesión root de forma segura.
6. Configuración del firewall (UFW)
Uncomplicated Firewall (UFW) es un firewall fácil de usar para Linux. Lo configuraremos para permitir solo los puertos necesarios.
sudo apt install ufw -y # Instalamos UFW si aún no está instalado
sudo ufw allow OpenSSH # Permitimos SSH (puerto 22)
sudo ufw allow http # Permitimos HTTP (puerto 80)
sudo ufw allow https # Permitimos HTTPS (puerto 443)
sudo ufw enable # Habilitamos el firewall
sudo ufw status # Verificamos el estado del firewall
El firewall ahora permitirá conexiones entrantes solo a los puertos 22 (SSH), 80 (HTTP) y 443 (HTTPS), bloqueando todos los demás por defecto.
7. Instalación de Fail2Ban
Fail2Ban ayuda a protegerse contra ataques de fuerza bruta (brute-force) bloqueando temporalmente las direcciones IP desde las cuales se realizan numerosos intentos fallidos de inicio de sesión.
sudo apt install fail2ban -y # Instalamos Fail2Ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Creamos una copia local del archivo de configuración para realizar cambios
sudo nano /etc/fail2ban/jail.local # Abrimos el archivo para editar
En el archivo jail.local, asegúrese de que la sección [sshd] esté activa (enabled = true) y, si lo desea, configure bantime (tiempo de bloqueo) y findtime (período en el que se cuentan los intentos fallidos) según sus preferencias. Por defecto, la configuración es lo suficientemente buena para la mayoría de los casos.
# Ejemplo de configuración en jail.local
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 3 # Número máximo de intentos fallidos antes del bloqueo
bantime = 1h # Tiempo de bloqueo de la dirección IP (1 hora)
Guarde los cambios y reinicie Fail2Ban:
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban # Habilitamos el inicio automático de Fail2Ban al arrancar el sistema
Ahora su servidor está listo para la instalación de Formbricks con configuraciones de seguridad básicas.
Instalación de software — paso a paso
La instalación de Formbricks se realizará utilizando Docker y Docker Compose. Esto permite desplegar fácilmente todos los componentes necesarios (base de datos, caché, la propia aplicación) en contenedores aislados, lo que simplifica la gestión y las actualizaciones.
1. Instalación de Docker Engine
Docker Engine es la base para ejecutar contenedores. Lo instalaremos desde el repositorio oficial de Docker.
# Actualizamos el gestor de paquetes e instalamos las utilidades necesarias
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release -y
# Añadimos la clave GPG oficial de Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Añadimos el repositorio de Docker a las fuentes de APT
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Actualizamos la lista de paquetes teniendo en cuenta el nuevo repositorio
sudo apt update
# Instalamos Docker Engine, Docker CLI y containerd (versiones actuales para 2026)
sudo apt install docker-ce docker-ce-cli containerd.io -y
# Añadimos el usuario actual al grupo docker para ejecutar comandos sin sudo
sudo usermod -aG docker $USER
# Recargamos el grupo para aplicar los cambios (o simplemente reconéctese por SSH)
newgrp docker
Verificamos que Docker esté instalado correctamente, ejecutando un contenedor de prueba:
docker run hello-world
Si ve el mensaje "Hello from Docker!", la instalación se ha realizado correctamente.
2. Instalación de Docker Compose
Docker Compose permite definir y ejecutar aplicaciones Docker multicontenedor. Instalaremos la versión actual de Docker Compose V2.
# Docker Compose V2 se instala normalmente junto con Docker Engine como un plugin.
# Verificamos su presencia:
docker compose version
# Si Docker Compose V2 no está instalado, se puede instalar por separado:
sudo apt install docker-compose-plugin -y # Instalamos el plugin de Docker Compose
Asegúrese de que el comando docker compose (con espacio) funciona, y no docker-compose (con guion), ya que esto indica la V2.
3. Clonación del repositorio de Formbricks
Formbricks proporciona un archivo Docker Compose listo para el despliegue. Clonaremos el repositorio oficial de Formbricks, que contiene todos los archivos necesarios.
# Creamos un directorio para Formbricks
mkdir ~/formbricks
cd ~/formbricks
# Clonamos el repositorio de Formbricks (usamos la rama estable o un lanzamiento, si se especifica)
# Para 2026, asumiremos que el repositorio principal contiene el docker-compose actualizado
git clone https://github.com/formbricks/formbricks.git .
# Verificamos que los archivos necesarios, como docker-compose.yml, estén en el directorio
ls -la docker-compose.yml
Este comando clona el contenido del repositorio de Formbricks en el directorio actual ~/formbricks.
4. Configuración del archivo de variables de entorno (.env)
Formbricks utiliza un archivo .env para almacenar variables de configuración, como la configuración de la base de datos, claves secretas, dominio y datos SMTP. Copie la plantilla y edítela.
cp .env.example .env
nano .env
En el archivo .env deberá configurar las siguientes variables:
DATABASE_URL: Cadena de conexión a PostgreSQL. Por defecto, Docker Compose ya configurará PostgreSQL, y esta variable se verá aproximadamente así:postgresql://formbricks:formbricks@formbricks-database:5432/formbricks?schema=public. Cambie la contraseñaformbrickspor algo más seguro.REDIS_URL: Cadena de conexión a Redis. Por defecto:redis://formbricks-redis:6379.NEXTAUTH_SECRET: Una clave secreta muy importante. Genere una cadena aleatoria larga (por ejemplo, usandoopenssl rand -base64 32).WEBAPP_URL: La URL donde estará disponible su Formbricks. Por ejemplo,https://forms.yourdomain.com. Asegúrese de tener un nombre de dominio y que apunte a su VPS.SENDER_EMAIL_ID: La dirección de correo electrónico desde la cual se enviarán los correos electrónicos del sistema (por ejemplo, confirmaciones).SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASSWORD: Configuración para su servidor SMTP, a través del cual Formbricks enviará correos electrónicos. Si no planea enviar correos, puede dejarlos en blanco, pero para un funcionamiento completo (por ejemplo, invitaciones de usuarios) son necesarios.PRIMARY_APP_NAME: El nombre de su instancia de Formbricks (por ejemplo, "Mis Encuestas").NEXT_PUBLIC_FORMBRICKS_API_HOST: Debe coincidir conWEBAPP_URL.SERVER_URL: También debe coincidir conWEBAPP_URL.TELEMETRY_DISABLED=1: Se recomienda añadir esta línea si no desea enviar datos anónimos de uso a los desarrolladores de Formbricks.
Ejemplo de líneas modificadas en .env (¡genere sus secretos únicos!):
# ... otras variables ...
DATABASE_URL="postgresql://formbricks_user_secure:YOUR_SECURE_DB_PASSWORD@formbricks-database:5432/formbricks_db?schema=public"
REDIS_URL="redis://formbricks-redis:6379"
# Genere su secreto único: openssl rand -base64 32
NEXTAUTH_SECRET="your_very_long_and_secure_random_string_here_for_nextauth"
WEBAPP_URL="https://forms.example.com"
NEXT_PUBLIC_FORMBRICKS_API_HOST="https://forms.example.com"
SERVER_URL="https://forms.example.com"
SENDER_EMAIL_ID="[email protected]"
SMTP_HOST="smtp.mailgun.org" # Ejemplo: su proveedor SMTP
SMTP_PORT="587"
SMTP_USER="[email protected]"
SMTP_PASSWORD="YOUR_SMTP_PASSWORD"
SMTP_SECURE_ENABLED="true" # Si su SMTP soporta TLS
PRIMARY_APP_NAME="Mis Encuestas"
TELEMETRY_DISABLED=1
# ... el resto de variables ...
Guarde los cambios en el archivo .env.
5. Inicio de Formbricks con Docker Compose
Después de configurar .env, puede iniciar todos los servicios de Formbricks.
# Asegúrese de estar en el directorio ~/formbricks
cd ~/formbricks
# Iniciamos Formbricks en segundo plano
docker compose up -d
# Verificamos el estado de los contenedores en ejecución
docker compose ps
El comando docker compose up -d descargará las imágenes Docker necesarias, creará los contenedores y los iniciará en segundo plano. Esto puede tardar un tiempo en la primera ejecución, ya que Docker descargará las imágenes.
docker compose ps mostrará una lista de los contenedores en ejecución y su estado. Asegúrese de que todos los contenedores tienen el estado Up.
6. Inicialización de la base de datos
Después de la primera ejecución de los contenedores, es necesario inicializar la base de datos de Formbricks. Esto se hace a través de migraciones.
# Ejecutamos las migraciones de la base de datos dentro del contenedor app
docker compose exec app npx prisma migrate deploy
# Generamos el cliente Prisma
docker compose exec app npx prisma generate
Estos comandos garantizan que la estructura de la base de datos de Formbricks se creará y actualizará a la última versión. Después de esto, Formbricks estará listo para funcionar, pero por ahora solo será accesible por dirección IP sin HTTPS.
Configuración de Formbricks y el dominio
Ahora que Formbricks está en funcionamiento, es necesario configurar el acceso a través de un nombre de dominio y asegurar una conexión HTTPS segura. Utilizaremos Caddy como servidor proxy inverso, que gestiona automáticamente los certificados SSL de Let's Encrypt.
1. Configuración del nombre de dominio
Antes de continuar, asegúrese de tener un nombre de dominio (por ejemplo, forms.example.com) y de que su registro A en DNS apunte a la dirección IP de su VPS. Esto es crucial para el funcionamiento de Caddy y HTTPS.
Ejemplo de registro DNS:
| Tipo | Nombre/Host | Valor |
|---|---|---|
| A | forms | SU_DIRECCIÓN_IP_DEL_VPS |
Deje que los registros DNS se propaguen durante un tiempo (normalmente unos minutos, pero puede tardar hasta varias horas).
2. Instalación de Caddy
Caddy es un servidor web potente pero fácil de configurar, ideal para proxy inverso y emisión automática de certificados HTTPS.
# Instalamos los paquetes necesarios
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
# Añadimos la clave GPG de Caddy
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
# Añadimos el repositorio de Caddy
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
# Actualizamos la lista de paquetes e instalamos Caddy
sudo apt update
sudo apt install caddy -y
3. Configuración del Caddyfile
Caddy utiliza un archivo de configuración llamado Caddyfile. Lo configuraremos para que funcione como proxy inverso para Formbricks.
sudo nano /etc/caddy/Caddyfile
Elimine todo el contenido del archivo e inserte la siguiente configuración, reemplazando forms.example.com por su nombre de dominio:
forms.example.com {
# Comprimimos las respuestas para una carga más rápida
encode gzip zstd
# Configuración para HTTPS automático
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN} # Si usa Cloudflare DNS
# O simplemente déjelo vacío para el desafío HTTP-01, si el puerto 80 está abierto
}
# Proxy inverso a Formbricks (el servicio 'app' de Docker Compose escucha en el puerto 3000)
reverse_proxy formbricks-app:3000 {
# Añadimos encabezados para el correcto funcionamiento de WebSocket y el proxy
header_up Host {host}
header_up X-Real-IP {remote_ip}
header_up X-Forwarded-For {remote_ip}
header_up X-Forwarded-Proto {scheme}
header_up X-Forwarded-Ssl on
header_up Upgrade {header.Upgrade}
header_up Connection {header.Connection}
}
# Habilitar el registro (opcional, útil para depuración)
log {
output file /var/log/caddy/formbricks_access.log
format json
}
}
Explicaciones del Caddyfile:
forms.example.com: Especifica el dominio para el que funcionará esta configuración. Caddy obtendrá automáticamente un certificado SSL para él.tls { dns cloudflare {env.CLOUDFLARE_API_TOKEN} }: Esto es opcional. Si su dominio se gestiona a través de Cloudflare DNS y desea utilizar el desafío DNS-01 para la emisión de certificados (útil si el puerto 80 está bloqueado o si desea un certificado wildcard), deberá crear un token API de Cloudflare y establecerlo como variable de entorno. Si simplemente ha abierto los puertos 80 y 443 en el firewall, Caddy utilizará el desafío HTTP-01 y esta línea se puede eliminar.reverse_proxy formbricks-app:3000: Redirige todas las solicitudes entrantes al servicioappde Formbricks dentro de la red de Docker Compose, que escucha en el puerto 3000. Es importante usar el nombre del servicio dedocker-compose.yml(normalmenteapp) para la resolución dentro de la red de Docker.
Si ha decidido utilizar el desafío DNS (por ejemplo, con Cloudflare), deberá crear un archivo con variables de entorno para Caddy.
sudo mkdir -p /etc/caddy/conf.d # Creamos el directorio para las variables
sudo nano /etc/caddy/conf.d/caddy.env
Añada su token API de Cloudflare:
CLOUDFLARE_API_TOKEN="SU_TOKEN_API_DE_CLOUDFLARE"
Luego, edite el archivo /etc/systemd/system/caddy.service (o créelo si no existe) y añada la línea EnvironmentFile=/etc/caddy/conf.d/caddy.env en la sección [Service].
# ...
[Service]
EnvironmentFile=/etc/caddy/conf.d/caddy.env
# ...
Guarde el Caddyfile. Luego, verifique la sintaxis y recargue Caddy:
sudo caddy validate # Verificamos la sintaxis del Caddyfile
sudo systemctl reload caddy # Recargamos Caddy para aplicar los cambios
Caddy solicitará e instalará automáticamente un certificado SSL para su dominio.
4. Verificación del funcionamiento
Abra su dominio (por ejemplo, https://forms.example.com) en el navegador. Debería ver la página de registro/inicio de sesión de Formbricks. Verifique que la conexión sea segura (el icono del candado en el navegador).
También puede verificar la disponibilidad usando curl desde su VPS:
curl -I https://forms.example.com
Debería ver los encabezados HTTP, incluyendo HTTP/2 200 OK, lo que indica una conexión exitosa.
Si surgen problemas, revise los registros de Caddy:
sudo journalctl -u caddy --no-pager
Y los registros de los contenedores de Formbricks:
cd ~/formbricks
docker compose logs app
docker compose logs database
5. Registro del primer usuario
Después de configurar exitosamente el dominio y HTTPS, acceda a su URL de Formbricks. Verá la página de bienvenida donde podrá registrar al primer usuario y crear su organización. Esta será la cuenta de administrador para su instancia de Formbricks.
Copias de seguridad y mantenimiento
La copia de seguridad es una parte críticamente importante de la operación de cualquier servicio. Formbricks almacena todos sus datos en una base de datos PostgreSQL y también utiliza Redis para el almacenamiento en caché (los datos de Redis generalmente no requieren copia de seguridad, ya que pueden recrearse).
1. Qué respaldar
Debe realizar copias de seguridad regularmente de:
- Base de datos PostgreSQL: Contiene todas las encuestas, respuestas, usuarios, configuraciones y metadatos de Formbricks. Este es el componente más importante.
- Archivos de configuración: El archivo
.envde Formbricks, así como elCaddyfiley cualquier configuración personalizada del servidor. - Archivos de Docker Compose:
docker-compose.ymly otros archivos relacionados, para poder restaurar fácilmente el entorno.
2. Script simple de copia de seguridad automática de PostgreSQL
Crearemos un script simple que realizará un volcado de la base de datos y lo guardará. Para el almacenamiento, utilizaremos el almacenamiento local, pero se recomienda encarecidamente enviar las copias de seguridad a un almacenamiento externo (almacenamiento en la nube compatible con S3, otro VPS, Google Drive, etc.).
# Creamos el directorio para las copias de seguridad
sudo mkdir -p /var/backups/formbricks
sudo chown $USER:$USER /var/backups/formbricks # Damos permisos al usuario actual
# Creamos el script de copia de seguridad
nano ~/formbricks_backup.sh
Inserte el siguiente contenido en el archivo formbricks_backup.sh, reemplazando las variables con sus valores actuales de .env:
#!/bin/bash
# --- Configuración ---
BACKUP_DIR="/var/backups/formbricks"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="formbricks_db" # Nombre de su BD de .env
DB_USER="formbricks_user_secure" # Usuario de la BD de .env
DB_PASSWORD="YOUR_SECURE_DB_PASSWORD" # Contraseña de la BD de .env
DB_HOST="formbricks-database" # Nombre de host de la BD dentro de la red Docker
DB_PORT="5432"
# --- Ejecución de la copia de seguridad de la BD ---
echo "[$DATE] Iniciando la copia de seguridad de la base de datos PostgreSQL de Formbricks..."
docker compose exec -T database pg_dump -U "$DB_USER" -d "$DB_NAME" -h "$DB_HOST" -p "$DB_PORT" > "$BACKUP_DIR/formbricks_db_backup_$DATE.sql"
if [ $? -eq 0 ]; then
echo "[$DATE] Copia de seguridad de la base de datos PostgreSQL completada con éxito: $BACKUP_DIR/formbricks_db_backup_$DATE.sql"
else
echo "[$DATE] ERROR: ¡La copia de seguridad de la base de datos PostgreSQL falló!"
exit 1
fi
# --- Copia de archivos de configuración ---
echo "[$DATE] Copiando archivos de configuración..."
cp ~/formbricks/.env "$BACKUP_DIR/formbricks_env_$DATE.bak"
cp /etc/caddy/Caddyfile "$BACKUP_DIR/caddyfile_$DATE.bak"
cp ~/formbricks/docker-compose.yml "$BACKUP_DIR/docker_compose_$DATE.bak"
echo "[$DATE] Archivos de configuración copiados."
# --- Limpieza de copias de seguridad antiguas (mantenemos las últimas 7 días) ---
echo "[$DATE] Limpiando copias de seguridad antiguas..."
find "$BACKUP_DIR" -type f -name "formbricks_db_backup_*.sql" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name "formbricks_env_*.bak" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name "caddyfile_*.bak" -mtime +7 -delete
find "$BACKUP_DIR" -type f -name "docker_compose_*.bak" -mtime +7 -delete
echo "[$DATE] Copias de seguridad antiguas limpiadas."
echo "[$DATE] Script de copia de seguridad finalizado."
Haga el script ejecutable:
chmod +x ~/formbricks_backup.sh
Verifique el funcionamiento del script ejecutándolo manualmente:
~/formbricks_backup.sh
ls -la /var/backups/formbricks/
3. Automatización de copias de seguridad con Cron
Añadiremos el script al programador Cron para su ejecución diaria (por ejemplo, a las 3:00 de la madrugada).
crontab -e
Añada la siguiente línea al final del archivo (si es la primera vez, elija un editor, por ejemplo nano):
0 3 * * * /home/formbricksuser/formbricks_backup.sh >> /var/log/formbricks_backup.log 2>&1
Esta línea ejecutará el script cada día a las 3 de la madrugada y redirigirá la salida al archivo de registro /var/log/formbricks_backup.log.
4. Dónde almacenar las copias de seguridad (almacenamiento externo)
Almacenar las copias de seguridad en el mismo servidor que el servicio principal es extremadamente arriesgado. Si el servidor falla o se ve comprometido, perderá tanto el servicio como las copias de seguridad. Se recomienda encarecidamente configurar el envío automático de copias de seguridad a un almacenamiento externo:
- Almacenamiento en la nube compatible con S3: AWS S3, Backblaze B2, DigitalOcean Spaces, etc. Utilice herramientas como
rcloneos3cmdpara la sincronización. - VPS separado: Configure
rsyncoscppara copiar las copias de seguridad a otro VPS. - Copias de seguridad cifradas: Considere usar
resticoborgbackuppara crear copias de seguridad cifradas y deduplicadas que se puedan almacenar en cualquier lugar.
Por ejemplo, para rclone, después de su instalación y configuración, puede añadir un comando de sincronización al script de copia de seguridad:
# Añadir al script formbricks_backup.sh después de limpiar las copias de seguridad antiguas
echo "[$DATE] Sincronizando copias de seguridad con el almacenamiento remoto..."
rclone sync "$BACKUP_DIR" "your_rclone_remote_name:formbricks-backups" --progress
if [ $? -eq 0 ]; then
echo "[$DATE] Copias de seguridad sincronizadas con el almacenamiento remoto correctamente."
else
echo "[$DATE] ERROR: ¡Fallo al sincronizar las copias de seguridad con el almacenamiento remoto!"
fi
5. Actualizaciones: rolling vs maintenance window
Formbricks y sus componentes se actualizan regularmente. La estrategia de actualización depende de su tolerancia al tiempo de inactividad:
- Rolling updates (actualizaciones continuas): Se aplican a componentes individuales sin detener completamente el servicio. En el contexto de Docker Compose, esto puede significar actualizar contenedores individuales sin reconstruir toda la pila. Formbricks generalmente requiere detener toda la pila para aplicar migraciones y actualizar el código.
- Maintenance window (ventana de mantenimiento): El enfoque preferido para Formbricks. Programe un momento en el que el tráfico sea mínimo y realice la actualización.
Proceso de actualización de Formbricks:
cd ~/formbricks
# 1. Detenemos el servicio de Formbricks
docker compose down
# 2. Actualizamos el código fuente de Formbricks
git pull origin main # O use una rama/etiqueta de lanzamiento específica
# 3. Reconstruimos las imágenes de Docker e iniciamos los servicios
docker compose build
docker compose up -d
# 4. Ejecutamos las migraciones de la base de datos (si hubo cambios)
docker compose exec app npx prisma migrate deploy
docker compose exec app npx prisma generate
# 5. Limpiamos la caché de Formbricks (si aplica, normalmente no es necesario explícitamente)
# docker compose exec app npx formbricks-cli cache clear # Ejemplo, si existe tal comando
echo "¡Formbricks actualizado con éxito!"
Siempre revise la documentación oficial de Formbricks antes de actualizar, ya que el proceso puede cambiar entre versiones mayores.
Solución de problemas + Preguntas frecuentes
¿Qué configuración mínima de VPS es adecuada?
La configuración mínima recomendada para Formbricks es de 2 núcleos de CPU, 4 GB de RAM y 50 GB de SSD NVMe. Sin embargo, para un funcionamiento estable y el procesamiento de una cantidad moderada de encuestas, especialmente si planea usar Formbricks activamente, 4 núcleos de CPU, 8 GB de RAM y 100 GB de SSD NVMe serán una opción mucho más fiable. Una cantidad menor de RAM (por ejemplo, 2 GB) casi con toda seguridad provocará problemas de rendimiento y estabilidad debido a los requisitos de PostgreSQL, Redis y Node.js.
¿Qué elegir: VPS o dedicado para esta tarea?
Para la mayoría de los usuarios que comienzan con Formbricks, un VPS es la opción óptima. Ofrece suficiente rendimiento, flexibilidad y rentabilidad. Un servidor dedicado solo es necesario bajo una carga muy alta (decenas de miles de respuestas por hora, cientos de miles por mes), cuando se requiere un rendimiento máximo y garantizado, o si tiene requisitos de hardware específicos que no pueden satisfacerse en un VPS. Comience con un VPS y considere la transición a un dedicado solo cuando sea claramente necesario escalar.
docker compose up -d no funciona o los contenedores no se inician. ¿Qué hacer?
docker compose up -d no funciona o los contenedores no se inician. ¿Qué hacer?Primero, revise los registros de los contenedores para entender la causa del fallo. Vaya al directorio de Formbricks (cd ~/formbricks) y ejecute:
docker compose ps -a # Mostrar todos los contenedores, incluidos los detenidos
docker compose logs # Mostrar los registros de todos los servicios
docker compose logs app # Mostrar los registros de un servicio específico (por ejemplo, 'app')
Problemas típicos: falta de memoria (verifique docker stats), variables incorrectas en .env (especialmente DATABASE_URL, NEXTAUTH_SECRET, WEBAPP_URL), conflictos de puertos, imágenes corruptas (intente docker compose pull y docker compose build --no-cache).
HTTPS no funciona o Caddy no obtiene un certificado.
Asegúrese de que su dominio (por ejemplo, forms.example.com) esté configurado correctamente en DNS y apunte a la dirección IP de su VPS. Verifique el firewall (UFW): los puertos 80 (HTTP) y 443 (HTTPS) deben estar abiertos (sudo ufw status). Revise la sintaxis de Caddyfile (sudo caddy validate) y los registros de Caddy (sudo journalctl -u caddy --no-pager) en busca de errores relacionados con ACME (Let's Encrypt).
Formbricks no envía correos electrónicos.
Verifique la configuración SMTP en su archivo .env. Asegúrese de que SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD y SENDER_EMAIL_ID estén configurados correctamente y coincidan con su proveedor SMTP. También, verifique si el puerto SMTP está abierto en el firewall de su VPS (generalmente 587 o 465). Revise los registros del contenedor Formbricks app en busca de errores relacionados con el envío de correo.
Error de conexión a la base de datos.
Asegúrese de que el contenedor formbricks-database esté en ejecución (docker compose ps). Verifique DATABASE_URL en el archivo .env en busca de errores tipográficos en el nombre de usuario, contraseña, nombre de la base de datos o host. Asegúrese de que el nombre de host formbricks-database se resuelva correctamente dentro de la red de Docker. A veces, reiniciar todo el stack con docker compose restart ayuda.
Formbricks funciona lento.
Verifique el uso de recursos del servidor: top, htop, free -h. Si la RAM o la CPU están constantemente cargadas al 90% o más, probablemente necesitará actualizar su VPS a un plan más potente. Asegúrese de estar utilizando discos SSD, no HDD. Revise los registros de Formbricks en busca de errores recurrentes que puedan estar causando una carga excesiva. También considere optimizar las consultas a Formbricks si tiene una gran cantidad de datos o usuarios activos.
Conclusiones y próximos pasos
¡Felicidades! Ha desplegado y configurado con éxito su propia instancia de Formbricks en un VPS, obteniendo control total sobre los datos y la funcionalidad. Ha dominado los aspectos clave del trabajo con Docker Compose, la configuración del servidor web Caddy para HTTPS y la organización de una copia de seguridad básica. Esta instalación proporciona una plataforma fiable y privada para la recopilación de comentarios, encuestas y formularios, que se adapta completamente a sus requisitos.
¿Qué sigue?
- Configure las notificaciones: Integre Formbricks con sus sistemas de notificación (Slack, Email, Webhooks) para recibir información oportuna sobre nuevas respuestas.
- Monitoreo de recursos: Instale un sistema de monitoreo (por ejemplo, Prometheus + Grafana o Netdata) para rastrear la carga de CPU, RAM, disco y red de su VPS, así como el estado de los contenedores de Formbricks.
- Optimización adicional: Dependiendo de la carga, puede considerar optimizar la configuración de PostgreSQL o Redis, así como ajustar Caddy para mejorar el rendimiento y la seguridad.
- Escalado: Si su proyecto crece significativamente, explore las opciones de escalado de Formbricks, posiblemente utilizando orquestadores más avanzados como Kubernetes, o migrando a un servidor dedicado.