@robiki/proxy 1.0.2 → 1.0.3
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 +101 -395
- package/README.es.md +99 -394
- package/README.ja.md +100 -395
- package/README.md +100 -394
- package/README.pl.md +100 -395
- package/README.ru.md +99 -394
- package/README.zh.md +99 -394
- package/dist/{config-CeJ1tf8T.d.ts → config-CCOdQL7F.d.ts} +5 -11
- package/dist/index.d.ts +3 -2
- package/dist/index.js +51 -72
- package/dist/utils/config.d.ts +1 -1
- package/dist/utils/config.js +37 -20
- package/package.json +2 -5
- package/dist/config-CQ7zIaQt.d.ts +0 -172
- package/dist/config-_6LOsppp.d.ts +0 -180
package/README.ru.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# 🚀 Robiki Proxy
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Высокопроизводительный обратный прокси-сервер HTTP/2 с поддержкой WebSocket, настраиваемой маршрутизацией, CORS и валидацией запросов. Используйте как npm-пакет или Docker-контейнер для локальных сред разработки.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@robiki/proxy)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
|
|
8
|
-
## 🌍 Языки
|
|
8
|
+
## 🌍 Языки
|
|
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
|
|
|
@@ -23,49 +23,23 @@
|
|
|
23
23
|
|
|
24
24
|
## 📦 Установка
|
|
25
25
|
|
|
26
|
-
###
|
|
26
|
+
### npm-пакет
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
29
|
npm install @robiki/proxy
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
```bash
|
|
30
|
+
# или
|
|
33
31
|
yarn add @robiki/proxy
|
|
34
32
|
```
|
|
35
33
|
|
|
36
|
-
###
|
|
34
|
+
### Docker
|
|
37
35
|
|
|
38
36
|
```bash
|
|
39
37
|
docker pull robiki/proxy:latest
|
|
40
38
|
```
|
|
41
39
|
|
|
42
|
-
### Как сервис 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
|
-
## Примечания
|
|
62
|
-
|
|
63
|
-
- Хосты, настроенные локально, должны быть добавлены в ваш локальный файл `hosts`.
|
|
64
|
-
- Если вы используете пользовательские сертификаты, вам необходимо добавить файлы сертификатов в директорию `certs`.
|
|
65
|
-
|
|
66
40
|
## 🚀 Быстрый старт
|
|
67
41
|
|
|
68
|
-
###
|
|
42
|
+
### npm-пакет
|
|
69
43
|
|
|
70
44
|
```javascript
|
|
71
45
|
import { createProxy } from '@robiki/proxy';
|
|
@@ -88,13 +62,11 @@ const proxy = await createProxy({
|
|
|
88
62
|
},
|
|
89
63
|
},
|
|
90
64
|
});
|
|
91
|
-
|
|
92
|
-
console.log('Прокси-сервер работает!');
|
|
93
65
|
```
|
|
94
66
|
|
|
95
|
-
###
|
|
67
|
+
### Docker
|
|
96
68
|
|
|
97
|
-
|
|
69
|
+
Создайте `proxy.config.json`:
|
|
98
70
|
|
|
99
71
|
```json
|
|
100
72
|
{
|
|
@@ -108,20 +80,14 @@ console.log('Прокси-сервер работает!');
|
|
|
108
80
|
"api.example.com": {
|
|
109
81
|
"target": "backend-service:3000",
|
|
110
82
|
"ssl": true
|
|
111
|
-
},
|
|
112
|
-
"example.com": {
|
|
113
|
-
"target": "frontend-service:8080",
|
|
114
|
-
"ssl": false
|
|
115
83
|
}
|
|
116
84
|
}
|
|
117
85
|
}
|
|
118
86
|
```
|
|
119
87
|
|
|
120
|
-
|
|
88
|
+
Создайте `docker-compose.yml`:
|
|
121
89
|
|
|
122
90
|
```yaml
|
|
123
|
-
version: '3.8'
|
|
124
|
-
|
|
125
91
|
services:
|
|
126
92
|
proxy:
|
|
127
93
|
image: robiki/proxy:latest
|
|
@@ -133,25 +99,9 @@ services:
|
|
|
133
99
|
- ./certs:/app/certs:ro
|
|
134
100
|
environment:
|
|
135
101
|
- 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
102
|
```
|
|
153
103
|
|
|
154
|
-
|
|
104
|
+
Запустите:
|
|
155
105
|
|
|
156
106
|
```bash
|
|
157
107
|
docker-compose up -d
|
|
@@ -159,9 +109,9 @@ docker-compose up -d
|
|
|
159
109
|
|
|
160
110
|
## 📖 Конфигурация
|
|
161
111
|
|
|
162
|
-
###
|
|
112
|
+
### JSON конфигурация
|
|
163
113
|
|
|
164
|
-
|
|
114
|
+
Простая декларативная конфигурация:
|
|
165
115
|
|
|
166
116
|
```json
|
|
167
117
|
{
|
|
@@ -169,24 +119,17 @@ docker-compose up -d
|
|
|
169
119
|
"ssl": {
|
|
170
120
|
"key": "./certs/key.pem",
|
|
171
121
|
"cert": "./certs/cert.pem",
|
|
172
|
-
"ca": "./certs/ca.pem",
|
|
173
122
|
"allowHTTP1": true
|
|
174
123
|
},
|
|
175
124
|
"cors": {
|
|
176
125
|
"origin": "*",
|
|
177
|
-
"methods": ["GET", "POST", "PUT", "DELETE"
|
|
178
|
-
"
|
|
179
|
-
"credentials": true,
|
|
180
|
-
"maxAge": 86400
|
|
126
|
+
"methods": ["GET", "POST", "PUT", "DELETE"],
|
|
127
|
+
"credentials": true
|
|
181
128
|
},
|
|
182
129
|
"routes": {
|
|
183
130
|
"api.example.com": {
|
|
184
|
-
"target": "backend
|
|
185
|
-
"ssl": true
|
|
186
|
-
"cors": {
|
|
187
|
-
"origin": ["https://example.com"],
|
|
188
|
-
"credentials": true
|
|
189
|
-
}
|
|
131
|
+
"target": "backend:3000",
|
|
132
|
+
"ssl": true
|
|
190
133
|
},
|
|
191
134
|
"*.example.com": {
|
|
192
135
|
"target": "wildcard-service:4000",
|
|
@@ -196,78 +139,32 @@ docker-compose up -d
|
|
|
196
139
|
}
|
|
197
140
|
```
|
|
198
141
|
|
|
199
|
-
###
|
|
142
|
+
### JavaScript конфигурация
|
|
200
143
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
```bash
|
|
204
|
-
# Конфигурация 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
|
-
# Конфигурация CORS
|
|
211
|
-
CORS_ORIGIN=*
|
|
212
|
-
CORS_METHODS=GET,POST,PUT,DELETE,OPTIONS
|
|
213
|
-
CORS_HEADERS=Content-Type,Authorization
|
|
214
|
-
CORS_CREDENTIALS=true
|
|
215
|
-
|
|
216
|
-
# Режим отладки
|
|
217
|
-
DEBUG=true # Включить подробное логирование для прокси-соединений и ошибок
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
## 🎯 Расширенное использование
|
|
221
|
-
|
|
222
|
-
### Переназначение URL
|
|
223
|
-
|
|
224
|
-
Преобразование URL перед пересылкой к целевым сервисам:
|
|
144
|
+
Для расширенных функций, таких как переназначение URL и валидация:
|
|
225
145
|
|
|
226
146
|
```javascript
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return url.replace(/^\/api/, '');
|
|
235
|
-
},
|
|
236
|
-
},
|
|
237
|
-
},
|
|
238
|
-
};
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### Валидация запросов
|
|
242
|
-
|
|
243
|
-
Добавление пользовательской логики валидации для аутентификации, ограничения скорости и т.д.:
|
|
244
|
-
|
|
245
|
-
```javascript
|
|
246
|
-
const config = {
|
|
247
|
-
// Глобальная валидация
|
|
248
|
-
validate: async (info) => {
|
|
249
|
-
if (!info.headers.authorization) {
|
|
250
|
-
return {
|
|
251
|
-
status: false,
|
|
252
|
-
code: 401,
|
|
253
|
-
message: 'Не авторизован',
|
|
254
|
-
headers: { 'www-authenticate': 'Bearer' },
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
return { status: true };
|
|
147
|
+
// proxy.config.cjs
|
|
148
|
+
module.exports = {
|
|
149
|
+
ports: [443, 8080],
|
|
150
|
+
ssl: {
|
|
151
|
+
key: './certs/key.pem',
|
|
152
|
+
cert: './certs/cert.pem',
|
|
153
|
+
allowHTTP1: true,
|
|
258
154
|
},
|
|
259
155
|
routes: {
|
|
260
156
|
'api.example.com': {
|
|
261
157
|
target: 'backend:3000',
|
|
262
158
|
ssl: true,
|
|
263
|
-
//
|
|
159
|
+
// Переназначение URL
|
|
160
|
+
remap: (url) => url.replace(/^\/api/, ''),
|
|
161
|
+
// Валидация запросов
|
|
264
162
|
validate: async (info) => {
|
|
265
|
-
|
|
266
|
-
if (!rateLimit.allowed) {
|
|
163
|
+
if (!info.headers.authorization) {
|
|
267
164
|
return {
|
|
268
165
|
status: false,
|
|
269
|
-
code:
|
|
270
|
-
message: '
|
|
166
|
+
code: 401,
|
|
167
|
+
message: 'Unauthorized',
|
|
271
168
|
};
|
|
272
169
|
}
|
|
273
170
|
return { status: true };
|
|
@@ -277,93 +174,80 @@ const config = {
|
|
|
277
174
|
};
|
|
278
175
|
```
|
|
279
176
|
|
|
280
|
-
###
|
|
177
|
+
### TypeScript конфигурация
|
|
281
178
|
|
|
282
|
-
|
|
179
|
+
Типобезопасная конфигурация с полной поддержкой IDE:
|
|
283
180
|
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
181
|
+
```typescript
|
|
182
|
+
// proxy.config.ts
|
|
183
|
+
import type { ServerConfig, ConnectionInfo } from '@robiki/proxy';
|
|
184
|
+
|
|
185
|
+
const config: ServerConfig = {
|
|
186
|
+
ports: [443, 8080],
|
|
187
|
+
ssl: {
|
|
188
|
+
key: './certs/key.pem',
|
|
189
|
+
cert: './certs/cert.pem',
|
|
190
|
+
allowHTTP1: true,
|
|
293
191
|
},
|
|
294
192
|
routes: {
|
|
295
193
|
'api.example.com': {
|
|
296
194
|
target: 'backend:3000',
|
|
297
195
|
ssl: true,
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
196
|
+
remap: (url: string) => url.replace(/^\/api/, ''),
|
|
197
|
+
validate: async (info: ConnectionInfo) => {
|
|
198
|
+
if (!info.headers['x-api-key']) {
|
|
199
|
+
return { status: false, code: 401, message: 'API Key Required' };
|
|
200
|
+
}
|
|
201
|
+
return { status: true };
|
|
302
202
|
},
|
|
303
203
|
},
|
|
304
204
|
},
|
|
305
205
|
};
|
|
306
|
-
```
|
|
307
206
|
|
|
308
|
-
|
|
207
|
+
export default config;
|
|
208
|
+
```
|
|
309
209
|
|
|
310
|
-
|
|
210
|
+
### Переменные окружения
|
|
311
211
|
|
|
312
|
-
```
|
|
313
|
-
|
|
212
|
+
```bash
|
|
213
|
+
# Конфигурация SSL
|
|
214
|
+
SSL_KEY=/app/certs/key.pem
|
|
215
|
+
SSL_CERT=/app/certs/cert.pem
|
|
216
|
+
SSL_ALLOW_HTTP1=true
|
|
314
217
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
}
|
|
320
|
-
// Откат к стандартному поведению прокси
|
|
321
|
-
const { restAPIProxyHandler } = await import('@robiki/proxy/connections');
|
|
322
|
-
return restAPIProxyHandler(req, res);
|
|
323
|
-
};
|
|
218
|
+
# Конфигурация CORS
|
|
219
|
+
CORS_ORIGIN=*
|
|
220
|
+
CORS_METHODS=GET,POST,PUT,DELETE
|
|
221
|
+
CORS_CREDENTIALS=true
|
|
324
222
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
websocket: customWebSocketHandler,
|
|
328
|
-
stream: customStreamHandler,
|
|
329
|
-
});
|
|
223
|
+
# Режим отладки
|
|
224
|
+
DEBUG=true
|
|
330
225
|
```
|
|
331
226
|
|
|
332
227
|
## 🔧 Справочник API
|
|
333
228
|
|
|
334
|
-
### `createProxy(config: ServerConfig)
|
|
335
|
-
|
|
336
|
-
Создает и запускает прокси-сервер с заданной конфигурацией.
|
|
337
|
-
|
|
338
|
-
**Параметры:**
|
|
339
|
-
|
|
340
|
-
- `config`: Объект конфигурации сервера
|
|
229
|
+
### `createProxy(config: ServerConfig)`
|
|
341
230
|
|
|
342
|
-
|
|
231
|
+
Создает и запускает прокси-сервер.
|
|
343
232
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
**Методы:**
|
|
347
|
-
|
|
348
|
-
- `start()`: Запустить прокси-сервер
|
|
349
|
-
- `stop()`: Остановить прокси-сервер
|
|
350
|
-
- `getConfig()`: Получить текущую конфигурацию
|
|
351
|
-
|
|
352
|
-
### Типы конфигурации
|
|
353
|
-
|
|
354
|
-
#### `ServerConfig`
|
|
233
|
+
**ServerConfig:**
|
|
355
234
|
|
|
356
235
|
```typescript
|
|
357
236
|
interface ServerConfig {
|
|
358
237
|
ports?: number[];
|
|
359
|
-
ssl?:
|
|
238
|
+
ssl?: {
|
|
239
|
+
key: string;
|
|
240
|
+
cert: string;
|
|
241
|
+
ca?: string;
|
|
242
|
+
allowHTTP1?: boolean;
|
|
243
|
+
};
|
|
360
244
|
routes: Record<string, RouteConfig>;
|
|
361
245
|
cors?: CorsConfig;
|
|
362
246
|
validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
|
|
363
247
|
}
|
|
364
248
|
```
|
|
365
249
|
|
|
366
|
-
|
|
250
|
+
**RouteConfig:**
|
|
367
251
|
|
|
368
252
|
```typescript
|
|
369
253
|
interface RouteConfig {
|
|
@@ -375,265 +259,86 @@ interface RouteConfig {
|
|
|
375
259
|
}
|
|
376
260
|
```
|
|
377
261
|
|
|
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
262
|
## 🐳 Использование Docker
|
|
409
263
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
1. Добавьте прокси в ваш `docker-compose.yml`:
|
|
264
|
+
Смонтируйте ваш конфигурационный файл (JSON, .cjs или .ts):
|
|
413
265
|
|
|
414
266
|
```yaml
|
|
415
267
|
services:
|
|
416
268
|
proxy:
|
|
417
269
|
image: robiki/proxy:latest
|
|
418
|
-
ports:
|
|
419
|
-
- '443:443'
|
|
420
|
-
- '8080:8080'
|
|
421
270
|
volumes:
|
|
422
|
-
- ./proxy.config.
|
|
271
|
+
- ./proxy.config.cjs:/app/proxy.config.cjs:ro
|
|
423
272
|
- ./certs:/app/certs:ro
|
|
424
|
-
|
|
425
|
-
-
|
|
426
|
-
|
|
427
|
-
your-service:
|
|
428
|
-
image: your-service-image
|
|
429
|
-
networks:
|
|
430
|
-
- your-network
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
2. Настройте маршруты в `proxy.config.json`, чтобы они указывали на ваши сервисы
|
|
434
|
-
|
|
435
|
-
3. Запустите ваш стек:
|
|
436
|
-
|
|
437
|
-
```bash
|
|
438
|
-
docker-compose up -d
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
### Создание пользовательского образа
|
|
442
|
-
|
|
443
|
-
Создайте пользовательский Dockerfile:
|
|
444
|
-
|
|
445
|
-
```dockerfile
|
|
446
|
-
FROM robiki/proxy:latest
|
|
447
|
-
|
|
448
|
-
# Скопируйте вашу конфигурацию
|
|
449
|
-
COPY proxy.config.json /app/proxy.config.json
|
|
450
|
-
COPY certs /app/certs
|
|
451
|
-
|
|
452
|
-
# Установите переменные окружения
|
|
453
|
-
ENV PROXY_CONFIG=/app/proxy.config.json
|
|
273
|
+
environment:
|
|
274
|
+
- PROXY_CONFIG=/app/proxy.config.cjs
|
|
454
275
|
```
|
|
455
276
|
|
|
456
|
-
##
|
|
457
|
-
|
|
458
|
-
Проверьте директорию `examples/` для большего количества примеров использования:
|
|
277
|
+
## 🔐 SSL сертификаты
|
|
459
278
|
|
|
460
|
-
|
|
461
|
-
- `advanced-usage.js` - Расширенные функции (валидация, CORS, переназначение)
|
|
462
|
-
- `custom-handlers.js` - Пользовательские обработчики запросов
|
|
463
|
-
- `docker-compose.example.yml` - Полная настройка Docker
|
|
464
|
-
|
|
465
|
-
## 🔐 SSL/TLS сертификаты
|
|
466
|
-
|
|
467
|
-
### Генерация самоподписанных сертификатов
|
|
468
|
-
|
|
469
|
-
Для разработки:
|
|
279
|
+
### Разработка (самоподписанные)
|
|
470
280
|
|
|
471
281
|
```bash
|
|
472
282
|
mkdir -p certs
|
|
473
283
|
openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodes
|
|
474
284
|
```
|
|
475
285
|
|
|
476
|
-
###
|
|
477
|
-
|
|
478
|
-
Для продакшена используйте сертификаты Let's Encrypt:
|
|
286
|
+
### Продакшн (Let's Encrypt)
|
|
479
287
|
|
|
480
288
|
```bash
|
|
481
289
|
certbot certonly --standalone -d example.com
|
|
482
290
|
```
|
|
483
291
|
|
|
484
|
-
Затем ссылайтесь на них в вашей конфигурации:
|
|
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
|
-
## 🤝 Вклад
|
|
496
|
-
|
|
497
|
-
Вклады приветствуются! Пожалуйста, не стесняйтесь отправлять Pull Request.
|
|
498
|
-
|
|
499
|
-
## 📄 Лицензия
|
|
500
|
-
|
|
501
|
-
MIT © Robiki sp. z o.o.
|
|
502
|
-
|
|
503
|
-
## 🔗 Ссылки
|
|
504
|
-
|
|
505
|
-
- [GitHub репозиторий](https://github.com/robiki-ai/robiki-proxy)
|
|
506
|
-
- [npm пакет](https://www.npmjs.com/package/@robiki/proxy)
|
|
507
|
-
- [Трекер проблем](https://github.com/robiki-ai/robiki-proxy/issues)
|
|
508
|
-
|
|
509
|
-
## 💡 Случаи использования
|
|
510
|
-
|
|
511
|
-
- **Архитектура микросервисов**: Маршрутизация запросов к различным сервисам на основе домена/пути
|
|
512
|
-
- **Среда разработки**: Локальный прокси для тестирования нескольких сервисов
|
|
513
|
-
- **API Gateway**: Централизованная точка входа с аутентификацией и ограничением скорости
|
|
514
|
-
- **SSL терминация**: Обработка SSL/TLS на уровне прокси
|
|
515
|
-
- **Управление CORS**: Централизованная конфигурация CORS
|
|
516
|
-
- **Балансировка нагрузки**: Распределение трафика между несколькими экземплярами (с пользовательскими обработчиками)
|
|
517
|
-
|
|
518
292
|
## 🛠️ Устранение неполадок
|
|
519
293
|
|
|
520
294
|
### Режим отладки
|
|
521
295
|
|
|
522
|
-
Включите подробное
|
|
296
|
+
Включите подробное логирование:
|
|
523
297
|
|
|
524
298
|
```bash
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
# Или с Docker
|
|
299
|
+
DEBUG=true node your-script.js
|
|
300
|
+
# или
|
|
529
301
|
docker run -e DEBUG=true robiki/proxy:latest
|
|
530
|
-
|
|
531
|
-
# Или в docker-compose.yml
|
|
532
|
-
services:
|
|
533
|
-
proxy:
|
|
534
|
-
image: robiki/proxy:latest
|
|
535
|
-
environment:
|
|
536
|
-
- DEBUG=true
|
|
537
302
|
```
|
|
538
303
|
|
|
539
|
-
Когда `DEBUG=true`, прокси будет логировать:
|
|
540
|
-
- Все попытки прокси-соединения (REST, WebSocket, HTTP/2 потоки)
|
|
541
|
-
- Детали запросов и ответов
|
|
542
|
-
- Ошибки соединения и таймауты
|
|
543
|
-
- Ошибки прокси и ошибки клиента
|
|
544
|
-
|
|
545
304
|
### Порт уже используется
|
|
546
305
|
|
|
547
|
-
Прокси автоматически попытается завершить процессы на настроенных портах. Если это не удастся, освободите порты вручную:
|
|
548
|
-
|
|
549
306
|
```bash
|
|
550
307
|
lsof -ti:443 | xargs kill -9
|
|
551
|
-
lsof -ti:8080 | xargs kill -9
|
|
552
308
|
```
|
|
553
309
|
|
|
554
|
-
### Ошибки SSL сертификата
|
|
555
|
-
|
|
556
|
-
Убедитесь, что ваши файлы сертификатов читаемы и в правильном формате (PEM). Для разработки используйте самоподписанные сертификаты.
|
|
557
|
-
|
|
558
|
-
### Проблемы с WebSocket соединением
|
|
559
|
-
|
|
560
|
-
Убедитесь, что ваши WebSocket маршруты настроены с правильным протоколом (ws/wss) и что целевой сервис поддерживает WebSocket соединения.
|
|
561
|
-
|
|
562
310
|
## 🧪 Тестирование
|
|
563
311
|
|
|
564
|
-
Robiki Proxy включает комплексный набор тестов, охватывающий модульные тесты, интеграционные тесты и продвинутые сценарии.
|
|
565
|
-
|
|
566
|
-
### Запуск тестов
|
|
567
|
-
|
|
568
312
|
```bash
|
|
569
313
|
# Запустить все тесты
|
|
570
314
|
yarn test
|
|
571
315
|
|
|
572
|
-
#
|
|
573
|
-
yarn test:watch
|
|
574
|
-
|
|
575
|
-
# Запустить тесты с покрытием
|
|
316
|
+
# С покрытием
|
|
576
317
|
yarn test:coverage
|
|
577
318
|
|
|
578
|
-
#
|
|
579
|
-
yarn test:ui
|
|
580
|
-
```
|
|
581
|
-
|
|
582
|
-
### Покрытие тестами
|
|
583
|
-
|
|
584
|
-
Набор тестов включает:
|
|
585
|
-
|
|
586
|
-
- **Модульные тесты**: Конфигурация, утилиты, преобразование заголовков, обработка CORS
|
|
587
|
-
- **Интеграционные тесты**: HTTP проксирование, разрешение маршрутов, валидация, загрузка конфигурации
|
|
588
|
-
- **Продвинутые тесты**: WebSocket проксирование, HTTP/2 потоки, одновременные соединения
|
|
589
|
-
- **Docker тесты**: Сборка контейнеров, загрузка конфигурации, поведение во время выполнения
|
|
590
|
-
|
|
591
|
-
### Docker тесты
|
|
592
|
-
|
|
593
|
-
Запуск интеграционных тестов Docker:
|
|
594
|
-
|
|
595
|
-
```bash
|
|
596
|
-
# Полный интеграционный тест Docker
|
|
319
|
+
# Docker тесты
|
|
597
320
|
yarn test:docker
|
|
598
|
-
|
|
599
|
-
# Тест загрузки конфигурации
|
|
600
|
-
yarn test:docker:config
|
|
601
|
-
|
|
602
|
-
# Запустить все тесты (модульные + интеграционные + Docker)
|
|
603
|
-
yarn test:all
|
|
604
321
|
```
|
|
605
322
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
```bash
|
|
609
|
-
# Быстрый тест сборки Docker
|
|
610
|
-
make test-docker
|
|
611
|
-
|
|
612
|
-
# Полный набор интеграционных тестов
|
|
613
|
-
make test-docker-full
|
|
614
|
-
|
|
615
|
-
# Тест загрузки конфигурации
|
|
616
|
-
make test-docker-config
|
|
323
|
+
## 📚 Примеры
|
|
617
324
|
|
|
618
|
-
|
|
619
|
-
make test-docker-compose
|
|
620
|
-
```
|
|
325
|
+
Смотрите директорию `examples/`:
|
|
621
326
|
|
|
622
|
-
|
|
327
|
+
- `basic-usage.js` - Простая настройка прокси
|
|
328
|
+
- `advanced-usage.js` - Валидация, CORS, переназначение
|
|
329
|
+
- `custom-handlers.js` - Пользовательские обработчики запросов
|
|
330
|
+
- `docker-compose.example.yml` - Настройка Docker
|
|
623
331
|
|
|
624
|
-
##
|
|
332
|
+
## 🤝 Вклад в проект
|
|
625
333
|
|
|
626
|
-
|
|
334
|
+
Вклад приветствуется! Смотрите [CONTRIBUTING.md](CONTRIBUTING.md) для подробностей.
|
|
627
335
|
|
|
628
|
-
|
|
629
|
-
- Минимальные накладные расходы
|
|
630
|
-
- Пулинг соединений
|
|
631
|
-
- Автоматический откат к HTTP/1.1
|
|
336
|
+
## 📄 Лицензия
|
|
632
337
|
|
|
633
|
-
|
|
338
|
+
MIT © Robiki sp. z o.o.
|
|
634
339
|
|
|
635
|
-
|
|
636
|
-
- Включение кластеризации для многоядерных систем
|
|
637
|
-
- Мониторинг с помощью health checks
|
|
638
|
-
- Настройка правильного логирования
|
|
340
|
+
## 🔗 Ссылки
|
|
639
341
|
|
|
342
|
+
- [Репозиторий GitHub](https://github.com/robiki-ai/robiki-proxy)
|
|
343
|
+
- [npm пакет](https://www.npmjs.com/package/@robiki/proxy)
|
|
344
|
+
- [Issue Tracker](https://github.com/robiki-ai/robiki-proxy/issues)
|