🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇧🇦 bs · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
עקפו חסימות גאוגרפיות, הגנו על זהותכם ונתבו תעבורת בינה מלאכותית דרך כל שרת proxy — ללא מורכבות בהגדרות.
OmniRoute כוללת מערכת מלאה לניהול שרתי proxy, המאפשרת לנתב תעבורה אל ספקי בינה מלאכותית חיצוניים דרך שרתי proxy מסוג HTTP, HTTPS או SOCKS5. בין אם אתם נמצאים באזור חסום, זקוקים לתחלופת כתובות IP או מעוניינים בטביעת אצבע חשאית — מדריך זה מכסה הכול.
- מדוע להשתמש בשרתי Proxy?
- סקירת הארכיטקטורה
- מערכת Proxy בעלת 4 רמות
- מרשם שרתי Proxy (CRUD)
- שוק שרתי ה-Proxy החינמיים של 1proxy
- תחלופת שרתי Proxy
- מניעת זיהוי ופעולה חשאית
- מצבי Proxy לתעבורה יוצאת
- ממשק לוח הבקרה
- תיעוד ה-API
- משתני סביבה
- פתרון בעיות
ספקי בינה מלאכותית רבים מגבילים גישה לפי אזור גאוגרפי. מפתחים ברוסיה, סין, איראן, קובה, טורקיה ובמדינות אחרות נתקלים בשגיאות כגון:
unsupported_country_region_territory
גם מחוץ לאזורים חסומים, שרתי proxy שימושיים עבור:
| תרחיש שימוש | תיאור |
|---|---|
| עקיפת חסימה גאוגרפית | גישה אל OpenAI, Anthropic, Codex ו-Copilot ממדינות חסומות |
| תחלופת כתובות IP | פיזור בקשות בין כתובות IP מרובות כדי להימנע מהגבלת קצב |
| פרטיות | הסתרת כתובת ה-IP האמיתית שלכם מספקים חיצוניים |
| תאימות | ניתוב תעבורה דרך תחומי שיפוט מסוימים |
| בדיקות | הדמיית בקשות מאזורים שונים |
┌───────────────────────────────────────────────────────────────┐
│ שרת OmniRoute │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ מרשם │ │ מנתב │ │ אחזור │ │
│ │ שרתי Proxy │───▶│ שרתי Proxy │───▶│ (undici) │ │
│ │ (SQLite) │ │ (עם מטמון) │ │ │ │
│ └─────────────┘ └──────────────┘ └────────┬─────────┘ │
│ ▲ │ │
│ │ ▼ │
│ ┌──────┴──────┐ ┌──────────────────┐ │
│ │ סנכרון │ │ API של ספק │ │
│ │ 1proxy │ │ חיצוני │ │
│ │ (מאגר חינמי)│ │ │ │
│ └─────────────┘ └──────────────────┘ │
└───────────────────────────────────────────────────────────────┘
| רכיב | קובץ | תפקיד |
|---|---|---|
| מרשם שרתי Proxy | src/lib/db/proxies.ts |
פעולות CRUD עבור רשומות proxy והקצאות תחום |
| מנתב שרתי Proxy | open-sse/utils/proxyDispatcher.ts |
יצירת מנתבי ProxyAgent/SOCKS של undici עם מטמון |
| אחזור דרך Proxy | open-sse/utils/proxyFetch.ts |
עטיפת fetch() עם הזרקת מנתב proxy |
| נתיב הגדרות | src/app/api/settings/proxy/route.ts |
API מיושן להגדרת proxy (GET/PUT/DELETE) |
| נתיב ניהול | src/app/api/v1/management/proxies/route.ts |
API לפעולות CRUD במרשם (GET/POST/PATCH/DELETE) |
| מסד הנתונים של 1proxy | src/lib/db/oneproxy.ts |
אחסון מתמשך עבור שוק שרתי ה-proxy החינמיים |
OmniRoute תומך בהגדרת Proxy בארבעה תחומים בלתי תלויים, הנבדקים לפי סדר עדיפות:
סדר פתרון לפי עדיפות (מהגבוהה → לנמוכה):
1. 🔵 Proxy לחשבון/חיבור → לכל מפתח API / חיבור OAuth
2. 🟡 Proxy לספק → לכל ספק (למשל, כל התעבורה של OpenAI)
3. 🟠 Proxy לשילוב → לכל תצורת שילוב/ניתוב
4. 🟢 Proxy גלובלי → כל התעבורה, כל הספקים
כאשר OmniRoute שולח בקשה לספק במעלה הזרם, הוא קורא לפונקציה resolveProxyForConnectionFromRegistry(), שבודקת כל רמה לפי הסדר:
- רמת החשבון — האם הוקצה Proxy למזהה החיבור הספציפי הזה?
- רמת הספק — האם הוקצה Proxy לספק הזה (למשל,
openai)? - הרמה הגלובלית — האם מוגדר Proxy גלובלי?
- ללא Proxy — חיבור ישיר לספק.
ההתאמה הראשונה היא הקובעת. פירוש הדבר שניתן להגדיר Proxy גלובלי כברירת מחדל, אך לעקוף אותו עבור ספקים או חיבורים מסוימים.
| סוג תעבורה | מועברת דרך Proxy? | הערות |
|---|---|---|
| השלמות צ'אט | ✅ | כל הבקשות אל /v1/chat/completions |
| הטמעות | ✅ | /v1/embeddings |
| יצירת תמונות | ✅ | /v1/images/generations |
| שמע (TTS/STT) | ✅ | /v1/audio/* |
| החלפת אסימון OAuth | ✅ | פותר את unsupported_country_region_territory |
| בדיקות חיבור | ✅ | הלחצן "בדיקת חיבור" משתמש ב-Proxy |
| רענון אסימון | ✅ | חידוש OAuth ברקע |
| סנכרון מודלים | ✅ | הצגת מודלים וגילוים |
מרשם ה-Proxy הוא טבלת SQLite (proxy_registry) המאחסנת את כל שרתי ה-Proxy שלכם. לכל Proxy יש:
| שדה | סוג | תיאור |
|---|---|---|
id |
UUID | מזהה ייחודי |
name |
מחרוזת | תווית קריאה לבני אדם |
type |
מחרוזת | פרוטוקול: http, https, socks5 |
host |
מחרוזת | שם המארח או כתובת ה-IP של ה-Proxy |
port |
מספר שלם | מספר היציאה |
username |
מחרוזת | שם משתמש לאימות (מוצפן במנוחה) |
password |
מחרוזת | סיסמת אימות (מוצפנת במנוחה) |
region |
מחרוזת | תווית אזור גאוגרפי |
notes |
מחרוזת | הערות בטקסט חופשי |
status |
מחרוזת | active או inactive |
source |
מחרוזת | manual או oneproxy |
דרך לוח הבקרה:
- עברו אל הגדרות → Proxy
- לחצו על הוספת Proxy
- מלאו את הסוג, המארח, היציאה ופרטי האימות האופציונליים
- שמרו
דרך ה-API:
curl -X POST http://localhost:20128/api/v1/management/proxies \
-H "Content-Type: application/json" \
-d '{
"name": "US Proxy",
"type": "http",
"host": "proxy.example.com",
"port": 8080,
"username": "user",
"password": "pass",
"region": "US"
}'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תשאיר את הערכים המאוחסנים ללא שינוי.
# נכשל אם ה-Proxy מוקצה לתחום כלשהו
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"curl "http://localhost:20128/api/v1/management/proxies?limit=50&offset=0"# הקצאה לתחום הגלובלי
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}}'בדקו באיזה Proxy ייעשה שימוש עבור חיבור נתון:
curl "http://localhost:20128/api/settings/proxy?resolve=connection-uuid"מחזיר את ה-Proxy שנבחר יחד עם הרמה שלו (account, provider או global) והמקור.
הקצו Proxy אחד למספר ספקים או חיבורים בבת אחת:
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"
}'שרתי Proxy נכללים במערכת גיבוי/שחזור. בעת ייצוא תצורת OmniRoute שלכם:
- עברו אל לוח הבקרה → הגדרות → גיבוי
- לחצו על ייצוא — מרשם ה-Proxy וההקצאות נכללים
- כדי לשחזר, לחצו על ייבוא והעלו את קובץ הגיבוי
מרשם ה-Proxy תומך גם ב-upsert לפי host+port — אם מייבאים Proxy שכבר קיים (אותם מארח ויציאה), הוא מתעדכן במקום ליצור כפילות.
אם הגדרתם שרתי proxy בגרסה ישנה יותר (לפני ה־registry), OmniRoute מעביר אותם אוטומטית:
מאגר key_value מדור קודם → proxy_registry + proxy_assignments
פעולה זו מתבצעת פעם אחת, בהפעלה הראשונה לאחר השדרוג. השתמשו ב־migrateLegacyProxyConfigToRegistry({ force: true }) כדי להריץ אותה מחדש.
OmniRoute משתלב עם הפלטפורמה הקהילתית 1proxy כדי לספק גישה למאות שרתי פרוקסי חינמיים ומאומתים מרחבי העולם. פתרון זה מושלם למשתמשים שאין להם תשתית פרוקסי משלהם.
┌─────────────┐ סנכרון ┌─────────────────┐ החלפה ┌──────────┐
│ 1proxy API │ ────────────▶ │ proxy_registry │ ────────────▶ │ ספק │
│ (חיצוני) │ עד 500 שרתי │ source=oneproxy │ לפי איכות │ API │
└─────────────┘ פרוקסי └─────────────────┘ └──────────┘
- סנכרון — OmniRoute מושך שרתי פרוקסי מאומתים מה-API של 1proxy
- אחסון — שרתי הפרוקסי נשמרים באותה טבלת
proxy_registryעםsource = 'oneproxy' - סינון — סינון לפי פרוטוקול, מדינה וציון איכות
- החלפה — בחירת שרת הפרוקסי הטוב ביותר באמצעות אסטרטגיות איכות, בחירה אקראית או בחירה סדרתית
- הפחתה אוטומטית — ציון האיכות של שרתי פרוקסי שנכשלו מופחת; מתחת לסף → הם מסומנים כלא פעילים
דרך לוח הבקרה:
- עברו לכרטיסייה הגדרות ← 1proxy
- לחצו על "סנכרן עכשיו"
- צפו בנתונים הסטטיסטיים: סך כל שרתי הפרוקסי, מספר הפעילים, איכות ממוצעת ופילוח לפי מדינה
דרך ה-API:
# הפעלת סנכרון
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 }# סינון לפי פרוטוקול
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 - שרתי פרוקסי לא פעילים אינם נכללים בהחלפה
# החלפה לפי איכות (שרת הפרוקסי הטוב ביותר ראשון) — ברירת המחדל
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
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 לא רק מנתב תעבורה דרך פרוקסי — הוא גורם לתעבורה להיראות לגיטימית:
משתמש ב-wreq-js כדי ליצור טביעות אצבע של TLS הדומות לאלו של דפדפן, ובכך עוקף מערכות לזיהוי בוטים המסמנות לחיצות יד של TLS שאינן מגיעות מדפדפן.
האפשרות הפעלת טביעת אצבע של CLI (הגדרות → אבטחה) מסדרת מחדש כותרות HTTP ושדות בגוף JSON כדי להתאים במדויק לחתימה של קובצי CLI בינאריים מקוריים (Claude Code, Codex וכו'). מנגנון זה פועל בנוסף לפרוקסי:
ה-IP שלך (חסום) → IP של הפרוקסי (ארה"ב) → API של הספק
+ זיוף TLS
+ טביעת אצבע של CLI
כך מתקבלים בו-זמנית גם הסתרת IP וגם אותנטיות של הבקשה.
תגים מקודדי-צבע בלוח הבקרה מציגים איזו רמת פרוקסי פעילה:
| תג | רמה | משמעות |
|---|---|---|
| 🟢 | גלובלית | כל התעבורה עוברת דרך פרוקסי זה |
| 🟡 | ספק | רק התעבורה של ספק זה עוברת דרך פרוקסי |
| 🔵 | חיבור | מפתח/חשבון מסוים זה משתמש בפרוקסי זה |
התג מציג גם את כתובת ה-IP שאותרה עבור הפרוקסי לצורך אימות.
עבור ספקים המשתמשים בתבנית CLIProxyAPI, OmniRoute תומך בשלושה מצבי פרוקסי במעלה הזרם:
| מצב | תיאור |
|---|---|
native |
OmniRoute מטפל ישירות בניתוב דרך הפרוקסי (ברירת המחדל) |
cliproxyapi |
מאציל את הטיפול למופע CLIProxyAPI חיצוני |
fallback |
מנסה תחילה מצב מקורי, ואם הוא נכשל עובר ל-CLIProxyAPI |
הגדרה לכל ספק:
curl -X PUT "http://localhost:20128/api/upstream-proxy/openai" \
-H "Content-Type: application/json" \
-d '{"mode": "native", "enabled": true}'- הגדרת פרוקסי גלובלי (הגדרה חד-פעמית עבור כל התעבורה)
- דריסות פרוקסי לכל ספק
- הקצאות פרוקסי לכל חיבור
- בדיקת חיבור דרך הפרוקסי שהוגדר
- תגים מקודדי-צבע המציגים את רמת הפרוקסי הפעילה
- לחצן סנכרון עכשיו לקבלת שרתי פרוקסי חינמיים
- כרטיסי סטטיסטיקה: סה"כ, פעילים, איכות ממוצעת, סנכרון אחרון
- מסננים: פרוטוקול, קוד מדינה, איכות מינימלית
- טבלת פרוקסי עם מארח, פרוטוקול, מדינה, ציון איכות, זמן השהיה, אנונימיות וגישה ל-Google
- חלונית מצב סנכרון עם מעקב אחר הצלחות/כישלונות ומספר הכישלונות הרצופים
- ניקוי הכול להסרת כל רשומות 1proxy
| שיטה | נקודת קצה | תיאור |
|---|---|---|
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 |
הסרת פרוקסי ברמה זו |
| שיטה | נקודת קצה | תיאור |
|---|---|---|
GET |
/api/v1/management/proxies |
הצגת כל שרתי הפרוקסי |
GET |
/api/v1/management/proxies?id=uuid |
קבלת פרוקסי לפי מזהה |
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 |
נתוני תקינות של הפרוקסי |
למידע על חשיפת מופע OmniRoute שלך לאינטרנט הציבורי (Cloudflare/ngrok/Tailscale), במקום ניתוב תעבורה יוצאת דרך פרוקסי, עיין בקובץ TUNNELS_GUIDE.md. REST API של המנהרה נמצא תחת /api/tunnels/{cloudflared,ngrok,tailscale}/* והוא בלתי תלוי בשרשרת הפרוקסי היוצאת המתועדת לעיל.
| שיטה | נקודת קצה | תיאור |
|---|---|---|
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 |
ניקוי הכול |
| שיטה | נקודת קצה | תיאור |
|---|---|---|
GET |
/api/upstream-proxy/:providerId |
קבלת תצורת הפרוקסי במעלה הזרם |
PUT |
/api/upstream-proxy/:providerId |
הגדרת מצב הפרוקסי במעלה הזרם |
DELETE |
/api/upstream-proxy/:providerId |
הסרת תצורת הפרוקסי במעלה הזרם |
| משתנה | ברירת מחדל | תיאור |
|---|---|---|
ENABLE_SOCKS5_PROXY |
true |
הפעלת תמיכה בפרוקסי SOCKS5 (ברירת המחדל היא true ב-.env.example) |
הגדירו ENABLE_SOCKS5_PROXY=true בקובץ .env שלכם והפעילו מחדש.
זוהי תופעה רגילה בפרוקסי זולים שמנתקים חיבורים לא פעילים. OmniRoute כבר מטפל בכך באמצעות:
- השבתת keep-alive בחיבורי פרוקסי (
keepAliveTimeout: 1) - השבתת pipelining (
pipelining: 0) - שמירת dispatchers במטמון כדי להימנע מלחיצות יד חוזרות
אם הבעיה נמשכת, נסו פרוקסי אחר או השתמשו בתכונת הרוטציה של 1proxy.
ודאו שהפרוקסי מוגדר לפני התחלת תהליך OAuth. OmniRoute מנתב את החלפת האסימונים של OAuth דרך הפרוקסי המוגדר. תחילה הגדירו פרוקסי גלובלי או פרוקסי ברמת הספק, ולאחר מכן התחברו.
בדקו את סדר הרזולוציה:
- אמתו באמצעות
GET /api/settings/proxy?resolve=your-connection-id - בדקו אם
statusשל הפרוקסי הואactive(ולאinactive) - ודאו שטווח ההקצאה של הפרוקסי תואם לחיבור שלכם
בדקו את מצב הסנכרון:
curl "http://localhost:20128/api/settings/oneproxy?action=status"אם consecutiveFailures >= 5, מפסק המעגל הופעל. הפעילו מחדש את השרת כדי לאפס אותו, או המתינו לאיפוס ידני.
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, -- שקוף/אנונימי/עילית
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
);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, -- מזהה ספק, מזהה חיבור או מזהה שילוב
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
UNIQUE(scope, scope_id)
);מנגנון הכשל המהיר של פרוקסי של 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 |
משך שמירת תוצאת התקינות במטמון |
ערכים מומלצים:
| תרחיש | זמן קצוב לכשל מהיר | TTL של המטמון | נימוק |
|---|---|---|---|
| שער API בעל תפוקה גבוהה | 1500ms | 60000ms | כשל מהיר אגרסיבי ומטמון ארוך יותר כדי לצמצם בדיקות |
| צמתים מבוזרים גאוגרפית | 3000ms | 15000ms | רשתות איטיות זקוקות ליותר זמן; מטמון קצר יותר למעבר מהיר בעת כשל |
| פיתוח / בדיקות | 1000ms | 10000ms | איטרציה מהירה בפרוקסי מקומיים |
| הסוואה / מניעת זיהוי | 2500ms | 45000ms | הימנעות מבדיקות מהירות שעלולות להפעיל מגבלות קצב |
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, והבקשה הבאה תפעיל בדיקה חדשה.
בדיקת התקינות משתמשת בברירות מחדל הגיוניות בהתאם לסכמת ה-URL:
| סכמה | יציאת ברירת מחדל |
|---|---|
http:// |
8080 |
https:// |
443 |
socks5:// / socks5h:// |
1080 |
יציאות מותאמות אישית ב-URL (http://host:9999) תמיד מקבלות עדיפות על פני ברירת המחדל של הסכמה.
OmniRoute עוקב אחר השימוש בכל Proxy כדי לסייע למפעילים לאבחן דפוסי ניתוב, עליות חדות בהשהיה וכשלים חוזרים.
עבור כל בקשה העוברת דרך Proxy מוגדר, OmniRoute מתעד:
| מדד | תיאור |
|---|---|
proxy_url |
כתובת ה-URL המלאה של ה-Proxy (פרטי האימות מוסתרים) |
provider |
מזהה הספק במעלה הזרם (openai, anthropic וכדומה) |
latency_ms |
זמן ההלוך ושוב הכולל, לרבות לחיצת היד עם ה-Proxy |
connect_ms |
זמן התחברות TCP בלבד |
status |
קוד מצב HTTP ממעלה הזרם |
error |
מחלקת השגיאה אם הבקשה נכשלה |
timestamp |
ISO 8601 UTC |
# אירועי Proxy אחרונים
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— אחזור יומני ProxyDELETE /api/usage/proxy-logs— מחיקת כל יומני ה-Proxy
במידת הצורך, ניתן לשלוף סטטיסטיקות מצטברות ישירות מהטבלה proxy_logs באמצעות SQL. ממשק לוח המחוונים עשוי להציע תצוגות מצטברות.
זיהוי Proxy לא יציב (עובר לסירוגין בין הצלחה לכישלון):
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;איתור שרתי Proxy איטיים (השהיית p95 גבוהה מ-2 שניות):
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;כאשר מספר שרתי Proxy משויכים לטווח מסוים, OmniRoute משתמש באסטרטגיית רוטציה כדי לבחור באיזה מהם להשתמש עבור כל בקשה. האסטרטגיה מוגדרת ברמת הטווח (גלובלית, לפי ספק, לפי חשבון או לפי שילוב).
| אסטרטגיה | מתי להשתמש | שיקולים |
|---|---|---|
quality (ברירת מחדל) |
סביבת ייצור עם שרתי Proxy באיכויות שונות | מעדיפה שרתי Proxy בעלי דירוג גבוה; עלולה להזניח שרתים בעלי דירוג נמוך |
random |
חלוקת עומס, פרטיות | חלוקה אחידה; מתעלמת ממדדי איכות |
sequential |
ניפוי שגיאות, בדיקות דטרמיניסטיות | עוברת בין שרתי ה-Proxy לפי הסדר; קלה להבנה |
האם יש לכם ציוני איכות עבור שרתי ה-Proxy?
│
┌───────────┴───────────┐
│ │
כן לא
│ │
האם כל שרתי ה-Proxy │
דומים בקירוב │
באיכותם? │
│ │
┌────┴────┐ │
│ │ │
כן לא השתמשו ב-
│ │ `random`
│ │ (חלוקה אחידה
│ │ בונה נתוני איכות
│ │ לאורך זמן)
│ │
│ השתמשו ב-`quality`
│ (הטובה ביותר
│ לאיכויות שונות)
│
השתמשו ב-`random`
(פזרו את העומס
באופן אחיד)
מאגר השוק של 1proxy כבר מפחית אוטומטית את דירוגם של שרתי Proxy שכשלו (ראו
ציוני איכות Proxy). עבור
שרתי Proxy שאתם הוספתם למאגר, מתזמן בדיקות התקינות שפועל ברקע
(src/lib/proxyHealth/scheduler.ts) מספק את אותה התנהגות של "החרגה אוטומטית של
חבר שאינו פעיל מהשרשרת", מבלי למחוק דבר:
# .env — השבתה זמנית של Proxy לאחר 3 בדיקות רצופות שנכשלו, והפעלה מחדש
# באופן אוטומטי ברגע שהוא מתחיל להשיב שוב לבדיקות.
PROXY_AUTO_DISABLE=true
PROXY_AUTO_REMOVE_AFTER=3כך הדבר משתלב בשרשרת מרובת שרתי Proxy:
- המתזמן בודק כל Proxy רשום בכל
PROXY_HEALTH_INTERVAL_MS(ברירת המחדל היא 10 דקות; המינימום הוא דקה אחת). - לאחר
PROXY_AUTO_REMOVE_AFTERכשלים חד-משמעיים רצופים (כשל חיבור אמיתי — פסק זמן או שגיאת 5xx של יעד הבדיקה עצמו לעולם אינם נספרים, ראו בדיקת תקינות Proxy), ה-statusשל ה-Proxy מוגדר ל-dead. deadהוא אחד הסטטוסים שמסנן הסטטוסים הפעילים, המשמש לפתרון מאגר/רוטציה, מחריג; לכן הרוטציה של תחום (round-robin / random / sticky / latency — ראו עץ החלטות לאסטרטגיית רוטציה) מפסיקה מיד להקצות את אותו Proxy לבקשות חדשות. שרתי Proxy אחרים במאגר אינם מושפעים, והמאגר כולו לעולם אינו חוזר בשקט לחיבור ישיר — ראו את מנגנון ברירת המחדל הסגורה של מערכת ה-Proxy בעלת 4 הרמות.- המתזמן ממשיך לבדוק שרתי Proxy במצב
deadבאותו מרווח זמן. הבדיקה המוצלחת הבאה משנה את ה-statusבחזרה ל-active, והוא חוזר לרוטציה — אין צורך להוסיף אותו מחדש באופן ידני.
זוהי במכוון אפשרות אופציונלית ולא הרסנית: כברירת מחדל, המתזמן רק
סופר ומתעד כשלים ביומן (ראו מדיניות C בקובץ decision.ts), ו-PROXY_AUTO_DISABLE
לעולם אינו מוחק רשומה — לשם כך נועד הדגל הנפרד והאגרסיבי יותר
PROXY_AUTO_REMOVE. אם שניהם מוגדרים כ-true, ל-PROXY_AUTO_REMOVE
יש קדימות (אין טעם להשבית זמנית Proxy שעומד להימחק). ראו את מסמך העזר
תצורת סביבה לקבלת רשימת המשתנים המלאה.
📖 תיעוד קשור:
- מדריך למשתמש — הגדרה ותצורה כלליות
- מסמך עזר ל-API — תיעוד API מלא
- תצורת סביבה — כל משתני הסביבה