@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.md CHANGED
@@ -1,10 +1,14 @@
1
1
  # 🚀 Robiki Proxy
2
2
 
3
- > A high-performance, flexible HTTP/2 reverse proxy with WebSocket support, configurable routing, CORS, and request validation. Use it as an npm package in your Node.js application or as a standalone Docker container.
3
+ > A high-performance, flexible HTTP/2 reverse proxy with WebSocket support, configurable routing, CORS, and request validation. Use it as an npm package in your Node.js application or as a standalone Docker container. Meant to be used as a domain proxy for local development environments only.
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
+ ## 🌍 Languages / Sprachen / 语言 / 言語 / Języki / Idiomas / Языки
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
+
8
12
  ## ✨ Features
9
13
 
10
14
  - **🔒 HTTP/2 & SSL/TLS Support**: Full HTTP/2 protocol support with automatic HTTP/1.1 fallback
@@ -35,12 +39,30 @@ yarn add @robiki/proxy
35
39
  docker pull robiki/proxy:latest
36
40
  ```
37
41
 
38
- Or build from source:
42
+ ### As a Docker Compose Service
39
43
 
40
- ```bash
41
- docker build -t robiki/proxy .
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
42
59
  ```
43
60
 
61
+ ## Notes
62
+
63
+ - Hosts that are configured locally should be added to your local `hosts` file.
64
+ - If you are using a custom certificates, you need to add the certificate files to the `certs` directory.
65
+
44
66
  ## 🚀 Quick Start
45
67
 
46
68
  ### Using as npm Package
@@ -190,6 +212,9 @@ CORS_ORIGIN=*
190
212
  CORS_METHODS=GET,POST,PUT,DELETE,OPTIONS
191
213
  CORS_HEADERS=Content-Type,Authorization
192
214
  CORS_CREDENTIALS=true
215
+
216
+ # Debug Mode
217
+ DEBUG=true # Enable detailed logging for proxy connections and errors
193
218
  ```
194
219
 
195
220
  ## 🎯 Advanced Usage
@@ -492,6 +517,32 @@ MIT © Robiki sp. z o.o.
492
517
 
493
518
  ## 🛠️ Troubleshooting
494
519
 
520
+ ### Debug Mode
521
+
522
+ Enable detailed logging to troubleshoot connection issues:
523
+
524
+ ```bash
525
+ # Enable debug mode
526
+ DEBUG=true node your-proxy-script.js
527
+
528
+ # Or with Docker
529
+ docker run -e DEBUG=true robiki/proxy:latest
530
+
531
+ # Or in docker-compose.yml
532
+ services:
533
+ proxy:
534
+ image: robiki/proxy:latest
535
+ environment:
536
+ - DEBUG=true
537
+ ```
538
+
539
+ When `DEBUG=true`, the proxy will log:
540
+
541
+ - All proxy connection attempts (REST, WebSocket, HTTP/2 streams)
542
+ - Request and response details
543
+ - Connection errors and timeouts
544
+ - Proxy errors and client errors
545
+
495
546
  ### Port Already in Use
496
547
 
497
548
  The proxy will automatically attempt to kill processes on the configured ports. If this fails, manually free the ports:
