@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.ru.md ADDED
@@ -0,0 +1,639 @@
1
+ # 🚀 Robiki Proxy
2
+
3
+ > Высокопроизводительный, гибкий обратный прокси-сервер HTTP/2 с поддержкой WebSocket, настраиваемой маршрутизацией, CORS и валидацией запросов. Используйте его как npm-пакет в вашем Node.js приложении или как автономный Docker-контейнер. Предназначен для использования только в качестве доменного прокси для локальных сред разработки.
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
+ ## 🌍 Языки / 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
+