@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.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
|
[](https://www.npmjs.com/package/@robiki/proxy)
|
|
6
6
|
[](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
|
-
|
|
42
|
+
### As a Docker Compose Service
|
|
39
43
|
|
|
40
|
-
```
|
|
41
|
-
|
|
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
|
+
[](https://www.npmjs.com/package/@robiki/proxy)
|
|
6
|
+
[](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
|
+
|