@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.ja.md ADDED
@@ -0,0 +1,639 @@
1
+ # 🚀 Robiki プロキシ
2
+
3
+ > WebSocket サポート、設定可能なルーティング、CORS、リクエスト検証を備えた高性能で柔軟な HTTP/2 リバースプロキシ。Node.js アプリケーションの npm パッケージとして、またはスタンドアロンの 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
+ - **🌐 柔軟なルーティング**:ワイルドカードサポート付きのドメイン/ホスト別ルート設定
17
+ - **🛡️ CORS 管理**:グローバルおよびルート別の CORS 設定
18
+ - **✅ リクエスト検証**:認証、レート制限などのカスタム検証ロジック
19
+ - **🔄 URL リマッピング**:ターゲットサービスに転送する前に URL を変換
20
+ - **📦 デュアル使用**:npm パッケージまたは Docker コンテナとして使用
21
+ - **🎯 マルチポートサポート**:複数のポートで同時にリッスン
22
+ - **⚡ 高性能**:Node.js ネイティブ HTTP/2 実装に基づく
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
+ **戻り値:** `ProxyServer` インスタンスに解決される Promise
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
+ 貢献を歓迎します!お気軽にプルリクエストを送信してください。
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 ゲートウェイ**:認証とレート制限を備えた集中エントリポイント
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 テスト README](tests/docker/README.md) を参照してください。
623
+
624
+ ## 📊 パフォーマンス
625
+
626
+ このプロキシは Node.js ネイティブ HTTP/2 実装に基づいており、高性能向けに設計されています:
627
+
628
+ - 効率的なストリーム処理
629
+ - 最小限のオーバーヘッド
630
+ - コネクションプーリング
631
+ - 自動 HTTP/1.1 フォールバック
632
+
633
+ 本番環境デプロイメントでは、以下を検討してください:
634
+
635
+ - プロセスマネージャーの使用(PM2、systemd)
636
+ - マルチコアシステム用のクラスタリングの有効化
637
+ - ヘルスチェックによる監視
638
+ - 適切なログ記録の設定
639
+