# 🌐 OmniRoute Proxy Guide (ไทย) 🌐 **Languages:** 🇺🇸 [English](../../../../ops/PROXY_GUIDE.md) · 🇪🇹 [am](../../../am/docs/ops/PROXY_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/ops/PROXY_GUIDE.md) · 🇦🇿 [az](../../../az/docs/ops/PROXY_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/ops/PROXY_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/ops/PROXY_GUIDE.md) · 🇧🇦 [bs](../../../bs/docs/ops/PROXY_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/ops/PROXY_GUIDE.md) · 🇩🇰 [da](../../../da/docs/ops/PROXY_GUIDE.md) · 🇩🇪 [de](../../../de/docs/ops/PROXY_GUIDE.md) · 🇬🇷 [el](../../../el/docs/ops/PROXY_GUIDE.md) · 🇪🇸 [es](../../../es/docs/ops/PROXY_GUIDE.md) · 🇪🇪 [et](../../../et/docs/ops/PROXY_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/ops/PROXY_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/ops/PROXY_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/ops/PROXY_GUIDE.md) · 🇮🇪 [ga](../../../ga/docs/ops/PROXY_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/ops/PROXY_GUIDE.md) · 🇳🇬 [ha](../../../ha/docs/ops/PROXY_GUIDE.md) · 🇮🇱 [he](../../../he/docs/ops/PROXY_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/ops/PROXY_GUIDE.md) · 🇭🇷 [hr](../../../hr/docs/ops/PROXY_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/ops/PROXY_GUIDE.md) · 🇦🇲 [hy](../../../hy/docs/ops/PROXY_GUIDE.md) · 🇮🇩 [id](../../../id/docs/ops/PROXY_GUIDE.md) · 🇳🇬 [ig](../../../ig/docs/ops/PROXY_GUIDE.md) · 🇮🇹 [it](../../../it/docs/ops/PROXY_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/ops/PROXY_GUIDE.md) · 🇬🇪 [ka](../../../ka/docs/ops/PROXY_GUIDE.md) · 🇰🇭 [km](../../../km/docs/ops/PROXY_GUIDE.md) · 🇮🇳 [kn](../../../kn/docs/ops/PROXY_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/ops/PROXY_GUIDE.md) · 🇱🇹 [lt](../../../lt/docs/ops/PROXY_GUIDE.md) · 🇱🇻 [lv](../../../lv/docs/ops/PROXY_GUIDE.md) · 🇮🇳 [ml](../../../ml/docs/ops/PROXY_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/ops/PROXY_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/ops/PROXY_GUIDE.md) · 🇲🇹 [mt](../../../mt/docs/ops/PROXY_GUIDE.md) · 🇲🇲 [my](../../../my/docs/ops/PROXY_GUIDE.md) · 🇳🇵 [ne](../../../ne/docs/ops/PROXY_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/ops/PROXY_GUIDE.md) · 🇳🇴 [no](../../../no/docs/ops/PROXY_GUIDE.md) · 🇮🇳 [or](../../../or/docs/ops/PROXY_GUIDE.md) · 🇮🇳 [pa](../../../pa/docs/ops/PROXY_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/ops/PROXY_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/ops/PROXY_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/ops/PROXY_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/ops/PROXY_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/ops/PROXY_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/ops/PROXY_GUIDE.md) · 🇱🇰 [si](../../../si/docs/ops/PROXY_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/ops/PROXY_GUIDE.md) · 🇸🇮 [sl](../../../sl/docs/ops/PROXY_GUIDE.md) · 🇷🇸 [sr](../../../sr/docs/ops/PROXY_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/ops/PROXY_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/ops/PROXY_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/ops/PROXY_GUIDE.md) · 🇮🇳 [te](../../../te/docs/ops/PROXY_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/ops/PROXY_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/ops/PROXY_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/ops/PROXY_GUIDE.md) · 🇺🇿 [uz](../../../uz/docs/ops/PROXY_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/ops/PROXY_GUIDE.md) · 🇳🇬 [yo](../../../yo/docs/ops/PROXY_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/ops/PROXY_GUIDE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/ops/PROXY_GUIDE.md) --- > **ข้ามการปิดกั้นทางภูมิศาสตร์ ปกป้องตัวตนของคุณ และกำหนดเส้นทางทราฟฟิก AI ผ่านพร็อกซีใดก็ได้ — โดยไม่ต้องจัดการการกำหนดค่าที่ซับซ้อน** OmniRoute มาพร้อมระบบจัดการพร็อกซีที่มีคุณสมบัติครบถ้วน ซึ่งช่วยให้คุณกำหนดเส้นทางทราฟฟิกไปยังผู้ให้บริการ AI ต้นทางผ่านพร็อกซี HTTP, HTTPS หรือ SOCKS5 ได้ ไม่ว่าคุณจะอยู่ในภูมิภาคที่ถูกปิดกั้น ต้องการหมุนเวียน IP หรือต้องการอำพรางลายนิ้วมือ — คู่มือนี้ครอบคลุมทุกสิ่งที่คุณจำเป็นต้องรู้ --- ## สารบัญ - [เหตุใดจึงควรใช้พร็อกซี?](#why-use-proxies) - [ภาพรวมสถาปัตยกรรม](#architecture-overview) - [ระบบพร็อกซี 4 ระดับ](#4-level-proxy-system) - [รีจิสทรีพร็อกซี (CRUD)](#proxy-registry-crud) - [มาร์เก็ตเพลสพร็อกซีฟรี 1proxy](#1proxy-free-proxy-marketplace) - [การหมุนเวียนพร็อกซี](#proxy-rotation) - [การป้องกันการตรวจจับและการอำพราง](#anti-detection--stealth) - [โหมดพร็อกซีต้นทาง](#upstream-proxy-modes) - [UI แดชบอร์ด](#dashboard-ui) - [เอกสารอ้างอิง API](#api-reference) - [ตัวแปรสภาพแวดล้อม](#environment-variables) - [การแก้ไขปัญหา](#troubleshooting) --- ## เหตุใดจึงควรใช้พร็อกซี? ผู้ให้บริการ AI จำนวนมากจำกัดการเข้าถึงตามภูมิภาคทางภูมิศาสตร์ นักพัฒนาใน **รัสเซีย จีน อิหร่าน คิวบา ตุรกี** และประเทศอื่นๆ พบข้อผิดพลาด เช่น: ``` unsupported_country_region_territory ``` แม้จะอยู่นอกภูมิภาคที่ถูกปิดกั้น พร็อกซีก็ยังมีประโยชน์สำหรับ: | กรณีการใช้งาน | คำอธิบาย | | -------------------------------- | ------------------------------------------------------------------- | | **การข้ามข้อจำกัดทางภูมิศาสตร์** | เข้าถึง OpenAI, Anthropic, Codex และ Copilot จากประเทศที่ถูกปิดกั้น | | **การหมุนเวียน IP** | กระจายคำขอไปยัง IP หลายรายการเพื่อหลีกเลี่ยงการจำกัดอัตรา | | **ความเป็นส่วนตัว** | ซ่อน IP จริงของคุณจากผู้ให้บริการต้นทาง | | **การปฏิบัติตามข้อกำหนด** | กำหนดเส้นทางทราฟฟิกผ่านเขตอำนาจศาลที่ระบุ | | **การทดสอบ** | จำลองคำขอจากภูมิภาคต่างๆ | --- ## ภาพรวมสถาปัตยกรรม ``` ┌───────────────────────────────────────────────────────────────┐ │ เซิร์ฟเวอร์ OmniRoute │ │ │ │ ┌─────────────┐ ┌──────────────┐ ┌──────────────────┐ │ │ │ รีจิสทรี │ │ ตัวจัดส่ง │ │ การดึงข้อมูล │ │ │ │ พร็อกซี │───▶│ พร็อกซี │───▶│ (undici) │ │ │ │ (SQLite) │ │ (แคช) │ │ │ │ │ └─────────────┘ └──────────────┘ └────────┬─────────┘ │ │ ▲ │ │ │ │ ▼ │ │ ┌──────┴──────┐ ┌──────────────────┐ │ │ │ การซิงค์ │ │ API ผู้ให้บริการ │ │ │ │ 1proxy │ │ ต้นทาง │ │ │ │ (พูลฟรี) │ │ │ │ │ └─────────────┘ └──────────────────┘ │ └───────────────────────────────────────────────────────────────┘ ``` ### องค์ประกอบหลัก | องค์ประกอบ | ไฟล์ | หน้าที่ | | --------------------------- | -------------------------------------------- | ------------------------------------------------------ | | **รีจิสทรีพร็อกซี** | `src/lib/db/proxies.ts` | การดำเนินการ CRUD สำหรับรายการพร็อกซีและการกำหนดขอบเขต | | **ตัวจัดส่งพร็อกซี** | `open-sse/utils/proxyDispatcher.ts` | สร้างตัวจัดส่ง `undici` ProxyAgent/SOCKS พร้อมการแคช | | **การดึงข้อมูลผ่านพร็อกซี** | `open-sse/utils/proxyFetch.ts` | ครอบ `fetch()` พร้อมแทรกตัวจัดส่งพร็อกซี | | **เส้นทางการตั้งค่า** | `src/app/api/settings/proxy/route.ts` | API การกำหนดค่าพร็อกซีแบบเดิม (GET/PUT/DELETE) | | **เส้นทางการจัดการ** | `src/app/api/v1/management/proxies/route.ts` | API สำหรับ CRUD ของรีจิสทรี (GET/POST/PATCH/DELETE) | | **ฐานข้อมูล 1proxy** | `src/lib/db/oneproxy.ts` | การจัดเก็บข้อมูลถาวรของมาร์เก็ตเพลสพร็อกซีฟรี | --- ## ระบบพร็อกซี 4 ระดับ OmniRoute รองรับการกำหนดค่าพร็อกซีใน **ขอบเขตอิสระ 4 ระดับ** โดยพิจารณาตามลำดับความสำคัญ: ``` ลำดับการพิจารณาความสำคัญ (สูงสุด → ต่ำสุด): 1. 🔵 พร็อกซีระดับบัญชี/การเชื่อมต่อ → ต่อ API key / การเชื่อมต่อ OAuth 2. 🟡 พร็อกซีระดับผู้ให้บริการ → ต่อผู้ให้บริการ (เช่น ทราฟฟิก OpenAI ทั้งหมด) 3. 🟠 พร็อกซีระดับคอมโบ → ต่อการกำหนดค่าคอมโบ/การกำหนดเส้นทาง 4. 🟢 พร็อกซีส่วนกลาง → ทราฟฟิกทั้งหมด ผู้ให้บริการทั้งหมด ``` ### วิธีการพิจารณาพร็อกซี เมื่อ OmniRoute ส่งคำขอไปยังผู้ให้บริการต้นทาง ระบบจะเรียก `resolveProxyForConnectionFromRegistry()` ซึ่งตรวจสอบแต่ละระดับตามลำดับ: 1. **ระดับบัญชี** — มีพร็อกซีที่กำหนดให้กับ ID การเชื่อมต่อนี้โดยเฉพาะหรือไม่? 2. **ระดับผู้ให้บริการ** — มีพร็อกซีที่กำหนดให้กับผู้ให้บริการนี้ (เช่น `openai`) หรือไม่? 3. **ระดับส่วนกลาง** — มีการกำหนดค่าพร็อกซีส่วนกลางหรือไม่? 4. **ไม่มีพร็อกซี** — เชื่อมต่อกับผู้ให้บริการโดยตรง รายการแรกที่ตรงกันจะถูกเลือกใช้ ซึ่งหมายความว่าคุณสามารถกำหนดพร็อกซีส่วนกลางเป็นตัวสำรอง แต่แทนที่ค่านั้นสำหรับผู้ให้บริการหรือการเชื่อมต่อเฉพาะได้ ### ทราฟฟิกที่ส่งผ่านพร็อกซี | ประเภททราฟฟิก | ผ่านพร็อกซีหรือไม่? | หมายเหตุ | | --------------------------- | ------------------- | ----------------------------------------------- | | การเติมข้อความแชตให้สมบูรณ์ | ✅ | คำขอ `/v1/chat/completions` ทั้งหมด | | การฝังข้อมูล | ✅ | `/v1/embeddings` | | การสร้างรูปภาพ | ✅ | `/v1/images/generations` | | เสียง (TTS/STT) | ✅ | `/v1/audio/*` | | การแลกเปลี่ยนโทเค็น OAuth | ✅ | แก้ปัญหา `unsupported_country_region_territory` | | การทดสอบการเชื่อมต่อ | ✅ | ปุ่ม "ทดสอบการเชื่อมต่อ" ใช้พร็อกซี | | การรีเฟรชโทเค็น | ✅ | การต่ออายุ OAuth ในเบื้องหลัง | | การซิงค์โมเดล | ✅ | การแสดงรายการและค้นหาโมเดล | --- ## รีจิสทรีพร็อกซี (CRUD) รีจิสทรีพร็อกซีคือตาราง SQLite (`proxy_registry`) ที่จัดเก็บพร็อกซีทั้งหมดของคุณ พร็อกซีแต่ละรายการมีข้อมูลดังนี้: | ฟิลด์ | ชนิด | คำอธิบาย | | ---------- | ------- | --------------------------------------------------- | | `id` | UUID | ตัวระบุที่ไม่ซ้ำกัน | | `name` | String | ป้ายกำกับที่มนุษย์อ่านเข้าใจได้ | | `type` | String | โปรโตคอล: `http`, `https`, `socks5` | | `host` | String | ชื่อโฮสต์หรือ IP ของพร็อกซี | | `port` | Integer | หมายเลขพอร์ต | | `username` | String | ชื่อผู้ใช้สำหรับการยืนยันตัวตน (เข้ารหัสขณะจัดเก็บ) | | `password` | String | รหัสผ่านสำหรับการยืนยันตัวตน (เข้ารหัสขณะจัดเก็บ) | | `region` | String | ป้ายกำกับภูมิภาคทางภูมิศาสตร์ | | `notes` | String | หมายเหตุแบบข้อความอิสระ | | `status` | String | `active` หรือ `inactive` | | `source` | String | `manual` หรือ `oneproxy` | ### การสร้างพร็อกซี **ผ่านแดชบอร์ด:** 1. ไปที่ **การตั้งค่า → พร็อกซี** 2. คลิก **เพิ่มพร็อกซี** 3. กรอกชนิด โฮสต์ พอร์ต และข้อมูลประจำตัวสำหรับการยืนยันตัวตน (ถ้ามี) 4. บันทึก **ผ่าน API:** ```bash curl -X POST http://localhost:20128/api/v1/management/proxies \ -H "Content-Type: application/json" \ -d '{ "name": "พร็อกซี US", "type": "http", "host": "proxy.example.com", "port": 8080, "username": "user", "password": "pass", "region": "US" }' ``` ### การอัปเดตพร็อกซี ```bash curl -X PATCH http://localhost:20128/api/v1/management/proxies \ -H "Content-Type: application/json" \ -d '{ "id": "proxy-uuid-here", "host": "new-proxy.example.com", "port": 9090 }' ``` > **หมายเหตุ:** ข้อมูลประจำตัวจะยังคงอยู่ เว้นแต่คุณจะส่งค่าใหม่ที่ไม่ว่างเปล่าอย่างชัดเจน การส่งสตริงว่างสำหรับ `username`/`password` จะยังคงใช้ค่าที่จัดเก็บไว้ ### การลบพร็อกซี ```bash # ล้มเหลวหากพร็อกซีถูกกำหนดให้กับขอบเขตใดก็ตาม curl -X DELETE "http://localhost:20128/api/v1/management/proxies?id=proxy-uuid" # บังคับลบ (ลบการกำหนดทั้งหมดด้วย) curl -X DELETE "http://localhost:20128/api/v1/management/proxies?id=proxy-uuid&force=1" ``` ### การแสดงรายการพร็อกซี ```bash curl "http://localhost:20128/api/v1/management/proxies?limit=50&offset=0" ``` ### การกำหนดพร็อกซีให้กับขอบเขต ```bash # กำหนดให้กับขอบเขตส่วนกลาง curl -X PUT http://localhost:20128/api/settings/proxy \ -H "Content-Type: application/json" \ -d '{"level": "global", "proxy": {"type":"http","host":"proxy.example.com","port":8080}}' # กำหนดให้กับผู้ให้บริการที่ระบุ curl -X PUT http://localhost:20128/api/settings/proxy \ -H "Content-Type: application/json" \ -d '{"level": "provider", "id": "openai", "proxy": {"type":"socks5","host":"socks.example.com","port":1080}}' # กำหนดให้กับการเชื่อมต่อ/คีย์ที่ระบุ curl -X PUT http://localhost:20128/api/settings/proxy \ -H "Content-Type: application/json" \ -d '{"level": "key", "id": "connection-uuid", "proxy": {"type":"http","host":"key-proxy.com","port":3128}}' ``` ### การพิจารณาพร็อกซีที่มีผลใช้งาน ตรวจสอบว่าจะใช้พร็อกซีใดสำหรับการเชื่อมต่อที่กำหนด: ```bash curl "http://localhost:20128/api/settings/proxy?resolve=connection-uuid" ``` ส่งคืนพร็อกซีที่ได้รับการพิจารณาแล้ว พร้อมระดับ (`account`, `provider` หรือ `global`) และแหล่งที่มา ### การกำหนดแบบกลุ่ม กำหนดพร็อกซีหนึ่งรายการให้กับผู้ให้บริการหรือการเชื่อมต่อหลายรายการพร้อมกัน: ```bash curl -X POST http://localhost:20128/api/v1/management/proxies/bulk-assign \ -H "Content-Type: application/json" \ -d '{ "scope": "provider", "scopeIds": ["openai", "anthropic", "codex"], "proxyId": "proxy-uuid" }' ``` ### การนำเข้า/ส่งออก พร็อกซีจะรวมอยู่ในระบบ **สำรองข้อมูล/กู้คืน** เมื่อคุณส่งออกการกำหนดค่า OmniRoute: 1. ไปที่ **แดชบอร์ด → การตั้งค่า → สำรองข้อมูล** 2. คลิก **ส่งออก** — ระบบจะรวมรีจิสทรีพร็อกซีและการกำหนดพร็อกซีไว้ด้วย 3. หากต้องการกู้คืน ให้คลิก **นำเข้า** และอัปโหลดไฟล์สำรองข้อมูล รีจิสทรีพร็อกซียังรองรับ **upsert ตาม host+port** — หากคุณนำเข้าพร็อกซีที่มีอยู่แล้ว (โฮสต์และพอร์ตเดียวกัน) ระบบจะอัปเดตแทนการสร้างรายการซ้ำ ### การย้ายข้อมูลแบบเดิม หากคุณกำหนดค่าพร็อกซีไว้ในเวอร์ชันเก่า (ก่อนมีรีจิสทรี) OmniRoute จะย้ายข้อมูลให้โดยอัตโนมัติ: ``` ที่เก็บ key_value แบบเดิม → proxy_registry + proxy_assignments ``` กระบวนการนี้จะเกิดขึ้นเพียงครั้งเดียวเมื่อเริ่มต้นระบบครั้งแรกหลังการอัปเกรด ใช้ `migrateLegacyProxyConfigToRegistry({ force: true })` เพื่อเรียกใช้กระบวนการอีกครั้ง --- ## ตลาดพร็อกซีฟรี 1proxy > 🆕 **สนับสนุนโดย [@oyi77](https://github.com/oyi77)** — PR [#1847](https://github.com/diegosouzapw/OmniRoute/pull/1847) (Issue [#1788](https://github.com/diegosouzapw/OmniRoute/issues/1788)) OmniRoute ผสานการทำงานกับแพลตฟอร์มชุมชน **[1proxy](https://1proxy-api.aitradepulse.com)** เพื่อให้สามารถเข้าถึง **พร็อกซีฟรีที่ผ่านการตรวจสอบแล้วหลายร้อยรายการ** จากทั่วโลก เหมาะอย่างยิ่งสำหรับผู้ใช้ที่ไม่มีโครงสร้างพื้นฐานพร็อกซีเป็นของตนเอง ### วิธีการทำงาน ``` ┌─────────────┐ ซิงค์ข้อมูล ┌─────────────────┐ หมุนเวียน ┌──────────┐ │ 1proxy API │ ────────────▶ │ proxy_registry │ ────────────▶ │ Provider │ │ (ภายนอก) │ สูงสุด 500 │ source=oneproxy │ ตามคุณภาพ │ API │ └─────────────┘ พร็อกซี └─────────────────┘ └──────────┘ ``` 1. **ซิงค์** — OmniRoute ดึงพร็อกซีที่ผ่านการตรวจสอบแล้วจาก 1proxy API 2. **จัดเก็บ** — พร็อกซีจะถูกบันทึกในตาราง `proxy_registry` เดียวกัน โดยมี `source = 'oneproxy'` 3. **กรอง** — กรองตามโปรโตคอล ประเทศ และคะแนนคุณภาพ 4. **หมุนเวียน** — เลือกพร็อกซีที่ดีที่สุดโดยใช้กลยุทธ์ตามคุณภาพ แบบสุ่ม หรือแบบเรียงลำดับ 5. **ลดระดับอัตโนมัติ** — พร็อกซีที่ล้มเหลวจะถูกลดคะแนนคุณภาพ หากต่ำกว่าเกณฑ์ → ทำเครื่องหมายเป็นไม่ทำงาน ### การซิงค์พร็อกซี **ผ่านแดชบอร์ด:** 1. ไปที่แท็บ **Settings → 1proxy** 2. คลิก **"Sync Now"** 3. ดูสถิติ ได้แก่ จำนวนพร็อกซีทั้งหมด จำนวนที่ทำงานอยู่ คุณภาพเฉลี่ย และรายละเอียดแยกตามประเทศ **ผ่าน API:** ```bash # เริ่มการซิงค์ curl -X POST http://localhost:20128/api/settings/oneproxy \ -H "Content-Type: application/json" \ -d '{}' # การตอบกลับ: # { "success": true, "added": 127, "updated": 45, "failed": 2, "total": 172 } ``` ### การกรองพร็อกซี ```bash # กรองตามโปรโตคอล curl "http://localhost:20128/api/settings/oneproxy?protocol=socks5" # กรองตามประเทศ curl "http://localhost:20128/api/settings/oneproxy?countryCode=US" # กรองตามคะแนนคุณภาพขั้นต่ำ curl "http://localhost:20128/api/settings/oneproxy?minQuality=80" # ใช้ตัวกรองร่วมกัน curl "http://localhost:20128/api/settings/oneproxy?protocol=http&countryCode=DE&minQuality=70" ``` ### คะแนนคุณภาพของพร็อกซี พร็อกซี 1proxy แต่ละรายการมาพร้อมข้อมูลเมตา: | ฟิลด์ | คำอธิบาย | | --------------- | ----------------------------------------------- | | `qualityScore` | คะแนน 0-100 จากการตรวจสอบของ 1proxy | | `latencyMs` | เวลาแฝงของเครือข่ายที่วัดได้ | | `anonymity` | `transparent`, `anonymous` หรือ `elite` | | `googleAccess` | พร็อกซีสามารถเข้าถึงบริการของ Google ได้หรือไม่ | | `countryCode` | รหัสประเทศ ISO แบบสองตัวอักษร | | `lastValidated` | เวลาประทับของการตรวจสอบครั้งล่าสุด | คะแนนคุณภาพจะได้รับการปรับแบบไดนามิก: - **คำขอที่ล้มเหลว** จะลดคะแนนลง 10 คะแนน - **คะแนนลดลงเหลือ ≤10** → พร็อกซีจะถูกทำเครื่องหมายเป็น `inactive` - พร็อกซีที่ไม่ทำงานจะไม่ถูกนำมาใช้ในการหมุนเวียน ### กลยุทธ์การหมุนเวียน ```bash # หมุนเวียนตามคุณภาพ (พร็อกซีที่ดีที่สุดก่อน) — ค่าเริ่มต้น curl -X POST http://localhost:20128/api/settings/oneproxy/rotate \ -H "Content-Type: application/json" \ -d '{"strategy": "quality"}' # หมุนเวียนแบบสุ่ม curl -X POST http://localhost:20128/api/settings/oneproxy/rotate \ -d '{"strategy": "random"}' # แบบเรียงลำดับ (รายการที่ได้รับการตรวจสอบนานที่สุดก่อน) curl -X POST http://localhost:20128/api/settings/oneproxy/rotate \ -d '{"strategy": "sequential"}' ``` ### เซอร์กิตเบรกเกอร์ การซิงค์ 1proxy มีเซอร์กิตเบรกเกอร์ในตัว: - หลังจาก **การซิงค์ล้มเหลวติดต่อกัน 5 ครั้ง** ความพยายามซิงค์ครั้งต่อไปจะถูกบล็อก - รีเซ็ตด้วย: `resetOneproxyCircuitBreaker()` หรือรีสตาร์ตเซิร์ฟเวอร์ - ดูสถานะการซิงค์ได้ที่ `GET /api/settings/oneproxy?action=status` ### การล้างพร็อกซี 1proxy ```bash # ลบพร็อกซี 1proxy หนึ่งรายการ curl -X DELETE "http://localhost:20128/api/settings/oneproxy?id=proxy-uuid" # ล้างพร็อกซี 1proxy ทั้งหมด (พร็อกซีที่เพิ่มด้วยตนเองจะไม่ได้รับผลกระทบ) curl -X DELETE "http://localhost:20128/api/settings/oneproxy?clearAll=1" ``` --- ## การหลบเลี่ยงการตรวจจับและการพรางตัว OmniRoute ไม่ได้เพียงกำหนดเส้นทางทราฟฟิกผ่านพร็อกซีเท่านั้น แต่ยังทำให้ทราฟฟิกดูเหมือนเป็นทราฟฟิกที่ถูกต้องอีกด้วย: ### การปลอมแปลงลายนิ้วมือ TLS ใช้ `wreq-js` เพื่อสร้างลายนิ้วมือ TLS ที่มีลักษณะเหมือนเบราว์เซอร์ ช่วยหลบเลี่ยงระบบตรวจจับบอตที่ระบุว่า TLS handshake ซึ่งไม่ได้มาจากเบราว์เซอร์เป็นสิ่งผิดปกติ ### การจับคู่ลายนิ้วมือ CLI **สวิตช์ลายนิ้วมือ CLI** (`Settings → Security`) จะจัดลำดับส่วนหัว HTTP และฟิลด์ในเนื้อหา JSON ใหม่ เพื่อให้ตรงกับลายเซ็นของไบนารี CLI แบบเนทีฟอย่างแม่นยำ (Claude Code, Codex ฯลฯ) โดยทำงาน **เพิ่มเติมจาก** พร็อกซี: ``` IP ของคุณ (ถูกบล็อก) → IP พร็อกซี (US) → API ของผู้ให้บริการ + การปลอมแปลง TLS + ลายนิ้วมือ CLI ``` คุณจึงได้รับทั้ง **การปกปิด IP** และ **ความถูกต้องเสมือนจริงของคำขอ** พร้อมกัน ### การคงรักษา IP ของพร็อกซี ป้ายกำกับแบบแยกสีในแดชบอร์ดจะแสดงว่าระดับพร็อกซีใดกำลังใช้งานอยู่: | ป้ายกำกับ | ระดับ | ความหมาย | | --------- | ------------ | ----------------------------------------------- | | 🟢 | ส่วนกลาง | ทราฟฟิกทั้งหมดผ่านพร็อกซีนี้ | | 🟡 | ผู้ให้บริการ | เฉพาะทราฟฟิกของผู้ให้บริการรายนี้ที่ผ่านพร็อกซี | | 🔵 | การเชื่อมต่อ | คีย์/บัญชีเฉพาะนี้ใช้พร็อกซีนี้ | ป้ายกำกับยังแสดง IP ของพร็อกซีที่ผ่านการแปลงชื่อแล้วเพื่อใช้ตรวจสอบ --- ## โหมดพร็อกซีต้นทาง สำหรับผู้ให้บริการที่ใช้รูปแบบ CLIProxyAPI นั้น OmniRoute รองรับโหมดพร็อกซีต้นทางสามโหมด: | โหมด | คำอธิบาย | | ------------- | ---------------------------------------------------------- | | `native` | OmniRoute จัดการการกำหนดเส้นทางพร็อกซีโดยตรง (ค่าเริ่มต้น) | | `cliproxyapi` | มอบหมายให้ CLIProxyAPI ภายนอกจัดการ | | `fallback` | ลองใช้แบบเนทีฟก่อน หากไม่สำเร็จจึงเปลี่ยนไปใช้ CLIProxyAPI | กำหนดค่าแยกตามผู้ให้บริการ: ```bash curl -X PUT "http://localhost:20128/api/upstream-proxy/openai" \ -H "Content-Type: application/json" \ -d '{"mode": "native", "enabled": true}' ``` --- ## UI แดชบอร์ด ### Settings → แท็บ Proxy - การกำหนดค่า **พร็อกซีส่วนกลาง** (ตั้งค่าครั้งเดียวสำหรับทราฟฟิกทั้งหมด) - การแทนที่ **พร็อกซีแยกตามผู้ให้บริการ** - การกำหนด **พร็อกซีแยกตามการเชื่อมต่อ** - **การทดสอบการเชื่อมต่อ** ผ่านพร็อกซีที่กำหนดค่าไว้ - **ป้ายกำกับแบบแยกสี** ที่แสดงระดับพร็อกซีซึ่งกำลังใช้งาน ### Settings → แท็บ 1proxy - ปุ่ม **Sync Now** สำหรับดึงพร็อกซีฟรี - **การ์ดสถิติ**: ทั้งหมด, ใช้งานอยู่, คุณภาพเฉลี่ย, ซิงค์ล่าสุด - **ตัวกรอง**: โปรโตคอล, รหัสประเทศ, คุณภาพขั้นต่ำ - **ตารางพร็อกซี** ที่แสดงโฮสต์ โปรโตคอล ประเทศ คะแนนคุณภาพ เวลาแฝง ระดับการไม่เปิดเผยตัวตน และการเข้าถึง Google - แผง **สถานะการซิงค์** พร้อมการติดตามความสำเร็จ/ความล้มเหลวและจำนวนครั้งที่ล้มเหลวติดต่อกัน - **Clear All** เพื่อลบรายการ 1proxy ทั้งหมด --- ## เอกสารอ้างอิง API ### API การตั้งค่าพร็อกซี | เมธอด | เอนด์พอยต์ | คำอธิบาย | | -------- | ---------------------------------------------- | ---------------------------- | | `GET` | `/api/settings/proxy` | รับการกำหนดค่าพร็อกซีทั้งหมด | | `GET` | `/api/settings/proxy?level=global` | รับพร็อกซีส่วนกลาง | | `GET` | `/api/settings/proxy?level=provider&id=openai` | รับพร็อกซีของผู้ให้บริการ | | `GET` | `/api/settings/proxy?resolve=connectionId` | ระบุพร็อกซีที่มีผลใช้งาน | | `PUT` | `/api/settings/proxy` | อัปเดตการกำหนดค่าพร็อกซี | | `DELETE` | `/api/settings/proxy?level=provider&id=openai` | ลบพร็อกซีในระดับที่กำหนด | ### API รีจิสทรีพร็อกซี | เมธอด | เอนด์พอยต์ | คำอธิบาย | | -------- | ------------------------------------------------- | ------------------ | | `GET` | `/api/v1/management/proxies` | แสดงพร็อกซีทั้งหมด | | `GET` | `/api/v1/management/proxies?id=uuid` | รับพร็อกซีด้วย ID | | `GET` | `/api/v1/management/proxies?id=uuid&where_used=1` | รับการกำหนดพร็อกซี | | `POST` | `/api/v1/management/proxies` | สร้างพร็อกซี | | `PATCH` | `/api/v1/management/proxies` | อัปเดตพร็อกซี | | `DELETE` | `/api/v1/management/proxies?id=uuid` | ลบพร็อกซี | | `DELETE` | `/api/v1/management/proxies?id=uuid&force=1` | บังคับลบ | | `POST` | `/api/v1/management/proxies/bulk-assign` | กำหนดแบบกลุ่ม | | `GET` | `/api/v1/management/proxies/assignments` | แสดงรายการกำหนด | | `GET` | `/api/v1/management/proxies/health` | สถิติสถานะพร็อกซี | ### API ทันเนล สำหรับการเปิดเผยอินสแตนซ์ OmniRoute ของคุณสู่อินเทอร์เน็ตสาธารณะ (Cloudflare/ngrok/Tailscale) แทนการกำหนดเส้นทางขาออกผ่านพร็อกซี โปรดดู [TUNNELS_GUIDE.md](./TUNNELS_GUIDE.md) โดย REST API ของทันเนลอยู่ภายใต้ `/api/tunnels/{cloudflared,ngrok,tailscale}/*` และแยกเป็นอิสระจากสายโซ่พร็อกซีขาออกที่อธิบายไว้ข้างต้น ### API ของ 1proxy | เมธอด | เอนด์พอยต์ | คำอธิบาย | | -------- | -------------------------------------- | ------------------------ | | `GET` | `/api/settings/oneproxy` | แสดงรายการพร็อกซี 1proxy | | `GET` | `/api/settings/oneproxy?action=stats` | รับสถิติ + สถานะการซิงค์ | | `GET` | `/api/settings/oneproxy?action=status` | รับเฉพาะสถานะการซิงค์ | | `POST` | `/api/settings/oneproxy` | เริ่มการซิงค์ | | `POST` | `/api/settings/oneproxy/rotate` | สลับไปยังพร็อกซีถัดไป | | `DELETE` | `/api/settings/oneproxy?id=uuid` | ลบหนึ่งรายการ | | `DELETE` | `/api/settings/oneproxy?clearAll=1` | ล้างทั้งหมด | ### API พร็อกซีต้นทาง | เมธอด | เอนด์พอยต์ | คำอธิบาย | | -------- | --------------------------------- | --------------------------- | | `GET` | `/api/upstream-proxy/:providerId` | รับการกำหนดค่าพร็อกซีต้นทาง | | `PUT` | `/api/upstream-proxy/:providerId` | ตั้งค่าโหมดพร็อกซีต้นทาง | | `DELETE` | `/api/upstream-proxy/:providerId` | ลบการกำหนดค่าพร็อกซีต้นทาง | --- ## ตัวแปรสภาพแวดล้อม | ตัวแปร | ค่าเริ่มต้น | คำอธิบาย | | --------------------- | ----------- | --------------------------------------------------------------------------- | | `ENABLE_SOCKS5_PROXY` | `true` | เปิดใช้งานการรองรับพร็อกซี SOCKS5 (ค่าเริ่มต้นคือ `true` ใน `.env.example`) | --- ## การแก้ไขปัญหา ### "พร็อกซี SOCKS5 ถูกปิดใช้งาน" ตั้งค่า `ENABLE_SOCKS5_PROXY=true` ในไฟล์ `.env` ของคุณ แล้วรีสตาร์ต ### ข้อผิดพลาด "socket hang up" เมื่อเชื่อมต่อผ่านพร็อกซี อาการนี้เป็นเรื่องปกติสำหรับพร็อกซีราคาถูกที่ตัดการเชื่อมต่อซึ่งไม่มีการใช้งาน OmniRoute จัดการปัญหานี้ไว้แล้วด้วยวิธีต่อไปนี้: - ปิดใช้งาน keep-alive สำหรับการเชื่อมต่อพร็อกซี (`keepAliveTimeout: 1`) - ปิดใช้งาน pipelining (`pipelining: 0`) - แคช dispatcher เพื่อหลีกเลี่ยงการทำ handshake ซ้ำ หากปัญหายังคงอยู่ ให้ลองใช้พร็อกซีอื่นหรือใช้ฟีเจอร์หมุนเวียนพร็อกซีของ 1proxy ### "unsupported_country_region_territory" ระหว่าง OAuth ตรวจสอบให้แน่ใจว่ากำหนดค่าพร็อกซีไว้ **ก่อน** เริ่มขั้นตอน OAuth OmniRoute จะกำหนดเส้นทางการแลกเปลี่ยนโทเค็น OAuth ผ่านพร็อกซีที่กำหนดค่าไว้ ให้ตั้งค่าพร็อกซีระดับ global หรือระดับ provider ก่อน แล้วจึงเชื่อมต่อ ### ไม่มีการใช้งานพร็อกซี ตรวจสอบลำดับการค้นหาค่า: 1. ตรวจสอบด้วย `GET /api/settings/proxy?resolve=your-connection-id` 2. ตรวจสอบว่า `status` ของพร็อกซีเป็น `active` (ไม่ใช่ `inactive`) 3. ตรวจสอบให้แน่ใจว่าขอบเขตการกำหนดพร็อกซีตรงกับการเชื่อมต่อของคุณ ### การซิงค์ 1proxy ล้มเหลว ตรวจสอบสถานะการซิงค์: ```bash curl "http://localhost:20128/api/settings/oneproxy?action=status" ``` หาก `consecutiveFailures >= 5` แสดงว่า circuit breaker ทำงานแล้ว ให้รีสตาร์ตเซิร์ฟเวอร์เพื่อรีเซ็ต หรือรอการรีเซ็ตด้วยตนเอง --- ## สคีมาฐานข้อมูล ### ตาราง `proxy_registry` ```sql CREATE TABLE proxy_registry ( id TEXT PRIMARY KEY, name TEXT NOT NULL, type TEXT NOT NULL DEFAULT 'http', host TEXT NOT NULL, port INTEGER NOT NULL, username TEXT DEFAULT '', password TEXT DEFAULT '', region TEXT, notes TEXT, status TEXT DEFAULT 'active', source TEXT NOT NULL DEFAULT 'manual', -- 'manual' หรือ 'oneproxy' quality_score INTEGER, -- 0-100 (เฉพาะ 1proxy) latency_ms INTEGER, -- มิลลิวินาที (เฉพาะ 1proxy) anonymity TEXT, -- transparent/anonymous/elite google_access INTEGER DEFAULT 0, -- สามารถเข้าถึง Google ได้หรือไม่? (1proxy) last_validated TEXT, -- การประทับเวลา ISO (1proxy) country_code TEXT, -- รหัส ISO แบบ 2 ตัวอักษร (1proxy) created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); ``` ### ตาราง `proxy_assignments` ```sql CREATE TABLE proxy_assignments ( id INTEGER PRIMARY KEY AUTOINCREMENT, proxy_id TEXT NOT NULL REFERENCES proxy_registry(id), scope TEXT NOT NULL, -- 'global', 'provider', 'account', 'combo' scope_id TEXT, -- ID ของ provider, ID ของ connection หรือ ID ของ combo created_at TEXT NOT NULL, updated_at TEXT NOT NULL, UNIQUE(scope, scope_id) ); ``` --- ## การตรวจสอบสถานะพร็อกซี (v3.8.16+) กลไก **proxy fast-fail** ของ OmniRoute (`src/lib/proxyHealth.ts`) ตรวจจับพร็อกซีที่ใช้งานไม่ได้ภายใน <2 วินาทีด้วยการตรวจสอบการเชื่อมต่อ TCP อย่างรวดเร็ว จากนั้นจะ **แคชผลลัพธ์** เพื่อหลีกเลี่ยงค่าใช้จ่ายเพิ่มเติมต่อคำขอ ### วิธีการทำงาน ``` คำขอ ──▶ ProxyHealthCache.get(url) │ ├─ พบในแคช + ยังใหม่อยู่? ──▶ ส่งคืนสถานะที่แคชไว้ │ └─ ไม่พบในแคช / หมดอายุ? ──▶ เชื่อมต่อ TCP ไปยัง host:port (หมดเวลา: FAST_FAIL_TIMEOUT_MS) ──▶ แคชเป็นเวลา HEALTH_CACHE_TTL_MS ──▶ ส่งคืนผลลัพธ์ ``` หากไม่มีกลไกนี้ พร็อกซีที่ใช้งานไม่ได้จะบล็อกทุกคำขอเป็นเวลาเต็มตามค่า `PROXY_TIMEOUT_MS` (ค่าเริ่มต้น 30 วินาที) ก่อนที่จะล้มเหลว ### ตัวแปรสภาพแวดล้อมที่ปรับแต่งได้ | ตัวแปร | ค่าเริ่มต้น | วัตถุประสงค์ | | ---------------------------- | ----------- | ---------------------------------------------- | | `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | ระยะหมดเวลาการเชื่อมต่อ TCP ต่อการตรวจสอบสถานะ | | `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | ระยะเวลาที่แคชผลลัพธ์สถานะไว้ | **ค่าที่แนะนำ:** | สถานการณ์ | ระยะหมดเวลา fast-fail | TTL ของแคช | เหตุผล | | ------------------------------ | --------------------- | ---------- | ----------------------------------------------------------------------------- | | เกตเวย์ API ที่มีปริมาณงานสูง | 1500ms | 60000ms | ล้มเหลวอย่างรวดเร็วเชิงรุก และใช้แคชนานขึ้นเพื่อลดการตรวจสอบ | | โหนดที่กระจายตามภูมิศาสตร์ | 3000ms | 15000ms | เครือข่ายที่ช้าต้องใช้เวลามากขึ้น และใช้แคชสั้นลงเพื่อสลับระบบได้อย่างรวดเร็ว | | การพัฒนา / การทดสอบ | 1000ms | 10000ms | ปรับแก้พร็อกซีภายในเครื่องได้อย่างรวดเร็ว | | การพรางตัว / ป้องกันการตรวจจับ | 2500ms | 45000ms | หลีกเลี่ยงการตรวจสอบถี่เกินไปซึ่งอาจทำให้ถึงขีดจำกัดอัตราการใช้งาน | ### การตรวจสอบสถานะพร็อกซี ```ts import { getAllProxyHealthStatuses, invalidateProxyHealth } from "omniroute/proxyHealth"; const statuses = getAllProxyHealthStatuses(); for (const s of statuses) { console.log(`${s.proxyUrl} → healthy=${s.healthy}, stale=${s.stale}`); } // บังคับให้ตรวจสอบพร็อกซีที่ระบุอีกครั้ง invalidateProxyHealth("http://user:pass@203.0.113.7:8080"); ``` แฟล็ก `stale` จะเป็น `true` เมื่อรายการในแคชมีอายุเกิน `HEALTH_CACHE_TTL_MS` และคำขอถัดไปจะเรียกให้มีการตรวจสอบใหม่ ### ค่าเริ่มต้นตามประเภทพร็อกซี การตรวจสอบสถานะใช้ค่าเริ่มต้นที่เหมาะสมตาม scheme ของ URL: | Scheme | พอร์ตเริ่มต้น | | -------------------------- | ------------- | | `http://` | 8080 | | `https://` | 443 | | `socks5://` / `socks5h://` | 1080 | พอร์ตที่กำหนดเองใน URL (`http://host:9999`) จะมีลำดับความสำคัญเหนือค่าเริ่มต้นของ scheme เสมอ --- ## การวิเคราะห์และการสังเกตการณ์พร็อกซี OmniRoute ติดตามการใช้งานแยกตามพร็อกซี เพื่อช่วยให้ผู้ดูแลระบบวินิจฉัยรูปแบบการกำหนดเส้นทาง ช่วงที่เวลาแฝงพุ่งสูง และความล้มเหลวที่เกิดซ้ำ ### ข้อมูลที่ติดตาม สำหรับทุกคำขอที่ส่งผ่านพร็อกซีซึ่งกำหนดค่าไว้ OmniRoute จะบันทึกข้อมูลต่อไปนี้: | เมตริก | คำอธิบาย | | ------------ | ------------------------------------------------------ | | `proxy_url` | URL ของพร็อกซีแบบเต็ม (ซ่อนข้อมูลรับรองการยืนยันตัวตน) | | `provider` | ID ของผู้ให้บริการต้นทาง (openai, anthropic เป็นต้น) | | `latency_ms` | เวลารวมไป-กลับ รวมถึงการจับมือกับพร็อกซี | | `connect_ms` | เวลาเชื่อมต่อ TCP เท่านั้น | | `status` | รหัสสถานะ HTTP จากต้นทาง | | `error` | คลาสข้อผิดพลาด หากคำขอล้มเหลว | | `timestamp` | ISO 8601 UTC | ### การเข้าถึงข้อมูล ```bash # เหตุการณ์พร็อกซีล่าสุด curl -H "Authorization: Bearer $OMNIROUTE_KEY" \ "http://localhost:20128/api/usage/proxy-logs?limit=100" ``` เอนด์พอยต์จริงคือ `/api/usage/proxy-logs` (ดู `src/app/api/usage/proxy-logs/route.ts`) เอนด์พอยต์นี้รองรับ: - `GET /api/usage/proxy-logs` — ดึงข้อมูลบันทึกพร็อกซี - `DELETE /api/usage/proxy-logs` — ล้างข้อมูลบันทึกพร็อกซีทั้งหมด หากจำเป็น สามารถสืบค้นสถิติรวมได้โดยตรงจากตาราง `proxy_logs` ผ่าน SQL ส่วน UI แดชบอร์ดอาจมีมุมมองข้อมูลรวมให้ใช้งาน ### รูปแบบที่พบบ่อย **ตรวจหาพร็อกซีที่ทำงานไม่เสถียร** (สลับระหว่างสำเร็จ/ล้มเหลว): ```sql SELECT proxy_url, COUNT(*) AS total, SUM(CASE WHEN status >= 500 THEN 1 ELSE 0 END) AS errors, ROUND(100.0 * SUM(CASE WHEN status >= 500 THEN 1 ELSE 0 END) / COUNT(*), 1) AS error_pct FROM proxy_logs WHERE timestamp > datetime('now', '-1 hour') GROUP BY proxy_url HAVING error_pct > 5 ORDER BY error_pct DESC; ``` **ค้นหาพร็อกซีที่ช้า** (เวลาแฝง p95 > 2 วินาที): ```sql WITH ranked AS ( SELECT proxy_url, latency_ms, PERCENT_RANK() OVER (PARTITION BY proxy_url ORDER BY latency_ms) AS pct FROM proxy_logs WHERE timestamp > datetime('now', '-24 hour') ) SELECT proxy_url, latency_ms FROM ranked WHERE pct >= 0.95 ORDER BY latency_ms DESC; ``` --- ## แผนผังการตัดสินใจสำหรับกลยุทธ์การหมุนเวียน เมื่อกำหนดพร็อกซีหลายรายการให้กับขอบเขตหนึ่ง OmniRoute จะใช้ **กลยุทธ์การหมุนเวียน** เพื่อเลือกพร็อกซีสำหรับแต่ละคำขอ กลยุทธ์นี้กำหนดค่าในระดับขอบเขต (ส่วนกลาง, แยกตามผู้ให้บริการ, แยกตามบัญชี, แยกตามชุดค่าผสม) ### กลยุทธ์ที่ใช้ได้ | กลยุทธ์ | ควรใช้เมื่อ | ข้อแลกเปลี่ยน | | ----------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------ | | `quality` (ค่าเริ่มต้น) | ระบบใช้งานจริงที่มีพร็อกซีคุณภาพหลากหลาย | ให้ความสำคัญกับพร็อกซีที่ได้รับคะแนนสูง แต่อาจทำให้พร็อกซีคะแนนต่ำไม่ได้รับการใช้งาน | | `random` | การกระจายโหลด, ความเป็นส่วนตัว | กระจายอย่างเท่าเทียม แต่ไม่สนใจสัญญาณด้านคุณภาพ | | `sequential` | การดีบัก, การทดสอบแบบกำหนดผลลัพธ์แน่นอน | วนใช้พร็อกซีตามลำดับ ทำความเข้าใจพฤติกรรมได้ง่าย | ### แผนผังการตัดสินใจ ``` คุณมีคะแนนคุณภาพสำหรับพร็อกซีหรือไม่? │ ┌───────────┴───────────┐ │ │ มี ไม่มี │ │ พร็อกซีทั้งหมดมี │ คุณภาพใกล้เคียงกันหรือไม่ │ │ │ ┌────┴────┐ │ │ │ │ ใช่ ไม่ใช่ ใช้ │ │ `random` │ │ (การกระจายอย่าง │ │ เท่าเทียมช่วยสร้างข้อมูล │ │ คุณภาพเมื่อเวลาผ่านไป) │ │ │ ใช้ `quality` │ (เหมาะที่สุดสำหรับ │ คุณภาพที่หลากหลาย) │ ใช้ `random` (กระจายโหลด อย่างเท่าเทียม) ``` ## การตัดพร็อกซีที่ล้มเหลวออกโดยอัตโนมัติสำหรับพร็อกซีของคุณเอง พูลมาร์เก็ตเพลสของ 1proxy จะลดระดับพร็อกซีที่ล้มเหลวโดยอัตโนมัติอยู่แล้ว (ดู [คะแนนคุณภาพพร็อกซี](#proxy-quality-scores)) สำหรับ พร็อกซีที่ **คุณ** เพิ่มลงในรีจิสทรี ตัวจัดกำหนดการตรวจสอบสถานะเบื้องหลัง (`src/lib/proxyHealth/scheduler.ts`) จะทำงานในลักษณะเดียวกัน โดย "ตัดสมาชิกที่ใช้งานไม่ได้ออกจาก เชนโดยอัตโนมัติ" โดยไม่ลบข้อมูลใดๆ: ```bash # .env — ปิดใช้งานพร็อกซีแบบชั่วคราวหลังจากการตรวจสอบล้มเหลวติดต่อกัน 3 ครั้ง และเปิดใช้งานอีกครั้ง # โดยอัตโนมัติเมื่อพร็อกซีกลับมาตอบสนองต่อการตรวจสอบ PROXY_AUTO_DISABLE=true PROXY_AUTO_REMOVE_AFTER=3 ``` การทำงานภายในเชนแบบหลายพร็อกซี: 1. ตัวจัดกำหนดการจะตรวจสอบพร็อกซีที่ลงทะเบียนทุกตัวทุกๆ `PROXY_HEALTH_INTERVAL_MS` (ค่าเริ่มต้น 10 นาที; ขั้นต่ำ 1 นาที) 2. หลังจากเกิดความล้มเหลวที่ **ยืนยันได้แน่ชัด** ติดต่อกันครบ `PROXY_AUTO_REMOVE_AFTER` ครั้ง (เป็นความล้มเหลว ในการเชื่อมต่อจริง — การหมดเวลาหรือข้อผิดพลาด 5xx จากเป้าหมายการตรวจสอบเองจะไม่ถูกนับ โปรดดู [การตรวจสอบสถานะพร็อกซี](#proxy-health-checking-v3816)) ค่า `status` ของพร็อกซีจะถูก ตั้งเป็น `dead` 3. `dead` เป็นหนึ่งในสถานะที่ตัวกรองสถานะพร้อมใช้งานซึ่งใช้ในการแก้ไขพูล/การหมุนเวียน จะตัดออก ดังนั้นการหมุนเวียนของขอบเขต (round-robin / random / sticky / latency — ดู [แผนผังการตัดสินใจเลือกกลยุทธ์การหมุนเวียน](#rotation-strategy-decision-tree)) จะหยุดส่งพร็อกซีนั้นให้คำขอใหม่ทันที พร็อกซีอื่นๆ ใน พูลจะไม่ได้รับผลกระทบ และทั้งพูลจะไม่ย้อนกลับไปใช้การเชื่อมต่อโดยตรงอย่างเงียบๆ — ดูกลไกป้องกันแบบปิดเมื่อเกิดข้อผิดพลาดของ [ระบบพร็อกซี 4 ระดับ](#4-level-proxy-system) 4. ตัวจัดกำหนดการจะตรวจสอบพร็อกซี `dead` ต่อไปตามช่วงเวลาเดิม การตรวจสอบครั้งถัดไป ที่สำเร็จจะเปลี่ยน `status` กลับเป็น `active` และพร็อกซีจะกลับเข้าสู่การหมุนเวียน — โดยไม่ต้องเพิ่มกลับด้วยตนเอง การทำงานนี้ได้รับการออกแบบให้เป็นแบบ **เลือกเปิดใช้และไม่ทำลายข้อมูล**: โดยค่าเริ่มต้น ตัวจัดกำหนดการจะเพียง นับและบันทึกความล้มเหลวลงในบันทึก (ดูนโยบาย C ใน `decision.ts`) และ `PROXY_AUTO_DISABLE` จะไม่ลบแถวข้อมูล — การลบเป็นหน้าที่ของแฟล็ก `PROXY_AUTO_REMOVE` ที่แยกต่างหากและมีการทำงาน เชิงรุกมากกว่า หากตั้งค่าทั้งสองเป็น `true` `PROXY_AUTO_REMOVE` จะมีลำดับความสำคัญเหนือกว่า (พร็อกซีที่กำลังจะถูกลบไม่จำเป็นต้องถูกปิดใช้งานแบบชั่วคราวในระหว่างนั้น) ดูข้อมูลอ้างอิง [การกำหนดค่าสภาพแวดล้อม](../reference/ENVIRONMENT.md) สำหรับรายการตัวแปรทั้งหมด --- > 📖 **เอกสารที่เกี่ยวข้อง:** > > - [คู่มือผู้ใช้](../guides/USER_GUIDE.md) — การตั้งค่าและการกำหนดค่าทั่วไป > - [เอกสารอ้างอิง API](../reference/API_REFERENCE.md) — เอกสาร API ฉบับเต็ม > - [การกำหนดค่าสภาพแวดล้อม](../reference/ENVIRONMENT.md) — ตัวแปรสภาพแวดล้อมทั้งหมด