Montar el sistema de cero (un servidor, uno o varios clientes)
Marca cada paso al terminarlo (se guarda en este navegador). Lo de Meta tarda días: empiézalo el primer día.
0 Qué vamos a montar y qué necesitas hecho
Qué es: un recepcionista automático que contesta el WhatsApp de una clínica, da precios y resuelve dudas con la información REAL de la clínica, agenda citas y, si no sabe algo, avisa a una persona.
Qué necesitas a mano: un correo; una tarjeta (para el servidor y lo poquito de la IA); el teléfono de la clínica para WhatsApp (sin WhatsApp ya instalado); y del cliente: sus precios, horarios y papeles de empresa (para Meta).
Las piezas (en cristiano): el servidor (un ordenador siempre encendido), Dokploy (panel para instalar programas con botones), la base de datos (la libreta donde se guardan precios y citas), n8n (el cerebro que atiende el WhatsApp) y este panel (lo que estás viendo).
1 El servidor (VPS) A MANO hecho
Qué es: un ordenador siempre encendido en internet. Se llama VPS. Ahí vive el sistema.
Cómo: contrata uno (Hetzner, DigitalOcean, OVH, Contabo…) con Ubuntu y al menos 4 GB de RAM. Apunta su IP (4 números, ej. 203.0.113.45) y su contraseña.
Para qué: es la casa donde se instala todo.
👉 Si ya tienes un servidor con Dokploy, salta al PASO 4.
¿Dónde veo la IP?
En el panel de tu proveedor, en la ficha del servidor, como "IPv4" o "IP pública".2 El dominio y las direcciones (DNS) A MANO hecho
Qué es: el dominio es el nombre (nulbix.com). El DNS es la guía que dice qué nombre lleva a qué servidor.
Cómo: en la web donde compraste el dominio, busca DNS / Zona DNS / Registros y añade un comodín por servidor. El comodín es un asterisco que vale para cualquier dirección. Para el primer servidor:
Tipo: A · Nombre/Host: *.s1 · Valor/Apunta a: (la IP de tu servidor) · TTL: 300
Para un segundo servidor, *.s2 con su IP; para el tercero, *.s3, etc. Así cada cliente vive en las direcciones de su servidor (ej. n8n-clinicajuan.s1.nulbix.com).
Para qué: para que internet encuentre cada cliente por su nombre y el candado de seguridad (🔒) se ponga solo.
¿El comodín rompe mi web (WordPress) de nulbix.com?
No. El comodín solo cubre subdominios que NO tienen su propia entrada. Tu web está ennulbix.com y www.nulbix.com, que tienen su entrada y no se tocan. Compruébalo: en tu DNS deben existir @ y www; y tras añadir el comodín, abre nulbix.com — si sigue cargando, perfecto.Si *.s1 da error
Algunos proveedores piden el nombre completo: prueba *.s1.nulbix.com.3 Instalar Dokploy A MANO hecho
Qué es: Dokploy es un panel con botones que instala programas en el servidor sin programar, y pone solo el candado de seguridad.
Cómo: entra al servidor con el botón de "consola"/"terminal" de tu proveedor (una pantalla de texto), pega esta línea y pulsa Enter:
curl -sSL https://dokploy.com/install.sh | sh
Cuando acabe, abre http://LA-IP-DEL-SERVIDOR:3000 y crea tu usuario. (Fuente: docs.dokploy.com.)
Para qué: a partir de aquí casi todo es con clics.
👉 Si ya tienes Dokploy, salta al PASO 4.
3.5 UNA SOLA VEZ para toda la empresa: subir el SISTEMA a un GitHub privado y conectarlo a Dokploy A MANO hecho
Qué es: para que el servidor pueda instalar el sistema, Dokploy lo lee de un repositorio. Subimos solo este sistema (código genérico, sin estudios, sin secretos, sin datos de cliente) a un repositorio privado. Es seguro porque aquí no hay nada tuyo confidencial.
Para qué: que desplegar un cliente sea elegir el repo y pulsar Deploy, en vez de copiar archivos a mano. Se hace una vez.
Cómo:
- Crea una cuenta gratis en github.com.
- Instala GitHub Desktop (programa con botones).
- En GitHub Desktop: File → Add local repository → elige la carpeta
nulbix-system→ Publish repository y márcalo Private (privado). Listo: solo el sistema está en tu repo privado. - En Dokploy → Settings → Git/Providers pulsa Connect GitHub y autoriza. (Fuente: Dokploy · Providers.)
¿Esto sube mis estudios o datos de clientes?
No. Este repositorio es solo el sistema (programa genérico). Tus estudios, decisiones y manuales están en OTRA carpeta y no se suben. Y los secretos/datos de cliente nunca van al repo (están bloqueados).4 Montar el sistema de un cliente (en Dokploy) A MANO hecho
Paso A — Genera el archivo de datos del cliente (botón)
Rellena las 2 casillas y pulsa. Te da el archivo de datos (.env) entero, con contraseñas ya creadas. Guarda el OPS_ADMIN_TOKEN, el N8N_ENCRYPTION_KEY y el BACKUP_GPG_PASSPHRASE.
🔐 ¿Cómo se entra al panel?
No hace falta ninguna contraseña en el archivo de datos. La primera vez que abras el panel de un cliente (ops-<cliente>...), te pedirá crear el usuario y la contraseña de administrador. A partir de ahí solo se puede iniciar sesión (el alta queda cerrada). Guarda esa contraseña bien: no hay recuperación por correo, solo este usuario podrá entrar.
Paso B — En Dokploy, crea el servicio del cliente
- Create Project → nombre del cliente (ej.
clinica-juan) → Create. - Dentro, Create Service → Compose. En la ventana: Name=
nulbix, Compose Type=Docker Compose, lo demás como esté → Create. - En Provider elige GitHub → tu repositorio
nulbix-system→ ramamain→ "Compose Path":docker-compose.yml
(Fuente: Dokploy · Docker Compose.) - En la pestaña Environment pega el archivo de datos del Paso A. Pega ya tu
ANTHROPIC_API_KEY(la del LLM); las de WhatsApp/Google se pegan en la fase 2 (tras Meta). - Pulsa Deploy y espera unos minutos (la primera vez "arma" todo). Cuando pare el texto, listo.
El cerebro viene puesto. Al desplegar, los flujos de n8n ya quedan importados y activos automáticamente, en modo sombra (lee y prepara respuestas, pero NO escribe a pacientes hasta el go-live). No tienes que entrar en n8n a importar ni configurar nada. Lo único manual son estas claves y los pasos de Meta.
Para qué: deja el sistema del cliente funcionando y aislado (su base de datos, su cerebro y su panel). El candado (🔒) lo pone Dokploy solo si el DNS del paso 2 ya apunta a ese servidor.
¿No debería ver yo los flujos creados en n8n?
Sí: tras el Deploy, si entras enn8n-<cliente>... verás wa-router, ig-router, recordatorio-24h, lista-espera, reactivación y las acciones de cita, todos activos. Si entras ANTES de pegar el archivo de datos y desplegar, n8n sale vacío (es normal): se llenan solos en el Deploy.¿Pisa mis otros n8n o mi otro dominio del servidor?
No. Cada cliente lleva su propio nombre (STACK) y direcciones propias. Tus otros proyectos siguen igual. Solo comparten la memoria del servidor (por eso 4 GB o más).No sale el candado / no carga
El DNS aún no apunta o falta el comodín de ESE servidor (paso 2). Espera unos minutos y comprueba que existe*.s1.nulbix.com → IP del servidor.5 Dar de alta el WhatsApp A MANO hecho
Esto se hace con Meta y tiene varios pasos. Está todo, detallado, en la pestaña 💬 WhatsApp (Meta) de arriba. Incluye el atajo del número de prueba para ver el sistema responder HOY sin esperar la verificación.
6 Conectar el WhatsApp con el sistema (webhook) A MANO hecho
Qué es: el "webhook" es un cable invisible que avisa a tu sistema cuando llega un WhatsApp.
Antes: pega en el archivo de datos de Dokploy tu WHATSAPP_TOKEN (token permanente) y deja el WHATSAPP_VERIFY_TOKEN que ya te generé, y pulsa Redeploy. Eso aplica las claves sin tocar n8n.
Cómo: en la App de Meta → WhatsApp → Configuration → Webhook, pega esta dirección (cambia el nombre del cliente y el servidor) y, como Verify Token, el valor de WHATSAPP_VERIFY_TOKEN del archivo de datos:
https://n8n-clinica-juan.s1.nulbix.com/webhook/wa-incoming
Meta hará una comprobación (GET) y el sistema le responde solo. Marca la casilla messages y guarda. (Fuente: WhatsApp Webhooks.)
Para qué: sin el cable, los mensajes llegan a WhatsApp pero el sistema no se entera.
¿Y la clave del LLM y la de Google?
La de Anthropic (ANTHROPIC_API_KEY) la pegaste ya en el paso 4. La de Google Calendar (GOOGLE_SA_JSON) se pega aquí, en fase 2, junto al token de WhatsApp, y se aplica con el mismo Redeploy. La generas en la pestaña 📋 Agenda y datos (subes el .json y te da la línea lista). Todas van en el archivo de datos (Environment) de Dokploy, nunca dentro de n8n.7 Cargar los datos del cliente AUTOMÁTICO hecho
Qué es: meter los precios y horarios reales (de ahí saca las respuestas, sin inventar).
Cómo: ve a la pestaña 👥 Clientes: rellena el formulario y sube los Excel de precios y horarios. Sin comandos. El formato exacto de los Excel está en la pestaña 📋 Agenda y datos.
8 Probar que responde un WhatsApp A MANO hecho
Desde tu móvil (registrado como número de prueba en Meta), manda un WhatsApp al número del sistema: "¿cuánto cuesta la limpieza facial?". Debe contestar con el precio real; y si preguntas algo que no sabe, debe decir que te pasa con una persona. Ese es el momento "funciona".
No contesta
Revisa: el webhook (paso 6) quedó verificado; en la pestaña Estado todo está en verde; y cargaste precios (paso 7).9 Pasar a real (cuando Meta verifique) A MANO hecho
Cuando Meta apruebe el negocio y el número, cambia del número de prueba al número real (pestaña Clientes). Luego: 5 días en silencio (lee pero no contesta; el dueño valida) y se enciende del todo. Desde el go-live corre la garantía.
10 Operación diaria: bandeja, probar agente y elegir modelo AUTOMÁTICO hecho
📨 Bandeja de Conversaciones
En la pestaña Conversaciones ves todos los chats de WhatsApp de un cliente. Puedes responder tú como humano (se envía por WhatsApp y queda marcado como humano) y, con el interruptor "Bot activo", apagar el bot en ESA conversación (el resto siguen automáticas). Cuando el agente deriva a una persona (handoff), apaga el bot de ese hilo solo; lo vuelves a encender cuando quieras desde la cabecera del chat.
🧪 Probar agente (sandbox)
En la pestaña Clientes → Probar agente chateas con el agente usando los datos reales del cliente sin enviar a WhatsApp ni agendar de verdad. Úsalo para validar el prompt/precios antes del go-live (equivale al "test en seco").
🤖 Elegir el modelo de IA
Por defecto usamos Claude Haiku 4.5 (barato y con buen uso de herramientas). En la pestaña 🤖 IA / Modelos eliges el modelo principal y hasta dos suplentes: si el principal falla, el sistema usa el siguiente solo. Puedes usar OpenRouter (cientos de modelos: GPT, Gemini, Llama…, incluidos gratis y openrouter/auto). Se aplica al momento, sin redeploy. En Probar agente comparas modelos al instante.
Lo único que va en el archivo de datos es la clave del proveedor (ANTHROPIC_API_KEY y/o OPENROUTER_API_KEY, de openrouter.ai/keys). Qué modelo usar se decide en el panel.
WhatsApp con Meta (directo, sin intermediarios)
Es la parte que más tarda (Meta verifica en 2-14 días). Empiézala el primer día. Coste: 0 € de alta; pagas a Meta solo por mensaje (los de servicio dentro de 24 h son gratis).
🧪 PROBAR HOY con el número de PRUEBA de Meta (paso a paso)
¿Tengo que entrar en n8n? NO. Los flujos ya están importados y activos. Tú solo: (A) pegas 2 claves en el archivo de datos, (B) das de alta el cliente con los identificadores del número, (C) conectas el webhook en Meta, (D) escribes un WhatsApp. Dónde va cada cosa que ya tienes:
| Lo que tienes | Dónde se pone |
|---|---|
| Access token (System User) | Archivo de datos (Dokploy → Environment): WHATSAPP_TOKEN |
| Clave secreta de la aplicación | Archivo de datos: WHATSAPP_APP_SECRET |
| ID del número de teléfono de prueba | Panel → Clientes → Phone number ID |
| ID de la cuenta de WhatsApp Business | Panel → Clientes → WhatsApp Business Account ID |
A) Pega las claves y Redeploy
En Dokploy → tu servicio → Environment, rellena (deja el WHATSAPP_VERIFY_TOKEN que ya viene generado) y pulsa Redeploy:
WHATSAPP_TOKEN=(tu access token del System User) WHATSAPP_APP_SECRET=(tu clave secreta de la app) ANTHROPIC_API_KEY=(tu clave de Anthropic, si no la pusiste ya)
Estas claves NO se ponen en n8n: van en el archivo de datos (Environment). El Redeploy las aplica solo.
B) Da de alta el cliente (pestaña Clientes)
- Rellena identificador, nombre, y los dos IDs de la tabla de arriba (Phone number ID y WABA ID).
- Sube un Excel de precios (si no, no tendrá qué contestar y derivará a persona).
- ⚠️ Clave para que CONTESTE: en la tabla de clientes pon Etapa = operacion (o
go_live). En etapas anteriores está en modo sombra: lee pero NO responde.
C) Conecta el webhook (Meta → tu App → WhatsApp → Configuration → Webhook)
- Callback URL (cambia cliente y servidor):
https://n8n-clinica-juan.s1.nulbix.com/webhook/wa-incoming
- Verify token: el valor de
WHATSAPP_VERIFY_TOKENde tu archivo de datos. - Pulsa Verify and save (Meta comprueba y el sistema responde solo).
- En Webhook fields, suscríbete a messages.
🔒 Opcional pero recomendado: blindar el webhook contra mensajes falsos
WHATSAPP_WEBHOOK_SECRET del archivo de datos (te sugiero uno en el comentario del propio archivo), haz Redeploy, y en Meta cambia la Callback URL para que termine en ?s=ESE-VALOR, p. ej.:
https://n8n-clinica-juan.s1.nulbix.com/webhook/wa-incoming?s=TU_WHATSAPP_WEBHOOK_SECRETPulsa Verify and save otra vez y manda un WhatsApp de prueba. Si dejas
WHATSAPP_WEBHOOK_SECRET vacío, no se exige nada (como hasta ahora). El tope de gasto (que ya está activo) limita el abuso aunque no lo actives.👉 ANTES de pulsar "Verify and save", comprueba que el webhook está vivo. Abre PowerShell en tu PC, cambia el dominio y pega tu WHATSAPP_VERIFY_TOKEN, y ejecuta:
$h="n8n-clinica-juan.s1.nulbix.com"; $t="PEGA_TU_WHATSAPP_VERIFY_TOKEN"; (iwr "https://$h/webhook/wa-incoming?hub.mode=subscribe&hub.verify_token=$t&hub.challenge=test123").Content
- Si responde
test123→ el webhook está vivo y el token coincide: Meta validará sin problema. ✅ - Si da 404 ("workflow must be active") → los flujos no están activos en n8n. Comprueba que en el archivo de datos de Dokploy está la
N8N_API_KEY(se crea en n8n → Settings → n8n API; sin ella n8n 2.x deja los flujos en borrador) y haz Redeploy; al desplegar se publican solos. Vuelve a probar. - Si responde vacío → el token NO coincide: el
WHATSAPP_VERIFY_TOKENdel archivo de datos de Dokploy y el Verify token de Meta deben ser la misma palabra; corrígelo, Redeploy y reintenta.
Meta dice "No se ha podido validar la URL de devolución de llamada ni el identificador de verificación"
Es exactamente uno de los 3 casos de arriba. La verificación de Meta es un GET a tu webhook conhub.challenge; tu sistema debe devolver ese valor. Si el GET de prueba de arriba no te devuelve test123, Meta tampoco podrá validar. Orden de revisión: (1) ¿el dominio responde? (2) ¿hiciste Redeploy con los flujos activos? (404 = no activos) (3) ¿el verify token es idéntico en Dokploy y en Meta? (vacío = no coincide). El aviso amarillo de Meta de "app no publicada" NO impide validar el webhook ni probar con el número de prueba.
D) Envía el WhatsApp de prueba
- En API Setup, añade tu móvil como destinatario de prueba (Meta lo pide una vez).
- Desde TU móvil escribe al número de prueba: "¿cuánto cuesta la limpieza facial?".
- Debe contestarte con el precio real; si preguntas algo que no sabe, debe decir que te pasa con una persona.
- Compruébalo también en la pestaña 📨 Conversaciones (ahí ves el hilo y puedes responder tú).
Antes de tocar Meta, prueba sin WhatsApp: Clientes → 🧪 Probar agente, escribe esa pregunta y mira que responde bien. Si ahí va, el WhatsApp irá.
No me contesta — checklist
1) ¿Etapa = operacion/go_live? (si no, está en sombra y no envía).2) ¿Pegaste
WHATSAPP_TOKEN y diste Redeploy?3) ¿El webhook quedó verificado y suscrito a messages?
4) ¿El Phone number ID del alta coincide EXACTO con el del número de prueba?
5) Mira 📨 Conversaciones: si ves tu mensaje ENTRANTE, el webhook va bien y el fallo está en el envío (revisa el token); si NO aparece, el fallo está en el webhook (pasos C).
1 Crear la cuenta de empresa del cliente
- Entra en business.facebook.com y crea una cuenta de empresa con el nombre del cliente (no Nulbix).
- En Configuración del negocio → Información del negocio, pon los datos legales del cliente exactamente como en sus documentos (deben coincidir en la verificación).
2 Verificar el negocio (🔴 Meta tarda 2-14 días)
Centro de seguridad → Verificación del negocio → Iniciar. Sube del cliente: CIF/registro mercantil, documento fiscal y una factura o extracto con el nombre y dirección. Todo debe coincidir con el paso 1. Envía y espera. (Fuentes: zaple.ai/blog/meta-business-verification-whatsapp, interakt.shop/whatsapp-business-api/account-approval.)
3 Crear la App y el producto WhatsApp
- En developers.facebook.com → My Apps → Create App → tipo Business → asóciala a la cuenta de empresa del paso 1.
- Add Product → WhatsApp → Set up.
- En WhatsApp → API Setup verás un número de prueba gratis, un token temporal, el Phone number ID y el WhatsApp Business Account ID.
ATAJO para ver que funciona HOY: con el número de prueba, añade tu móvil como destinatario de prueba y ya puedes mandar/recibir sin esperar la verificación. Úsalo para el primer "funciona".
Genera un token permanente: Business Settings → System Users → crea uno tipo Admin → Generate token → permisos whatsapp_business_messaging y whatsapp_business_management. Guárdalo en sitio seguro (no en el chat ni en el repo). (Fuente: WhatsApp Cloud API · Get Started.)
4 Número real + nombre para mostrar (🔴 cuando verifique)
- En API Setup → Add phone number. Pon el display name (nombre comercial real; Meta lo revisa 1-2 días, hasta 14).
- Verifica el número por SMS o llamada; crea el PIN de 6 dígitos (guárdalo).
- Cuando el display name esté aprobado, el número queda Connected. Añade un método de pago (sin él no envía en producción).
- Apunta el Phone number ID y el WhatsApp Business Account ID: van en la pestaña Clientes.
El número ya tiene WhatsApp
Bórralo del móvil (Ajustes → Cuenta → Eliminar cuenta) y reintenta. Si no, Meta no lo deja.5 Plantillas de mensaje (🔴 aprobación 24-48 h)
Son obligatorias para escribir al paciente fuera de la ventana de 24 h (recordatorios, lista de espera, reactivación). El sistema ya las trae preparadas; solo hay que enviarlas a aprobación en WhatsApp Manager → Plantillas (o por API). Categorías: recordatorio/confirmación/reagenda/hueco = Utility; reactivación = Marketing. (Fuente: Message Templates.)
Agenda del cliente y formato de los datos
📅 Conectar la agenda: Google Calendar CLIENTE
Qué es: que el sistema lea huecos y cree citas en el calendario del cliente, sin contraseñas, con una "cuenta de servicio".
Tú (una vez): en console.cloud.google.com crea un proyecto → habilita Google Calendar API → Credenciales → Cuenta de servicio → crea una clave JSON (guárdala segura, va al servidor, no al repo). Apunta el email de la cuenta de servicio. (Fuente: Google Calendar API.)
El cliente (dueño): en su Google Calendar → Configuración → Compartir con personas → añade ese email con permiso "Hacer cambios en los eventos". Copia el ID del calendario (lo necesitas en la pestaña Clientes).
Recomendado: un calendario por profesional (o uno "Citas Nulbix"), compartidos con la cuenta de servicio.
📥 ¿Ya tienes el .json? Genera aquí la línea para Environment
Sube el archivo .json de la cuenta de servicio y te genero la línea GOOGLE_SA_JSON='…' tal cual para pegar en Dokploy → Environment (luego pulsa Redeploy). El archivo no sale de tu navegador: se procesa aquí, no se sube a ningún servidor.
Recuerda: el ID del calendario NO es esto; va en Clientes → Profesional → "ID calendario Google". El correo de la cuenta de servicio solo sirve para compartir el calendario.
💶 Formato del Excel de PRECIOS (precios.csv)
Columnas (primera fila = cabecera):
servicio,descripcion_corta,precio_eur,duracion_min,ciclo_repeticion_dias Depilación láser axilas,Sesión individual,45,20,42 Botox tercio superior,Aplicación,320,30,150 Mesoterapia facial,Sesión,90,45,30
Si un servicio no tiene precio cerrado, deja precio_eur vacío: el sistema derivará a una persona (no inventa). ciclo_repeticion_dias = cada cuántos días toca repetir (para la reactivación).
🕒 Formato del Excel de HORARIOS (horarios.csv)
profesional,dia_semana,hora_inicio,hora_fin,tipo Dra. Ana,0,10:00,14:00,atencion Dra. Ana,0,16:00,20:00,atencion Laura,1,10:00,18:00,atencion
dia_semana: 0=lunes … 6=domingo. tipo: atencion (citas normales) o asesoramiento (huecos para la llamada de fuera de horario). profesional debe coincidir con el nombre que pusiste en la ficha del cliente.
🗣️ Tono, FAQ y reglas (lo pegas en la ficha del cliente)
Del cliente, recoge también: tono (cercano/formal, tuteo/usted), preguntas frecuentes reales con su respuesta, qué temas van siempre a persona (urgencias, dudas médicas, quejas) y quién recibe los avisos cuando la IA pasa a una persona.
Clientes
+ Nuevo cliente (o editar)
Rellena y pulsa Crear / guardar. Crea el cliente de verdad. Luego sube los Excel.
Datos del WhatsApp (de "API Setup" de Meta)
Profesionales y su calendario de Google
📄 Subir precios y horarios (Excel/CSV)
Crea antes el cliente. Formatos en la pestaña "Agenda y datos".
🧪 Probar agente (sandbox, sin WhatsApp)
Chatea con el agente usando los datos REALES del cliente, sin enviar nada a WhatsApp ni agendar de verdad. Ideal para validar el prompt/precios antes del go-live y comparar modelos.
El selector de modelo es solo para esta prueba. El modelo (y los suplentes) de producción se eligen en la pestaña 🤖 IA / Modelos, y se aplican sin redeploy. La clave de OpenRouter (OPENROUTER_API_KEY) sí va en el archivo de datos.
Clientes dados de alta
| Cliente | Servidor | Etapa | Precios | Estado | Acciones |
|---|
Conversaciones (bandeja de entrada)
Lee los chats de WhatsApp, responde tú como humano y enciende/apaga el bot por conversación. Necesitas tu clave de administrador (pestaña Clientes).
Estado del sistema
Comprueba de un vistazo que todo está bien.
IA · Modelos (principal y suplentes)
Elige el modelo principal y hasta dos suplentes. Si el principal falla (clave caída, límite alcanzado o caída del proveedor), el sistema usa el siguiente automáticamente. Se aplica al momento, sin redeploy. Necesitas tu clave de administrador (pestaña Clientes).
Anthropic: claude-haiku-4-5 (recomendado, barato y con buen uso de herramientas). OpenRouter: un único acceso a cientos de modelos; incluye openrouter/auto (elige uno por ti) y modelos :free. Truco: pon un modelo gratis como suplente para no quedarte nunca sin servicio. Para probar un modelo suelto sin guardarlo, usa Clientes → 🧪 Probar agente.
Dudas y continuidad
🔄 Actualizar el sistema SIN borrar el proyecto
No tienes que borrar nada ni empezar de cero. Para aplicar cualquier cambio (nuevas funciones, arreglos, cambios de base de datos):
- Sube los cambios a tu GitHub (con GitHub Desktop, "Push").
- En Dokploy, en el servicio del cliente, pulsa Redeploy. Ya está.
Por qué es seguro ahora: en cada Redeploy el sistema:
- Aplica los cambios de base de datos automáticamente (migrador idempotente: añade lo nuevo sin tocar tus datos). No se pierde nada.
- Reimporta y reactiva los flujos de n8n (actualiza los que cambien, sin duplicar).
- Aplica las nuevas variables del archivo de datos.
Un cliente nuevo se sigue creando desde cero igual (todo se crea solo en el primer deploy).
Solo borrarías el proyecto si quieres empezar limpio a propósito (perderías los datos de ese cliente). Para el día a día: Push → Redeploy.
¿Y si cambié el archivo de datos (claves, modelo…)?
Edita el Environment en Dokploy y pulsa Redeploy: se aplican sin tocar n8n. No hace falta borrar nada.💾 Copias de seguridad: ¿dónde y cómo se hace el respaldo de los clientes?
Qué se respalda: cada noche, el sistema vuelca toda la base de datos (datos de tus clientes: precios, citas, conversaciones, mensajes… y el estado de n8n), la comprime, la cifra y la sube fuera del servidor. Si el VPS muere, tus datos están a salvo en otro sitio.
Dónde se guardan: en un bucket de almacenamiento S3 que tú controlas. Recomendado: Cloudflare R2 o Backblaze B2 (ambos con tier gratis de sobra para esto). No depende de un proveedor concreto.
Cómo activarlo (una vez por servidor)
- Crea una cuenta en R2 o B2 y un bucket (ej.
nulbix-backups). - Genera una clave de acceso (Access Key ID + Secret) para ese bucket.
- En el archivo de datos (Dokploy → Environment) rellena el bloque de copias y pulsa Redeploy:
OFFSITE_REMOTE=offsite:nulbix-backups/clinica-juan RCLONE_PROVIDER=Cloudflare RCLONE_ACCESS_KEY_ID=(tu access key) RCLONE_SECRET_ACCESS_KEY=(tu secret) RCLONE_ENDPOINT=https://<tu-cuenta>.r2.cloudflarestorage.com BACKUP_GPG_PASSPHRASE=(ya te la genera el panel; guárdala APARTE)
Hecho. A partir de ahí hay copia cada noche (por defecto 03:15) y se conservan los últimos 14 días. Mientras no lo configures, el aviso del panel te recuerda que la copia es solo local.
Cómo restaurar (en el mismo VPS o en uno nuevo)
Levanta el stack y ejecuta (desde la consola de Dokploy del servicio, o por SSH):
docker compose exec backup sh /restore.sh nulbix-clinica-juan-2026-06-02-0315.sql.gz.gpg
Trae la copia del bucket, la descifra y la restaura. Para cambiar de proveedor de VPS: instala Docker, clona el repo, pon el mismo .env y restaura. Servicio recuperado en ~15-30 min.
N8N_ENCRYPTION_KEY y el BACKUP_GPG_PASSPHRASE de cada cliente, fuera del servidor. Sin ellos, las copias no se pueden recuperar. Y prueba una restauración una vez al mes (una copia que no se ha probado no es una copia).
¿Un backup por cliente o uno para todos?
Con el modelo actual (stack por cliente), cada cliente respalda su propia base a su carpeta del bucket (.../<stack>). Si consolidas a un stack compartido multi-tenant, sería una sola copia con todos los clientes (más simple de gestionar).? Varios servidores: ¿cómo apunto el dominio a todos?
Un *.nulbix.com no puede ir a varios servidores. Usa un comodín por servidor:
*.s1.nulbix.com → IP servidor 1 *.s2.nulbix.com → IP servidor 2 *.s3.nulbix.com → IP servidor 3
Cada cliente vive en las direcciones de su servidor. Añadir un servidor = 1 registro. En "Clientes" ves en qué servidor está cada uno.
? ¿El comodín rompe mi WordPress?
No. Solo cubre subdominios sin entrada propia. nulbix.com y www tienen la suya. Compruébalo viendo las entradas @ y www en tu DNS, y abriendo nulbix.com después.
? Mi servidor ya tiene otros n8n y otro dominio. ¿Problema?
Ninguno. Cada cliente es un proyecto independiente con su nombre y direcciones. Lo único compartido es la memoria: en 8 GB caben ~8-12 clínicas pequeñas; cuando se llene, abres otro servidor.
? ¿Y si se cae un servidor un sábado y dejo clientes sin servicio?
- Ahora (gratis): los programas se reinician solos; hay copias automáticas guardadas fuera del servidor y un aviso si algo cae. Si el servidor muere del todo, se restaura en 15-30 min (pero actúas tú).
- De pago, transparente (recomendado con 5-10 clientes de pago): base de datos gestionada (los datos sobreviven a la caída) + plataforma que se recoloca sola (Render/Railway/Fly o Dokploy en clúster). Se recupera sin que hagas nada.
- Externalizado: una empresa lo vigila y arregla por ti.
Como todo está "encajonado" (contenedores) y los datos en un único sitio con copias, subir de nivel no obliga a rehacer nada.
🔒 Seguridad: ¿qué se sube y qué no?
- El panel exige iniciar sesión: la primera vez pides crear el usuario y la contraseña de administrador (una sola vez); después, cada visita y cada acción exigen esa sesión iniciada. La contraseña se guarda cifrada (scrypt), nunca en claro. Sin sesión, nadie ve clientes, conversaciones ni datos de pacientes. Tras varios intentos fallidos, se bloquea unos minutos.
- Nunca se suben: contraseñas, claves, JSON de Google, ni datos de pacientes. Viven solo en el servidor (Environment) y en copias cifradas.
- El repositorio del sistema es privado y solo tiene código genérico (sin tus estudios ni estrategia).
- Tus estudios, decisiones y manuales internos están en OTRA carpeta y no se suben.
€ ¿Cuánto cuesta?
- Servidor: desde ~5-10 €/mes (aguanta varios clientes).
- Programas (Dokploy, base de datos, n8n, este panel): gratis.
- WhatsApp: casi 0 € en pruebas; céntimos por recordatorio en uso real.
- La IA: el único gasto que sube con el uso, céntimos a pocos euros/mes por clínica, con tope.