🎓 Presentación 8 - El Ecosistema Extendido
En la siguiente presentación exploraremos el ecosistema completo de Asterisk: Issabel, OmniLeads y el futuro de las comunicaciones unificadas.
Desarrollo de un panel web profesional con Next.js 15, monitoreo en tiempo real vía AMI, gestión de usuarios con roles y reportes CDR/CEL
Hasta ahora hemos trabajado exclusivamente desde CLI y archivos de configuración. Un panel web moderno proporciona:
✅ Acceso remoto seguro mediante autenticación y roles
✅ Interfaz intuitiva para usuarios no técnicos
✅ Monitoreo en tiempo real de extensiones y troncales vía AMI
✅ Reportes visuales de CDR/CEL con filtros avanzados
✅ Gestión de usuarios con permisos diferenciados
✅ Originar y colgar llamadas desde el navegador
✅ Dashboard con métricas en tiempo real
Frontend:
Backend:
Infraestructura:
nano /etc/asterisk/manager.conf;; /etc/asterisk/manager.conf; Configuración AMI para Panel de Administración Web;
[general]enabled = yesport = 5038bindaddr = 0.0.0.0
; === SEGURIDAD ===timestampevents = yesauthtimeout = 30authlimit = 50
; === OPTIMIZACIÓN ===; Deshabilitar eventos que saturan el sistemadisabledevents = Newexten,VarSet,RTCPSent,RTCPReceived
displayconnects = yes
; === USUARIO PARA PANEL WEB ===[panel_web]secret = Panel2025Secure!
; Denegar todo por defectodeny = 0.0.0.0/0.0.0.0
; Permitir solo desde localhostpermit = 127.0.0.1/255.255.255.0
; Permisos de lectura y escrituraread = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplanwrite = system,call,agent,user,config,command,reporting,originateasterisk -rx "manager reload"netstat -tlnp | grep 5038asterisk -rx "manager show users"ufw deny 5038ufw allow from 127.0.0.1 to any port 5038 proto tcpufw status numberedcurl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -apt-get install -y nodejsnpm install -g pnpm
node --versionpnpm --versioncd /optgit clone https://github.com/giandiego/panel-admin-asterisk.gitcd panel-admin-asteriskpnpm installEl panel utilizará la misma base de datos aulaswitch que configuramos en el Taller 8 para CDR/CEL. Esto simplifica la configuración y mantiene todos los datos de Asterisk centralizados.
# Verificar que la base de datos aulaswitch existe y es accesiblepsql -U asterisk -d aulaswitch -h localhost -c "SELECT version();"
# Verificar tablas CDR/CEL existentespsql -U asterisk -d aulaswitch -h localhost -c "\dt"
# Verificar datos CDRpsql -U asterisk -d aulaswitch -h localhost -c "SELECT COUNT(*) FROM cdr;"Contraseña: AsteriskAudit2025!
cd /opt/panel-admin-asteriskcp _example_env .envnano .envNODE_ENV=production
# === BASE DE DATOS ===# Usamos la misma base de datos aulaswitch del Taller 8# Esta BD contiene: cdr, cel (Asterisk) + user, account, session (Panel)DATABASE_URL="postgresql://asterisk:AsteriskAudit2025!@localhost:5432/aulaswitch"
# === AUTENTICACIÓN (Better Auth) ===# Generar con: openssl rand -base64 32BETTER_AUTH_SECRET="TU_SECRETO_GENERADO_AQUI"BETTER_AUTH_URL="https://panel.tudominio.com"
SUPER_ADMIN_EMAIL="admin@aulautil.com"SUPER_ADMIN_PASSWORD="Admin2025Secure!"SUPER_ADMIN_NAME="Administrador Principal"
AMI_HOST="localhost"AMI_PORT=5038AMI_USERNAME="panel_web"AMI_PASSWORD="Panel2025Secure!"
NEXT_PUBLIC_BETTER_AUTH_URL="https://panel.tudominio.com"Generar secreto:
openssl rand -base64 32Ahora crearemos las tablas del panel en la base de datos aulaswitch:
# Aplicar migraciones (crear tablas: user, account, session)pnpm db:push
# Crear super administrador inicialpnpm db:seed:super-adminSalida esperada:
✅ Esquema de base de datos aplicado correctamente✅ Tablas creadas: user, account, session✅ Super administrador creado: Email: admin@aulautil.com Password: Admin2025Secure!# Conectar a aulaswitchpsql -U asterisk -d aulaswitch -h localhost
# Listar TODAS las tablas (CDR/CEL + Panel)\dt
# Deberías ver:# - cdr (Taller 8)# - cel (Taller 8)# - user (Panel - nuevo)# - account (Panel - nuevo)# - session (Panel - nuevo)
# Verificar super admin creadoSELECT id, email, name, role FROM "user";
# Verificar que CDR/CEL siguen intactosSELECT COUNT(*) FROM cdr;SELECT COUNT(*) FROM cel;
# Salir\qcd /opt/panel-admin-asteriskpnpm dev# Permitir tu IPufw allow from TU_IP_LOCAL to any port 3000 proto tcp
# Agregar en manager.confnano /etc/asterisk/manager.confAgregar en [panel_web]:
permit = TU_IP_LOCAL/255.255.255.255asterisk -rx "manager reload"Accede a http://IP_SERVIDOR:3000
Credenciales:
admin@aulautil.comAdmin2025Secure!cd /opt/panel-admin-asteriskpnpm buildnpm install -g pm2pm2 --versionnano /opt/panel-admin-asterisk/ecosystem.config.jsmodule.exports = { apps: [{ name: 'panel-asterisk', script: 'node_modules/next/dist/bin/next', args: 'start', cwd: '/opt/panel-admin-asterisk', instances: 1, exec_mode: 'cluster', watch: false, max_memory_restart: '500M', env: { NODE_ENV: 'production', PORT: 3000 }, error_file: '/var/log/pm2/panel-asterisk-error.log', out_file: '/var/log/pm2/panel-asterisk-out.log', log_date_format: 'YYYY-MM-DD HH:mm:ss Z', merge_logs: true, autorestart: true, max_restarts: 10, min_uptime: '10s' }]};mkdir -p /var/log/pm2cd /opt/panel-admin-asteriskpm2 start ecosystem.config.jspm2 statuspm2 logs panel-asteriskpm2 startup systemd# Ejecutar el comando que PM2 muestrapm2 saveapt updateapt install -y nginxnginx -vsystemctl status nginxnano /etc/nginx/sites-available/panel-asteriskserver { listen 80; server_name panel-asterisk.elpepe123.online;
access_log /var/log/nginx/panel-asterisk-access.log; error_log /var/log/nginx/panel-asterisk-error.log;
client_max_body_size 10M;
location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering off; }}ln -s /etc/nginx/sites-available/panel-asterisk /etc/nginx/sites-enabled/nginx -tsystemctl reload nginxapt install -y certbot python3-certbot-nginxufw allow 80/tcpufw allow 443/tcp
certbot --nginx -d panel.tudominio.comcertbot renew --dry-runnano /opt/panel-admin-asterisk/.envCambiar a HTTPS:
BETTER_AUTH_URL="https://panel.tudominio.com"NEXT_PUBLIC_BETTER_AUTH_URL="https://panel.tudominio.com"pm2 restart panel-asterisk# Serviciossystemctl status postgresqlsystemctl status nginxpm2 statusasterisk -rx "manager show connected"
# Logspm2 logs panel-asterisk --lines 50tail -f /var/log/nginx/panel-asterisk-access.log
# Accesocurl -I https://panel.tudominio.com# Verificar AMIasterisk -rx "manager show connected"netstat -tlnp | grep 5038
# Verificar logspm2 logs panel-asterisk | grep AMI# Verificar conexiónpsql -U asterisk -d panel_asterisk -h localhost
# Verificar tablas\dt
# Recrear esquemacd /opt/panel-admin-asteriskpnpm db:push# Verificar PM2pm2 statuspm2 restart panel-asterisk
# Verificar puerto 3000netstat -tlnp | grep 3000
# Logs de Nginxtail -f /var/log/nginx/panel-asterisk-error.log✅ Firewall configurado (solo 80, 443, 22)
✅ AMI solo en localhost
✅ SSL con Let’s Encrypt
✅ Contraseñas fuertes
✅ Permisos restrictivos en .env
✅ Headers de seguridad en Nginx
✅ PM2 con límites de memoria
✅ Logs de auditoría activos
Para trabajar en el código localmente:
# En tu computadoragit clone https://github.com/giandiego/panel-admin-asterisk.gitcd panel-admin-asteriskpnpm install
# Configurar .env apuntando a tu servidor# Usar SSH tunnel para AMI:ssh -L 5038:localhost:5038 user@servidor-asterisk
pnpm dev🎓 Presentación 8 - El Ecosistema Extendido
En la siguiente presentación exploraremos el ecosistema completo de Asterisk: Issabel, OmniLeads y el futuro de las comunicaciones unificadas.