@robiki/proxy 1.0.2 → 1.0.4

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 CHANGED
@@ -1,11 +1,11 @@
1
1
  # 🚀 Robiki Proxy
2
2
 
3
- > Высокопроизводительный, гибкий обратный прокси-сервер HTTP/2 с поддержкой WebSocket, настраиваемой маршрутизацией, CORS и валидацией запросов. Используйте его как npm-пакет в вашем Node.js приложении или как автономный Docker-контейнер. Предназначен для использования только в качестве доменного прокси для локальных сред разработки.
3
+ > Высокопроизводительный обратный прокси-сервер HTTP/2 с поддержкой WebSocket, настраиваемой маршрутизацией, CORS и валидацией запросов. Используйте как npm-пакет или Docker-контейнер для локальных сред разработки.
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
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
 
@@ -18,54 +18,29 @@
18
18
  - **✅ Валидация запросов**: Пользовательская логика валидации для аутентификации, ограничения скорости и т.д.
19
19
  - **🔄 Переназначение URL**: Преобразование URL перед пересылкой к целевым сервисам
20
20
  - **📦 Двойное использование**: Используйте как npm-пакет или Docker-контейнер
21
+ - **⚙️ Поддержка конфигурации JavaScript и TypeScript**: Используйте файлы конфигурации `.js` или `.ts` с функциями в Docker
21
22
  - **🎯 Поддержка нескольких портов**: Прослушивание нескольких портов одновременно
22
23
  - **⚡ Высокая производительность**: Построен на нативной реализации HTTP/2 в Node.js
23
24
 
24
25
  ## 📦 Установка
25
26
 
26
- ### Как npm-пакет
27
+ ### npm-пакет
27
28
 
28
29
  ```bash
29
30
  npm install @robiki/proxy
30
- ```
31
-
32
- ```bash
31
+ # или
33
32
  yarn add @robiki/proxy
34
33
  ```
35
34
 
36
- ### Как Docker-контейнер
35
+ ### Docker
37
36
 
38
37
  ```bash
39
38
  docker pull robiki/proxy:latest
40
39
  ```
41
40
 
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
41
  ## 🚀 Быстрый старт
67
42
 
68
- ### Использование как npm-пакет
43
+ ### npm-пакет
69
44
 
70
45
  ```javascript
71
46
  import { createProxy } from '@robiki/proxy';
@@ -88,13 +63,11 @@ const proxy = await createProxy({
88
63
  },
89
64
  },
90
65
  });
91
-
92
- console.log('Прокси-сервер работает!');
93
66
  ```
94
67
 
95
- ### Использование с Docker
68
+ ### Docker
96
69
 
97
- 1. Создайте файл `proxy.config.json`:
70
+ Создайте `proxy.config.json`:
98
71
 
99
72
  ```json
100
73
  {
@@ -108,20 +81,14 @@ console.log('Прокси-сервер работает!');
108
81
  "api.example.com": {
109
82
  "target": "backend-service:3000",
110
83
  "ssl": true
111
- },
112
- "example.com": {
113
- "target": "frontend-service:8080",
114
- "ssl": false
115
84
  }
116
85
  }
117
86
  }
118
87
  ```
119
88
 
120
- 2. Создайте `docker-compose.yml`:
89
+ Создайте `docker-compose.yml`:
121
90
 
122
91
  ```yaml
123
- version: '3.8'
124
-
125
92
  services:
126
93
  proxy:
127
94
  image: robiki/proxy:latest
@@ -133,25 +100,9 @@ services:
133
100
  - ./certs:/app/certs:ro
134
101
  environment:
135
102
  - 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
103
  ```
153
104
 
154
- 3. Запустите сервисы:
105
+ Запустите:
155
106
 
156
107
  ```bash
157
108
  docker-compose up -d
@@ -159,9 +110,9 @@ docker-compose up -d
159
110
 
160
111
  ## 📖 Конфигурация
161
112
 
162
- ### Файл конфигурации
113
+ ### JSON конфигурация
163
114
 
164
- Создайте файл `proxy.config.json` со следующей структурой:
115
+ Простая декларативная конфигурация:
165
116
 
166
117
  ```json
