DrasBot v3.0 es un sistema WhatsApp chatbot moderno con arquitectura PM2, completamente refactorizado en TypeScript con persistencia real SQLite. Eliminando el sistema legacy tmux, ahora opera exclusivamente con PM2 para una gestión profesional de procesos.
┌─────────────────────────────────────────────────────────────────────────────┐
│ 🤖 DrasBot v3.0 - Arquitectura PM2 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 📱 WhatsApp │
│ │ │
│ │ QR Auth / Session │
│ ▼ │
│ ┌─────────────────┐ HTTP/JSON ┌─────────────────────────────────┐ │
│ │ drasbot-bridge │◄───────────────►│ drasbot │ │
│ │ (Go) │ Webhook │ (TypeScript/Node.js) │ │
│ │ │ Port 3000 │ │ │
│ │ • PM2 ID: 0 │ │ • PM2 ID: 1 │ │
│ │ • Port: 8080 │ │ • Webhook Server: 3000 │ │
│ │ • whatsmeow │ │ • Auto-compile TypeScript │ │
│ │ • Session mgmt │ │ • Plugin Architecture │ │
│ │ • Message recv │ │ • Pipeline Processing │ │
│ └─────────────────┘ └─────────────────────────────────┘ │
│ │ │
│ │ SQLite Persistence │
│ ▼ │
│ ┌─────────────────┐ │
│ │ drasbot.db │ │
│ │ │ │
│ │ • Users table │ │
│ │ • Contexts │ │
│ │ • Settings │ │
│ │ • Interactions │ │
│ └─────────────────┘ │
│ │
│ 🔄 Flujo de Mensajes: │
│ WhatsApp → Bridge → Webhook (3000) → Pipeline → SQLite → Response │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Ubicación: /whatsapp-bridge/
Servidor de conexión WhatsApp que maneja el protocolo de comunicación.
- Lenguaje: Go 1.21+
- Puerto: 8080 (localhost only)
- Gestión: PM2 directo
- Reinicio: Inmediato (sin compilación)
- API: REST para comunicación con drasbot
- Conexión directa WhatsApp Web
- Autenticación QR automática
- Envío/recepción mensajes
- Gestión de medios
- Persistencia de sesiones
Ubicación: /drasbot/
Sistema principal de procesamiento con arquitectura moderna TypeScript.
- Lenguaje: TypeScript 5.0+ / Node.js 18+
- Puerto: 3000 (webhook localhost)
- Gestión: PM2 con compilación automática
- Base de datos: SQLite con persistencia real
- Arquitectura: Modular, orientada a servicios
- MessageProcessor: Procesamiento inteligente de mensajes
- UserManager: Gestión real de usuarios en SQLite
- CommandRegistry: Sistema dinámico de comandos
- ConfigService: Configuración centralizada hot-reload
- LoggerService: Sistema de logs multi-nivel
drasbot/
├── src/
│ ├── services/ # Servicios principales
│ │ ├── message-processor.service.ts
│ │ ├── user-manager.service.ts
│ │ ├── command-registry.service.ts
│ │ └── config.service.ts
│ ├── commands/ # Sistema de comandos
│ │ ├── basic.handlers.ts
│ │ ├── admin.handlers.ts
│ │ └── user.handlers.ts
│ ├── database/ # Capa de datos SQLite
│ ├── types/ # Definiciones TypeScript
│ └── utils/ # Utilidades compartidas
├── dist/ # Código compilado
├── data/ # Base de datos SQLite
├── logs/ # Logs del sistema
└── config/ # Configuraciones
Archivo: drasbot/data/drasbot.db
- ✅ Usuarios persisten tras reinicio: Los usuarios registrados se mantienen
- ✅ Reconocimiento automático: El bot reconoce usuarios existentes
- ✅ Estadísticas reales: Contadores y métricas persistentes
- ✅ Configuración dinámica: Cambios se guardan automáticamente
-- Tabla: users (persistencia real)
users {
id: INTEGER PRIMARY KEY
whatsapp_jid: TEXT UNIQUE
phone_number: TEXT
display_name: TEXT
user_level: TEXT DEFAULT 'user' -- 'banned'|'user'|'moderator'|'admin'|'owner'
status: TEXT DEFAULT 'active'
created_at: DATETIME
updated_at: DATETIME
}
-- Tabla: system_stats (métricas reales)
system_stats {
id: INTEGER PRIMARY KEY
metric_name: TEXT
metric_value: TEXT
updated_at: DATETIME
}- Sesiones WhatsApp: Claves de cifrado y autenticación
- Store de mensajes: Historial y metadatos
- Gestión de dispositivos: Información de conexión
./manage.sh para gestión del sistema
# 🚀 Gestión Básica
./manage.sh start # Iniciar todo el ecosistema
./manage.sh stop # Detener todos los procesos
./manage.sh restart # Reiniciar con compilación automática
./manage.sh status # Estado completo del sistema
# 🔍 Monitoreo y Diagnóstico
./manage.sh health # Health check completo
./manage.sh logs [service] # Logs en tiempo real
./manage.sh monitor # Monitor avanzado PM2
# 🔧 Gestión Individual
./manage.sh dev # Solo drasbot (desarrollo)
./manage.sh bridge-restart # Solo bridge
./manage.sh compile # Solo compilar TypeScript
# 🧹 Mantenimiento
./manage.sh clean # Limpiar procesos colgados
./manage.sh reset # Reset completo del sistema- ✅ Compilación automática de TypeScript antes de reiniciar
- ✅ Cierre de tmux obsoletos automáticamente
- ✅ Health checks después de cada operación
- ✅ Gestión de errores con rollback automático
- ✅ Logs en tiempo real con colores y timestamps
# Estado de procesos
pm2 status
# Logs individuales
pm2 logs drasbot
pm2 logs drasbot-bridge
# Reinicio manual
pm2 restart drasbot
pm2 restart drasbot-bridge
# Monitor avanzado
pm2 monit
# Información detallada
pm2 show drasbot# Clonar el repositorio
git clone https://github.com/DanielMartinezSebastian/dras-whatsapp-bot.git drasBot
cd drasBot
# Instalación automática de dependencias
./install-deps.sh
# Iniciar el sistema
./manage.sh start
# Verificar estado
./manage.sh health# Manjaro/Arch Linux
sudo pacman -S nodejs npm go pm2
# Ubuntu/Debian
sudo apt update && sudo apt install -y nodejs npm golang
sudo npm install -g pm2
# Verificar versiones
node --version # >= 18.0.0
go version # >= 1.21
pm2 --version # >= 5.0.0# Dependencias drasbot
cd drasbot
npm install
npm run build
# Dependencias bridge
cd ../whatsapp-bridge
go mod tidy
go mod download/help- Ayuda personalizada por tipo de usuario/info- Información del sistema y versión/ping- Verificar latencia y conectividad/status- Estado actual del bot
/profile- Ver perfil personal y estadísticas/usertype- Ver tipo de usuario actual
/users list- Listar usuarios registrados/users search <término>- Buscar usuarios/users stats- Estadísticas de usuarios/admin panel- Panel de administración/system stats- Estadísticas del sistema/logs [líneas]- Ver logs del sistema
// Jerarquía de usuarios (de mayor a menor acceso)
export enum UserLevel {
BANNED = 'banned', // Usuario bloqueado
USER = 'user', // Usuario básico (default)
MODERATOR = 'moderator', // Moderador con permisos extendidos
ADMIN = 'admin', // Administrador del sistema
OWNER = 'owner', // Propietario con acceso completo
}drasbot/logs/
├── application.log # Logs principales de la aplicación
├── error.log # Errores del sistema
├── debug.log # Información de debug
└── pm2-out.log # Output de PM2
whatsapp-bridge/
└── bridge.log # Logs del bridge Go
# Monitor en tiempo real
./manage.sh monitor
# Logs específicos
./manage.sh logs drasbot
./manage.sh logs drasbot-bridge
# Health check completo
./manage.sh health# Testing completo
cd drasbot
npm test
# Testing específico
npm run test:bridge
npm run test:watch
# Testing de comandos
node ../test-bot-commands.js
# Validación del bridge
node ../test-bridge-functionality.js# Modo desarrollo (hot reload)
./manage.sh dev
# Debug con logs detallados
LOG_LEVEL=debug ./manage.sh start
# Compilación manual
cd drasbot
npm run build- 🏗️ Arquitectura PM2 Moderna: Sin dependencias tmux legacy
- 💾 Persistencia Real SQLite: Usuarios y datos persisten tras reinicio
- 🔧 Sistema de Comandos Dinámico: Registro automático y extensible
- 📊 Gestión Avanzada de Usuarios: CRUD completo con tipos y permisos
- 🔍 Monitoreo Completo: Logs estructurados y health checks
- ⚡ Hot Reload Config: Configuración dinámica sin reinicio
- 🛡️ Gestión de Errores: Manejo robusto de fallos y recovery
- 📱 WhatsApp Bridge Optimizado: Conexión estable y eficiente
- Latencia promedio: < 100ms para comandos básicos
- Memoria utilizada: ~113MB total (88MB + 25MB)
- Uptime: 99.9% con auto-restart PM2
- Throughput: 1000+ mensajes/hora
- Tiempo de inicio: < 5 segundos
El sistema ha sido completamente migrado del legacy tmux/whatsapp-chatbot a la nueva arquitectura PM2:
- ❌
whatsapp-chatbot/(sistema legacy completo) - ❌
manage.sh(renombrado amanage-legacy-OBSOLETO.sh) - ❌ Dependencias tmux para bridge
- ❌ Sistema de usuarios en memoria
- ❌ Configuración legacy
- ✅
drasbot/con TypeScript moderno - ✅
manage.shpara gestión PM2 - ✅ Persistencia real SQLite
- ✅ Sistema de comandos dinámico
- ✅ Arquitectura modular orientada a servicios
- ARQUITECTURA_PM2.md - Arquitectura completa
- FIX_PERSISTENCIA_USUARIOS.md - Fix técnico persistencia
- CLEANUP_WHATSAPP_CHATBOT.md - Documentación limpieza
-
Acceso Solo Local:
- Bridge:
127.0.0.1:8080 - DrasBot:
127.0.0.1:3000
- Bridge:
-
Gestión de Procesos Segura:
- PM2 con usuarios específicos
- Logs con permisos restringidos
- Base de datos con acceso controlado
-
Variables de Entorno:
- Configuración sensible en
.env - Claves API protegidas
- Secrets no versionados
- Configuración sensible en
# Verificar estado
./manage.sh status
# Reiniciar bridge
./manage.sh bridge-restart
# Ver logs específicos
./manage.sh logs drasbot-bridge# Verificar compilación
cd drasbot && npm run build
# Reiniciar con compilación
./manage.sh restart
# Ver logs detallados
./manage.sh logs drasbot# Verificar base de datos
ls -la drasbot/data/drasbot.db
# Verificar permisos
chmod 644 drasbot/data/drasbot.db
# Reset completo si es necesario
./manage.sh reset# Limpiar procesos tmux obsoletos
./manage.sh clean
# Verificar que no hay procesos duplicados
ps aux | grep -E "(whatsapp|drasbot)"# Health check completo
./manage.sh health
# Estado detallado PM2
pm2 status && pm2 show drasbot && pm2 show drasbot-bridge
# Verificar puertos
netstat -tulpn | grep -E "(3000|8080)"
# Logs en tiempo real
./manage.sh monitor- PM2 Config:
drasbot/ecosystem.config.js - TypeScript Config:
drasbot/tsconfig.json - Environment:
drasbot/.env - Package Config:
drasbot/package.json
// drasbot/src/commands/nuevo-comando.handlers.ts
import { CommandHandler } from '../interfaces/command-handler.interface';
export const nuevoComandoHandler: CommandHandler = {
name: 'nuevo',
description: 'Descripción del comando',
permissions: [UserLevel.USER], // o UserLevel.ADMIN, etc.
execute: async (context) => {
// Implementación del comando
return { success: true, response: 'Respuesta' };
}
};// drasbot/src/services/nuevo.service.ts
import { Logger } from '../utils/logger';
export class NuevoService {
private static instance: NuevoService;
private logger = Logger.getInstance();
static getInstance(): NuevoService {
if (!NuevoService.instance) {
NuevoService.instance = new NuevoService();
}
return NuevoService.instance;
}
async initialize(): Promise<void> {
this.logger.info('NuevoService initialized');
}
}Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
🧑💻 Desarrollador Principal: Daniel Martinez Sebastian
- Desarrollador: Daniel Martinez Sebastian
- Proyecto: DrasBot v3.0 - Sistema WhatsApp Moderno PM2
- Repositorio: https://github.com/DanielMartinezSebastian/dras-whatsapp-bot
- Rama Actual:
feature/new-architecture-implementation
✅ MIGRACIÓN COMPLETADA - El sistema está 100% operativo con:
- Arquitectura PM2 moderna implementada
- Sistema legacy eliminado completamente
- Persistencia real de usuarios verificada
- Documentación completa actualizada
- Procesos estables en producción
🎉 ¡DrasBot v3.0 está listo para producción!
Para iniciar el sistema: ./manage.sh start && ./manage.sh health
graph TD
A[index.ts - Entry Point] --> B[DrasBot Core]
B --> C[Singleton Services Initialization]
C --> D[DatabaseService]
C --> E[ConfigService]
C --> F[WhatsAppBridgeService]
C --> G[WebhookServer]
C --> H[MessageProcessorService]
C --> I[UserManagerService]
C --> J[CommandRegistryService]
C --> K[PluginManagerService]
C --> L[ContextManagerService]
G --> M[HTTP Webhook :3000]
M --> N[Incoming Message]
N --> H
H --> O[Processing Pipeline]
O --> P[Stage 1: Message Validation]
O --> Q[Stage 2: User Identification]
O --> R[Stage 3: Context Detection]
O --> S[Stage 4: Command/Context Execution]
O --> T[Stage 5: Response Generation]
P --> P1[Parse JSON]
P --> P2[Validate Format]
P --> P3[Extract Metadata]
Q --> Q1[Check User in SQLite]
Q --> Q2[Create if New User]
Q --> Q3[Update Last Activity]
R --> R1[Check Active Context]
R --> R2[Detect Command Pattern]
R --> R3[Route to Handler]
S --> S1{Message Type?}
S1 -->|Command| S2[CommandRegistry.execute]
S1 -->|Context| S3[ContextManager.handle]
S1 -->|Auto-Response| S4[AutoResponsesPlugin]
T --> T1[Format Response]
T --> T2[Send via Bridge]
T --> T3[Log Interaction]
S2 --> U[Command Handlers]
U --> U1[basic.handlers.ts]
U --> U2[admin.handlers.ts]
U --> U3[bridge.handlers.ts]
S4 --> V[Plugin System]
V --> V1[auto-responses]
V --> V2[test-command]
V --> V3[Future Plugins...]
sequenceDiagram
participant W as WhatsApp
participant B as Bridge (Go)
participant WS as WebhookServer
participant MP as MessageProcessor
participant UM as UserManager
participant CR as CommandRegistry
participant DB as SQLite
participant CM as ContextManager
W->>B: Mensaje WhatsApp
B->>WS: POST /webhook {mensaje}
WS->>MP: processIncomingMessage()
Note over MP: Stage 1: Validación
MP->>MP: validateMessage()
MP->>MP: parseMessageContent()
Note over MP: Stage 2: Usuario
MP->>UM: getUserByJid()
UM->>DB: SELECT * FROM users WHERE jid=?
alt Usuario existe
DB-->>UM: userData
else Usuario nuevo
UM->>DB: INSERT INTO users
DB-->>UM: newUser
end
UM-->>MP: user
Note over MP: Stage 3: Contexto
MP->>CM: getActiveContext(userId)
CM->>DB: SELECT * FROM contexts WHERE user_id=?
DB-->>CM: context
CM-->>MP: activeContext
Note over MP: Stage 4: Ejecución
alt Es comando
MP->>CR: findCommand(text)
CR-->>MP: command
MP->>CR: executeCommand(command, user, args)
CR->>U1: handler.execute()
U1-->>CR: result
CR-->>MP: commandResult
else Es contexto activo
MP->>CM: handleContextMessage()
CM-->>MP: contextResult
else Auto-respuesta
MP->>V1: handleAutoResponse()
V1-->>MP: autoResponse
end
Note over MP: Stage 5: Respuesta
MP->>MP: formatResponse()
MP->>B: POST /send {response}
B->>W: Envía respuesta
MP->>DB: INSERT INTO messages (log)
MP->>UM: updateLastActivity(user)
graph LR
subgraph "🖥️ Sistema Host"
subgraph "📱 WhatsApp Protocol"
WA[WhatsApp Web]
end
subgraph "🔗 PM2 Process Manager"
subgraph "🌉 drasbot-bridge (Go)"
direction TB
BR[Bridge Server :8080]
QR[QR Authentication]
WS[WhatsApp Session Store]
API[REST API]
BR --> QR
BR --> WS
BR --> API
end
subgraph "🤖 drasbot (TypeScript)"
direction TB
WH[Webhook Server :3000]
MP[Message Processor]
SRV[Services Layer]
CMD[Commands System]
PLG[Plugins System]
WH --> MP
MP --> SRV
MP --> CMD
MP --> PLG
end
end
subgraph "💾 Persistence Layer"
DB1[Bridge SQLite Store]
DB2[Bot SQLite Database]
LOG[Logs Directory]
end
end
subgraph "🎯 User Interaction Flow"
U1[User sends WhatsApp message]
U2[Bot processes & responds]
U3[User receives response]
end
%% Connections
WA <--> BR
BR <--> API
API <--> WH
BR --> DB1
SRV --> DB2
MP --> LOG
U1 --> WA
WA --> U2
U2 --> U3
%% Styling
classDef processGo fill:#00ADD8,stroke:#fff,stroke-width:2px,color:#fff
classDef processTS fill:#3178C6,stroke:#fff,stroke-width:2px,color:#fff
classDef database fill:#4CAF50,stroke:#fff,stroke-width:2px,color:#fff
classDef user fill:#FF9800,stroke:#fff,stroke-width:2px,color:#fff
class BR,QR,WS,API processGo
class WH,MP,SRV,CMD,PLG processTS
class DB1,DB2,LOG database
class U1,U2,U3 user
| Servicio | Responsabilidad | Patrón | Estado |
|---|---|---|---|
| DrasBot Core | Orquestador principal | Singleton | ✅ Activo |
| MessageProcessor | Pipeline de procesamiento | Pipeline Pattern | ✅ Activo |
| UserManager | CRUD usuarios SQLite | Repository Pattern | ✅ Activo |
| CommandRegistry | Gestión comandos dinámicos | Command Pattern | ✅ Activo |
| PluginManager | Sistema de plugins | Plugin Pattern | ✅ Activo |
| ConfigService | Configuración hot-reload | Singleton | ✅ Activo |
| DatabaseService | Capa de datos SQLite | Singleton | ✅ Activo |
| WebhookServer | HTTP server Express | Factory | ✅ Activo |
| WhatsAppBridge | Cliente bridge Go | Adapter Pattern | ✅ Activo |
| ContextManager | Gestión conversaciones | State Pattern | ✅ Activo |