package/README.pl.md ADDED
@@ -0,0 +1,639 @@
1
+ # 🚀 Robiki Proxy
2
+
3
+ > Wydajny, elastyczny reverse proxy HTTP/2 z obsługą WebSocket, konfigurowalnym routingiem, CORS i walidacją żądań. Używaj go jako pakiet npm w aplikacji Node.js lub jako samodzielny kontener Docker. Przeznaczony wyłącznie do użytku jako proxy domenowe w lokalnych środowiskach deweloperskich.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@robiki/proxy.svg)](https://www.npmjs.com/package/@robiki/proxy)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ ## 🌍 Języki / Languages / Sprachen / 语言 / 言語 / Idiomas / Языки
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
+ ## ✨ Funkcje
13
+
14
+ - **🔒 Obsługa HTTP/2 i SSL/TLS**: Pełna obsługa protokołu HTTP/2 z automatycznym powrotem do HTTP/1.1
15
+ - **🔌 Proxy WebSocket**: Bezproblemowa obsługa i proxy połączeń WebSocket
16
+ - **🌐 Elastyczny routing**: Konfiguracja tras według domeny/hosta z obsługą wildcardów
17
+ - **🛡️ Zarządzanie CORS**: Globalna i per-trasa konfiguracja CORS
18
+ - **✅ Walidacja żądań**: Niestandardowa logika walidacji dla uwierzytelniania, limitowania żądań itp.
19
+ - **🔄 Przekierowywanie URL**: Transformacja URL przed przekazaniem do usług docelowych
20
+ - **📦 Podwójne użycie**: Użyj jako pakiet npm lub kontener Docker
21
+ - **🎯 Obsługa wielu portów**: Nasłuchiwanie na wielu portach jednocześnie
22
+ - **⚡ Wysoka wydajność**: Zbudowany na natywnej implementacji HTTP/2 w Node.js
23
+
24
+ ## 📦 Instalacja
25
+
26
+ ### Jako pakiet npm
27
+
28
+ ```bash
29
+ npm install @robiki/proxy
30
+ ```
31
+
32
+ ```bash
33
+ yarn add @robiki/proxy
34
+ ```
35
+
36
+ ### Jako kontener Docker
37
+
38
+ ```bash
39
+ docker pull robiki/proxy:latest
40
+ ```
41
+
42
+ ### Jako usługa 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
+ ## Uwagi
62
+
63
+ - Hosty skonfigurowane lokalnie powinny zostać dodane do lokalnego pliku `hosts`.
64
+ - Jeśli używasz niestandardowych certyfikatów, musisz dodać pliki certyfikatów do katalogu `certs`.
65
+
66
+ ## 🚀 Szybki start
67
+
68
+ ### Użycie jako pakiet 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('Serwer proxy działa!');
93
+ ```
94
+
95
+ ### Użycie z Docker
96
+
97
+ 1. Utwórz plik `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. Utwórz `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. Uruchom usługi:
155
+
156
+ ```bash
157
+ docker-compose up -d
158
+ ```
159
+
160
+ ## 📖 Konfiguracja
161
+
162
+ ### Plik konfiguracyjny
163
+
164
+ Utwórz plik `proxy.config.json` o następującej strukturze:
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
+ ### Zmienne środowiskowe
200
+
201
+ Możesz również skonfigurować proxy za pomocą zmiennych środowiskowych:
202
+
203
+ ```bash
204
+ # Konfiguracja 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
+ # Konfiguracja CORS
211
+ CORS_ORIGIN=*
212
+ CORS_METHODS=GET,POST,PUT,DELETE,OPTIONS
213
+ CORS_HEADERS=Content-Type,Authorization
214
+ CORS_CREDENTIALS=true
215
+
216
+ # Tryb debugowania
217
+ DEBUG=true # Włącz szczegółowe logowanie dla połączeń proxy i błędów
218
+ ```
219
+
220
+ ## 🎯 Zaawansowane użycie
221
+
222
+ ### Przekierowywanie URL
223
+
224
+ Transformuj URL przed przekazaniem do usług docelowych:
225
+
226
+ ```javascript
227
+ const config = {
228
+ routes: {
229
+ 'api.example.com': {
230
+ target: 'backend:3000',
231
+ ssl: true,
232
+ remap: (url) => {
233
+ // Usuń prefiks /api
234
+ return url.replace(/^\/api/, '');
235
+ },
236
+ },
237
+ },
238
+ };
239
+ ```
240
+
241
+ ### Walidacja żądań
242
+
243
+ Dodaj niestandardową logikę walidacji dla uwierzytelniania, limitowania żądań itp.:
244
+
245
+ ```javascript
246
+ const config = {
247
+ // Walidacja globalna
248
+ validate: async (info) => {
249
+ if (!info.headers.authorization) {
250
+ return {
251
+ status: false,
252
+ code: 401,
253
+ message: 'Nieautoryzowany',
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
+ // Walidacja specyficzna dla trasy
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: 'Zbyt wiele żądań',
271
+ };
272
+ }
273
+ return { status: true };
274
+ },
275
+ },
276
+ },
277
+ };
278
+ ```
279
+
280
+ ### Niestandardowa konfiguracja CORS
281
+
282
+ Skonfiguruj CORS globalnie lub per-trasa:
283
+
284
+ ```javascript
285
+ const config = {
286
+ // Globalny CORS
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 specyficzny dla trasy (nadpisuje globalny)
299
+ cors: {
300
+ origin: '*',
301
+ credentials: false,
302
+ },
303
+ },
304
+ },
305
+ };
306
+ ```
307
+
308
+ ### Niestandardowe handlery
309
+
310
+ Utwórz niestandardowe handlery żądań dla zaawansowanych przypadków użycia:
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
+ // Powrót do domyślnego zachowania proxy
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
+ ## 🔧 Dokumentacja API
333
+
334
+ ### `createProxy(config: ServerConfig): Promise<ProxyServer>`
335
+
336
+ Tworzy i uruchamia serwer proxy z podaną konfiguracją.
337
+
338
+ **Parametry:**
339
+
340
+ - `config`: Obiekt konfiguracji serwera
341
+
342
+ **Zwraca:** Promise, który rozwiązuje się do instancji `ProxyServer`
343
+
344
+ ### `ProxyServer`
345
+
346
+ **Metody:**
347
+
348
+ - `start()`: Uruchom serwer proxy
349
+ - `stop()`: Zatrzymaj serwer proxy
350
+ - `getConfig()`: Pobierz aktualną konfigurację
351
+
352
+ ### Typy konfiguracji
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
+ ## 🐳 Użycie Docker
409
+
410
+ ### Użycie w innym projekcie
411
+
412
+ 1. Dodaj proxy do swojego `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. Skonfiguruj trasy w `proxy.config.json`, aby wskazywały na twoje usługi
434
+
435
+ 3. Uruchom swój stack:
436
+
437
+ ```bash
438
+ docker-compose up -d
439
+ ```
440
+
441
+ ### Budowanie niestandardowego obrazu
442
+
443
+ Utwórz niestandardowy Dockerfile:
444
+
445
+ ```dockerfile
446
+ FROM robiki/proxy:latest
447
+
448
+ # Skopiuj swoją konfigurację
449
+ COPY proxy.config.json /app/proxy.config.json
450
+ COPY certs /app/certs
451
+
452
+ # Ustaw zmienne środowiskowe
453
+ ENV PROXY_CONFIG=/app/proxy.config.json
454
+ ```
455
+
456
+ ## 📚 Przykłady
457
+
458
+ Sprawdź katalog `examples/` dla więcej przykładów użycia:
459
+
460
+ - `basic-usage.js` - Prosta konfiguracja proxy
461
+ - `advanced-usage.js` - Zaawansowane funkcje (walidacja, CORS, przekierowywanie)
462
+ - `custom-handlers.js` - Niestandardowe handlery żądań
463
+ - `docker-compose.example.yml` - Pełna konfiguracja Docker
464
+
465
+ ## 🔐 Certyfikaty SSL/TLS
466
+
467
+ ### Generowanie certyfikatów self-signed
468
+
469
+ Do rozwoju:
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
+ ### Użycie Let's Encrypt
477
+
478
+ Do produkcji, użyj certyfikatów Let's Encrypt:
479
+
480
+ ```bash
481
+ certbot certonly --standalone -d example.com
482
+ ```
483
+
484
+ Następnie odwołaj się do nich w konfiguracji:
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
+ ## 🤝 Współpraca
496
+
497
+ Wkłady są mile widziane! Prosimy o przesyłanie Pull Requestów.
498
+
499
+ ## 📄 Licencja
500
+
501
+ MIT © Robiki sp. z o.o.
502
+
503
+ ## 🔗 Linki
504
+
505
+ - [Repozytorium GitHub](https://github.com/robiki-ai/robiki-proxy)
506
+ - [Pakiet npm](https://www.npmjs.com/package/@robiki/proxy)
507
+ - [Tracker problemów](https://github.com/robiki-ai/robiki-proxy/issues)
508
+
509
+ ## 💡 Przypadki użycia
510
+
511
+ - **Architektura mikroserwisów**: Kierowanie żądań do różnych usług na podstawie domeny/ścieżki
512
+ - **Środowisko deweloperskie**: Lokalny proxy do testowania wielu usług
513
+ - **Brama API**: Scentralizowany punkt wejścia z uwierzytelnianiem i limitowaniem żądań
514
+ - **Terminacja SSL**: Obsługa SSL/TLS na poziomie proxy
515
+ - **Zarządzanie CORS**: Scentralizowana konfiguracja CORS
516
+ - **Równoważenie obciążenia**: Dystrybucja ruchu między wieloma instancjami (z niestandardowymi handlerami)
517
+
518
+ ## 🛠️ Rozwiązywanie problemów
519
+
520
+ ### Tryb debugowania
521
+
522
+ Włącz szczegółowe logowanie, aby rozwiązać problemy z połączeniem:
523
+
524
+ ```bash
525
+ # Włącz tryb debugowania
526
+ DEBUG=true node your-proxy-script.js
527
+
528
+ # Lub z Docker
529
+ docker run -e DEBUG=true robiki/proxy:latest
530
+
531
+ # Lub w docker-compose.yml
532
+ services:
533
+ proxy:
534
+ image: robiki/proxy:latest
535
+ environment:
536
+ - DEBUG=true
537
+ ```
538
+
539
+ Gdy `DEBUG=true`, proxy będzie logować:
540
+ - Wszystkie próby połączenia proxy (REST, WebSocket, strumienie HTTP/2)
541
+ - Szczegóły żądań i odpowiedzi
542
+ - Błędy połączenia i przekroczenia czasu
543
+ - Błędy proxy i błędy klienta
544
+
545
+ ### Port już w użyciu
546
+
547
+ Proxy automatycznie spróbuje zabić procesy na skonfigurowanych portach. Jeśli to się nie powiedzie, ręcznie zwolnij porty:
548
+
549
+ ```bash
550
+ lsof -ti:443 | xargs kill -9
551
+ lsof -ti:8080 | xargs kill -9
552
+ ```
553
+
554
+ ### Błędy certyfikatu SSL
555
+
556
+ Upewnij się, że pliki certyfikatów są czytelne i w poprawnym formacie (PEM). Do rozwoju użyj certyfikatów self-signed.
557
+
558
+ ### Problemy z połączeniem WebSocket
559
+
560
+ Upewnij się, że trasy WebSocket są skonfigurowane z poprawnym protokołem (ws/wss) i że usługa docelowa obsługuje połączenia WebSocket.
561
+
562
+ ## 🧪 Testowanie
563
+
564
+ Robiki Proxy zawiera kompleksowy zestaw testów obejmujący testy jednostkowe, testy integracyjne i zaawansowane scenariusze.
565
+
566
+ ### Uruchamianie testów
567
+
568
+ ```bash
569
+ # Uruchom wszystkie testy
570
+ yarn test
571
+
572
+ # Uruchom testy w trybie watch
573
+ yarn test:watch
574
+
575
+ # Uruchom testy z pokryciem
576
+ yarn test:coverage
577
+
578
+ # Uruchom testy z UI
579
+ yarn test:ui
580
+ ```
581
+
582
+ ### Pokrycie testów
583
+
584
+ Zestaw testów obejmuje:
585
+
586
+ - **Testy jednostkowe**: Konfiguracja, narzędzia, konwersja nagłówków, obsługa CORS
587
+ - **Testy integracyjne**: Proxy HTTP, rozwiązywanie tras, walidacja, ładowanie konfiguracji
588
+ - **Testy zaawansowane**: Proxy WebSocket, strumienie HTTP/2, równoczesne połączenia
589
+ - **Testy Docker**: Budowanie kontenerów, ładowanie konfiguracji, zachowanie w czasie wykonywania
590
+
591
+ ### Testy Docker
592
+
593
+ Uruchom testy integracyjne Docker:
594
+
595
+ ```bash
596
+ # Pełny test integracyjny Docker
597
+ yarn test:docker
598
+
599
+ # Test specyficzny dla ładowania konfiguracji
600
+ yarn test:docker:config
601
+
602
+ # Uruchom wszystkie testy (jednostkowe + integracyjne + Docker)
603
+ yarn test:all
604
+ ```
605
+
606
+ Lub używając Make:
607
+
608
+ ```bash
609
+ # Szybki test budowania Docker
610
+ make test-docker
611
+
612
+ # Pełny zestaw testów integracyjnych
613
+ make test-docker-full
614
+
615
+ # Test ładowania konfiguracji
616
+ make test-docker-config
617
+
618
+ # Test Docker Compose
619
+ make test-docker-compose
620
+ ```
621
+
622
+ Zobacz [Docker Tests README](tests/docker/README.md) dla więcej szczegółów.
623
+
624
+ ## 📊 Wydajność
625
+
626
+ Proxy jest zbudowany na natywnej implementacji HTTP/2 w Node.js i zaprojektowany z myślą o wysokiej wydajności:
627
+
628
+ - Efektywna obsługa strumieni
629
+ - Minimalny narzut
630
+ - Pooling połączeń
631
+ - Automatyczny powrót do HTTP/1.1
632
+
633
+ Dla wdrożeń produkcyjnych rozważ:
634
+
635
+ - Użycie menedżera procesów (PM2, systemd)
636
+ - Włączenie klastrowania dla systemów wielordzeniowych
637
+ - Monitorowanie za pomocą health checks
638
+ - Skonfigurowanie odpowiedniego logowania
639
+