167
118
  {
@@ -169,24 +120,17 @@ docker-compose up -d
169
120
  "ssl": {
170
121
  "key": "./certs/key.pem",
171
122
  "cert": "./certs/cert.pem",
172
- "ca": "./certs/ca.pem",
173
123
  "allowHTTP1": true
174
124
  },
175
125
  "cors": {
176
126
  "origin": "*",
177
- "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
178
- "allowedHeaders": ["Content-Type", "Authorization"],
179
- "credentials": true,
180
- "maxAge": 86400
127
+ "methods": ["GET", "POST", "PUT", "DELETE"],
128
+ "credentials": true
181
129
  },
182
130
  "routes": {
183
131
  "api.example.com": {
184
- "target": "backend-service:3000",
185
- "ssl": true,
186
- "cors": {
187
- "origin": ["https://example.com"],
188
- "credentials": true
189
- }
132
+ "target": "backend:3000",
133
+ "ssl": true
190
134
  },
191
135
  "*.example.com": {
192
136
  "target": "wildcard-service:4000",
@@ -196,78 +140,32 @@ docker-compose up -d
196
140
  }
197
141
  ```
198
142
 
199
- ### Переменные окружения
143
+ ### JavaScript конфигурация
200
144
 
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 перед пересылкой к целевым сервисам:
145
+ Для расширенных функций, таких как переназначение URL и валидация:
225
146
 
226
147
  ```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 };
148
+ // proxy.config.js
149
+ export default {
150
+ ports: [443, 8080],
151
+ ssl: {
152
+ key: './certs/key.pem',
153
+ cert: './certs/cert.pem',
154
+ allowHTTP1: true,
258
155
  },
259
156
  routes: {
260
157
  'api.example.com': {
261
158
  target: 'backend:3000',
262
159
  ssl: true,
263
- // Валидация для конкретного маршрута
160
+ // Переназначение URL
161
+ remap: (url) => url.replace(/^\/api/, ''),
162
+ // Валидация запросов
264
163
  validate: async (info) => {
265
- const rateLimit = await checkRateLimit(info.remoteAddress);
266
- if (!rateLimit.allowed) {
164
+ if (!info.headers.authorization) {
267
165
  return {
268
166
  status: false,
269
- code: 429,
270
- message: 'Слишком много запросов',
167
+ code: 401,
168
+ message: 'Unauthorized',
271
169
  };
272
170
  }
273
171
  return { status: true };
@@ -277,93 +175,80 @@ const config = {
277
175
  };
278
176
  ```
279
177
 
280
- ### Пользовательская конфигурация CORS
178
+ ### TypeScript конфигурация
281
179
 
282
- Настройка CORS глобально или для каждого маршрута:
180
+ Типобезопасная конфигурация с полной поддержкой IDE:
283
181
 
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,
182
+ ```typescript
183
+ // proxy.config.ts
184
+ import type { ServerConfig, ConnectionInfo } from '@robiki/proxy';
185
+
186
+ const config: ServerConfig = {
187
+ ports: [443, 8080],
188
+ ssl: {
189
+ key: './certs/key.pem',
190
+ cert: './certs/cert.pem',
191
+ allowHTTP1: true,
293
192
  },
294
193
  routes: {
295
194
  'api.example.com': {
296
195
  target: 'backend:3000',
297
196
  ssl: true,
298
- // CORS для конкретного маршрута (переопределяет глобальный)
299
- cors: {
300
- origin: '*',
301
- credentials: false,
197
+ remap: (url: string) => url.replace(/^\/api/, ''),
198
+ validate: async (info: ConnectionInfo) => {
199
+ if (!info.headers['x-api-key']) {
200
+ return { status: false, code: 401, message: 'API Key Required' };
201
+ }
202
+ return { status: true };
302
203
  },
303
204
  },
304
205
  },
305
206
  };
306
- ```
307
207
 
308
- ### Пользовательские обработчики
208
+ export default config;
209
+ ```
309
210
 
310
- Создание пользовательских обработчиков запросов для продвинутых случаев использования:
211
+ ### Переменные окружения
311
212
 
312
- ```javascript
313
- import { createCustomProxy } from '@robiki/proxy';
213
+ ```bash
214
+ # Конфигурация SSL
215
+ SSL_KEY=/app/certs/key.pem
216
+ SSL_CERT=/app/certs/cert.pem
217
+ SSL_ALLOW_HTTP1=true
314
218
 
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
- };
219
+ # Конфигурация CORS
220
+ CORS_ORIGIN=*
221
+ CORS_METHODS=GET,POST,PUT,DELETE
222
+ CORS_CREDENTIALS=true
324
223
 
325
- const proxy = await createCustomProxy(config, {
326
- rest: customRestHandler,
327
- websocket: customWebSocketHandler,
328
- stream: customStreamHandler,
329
- });
224
+ # Режим отладки
225
+ DEBUG=true
330
226
  ```
331
227
 
332
228
  ## 🔧 Справочник API
333
229
 
334
- ### `createProxy(config: ServerConfig): Promise<ProxyServer>`
335
-
336
- Создает и запускает прокси-сервер с заданной конфигурацией.
337
-
338
- **Параметры:**
339
-
340
- - `config`: Объект конфигурации сервера
230
+ ### `createProxy(config: ServerConfig)`
341
231
 
342
- **Возвращает:** Promise, который разрешается в экземпляр `ProxyServer`
232
+ Создает и запускает прокси-сервер.
343
233
 
344
- ### `ProxyServer`
345
-
346
- **Методы:**
347
-
348
- - `start()`: Запустить прокси-сервер
349
- - `stop()`: Остановить прокси-сервер
350
- - `getConfig()`: Получить текущую конфигурацию
351
-
352
- ### Типы конфигурации
353
-
354
- #### `ServerConfig`
234
+ **ServerConfig:**
355
235
 
356
236
  ```typescript
357
237
  interface ServerConfig {
358
238
  ports?: number[];
359
- ssl?: CertificateConfig;
239
+ ssl?: {
240
+ key: string;
241
+ cert: string;
242
+ ca?: string;
243
+ allowHTTP1?: boolean;
244
+ };
360
245
  routes: Record<string, RouteConfig>;
361
246
  cors?: CorsConfig;
362
247
  validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
363
248
  }
364
249
  ```
365
250
 
366
- #### `RouteConfig`
251
+ **RouteConfig:**
367
252
 
368
253
  ```typescript
369
254
  interface RouteConfig {
@@ -375,265 +260,86 @@ interface RouteConfig {
375
260
  }
376
261
  ```
377
262
 
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
263
  ## 🐳 Использование Docker
409
264
 
410
- ### Использование в другом проекте
411
-
412
- 1. Добавьте прокси в ваш `docker-compose.yml`:
265
+ Смонтируйте ваш конфигурационный файл (JSON, .cjs или .ts):
413
266
 
414
267
  ```yaml
415
268
  services:
416
269
  proxy:
417
270
  image: robiki/proxy:latest
418
- ports:
419
- - '443:443'
420
- - '8080:8080'
421
271
  volumes:
422
- - ./proxy.config.json:/app/proxy.config.json:ro
272
+ - ./proxy.config.cjs:/app/proxy.config.cjs:ro
423
273
  - ./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
274
+ environment:
275
+ - PROXY_CONFIG=/app/proxy.config.cjs
454
276
  ```
455
277
 
456
- ## 📚 Примеры
457
-
458
- Проверьте директорию `examples/` для большего количества примеров использования:
278
+ ## 🔐 SSL сертификаты
459
279
 
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
- Для разработки:
280
+ ### Разработка (самоподписанные)
470
281
 
471
282
  ```bash
472
283
  mkdir -p certs
473
284
  openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodes
474
285
  ```
475
286
 
476
- ### Использование Let's Encrypt
477
-
478
- Для продакшена используйте сертификаты Let's Encrypt:
287
+ ### Продакшн (Let's Encrypt)
479
288
 
480
289
  ```bash
481
290
  certbot certonly --standalone -d example.com
482
291
  ```
483
292
 
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
293
  ## 🛠️ Устранение неполадок
519
294
 
520
295
  ### Режим отладки
521
296
 
522
- Включите подробное логирование для устранения проблем с подключением:
297
+ Включите подробное логирование:
523
298
 
524
299
  ```bash
525
- # Включить режим отладки
526
- DEBUG=true node your-proxy-script.js
527
-
528
- # Или с Docker
300
+ DEBUG=true node your-script.js
301
+ # или
529
302
  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
303
  ```
538
304
 
539
- Когда `DEBUG=true`, прокси будет логировать:
540
- - Все попытки прокси-соединения (REST, WebSocket, HTTP/2 потоки)
541
- - Детали запросов и ответов
542
- - Ошибки соединения и таймауты
543
- - Ошибки прокси и ошибки клиента
544
-
545
305
  ### Порт уже используется
546
306
 
547
- Прокси автоматически попытается завершить процессы на настроенных портах. Если это не удастся, освободите порты вручную:
548
-
549
307
  ```bash
550
308
  lsof -ti:443 | xargs kill -9
551
- lsof -ti:8080 | xargs kill -9
552
309
  ```
553
310
 
554
- ### Ошибки SSL сертификата
555
-
556
- Убедитесь, что ваши файлы сертификатов читаемы и в правильном формате (PEM). Для разработки используйте самоподписанные сертификаты.
557
-
558
- ### Проблемы с WebSocket соединением
559
-
560
- Убедитесь, что ваши WebSocket маршруты настроены с правильным протоколом (ws/wss) и что целевой сервис поддерживает WebSocket соединения.
561
-
562
311
  ## 🧪 Тестирование
563
312
 
564
- Robiki Proxy включает комплексный набор тестов, охватывающий модульные тесты, интеграционные тесты и продвинутые сценарии.
565
-
566
- ### Запуск тестов
567
-
568
313
  ```bash
569
314
  # Запустить все тесты
570
315
  yarn test
571
316
 
572
- # Запустить тесты в режиме наблюдения
573
- yarn test:watch
574
-
575
- # Запустить тесты с покрытием
317
+ # С покрытием
576
318
  yarn test:coverage
577
319
 
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
320
+ # Docker тесты
597
321
  yarn test:docker
598
-
599
- # Тест загрузки конфигурации
600
- yarn test:docker:config
601
-
602
- # Запустить все тесты (модульные + интеграционные + Docker)
603
- yarn test:all
604
322
  ```
605
323
 
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
324
+ ## 📚 Примеры
617
325
 
618
- # Тест Docker Compose
619
- make test-docker-compose
620
- ```
326
+ Смотрите директорию `examples/`:
621
327
 
622
- Смотрите [Docker Tests README](tests/docker/README.md) для более подробной информации.
328
+ - `basic-usage.js` - Простая настройка прокси
329
+ - `advanced-usage.js` - Валидация, CORS, переназначение
330
+ - `custom-handlers.js` - Пользовательские обработчики запросов
331
+ - `docker-compose.example.yml` - Настройка Docker
623
332
 
624
- ## 📊 Производительность
333
+ ## 🤝 Вклад в проект
625
334
 
626
- Прокси построен на нативной реализации HTTP/2 в Node.js и разработан для высокой производительности:
335
+ Вклад приветствуется! Смотрите [CONTRIBUTING.md](CONTRIBUTING.md) для подробностей.
627
336
 
628
- - Эффективная обработка потоков
629
- - Минимальные накладные расходы
630
- - Пулинг соединений
631
- - Автоматический откат к HTTP/1.1
337
+ ## 📄 Лицензия
632
338
 
633
- Для продакшен развертываний рассмотрите:
339
+ MIT © Robiki sp. z o.o.
634
340
 
635
- - Использование менеджера процессов (PM2, systemd)
636
- - Включение кластеризации для многоядерных систем
637
- - Мониторинг с помощью health checks
638
- - Настройка правильного логирования
341
+ ## 🔗 Ссылки
639
342
 
343
+ - [Репозиторий GitHub](https://github.com/robiki-ai/robiki-proxy)
344
+ - [npm пакет](https://www.npmjs.com/package/@robiki/proxy)
345
+ - [Issue Tracker](https://github.com/robiki-ai/robiki-proxy/issues)