Ir al contenido

Panel de operadores

El panel vive en /admin/ del propio motor (por ejemplo https://motor.ejemplo.com/admin/, dentro de tu red privada). Es para los operadores: las personas que administran el motor. Tus apps no lo usan; ellas hablan con la API /v1 con su API key.

Todo lo que hace el panel pasa por la API de administración (/admin/api), con la misma sesión y las mismas reglas de rol. Ver API de administración.

La pantalla Inicia sesión pide el correo y la contraseña. Las cuentas no se crean desde el panel: el primer operador (y los siguientes) se crean con motorctl (Despliegue y backup). Si alguien no tiene cuenta, el login le dice que la pida a quien administra el motor.

  • La sesión dura lo que diga Ajustes → Seguridad (12 h por omisión). Al vencer, el panel vuelve al login.
  • Tras varios intentos fallidos (5 cada 15 minutos por omisión), el login espera unos minutos.
  • En producción, el panel necesita HTTPS: la cookie de la sesión lleva Secure.

El menú del operador (abajo en la barra lateral) muestra su nombre y su correo, el modo claro, oscuro o del sistema, y Cerrar sesión.

Hay dos roles, y el servidor los hace cumplir; el panel además oculta lo que tu rol no puede hacer.

Rol En el panel
operador Ve todo y opera las instancias: crearlas, vincularlas, reconectar, desconectar, pausar, reanudar, asignar un proxy, probar envíos y consultas.
superadmin Además: las apps y sus keys, los webhooks y bridges, los Ajustes, los proxies, el canario, desvincular y archivar, los backups y exportar la configuración.

El detalle está en Seguridad.

Pantalla Para qué
Inicio El estado del motor de un vistazo.
Instancias Los números de WhatsApp: crear, vincular y operar cada uno.
Apps cliente Las apps que usan la API: sus keys, webhooks, bridges y streams.
Entregas Las entregas de webhooks de todas las apps.
Operación Salud y límites del proceso.
Backups El historial de backups.
Ajustes La configuración del motor.

Las tablas tienen búsqueda, filtros y paginación en la URL, así que un enlace a una vista filtrada se puede compartir.

Un tablero de Estado del motor: la versión, el entorno, la base de datos, las migraciones (versión actual y esperada), WhatsApp (la versión de whatsmeow y si su store está al día), las Sesiones (si este proceso las tiene en exclusiva, o el modo restaurado) y la Multimedia. Debajo, los conteos: instancias, Conectadas, Caídas (quieren estar conectadas y no lo están), Con alertas, Apps cliente activas y Keys activas.

Lo que pide atención se marca en su tarjeta: «Revisar» si hay instancias caídas o las sesiones no son exclusivas, cuántas alertas están abiertas, o «Disco casi lleno» en la multimedia.

La tabla de Instancias muestra cada número con su app, su estado, el número vinculado (o «Sin número»), el último chequeo y el alta. Se busca por nombre y se filtra por estado y por app.

Nueva instancia pide la App (la instancia queda de esa app y cuenta para su cupo), un Nombre y, opcional, una Referencia del dueño: un identificador tuyo que el motor no interpreta (es el owner_ref de la API).

Arriba, la cabecera con el nombre, la app y el estado, y las acciones que corresponden al estado: Reconectar, Desconectar, Pausar o Reanudar. Debajo, cuatro tarjetas: Número, Conexión (en línea o caída y desde cuándo, y el último chequeo), App y Alta.

Después, de arriba abajo:

Sección Qué tiene
Vincular número Solo si no está vinculada. Elige QR o código: con QR, el panel dibuja el reto y lo renueva solo hasta que vence el intento; con código, escribe el Número del teléfono con el código de país y el panel muestra el código para escribir en Dispositivos vinculados. Si WhatsApp pide una passkey, el panel muestra el código a comparar con el del teléfono. Si vence, Generar otro: no hace falta desvincular.
Diagnóstico El estado de la sesión, del ledger y del pool, sin datos personales: las alertas abiertas, la sesión en el motor, el último chequeo y el último evento, lo pendiente (comandos y webhooks), el último error, las reconexiones, el keepalive, el pool y la multimedia.
Llamadas Las últimas llamadas entrantes y el botón para rechazar una que suena.
Prueba de envío Manda un mensaje de prueba desde el número, como lo haría una app.
Lectura y presencia Marcar mensajes de un chat como leídos, mandar la presencia («escribiendo», «grabando audio») y seguir la de un contacto.
Chats y etiquetas, Contactos, Grupos, Canales, Status, Interactivos Resúmenes con enlace a su página: los chats y su sincronización con WhatsApp; los contactos, «¿Está en WhatsApp?» y los bloqueados; los grupos, las comunidades y las invitaciones; los canales; los status y su audiencia; probar las variantes de interactivos. También el Catálogo de un número Business.
Eventos recientes Un inspector técnico del ledger: el tipo, el número de secuencia, la fecha y el origen de cada hecho, y el estado de su archivo. Nunca muestra el contenido.
Ajustes de la instancia El nombre, la Reconexión automática y si rechaza llamadas (con su mensaje).
Transporte Por dónde sale la conexión: Directa, sin proxy o uno de los proxies de Ajustes → Proxies; y la marca Canario (superadmin) para Actualizaciones.
Historial de WhatsApp Qué se importa del historial del teléfono, Pedir más historial de un chat, Importar los chats recientes y los Trabajos de historial con su progreso. Ver Historial.
Perfil en WhatsApp y Privacidad en WhatsApp La foto, el nombre y el recado del número, y quién ve qué.
Zona de peligro Solo superadmin. Desvincular el número (cierra la sesión de WhatsApp; para volver a usarlo hay que vincularlo otra vez) y Archivar la instancia (la desvincula, borra su sesión y deja de contar para el cupo; sus eventos se conservan; no se puede deshacer). Las dos piden confirmación.

Las secciones que necesitan una sesión de WhatsApp (llamadas, envío, chats, perfil…) solo aparecen con el número vinculado.

La tabla de Apps cliente muestra cada app con su estado, su cupo, sus keys activas y su alta. Nueva app (superadmin) pide el nombre y, opcional, su propio cupo de instancias.

La ficha de una app tiene:

  • Datos: el nombre, la descripción y el Cupo de instancias propio (vacío: vale el de Ajustes → Límites).
  • API keys: la tabla de keys con su prefijo, entorno, scopes, estado y último uso. Emitir key pide el entorno (Producción da mw_live_…; Prueba, mw_test_…), los scopes, las instancias a las que alcanza (ninguna elegida: todas) y un vencimiento opcional. El token completo aparece una sola vez en el diálogo de la key emitida: «Guárdalo ahora: no se vuelve a mostrar». Rotar emite una nueva con los mismos scopes y la anterior deja de valer al instante; Revocar no se puede deshacer.
  • Webhooks: las suscripciones de la app, con sus eventos, su estado y sus entregas. Cada una tiene Probar (manda un webhook.test firmado), Ver entregas, Rotar el secreto (el anterior sigue firmando durante la ventana de rotación), Pausar o Reactivar, Reenviar eventos (un replay por rango de secuencia, con motivo, que queda en la auditoría) y Eliminar. Aquí también están los Destinos permitidos: los de esta app y los que valen para todas.
  • Bridges: la entrega a un broker (NATS, RabbitMQ, Kafka, SQS) con su conexión, su atraso y su DLQ. Ver Brokers.
  • Streams de eventos: los streams SSE y WebSocket abiertos, su atraso y su posición por instancia, y los Últimos cierres con su motivo. Un operador puede cortar un stream: el cliente recibe el cierre con su cursor y reanuda sin perder eventos.
  • Zona de peligro: solo superadmin. Suspender app corta todas sus keys al instante, hasta Reactivar.

Las entregas de webhooks de todas las apps: el evento, la suscripción, la instancia, el estado (Pendiente, Entregada o Fallida), el último intento y su error. Se filtra por estado y por app, y desde una suscripción o una instancia se llega ya filtrado. Una entrega que no está pendiente se puede Reenviar. Ver Webhooks.

Salud y límites del proceso, para diagnosticar:

  • Memoria, Goroutines, Pool de la base y Operaciones remotas.
  • Watchdog: las operaciones en curso de cada número y las plazas que ocupa; una instancia trabada se ve aquí.
  • Migraciones, el Proceso (si es el dueño de las sesiones) y el Canario (si corre y cuántas instancias tiene).
  • El Último backup, las Conexiones a la base y el Cupo de instancias.
  • Las tablas de Instancias (proceso, transporte, estado) y Cupo por app.
  • Exportar la configuración (superadmin): un JSON saneado con Ajustes (los secretos solo como «configurado»), las apps con el prefijo de sus keys, las suscripciones, los bridges, los proxies y las instancias, sin números, correos ni nombres de personas. Queda en la auditoría.

En modo restaurado, Operación lo dice: no abre ningún socket ni entrega nada hasta el corte del original. Ver Restore aislado.

El historial de Backups: cada uno con su contenido, su tamaño, su estado y su verificación (Verificado, Sin verificar o No pasó). Hacer un backup ahora y Verificar son de superadmin. El destino y el horario están en Ajustes → Backups. Ver Despliegue y backup.

Un formulario por grupo, en este orden: General, Seguridad, Límites, Retención e historial, Webhooks, Streams de eventos, Bridges, Catálogo comercial, Backups, Proxies, Perfil, Grupos y comunidades, Operación, Almacenamiento (MinIO) y Multimedia.

  • Solo un superadmin guarda. Cualquier operador puede Probar los grupos que lo tienen (Backups y Almacenamiento), con lo ya guardado.
  • Los secretos se muestran como guardados, nunca su valor; escribir uno nuevo lo reemplaza.
  • En Proxies, además de los destinos permitidos, está la tabla de proxies: cada uno con su esquema (HTTP, HTTPS o SOCKS5), su credencial sellada, cuándo se probó y qué instancias lo usan. Un proxy en uso no se puede borrar.

Qué hace cada clave: Ajustes.

  • Los operadores: se crean, se listan y se les revocan las sesiones con motorctl.
  • La auditoría: se lee con GET /admin/api/auditoria (con sesión de operador).
  • Las métricas: GET /admin/api/metricas, en formato de Prometheus. Ver Runbooks.
  • El restore y la salida del modo restaurado: con motorctl backup restaurar y motorctl mantenimiento salir.