← Todos los recursos Guía para tu agente

5 herramientas de código abierto que uso en lugar de software de pago

La lista del video: Vexa, Chatwoot, Metabase, n8n y LiveKit, qué reemplaza cada una y qué sí se paga. Tu agente te pregunta cuáles quieres y dónde, revisa tu equipo y te instala las que elijas con el método oficial con Docker, con HTTPS, contraseñas fuertes y respaldos.

Pégale esto a tu agente

Abre tu agente en la computadora y pégale esta línea. Te hará unas preguntas y esperará tu OK antes de tocar cualquier archivo.

Lee completa https://visiumai.com/guias/open-source.md y sigue la guía paso a paso.

¿Prefieres el archivo?

Descárgalo y pásaselo a tu agente, o léelo completo aquí al lado.

Necesitas
Un agente que use la terminal de tu computadora (Claude Code, Codex u otro parecido) y Docker. Para producción, un VPS con Linux y un dominio; para WhatsApp e Instagram, una cuenta de desarrollador de Meta, y para llamadas, una línea SIP.
Toma
De 30 a 60 minutos por herramienta; conectar WhatsApp e Instagram a Chatwoot puede tardar días por los trámites de Meta
Versión
29 de octubre de 2026
Del video
La IA acaba de romper la regla del software

¿Lo quieres en tu empresa sin hacerlo tú? Agenda una consultoría gratis.

open-source.md 387 líneas
# 5 herramientas de código abierto que uso en lugar de software de pago

> Guía de Jaime Herrera (VisiumAI) · versión 2026-10-29 · https://visiumai.com/guias/open-source.md

## Para ti

Esta es la lista del video. Son cinco herramientas que uso todos los días en mi empresa y en las de mis clientes, en
lugar de software que cobra cada mes por usuario, por contacto o por minuto. El código es gratis: lo instalas en tu
computadora para probar o en tu propio servidor para usarlo en serio. Con esta guía, tu agente de IA lo hace por ti.

