Skip to content

रिवर्स प्रॉक्सी (URL पथ उपसर्ग)

Potato को रिवर्स प्रॉक्सी के पीछे किसी उप-पथ के अंतर्गत परोसें, जैसे https://host/app1/. एक परिनियोजन URL उपसर्ग कॉन्फ़िगर करें ताकि स्थैतिक संसाधन, एनोटेशन क्रियाएँ और लाइव स्ट्रीम माउंट पथ के अंतर्गत सही ढंग से हल हों।

Potato किसी रिवर्स प्रॉक्सी के पीछे https://host/app1/ जैसे URL उप-पथ के अंतर्गत चल सकता है, जो तब आम है जब कई आंतरिक सर्वर एक ही सार्वजनिक HTTPS एंडपॉइंट साझा करते हैं:

text
https://host/app1/  ->  http://127.0.0.1:8000/
https://host/app2/  ->  http://127.0.0.1:8001/

एनोटेशन UI रूट-सापेक्ष URL (/static/..., /updateinstance, /annotate, /media/...) के माध्यम से स्थैतिक संसाधन लोड करता है और क्रियाएँ करता है। जब Potato को /app1 के अंतर्गत माउंट किया जाता है, तो अन्यथा वे URL सार्वजनिक रूट के सापेक्ष हल होते, जो CSS और JS पर 404, एक छिपे हुए इंटरफ़ेस, या «annotations not saved» के साथ विफल होते ऑटोसेव के रूप में सामने आता है। एक परिनियोजन उपसर्ग प्रति-साइट nginx जुगाड़ के बिना इसे ठीक करता है।

यह कैसे काम करता है

नीचे दिए गए दोनों विकल्प WSGI SCRIPT_NAME सेट करते हैं, जिसे Potato सर्वर-रेंडर किए गए url_for(...) आउटपुट के लिए और ब्राउज़र को window.config.url_prefix के रूप में उजागर किए गए क्लाइंट-साइड उपसर्ग के लिए सत्य के एकमात्र स्रोत के रूप में पढ़ता है। वह उपसर्ग fetch(), sendBeacon(), EventSource और रूट-सापेक्ष href/action/src विशेषताओं को लपेटता है। जब कोई उपसर्ग सेट नहीं होता, तो SCRIPT_NAME खाली रहता है और कुछ नहीं बदलता, इसलिए सामान्य potato start चलाने पर यह कोई प्रभाव नहीं डालता।

विकल्प A — POTATO_PROXY_FIX (प्रॉक्सी एक अग्रेषित हेडर भेजता है)

इसका उपयोग तब करें जब आप प्रॉक्सी को नियंत्रित करते हैं और वह अग्रेषित हेडर भेज सकता है। Potato, Werkzeug के ProxyFix को सक्षम करता है, जो प्रति अनुरोध X-Forwarded-Prefix (और -Proto/-Host/-For) पढ़ता है।

bash
export POTATO_PROXY_FIX=1
potato start config.yaml -p 8000

nginx, जो उपसर्ग हटाता है और उसे एक हेडर के रूप में अग्रेषित करता है:

nginx
location /app1/ {
    proxy_pass         http://127.0.0.1:8000/;   # trailing slash strips /app1/
    proxy_set_header   Host              $host;
    proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   X-Forwarded-Prefix /app1;
}

ProxyFix अग्रेषित हेडर पर भरोसा करता है। POTATO_PROXY_FIX को केवल तभी सक्षम करें जब ऐप विशेष रूप से विश्वसनीय प्रॉक्सी के माध्यम से ही पहुँच योग्य हो। यदि आंतरिक पोर्ट सीधे भी पहुँच योग्य है, तो कोई क्लाइंट X-Forwarded-Prefix या -Host को धोखे से बना सकता है और उत्पन्न URL को दूषित कर सकता है।

विकल्प B — POTATO_URL_PREFIX (प्रॉक्सी कॉन्फ़िगरेशन बदला नहीं जा सकता)

इसका उपयोग तब करें जब आप अग्रेषित हेडर नहीं जोड़ सकते लेकिन सार्वजनिक माउंट पथ जानते हैं। Potato स्वयं उपसर्ग को SCRIPT_NAME में इंजेक्ट करता है।

bash
export POTATO_URL_PREFIX=/app1
potato start config.yaml -p 8000

प्रॉक्सी को फिर भी अग्रेषण से पहले उपसर्ग हटाना होगा, ताकि Flask को /static/styles.css जैसे बिना उपसर्ग वाले पथ मिलें:

nginx
location /app1/ {
    proxy_pass       http://127.0.0.1:8000/;     # trailing slash strips /app1/
    proxy_set_header Host $host;
}

यदि दोनों चर सेट किए गए हैं, तो प्रति-अनुरोध अग्रेषित उपसर्ग जीतता है और POTATO_URL_PREFIX फ़ॉलबैक होता है।

लाइव स्ट्रीमिंग (Server-Sent Events)

लाइव-एजेंट और लाइव-कोडिंग व्यूअर SSE का उपयोग करते हैं। URL उपसर्ग स्वतः लागू होता है, लेकिन SSE को यह भी आवश्यक है कि प्रॉक्सी स्ट्रीम स्थान पर बफ़रिंग अक्षम करे, अन्यथा इवेंट रोक लिए जाते हैं:

nginx
location /app1/api/ {
    proxy_pass            http://127.0.0.1:8000/api/;
    proxy_set_header      Host $host;
    proxy_buffering       off;
    proxy_read_timeout    3600s;
}

सत्यापन

  1. https://host/app1/ लोड करें और पुष्टि करें कि CSS और JS बिना किसी 404 के लोड होते हैं।
  2. एक एनोटेशन करें और पुष्टि करें कि वह स्वतः सहेजी जाती है।
  3. Next/Previous पर नेविगेट करें और पुष्टि करें कि मीडिया और डेटा रेंडर होते हैं।
  4. यदि आप लाइव एजेंट मूल्यांकन का उपयोग कर रहे हैं, तो पुष्टि करें कि स्ट्रीम जुड़ती है और अपडेट होती है।

टिप्पणियाँ और सीमाएँ

  • प्रदर्शित एनोटेशन सामग्री के भीतर रूट-सापेक्ष लिंक भी उपसर्गित किए जाते हैं। जो सामग्री लेखक सार्वजनिक रूट की ओर इंगित करना चाहते हैं, उन्हें निरपेक्ष URL का उपयोग करना चाहिए।
  • pip से स्थापित परिनियोजन पैकेज किए गए स्थैतिक संसाधनों पर निर्भर करते हैं; सुनिश्चित करें कि आपके बिल्ड में नेस्टेड static/ निर्देशिकाएँ शामिल हैं।

संबंधित

कार्यान्वयन विवरण के लिए, स्रोत दस्तावेज़ देखें।