@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.ru.md
ADDED
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
# 🚀 Robiki Proxy
|
|
2
|
+
|
|
3
|
+
> Высокопроизводительный, гибкий обратный прокси-сервер HTTP/2 с поддержкой WebSocket, настраиваемой маршрутизацией, CORS и валидацией запросов. Используйте его как npm-пакет в вашем Node.js приложении или как автономный Docker-контейнер. Предназначен для использования только в качестве доменного прокси для локальных сред разработки.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@robiki/proxy)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
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
|
+
|
|
12
|
+
## ✨ Возможности
|
|
13
|
+
|
|
14
|
+
- **🔒 Поддержка HTTP/2 и SSL/TLS**: Полная поддержка протокола HTTP/2 с автоматическим откатом к HTTP/1.1
|
|
15
|
+
- **🔌 Прокси WebSocket**: Бесшовная обработка и проксирование WebSocket-соединений
|
|
16
|
+
- **🌐 Гибкая маршрутизация**: Настройка маршрутов по домену/хосту с поддержкой wildcards
|
|
17
|
+
- **🛡️ Управление CORS**: Глобальная и для каждого маршрута конфигурация CORS
|
|
18
|
+
- **✅ Валидация запросов**: Пользовательская логика валидации для аутентификации, ограничения скорости и т.д.
|
|
19
|
+
- **🔄 Переназначение URL**: Преобразование URL перед пересылкой к целевым сервисам
|
|
20
|
+
- **📦 Двойное использование**: Используйте как npm-пакет или Docker-контейнер
|
|
21
|
+
- **🎯 Поддержка нескольких портов**: Прослушивание нескольких портов одновременно
|
|
22
|
+
- **⚡ Высокая производительность**: Построен на нативной реализации HTTP/2 в Node.js
|
|
23
|
+
|
|
24
|
+
## 📦 Установка
|
|
25
|
+
|
|
26
|
+
### Как npm-пакет
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install @robiki/proxy
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
yarn add @robiki/proxy
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Как Docker-контейнер
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
docker pull robiki/proxy:latest
|
|
40
|
+
```
|
|
41
|
+
|
|
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
|
+
## 🚀 Быстрый старт
|
|
67
|
+
|
|
68
|
+
### Использование как 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('Прокси-сервер работает!');
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Использование с Docker
|
|
96
|
+
|
|
97
|
+
1. Создайте файл `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. Создайте `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. Запустите сервисы:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
docker-compose up -d
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## 📖 Конфигурация
|
|
161
|
+
|
|
162
|
+
### Файл конфигурации
|
|
163
|
+
|
|
164
|
+
Создайте файл `proxy.config.json` со следующей структурой:
|
|
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
|
+
### Переменные окружения
|
|
200
|
+
|
|
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 перед пересылкой к целевым сервисам:
|
|
225
|
+
|
|
226
|
+
```javascript
|
|
227
|
+
const config = {
|
|
228
|
+
routes: {
|
|
229
|
+
'api.example.com': {
|
|
230
|
+
target: 'backend:3000',
|
|
231
|
+
ssl: true,
|
|
232
|
+
remap: (url) => {
|
|
233
|
+
// Удалить префикс /api
|
|
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 };
|
|
258
|
+
},
|
|
259
|
+
routes: {
|
|
260
|
+
'api.example.com': {
|
|
261
|
+
target: 'backend:3000',
|
|
262
|
+
ssl: true,
|
|
263
|
+
// Валидация для конкретного маршрута
|
|
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: 'Слишком много запросов',
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
return { status: true };
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Пользовательская конфигурация CORS
|
|
281
|
+
|
|
282
|
+
Настройка CORS глобально или для каждого маршрута:
|
|
283
|
+
|
|
284
|
+
```javascript
|
|
285
|
+
const config = {
|
|
286
|
+
// Глобальный 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 для конкретного маршрута (переопределяет глобальный)
|
|
299
|
+
cors: {
|
|
300
|
+
origin: '*',
|
|
301
|
+
credentials: false,
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
};
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Пользовательские обработчики
|
|
309
|
+
|
|
310
|
+
Создание пользовательских обработчиков запросов для продвинутых случаев использования:
|
|
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
|
+
// Откат к стандартному поведению прокси
|
|
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
|
+
## 🔧 Справочник API
|
|
333
|
+
|
|
334
|
+
### `createProxy(config: ServerConfig): Promise<ProxyServer>`
|
|
335
|
+
|
|
336
|
+
Создает и запускает прокси-сервер с заданной конфигурацией.
|
|
337
|
+
|
|
338
|
+
**Параметры:**
|
|
339
|
+
|
|
340
|
+
- `config`: Объект конфигурации сервера
|
|
341
|
+
|
|
342
|
+
**Возвращает:** Promise, который разрешается в экземпляр `ProxyServer`
|
|
343
|
+
|
|
344
|
+
### `ProxyServer`
|
|
345
|
+
|
|
346
|
+
**Методы:**
|
|
347
|
+
|
|
348
|
+
- `start()`: Запустить прокси-сервер
|
|
349
|
+
- `stop()`: Остановить прокси-сервер
|
|
350
|
+
- `getConfig()`: Получить текущую конфигурацию
|
|
351
|
+
|
|
352
|
+
### Типы конфигурации
|
|
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
|
+
## 🐳 Использование Docker
|
|
409
|
+
|
|
410
|
+
### Использование в другом проекте
|
|
411
|
+
|
|
412
|
+
1. Добавьте прокси в ваш `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. Настройте маршруты в `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
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
## 📚 Примеры
|
|
457
|
+
|
|
458
|
+
Проверьте директорию `examples/` для большего количества примеров использования:
|
|
459
|
+
|
|
460
|
+
- `basic-usage.js` - Простая настройка прокси
|
|
461
|
+
- `advanced-usage.js` - Расширенные функции (валидация, CORS, переназначение)
|
|
462
|
+
- `custom-handlers.js` - Пользовательские обработчики запросов
|
|
463
|
+
- `docker-compose.example.yml` - Полная настройка Docker
|
|
464
|
+
|
|
465
|
+
## 🔐 SSL/TLS сертификаты
|
|
466
|
+
|
|
467
|
+
### Генерация самоподписанных сертификатов
|
|
468
|
+
|
|
469
|
+
Для разработки:
|
|
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
|
+
### Использование Let's Encrypt
|
|
477
|
+
|
|
478
|
+
Для продакшена используйте сертификаты Let's Encrypt:
|
|
479
|
+
|
|
480
|
+
```bash
|
|
481
|
+
certbot certonly --standalone -d example.com
|
|
482
|
+
```
|
|
483
|
+
|
|
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
|
+
## 🛠️ Устранение неполадок
|
|
519
|
+
|
|
520
|
+
### Режим отладки
|
|
521
|
+
|
|
522
|
+
Включите подробное логирование для устранения проблем с подключением:
|
|
523
|
+
|
|
524
|
+
```bash
|
|
525
|
+
# Включить режим отладки
|
|
526
|
+
DEBUG=true node your-proxy-script.js
|
|
527
|
+
|
|
528
|
+
# Или с Docker
|
|
529
|
+
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
|
+
```
|
|
538
|
+
|
|
539
|
+
Когда `DEBUG=true`, прокси будет логировать:
|
|
540
|
+
- Все попытки прокси-соединения (REST, WebSocket, HTTP/2 потоки)
|
|
541
|
+
- Детали запросов и ответов
|
|
542
|
+
- Ошибки соединения и таймауты
|
|
543
|
+
- Ошибки прокси и ошибки клиента
|
|
544
|
+
|
|
545
|
+
### Порт уже используется
|
|
546
|
+
|
|
547
|
+
Прокси автоматически попытается завершить процессы на настроенных портах. Если это не удастся, освободите порты вручную:
|
|
548
|
+
|
|
549
|
+
```bash
|
|
550
|
+
lsof -ti:443 | xargs kill -9
|
|
551
|
+
lsof -ti:8080 | xargs kill -9
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### Ошибки SSL сертификата
|
|
555
|
+
|
|
556
|
+
Убедитесь, что ваши файлы сертификатов читаемы и в правильном формате (PEM). Для разработки используйте самоподписанные сертификаты.
|
|
557
|
+
|
|
558
|
+
### Проблемы с WebSocket соединением
|
|
559
|
+
|
|
560
|
+
Убедитесь, что ваши WebSocket маршруты настроены с правильным протоколом (ws/wss) и что целевой сервис поддерживает WebSocket соединения.
|
|
561
|
+
|
|
562
|
+
## 🧪 Тестирование
|
|
563
|
+
|
|
564
|
+
Robiki Proxy включает комплексный набор тестов, охватывающий модульные тесты, интеграционные тесты и продвинутые сценарии.
|
|
565
|
+
|
|
566
|
+
### Запуск тестов
|
|
567
|
+
|
|
568
|
+
```bash
|
|
569
|
+
# Запустить все тесты
|
|
570
|
+
yarn test
|
|
571
|
+
|
|
572
|
+
# Запустить тесты в режиме наблюдения
|
|
573
|
+
yarn test:watch
|
|
574
|
+
|
|
575
|
+
# Запустить тесты с покрытием
|
|
576
|
+
yarn test:coverage
|
|
577
|
+
|
|
578
|
+
# Запустить тесты с UI
|
|
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
|
|
597
|
+
yarn test:docker
|
|
598
|
+
|
|
599
|
+
# Тест загрузки конфигурации
|
|
600
|
+
yarn test:docker:config
|
|
601
|
+
|
|
602
|
+
# Запустить все тесты (модульные + интеграционные + Docker)
|
|
603
|
+
yarn test:all
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
Или используя Make:
|
|
607
|
+
|
|
608
|
+
```bash
|
|
609
|
+
# Быстрый тест сборки Docker
|
|
610
|
+
make test-docker
|
|
611
|
+
|
|
612
|
+
# Полный набор интеграционных тестов
|
|
613
|
+
make test-docker-full
|
|
614
|
+
|
|
615
|
+
# Тест загрузки конфигурации
|
|
616
|
+
make test-docker-config
|
|
617
|
+
|
|
618
|
+
# Тест Docker Compose
|
|
619
|
+
make test-docker-compose
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
Смотрите [Docker Tests README](tests/docker/README.md) для более подробной информации.
|
|
623
|
+
|
|
624
|
+
## 📊 Производительность
|
|
625
|
+
|
|
626
|
+
Прокси построен на нативной реализации HTTP/2 в Node.js и разработан для высокой производительности:
|
|
627
|
+
|
|
628
|
+
- Эффективная обработка потоков
|
|
629
|
+
- Минимальные накладные расходы
|
|
630
|
+
- Пулинг соединений
|
|
631
|
+
- Автоматический откат к HTTP/1.1
|
|
632
|
+
|
|
633
|
+
Для продакшен развертываний рассмотрите:
|
|
634
|
+
|
|
635
|
+
- Использование менеджера процессов (PM2, systemd)
|
|
636
|
+
- Включение кластеризации для многоядерных систем
|
|
637
|
+
- Мониторинг с помощью health checks
|
|
638
|
+
- Настройка правильного логирования
|
|
639
|
+
|