@robiki/proxy 1.0.0 → 1.0.2
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.de.md +639 -0
- package/README.es.md +639 -0
- package/README.ja.md +639 -0
- package/README.md +55 -4
- package/README.pl.md +639 -0
- package/README.ru.md +639 -0
- package/README.zh.md +639 -0
- package/dist/config-CQ7zIaQt.d.ts +172 -0
- package/dist/config-CeJ1tf8T.d.ts +174 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +79 -38
- package/dist/utils/config.d.ts +1 -1
- package/dist/utils/config.js +5 -16
- package/package.json +7 -3
- package/tests/README.md +293 -0
- package/tests/docker/README.md +303 -0
package/README.es.md
ADDED
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
# 🚀 Robiki Proxy
|
|
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.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@robiki/proxy)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
## 🌍 Idiomas / Languages / Sprachen / 语言 / 言語 / Języki / Языки
|
|
9
|
+
|
|
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
|
+
|
|
12
|
+
## ✨ Características
|
|
13
|
+
|
|
14
|
+
- **🔒 Soporte HTTP/2 y SSL/TLS**: Soporte completo del protocolo HTTP/2 con respaldo automático a HTTP/1.1
|
|
15
|
+
- **🔌 Proxy WebSocket**: Manejo y proxy de conexiones WebSocket sin problemas
|
|
16
|
+
- **🌐 Enrutamiento flexible**: Configura rutas por dominio/host con soporte de comodines
|
|
17
|
+
- **🛡️ Gestión CORS**: Configuración CORS global y por ruta
|
|
18
|
+
- **✅ Validación de solicitudes**: Lógica de validación personalizada para autenticación, limitación de velocidad, etc.
|
|
19
|
+
- **🔄 Remapeo de URL**: Transforma URLs antes de reenviarlas a servicios de destino
|
|
20
|
+
- **📦 Uso dual**: Usa como paquete npm o contenedor Docker
|
|
21
|
+
- **🎯 Soporte multi-puerto**: Escucha en múltiples puertos simultáneamente
|
|
22
|
+
- **⚡ Alto rendimiento**: Construido sobre la implementación nativa HTTP/2 de Node.js
|
|
23
|
+
|
|
24
|
+
## 📦 Instalación
|
|
25
|
+
|
|
26
|
+
### Como paquete npm
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install @robiki/proxy
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
yarn add @robiki/proxy
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Como contenedor Docker
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
docker pull robiki/proxy:latest
|
|
40
|
+
```
|
|
41
|
+
|
|
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
|
+
## 🚀 Inicio rápido
|
|
67
|
+
|
|
68
|
+
### Uso como paquete npm
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
import { createProxy } from '@robiki/proxy';
|
|
72
|
+
|
|
73
|
+
const proxy = await createProxy({
|
|
74
|
+
ports: [443, 8080],
|
|
75
|
+
ssl: {
|
|
76
|
+
key: './certs/key.pem',
|
|
77
|
+
cert: './certs/cert.pem',
|
|
78
|
+
allowHTTP1: true,
|
|
79
|
+
},
|
|
80
|
+
routes: {
|
|
81
|
+
'api.example.com': {
|
|
82
|
+
target: 'localhost:3000',
|
|
83
|
+
ssl: true,
|
|
84
|
+
},
|
|
85
|
+
'example.com': {
|
|
86
|
+
target: 'localhost:8080',
|
|
87
|
+
ssl: false,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
console.log('¡El servidor proxy está funcionando!');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Uso con Docker
|
|
96
|
+
|
|
97
|
+
1. Crea un archivo `proxy.config.json`:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"ports": [443, 8080],
|
|
102
|
+
"ssl": {
|
|
103
|
+
"key": "/app/certs/key.pem",
|
|
104
|
+
"cert": "/app/certs/cert.pem",
|
|
105
|
+
"allowHTTP1": true
|
|
106
|
+
},
|
|
107
|
+
"routes": {
|
|
108
|
+
"api.example.com": {
|
|
109
|
+
"target": "backend-service:3000",
|
|
110
|
+
"ssl": true
|
|
111
|
+
},
|
|
112
|
+
"example.com": {
|
|
113
|
+
"target": "frontend-service:8080",
|
|
114
|
+
"ssl": false
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
2. Crea un `docker-compose.yml`:
|
|
121
|
+
|
|
122
|
+
```yaml
|
|
123
|
+
version: '3.8'
|
|
124
|
+
|
|
125
|
+
services:
|
|
126
|
+
proxy:
|
|
127
|
+
image: robiki/proxy:latest
|
|
128
|
+
ports:
|
|
129
|
+
- '443:443'
|
|
130
|
+
- '8080:8080'
|
|
131
|
+
volumes:
|
|
132
|
+
- ./proxy.config.json:/app/proxy.config.json:ro
|
|
133
|
+
- ./certs:/app/certs:ro
|
|
134
|
+
environment:
|
|
135
|
+
- 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
|
+
```
|
|
153
|
+
|
|
154
|
+
3. Inicia los servicios:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
docker-compose up -d
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## 📖 Configuración
|
|
161
|
+
|
|
162
|
+
### Archivo de configuración
|
|
163
|
+
|
|
164
|
+
Crea un archivo `proxy.config.json` con la siguiente estructura:
|
|
165
|
+
|
|
166
|
+
```json
|
|
167
|
+
{
|
|
168
|
+
"ports": [443, 8080],
|
|
169
|
+
"ssl": {
|
|
170
|
+
"key": "./certs/key.pem",
|
|
171
|
+
"cert": "./certs/cert.pem",
|
|
172
|
+
"ca": "./certs/ca.pem",
|
|
173
|
+
"allowHTTP1": true
|
|
174
|
+
},
|
|
175
|
+
"cors": {
|
|
176
|
+
"origin": "*",
|
|
177
|
+
"methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
|
|
178
|
+
"allowedHeaders": ["Content-Type", "Authorization"],
|
|
179
|
+
"credentials": true,
|
|
180
|
+
"maxAge": 86400
|
|
181
|
+
},
|
|
182
|
+
"routes": {
|
|
183
|
+
"api.example.com": {
|
|
184
|
+
"target": "backend-service:3000",
|
|
185
|
+
"ssl": true,
|
|
186
|
+
"cors": {
|
|
187
|
+
"origin": ["https://example.com"],
|
|
188
|
+
"credentials": true
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
"*.example.com": {
|
|
192
|
+
"target": "wildcard-service:4000",
|
|
193
|
+
"ssl": true
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
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
|
|
242
|
+
|
|
243
|
+
Agrega lógica de validación personalizada para autenticación, limitación de velocidad, etc.:
|
|
244
|
+
|
|
245
|
+
```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 };
|
|
258
|
+
},
|
|
259
|
+
routes: {
|
|
260
|
+
'api.example.com': {
|
|
261
|
+
target: 'backend:3000',
|
|
262
|
+
ssl: true,
|
|
263
|
+
// Validación específica de ruta
|
|
264
|
+
validate: async (info) => {
|
|
265
|
+
const rateLimit = await checkRateLimit(info.remoteAddress);
|
|
266
|
+
if (!rateLimit.allowed) {
|
|
267
|
+
return {
|
|
268
|
+
status: false,
|
|
269
|
+
code: 429,
|
|
270
|
+
message: 'Demasiadas solicitudes',
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
return { status: true };
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Configuración CORS personalizada
|
|
281
|
+
|
|
282
|
+
Configura CORS globalmente o por ruta:
|
|
283
|
+
|
|
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,
|
|
293
|
+
},
|
|
294
|
+
routes: {
|
|
295
|
+
'api.example.com': {
|
|
296
|
+
target: 'backend:3000',
|
|
297
|
+
ssl: true,
|
|
298
|
+
// CORS específico de ruta (sobrescribe global)
|
|
299
|
+
cors: {
|
|
300
|
+
origin: '*',
|
|
301
|
+
credentials: false,
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Manejadores personalizados
|
|
309
|
+
|
|
310
|
+
Crea manejadores de solicitudes personalizados para casos de uso avanzados:
|
|
311
|
+
|
|
312
|
+
```javascript
|
|
313
|
+
import { createCustomProxy } from '@robiki/proxy';
|
|
314
|
+
|
|
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
|
+
};
|
|
324
|
+
|
|
325
|
+
const proxy = await createCustomProxy(config, {
|
|
326
|
+
rest: customRestHandler,
|
|
327
|
+
websocket: customWebSocketHandler,
|
|
328
|
+
stream: customStreamHandler,
|
|
329
|
+
});
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## 🔧 Referencia de API
|
|
333
|
+
|
|
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`
|
|
345
|
+
|
|
346
|
+
**Métodos:**
|
|
347
|
+
|
|
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`
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
interface ServerConfig {
|
|
358
|
+
ports?: number[];
|
|
359
|
+
ssl?: CertificateConfig;
|
|
360
|
+
routes: Record<string, RouteConfig>;
|
|
361
|
+
cors?: CorsConfig;
|
|
362
|
+
validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
#### `RouteConfig`
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
interface RouteConfig {
|
|
370
|
+
target: string;
|
|
371
|
+
ssl?: boolean;
|
|
372
|
+
remap?: (url: string) => string;
|
|
373
|
+
cors?: CorsConfig;
|
|
374
|
+
validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
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
|
+
## 🐳 Uso de Docker
|
|
409
|
+
|
|
410
|
+
### Uso en otro proyecto
|
|
411
|
+
|
|
412
|
+
1. Agrega el proxy a tu `docker-compose.yml`:
|
|
413
|
+
|
|
414
|
+
```yaml
|
|
415
|
+
services:
|
|
416
|
+
proxy:
|
|
417
|
+
image: robiki/proxy:latest
|
|
418
|
+
ports:
|
|
419
|
+
- '443:443'
|
|
420
|
+
- '8080:8080'
|
|
421
|
+
volumes:
|
|
422
|
+
- ./proxy.config.json:/app/proxy.config.json:ro
|
|
423
|
+
- ./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
|
|
454
|
+
```
|
|
455
|
+
|
|
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
|
|
468
|
+
|
|
469
|
+
Para desarrollo:
|
|
470
|
+
|
|
471
|
+
```bash
|
|
472
|
+
mkdir -p certs
|
|
473
|
+
openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodes
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
### Usar Let's Encrypt
|
|
477
|
+
|
|
478
|
+
Para producción, usa certificados Let's Encrypt:
|
|
479
|
+
|
|
480
|
+
```bash
|
|
481
|
+
certbot certonly --standalone -d example.com
|
|
482
|
+
```
|
|
483
|
+
|
|
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
|
+
## 🛠️ Solución de problemas
|
|
519
|
+
|
|
520
|
+
### Modo de depuración
|
|
521
|
+
|
|
522
|
+
Habilita el registro detallado para solucionar problemas de conexión:
|
|
523
|
+
|
|
524
|
+
```bash
|
|
525
|
+
# Habilitar modo de depuración
|
|
526
|
+
DEBUG=true node your-proxy-script.js
|
|
527
|
+
|
|
528
|
+
# O con Docker
|
|
529
|
+
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
|
+
```
|
|
538
|
+
|
|
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
|
+
### Puerto ya en uso
|
|
546
|
+
|
|
547
|
+
El proxy intentará automáticamente matar procesos en los puertos configurados. Si esto falla, libera los puertos manualmente:
|
|
548
|
+
|
|
549
|
+
```bash
|
|
550
|
+
lsof -ti:443 | xargs kill -9
|
|
551
|
+
lsof -ti:8080 | xargs kill -9
|
|
552
|
+
```
|
|
553
|
+
|
|
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
|
+
## 🧪 Pruebas
|
|
563
|
+
|
|
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
|
+
```bash
|
|
569
|
+
# Ejecutar todas las pruebas
|
|
570
|
+
yarn test
|
|
571
|
+
|
|
572
|
+
# Ejecutar pruebas en modo watch
|
|
573
|
+
yarn test:watch
|
|
574
|
+
|
|
575
|
+
# Ejecutar pruebas con cobertura
|
|
576
|
+
yarn test:coverage
|
|
577
|
+
|
|
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
|
|
597
|
+
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
|
+
```
|
|
605
|
+
|
|
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
|
|
617
|
+
|
|
618
|
+
# Prueba Docker Compose
|
|
619
|
+
make test-docker-compose
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
Consulta el [README de pruebas Docker](tests/docker/README.md) para más detalles.
|
|
623
|
+
|
|
624
|
+
## 📊 Rendimiento
|
|
625
|
+
|
|
626
|
+
El proxy está construido sobre la implementación nativa HTTP/2 de Node.js y está diseñado para alto rendimiento:
|
|
627
|
+
|
|
628
|
+
- Manejo eficiente de flujos
|
|
629
|
+
- Sobrecarga mínima
|
|
630
|
+
- Agrupación de conexiones
|
|
631
|
+
- Respaldo automático a HTTP/1.1
|
|
632
|
+
|
|
633
|
+
Para implementaciones de producción, considera:
|
|
634
|
+
|
|
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
|
|
639
|
+
|