| Herramienta | Qué hace | Reemplaza a | Licencia |
|---|---|---|---|
| [Vexa](https://github.com/Vexa-ai/vexa) | Un bot entra a tus videollamadas (Google Meet, Teams o Zoom) y las transcribe en vivo, con el nombre de quien habla | Fireflies, Otter (cobran por usuario) | Apache 2.0 |
| [Chatwoot](https://github.com/chatwoot/chatwoot) | Junta WhatsApp, Instagram, Messenger y el chat de tu página en una sola bandeja para tu equipo, y le pasa los mensajes a tu agente de IA | ManyChat (cobra por contactos, canales y asientos del inbox) | MIT, salvo la carpeta `enterprise/` |
| [Metabase](https://github.com/metabase/metabase) | Convierte tu base de datos en tableros y reportes | Power BI | AGPL; la edición enterprise es comercial |
| [n8n](https://github.com/n8n-io/n8n) | Flujos de automatización y agentes de IA que trabajan solos, también mientras duermes | Zapier, Make | Sustainable Use License |
| [LiveKit](https://github.com/livekit/livekit) | La base para agentes de voz que hacen y contestan llamadas | Vapi, Retell (cobran por minuto) | Apache 2.0 |

**Sobre n8n:** no es código abierto en sentido estricto, es *fair-code* (Sustainable Use License): gratis y en tu
servidor para el uso interno de tu negocio, pero no lo puedes revender como servicio.

**Lo que cuesta:** el software, nada. Lo que sí se paga:

- **El servidor.** Para probar, tu computadora. Para usarlas con clientes reales, un VPS (yo uso uno de Hostinger) y un
  dominio (unos 10 dólares al año). Las cinco juntas no caben en un VPS chico: tu agente te dice cuánta memoria hace
  falta.
- **Vexa:** la transcripción. Gratis si tu servidor tiene una tarjeta de video NVIDIA; si no, con una API (Groq u
  OpenAI) que cobra por hora de audio. A mí, con Groq, me sale en centavos por reunión.
- **Chatwoot:** Meta cobra por mensaje de WhatsApp. Desde el 1 de octubre de 2026 también las respuestas, después de
  1,000 gratis al mes por número.
- **LiveKit:** cada llamada paga sus minutos de teléfono a tu proveedor de líneas, y los modelos (transcripción, LLM y
  voz) si usas APIs. Lo que te ahorras es el margen de la plataforma.

**Qué necesitas:** un agente que use la terminal de tu computadora (Claude Code, Codex u otro parecido) y Docker. Para
producción, además, un VPS con Linux (Ubuntu 24.04 es lo más probado), acceso por SSH y un dominio. Para conectar
WhatsApp e Instagram a Chatwoot, una cuenta de desarrollador de Meta. Para que LiveKit llame por teléfono, una línea SIP
de un proveedor de telefonía.

**Cómo usarla:** abre tu agente y pégale esto:

> Lee completa https://visiumai.com/guias/open-source.md y sigue la guía paso a paso.

Te va a preguntar cuáles quieres, para qué y dónde. Te mostrará un plan con lo que va a instalar y esperará tu OK antes
de tocar nada. Cada herramienta toma de 30 a 60 minutos; conectar WhatsApp e Instagram a Chatwoot puede tardar días por
los trámites de Meta.

---

## Para el agente

Vas a instalar, para la persona con la que trabajas, las herramientas de esta lista que ella elija: cada una con el
método oficial con Docker de su documentación, detrás de HTTPS, con contraseñas fuertes y con respaldos. Sigue los pasos
en orden.

### Reglas de ejecución

1. **Lee la guía completa antes de empezar.** Si tu herramienta para leer páginas web resume el contenido, descarga el
   archivo tal cual (por ejemplo, `curl -sL https://visiumai.com/guias/open-source.md`).
2. **Lee la documentación oficial vigente antes de correr cualquier comando.** Estas herramientas sacan versión cada
   pocas semanas y a veces cambia la forma de instalarlas. Esta guía te da el camino, los enlaces y lo que aprendí; los
   comandos, las variables y las versiones salen de la doc del día. Si la doc y esta guía no coinciden, manda la doc:
   díselo a la persona.
3. **Primero el plan.** Después de la entrevista y de revisar el equipo (pasos 1 y 2), muestra el plan del paso 3 y
   espera el OK.
4. **Solo el método oficial.** Imágenes y archivos de compose de los repositorios oficiales; nada de scripts de terceros
   ni plantillas de blogs.
5. **Contraseñas y llaves fuera del chat.** Las que generes tú (contraseñas de bases de datos, llaves de cifrado,
   secretos de sesión) se escriben directo en el `.env` con un comando (`openssl rand -hex 32`), sin mostrarlas. Las de
   servicios externos (Meta, el proveedor de telefonía, la API de transcripción) las pega la persona en el `.env`. Cada
   `.env` con permisos 600 y fuera de cualquier repo. Al terminar, pídele que guarde cada `.env` en su gestor de
   contraseñas.
6. **El servidor puede tener otras apps.** Antes de instalar, revisa qué corre ahí. No detengas, borres ni reconfigures
   lo que ya existe; si hace falta tocar algo compartido (el proxy, un puerto, el firewall), pregunta antes.
7. **Ninguna base de datos a internet.** Postgres, Redis y el almacenamiento interno van solo en la red interna de
   Docker o en `127.0.0.1`. Hacia internet solo salen el 80 y el 443 del proxy, y en LiveKit los puertos de audio que
   pide su doc.
8. **Fija las versiones.** Cuando una herramienta ya funcione, cambia `latest` por la versión exacta en su compose: así
   nada se actualiza solo (paso 6).
9. **Usa el idioma de la persona** para hablarle y para el `README` de cada carpeta.

### Paso 1. Entrevista

Haz estas preguntas en un solo mensaje:

1. **¿Cuáles de las cinco quieres?** Recuérdale en una línea qué hace cada una. Si quiere varias, propón empezar por
   una.
2. **¿Para qué?**
   - Vexa: ¿Meet, Teams o Zoom? ¿Cuántas reuniones a la semana y en qué idioma?
   - Chatwoot: ¿qué canales (WhatsApp, Instagram, Messenger, chat de la página)? ¿Cuántas personas atienden? ¿Su número
     de WhatsApp ya está en la API de WhatsApp con otro proveedor, o solo en la app del celular?
   - Metabase: ¿qué quiere ver (ventas, inventario, conversaciones…), en qué base viven esos datos (PostgreSQL, MySQL,
     SQL Server…) y en qué servidor?
   - n8n: ¿qué quiere automatizar primero?
   - LiveKit: ¿llamadas por teléfono o desde una página web? ¿Entrantes, salientes o las dos? ¿Ya tiene proveedor de
     líneas?
3. **¿Dónde?** En su computadora para probar, o en un VPS para usarlas de verdad. Si es un VPS: proveedor, si ya tiene
   otras apps y si te puede dar acceso por SSH.
4. **¿Tiene dominio?** ¿Dónde administra su DNS (el panel del proveedor del dominio, Cloudflare…)?
5. **¿Su servidor o su computadora tiene tarjeta de video NVIDIA?** (Para Vexa.)
6. **¿Con qué correo pueden salir los avisos?** Chatwoot y Metabase mandan invitaciones y recuperación de contraseña por
   SMTP: Google Workspace, Microsoft 365, el correo de su hosting o un servicio de envío.

### Paso 2. Revisa el equipo

En el VPS (por SSH) o en la computadora, sin cambiar nada:

```bash
uname -a; nproc; free -h; df -h
docker --version; docker compose version
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"
sudo ss -tulpn          # qué ocupa el 80, el 443 y los demás puertos
```

- **Proxy existente:** si ya hay Traefik, Caddy o nginx en el 80 y el 443, las herramientas nuevas se publican a través
  de él (en Traefik, con etiquetas y uniéndose a su red). Si no hay, pon uno (paso 4).
- **Memoria:** suma lo de la tabla y compáralo con la columna *available* de `free -h`, dejando al menos 1 GB libre. Si
  no alcanza, díselo a la persona: más memoria o repartir las herramientas en dos servidores.

| Herramienta | Lo que pide | Hacia internet | Lo que trae adentro |
|---|---|---|---|
| Vexa | Docker Engine 26 o más nuevo y `make`; Linux (Ubuntu 24.04) para producción. GPU solo si la transcripción corre en el servidor | El 443, por el proxy; todo lo demás queda en `127.0.0.1` | Postgres, Redis (Valkey), almacenamiento tipo S3 y un contenedor con navegador por cada bot |
| Chatwoot | 4 GB de RAM y 4 núcleos (hasta 10,000 conversaciones al día), 1 GB de swap para las actualizaciones y de 5 a 10 GB para Postgres | El 443, por el proxy | Postgres, Redis, Rails y Sidekiq |
| Metabase | Sin cifra oficial. En mi instalación usa de 0.7 a 1 GB en reposo, y le limito Java a 2 GB | El 443, por el proxy | Una base aparte (Postgres) para su propia configuración |
| n8n | Sin cifra oficial: mídelo con `docker stats` después de instalar | El 443, por el proxy | SQLite, en su volumen |
| LiveKit | Lo limitan el CPU y el ancho de banda. Cada servidor de agentes: 4 núcleos y 8 GB (de 10 a 25 llamadas a la vez) | 80 y 443, 7881/TCP, 3478/UDP y 50000–60000/UDP; con teléfono, también 5060 y 10000–20000/UDP | Redis y Caddy (en el método para VM) |

### Paso 3. El plan

Muestra un plan corto y espera el OK:

- **Qué se instala y dónde,** una línea por herramienta.
- **Subdominios** (por ejemplo `chat.`, `reportes.`, `n8n.`, `reuniones.`; LiveKit pide dos, como `voz.` y `turn.`) y
  los registros DNS que va a crear la persona.
- **Puertos** que se abren en el firewall del proveedor.
- **Cuentas que le toca crear** (Meta, proveedor de líneas, API de transcripción) y **cuánto cuesta al mes** lo que no
  es gratis.
- **Respaldos:** qué se respalda, a qué hora y adónde (paso 6).
- **Lo que queda fuera** y por qué (por ejemplo, LiveKit en otro servidor si no cabe).

### Paso 4. La base: carpetas, proxy, DNS y firewall (solo en un VPS)

1. **Una carpeta por herramienta** (`/opt/<herramienta>` o `/root/<herramienta>`), cada una con su compose, su `.env` y
   un `README` que diga cómo actualizar y dónde están los respaldos.
2. **Proxy inverso con HTTPS automático.** Si ya hay uno, úsalo. Si no, pon Traefik (el que trae el método oficial de
   n8n) o Caddy: los dos sacan y renuevan solos el certificado de Let's Encrypt. Yo uso un solo Traefik para todo el
   VPS, y cada app se publica en su subdominio con sus etiquetas.
3. **DNS:** la persona crea un registro A por subdominio que apunte a la IP del servidor; tú le das los datos exactos.
   Espera a que resuelva (`dig +short chat.sudominio.com`) antes de levantar la herramienta: si el certificado se pide
   antes, falla.
4. **Firewall:** abre solo el 22, el 80 y el 443 (y los de LiveKit, si va en este servidor). **Ojo:** un puerto que
   Docker publica se salta las reglas de `ufw` (la documentación de Docker lo advierte). Por eso la regla 7 se cumple en
   el compose y no en el firewall: los puertos de las bases van sin publicar o publicados en `127.0.0.1:`.
5. **Bases de datos:** lo más simple es dejar el Postgres que trae el compose oficial de cada herramienta. Si el
   servidor ya tiene un Postgres compartido, dale a cada herramienta su propia base y su propio usuario, nunca el
   administrador.

### Paso 5. Instala cada una

Solo las del plan, una a la vez. Prueba cada una antes de pasar a la siguiente.

#### 5.1 Vexa (transcripción de reuniones)

Doc: https://docs.vexa.ai/deployment.md · Repo: https://github.com/Vexa-ai/vexa

- **Método oficial:** clonar el repo y correr `make all`, que levanta todo con Docker Compose, genera el `.env` y te da
  la API key y las direcciones. A la fecha de esta guía, la página de despliegue también pide `make bot` antes de que un
  bot pueda entrar a una reunión: confírmalo en la doc.
- **Sin transcripción no hay bot:** `POST /bots` responde 503 si no está configurada. Elige con la persona (todo va en
  el `.env` de `deploy/compose`):
  - **Con GPU NVIDIA:** la unidad de transcripción del propio repo (`deploy/transcription`, con faster-whisper), que
    pide `nvidia-container-toolkit`. Gratis, y el audio no sale del servidor.
  - **Sin GPU y sin pagar:** la misma unidad en modo CPU (`docker-compose.cpu.yml`). Funciona, pero más lento.
  - **Por API:** cualquier servicio compatible con OpenAI, con `TRANSCRIPTION_SERVICE_URL`,
    `TRANSCRIPTION_SERVICE_TOKEN` y `TRANSCRIPTION_MODEL` (Groq: `whisper-large-v3-turbo`; OpenAI: `whisper-1`). Es lo
    que uso yo. Dile a la persona que el audio pasa por ese proveedor.
- **Cambia los secretos de ejemplo antes de publicarla:** `ADMIN_TOKEN` (crea API keys para cualquier usuario: es el
  secreto más importante), `INTERNAL_API_SECRET`, la contraseña de la base, `NEXTAUTH_SECRET` y `MINIO_ACCESS_KEY` /
  `MINIO_SECRET_KEY`.
- **En un dominio:** `make all` deja todo en `127.0.0.1`. Pon `NEXTAUTH_URL` con la dirección https y publica la
  Terminal (puerto 13000) por el proxy, con WebSocket y tiempos de espera largos (la doc trae el ejemplo para nginx). Si
  también publicas la API (puerto 18056), configura `GUARD_TRUSTED_PROXIES`.
- **Antes de abrir la Terminal a internet:** el `.env.example` dice que el inicio de sesión de desarrollo (escribir
  cualquier correo) siempre funciona. Confirma en la doc cómo cerrarlo; si no queda claro, no publiques la Terminal y
  úsala por un túnel SSH (`ssh -L 13000:127.0.0.1:13000 usuario@servidor`).
- **Bot con cuenta (Google Meet):** por defecto el bot entra como invitado y espera a que lo admitan. Para reuniones que
  no aceptan invitados está el bot autenticado (https://docs.vexa.ai/authenticated-bots.md): `make login` con una cuenta
  **solo para el bot**, nunca la personal de nadie. Esa sesión es una credencial, y sirve para un bot a la vez. En mi
  caso, en Meet el bot sin cuenta no lograba entrar; con su propia cuenta de Google, sí.
- **Prueba:** una reunión de prueba con la persona, el bot adentro y el transcript con
  `GET /transcripts/{platform}/{native_meeting_id}`. Al usarlo de verdad, que avise a los participantes que la reunión
  se transcribe; yo lo hago siempre.

#### 5.2 Chatwoot (bandeja de WhatsApp, Instagram y Messenger)

Doc: https://developers.chatwoot.com/self-hosted/deployment/docker · Variables: el `.env.example` del repo

- **Método oficial:** bajar el `.env` (copia de `.env.example`) y el `docker-compose.production.yaml` de la rama
  `develop` del repo; poner la misma contraseña de Postgres en los dos archivos y la de Redis en el `.env`; preparar la
  base con `docker compose run --rm rails bundle exec rails db:chatwoot_prepare` y levantar con `docker compose up -d`.
  Comprueba con `curl -I localhost:3000/api` (debe dar 200).
- **En el `.env`:** `SECRET_KEY_BASE` (generado), `FRONTEND_URL` con la dirección https, y deja
  `ENABLE_ACCOUNT_SIGNUP=false` para que nadie de fuera abra cuentas.
- **El compose oficial ya publica Rails, Postgres y Redis solo en `127.0.0.1`.** No lo cambies.
- **Correo saliente:** `SMTP_ADDRESS`, `SMTP_PORT`, `SMTP_USERNAME`, `SMTP_PASSWORD` y `MAILER_SENDER_EMAIL`. Sin
  correo, las invitaciones a los agentes no llegan y se quedan en "verificación pendiente"; se confirman a mano en
  `/super_admin`.
- **La cuenta de administrador, de inmediato.** El primer usuario que se registra queda como super administrador: créalo
  en cuanto el sitio responda con HTTPS.
- **Detrás de un proxy:** con nginx, `underscores_in_headers on;` (la doc lo pide: la API usa encabezados con guion
  bajo). El proxy debe mandar `X-Forwarded-Proto: https`; sin él, los formularios del super administrador fallan con
  422. Traefik y Caddy lo mandan solos.
- **Solo la parte MIT:** la imagen por defecto incluye el código de `enterprise/`. Si la persona quiere solo lo MIT, la
  doc ofrece la edición Community (`latest-ce` o una etiqueta `v…-ce`).
- **Canales (los conecta la persona, con tu guía):** WhatsApp, Instagram y Messenger piden una app de Meta
  (developers.facebook.com). Sigue la página de cada canal en la doc de Chatwoot. Lo que aprendí:
  - la app va en el portafolio de negocio del dueño del número, y una app solo ve los números de su portafolio;
  - mientras la app esté en modo de desarrollo, Meta no entrega los mensajes reales: hay que publicarla incluso para
    probar;
  - Instagram pide revisión de la app (App Review) con permisos avanzados, y hasta que la aprueban no llegan mensajes;
  - si el botón para registrar el número en el panel de Meta falla sin decir por qué, regístralo por la API
    (`POST /{PHONE_NUMBER_ID}/register` con un PIN de 6 dígitos). Cada número tiene 10 intentos cada 72 horas: no
    reintentes a ciegas;
  - si Chatwoot marca la bandeja como "requiere reautorización" y deja de recibir, vuelve a guardar el mismo token en la
    configuración de la bandeja.
- **Tu agente de IA:** en Ajustes → Bots se crea un Agent Bot con la URL de un webhook (tu flujo de n8n o tu propio
  agente) y se asigna a la bandeja. Desde ahí recibe cada mensaje y contesta por la API de Chatwoot. Ojo: abrir o
  asignar la conversación no calla al bot. Para que deje de contestar cuando entra una persona, tu flujo tiene que
  revisar una marca (por ejemplo, un atributo del contacto) antes de responder.
- **Prueba:** un mensaje desde otro teléfono a cada canal y una respuesta desde la bandeja.

#### 5.3 Metabase (tableros y reportes)

Doc: https://www.metabase.com/docs/latest/installation-and-operation/running-metabase-on-docker

- **Imagen:** `metabase/metabase` (AGPL). La `metabase/metabase-enterprise` pide licencia de pago.
- **Va en el servidor donde ya viven los datos,** no en otro. Mover los datos de un negocio para reportarlos es
  exponerlos sin necesidad.
- **Su propia base, en Postgres:** Metabase guarda tableros, preguntas y usuarios en una base aparte. Crea una base
  vacía con su usuario dueño y pásalos con `MB_DB_TYPE=postgres`, `MB_DB_HOST`, `MB_DB_PORT`, `MB_DB_DBNAME`,
  `MB_DB_USER` y `MB_DB_PASS`. Sin eso usa una base H2 dentro del contenedor y, si el contenedor se borra, se pierde
  todo. El compose de ejemplo de la doc dice que no es para producción: arma el tuyo a partir de su ejemplo de
  `docker run`.
- **Dos llaves antes del primer arranque:** `MB_ENCRYPTION_SECRET_KEY` (cifra las contraseñas de las bases que conectes;
  sin ella quedan en texto plano) y `MB_SESSION_SECRET_KEY` (firma las sesiones). Mínimo 16 caracteres; con
  `openssl rand -hex 32` no hay caracteres raros en el `.env`. Si la llave de cifrado se agrega después de que Metabase
  ya arrancó, deja de arrancar: con la instancia vacía, lo más limpio es borrar su base y crearla otra vez. Si se pierde
  la llave, hay que volver a capturar todas las conexiones.
- **`MB_SITE_URL`** con la dirección https, y la memoria de Java con `JAVA_OPTS=-Xmx2g` (así lo usa la guía de solución
  de problemas de Metabase).
- **El candado real es el usuario de la base, no los permisos de Metabase.** Para leer los datos, crea un usuario de
  **solo lectura** con `GRANT SELECT` únicamente sobre vistas angostas (las columnas que el reporte necesita, sin datos
  personales de más), nunca sobre las tablas crudas. Así la persona puede escribir SQL libre en Metabase sin alcanzar
  nada que no deba. Compruébalo: con ese usuario, un `SELECT` a una tabla cruda tiene que fallar con "permission
  denied". Si después recreas una vista con `DROP VIEW`, pierde sus permisos: pon el `GRANT` junto al `CREATE` en el
  mismo script.
- **La cuenta de administrador, de inmediato:** mientras la pantalla de configuración esté abierta, quien llegue primero
  a la dirección se queda con la instancia. En el asistente, salta el paso de conectar datos y hazlo después desde Admin
  → Databases.
- **Tableros por script, no a mano:** si van a armar varios, hazlo con un script contra la API de Metabase que se pueda
  volver a correr. Así se revisan en un diff y se recuperan si alguien los borra.
- **Prueba:** `/api/health` responde `{"status":"ok"}`, y en Browse Data solo aparecen las vistas que diste.

#### 5.4 n8n (automatización y agentes)

Doc: https://docs.n8n.io/hosting/installation/server-setups/docker-compose/

- **Método oficial:** Docker Compose con Traefik y un `.env` con `DOMAIN_NAME`, `SUBDOMAIN`, `GENERIC_TIMEZONE` y
  `SSL_EMAIL`. n8n queda en `127.0.0.1:5678` y sale a internet solo por Traefik. Si el servidor ya tiene proxy, usa solo
  el servicio de n8n y publícalo con ese proxy.
- **`GENERIC_TIMEZONE`** con la zona de la persona: los flujos programados la usan (si falta, toma la de Nueva York).
- **La dirección de los webhooks:** `N8N_WEBHOOK_URL` desde la versión 2.30.0 (`WEBHOOK_URL` en las anteriores), con la
  dirección https. Sin ella, n8n puede armar los webhooks con una dirección interna que nadie de fuera alcanza.
- **El volumen `n8n_data` guarda la base y la llave de cifrado de las credenciales.** Respáldalo (paso 6): sin esa
  llave, las credenciales guardadas no se pueden leer.
- **Un flujo de errores desde el primer día:** un workflow con el nodo Error Trigger que avise por correo o chat,
  asignado en la configuración de cada flujo. Un flujo programado que falla en silencio es el error más caro.
- **La licencia, en la práctica:** úsalo para tu negocio y para construirles flujos a tus clientes; no les des a
  terceros acceso a tu n8n para que armen sus propios flujos, ni lo cobres como plataforma. Detalle:
  https://docs.n8n.io/n8n-community-license/sustainable-use-license

#### 5.5 LiveKit (agentes de voz)

Doc: https://docs.livekit.io/transport/self-hosting/ (servidor) ·
https://docs.livekit.io/transport/self-hosting/sip-server/ (teléfono) ·
https://docs.livekit.io/deploy/custom/deployments/ (agente)

Son tres piezas: el **servidor**, que mueve el audio en tiempo real; el **servicio SIP**, que lo conecta con líneas de
teléfono; y el **agente**, que es código tuyo hecho con LiveKit Agents (Python o Node).

- **Para probar en tu computadora:** instala el servidor como dice la página "Running LiveKit locally" de la doc;
  `livekit-server --dev` levanta uno local en `127.0.0.1:7880` con llaves de desarrollo. Sirve para hablar con el agente
  desde el navegador, no para llamadas por teléfono.
- **Itera en LiveKit Cloud y muda al final:** es lo que hago yo. Su plan gratuito alcanza para desarrollar (1,000
  minutos de agente al mes), y el código del agente es el mismo en Cloud que en tu servidor.
- **Servidor en producción (método oficial para VM):** `docker run --rm -it -v$PWD:/output livekit/generate` te pregunta
  los dominios y genera `docker-compose.yaml`, `livekit.yaml`, `caddy.yaml`, `redis.conf` y un script de instalación (o
  un cloud-init), que deja todo en `/opt/livekit` como servicio de systemd.
  - Pide **dos dominios** apuntando a la IP: el principal y el de TURN.
  - Pide **IP pública** y estos puertos abiertos en el firewall del proveedor: 443 y 80 (HTTPS, TURN/TLS y el
    certificado), 7881/TCP, 3478/UDP y 50000–60000/UDP. En Docker, red `host`; en la mayoría de las nubes,
    `rtc.use_external_ip: true`.
  - **TURN** viene incluido en el 443: es lo que deja conectarse a quien está detrás de un firewall de empresa o de una
    VPN. No lo quites.
  - El Caddy que genera ocupa el 80 y el 443. Si el servidor ya tiene otro proxy ahí, LiveKit va en **su propio
    servidor**: es lo más simple y lo que recomiendo.
- **Teléfono (servicio SIP):** va aparte. La doc pide que el 5060 (UDP y TCP) y el rango 10000–20000/UDP sean accesibles
  desde internet: ábrelos **solo a las IPs de tu proveedor de líneas**. La persona necesita una troncal SIP de un
  proveedor (Twilio, Telnyx o uno local) y un número; los minutos se pagan ahí.
- **El agente:** empieza con los proyectos base oficiales (`agent-starter-python` o `agent-starter-node`, enlazados en
  la doc del agente). Se conecta al servidor por WebSocket, así que no abre puertos. Lleva las llaves de los modelos que
  use (transcripción, LLM y voz), que cobran por uso si son APIs. La doc recomienda de arranque 4 núcleos y 8 GB por
  servidor de agentes, y un tiempo de gracia largo al reiniciarlo (10 minutos o más) para no cortar llamadas en curso.
- **Lo que no viene en tu servidor:** la cancelación de ruido avanzada (Krisp) solo funciona con LiveKit Cloud. En
  servidor propio, la alternativa es el plugin de ai-coustics con su propia llave (de pago) o nada. Si los clientes
  llaman desde la calle o con la tele prendida, se nota: díselo a la persona antes de decidir.
- **Un servidor para pruebas y otro para producción** (lo recomienda la doc), para no contestar llamadas reales mientras
  pruebas.
- **Si el cliente oye mal pero la grabación de la llamada se oye bien,** el problema está en la telefonía (el proveedor
  o la señal del celular), no en tu servidor.
- **Prueba:** primero desde el navegador; después, una llamada a un número de la persona, nunca a un cliente.

### Paso 6. Respaldos y actualizaciones

- **Respaldo cada noche** (cron): `pg_dump` de cada base Postgres (Chatwoot, la de Metabase, la de Vexa) y copia de los
  volúmenes con archivos (los adjuntos de Chatwoot, `n8n_data`, el almacenamiento de Vexa). Conserva 14 días y copia los
  respaldos **fuera del servidor**. Haz una restauración de prueba una vez: un respaldo que nunca se restauró no es
  respaldo.
- **Los `.env` van al gestor de contraseñas** de la persona (regla 5). Sin la llave de cifrado de Metabase o de n8n, el
  respaldo de la base sirve a medias.
- **Para actualizar** (anótalo en el `README` de cada carpeta): lee las notas de la versión nueva, respalda, cambia la
  versión en el compose, `docker compose pull && docker compose up -d`, corre la migración si la doc la pide (en
  Chatwoot, el mismo `db:chatwoot_prepare`) y prueba. Una herramienta a la vez; si lleva varias versiones de atraso, la
  doc puede pedir pasar por las intermedias.
- **Avisos de seguridad:** pídele a la persona que active en GitHub Watch → Custom → Releases y Security alerts en el
  repo de cada herramienta que instaló.

### Paso 7. Verificación final

1. Cada dirección abre con HTTPS desde el celular de la persona, con datos móviles.
2. Desde fuera del servidor (la computadora de la persona), los puertos de las bases no responden: `nc -zv <ip> 5432` y
   `nc -zv <ip> 6379` (en Windows, `Test-NetConnection <ip> -Port 5432`) tienen que fallar.
3. `free -h` y `docker stats --no-stream`: anota cuánta memoria usa cada herramienta y cuánta queda libre.
4. Entrégale a la persona una lista: la dirección de cada herramienta, dónde está su `README`, qué se respalda y cuándo,
   y qué cuentas creó.

### Si algo falla

- **El certificado HTTPS no sale:** el DNS todavía no apunta a la IP (revísalo con `dig` o `nslookup`) o algo más ocupa
  el puerto 80.
- **Vexa responde 503 al mandar un bot:** falta configurar la transcripción (`TRANSCRIPTION_SERVICE_URL` y su token).
- **El bot de Vexa se queda en la sala de espera:** alguien tiene que admitirlo. Si la reunión no acepta invitados, usa
  el bot autenticado.
- **Chatwoot carga sin estilos o el super administrador da 422:** el proxy no manda `X-Forwarded-Proto`, o tiene un
  filtro de seguridad (WAF) que bloquea los archivos de la app; a mí me pasó con ModSecurity. Prueba sin el filtro antes
  de tocar Chatwoot.
- **No llegan los mensajes de WhatsApp o Instagram a Chatwoot:** la app de Meta sigue en modo de desarrollo, el webhook
  no está suscrito o la bandeja pide reautorización (paso 5.2).
- **Metabase se reinicia en bucle:** se agregó `MB_ENCRYPTION_SECRET_KEY` después del primer arranque, o la contraseña
  del `.env` no coincide con la del usuario de su base.
- **En Metabase se ven tablas de más:** el usuario de solo lectura tiene permisos de más. Revisa sus `GRANT` antes de
  seguir.
- **n8n muestra los webhooks con `localhost`:** falta `N8N_WEBHOOK_URL` (o `WEBHOOK_URL`).
- **LiveKit conecta pero no hay audio:** el rango 50000–60000/UDP está cerrado o falta `rtc.use_external_ip`. Si solo
  falla desde la red de una empresa, revisa TURN.
- **LiveKit no recibe ni hace llamadas:** el 5060 o el rango 10000–20000/UDP están cerrados, o la IP del proveedor no
  está permitida.

---

## Para ti: lo que instalas tú, lo actualizas tú

Con el software de pago, alguien más mantiene el servidor al día. Con estas herramientas, ese alguien eres tú (o tu
agente).

- **Las actualizaciones son tu responsabilidad.** Cuando aparece una falla, el parche suele salir rápido: el de PHP de
  este mes salió el mismo día que se anunció la falla. Quien lo aplicó ese día no tuvo problema; quien no, quedó
  expuesto.
- **Una vez al mes, pídele a tu agente:** "revisa si hay versiones nuevas de lo que instalamos, léeme lo importante de
  las notas, respalda y actualiza una por una". Para eso sirven las versiones fijas: tú decides cuándo cambian.
- **Activa los avisos** de cada repo en GitHub para enterarte de un parche urgente sin esperar al mes.
- **Empieza con una.** La que te ahorre más dinero o más tiempo. Cuando ya la uses todos los días, sigue con la
  siguiente.

---

Guía de **Jaime Herrera**, VisiumAI (visiumai.com). Publico sobre automatización con IA en YouTube
(youtube.com/@jaime_herrerag) e Instagram (@jaimeherrera.ia).
Consultoría de 30 minutos, gratis

¿Prefieres que lo armemos en tu negocio?

Las guías son para hacerlo tú. Si quieres un sistema así trabajando en tu operación, agenda una llamada de 30 minutos: revisamos tu caso y te decimos por dónde empezar.

¿No ves el calendario? Ábrelo en otra pestaña.