kukuy 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +107 -192
- package/balancer.log +2 -0
- package/certs/auto/certificate.crt +22 -0
- package/certs/auto/private.key +28 -0
- package/kukuy-plugins/README.md +91 -0
- package/kukuy-plugins/ejemplo-plugin/index.js +39 -0
- package/kukuy-plugins/ejemplo-plugin/manifest.json +11 -0
- package/package.json +2 -1
- package/servers_real.json +5 -0
- package/src/core/Balancer.js +76 -5
- package/src/extensibility/ExtendedFilterChain.js +90 -0
- package/src/extensibility/ExtendedHookManager.js +87 -0
- package/src/extensibility/PostStartupExtension.js +97 -0
- package/src/plugins/PluginManager.js +183 -0
- package/.ctagsd/ctagsd.json +0 -954
- package/.ctagsd/file_list.txt +0 -100
- package/.ctagsd/tags.db +0 -0
- package/CHANGELOG.md +0 -125
- package/LICENSE +0 -680
- package/README-SSL.md +0 -165
- package/captura.png +0 -0
- package/kukuu1.webp +0 -0
- package/kukuy.workspace +0 -11
- package/optimize-mariadb.sh +0 -152
- package/restart-balancer.sh +0 -10
- package/scripts/load_test.py +0 -151
- package/stress-test.js +0 -190
- package/test_optimization.js +0 -54
package/README.md
CHANGED
|
@@ -1,65 +1,26 @@
|
|
|
1
|
-
# KUKUY
|
|
1
|
+
# KUKUY - Balanceador de Carga
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
KUKUY es un sistema de balanceo de carga backend desarrollado en Node.js que permite distribuir solicitudes entre múltiples servidores backend utilizando diferentes algoritmos de balanceo. El sistema incluye características avanzadas como soporte para hooks, filtros, rutas personalizadas y un panel de control web.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Características Principales
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
npm install -g kukuy
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
O para instalarlo localmente en tu proyecto:
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
npm install kukuy
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Características
|
|
27
|
-
|
|
28
|
-
- Distribución de carga usando algoritmo RoundRobin
|
|
29
|
-
- Soporte para HTTP y HTTPS
|
|
30
|
-
- Configuración mediante variables de entorno
|
|
31
|
-
- Arquitectura modular con soporte para hooks y filtros
|
|
32
|
-
- Verificación de salud de servidores backend
|
|
33
|
-
- Enrutamiento basado en patrones
|
|
34
|
-
- Sistema de logging detallado para servidores online/offline
|
|
35
|
-
- Caching de respuestas para mejorar el rendimiento
|
|
36
|
-
- Panel de control web para monitoreo
|
|
37
|
-
|
|
38
|
-
## Instalación
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
npm install
|
|
42
|
-
```
|
|
7
|
+
- **Algoritmos de Balanceo**: Soporta algoritmos como Round Robin e IP Hash
|
|
8
|
+
- **Soporte para HTTPS/SSL**: Capacidad de manejar conexiones seguras
|
|
9
|
+
- **Panel de Control Web**: Interfaz gráfica para monitorear el estado del sistema
|
|
10
|
+
- **Sistema de Plugins**: Arquitectura extensible mediante plugins
|
|
11
|
+
- **Hooks y Filtros**: Capacidad para interceptar y modificar solicitudes/responses
|
|
12
|
+
- **Rutas Personalizadas**: Configuración flexible de rutas para diferentes grupos de servidores
|
|
13
|
+
- **Monitoreo en Tiempo Real**: Métricas detalladas sobre rendimiento y estado de servidores
|
|
14
|
+
- **Reintento Inteligente**: Reenvío automático de solicitudes a servidores alternativos en caso de fallo
|
|
43
15
|
|
|
44
16
|
## Configuración
|
|
45
17
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
- `BALANCER_HTTP_PORT`: Puerto para conexiones HTTP (por defecto: 8080)
|
|
49
|
-
- `BALANCER_HTTPS_PORT`: Puerto para conexiones HTTPS (opcional)
|
|
50
|
-
- `CONFIG_FILE_PATH`: Ruta al archivo de configuración de servidores (por defecto: ./servers.json)
|
|
51
|
-
- `ROUTES_FILE_PATH`: Ruta al archivo de configuración de rutas (por defecto: ./routes.json)
|
|
52
|
-
- `LOAD_BALANCING_ALGORITHM`: Algoritmo de balanceo a usar ('roundrobin' o 'iphash') (por defecto: 'roundrobin')
|
|
53
|
-
- `SSL_CERT_PATH`: Ruta al certificado SSL (requerido para HTTPS)
|
|
54
|
-
- `SSL_KEY_PATH`: Ruta a la llave privada SSL (requerido para HTTPS)
|
|
55
|
-
- `HEALTH_CHECK_INTERVAL`: Intervalo para verificación de salud en ms (por defecto: 30000)
|
|
56
|
-
- `LOG_LEVEL`: Nivel de logging (info, warn, error, debug) (por defecto: info)
|
|
57
|
-
- `LOG_FILE_PATH`: Ruta al archivo de logs (por defecto: ./balancer.log)
|
|
18
|
+
### Archivos de Configuración
|
|
58
19
|
|
|
59
|
-
|
|
20
|
+
El sistema utiliza varios archivos de configuración:
|
|
60
21
|
|
|
61
|
-
|
|
62
|
-
Define los servidores backend:
|
|
22
|
+
#### `servers.json`
|
|
23
|
+
Define los servidores backend a los que se distribuirán las solicitudes:
|
|
63
24
|
|
|
64
25
|
```json
|
|
65
26
|
{
|
|
@@ -67,21 +28,24 @@ Define los servidores backend:
|
|
|
67
28
|
{
|
|
68
29
|
"url": "http://localhost:3001",
|
|
69
30
|
"weight": 1,
|
|
70
|
-
"tags": ["api"]
|
|
71
|
-
"active": true
|
|
31
|
+
"tags": ["api"]
|
|
72
32
|
},
|
|
73
33
|
{
|
|
74
34
|
"url": "http://localhost:3002",
|
|
75
35
|
"weight": 1,
|
|
76
|
-
"tags": ["api"]
|
|
77
|
-
|
|
36
|
+
"tags": ["api"]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"url": "http://localhost:3003",
|
|
40
|
+
"weight": 1,
|
|
41
|
+
"tags": ["web"]
|
|
78
42
|
}
|
|
79
43
|
]
|
|
80
44
|
}
|
|
81
45
|
```
|
|
82
46
|
|
|
83
|
-
|
|
84
|
-
Define las
|
|
47
|
+
#### `routes.json`
|
|
48
|
+
Define las rutas y a qué grupo de servidores deben dirigirse:
|
|
85
49
|
|
|
86
50
|
```json
|
|
87
51
|
{
|
|
@@ -100,173 +64,124 @@ Define las reglas de enrutamiento para dirigir solicitudes específicas a grupos
|
|
|
100
64
|
}
|
|
101
65
|
```
|
|
102
66
|
|
|
103
|
-
|
|
104
|
-
- Las rutas definen patrones de URL (usando comodín `*`) y métodos HTTP permitidos
|
|
105
|
-
- El campo `target` especifica la etiqueta de servidores backend a los que se dirigirá la solicitud
|
|
106
|
-
- Por ejemplo, todas las solicitudes que empiezan con `/api/` se enviarán solo a servidores que tengan la etiqueta "api"
|
|
107
|
-
- Las solicitudes que no coincidan con ninguna ruta específica se distribuirán entre todos los servidores disponibles
|
|
67
|
+
### Variables de Entorno
|
|
108
68
|
|
|
109
|
-
|
|
69
|
+
- `LOAD_BALANCING_ALGORITHM`: Algoritmo de balanceo ('roundrobin' o 'iphash')
|
|
70
|
+
- `BALANCER_HTTP_PORT`: Puerto HTTP del balanceador (por defecto 8080)
|
|
71
|
+
- `BALANCER_HTTPS_PORT`: Puerto HTTPS del balanceador
|
|
72
|
+
- `CONFIG_FILE_PATH`: Ruta al archivo de configuración de servidores
|
|
73
|
+
- `ROUTES_FILE_PATH`: Ruta al archivo de configuración de rutas
|
|
74
|
+
- `SSL_CERT_PATH`: Ruta al certificado SSL
|
|
75
|
+
- `SSL_KEY_PATH`: Ruta a la llave privada SSL
|
|
76
|
+
- `DASHBOARD_PORT`: Puerto del panel de control web (por defecto 8082)
|
|
77
|
+
- `WEBSOCKET_PORT`: Puerto del servidor WebSocket (por defecto 8083)
|
|
78
|
+
- `HEALTH_CHECK_INTERVAL`: Intervalo de verificación de salud de servidores
|
|
79
|
+
- `LOG_LEVEL`: Nivel de logging (por defecto 'info')
|
|
110
80
|
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
npm start
|
|
114
|
-
```
|
|
81
|
+
## Algoritmos de Balanceo
|
|
115
82
|
|
|
116
|
-
###
|
|
117
|
-
|
|
118
|
-
npm run dev
|
|
119
|
-
```
|
|
83
|
+
### Round Robin
|
|
84
|
+
Distribuye las solicitudes de forma equitativa entre todos los servidores disponibles, ciclando secuencialmente.
|
|
120
85
|
|
|
121
|
-
###
|
|
122
|
-
|
|
123
|
-
BALANCER_HTTP_PORT=9090 BALANCER_HTTPS_PORT=9443 CONFIG_FILE_PATH=./my-servers.json npm start
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### Con algoritmo de balanceo específico:
|
|
127
|
-
```bash
|
|
128
|
-
# Usar algoritmo RoundRobin (predeterminado)
|
|
129
|
-
LOAD_BALANCING_ALGORITHM=roundrobin npm start
|
|
86
|
+
### IP Hash
|
|
87
|
+
Utiliza la dirección IP del cliente para determinar a qué servidor se enviará la solicitud, asegurando que las solicitudes del mismo cliente siempre vayan al mismo servidor.
|
|
130
88
|
|
|
131
|
-
|
|
132
|
-
LOAD_BALANCING_ALGORITHM=iphash npm start
|
|
133
|
-
```
|
|
89
|
+
## Scripts de Inicio
|
|
134
90
|
|
|
135
|
-
|
|
91
|
+
El proyecto incluye scripts preconfigurados para iniciar el balanceador:
|
|
136
92
|
|
|
137
|
-
|
|
93
|
+
### `start-roundrobin.sh`
|
|
94
|
+
Inicia el balanceador con el algoritmo Round Robin:
|
|
138
95
|
```bash
|
|
139
96
|
./start-roundrobin.sh
|
|
140
97
|
```
|
|
141
98
|
|
|
142
|
-
|
|
99
|
+
### `start-iphash.sh`
|
|
100
|
+
Inicia el balanceador con el algoritmo IP Hash:
|
|
143
101
|
```bash
|
|
144
102
|
./start-iphash.sh
|
|
145
103
|
```
|
|
146
104
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
### API del Panel Web
|
|
105
|
+
### `start-ssl.sh` y `start-ssl-config.sh`
|
|
106
|
+
Scripts para iniciar el balanceador con soporte SSL/TLS.
|
|
150
107
|
|
|
151
|
-
|
|
108
|
+
## Panel de Control Web
|
|
152
109
|
|
|
153
|
-
|
|
154
|
-
- `GET /api/status` - Estado general del balanceador
|
|
155
|
-
- `GET /api/metrics` - Métricas generales de rendimiento
|
|
156
|
-
- `GET /api/servers` - Estado de los servidores backend
|
|
157
|
-
- `GET /api/server-stats` - Estadísticas detalladas por servidor
|
|
158
|
-
|
|
159
|
-
#### Ejemplo de respuesta de estadísticas por servidor:
|
|
160
|
-
```json
|
|
161
|
-
{
|
|
162
|
-
"serverStats": {
|
|
163
|
-
"1": {
|
|
164
|
-
"id": 1,
|
|
165
|
-
"totalRequests": 10,
|
|
166
|
-
"successfulRequests": 10,
|
|
167
|
-
"failedRequests": 0,
|
|
168
|
-
"totalResponseTime": 1250,
|
|
169
|
-
"minResponseTime": 5,
|
|
170
|
-
"maxResponseTime": 346,
|
|
171
|
-
"avgResponseTime": 125,
|
|
172
|
-
"responseCodes": {"200": 10},
|
|
173
|
-
"lastActive": 1769298297602,
|
|
174
|
-
"responseTimes": [346, 7, 7, 12, 45, 67, 89, 102, 115, 120]
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
```
|
|
110
|
+
KUKUY incluye un panel de control web accesible en `http://localhost:8082` (por defecto) que muestra:
|
|
179
111
|
|
|
180
|
-
|
|
112
|
+
- Estado general del sistema
|
|
113
|
+
- Métricas de rendimiento (RPS, tiempo de respuesta promedio)
|
|
114
|
+
- Estado de los servidores backend
|
|
115
|
+
- Información sobre el algoritmo de balanceo actual
|
|
116
|
+
- Gráficos de uso reciente
|
|
181
117
|
|
|
182
|
-
|
|
183
|
-
- `onServerSelected`: Se ejecuta después de seleccionar un servidor backend
|
|
184
|
-
- `onResponseSent`: Se ejecuta cuando se envía la respuesta al cliente
|
|
185
|
-
- `onServerError`: Se ejecuta cuando ocurre un error con un servidor backend
|
|
118
|
+
## Sistema de Plugins
|
|
186
119
|
|
|
187
|
-
|
|
120
|
+
La arquitectura de KUKUY permite extender su funcionalidad mediante plugins. Los plugins se colocan en el directorio `kukuy-plugins/` y deben incluir un archivo `manifest.json` con la configuración del plugin.
|
|
188
121
|
|
|
189
|
-
|
|
190
|
-
- `RateLimitFilter`: Control de límite de peticiones
|
|
191
|
-
- `LoggingFilter`: Registro de solicitudes
|
|
192
|
-
- `CachingFilter`: Caché de respuestas
|
|
122
|
+
### Estructura de un Plugin
|
|
193
123
|
|
|
194
|
-
|
|
124
|
+
Un plugin típico incluye:
|
|
195
125
|
|
|
196
|
-
|
|
197
|
-
- `
|
|
198
|
-
- `ServerPool.js`: Gestión del conjunto de servidores backend
|
|
199
|
-
- `RequestHandler.js`: Manejo de solicitudes entrantes (integrado en Balancer.js)
|
|
126
|
+
- `manifest.json`: Metadatos del plugin
|
|
127
|
+
- `index.js`: Código principal del plugin con funciones `init()` y `deinit()`
|
|
200
128
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
### Extensibilidad
|
|
216
|
-
- `HookManager.js`: Integración con `jerk-hooked-lib`
|
|
217
|
-
- `FilterChain.js`: Aplicación de filters a las solicitudes
|
|
218
|
-
|
|
219
|
-
### Utilidades
|
|
220
|
-
- `Logger.js`: Sistema de logging
|
|
221
|
-
- `BalancerLogger.js`: Sistema de logging detallado para servidores online/offline
|
|
222
|
-
- `HealthChecker.js`: Verificación de estado de servidores backend
|
|
223
|
-
- `MetricsCollector.js`: Recolección de métricas de rendimiento
|
|
224
|
-
|
|
225
|
-
## Componentes No Implementados (Mejoras Futuras)
|
|
129
|
+
Ejemplo de `manifest.json`:
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"name": "Nombre del Plugin",
|
|
133
|
+
"version": "1.0.0",
|
|
134
|
+
"description": "Descripción del plugin",
|
|
135
|
+
"author": "Autor",
|
|
136
|
+
"main": "index.js",
|
|
137
|
+
"kukuyVersion": "^1.6.0",
|
|
138
|
+
"hooks": ["onRequestReceived", "onResponseSent"],
|
|
139
|
+
"filters": ["request_processing"],
|
|
140
|
+
"enabled": true
|
|
141
|
+
}
|
|
142
|
+
```
|
|
226
143
|
|
|
227
|
-
|
|
228
|
-
- **Hot Reload de Configuración**: Actualización de configuración sin reinicio (requiere implementación de listeners de cambio de archivos)
|
|
229
|
-
- **API REST para Gestión de Servidores**: Endpoint para añadir/eliminar servidores dinámicamente
|
|
230
|
-
- **Sistema de Alertas**: Notificaciones cuando servidores caen o se recuperan
|
|
231
|
-
- **Soporte para WebSocket**: Balanceo de conexiones WebSocket
|
|
232
|
-
- **Compresión de Respuestas**: Soporte para Gzip/Brotli
|
|
233
|
-
- **Persistencia de Sesión**: Sticky sessions basadas en cookies o IP
|
|
144
|
+
## Hooks y Filtros
|
|
234
145
|
|
|
235
|
-
###
|
|
236
|
-
|
|
237
|
-
-
|
|
238
|
-
-
|
|
146
|
+
### Hooks
|
|
147
|
+
Permiten ejecutar código en puntos específicos del ciclo de vida de una solicitud:
|
|
148
|
+
- `onRequestReceived`: Cuando se recibe una solicitud
|
|
149
|
+
- `onServerSelected`: Después de seleccionar un servidor destino
|
|
150
|
+
- `onResponseSent`: Antes de enviar la respuesta al cliente
|
|
151
|
+
- `onServerError`: Cuando ocurre un error con un servidor backend
|
|
239
152
|
|
|
240
|
-
|
|
153
|
+
### Filtros
|
|
154
|
+
Permiten interceptar y potencialmente modificar o bloquear solicitudes antes de que sean procesadas:
|
|
155
|
+
- Se pueden aplicar filtros de solicitud (`request`)
|
|
156
|
+
- Permiten implementar lógica de seguridad, autenticación, etc.
|
|
241
157
|
|
|
242
|
-
|
|
243
|
-
El proyecto incluye un script de prueba de estrés:
|
|
244
|
-
```bash
|
|
245
|
-
DURATION_SECONDS=30 CONCURRENT_REQUESTS=20 node stress-test.js
|
|
246
|
-
```
|
|
158
|
+
## Seguridad
|
|
247
159
|
|
|
248
|
-
|
|
160
|
+
- El sistema incluye mecanismos para marcar servidores como fallidos temporalmente
|
|
161
|
+
- Implementa reintento inteligente hacia servidores alternativos
|
|
162
|
+
- Permite configurar límites de intentos fallidos antes de excluir un servidor
|
|
249
163
|
|
|
250
|
-
|
|
251
|
-
El dashboard no refleja en tiempo real cuando servidores se vuelven offline o se levantan después de iniciar el balanceador. La información de estado de los servidores puede no actualizar inmediatamente cuando un servidor backend cambia de estado.
|
|
164
|
+
## Monitoreo y Métricas
|
|
252
165
|
|
|
253
|
-
|
|
166
|
+
KUKUY proporciona métricas detalladas sobre:
|
|
167
|
+
- Solicitudes totales procesadas
|
|
168
|
+
- RPS (Solicitudes por segundo) acumulado e instantáneo
|
|
169
|
+
- Tiempo de respuesta promedio
|
|
170
|
+
- Tasa de éxito
|
|
171
|
+
- Estado de salud de los servidores
|
|
172
|
+
- Uso de recursos del sistema (CPU, memoria)
|
|
254
173
|
|
|
255
174
|
## Licencia
|
|
256
175
|
|
|
257
|
-
Este proyecto está licenciado bajo la Licencia
|
|
176
|
+
Este proyecto está licenciado bajo la Licencia GPL-3.0 o posterior.
|
|
258
177
|
|
|
259
|
-
|
|
178
|
+
## Autor
|
|
260
179
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
180
|
+
Benjamín Sánchez Cárdenas
|
|
181
|
+
Email de contacto: bytedogssyndicate@gmail.com
|
|
182
|
+
Página web oficial: https://bsanchez.unaux.com/
|
|
183
|
+
Repositorio oficial: https://gitlab.com/bytedogssyndicate1/kukuy
|
|
265
184
|
|
|
266
|
-
|
|
267
|
-
SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de
|
|
268
|
-
COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR.
|
|
269
|
-
Consulte la Licencia Pública General GNU para obtener más detalles.
|
|
185
|
+
## Contribuciones
|
|
270
186
|
|
|
271
|
-
|
|
272
|
-
junto con este programa. Si no, consulte <https://www.gnu.org/licenses/>.
|
|
187
|
+
Las contribuciones son bienvenidas. Por favor, abre un issue o pull request para discutir cambios propuestos.
|
package/balancer.log
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
{"timestamp":"2026-01-30T19:04:05.202Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":631,"statusCode":200}}
|
|
2
|
+
{"timestamp":"2026-01-30T19:04:34.272Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":56,"statusCode":200}}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIDtzCCAp+gAwIBAgIUFTU+RfyHp2GmFigOSZ9AiN8SGLcwDQYJKoZIhvcNAQEL
|
|
3
|
+
BQAwazELMAkGA1UEBhMCRVMxDzANBgNVBAgMBk1hZHJpZDEPMA0GA1UEBwwGTWFk
|
|
4
|
+
cmlkMQ4wDAYDVQQKDAVLdWt1eTEWMBQGA1UECwwNSVQgRGVwYXJ0bWVudDESMBAG
|
|
5
|
+
A1UEAwwJbG9jYWxob3N0MB4XDTI2MDEyNjAxNTU1NFoXDTI3MDEyNjAxNTU1NFow
|
|
6
|
+
azELMAkGA1UEBhMCRVMxDzANBgNVBAgMBk1hZHJpZDEPMA0GA1UEBwwGTWFkcmlk
|
|
7
|
+
MQ4wDAYDVQQKDAVLdWt1eTEWMBQGA1UECwwNSVQgRGVwYXJ0bWVudDESMBAGA1UE
|
|
8
|
+
AwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlN3F
|
|
9
|
+
rAiKzKOIybQsmGIF+sBmfgkqsC/jq3EBsOnIDXG2Kz0AVLNCD1nxTmYB06x7TN7V
|
|
10
|
+
xCSXiaGJEAW2v2+CLOpiFtO9S9hnxsoENN3DI/ZNYVBD5QbPFdkyTUw31iq8Vdhp
|
|
11
|
+
tkrxwnY7q7S/Ss1BEKxL/y0f4bSD9bXAYbTJRFlx5bv8KE0+Opr3EywGmyd9Fwwq
|
|
12
|
+
Zf4+z19kc4/ILmguzrMTZ9MblzKN5VAxoQ+h5SzKY/pgIPTX9Y25ciKwlN8nPrYs
|
|
13
|
+
32CfFVqyH1sWY+hz8nhPIqJ++R12cofTyjBkfUoo7hE87wsIITmttxA9gJfd9k2j
|
|
14
|
+
jy6ebm40SGaHXjU7twIDAQABo1MwUTAdBgNVHQ4EFgQUYK1YQGMWkT9TpbPspqtu
|
|
15
|
+
tWzX3EMwHwYDVR0jBBgwFoAUYK1YQGMWkT9TpbPspqtutWzX3EMwDwYDVR0TAQH/
|
|
16
|
+
BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEADQWlR94ZUUSv+nYzpvhyonnxDoy+
|
|
17
|
+
YU4MATcisHc6HnbLUdwX95dSzIFLg/aurqcadWTL6q2RQusUpfpNdVPJXvXUXz/W
|
|
18
|
+
ebk1Q97qcz8jFp9hbZxb93mrmJE0JccMU36WZPVM8J9K8p11JABn+sJRQFIAOauU
|
|
19
|
+
C7ETVs84+b3JNLGH9Y3cJpB6Jm7DntFXZmp6Ehe8On4SwqIRfN11CKQs7SqcHXts
|
|
20
|
+
X6tgXisc7HskSbXXG5oSHKz+uwngH2V85RH/pKgly80IRT3FbPzFRBdSCDk6B4PM
|
|
21
|
+
Bqow/h9NX65Vd5aRFpsmje4eqrO2g0YQsPmpVAndIstn+HlW5YyLAb5dmA==
|
|
22
|
+
-----END CERTIFICATE-----
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCU3cWsCIrMo4jJ
|
|
3
|
+
tCyYYgX6wGZ+CSqwL+OrcQGw6cgNcbYrPQBUs0IPWfFOZgHTrHtM3tXEJJeJoYkQ
|
|
4
|
+
Bba/b4Is6mIW071L2GfGygQ03cMj9k1hUEPlBs8V2TJNTDfWKrxV2Gm2SvHCdjur
|
|
5
|
+
tL9KzUEQrEv/LR/htIP1tcBhtMlEWXHlu/woTT46mvcTLAabJ30XDCpl/j7PX2Rz
|
|
6
|
+
j8guaC7OsxNn0xuXMo3lUDGhD6HlLMpj+mAg9Nf1jblyIrCU3yc+tizfYJ8VWrIf
|
|
7
|
+
WxZj6HPyeE8ion75HXZyh9PKMGR9SijuETzvCwghOa23ED2Al932TaOPLp5ubjRI
|
|
8
|
+
ZodeNTu3AgMBAAECggEAIXLhNwHmWgvGsPeca5Le4BQ6E0ixAEyKXduy8xLcYfTy
|
|
9
|
+
Zy26NM3gYn2lpCV0dKDVRZTuODe2mvSiTOjTwpjmCXySlKl356JU0wxSPKS1c4+k
|
|
10
|
+
nGCCGORaRID8dfTRuPv6PFm3iv+06apSRwcCUmbjH0FvhAMaHkdGvT9c3jdWX9ZX
|
|
11
|
+
YpHtnQQzWQSdNByT6ELqUCD2lw9AtzRSdvMDEZ/H7WfepcJ8jNNAzLkNQIuezDR1
|
|
12
|
+
ciFA5dDhT8vOkEBV1LiQz0uUscsyefhDG1rUmFJxUng9IW2qNFEKxBfiWdZIGEK3
|
|
13
|
+
PInBm4QpOLHh1q6+XK2yeRSnw8uMfgPlDQgr5cGDYQKBgQDKLD01Letd0URs0INL
|
|
14
|
+
LRLox/k8GrCKEDXl+y7EvbWnLriDck4I+fkuQKenxQdVCBCOKGRgm92j3Y8vB+9I
|
|
15
|
+
QU8lIzohgAUt5GAm+7ZNdwbTX3hYmUmIFXdZEvIBZ61Xw+ghwSWh44Af5S8w4xoi
|
|
16
|
+
C5ewa4iBvSApOHzs6Q6/Tf8WYQKBgQC8gEATZNmiXH3ITYdGVmEY5uzqRyJIXt3y
|
|
17
|
+
BbfFooZc31daUx4HDnjgzdY8I5cr3JfNy1HvpXcLMWH79nRbEcwvaiKkqkvaGxHW
|
|
18
|
+
e6NTTkU46P4lAwtzsfM7eQrtRnfJGLUF7ZQzc/W05BkdyLq2Fmrox8Mt01rZs9Yo
|
|
19
|
+
R+4tv5LZFwKBgQCJ9uSSDNMIg81RAH4IaCr2Rbj0ZjZBEUzms6G3yspS21Q5B2Dv
|
|
20
|
+
ST7dbGu81nzpbwZ1LGVLdDItJ/4VFzIYOdE7w61gvQ9LwQRItg8zD93NkuH6fCis
|
|
21
|
+
wBFg7MfPY6PsN5mKp1b6AdkmauzoTKJBx21tjARsnNZ8qrq9pVFWBXDlIQKBgQC1
|
|
22
|
+
bOa/A9DoEQdLEzuAukCn/BLIhgB8ETqi51fyEzQpDRkBKYB8IDS9gb+RkFu+bol5
|
|
23
|
+
HBjXg7UpA7WgEZv5zw5sEEYZoIJzAJzRh5wx4OKFHNMHAoAyMXK+qgiXSLyfw3Tv
|
|
24
|
+
qLN8Nj6lhOibnwf9m2P4edPkNkl5wTn8+QZH59vJrwKBgDi7kLHz+fLxM6BYQ92F
|
|
25
|
+
mRgxHoY1Cj0jpPEGx+9A7e8f2zQUSb9nUU0et0NHmiGmgkUTqVwy7lWGFSXjvoaz
|
|
26
|
+
Vm1UrDskAbngwmSHpPDeBZTOHHR9PRyPWdJqUzJjk7boQK9gK65BeYLkY9klJFIN
|
|
27
|
+
bWZG2VQiV6rOcc/8WWgZtlrG
|
|
28
|
+
-----END PRIVATE KEY-----
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Sistema de Plugins para Kukuy
|
|
2
|
+
|
|
3
|
+
## Introducción
|
|
4
|
+
|
|
5
|
+
Kukuy incluye un sistema de plugins que permite extender su funcionalidad sin modificar el código base. Los plugins se almacenan en el directorio `kukuy-plugins/` y se cargan automáticamente al iniciar Kukuy.
|
|
6
|
+
|
|
7
|
+
## Estructura de un Plugin
|
|
8
|
+
|
|
9
|
+
Cada plugin debe tener la siguiente estructura:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
kukuy-plugins/
|
|
13
|
+
└── nombre-del-plugin/
|
|
14
|
+
├── manifest.json
|
|
15
|
+
└── index.js
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Manifest
|
|
19
|
+
|
|
20
|
+
El archivo `manifest.json` debe contener:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"name": "Nombre del Plugin",
|
|
25
|
+
"version": "1.0.0",
|
|
26
|
+
"description": "Descripción del plugin",
|
|
27
|
+
"author": "Autor del plugin",
|
|
28
|
+
"main": "index.js",
|
|
29
|
+
"kukuyVersion": "^1.6.0",
|
|
30
|
+
"hooks": ["onRequestReceived", "onResponseSent"],
|
|
31
|
+
"filters": ["request_processing"],
|
|
32
|
+
"enabled": true
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Campos obligatorios:
|
|
37
|
+
- `name`: Nombre del plugin
|
|
38
|
+
- `version`: Versión del plugin
|
|
39
|
+
- `description`: Descripción del plugin
|
|
40
|
+
- `main`: Archivo principal del plugin
|
|
41
|
+
- `enabled`: Si el plugin está habilitado o no
|
|
42
|
+
|
|
43
|
+
Campos opcionales:
|
|
44
|
+
- `author`: Autor del plugin
|
|
45
|
+
- `kukuyVersion`: Versión de Kukuy requerida
|
|
46
|
+
- `hooks`: Lista de hooks que el plugin usa
|
|
47
|
+
- `filters`: Lista de filtros que el plugin usa
|
|
48
|
+
- `dependencies`: Dependencias del plugin
|
|
49
|
+
|
|
50
|
+
## Archivo Principal
|
|
51
|
+
|
|
52
|
+
El archivo principal (por defecto `index.js`) debe exportar las funciones:
|
|
53
|
+
|
|
54
|
+
- `init(balancer)`: Se llama cuando se carga el plugin
|
|
55
|
+
- `deinit(balancer)`: Se llama cuando se descarga el plugin (opcional)
|
|
56
|
+
|
|
57
|
+
## API de Extensión
|
|
58
|
+
|
|
59
|
+
Dentro del plugin, puedes usar la API de extensión para registrar filtros y hooks:
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
async function init(balancer) {
|
|
63
|
+
const extension = balancer.getPostStartupExtension();
|
|
64
|
+
|
|
65
|
+
// Registrar un filtro
|
|
66
|
+
extension.registerFilter('request_processing', async (data) => {
|
|
67
|
+
// Lógica del filtro
|
|
68
|
+
return { allowed: true };
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Registrar un hook
|
|
72
|
+
extension.registerHook('onRequestReceived', async ({ req, res }) => {
|
|
73
|
+
// Lógica del hook
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Hooks Disponibles
|
|
79
|
+
|
|
80
|
+
- `onRequestReceived`: Se ejecuta cuando se recibe una solicitud
|
|
81
|
+
- `onServerSelected`: Se ejecuta después de seleccionar el servidor
|
|
82
|
+
- `onResponseSent`: Se ejecuta antes de enviar la respuesta
|
|
83
|
+
- `onServerError`: Se ejecuta cuando ocurre un error
|
|
84
|
+
|
|
85
|
+
## Filtros Disponibles
|
|
86
|
+
|
|
87
|
+
- `request_processing`: Se aplica al procesamiento de solicitudes
|
|
88
|
+
|
|
89
|
+
## Variables de Entorno
|
|
90
|
+
|
|
91
|
+
- `PLUGINS_DIR`: Directorio donde buscar plugins (por defecto: `./kukuy-plugins`)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin de ejemplo para Kukuy
|
|
3
|
+
* Demuestra cómo crear un plugin que se carga automáticamente
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
async function init(balancer) {
|
|
7
|
+
console.log('Inicializando plugin de ejemplo...');
|
|
8
|
+
|
|
9
|
+
const extension = balancer.getPostStartupExtension();
|
|
10
|
+
|
|
11
|
+
// Registrar un filtro de ejemplo
|
|
12
|
+
extension.registerFilter('request_processing', async (data) => {
|
|
13
|
+
const { req, res } = data;
|
|
14
|
+
console.log(`Plugin: Procesando solicitud ${req.method} ${req.url}`);
|
|
15
|
+
|
|
16
|
+
// Agregar un header personalizado
|
|
17
|
+
req.headers['x-plugin-example'] = 'activated';
|
|
18
|
+
|
|
19
|
+
return { allowed: true };
|
|
20
|
+
}, 5);
|
|
21
|
+
|
|
22
|
+
// Registrar un hook para cuando se recibe una solicitud
|
|
23
|
+
extension.registerHook('onRequestReceived', async ({ req, res }) => {
|
|
24
|
+
console.log(`Plugin: Solicitud recibida - ${req.method} ${req.url}`);
|
|
25
|
+
}, 5);
|
|
26
|
+
|
|
27
|
+
// Registrar un hook para cuando se envía la respuesta
|
|
28
|
+
extension.registerHook('onResponseSent', async ({ req, res, serverRes, responseTime }) => {
|
|
29
|
+
console.log(`Plugin: Respuesta enviada para ${req.url} en ${responseTime}ms`);
|
|
30
|
+
}, 5);
|
|
31
|
+
|
|
32
|
+
console.log('Plugin de ejemplo inicializado correctamente');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function deinit(balancer) {
|
|
36
|
+
console.log('Desactivando plugin de ejemplo...');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
module.exports = { init, deinit };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Plugin de Ejemplo",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Plugin de ejemplo para demostrar la arquitectura de plugins",
|
|
5
|
+
"author": "Desarrollador",
|
|
6
|
+
"main": "index.js",
|
|
7
|
+
"kukuyVersion": "^1.6.0",
|
|
8
|
+
"hooks": ["onRequestReceived", "onResponseSent"],
|
|
9
|
+
"filters": ["request_processing"],
|
|
10
|
+
"enabled": true
|
|
11
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kukuy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Balanceador de carga Backend",
|
|
5
5
|
"main": "kukuy.js",
|
|
6
6
|
"scripts": {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
10
10
|
},
|
|
11
11
|
"keywords": [
|
|
12
|
+
"backend",
|
|
12
13
|
"load-balancer",
|
|
13
14
|
"round-robin",
|
|
14
15
|
"ip-hash",
|