Panel ISP — Manual de uso
Guía completa para administrar tu WISP: clientes, facturación, cobros, cortes, monitoreo y configuración del router MikroTik.
Página de presentación pública
El sistema incluye una página de presentación pública accesible en /presentacion. Esta página usa el diseño Hyperspace con la paleta de colores de Ixtanet y sirve como punto de entrada para visitantes que aún no tienen sesión iniciada.
Comportamiento
- Cualquier visitante que intenta acceder al panel sin sesión activa es redirigido automáticamente a
/presentacion. - Si el usuario ya tiene sesión iniciada, la página muestra el botón "Ir al panel" en lugar de "Iniciar sesión".
- La página es accesible por cualquier persona en la red — no requiere login.
Secciones de la landing page
| Sección | Contenido |
|---|---|
| Inicio (hero) | Descripción principal del sistema + tarjeta de vista previa del panel |
| Características | Tres puntos clave: Gestión centralizada, Facturación automática, Monitoreo en vivo |
| Servicios | Seis funciones destacadas en tarjetas: clientes, facturación, MikroTik, POE, WhatsApp, reportes |
| Integración MikroTik | Simple Queues, Address List y detección ARP explicados visualmente |
| Acceso | Botón de llamado a la acción para iniciar sesión o ir al panel |
Acceso al panel
El panel es accesible desde cualquier navegador en la red local (o desde internet si se configura el router).
| Campo | Valor por defecto |
|---|---|
| URL | http://IP_DEL_SERVIDOR:8080 |
| Usuario | admin |
| Contraseña | admin123 |
Tab Clientes (directorio + cartera + monitor)
La pestaña Clientes unifica el directorio, el estado de deuda y el monitoreo en tiempo real en una sola vista. Cada tarjeta de cliente muestra su estado online/offline, si está al día o en mora, y tiene acceso directo a todas las acciones.
Chips de filtro
Cuatro chips en la parte superior filtran la vista al instante:
| Chip | Muestra |
|---|---|
| Todos | Todos los clientes registrados |
| En Mora | Solo clientes con facturas pendientes |
| Suspendidos | Solo clientes cortados en MikroTik |
| En Línea | Solo clientes activos en ARP del router |
Tarjeta de cliente
Cada cliente se muestra como una tarjeta con:
- Punto de estado ● verde (en línea) / ● rojo (offline o suspendido)
- Badges: Suspendido, N fact · Q X o Al día
- Meta: plan, IP, velocidad y dirección
- Facturas detalladas con botón cobrar individual (solo si tiene mora)
- Acciones: WhatsApp, Editar, Cobrar total, Cortar / Reactivar
Búsqueda
El campo de búsqueda en la barra superior filtra las tarjetas visibles por texto (nombre, IP, dirección).
Campos del cliente
| Campo | Descripción | Requerido |
|---|---|---|
| Nombre | Identificador único del cliente (clave primaria) | Sí |
| IP | Dirección IP asignada al cliente | Sí para corte |
| Teléfono | Número WhatsApp (sin código de país si está configurado globalmente) | Opcional |
| Dirección | Dirección física del cliente | Opcional |
| Plan | Plan de servicio (rellena velocidad y monto automáticamente) | Sí para facturar |
| Monto mensual | Cuota individual (puede diferir del plan) | Sí para facturar |
| Límite facturas | Nro. de facturas pendientes antes del corte automático (default: 3) | Opcional |
| Zona | Zona / nodo al que pertenece el cliente. Determina qué MikroTik gestiona sus colas y cortes. | Opcional |
Importar desde CSV
Usa el botón Importar CSV para cargar tu directorio existente. El archivo debe tener columnas: nombre, ip, telefono, direccion, monto_mensual, velocidad_mbps.
Nueva instalación de cliente
Cuando conectas un cliente nuevo, sigue estos pasos en el panel:
Registrar el cliente
En el tab Clientes, expande el acordeón Nuevo / Editar Cliente y activa el modo Nueva Instalación. Llena nombre, IP asignada, teléfono y selecciona el plan.
Cola MikroTik creada automáticamente
Al guardar, el panel crea la Simple Queue en el router con el ancho de banda del plan. No necesitas entrar al router.
Verificar en el mismo tab
El cliente aparece en la grilla. Usa el chip En Línea para verificar que ya tiene punto verde si está conectado.
Facturación
Facturación masiva automática
El sistema genera facturas automáticamente el día configurado en Ajustes → Facturación. No requiere intervención.
Facturación masiva manual
En la pestaña Facturas, el botón "Facturar todos" genera facturas pendientes para todos los clientes con monto > 0. Es idempotente: si ya existe la factura del mes actual, no crea una duplicada.
Facturación por tipo de zona (Prepago / Postpago)
El concepto de cada factura generada automáticamente depende del tipo de cobro configurado en la zona del cliente:
| Tipo de zona | Concepto generado | Ejemplo (ejecución 1 jun 2026) |
|---|---|---|
| Postpago | Servicio del mes en curso | “Servicio Junio 2026” |
| Prepago | Servicio del mes siguiente | “Servicio Julio 2026” |
Los clientes sin zona asignada son tratados como postpago.
Factura individual
En la pestaña Facturas → Emitir Factura Individual, selecciona el cliente y genera la factura si lo necesitas fuera del ciclo normal.
monto_mensual = 0, no se le generan facturas automáticas. Asegúrate de asignar un plan o monto.Cobros y pagos
El registro de pagos se hace desde la pestaña Clientes o desde Facturas.
Cobrar una factura
Seleccionar la factura
En la tarjeta del cliente (tab Clientes), la sección de deuda lista cada factura pendiente con su botón Cobrar. También puedes cobrarlas desde el tab Facturas.
Confirmar el pago
Ingresa el método de pago (efectivo, transferencia, etc.) y confirma. La factura cambia a estado Pagada.
Recibo y WhatsApp
Se genera el recibo imprimible. Si WhatsApp está activo, se envía un mensaje de confirmación al cliente. Si el envío falla, el detalle del error aparece en la campana de notificaciones — nunca bloquea el registro del pago.
Reactivación automática
Si el cliente estaba suspendido y al pagar baja su deuda por debajo del límite, se reactiva automáticamente en el router.
Liquidar toda la deuda
En la tarjeta del cliente (tab Clientes), el botón Total cobra todas las facturas pendientes del cliente de una sola vez.
Historial de pagos
La pestaña Pagos muestra todos los cobros registrados con fecha, monto y método. Cada pago tiene tres acciones rápidas:
| Botón | Acción |
|---|---|
| print Imprimir | Abre el recibo en formato imprimible en una nueva pestaña |
| picture_as_pdf PDF WhatsApp | Genera el recibo en PDF y lo envía al número del cliente vía WhatsApp. Requiere configurar la URL de documentos en Ajustes → WhatsApp. |
| delete Eliminar | Elimina el registro de pago y revierte la factura a estado Pendiente |
Pago adelantado
Permite registrar el pago de uno o varios meses futuros de un cliente. Las facturas se crean directamente con estado Pagada y la facturación automática las saltará cuando llegue su fecha.
Cómo registrar un pago adelantado
Abrir el modal
En la tarjeta del cliente (tab Clientes), haz clic en el botón Adelantar (ícono de calendario verde).
Indicar cuántos meses
Escribe el número de meses a adelantar (mínimo 1, máximo 12) y selecciona el método de pago: Efectivo, Transferencia o Tarjeta.
Confirmar
Haz clic en Confirmar. El sistema crea N facturas con estado Pagada y N registros de pago vinculados. Si WhatsApp está activo, se envía un mensaje de confirmación al cliente.
¿Desde qué mes empieza?
El sistema toma como punto de partida la última factura registrada del cliente y genera los meses siguientes. Ejemplo:
| Última factura | Meses adelantados | Facturas creadas |
|---|---|---|
| Mayo 2026 | 3 | Junio · Julio · Agosto 2026 |
| Diciembre 2026 | 2 | Enero · Febrero 2027 |
Efecto en la facturación automática
Cuando el scheduler genera la facturación mensual, verifica si ya existe una factura del mes para ese cliente. Como las facturas adelantadas ya existen (aunque sean Pagadas, el concepto del mes coincide), no se duplican.
admin y finanzas. El rol tecnico no puede registrar pagos adelantados.Actualización obligatoria de datos antes de cobrar
Cuando esta opción está activa, el sistema verifica que el teléfono y la dirección del cliente estén actualizados antes de registrar cualquier cobro. Si los datos tienen más días de antigüedad que el período configurado, aparece un modal pidiendo confirmar o corregir la información.
Configurar el período
Ir a Ajustes → Automatización
En el campo "Actualización de datos cada (días)", ingresa el número de días que deben pasar antes de requerir una actualización. Valores comunes: 90, 180, 365.
Guardar
Haz clic en Guardar configuración. El cambio aplica de inmediato — no requiere reiniciar el servidor.
¿Cómo funciona al cobrar?
Al hacer clic en cualquier botón de cobro (factura individual, cobrar total o desde la pestaña Facturas), el panel consulta /api/check_actualizacion/<nombre> antes de enviar el formulario:
| Resultado | Comportamiento |
|---|---|
necesita: false | El cobro procede normalmente sin interrupción |
necesita: true | Se abre el modal "Actualizar datos del cliente" |
Modal de actualización
El modal muestra el nombre del cliente (no editable), el teléfono actual y la dirección actual, listos para confirmar o corregir. Al hacer clic en "Guardar y Cobrar":
- Se guardan los datos actualizados del cliente (
POST /api/actualizar_datos_cliente) - Se actualiza
ultima_actualizacionen la base de datos - Se envía el formulario de cobro original automáticamente
¿Cuándo se reinicia el contador?
La fecha de ultima_actualizacion se actualiza en dos momentos:
- Al guardar el formulario del cliente (editar desde el acordeón)
- Al confirmar el modal de actualización antes de cobrar
Cortes y suspensiones
Corte automático
El sistema evalúa el estado del cliente cada vez que se crea o cobra una factura. Si las facturas pendientes superan el límite configurado (por defecto 3), el cliente es suspendido automáticamente en MikroTik.
clientes_suspendidos del router. Tus reglas de firewall deben bloquear esa lista.Corte manual
En la pestaña Clientes, cada tarjeta tiene el botón Cortar para suspender manualmente sin importar la deuda. También hay un formulario rápido con el botón Suspender manual en la barra de herramientas.
Reactivación
Al cobrar suficientes facturas para bajar la deuda por debajo del límite, el sistema reactiva automáticamente al cliente. También puedes reactivar manualmente con el botón Reactivar en la tarjeta del cliente (tab Clientes).
Corte masivo
El día de corte configurado en Ajustes, el job automático de las 6 AM evalúa a todos los clientes y aplica suspensiones masivas según su deuda acumulada.
| Acción | Efecto en MikroTik |
|---|---|
| Suspender | IP agregada a clientes_suspendidos |
| Activar / pagar | IP eliminada de clientes_suspendidos |
Estado en línea y alertas de caída
El monitoreo de conectividad está integrado directamente en el tab Clientes. No hay pestaña Monitor separada.
| Indicador | Significado |
|---|---|
| Punto ● verde | Cliente en línea (detectado en ARP del router) |
| Punto ● rojo | Cliente fuera de línea o suspendido |
| Badge N en la pestaña Clientes | Cantidad de antenas sin conexión detectadas |
| Chip En Línea | Filtrar solo clientes activos en ARP |
Panel de caídas
Al detectar una antena caída, aparece el panel de alertas en la parte superior del tab Clientes, con nombre del cliente y hora exacta de cada caída.
Actualizaciones
El estado se refresca cada 3 segundos en el frontend (vía /api/estado) y el backend verifica cambios cada 1 minuto para generar notificaciones persistentes.
Notificación WA por caída de servicio
Cuando el sistema confirma que un cliente ha perdido conexión (tras 2 ciclos consecutivos offline), puede enviarle automáticamente un mensaje personalizado por WhatsApp informándole del corte — ideal para avisar que si hay apagón eléctrico el servicio volverá solo cuando regrese la luz.
Actívalo en Ajustes → Automatización → Notificar al cliente cuando pierde conexión (WA). Personaliza el mensaje con los comodines {cliente} e {ip}.
Anti-spam: caída de sitio completo
Si en un mismo ciclo caen ≥ N clientes simultáneamente (umbral configurable, por defecto 3), el sistema interpreta que es un corte eléctrico por zona y omite los WA individuales. En su lugar genera una única alerta interna: "Caída masiva: N clientes sin internet — posible corte eléctrico por zona". Esto evita spam masivo cuando se va la luz en una colonia entera.
| Campo en Ajustes | Descripción |
|---|---|
| Activar aviso WA por caída | Toggle para habilitar/deshabilitar la función |
| Mensaje de caída | Plantilla personalizable — comodines: {cliente}, {ip} |
| Umbral caída de sitio | Número de clientes que deben caer al mismo tiempo para considerar caída de zona (recomendado 3–5) |
Sistema de notificaciones
El panel tiene un sistema de notificaciones persistentes. La campana 🔔 en la barra superior muestra las alertas no leídas.
Tipos de notificaciones
| Tipo | Color | Cuándo se genera |
|---|---|---|
| Caída de cliente | danger | Cuando un cliente pasa de en línea a fuera de línea |
| Reconexión | success | Cuando un cliente vuelve a conectarse |
| Caída masiva de sitio | warning | Cuando ≥ umbral clientes caen simultáneamente (posible corte eléctrico por zona) — WA individuales omitidos |
| Fallo WA por caída | warning | Si el aviso de caída no pudo enviarse a un cliente |
| Cliente suspendido | danger | Al aplicar corte automático o manual |
| Cliente reactivado | success | Al cobrar y reactivar automáticamente |
| Facturación completada | info | Al terminar la facturación masiva diaria |
| Corte masivo ejecutado | warning | Al terminar el corte masivo del día de corte |
Historial
Haz clic en la campana para abrir el panel de historial con las últimas 50 notificaciones. Las notificaciones se marcan como leídas al recuperarlas.
Dashboard
La pestaña Inicio muestra métricas en vivo del sistema.
| Métrica | Descripción | Frecuencia |
|---|---|---|
| Clientes al día | Sin facturas pendientes | En cada carga |
| Clientes en mora | Con al menos una factura pendiente | En cada carga |
| Clientes en línea | Detectados en ARP del router | Cada 3 s |
| Total clientes | Total registrados en la DB | En cada carga |
| CPU del router | Uso de CPU del MikroTik | Cada 3 s |
| Tráfico WAN | Bajada/subida en tiempo real | Cada 3 s |
Integración MikroTik
El panel se conecta al router MikroTik vía API RouterOS (puerto 8728 por defecto). Soporta RouterOS 6 y 7.
Configurar la conexión
Habilitar API en MikroTik
En Winbox: IP → Services → api — asegúrate de que esté habilitado (puerto 8728).
Ingresar credenciales en Ajustes
En el panel: Ajustes → MikroTik. Llena IP/host, usuario y contraseña del router.
Configurar firewall para cortes
Agrega una regla en MikroTik: IP → Firewall → Filter — bloquear tráfico forward desde src-address-list=clientes_suspendidos.
error_router.html con botón para reintentar. Los datos de clientes en la DB siguen accesibles aunque el router esté apagado.Portal de Suspensión
Cuando un cliente está suspendido, cualquier página web que intente visitar (HTTP) es redirigida automáticamente a una página de aviso personalizada que muestra sus facturas pendientes, datos de contacto y métodos de pago — igual al sistema de WispHub.
Cómo funciona
El sistema usa el Web Proxy de MikroTik (RouterOS), que intercepta el tráfico HTTP y envía al cliente un redirect HTTP 302 a la URL del portal con su nombre incluido:
http://<IP_PANEL>/portal/suspendido/NOMBRE_CLIENTELo que ocurre al suspender un cliente:
- La IP del cliente se agrega a
clientes_suspendidos(address-list del firewall). - El panel habilita el Web Proxy en MikroTik (
/ip/web-proxy enabled=yes) si no estaba activo. - Se crea (si no existe) la regla NAT que redirige el tráfico HTTP de clientes suspendidos al proxy.
- Se agrega una regla en
/ip/web-proxy/accesspara esa IP específica conaction=redirecta la URL del portal.
Al reactivar, la regla del web proxy se elimina automáticamente.
Configurar en Ajustes
| Campo | Descripción |
|---|---|
| IP del Panel | IP de este servidor accesible desde los clientes (ej. 10.1.9.17). Es la IP que aparecerá en la URL del portal. |
| Puerto Proxy | Puerto del Web Proxy en MikroTik. Default 8080. WispHub usa 999. Debe coincidir con lo configurado en el router. |
| Contenido del Portal | Editor HTML (CodeMirror) para personalizar el bloque de información: dirección, horario, email, métodos de pago. Acepta cualquier HTML con estilos inline y clases material-symbols-rounded. |
Lo que ve el cliente
- Nombre de la empresa y del cliente
- Mensaje: “Tu servicio ha sido suspendido por falta de pago”
- Tabla con sus facturas pendientes (concepto, monto, fecha)
- Botones de Llamar y WhatsApp
- Bloque personalizable: dirección, horario, email, métodos de pago
https:// o visiten sitios HTTPS verán un error de conexión normal. Para una experiencia completa, el cliente debe intentar visitar un sitio HTTP primero — los navegadores modernos intentan HTTP antes de HTTPS al escribir una URL sin protocolo.Exportar MikroTik
El botón "Exportar MikroTik" en la pestaña Clientes sincroniza todos los clientes al router como Simple Queues. Si tienes varias Zonas configuradas, la exportación agrupa los clientes por zona y sincroniza cada router por separado — todo en un solo clic.
Úsalo cuando:
- El router fue reseteado y perdió la configuración
- Quieres aplicar cambios de velocidad masivos
- Acabas de migrar de otro sistema
Clientes sin plan asignado
Si algún cliente tiene velocidad_mbps = 0, el sistema muestra un modal para asignar plan antes de exportar.
Clientes sin cola en el router
Si un cliente existe en la DB pero no tiene cola en MikroTik (nunca fue instalado), aparece en la lista "Sin cola". Debes crear la cola manualmente o registrar la instalación del cliente con una IP válida.
Colas dinámicas
MikroTik genera colas dinámicas para conexiones DHCP y PPPoE (nombres como <pppoe-oficina> o dhcp-ds<MAC>). Estas colas no se pueden editar. El panel las detecta y las salta automáticamente durante la exportación — no generan error.
Zonas / Nodos Starlink
El sistema de zonas permite gestionar múltiples routers MikroTik simultáneamente. Cada zona representa un nodo de red — por ejemplo, cada enlace Starlink con su propio MikroTik. Cada cliente se asigna a una zona y todas las operaciones (colas, cortes, reactivaciones, exportaciones) se ejecutan automáticamente en el router de esa zona.
Crear una zona
Ir a Ajustes → Zonas / Nodos Starlink
En la sección de Zonas de la página de Ajustes, haz clic en Agregar Zona.
Llenar los datos de la zona
Ingresa el nombre (ej. "Starlink Norte"), el host/IP del MikroTik de esa zona — puede ser una IP WireGuard si está detrás de Starlink —, el usuario, la contraseña y una descripción opcional.
Probar la conexión
Usa el botón Probar junto a la zona. El sistema se conecta al router y devuelve la versión de RouterOS. Si falla, verifica IP, credenciales y que la API (puerto 8728) esté habilitada.
Asignar clientes a la zona
Al editar o crear un cliente, el formulario muestra un selector de zona (visible si hay al menos una zona creada). Elige la zona correspondiente y guarda.
Comportamiento por operación
| Operación | Comportamiento con zonas |
|---|---|
| Crear / editar cliente | La cola Simple Queue se crea/actualiza en el router de la zona del cliente |
| Corte automático / manual | La IP se agrega a clientes_suspendidos en el router de la zona |
| Reactivar | La IP se elimina de clientes_suspendidos en el router correcto |
| Exportar MikroTik | Los clientes se agrupan por zona y se sincroniza cada router por separado en un solo clic |
| Monitor (cada 1 min) | Se consultan ARP y colas de todos los routers y se fusionan en la vista unificada |
| Check de estado en vivo | El dashboard muestra clientes online de todos los routers combinados |
Badge de zona en el directorio
Cada tarjeta de cliente muestra el nombre de su zona bajo el nombre del cliente con el ícono de antena cell_tower. Si la zona es prepago, también se muestra el badge PREPAGO. Esto permite identificar a qué nodo y modelo de cobro pertenece cada cliente de un vistazo.
Tipo de cobro: Prepago vs Postpago
Cada zona puede configurarse como postpago (predeterminado) o prepago. Esto cambia el comportamiento de la facturación automática y el umbral de corte para todos los clientes de esa zona.
| Aspecto | Postpago (default) | Prepago |
|---|---|---|
| Concepto de factura | Mes en curso (ej. “Servicio Mayo 2026”) | Mes siguiente (ej. “Servicio Junio 2026”) |
| Cuándo se genera | Al inicio del mes actual | Al inicio del mes actual (para cubrir el mes siguiente) |
| Límite para corte automático | El configurado en el cliente (default 3) | 1 — corte inmediato con 1 factura pendiente |
| Badge en directorio | — | PREPAGO |
Configurar el tipo de cobro de una zona
Abrir el modal de la zona
En Ajustes → Zonas, haz clic en el botón Editar de la zona que deseas configurar.
Seleccionar el tipo de cobro
En el campo “Tipo de cobro”, elige entre Postpago — factura mes actual o Prepago — factura mes siguiente (pago anticipado).
Guardar
Haz clic en Guardar. El cambio aplica en el próximo ciclo de facturación automática.
Gestión de zonas
| Acción | Descripción |
|---|---|
| Editar | Actualiza nombre, host, usuario y descripción. La contraseña solo se cambia si se escribe una nueva en el modal. |
| Probar | Verifica la conexión al MikroTik de la zona en tiempo real y muestra la versión de RouterOS. |
| Eliminar | Elimina la zona. Los clientes asignados quedan sin zona (pasan a usar el router principal). El tipo de cobro también se pierde. |
Powerbox POE
Monitoreo de switches MikroTik con puertos POE. El link Powerbox POE solo aparece en el menú si tienes al menos un switch registrado.
Agregar un switch POE
Ve a Ajustes → Powerbox POE y registra el switch con su nombre y datos de conexión al router. Desde ese momento el panel tomará lecturas cada 5 minutos.
Información por puerto
| Dato | Descripción |
|---|---|
| Voltaje (V) | Tensión en el puerto POE |
| Corriente (mA) | Corriente consumida |
| Potencia (W) | Potencia activa = V × mA |
| Estado | Activo · Esperando · Falla · Deshabilitado |
Historial gráfico
Selecciona el período: diario, semanal, mensual o trimestral. Los datos se muestrean cada 5 minutos.
MikroTik remoto detrás de Starlink (WireGuard)
Si tienes routers MikroTik en ubicaciones remotas que se conectan a internet vía Starlink, no tienen IP pública fija (CGNAT). El panel no puede alcanzarlos directamente. La solución es crear una VPN WireGuard donde el servidor del panel actúa de hub y cada MikroTik se conecta como cliente.
Arquitectura
| Nodo | IP WireGuard | Rol |
|---|---|---|
| Servidor del panel | 10.200.0.1 | Hub VPN (siempre accesible) |
| MikroTik 1 (Starlink A) | 10.200.0.2 | Peer VPN / router de clientes |
| MikroTik 2 (Starlink B) | 10.200.0.3 | Peer VPN / router de clientes |
Paso 1 — Instalar WireGuard en el servidor Linux
Instalar y generar llaves
apt install wireguard -y
cd /etc/wireguard
# Llave del servidor
wg genkey | tee server_priv | wg pubkey > server_pub
# Una llave por cada MikroTik
wg genkey | tee mt1_priv | wg pubkey > mt1_pub
wg genkey | tee mt2_priv | wg pubkey > mt2_pub
Crear /etc/wireguard/wg0.conf
[Interface]
Address = 10.200.0.1/24
ListenPort = 51820
PrivateKey = <contenido de server_priv>
# MikroTik 1
[Peer]
PublicKey = <contenido de mt1_pub>
AllowedIPs = 10.200.0.2/32
# MikroTik 2
[Peer]
PublicKey = <contenido de mt2_pub>
AllowedIPs = 10.200.0.3/32
Activar la VPN y abrir el puerto
systemctl enable --now wg-quick@wg0
ufw allow 51820/udp
Paso 2 — Configurar WireGuard en cada MikroTik (RouterOS 7)
Ejecuta esto en la terminal de cada MikroTik (Winbox → Terminal o SSH). Reemplaza los valores entre < >:
# ── MikroTik 1 (repite en MikroTik 2 cambiando la IP a 10.200.0.3) ──
/interface/wireguard/add \
name=wg-panel \
listen-port=13231 \
private-key="<contenido de mt1_priv>"
/interface/wireguard/peers/add \
interface=wg-panel \
public-key="<contenido de server_pub>" \
endpoint-address=<IP_PUBLICA_SERVIDOR> \
endpoint-port=51820 \
allowed-address=10.200.0.0/24 \
persistent-keepalive=25
/ip/address/add address=10.200.0.2/24 interface=wg-panel
ping 10.200.0.2 y ping 10.200.0.3. Si responden, el túnel está activo.Paso 3 — Habilitar API en cada MikroTik
El panel se conecta a los routers vía la API RouterOS (puerto 8728). Asegúrate de que la API esté habilitada y acepte conexiones desde la VPN:
/ip/service/set api disabled=no
# Opcional: restringir a solo la IP del servidor VPN
/ip/service/set api address=10.200.0.1/32
Paso 4 — Apuntar el panel al router remoto
Una vez activo el túnel, el router responde en su IP WireGuard. Para operarlo desde el panel:
- Ve a Ajustes → MikroTik
- Cambia el Host a la IP WireGuard del router deseado (ej.
10.200.0.2) - Ingresa usuario y contraseña del router remoto
- Guarda — el panel apuntará a ese router
¿Por qué persistent-keepalive?
Starlink usa CGNAT, lo que significa que el NAT cierra sesiones UDP inactivas. El parámetro persistent-keepalive=25 hace que el MikroTik envíe un paquete al servidor cada 25 segundos, manteniendo el túnel siempre abierto aunque no haya tráfico real de clientes.
Ajustes generales
| Sección | Qué configura |
|---|---|
| Empresa | Nombre de la empresa y teléfono de contacto |
| MikroTik | IP/host, usuario y contraseña del router |
| Seguridad | Usuario y contraseña del panel de administración |
| Facturación | Día del mes para generar facturas, día de corte, concepto mensual |
| Automatización | Período de actualización obligatoria de datos del cliente antes de cobrar (0 = desactivado) |
| URL de API, método, headers y cuerpo del mensaje | |
| SMTP | Servidor de correo para backups automáticos |
| Planes | Planes de servicio con velocidad y monto |
| Zonas / Nodos Starlink | Routers MikroTik adicionales. Cada zona tiene host, usuario y contraseña propios, y define el tipo de cobro (postpago o prepago) para sus clientes. Los clientes se asignan a una zona para que sus operaciones usen el router correcto. |
Planes de servicio
Los planes se administran en Ajustes → Planes de Servicio. Cada plan tiene:
- Nombre: identificador del plan (ej. "Básico 10 Mbps")
- Velocidad (Mbps): se aplica como
max-limiten la cola MikroTik - Monto mensual: cuota que se cobra al cliente
Al seleccionar un plan en el formulario de cliente, se rellenan automáticamente velocidad y monto.
Integración WhatsApp
El panel puede enviar mensajes a través de cualquier API de WhatsApp (CallMeBot, UltraMsg, Twilio, etc.).
Configuración
En Ajustes → WhatsApp:
| Campo | Descripción |
|---|---|
| URL | Endpoint de tu API de WhatsApp |
| Método | GET o POST según tu proveedor |
| Headers | JSON con cabeceras (ej. {"apikey": "xxx"}) |
| Body template | Cuerpo del mensaje con variables {cliente}, {monto}, {count} |
| Código de país | Se agrega como prefijo al teléfono del cliente (ej. 502 para Guatemala) |
Cuándo se envían mensajes
- Al cobrar una factura → mensaje de recibo de pago
- Último día del mes → recordatorio de pago a clientes con deuda
- Manual desde el historial de pagos → recibo en PDF (requiere URL de documentos)
- Al detectar caída de conexión → aviso personalizado al cliente (si activado y no es caída masiva por zona)
Envío de recibo PDF
El botón PDF en cada fila de la pestaña Pagos genera el recibo en PDF y lo envía vía API. Para usarlo, configura:
| Campo en Ajustes | Descripción |
|---|---|
| URL documentos PDF | Endpoint para enviar documentos (ej. Evolution API: https://tu-servidor/message/sendMedia/INSTANCIA) |
| Body PDF (JSON) | Template JSON con comodines: {destinatario}, {documento_base64}, {filename} |
Los headers y el método se heredan de la configuración principal de WhatsApp.
Si WhatsApp falla
Los errores de envío no bloquean el cobro. El pago se registra igualmente y el detalle completo del error de la API aparece en la campana de notificaciones con el título "Fallo WA — [nombre del cliente]".
"Connection Closed", la instancia de WhatsApp en tu servidor Evolution API está desconectada. Entra al panel de Evolution, busca tu instancia y reconecta escaneando el código QR.Recordatorios masivos — prevenir bloqueo de cuenta
WhatsApp detecta como spam cuando se envían muchos mensajes seguidos en segundos. Para evitar que tu número sea bloqueado, el sistema agrega automáticamente una pausa aleatoria de 8 a 18 segundos entre cada recordatorio masivo del fin de mes. Esto imita el comportamiento humano y reduce la probabilidad de bloqueo.
| Práctica recomendada | Detalle |
|---|---|
| Pausa entre mensajes | 8–18 s aleatorios (implementado automáticamente) |
| Mensaje personalizado | Usa {cliente} en el template para que cada mensaje sea único |
| Evitar palabras bloqueadas | No uses "gratis", "promoción", "ganar" ni URLs acortadas |
| Número verificado | Usa WhatsApp Business con número registrado a nombre de la empresa |
Backup automático
El sistema puede enviar una copia de la base de datos por correo electrónico de forma automática.
Configura el servidor SMTP en Ajustes → SMTP con host, puerto, usuario y contraseña. Selecciona la frecuencia (diaria, cada 3 días, semanal).
Automatización (scheduler)
El panel ejecuta 4 tareas automáticas en segundo plano:
| Job | Frecuencia | Qué hace |
|---|---|---|
job_diario | Cada día a las 6:00 AM | Facturación masiva (postpago: mes actual; prepago: mes siguiente) + corte automático + recordatorios WA del último día del mes |
job_muestreo | Cada 15 minutos | Guarda el tráfico WAN para las gráficas de consumo |
job_muestreo_poe | Cada 5 minutos | Registra lecturas POE por puerto en los switches |
job_monitoreo_clientes | Cada 1 minuto | Verifica conectividad en todos los routers (principal + por zona), genera notificaciones ante cambios de estado y envía WA personalizado al cliente cuando pierde conexión (si ≥ umbral clientes caen simultáneamente, omite los WA y genera una única alerta interna) |
Preguntas frecuentes
¿Qué pasa si el MikroTik se apaga?
El panel sigue funcionando. Los datos de clientes, facturas y pagos están en la base de datos local (SQLite). Al volver el router, usa Exportar MikroTik para resincronizar las colas.
¿Puedo tener varios routers MikroTik?
Sí. El panel soporta múltiples routers simultáneamente mediante el sistema de Zonas. Crea una zona por router en Ajustes → Zonas / Nodos Starlink, ingresa las credenciales de cada MikroTik y asigna los clientes a su zona correspondiente. Si los routers están detrás de Starlink (CGNAT), conéctalos al servidor con WireGuard VPN y usa la IP del túnel como host de la zona. Consulta la sección Zonas / Nodos Starlink y MikroTik remoto (WireGuard) del manual.
¿Cómo actualizo el panel?
cd ~/panel-isp-ixtanet
bash start.sh
El script de inicio hace git pull automáticamente y reinicia la aplicación.
¿Dónde está la base de datos?
Archivo pagos.db en la carpeta del proyecto. Es un SQLite estándar — puedes abrirlo con cualquier cliente SQLite (DB Browser, TablePlus, etc.).
¿Por qué me llegó la misma notificación varias veces?
Ocurre si el servidor fue iniciado más de una vez sin detener el proceso anterior, generando múltiples schedulers. Solucionado con bash start.sh que mata procesos previos antes de arrancar.
Un cliente está en línea pero aparece como offline
El estado se basa en la tabla ARP del MikroTik. Si el cliente no está en ARP (por ejemplo, su equipo está inactivo), aparecerá offline. Revisa en el router: IP → ARP.
¿Puedo acceder desde el celular?
Sí. La interfaz es responsive y funciona bien en dispositivos móviles. Las tarjetas de clientes, facturas y pagos se adaptan a pantallas pequeñas. Asegúrate de acceder desde la red local o configurar acceso remoto en tu router.
¿Cómo importo clientes desde WispHub?
Descarga el backup desde WispHub (CSV de clientes + historial de pagos). Copia los archivos a la carpeta del proyecto y ejecuta en la terminal:
python _importar_wisphub.py
El script importa clientes, facturas y pagos; y agrega columnas extra a la tabla clientes: ip, cedula, fecha_instalacion, id_wisphub, zona. Edita la ruta del backup dentro del script antes de ejecutarlo.
La deuda pendiente muestra un monto muy alto
Si importaste historial desde otro sistema, la DB contiene facturas pendientes de años anteriores. El dashboard filtra la deuda al año actual para mostrar solo lo relevante. El historial completo sigue disponible en la pestaña Facturas.
Panel ISP · Datos 100% locales · Sin dependencias de nube