@robiki/proxy 1.0.2 → 1.0.4

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.es.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # 🚀 Robiki Proxy
2
2
 
3
- > Un proxy inverso HTTP/2 de alto rendimiento y flexible con soporte WebSocket, enrutamiento configurable, CORS y validación de solicitudes. Úsalo como paquete npm en tu aplicación Node.js o como contenedor Docker independiente. Destinado a ser utilizado únicamente como proxy de dominio para entornos de desarrollo local.
3
+ > Un proxy inverso HTTP/2 de alto rendimiento con soporte WebSocket, enrutamiento configurable, CORS y validación de solicitudes. Úsalo como paquete npm o contenedor Docker para entornos de desarrollo local.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@robiki/proxy.svg)](https://www.npmjs.com/package/@robiki/proxy)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
7
 
8
- ## 🌍 Idiomas / Languages / Sprachen / 语言 / 言語 / Języki / Языки
8
+ ## 🌍 Idiomas
9
9
 
10
10
  [English](README.md) | [Deutsch](README.de.md) | [中文](README.zh.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Español](README.es.md) | [Русский](README.ru.md)
11
11
 
@@ -18,54 +18,29 @@
18
18
  - **✅ Validación de solicitudes**: Lógica de validación personalizada para autenticación, limitación de velocidad, etc.
19
19
  - **🔄 Remapeo de URL**: Transforma URLs antes de reenviarlas a servicios de destino
20
20
  - **📦 Uso dual**: Usa como paquete npm o contenedor Docker
21
+ - **⚙️ Soporte de configuración JavaScript y TypeScript**: Usa archivos de configuración `.js` o `.ts` con funciones en Docker
21
22
  - **🎯 Soporte multi-puerto**: Escucha en múltiples puertos simultáneamente
22
23
  - **⚡ Alto rendimiento**: Construido sobre la implementación nativa HTTP/2 de Node.js
23
24
 
24
25
  ## 📦 Instalación
25
26
 
26
- ### Como paquete npm
27
+ ### Paquete npm
27
28
 
28
29
  ```bash
29
30
  npm install @robiki/proxy
30
- ```
31
-
32
- ```bash
31
+ # o
33
32
  yarn add @robiki/proxy
34
33
  ```
35
34
 
36
- ### Como contenedor Docker
35
+ ### Docker
37
36
 
38
37
  ```bash
39
38
  docker pull robiki/proxy:latest
40
39
  ```
41
40
 
42
- ### Como servicio Docker Compose
43
-
44
- ```yaml
45
- services:
46
- proxy:
47
- image: robiki/proxy:latest
48
- container_name: robiki-proxy
49
- restart: unless-stopped
50
- ports:
51
- - '443:443'
52
- - '8080:8080'
53
- - '9229:9229'
54
- volumes:
55
- - ./proxy.config.json:/app/proxy.config.json:ro
56
- - ./certs:/app/certs:ro
57
- networks:
58
- - app-network
59
- ```
60
-
61
- ## Notas
62
-
63
- - Los hosts configurados localmente deben agregarse a su archivo `hosts` local.
64
- - Si está utilizando certificados personalizados, debe agregar los archivos de certificado al directorio `certs`.
65
-
66
41
  ## 🚀 Inicio rápido
67
42
 
68
- ### Uso como paquete npm
43
+ ### Paquete npm
69
44
 
70
45
  ```javascript
71
46
  import { createProxy } from '@robiki/proxy';
@@ -88,13 +63,11 @@ const proxy = await createProxy({
88
63
  },
89
64
  },
90
65
  });
91
-
92
- console.log('¡El servidor proxy está funcionando!');
93
66
  ```
94
67
 
95
- ### Uso con Docker
68
+ ### Docker
96
69
 
97
- 1. Crea un archivo `proxy.config.json`:
70
+ Crea `proxy.config.json`:
98
71
 
99
72
  ```json
100
73
  {
@@ -108,20 +81,14 @@ console.log('¡El servidor proxy está funcionando!');
108
81
  "api.example.com": {
109
82
  "target": "backend-service:3000",
110
83
  "ssl": true
111
- },
112
- "example.com": {
113
- "target": "frontend-service:8080",
114
- "ssl": false
115
84
  }
116
85
  }
117
86
  }
118
87
  ```
119
88
 
120
- 2. Crea un `docker-compose.yml`:
89
+ Crea `docker-compose.yml`:
121
90
 
122
91
  ```yaml
123
- version: '3.8'
124
-
125
92
  services:
126
93
  proxy:
127
94
  image: robiki/proxy:latest
@@ -133,25 +100,9 @@ services:
133
100
  - ./certs:/app/certs:ro
134
101
  environment:
135
102
  - PROXY_CONFIG=/app/proxy.config.json
136
- networks:
137
- - app-network
138
-
139
- backend-service:
140
- image: your-backend-image
141
- networks:
142
- - app-network
143
-
144
- frontend-service:
145
- image: your-frontend-image
146
- networks:
147
- - app-network
148
-
149
- networks:
150
- app-network:
151
- driver: bridge
152
103
  ```
153
104
 
154
- 3. Inicia los servicios:
105
+ Inicia:
155
106
 
156
107
  ```bash
157
108
  docker-compose up -d
@@ -159,9 +110,9 @@ docker-compose up -d
159
110
 
160
111
  ## 📖 Configuración
161
112
 
162
- ### Archivo de configuración
113
+ ### Configuración JSON
163
114
 
164
- Crea un archivo `proxy.config.json` con la siguiente estructura:
115
+ Configuración declarativa simple:
165
116
 
166
117
  ```json
167
118
  {
@@ -169,24 +120,17 @@ Crea un archivo `proxy.config.json` con la siguiente estructura:
169
120
  "ssl": {
170
121
  "key": "./certs/key.pem",
171
122
  "cert": "./certs/cert.pem",
172
- "ca": "./certs/ca.pem",
173
123
  "allowHTTP1": true
174
124
  },
175
125
  "cors": {
176
126
  "origin": "*",
177
- "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
178
- "allowedHeaders": ["Content-Type", "Authorization"],
179
- "credentials": true,
180
- "maxAge": 86400
127
+ "methods": ["GET", "POST", "PUT", "DELETE"],
128
+ "credentials": true
181
129
  },
182
130
  "routes": {
183
131
  "api.example.com": {
184
- "target": "backend-service:3000",
185
- "ssl": true,
186
- "cors": {
187
- "origin": ["https://example.com"],
188
- "credentials": true
189
- }
132
+ "target": "backend:3000",
133
+ "ssl": true
190
134
  },
191
135
  "*.example.com": {
192
136
  "target": "wildcard-service:4000",
@@ -196,78 +140,32 @@ Crea un archivo `proxy.config.json` con la siguiente estructura:
196
140
  }
197
141
  ```
198
142
 
199
- ### Variables de entorno
200
-
201
- También puedes configurar el proxy usando variables de entorno:
202
-
203
- ```bash
204
- # Configuración SSL
205
- SSL_KEY=/app/certs/key.pem
206
- SSL_CERT=/app/certs/cert.pem
207
- SSL_CA=/app/certs/ca.pem
208
- SSL_ALLOW_HTTP1=true
209
-
210
- # Configuración CORS
211
- CORS_ORIGIN=*
212
- CORS_METHODS=GET,POST,PUT,DELETE,OPTIONS
213
- CORS_HEADERS=Content-Type,Authorization
214
- CORS_CREDENTIALS=true
215
-
216
- # Modo de depuración
217
- DEBUG=true # Habilita el registro detallado para conexiones proxy y errores
218
- ```
219
-
220
- ## 🎯 Uso avanzado
221
-
222
- ### Remapeo de URL
223
-
224
- Transforma URLs antes de reenviarlas a servicios de destino:
225
-
226
- ```javascript
227
- const config = {
228
- routes: {
229
- 'api.example.com': {
230
- target: 'backend:3000',
231
- ssl: true,
232
- remap: (url) => {
233
- // Eliminar prefijo /api
234
- return url.replace(/^\/api/, '');
235
- },
236
- },
237
- },
238
- };
239
- ```
240
-
241
- ### Validación de solicitudes
143
+ ### Configuración JavaScript
242
144
 
243
- Agrega lógica de validación personalizada para autenticación, limitación de velocidad, etc.:
145
+ Para características avanzadas como remapeo de URL y validación:
244
146
 
245
147
  ```javascript
246
- const config = {
247
- // Validación global
248
- validate: async (info) => {
249
- if (!info.headers.authorization) {
250
- return {
251
- status: false,
252
- code: 401,
253
- message: 'No autorizado',
254
- headers: { 'www-authenticate': 'Bearer' },
255
- };
256
- }
257
- return { status: true };
148
+ // proxy.config.js
149
+ export default {
150
+ ports: [443, 8080],
151
+ ssl: {
152
+ key: './certs/key.pem',
153
+ cert: './certs/cert.pem',
154
+ allowHTTP1: true,
258
155
  },
259
156
  routes: {
260
157
  'api.example.com': {
261
158
  target: 'backend:3000',
262
159
  ssl: true,
263
- // Validación específica de ruta
160
+ // Remapeo de URL
161
+ remap: (url) => url.replace(/^\/api/, ''),
162
+ // Validación de solicitudes
264
163
  validate: async (info) => {
265
- const rateLimit = await checkRateLimit(info.remoteAddress);
266
- if (!rateLimit.allowed) {
164
+ if (!info.headers.authorization) {
267
165
  return {
268
166
  status: false,
269
- code: 429,
270
- message: 'Demasiadas solicitudes',
167
+ code: 401,
168
+ message: 'Unauthorized',
271
169
  };
272
170
  }
273
171
  return { status: true };
@@ -277,93 +175,80 @@ const config = {
277
175
  };
278
176
  ```
279
177
 
280
- ### Configuración CORS personalizada
178
+ ### Configuración TypeScript
281
179
 
282
- Configura CORS globalmente o por ruta:
180
+ Configuración con tipos seguros y soporte completo de IDE:
283
181
 
284
- ```javascript
285
- const config = {
286
- // CORS global
287
- cors: {
288
- origin: ['https://example.com', 'https://www.example.com'],
289
- methods: ['GET', 'POST', 'PUT', 'DELETE'],
290
- allowedHeaders: ['Content-Type', 'Authorization'],
291
- credentials: true,
292
- maxAge: 86400,
182
+ ```typescript
183
+ // proxy.config.ts
184
+ import type { ServerConfig, ConnectionInfo } from '@robiki/proxy';
185
+
186
+ const config: ServerConfig = {
187
+ ports: [443, 8080],
188
+ ssl: {
189
+ key: './certs/key.pem',
190
+ cert: './certs/cert.pem',
191
+ allowHTTP1: true,
293
192
  },
294
193
  routes: {
295
194
  'api.example.com': {
296
195
  target: 'backend:3000',
297
196
  ssl: true,
298
- // CORS específico de ruta (sobrescribe global)
299
- cors: {
300
- origin: '*',
301
- credentials: false,
197
+ remap: (url: string) => url.replace(/^\/api/, ''),
198
+ validate: async (info: ConnectionInfo) => {
199
+ if (!info.headers['x-api-key']) {
200
+ return { status: false, code: 401, message: 'API Key Required' };
201
+ }
202
+ return { status: true };
302
203
  },
303
204
  },
304
205
  },
305
206
  };
306
- ```
307
207
 
308
- ### Manejadores personalizados
208
+ export default config;
209
+ ```
309
210
 
310
- Crea manejadores de solicitudes personalizados para casos de uso avanzados:
211
+ ### Variables de entorno
311
212
 
312
- ```javascript
313
- import { createCustomProxy } from '@robiki/proxy';
213
+ ```bash
214
+ # Configuración SSL
215
+ SSL_KEY=/app/certs/key.pem
216
+ SSL_CERT=/app/certs/cert.pem
217
+ SSL_ALLOW_HTTP1=true
314
218
 
315
- const customRestHandler = async (req, res) => {
316
- if (req.url === '/health') {
317
- res.writeHead(200, { 'content-type': 'application/json' });
318
- return res.end(JSON.stringify({ status: 'ok' }));
319
- }
320
- // Volver al comportamiento de proxy predeterminado
321
- const { restAPIProxyHandler } = await import('@robiki/proxy/connections');
322
- return restAPIProxyHandler(req, res);
323
- };
219
+ # Configuración CORS
220
+ CORS_ORIGIN=*
221
+ CORS_METHODS=GET,POST,PUT,DELETE
222
+ CORS_CREDENTIALS=true
324
223
 
325
- const proxy = await createCustomProxy(config, {
326
- rest: customRestHandler,
327
- websocket: customWebSocketHandler,
328
- stream: customStreamHandler,
329
- });
224
+ # Modo de depuración
225
+ DEBUG=true
330
226
  ```
331
227
 
332
228
  ## 🔧 Referencia de API
333
229
 
334
- ### `createProxy(config: ServerConfig): Promise<ProxyServer>`
335
-
336
- Crea e inicia un servidor proxy con la configuración dada.
337
-
338
- **Parámetros:**
339
-
340
- - `config`: Objeto de configuración del servidor
341
-
342
- **Retorna:** Promise que se resuelve en una instancia de `ProxyServer`
343
-
344
- ### `ProxyServer`
230
+ ### `createProxy(config: ServerConfig)`
345
231
 
346
- **Métodos:**
232
+ Crea e inicia un servidor proxy.
347
233
 
348
- - `start()`: Iniciar el servidor proxy
349
- - `stop()`: Detener el servidor proxy
350
- - `getConfig()`: Obtener la configuración actual
351
-
352
- ### Tipos de configuración
353
-
354
- #### `ServerConfig`
234
+ **ServerConfig:**
355
235
 
356
236
  ```typescript
357
237
  interface ServerConfig {
358
238
  ports?: number[];
359
- ssl?: CertificateConfig;
239
+ ssl?: {
240
+ key: string;
241
+ cert: string;
242
+ ca?: string;
243
+ allowHTTP1?: boolean;
244
+ };
360
245
  routes: Record<string, RouteConfig>;
361
246
  cors?: CorsConfig;
362
247
  validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
363
248
  }
364
249
  ```
365
250
 
366
- #### `RouteConfig`
251
+ **RouteConfig:**
367
252
 
368
253
  ```typescript
369
254
  interface RouteConfig {
@@ -375,265 +260,86 @@ interface RouteConfig {
375
260
  }
376
261
  ```
377
262
 
378
- #### `CorsConfig`
379
-
380
- ```typescript
381
- interface CorsConfig {
382
- origin?: string | string[];
383
- methods?: string[];
384
- allowedHeaders?: string[];
385
- exposedHeaders?: string[];
386
- credentials?: boolean;
387
- maxAge?: number;
388
- }
389
- ```
390
-
391
- #### `ConnectionInfo`
392
-
393
- ```typescript
394
- interface ConnectionInfo {
395
- id: number;
396
- method: string;
397
- path: string;
398
- remoteAddress: string;
399
- scheme: string;
400
- authority: string;
401
- origin: string;
402
- headers: IncomingHttpHeaders;
403
- query: URLSearchParams;
404
- type: RequestType;
405
- }
406
- ```
407
-
408
263
  ## 🐳 Uso de Docker
409
264
 
410
- ### Uso en otro proyecto
411
-
412
- 1. Agrega el proxy a tu `docker-compose.yml`:
265
+ Monta tu archivo de configuración (JSON, .cjs o .ts):
413
266
 
414
267
  ```yaml
415
268
  services:
416
269
  proxy:
417
270
  image: robiki/proxy:latest
418
- ports:
419
- - '443:443'
420
- - '8080:8080'
421
271
  volumes:
422
- - ./proxy.config.json:/app/proxy.config.json:ro
272
+ - ./proxy.config.cjs:/app/proxy.config.cjs:ro
423
273
  - ./certs:/app/certs:ro
424
- networks:
425
- - your-network
426
-
427
- your-service:
428
- image: your-service-image
429
- networks:
430
- - your-network
431
- ```
432
-
433
- 2. Configura rutas en `proxy.config.json` para apuntar a tus servicios
434
-
435
- 3. Inicia tu stack:
436
-
437
- ```bash
438
- docker-compose up -d
439
- ```
440
-
441
- ### Construir imagen personalizada
442
-
443
- Crea un Dockerfile personalizado:
444
-
445
- ```dockerfile
446
- FROM robiki/proxy:latest
447
-
448
- # Copia tu configuración
449
- COPY proxy.config.json /app/proxy.config.json
450
- COPY certs /app/certs
451
-
452
- # Establece variables de entorno
453
- ENV PROXY_CONFIG=/app/proxy.config.json
274
+ environment:
275
+ - PROXY_CONFIG=/app/proxy.config.cjs
454
276
  ```
455
277
 
456
- ## 📚 Ejemplos
457
-
458
- Consulta el directorio `examples/` para más ejemplos de uso:
459
-
460
- - `basic-usage.js` - Configuración simple de proxy
461
- - `advanced-usage.js` - Características avanzadas (validación, CORS, remapeo)
462
- - `custom-handlers.js` - Manejadores de solicitudes personalizados
463
- - `docker-compose.example.yml` - Configuración completa de Docker
464
-
465
- ## 🔐 Certificados SSL/TLS
466
-
467
- ### Generar certificados autofirmados
278
+ ## 🔐 Certificados SSL
468
279
 
469
- Para desarrollo:
280
+ ### Desarrollo (autofirmados)
470
281
 
471
282
  ```bash
472
283
  mkdir -p certs
473
284
  openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodes
474
285
  ```
475
286
 
476
- ### Usar Let's Encrypt
477
-
478
- Para producción, usa certificados Let's Encrypt:
287
+ ### Producción (Let's Encrypt)
479
288
 
480
289
  ```bash
481
290
  certbot certonly --standalone -d example.com
482
291
  ```
483
292
 
484
- Luego refiérelos en tu configuración:
485
-
486
- ```json
487
- {
488
- "ssl": {
489
- "key": "/etc/letsencrypt/live/example.com/privkey.pem",
490
- "cert": "/etc/letsencrypt/live/example.com/fullchain.pem"
491
- }
492
- }
493
- ```
494
-
495
- ## 🤝 Contribuir
496
-
497
- ¡Las contribuciones son bienvenidas! No dudes en enviar un Pull Request.
498
-
499
- ## 📄 Licencia
500
-
501
- MIT © Robiki sp. z o.o.
502
-
503
- ## 🔗 Enlaces
504
-
505
- - [Repositorio GitHub](https://github.com/robiki-ai/robiki-proxy)
506
- - [Paquete npm](https://www.npmjs.com/package/@robiki/proxy)
507
- - [Rastreador de problemas](https://github.com/robiki-ai/robiki-proxy/issues)
508
-
509
- ## 💡 Casos de uso
510
-
511
- - **Arquitectura de microservicios**: Enrutar solicitudes a diferentes servicios según dominio/ruta
512
- - **Entorno de desarrollo**: Proxy local para probar múltiples servicios
513
- - **API Gateway**: Punto de entrada centralizado con autenticación y limitación de velocidad
514
- - **Terminación SSL**: Manejar SSL/TLS a nivel de proxy
515
- - **Gestión CORS**: Configuración CORS centralizada
516
- - **Balanceo de carga**: Distribuir tráfico entre múltiples instancias (con manejadores personalizados)
517
-
518
293
  ## 🛠️ Solución de problemas
519
294
 
520
295
  ### Modo de depuración
521
296
 
522
- Habilita el registro detallado para solucionar problemas de conexión:
297
+ Habilita el registro detallado:
523
298
 
524
299
  ```bash
525
- # Habilitar modo de depuración
526
- DEBUG=true node your-proxy-script.js
527
-
528
- # O con Docker
300
+ DEBUG=true node your-script.js
301
+ # o
529
302
  docker run -e DEBUG=true robiki/proxy:latest
530
-
531
- # O en docker-compose.yml
532
- services:
533
- proxy:
534
- image: robiki/proxy:latest
535
- environment:
536
- - DEBUG=true
537
303
  ```
538
304
 
539
- Cuando `DEBUG=true`, el proxy registrará:
540
- - Todos los intentos de conexión proxy (REST, WebSocket, flujos HTTP/2)
541
- - Detalles de solicitudes y respuestas
542
- - Errores de conexión y tiempos de espera
543
- - Errores de proxy y errores de cliente
544
-
545
305
  ### Puerto ya en uso
546
306
 
547
- El proxy intentará automáticamente matar procesos en los puertos configurados. Si esto falla, libera los puertos manualmente:
548
-
549
307
  ```bash
550
308
  lsof -ti:443 | xargs kill -9
551
- lsof -ti:8080 | xargs kill -9
552
309
  ```
553
310
 
554
- ### Errores de certificado SSL
555
-
556
- Asegúrate de que tus archivos de certificado sean legibles y estén en el formato correcto (PEM). Para desarrollo, usa certificados autofirmados.
557
-
558
- ### Problemas de conexión WebSocket
559
-
560
- Asegúrate de que tus rutas WebSocket estén configuradas con el protocolo correcto (ws/wss) y que el servicio de destino admita conexiones WebSocket.
561
-
562
311
  ## 🧪 Pruebas
563
312
 
564
- Robiki Proxy incluye un conjunto completo de pruebas que cubre pruebas unitarias, pruebas de integración y escenarios avanzados.
565
-
566
- ### Ejecutar pruebas
567
-
568
313
  ```bash
569
314
  # Ejecutar todas las pruebas
570
315
  yarn test
571
316
 
572
- # Ejecutar pruebas en modo watch
573
- yarn test:watch
574
-
575
- # Ejecutar pruebas con cobertura
317
+ # Con cobertura
576
318
  yarn test:coverage
577
319
 
578
- # Ejecutar pruebas con UI
579
- yarn test:ui
580
- ```
581
-
582
- ### Cobertura de pruebas
583
-
584
- El conjunto de pruebas incluye:
585
-
586
- - **Pruebas unitarias**: Configuración, utilidades, conversión de encabezados, manejo CORS
587
- - **Pruebas de integración**: Proxy HTTP, resolución de rutas, validación, carga de configuración
588
- - **Pruebas avanzadas**: Proxy WebSocket, flujos HTTP/2, conexiones concurrentes
589
- - **Pruebas Docker**: Construcción de contenedores, carga de configuración, comportamiento en tiempo de ejecución
590
-
591
- ### Pruebas Docker
592
-
593
- Ejecutar pruebas de integración Docker:
594
-
595
- ```bash
596
- # Prueba completa de integración Docker
320
+ # Pruebas Docker
597
321
  yarn test:docker
598
-
599
- # Probar carga de configuración específicamente
600
- yarn test:docker:config
601
-
602
- # Ejecutar todas las pruebas (unitarias + integración + Docker)
603
- yarn test:all
604
322
  ```
605
323
 
606
- O usando Make:
607
-
608
- ```bash
609
- # Prueba rápida de construcción Docker
610
- make test-docker
611
-
612
- # Suite completa de pruebas de integración
613
- make test-docker-full
614
-
615
- # Prueba de carga de configuración
616
- make test-docker-config
324
+ ## 📚 Ejemplos
617
325
 
618
- # Prueba Docker Compose
619
- make test-docker-compose
620
- ```
326
+ Consulta el directorio `examples/`:
621
327
 
622
- Consulta el [README de pruebas Docker](tests/docker/README.md) para más detalles.
328
+ - `basic-usage.js` - Configuración simple de proxy
329
+ - `advanced-usage.js` - Validación, CORS, remapeo
330
+ - `custom-handlers.js` - Manejadores de solicitudes personalizados
331
+ - `docker-compose.example.yml` - Configuración Docker
623
332
 
624
- ## 📊 Rendimiento
333
+ ## 🤝 Contribuir
625
334
 
626
- El proxy está construido sobre la implementación nativa HTTP/2 de Node.js y está diseñado para alto rendimiento:
335
+ ¡Las contribuciones son bienvenidas! Consulta [CONTRIBUTING.md](CONTRIBUTING.md) para más detalles.
627
336
 
628
- - Manejo eficiente de flujos
629
- - Sobrecarga mínima
630
- - Agrupación de conexiones
631
- - Respaldo automático a HTTP/1.1
337
+ ## 📄 Licencia
632
338
 
633
- Para implementaciones de producción, considera:
339
+ MIT © Robiki sp. z o.o.
634
340
 
635
- - Usar un gestor de procesos (PM2, systemd)
636
- - Habilitar clustering para sistemas multi-núcleo
637
- - Monitoreo con health checks
638
- - Configurar registro adecuado
341
+ ## 🔗 Enlaces
639
342
 
343
+ - [Repositorio GitHub](https://github.com/robiki-ai/robiki-proxy)
344
+ - [Paquete npm](https://www.npmjs.com/package/@robiki/proxy)
345
+ - [Rastreador de problemas](https://github.com/robiki-ai/robiki-proxy/issues)