रिमोट एक्सेस: लॉगिन और IP अलाउलिस्ट
इस गाइड में बताया गया है कि Marinara Engine को किसी दूसरे डिवाइस से कैसे खोलें, जैसे अपने फ़ोन, लैपटॉप या किसी Docker कंटेनर से। इसमें मुख्य विकल्प के रूप में लॉगिन शामिल है। साथ ही IP अलाउलिस्ट, लॉगिन प्रॉक्सी, HTTPS, Admin Access (एडमिन एक्सेस) और "save blocked" वाले CSRF संदेश के बारे में भी बताया गया है। यहाँ की लगभग हर सेटिंग सर्वर की .env फ़ाइल में रहती है, ऐप में नहीं।
इस गाइड में बार-बार आने वाले कुछ शब्द:
.envफ़ाइल: Marinara Engine के फ़ोल्डर मेंpackage.jsonके बगल में रखी सादी टेक्स्ट वाली सेटिंग्स फ़ाइल।- लूपबैक: वही मशीन जिस पर सर्वर असल में चल रहा है। इसका पता
127.0.0.1याlocalhostहोता है। - रिमोट एक्सेस: Marinara को ऐसे किसी भी डिवाइस से खोलना जो सर्वर चलाने वाली मशीन नहीं है।
Tailscale से कहीं से भी कनेक्ट करना
Tailscale आपके अपने डिवाइस के लिए एक प्राइवेट नेटवर्क है। इससे आप Marinara को अपने फ़ोन या लैपटॉप पर खोल सकते हैं, चाहे आप घर पर हों या बाहर, वह भी अपने राउटर पर पोर्ट खोले बिना या Marinara को सार्वजनिक इंटरनेट पर डाले बिना। जो डिवाइस सीधे Tailscale से जुड़ते हैं, उन पर Marinara भरोसा करता है, इसलिए आपको लॉगिन सेट करने की ज़रूरत नहीं।
- Tailscale को उस कंप्यूटर पर इंस्टॉल करें जिस पर Marinara चलता है, और अपने दूसरे डिवाइस पर भी। इसे tailscale.com/download से लें।
- दोनों डिवाइस पर एक ही अकाउंट से Tailscale में साइन इन करें।
- Marinara को
start.sh,start.bat,start-termux.shया Windows इंस्टॉलर से शुरू करें। ये दूसरे डिवाइस को कनेक्ट होने देते हैं। अगर आप इसकी जगहpnpm startचलाते हैं, तो पहले अपनी.envफ़ाइल मेंHOST=0.0.0.0जोड़ें (देखें .env फ़ाइल कहाँ रहती है)। - Marinara वाले कंप्यूटर का Tailscale पता खोजें। उस पर Tailscale ऐप खोलें, या
tailscale ip -4चलाएँ। पता100.से शुरू होता है, जैसे100.101.102.103। - अपने दूसरे डिवाइस पर Tailscale चालू करें और ब्राउज़र में
http://100.101.102.103:7860खोलें। अपना पता इस्तेमाल करें, और अगर आपनेPORTबदला है तो अपनाPORTभी। Marinara बिना साइन-इन पेज के खुल जाता है।
अगर पेज लोड नहीं होता, तो जाँच लें कि दोनों डिवाइस पर Tailscale चालू है और सर्वर HOST=0.0.0.0 पर सुन रहा है।
Note: यह Docker इंस्टॉल पर काम नहीं करता। Tailscale ट्रैफ़िक Docker गेटवे के ज़रिए कंटेनर तक पहुँचता है, इसलिए Marinara यह नहीं देख पाता कि वह Tailscale से आया है। पहले लॉगिन सेट करें (विकल्प 1), फिर पोर्ट को 127.0.0.1 से आगे पब्लिश करें।
बैकअप, इंपोर्ट, अपडेट और दूसरे जोखिम वाले कामों के लिए रिमोट डिवाइस से अब भी एडमिन सीक्रेट चाहिए। देखें Admin Access और खास अधिकार वाले काम।
Marinara डिफ़ॉल्ट रूप से क्या ब्लॉक करता है
आपके डेटा की सुरक्षा के लिए नया Marinara इंस्टॉल दूसरे डिवाइस के कनेक्शन तब तक मना करता है, जब तक एक्सेस कंट्रोल सेट न हो जाए। डिफ़ॉल्ट रूप से सिर्फ़ तीन तरह के क्लाइंट भरोसेमंद माने जाते हैं:
- लूपबैक (
127.0.0.1या::1), यानी वही मशीन जिस पर सर्वर चल रहा है। उसी मशीन पर चल रही रिवर्स प्रॉक्सी या टनल से आगे भेजे गए विज़िटर इसमें नहीं गिने जाते; देखें उसी कंप्यूटर पर रिवर्स प्रॉक्सी और टनल। - आपके tailnet के Tailscale डिवाइस। Tailscale एक प्राइवेट नेटवर्क टूल है और इसके पते
100.64.0.0/10रेंज में आते हैं। - उसी होस्ट पर चल रहे Docker क्लाइंट। Marinara सामान्य
172.16.0.0/12ब्रिज रेंज और कंटेनर का ठीक वही डिफ़ॉल्ट गेटवे पहचानता है, जिससे Docker Desktop और कस्टम एड्रेस पूल भी कवर हो जाते हैं।
उसी Wi-Fi पर लगा आपका फ़ोन हो या सार्वजनिक इंटरनेट से आने वाला कोई क्लाइंट, बाकी सब कुछ तब तक ब्लॉक रहता है जब तक आप लॉगिन सेट न करें। ब्लॉक किए गए डिवाइस पर ब्राउज़र में Marinara खोलने पर एक डार्क सेटअप पेज दिखता है। उसका शीर्षक होता है This Marinara Engine install needs a login before remote devices can connect. उस पेज पर सर्वर लॉग वाले एक बार के सेटअप कोड का फ़ॉर्म है, ताकि आप उसी डिवाइस से लॉगिन सेट कर सकें।
अगर आप कुछ नहीं करते और कभी पासवर्ड सेट नहीं करते, तो Marinara उन्हीं तीन भरोसेमंद स्रोतों तक सीमित रहता है। यही सुरक्षित डिफ़ॉल्ट है।
.env फ़ाइल कहाँ रहती है
सारी एक्सेस सेटिंग्स प्रोजेक्ट रूट में package.json के बगल वाली .env फ़ाइल में रहती हैं। अगर यह फ़ाइल अभी नहीं है, तो उदाहरण वाली फ़ाइल कॉपी करें:
cp .env.example .env.env को किसी भी टेक्स्ट एडिटर में खोलें। Basic Auth, IP अलाउलिस्ट, एडमिन सीक्रेट और CSRF ऑरिजिन समेत ज़्यादातर एक्सेस सेटिंग्स कुछ ही सेकंड में लागू हो जाती हैं, रीस्टार्ट की ज़रूरत नहीं। कुछ निचले स्तर की सेटिंग्स के लिए रीस्टार्ट अब भी ज़रूरी है, जैसे PORT, HOST और HTTPS सर्टिफ़िकेट के पथ।
हो सकता है दूसरे डिवाइस सर्वर तक पहुँच ही न पाएँ और 403 की जगह टाइमआउट मिले। ऐसे में शायद सर्वर सिर्फ़ लोकल मशीन पर ही सुन रहा हो। सर्वर को हर नेटवर्क इंटरफ़ेस पर सुनने के लिए सेट करें:
HOST=0.0.0.0शेल लॉन्चर (start.bat, start.sh) आपके लिए HOST=0.0.0.0 सेट कर देते हैं। सीधे pnpm start चलाने पर ऐसा नहीं होता।
आप Marinara को जिस तरह शुरू करते हैं, उसके हिसाब से डिफ़ॉल्ट बाइंड एड्रेस:
| शुरू करने का तरीका | HOST का डिफ़ॉल्ट |
pnpm start, start-local.bat | 127.0.0.1 |
start.sh, start.bat, Windows इंस्टॉलर, start-termux.sh | 0.0.0.0 |
| Docker इमेज | कंटेनर के अंदर 0.0.0.0 |
docker-compose.yml | पोर्ट सिर्फ़ 127.0.0.1 पर पब्लिश करता है |
कौन सा विकल्प चुनें
इन्हें क्रम से पढ़ें और जहाँ आपकी बात मिल जाए, वहीं रुक जाएँ।
- आप सिर्फ़ सीधे Tailscale से जुड़ते हैं, या सिर्फ़ उसी होस्ट पर चल रहे Docker कंटेनर से।
pnpm startके साथ सीधे Tailscale क्लाइंट लॉगिन छोड़ देते हैं; उन्हें सर्वर तक पहुँचने देने के लिएHOST=0.0.0.0सेट करें। डिफ़ॉल्ट Compose फ़ाइल सिर्फ़127.0.0.1पर पब्लिश करती है। अगर आप पोर्ट को लूपबैक से आगे पब्लिश करते हैं ताकि कोई Tailscale डिवाइस उस तक पहुँच सके, तो पहले लॉगिन सेट करें। तब Docker हर डिवाइस से वह लॉगिन माँगता है, Tailscale डिवाइस भी शामिल, क्योंकि Docker उन्हें गेटवे पते पर देखता है। देखें Tailscale और Docker बायपास। - आप घर के Wi-Fi पर लगे फ़ोन, टैबलेट या लैपटॉप से Marinara खोलना चाहते हैं। लॉगिन सेट करें (नीचे विकल्प 1)।
- आप Marinara को सार्वजनिक इंटरनेट पर खोल रहे हैं। लॉगिन सेट करें और HTTPS इस्तेमाल करें।
- आपके नेटवर्क पर कोई लॉगिन प्रॉक्सी है, जैसे tinyauth, Authelia या Authentik, जो हर विज़िटर से पहले ही लॉगिन करवा लेती है। लॉगिन प्रॉक्सी (फ़ॉरवर्ड-ऑथ) पढ़ें।
लॉगिन सबसे लचीला विकल्प है। यह किसी भी IP से काम करता है, हर डिवाइस पर अलग सेटअप नहीं माँगता, और हर ब्राउज़र साइन इन रहता है।
विकल्प 1: लॉगिन (यही सुझाया जाता है)
लॉगिन यानी यूज़रनेम और पासवर्ड, जो हर रिमोट डिवाइस को चाहिए। इसे तीन तरीकों से सेट कर सकते हैं:
- ऐप की Settings में। ऐसे ब्राउज़र में जो पहले से साइन इन है, या Marinara चलाने वाले कंप्यूटर पर (
http://localhost:7860खोलें), Settings → Advanced → Access (सेटिंग्स → एडवांस्ड → एक्सेस) में जाएँ। Remote login के नीचे यूज़रनेम और पासवर्ड सेट करें। जब तक लॉगिन नहीं है, तब तक जिस डिवाइस को Marinara ठुकराता है, जैसे Docker होस्ट का ब्राउज़र, वह सेटअप कोड भी उसी जगह टाइप कर सकता है। - सेटअप कोड से, किसी भी डिवाइस से। जब तक लॉगिन सेट नहीं है और सर्वर लूपबैक से आगे सुन रहा है, वह अपने लॉग में एक बार का सेटअप कोड छापता है। लॉग की वह पंक्ति
[login] One-time setup code:से शुरू होती है। इसे उस टर्मिनल में खोजें जिसमें Marinara चल रहा है। Docker मेंdocker logs <container> 2>&1 | grep "setup code"चलाएँ। लॉग में इनकार वाली चेतावनी हर बार कोड दोहराती है, जब तक लॉगिन नहीं है। फिर किसी भी डिवाइस पर Marinara खोलें। जो पेज डिवाइस को रोकता है, उसमें सेटअप कोड, यूज़रनेम और पासवर्ड का फ़ॉर्म है। कोडXXXX-XXXX-XXXX-XXXXजैसा दिखता है। बड़े अक्षर, स्पेस और डैश मायने नहीं रखते। हर कोड एक ही बार चलता है; रीस्टार्ट या रीसेट करने पर नया कोड बनता है। Docker में पेज यह भी दिखाता है कि लॉगिन को डेटा फ़ोल्डर की.envफ़ाइल में (/app/data/.env) या अपनी compose फ़ाइल कीenvironment:सूची में कैसे सेट करें (फिरdocker compose up -dचलाएँ)। जिन Docker और NAS इंस्टॉल में होस्ट पर कोई ब्राउज़र नहीं होता, उनके लिए यही तरीका इस्तेमाल करें। लॉगिन न होने पर Marinara लोकल विज़िटर और साइन इन किए सेशन को स्क्रीन के नीचे एक कार्ड के रूप में बैनर दिखाता है। .envमें। दो पंक्तियाँ जोड़ें:
BASIC_AUTH_USER=alice
BASIC_AUTH_PASS=correct-horse-battery-staple.env में सेट किया लॉगिन ऐप में सेट किए लॉगिन पर भारी पड़ता है, और उसे आप सिर्फ़ .env में बदलते हैं। .env सेव करें। बदलाव कुछ ही सेकंड में लागू हो जाता है, रीस्टार्ट की ज़रूरत नहीं।
मज़बूत और अनोखा पासवर्ड चुनें। ऐप कम से कम 10 अक्षर माँगता है। रैंडम पासवर्ड इस तरह बना सकते हैं:
openssl rand -base64 24इसके बाद रिमोट डिवाइस पर ये स्टेप अपनाएँ।
- सर्वर के पते से ब्राउज़र में Marinara खोलें, जैसे
http://192.168.1.50:7860। - साइन-इन पेज पर अपना यूज़रनेम और पासवर्ड डालें।
- ऐप लोड हो जाना चाहिए। ब्राउज़र एक साल तक साइन इन रहता है, जब तक आप उसे साइन आउट न करें। स्क्रिप्ट और API क्लाइंट हर रिक्वेस्ट के साथ यूज़रनेम और पासवर्ड भेजते हैं (Basic Auth)।
पासवर्ड टाइप किए बिना दूसरे डिवाइस पर साइन इन करने के लिए पेयरिंग कोड इस्तेमाल करें। जो डिवाइस साइन इन है, उस पर Settings → Advanced → Access खोलें और Add a device चुनें। फिर वह कोड नए डिवाइस के साइन-इन पेज पर टाइप करें। कोड कुछ मिनट के लिए सिर्फ़ एक बार चलता है। एक्सपायर हो चुके कोड को अपना संदेश मिलता है; नया कोड बना लें। Signed-in devices में हर डिवाइस उसके साइन-इन तरीके और पहली बार साइन इन होने की तारीख के साथ दिखता है। आप किसी भी डिवाइस को साइन आउट कर सकते हैं, जिसमें वह डिवाइस भी है जो आप इस्तेमाल कर रहे हैं। पासवर्ड बदल या हटा भी सकते हैं। इसके लिए Marinara मौजूदा पासवर्ड माँगता है, सिवाय तब जब आप Marinara चलाने वाले कंप्यूटर पर काम करें या ADMIN_SECRET सेट हो।
अगर आप पासवर्ड भूल जाएँ, तो Marinara चलाने वाले कंप्यूटर पर Marinara फ़ोल्डर में node scripts/reset-login.mjs चलाएँ। Docker में docker exec <container> node scripts/reset-login.mjs चलाएँ। यह ऐप में सेट किया लॉगिन हटाता है और हर ब्राउज़र को साइन आउट कर देता है। सर्वर लूपबैक से आगे सुन रहा हो, तो फिर यह नया सेटअप कोड छापता है। सिर्फ़ जब यह कमांड काम न करे, तब इसकी जगह डेटा फ़ोल्डर से .remote-login.json और .remote-sessions.json मिटा दें। डिफ़ॉल्ट /app/data के साथ docker exec <container> rm -f /app/data/.remote-login.json /app/data/.remote-sessions.json चलाएँ; अगर आपने DATA_DIR बदला है, तो वही फ़ोल्डर इस्तेमाल करें। .env वाला लॉगिन आप .env में ही बदलते हैं।
ब्राउज़र के बिना हेडलेस सर्वर? हेडलेस सर्वर पर नेटिव इंस्टॉल सिर्फ़ लूपबैक पर सुनता है और कोई सेटअप कोड नहीं छापता। अपने कंप्यूटर पर ssh -L 7860:127.0.0.1:7860 user@server चलाएँ। फिर वहाँ http://localhost:7860 खोलें और Settings इस्तेमाल करें।
15 मिनट के अंदर 10 अलग-अलग गलत पासवर्ड या कोड आने पर Marinara उस पते से साइन इन को 429 Too Many Requests के साथ तब तक ठुकराता है, जब तक वे 15 मिनट पूरे न हो जाएँ। उससे पहले सही पासवर्ड डालने पर गिनती साफ़ हो जाती है। होस्ट पर चल रही रिवर्स प्रॉक्सी या टनल से आगे भेजे गए सभी विज़िटर की एक ही गिनती होती है, और उनमें से किसी एक के साइन इन करने से वह साफ़ नहीं होती। सर्वर रीस्टार्ट करने से भी गिनती साफ़ हो जाती है। जो ब्राउज़र पहले साइन इन कर चुका है, वह सही पासवर्ड से अब भी अंदर आ जाता है, इसलिए दूसरे लोगों के गलत पासवर्ड आपको उस डिवाइस पर लॉक नहीं कर सकते जिसे आप पहले से इस्तेमाल कर रहे हैं। साइन-इन पेज बताता है कि कितने मिनट रुकना है। पासवर्ड भूल जाने पर साइन-इन पेज में Forgot the password? वाला संकेत होता है।
ब्राउज़र /login पेज पर साइन इन करते हैं। BASIC_AUTH_REALM स्क्रिप्ट और API क्लाइंट के लिए Basic Auth चैलेंज का realm बदलता है; यह साइन-इन पेज को नहीं बदलता।
लॉगिन होने पर भी कुछ क्लाइंट को पासवर्ड नहीं देना पड़ता:
- लूपबैक (
127.0.0.1,::1), इसलिए होस्ट मशीन पर कभी पासवर्ड की ज़रूरत नहीं पड़ती। उस मशीन पर चल रही रिवर्स प्रॉक्सी या टनल से आगे भेजे गए विज़िटर को पासवर्ड फिर भी देना पड़ता है। IP_ALLOWLISTमें लिखा कोई भी पता। ध्यान रखें: अलाउलिस्ट सेट करते ही उसमें न लिखा हर पता ब्लॉक भी हो जाता है (देखें विकल्प 2)।- सीधा Tailscale ट्रैफ़िक (
100.64.0.0/10), जब तक आप उसका बायपास बंद न कर दें। - Docker ब्रिज या गेटवे ट्रैफ़िक, सिर्फ़ तब जब कोई लॉगिन, अलाउलिस्ट या
TRUSTED_AUTH_PROXYसेट न हो (देखें Tailscale और Docker बायपास)। /api/healthपता, ताकि अपटाइम मॉनिटर चलते रहें। जो विज़िटर ऐप नहीं खोल सकता, उसे सिर्फ़{"status": "ok"}मिलता है; वर्ज़न, सिस्टम और मॉडल की जानकारी इसी कंप्यूटर, भरोसेमंद नेटवर्क और साइन-इन किए हुए ब्राउज़र तक सीमित रहती है।
ज़रूरी बात: Basic Auth पासवर्ड को सिर्फ़ एन्कोड करता है, एन्क्रिप्ट नहीं करता। बिना एन्क्रिप्शन वाले कनेक्शन पर नज़र रखने वाला कोई भी इसे पढ़ सकता है। अगर Marinara को सार्वजनिक इंटरनेट पर खोल रहे हैं, तो Basic Auth के साथ HTTPS भी लगाएँ (नीचे देखें)।
विकल्प 2: IP अलाउलिस्ट
IP अलाउलिस्ट से तय पते बिना पासवर्ड के अंदर आ जाते हैं। जिन डिवाइस के IP पते स्थिर रहते हैं, उनके लिए यह अच्छा तरीका है। पतों या रेंज की अल्पविराम से अलग की हुई लिस्ट सेट करें:
IP_ALLOWLIST=192.168.1.0/24,203.0.113.42उदाहरण में लिखा /24 CIDR नोटेशन है। CIDR पतों की पूरी रेंज को एक ही एंट्री में लिखने का छोटा तरीका है। जैसे 192.168.1.0/24 में 192.168.1.0 से 192.168.1.255 तक के सारे पते आ जाते हैं। बिना स्लैश वाला अकेला पता, जैसे 203.0.113.42, सिर्फ़ उसी एक डिवाइस से मैच करता है।
0.0.0.0/0 जैसी चौड़ी सार्वजनिक रेंज इंटरनेट के क्लाइंट को बिना लॉगिन के अंदर आने दे सकती है। सिर्फ़ वही पते लिखें जिन पर आप भरोसा करते हैं।
IP अलाउलिस्ट कैसे काम करती है:
- लिस्ट में न लिखा कोई भी पता 403 Forbidden के साथ मना कर दिया जाता है। भरोसेमंद Tailscale और Docker पीयर और
TRUSTED_AUTH_PROXYलूपबैक की तरह अब भी पास हो जाते हैं। - लूपबैक हमेशा चालू रहता है, इसलिए लोकल एक्सेस से खुद बाहर होने का खतरा नहीं रहता। उसी मशीन पर चल रही रिवर्स प्रॉक्सी या टनल से आगे भेजे गए विज़िटर लूपबैक नहीं हैं, इसलिए अलाउलिस्ट उन्हें ब्लॉक कर देती है। प्रॉक्सी के पीछे Basic Auth इस्तेमाल करें।
- Docker Desktop, OrbStack और rootless Docker पर हर डिवाइस एक ही गेटवे पते से कंटेनर तक पहुँचता है, इसलिए अलाउलिस्ट उनमें फ़र्क नहीं कर पाती। वहाँ Basic Auth इस्तेमाल करें।
- सीधा Tailscale ट्रैफ़िक भी इस लिस्ट से बाहर रहता है। Docker ब्रिज या गेटवे ट्रैफ़िक इससे सिर्फ़ तब बाहर रहता है, जब कोई लॉगिन, अलाउलिस्ट या मान्य
TRUSTED_AUTH_PROXYसेट न हो (देखें Tailscale और Docker बायपास)। - गलत एंट्री नज़रअंदाज़ कर दी जाती हैं और लॉग में दर्ज हो जाती हैं। इनसे सर्वर क्रैश नहीं होता।
- Basic Auth चालू होने पर भी अलाउलिस्ट सख्त रहती है। लिस्ट में लिखे पतों को पासवर्ड नहीं देना पड़ता। बाकी हर पता 403 Forbidden के साथ ब्लॉक ही रहता है और उसे कभी लॉगिन विंडो नहीं मिलती।
अलाउलिस्ट से ऐसा सेटअप नहीं बनता जिसमें लिस्ट वाले डिवाइस बिना पासवर्ड अंदर जाएँ और बाकी सब लॉगिन करें। अगर आप चाहते हैं कि दूसरे डिवाइस पासवर्ड से लॉगिन करें, तो IP_ALLOWLIST खाली छोड़ें और सिर्फ़ Basic Auth इस्तेमाल करें।
लिस्ट मिटाए बिना कुछ समय के लिए इसे लागू होने से रोका जा सकता है। किसी नए IP से समस्या सुलझाते समय यह काम आता है। चालू करने वाले फ़्लैग को false पर सेट करें:
IP_ALLOWLIST_ENABLED=falseप्राइवेट नेटवर्क बायपास (रेफ़रेंस)
कुछ फ़्लैग भरोसेमंद प्राइवेट नेटवर्क के लिए यह रोक हटा देते हैं। ये खास सेटअप के लिए हैं। लॉगिन बेहतर विकल्प है। फ़्लैग और उनके जोखिम के लिए एक्सेस कंट्रोल देखें।
Tailscale और Docker बायपास
डिफ़ॉल्ट रूप से Marinara उस डिवाइस पर भरोसा करता है जो सीधे आपके Tailscale नेटवर्क से जुड़ता है। वह Docker कंटेनर के अपने होस्ट पर भी भरोसा करता है। कोई लॉगिन, IP अलाउलिस्ट या TRUSTED_AUTH_PROXY Docker पर अपने आप होने वाला भरोसा बंद कर देता है, इसलिए तब हर डिवाइस को अपना लॉगिन या अलाउलिस्ट में अपनी जगह चाहिए। इन्हें बदलने वाले फ़्लैग के लिए एक्सेस कंट्रोल देखें।
Docker Desktop, OrbStack और rootless Docker पर प्रकाशित पोर्ट इस्तेमाल करने वाला हर डिवाइस Docker गेटवे के पते पर दिखता है। अगर आप पोर्ट को सभी इंटरफ़ेस पर प्रकाशित करते हैं (-p 7860:7860) और कोई लॉगिन सेट नहीं करते, तो आपके नेटवर्क का कोई भी व्यक्ति अंदर आ सकता है। पोर्ट को 127.0.0.1 पर रखें या पहले लॉगिन सेट करें। सर्वर लॉग शुरू होते समय इस बारे में चेतावनी देता है।
उसी कंप्यूटर पर रिवर्स प्रॉक्सी और टनल
Marinara चलाने वाली मशीन पर मौजूद रिवर्स प्रॉक्सी या टनल, जैसे nginx, Caddy, Traefik, Cloudflare Tunnel, Tailscale Serve या Funnel, या ngrok, लूपबैक के ज़रिए Marinara से जुड़ती है। Marinara इसे उन फ़ॉरवर्डिंग हेडर से पहचानता है जो प्रॉक्सी जोड़ती है: Forwarded, X-Forwarded-For, X-Real-IP, X-Forwarded-Host, X-Forwarded-Proto, CF-Connecting-IP, True-Client-IP, Tailscale के पहचान वाले हेडर, या Via। Marinara उस रिक्वेस्ट को भी पहचानता है जो HTTP/1.0 पर आती है, क्योंकि ब्राउज़र इसे कभी इस्तेमाल नहीं करते, लेकिन nginx का डिफ़ॉल्ट proxy_pass करता है। Marinara उस रिक्वेस्ट को भी पहचानता है जिसका Host किसी दूसरे कंप्यूटर का नाम देता है, जैसे कोई डोमेन या LAN एड्रेस, भले ही प्रॉक्सी कोई हेडर न जोड़े। इसके बाद वह हर रिक्वेस्ट को वैसा ही रिमोट विज़िटर मानता है, जैसा वह असल में है:
- लॉगिन लागू होता है (देखें विकल्प 1)। लॉगिन के बिना विज़िटर को सेटअप पेज दिखता है। लॉगिन इस कंप्यूटर पर Settings में या
.envमें सेट करें। IP_ALLOWLISTआगे भेजे गए विज़िटर को ब्लॉक कर देती है, क्योंकि प्रॉक्सी उनके असली पते छिपा देती है।- खास अधिकार वाले कामों के लिए एडमिन सीक्रेट चाहिए, और सिर्फ़ लूपबैक वाली सुविधाएँ उपलब्ध नहीं रहतीं।
उस मशीन पर http://127.0.0.1:7860 या http://localhost:7860 पर खोला गया आपका अपना ब्राउज़र बिना पासवर्ड के ही चलता रहता है।
Caddy, Traefik, Cloudflare Tunnel, Tailscale और ngrok डिफ़ॉल्ट रूप से फ़ॉरवर्डिंग हेडर जोड़ते हैं। nginx के लिए location ब्लॉक में यह पंक्ति अब भी सुझाई जाती है:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;जो टूल कच्चे कनेक्शन आगे भेजते हैं, जैसे socat या ssh -R, वे कोई हेडर नहीं जोड़ते, इसलिए उनका ट्रैफ़िक लोकल जैसा दिखता है। Marinara को पब्लिश करने के लिए इनका इस्तेमाल न करें।
अगर आपकी प्रॉक्सी कुछ भी आगे भेजने से पहले ही हर विज़िटर से लॉगिन करवाती है, तो लॉगिन प्रॉक्सी (फ़ॉरवर्ड-ऑथ) देखें।
लॉगिन प्रॉक्सी (फ़ॉरवर्ड-ऑथ)
फ़ॉरवर्ड-ऑथ प्रॉक्सी, जैसे tinyauth, Authelia, Authentik या oauth2-proxy, रिक्वेस्ट आगे भेजने से पहले हर विज़िटर से लॉगिन करवाती है। अगर ऐसी प्रॉक्सी ही Marinara तक पहुँचने का इकलौता रास्ता है, तो आप Marinara का दूसरा लॉगिन छोड़ सकते हैं। ऐसी प्रॉक्सी के बिना इसे सेट न करें।
प्रॉक्सी का पता .env में डालें:
TRUSTED_AUTH_PROXY=192.168.1.5तब Marinara हर उस रिक्वेस्ट को अंदर आने देता है जिसका कनेक्शन उस पते से आता है। Marinara उनसे अपना लॉगिन नहीं माँगता और कोई सेटअप कोड नहीं छापता। Marinara कनेक्शन का पता खुद जाँचता है। इस फ़ैसले के लिए वह X-Forwarded-For जैसे फ़ॉरवर्डिंग हेडर को अनदेखा करता है। प्रॉक्सी से आई रिक्वेस्ट IP_ALLOWLIST भी पार कर लेती हैं, क्योंकि कौन अंदर आए, यह प्रॉक्सी तय करती है। उन्हें लोकल नहीं गिना जाता, इसलिए खास अधिकार वाले कामों के लिए अब भी एडमिन सीक्रेट चाहिए। सेटिंग चालू रहने पर Settings → Advanced → Access में Trusted login proxy: Set दिखता है।
इसे सेट करने से पहले:
- प्रॉक्सी को हर पाथ पर लॉगिन माँगना चाहिए। इसमें
/api/, WebSocket कनेक्शन और स्टैटिक फ़ाइलें भी आती हैं। जिस पाथ को प्रॉक्सी बिना लॉगिन के आगे जाने देती है, वह सबके लिए खुला है। - Marinara तक प्रॉक्सी को बायपास करके पहुँचना संभव नहीं होना चाहिए। Marinara को ऐसे पते पर बाइंड करें जहाँ सिर्फ़ प्रॉक्सी पहुँच सके, या उसका पोर्ट फ़ायरवॉल से बंद करें। Docker में प्रॉक्सी और Marinara को एक ही Docker नेटवर्क पर रखें, प्रॉक्सी को उस पर तय पता दें, और Marinara का पोर्ट पब्लिश न करें। अगर प्रॉक्सी Docker होस्ट पर चलती है, तो पोर्ट सिर्फ़ लूपबैक पर पब्लिश करें (
127.0.0.1:7860:7860): Docker Desktop और OrbStack पब्लिश किए गए पोर्ट के हर LAN क्लाइंट को Docker गेटवे के पते से दिखाते हैं, जो प्रॉक्सी वाला ही पता है। अगर कोई दूसरा डिवाइस सीधे Marinara से जुड़ सकता है, तो वह प्रॉक्सी का लॉगिन छोड़ देता है। - सिर्फ़ प्रॉक्सी का अपना पता लिखें। रेंज निजी पता स्पेस के अंदर ही रहनी चाहिए; Marinara बाकी रेंज अनदेखी करता है। वह हर रेंज के लिए चेतावनी लॉग करता है, क्योंकि रेंज का हर डिवाइस लॉगिन छोड़ देता है।
- सार्वजनिक नाम वैसे ही जोड़ें जैसे किसी भी दूसरी प्रॉक्सी के लिए। होस्टनेम
TRUSTED_HOSTSमें और ऑरिजिनCSRF_TRUSTED_ORIGINSमें डालें (देखें मेरा सेव ब्लॉक क्यों हो रहा है (CSRF))।
TRUSTED_AUTH_PROXY सेट होने पर Marinara Docker पर अपने आप होने वाला भरोसा भी बंद कर देता है। जो सीधे आने वाले विज़िटर प्रॉक्सी नहीं हैं, उन्हें Marinara का लॉगिन या IP अलाउलिस्ट चाहिए। तब Marinara "अभी लॉगिन नहीं है" वाला बैनर भी नहीं दिखाता।
अगर प्रॉक्सी उसी कंप्यूटर पर चलती है जिस पर Marinara, तो TRUSTED_AUTH_PROXY=127.0.0.1 इस्तेमाल करें और प्रॉक्सी को 127.0.0.1:7860 पर भेजें, localhost:7860 पर नहीं। जो प्रॉक्सी localhost डायल करती है, वह ::1 से जुड़ सकती है, जो 127.0.0.1 से मेल नहीं खाता। तब उस कंप्यूटर की हर दूसरी प्रॉक्सी या टनल पर भी भरोसा हो जाता है, इसलिए इसे सिर्फ़ तभी इस्तेमाल करें जब लॉगिन प्रॉक्सी ही अकेली हो। इससे प्रॉक्सी से आए विज़िटर को लोकल मशीन वाली पहुँच नहीं मिलती।
Caddy का एक उदाहरण, जिसमें Marinara 192.168.1.20:7860 पर है:
marinara.example.com {
forward_auth tinyauth:3000 {
uri /api/auth/caddy
}
reverse_proxy 192.168.1.20:7860
}Authelia के लिए forward_auth authelia:9091 को uri /api/authz/forward-auth के साथ इस्तेमाल करें। Authentik अपने साइन-इन पेज भी प्रॉक्सी से ही देता है। उसकी पंक्तियों को route ब्लॉक में रखें, ताकि Caddy उनका क्रम बनाए रखे और आउटपोस्ट का पाथ खुद फ़ॉरवर्ड-ऑथ से न गुज़रे:
marinara.example.com {
route {
reverse_proxy /outpost.goauthentik.io/* authentik-server:9000
forward_auth authentik-server:9000 {
uri /outpost.goauthentik.io/auth/caddy
}
reverse_proxy 192.168.1.20:7860
}
}Traefik और बाकी के लिए अपनी प्रॉक्सी की फ़ॉरवर्ड-ऑथ गाइड देखें। Marinara को प्रॉक्सी के पते के अलावा कुछ और नहीं चाहिए।
HTTPS पर चलाना
HTTPS कनेक्शन को TLS से एन्क्रिप्ट करता है। TLS वही एन्क्रिप्शन है जो सादे http पते को सुरक्षित https पते में बदल देता है। पूरी तरह भरोसेमंद प्राइवेट नेटवर्क के बाहर से खुलने वाले हर इंस्टॉल पर हमेशा HTTPS इस्तेमाल करें, खासकर Basic Auth के साथ।
इसे जोड़ने के दो तरीके हैं।
- बिल्ट-इन TLS। सर्वर को सर्टिफ़िकेट और प्राइवेट कुंजी वाली फ़ाइल का पथ दें:
SSL_CERT=/path/to/cert.pem
SSL_KEY=/path/to/key.pem- रिवर्स प्रॉक्सी। Marinara को nginx, Caddy, Traefik या Cloudflare Tunnel के पीछे रखें। प्रॉक्सी HTTPS वाला हिस्सा संभालती है और उसी मशीन पर सादे HTTP से Marinara तक आगे भेज देती है। पहले उसी कंप्यूटर पर रिवर्स प्रॉक्सी और टनल पढ़ें।
SSL_CERT और SSL_KEY सेट करने से पहले सर्टिफ़िकेट और कुंजी बनानी होगी। लोकल इस्तेमाल के लिए mkcert जैसे टूल से, और सार्वजनिक डोमेन के लिए certbot से बना सकते हैं। फ़ाइलें न मिलें या पढ़ी न जा सकें, तो सर्वर शुरू होते ही रुक जाता है और वही पथ बता देता है जिन्हें उसने आज़माया था।
Admin Access और खास अधिकार वाले काम
कुछ काम बाकी से ज़्यादा संवेदनशील हैं: डेटा मिटाना, बैकअप बनाना या डाउनलोड करना, प्रोफ़ाइल इंपोर्ट और एक्सपोर्ट करना, थीम और एजेंट इंस्टॉल करना, और Local Model रनटाइम इंस्टॉल करना। ऊपर चुने गए एक्सेस विकल्प के अलावा इनके लिए एक अलग साझा सीक्रेट भी चाहिए, जिसे एडमिन सीक्रेट कहते हैं।
लूपबैक मशीन पर ये काम आम तौर पर बिना एडमिन सीक्रेट के भी हो जाते हैं। रिमोट डिवाइस से करने के लिए सीक्रेट सेट करना पड़ता है। इसे आप ऐप में बना सकते हैं या .env में सेट कर सकते हैं।
Home स्क्रीन वाले एजेंट जैसे इंस्टॉल किए गए एजेंट के लिए एडमिन सीक्रेट नहीं चाहिए। जिस डिवाइस ने लॉगिन से साइन इन किया है, वह इन्हें इस्तेमाल कर सकता है। किसी एजेंट को इंस्टॉल करने, अपडेट करने और हटाने के लिए यह अब भी चाहिए।
ऐप में एडमिन सीक्रेट बनाना
- Marinara चलाने वाले कंप्यूटर पर Settings (सेटिंग्स) खोलें, फिर Advanced टैब, फिर Admin Access सेक्शन खोलें।
- Make admin secret पर क्लिक करें। Marinara नया सीक्रेट एक बार दिखाता है और उसे इसी ब्राउज़र में सेव कर देता है।
- हर रिमोट डिवाइस पर Settings → Advanced → Admin Access (सेटिंग्स → एडवांस्ड → एडमिन एक्सेस) खोलें, सीक्रेट बॉक्स में टाइप करें, फिर Save पर क्लिक करें। छोटे-बड़े अक्षर, स्पेस और डैश से कोई फ़र्क नहीं पड़ता।
जिस डिवाइस में सीक्रेट पहले से है, वह भी इसे बना सकता है। जो डिवाइस सिर्फ़ लॉगिन से साइन इन है, वह नहीं बना सकता। इससे चुराया गया साइन-इन जोखिम वाले कामों पर कब्ज़ा नहीं कर पाता।
Docker में आपका ब्राउज़र Docker नेटवर्क के ज़रिए Marinara तक पहुँचता है, इसलिए Marinara उसे उसी कंप्यूटर जैसा नहीं मानता। इसकी जगह पहला सीक्रेट .env में सेट करें (नीचे देखें)।
सीक्रेट बदलने के लिए Replace admin secret पर क्लिक करें। पुराना सीक्रेट हर डिवाइस पर काम करना बंद कर देता है। इसे बंद करना हो, तो Remove admin secret पर क्लिक करें। Marinara सीक्रेट का सिर्फ़ एक फ़िंगरप्रिंट रखता है, जो डेटा फ़ोल्डर में .admin-secret.json में रहता है। वह फ़ाइल मिटाने से भी सीक्रेट हट जाता है।
.env में एडमिन सीक्रेट सेट करना
.envमें कोई मज़बूत रैंडम वैल्यू सेट करके सेव करें। यह कुछ ही सेकंड में लागू हो जाती है, रीस्टार्ट की ज़रूरत नहीं।
ADMIN_SECRET=some-long-random-string- रिमोट डिवाइस पर Settings → Advanced → Admin Access खोलें।
- वही वैल्यू बॉक्स में पेस्ट करें (उसका प्लेसहोल्डर ADMIN_SECRET है), फिर Save पर क्लिक करें।
- Admin secret saved for this browser संदेश दिखना चाहिए।
.env का ADMIN_SECRET ऐप में बने सीक्रेट पर भारी पड़ता है। जब तक यह सेट है, Admin Access यही बताता है, और सीक्रेट आप सिर्फ़ .env में बदलते हैं।
जानने लायक बातें
- हर ब्राउज़र अपनी अलग कॉपी रखता है। यह डिवाइस के बीच सिंक नहीं होता।
- बॉक्स खाली रखकर Save पर क्लिक करने से यह हट जाता है और Admin secret cleared दिखता है।
- अगर सर्वर चलाने वाला
MARINARA_REQUIRE_ADMIN_SECRET_ON_LOOPBACK=trueसेट कर दे, तो लूपबैक मशीन पर भी सीक्रेट देना पड़ता है। तब ऐप में इसे बनाने, बदलने या हटाने के लिए मौजूदा सीक्रेट चाहिए, इसलिए पहला सीक्रेट.envमें सेट करें। - यह Basic Auth से अलग चीज़ है। दोनों साथ भी इस्तेमाल कर सकते हैं। Basic Auth पूरे ऐप पर पहरा देता है, और एडमिन सीक्रेट खतरनाक कामों पर।
अगर रिमोट डिवाइस पर खास अधिकार वाला कोई काम नाकाम हो जाए, तो Marinara दो उपाय बताने वाला एरर संदेश दिखाता है। एक उपाय है ऐप को localhost से खोलना। दूसरा है ऊपर बताए तरीके से एडमिन सीक्रेट सेट करना।
मेरा सेव ब्लॉक क्यों हो रहा है (CSRF)
CSRF का मतलब है cross-site request forgery। यह एक सुरक्षा उपाय है जो आपके ब्राउज़र में खुली किसी दूसरी वेबसाइट को आपकी इजाज़त के बिना Marinara में चुपचाप बदलाव करने से रोकता है। यह अपने आप चलता है। इसे चालू करने की कोई सेटिंग नहीं है।
कई बार CSRF आपके अपने सेव भी रोक देता है। ऐसा आम तौर पर तब होता है जब आप Marinara को किसी सार्वजनिक डोमेन नाम से या ऐसे असामान्य पोर्ट से खोलते हैं जिस पर सर्वर को अभी भरोसा नहीं है। ऐसा होने पर दो चीज़ें आपको इसकी जानकारी देती हैं।
- ऐप के ऊपर एक लाल बैनर चेतावनी देता है कि इस ऑरिजिन पर भरोसा न होने की वजह से Saves will silently fail। बैनर में
.envकी वही सटीक पंक्ति दिखती है जो जोड़नी है, और उसमें Copy बटन भी होता है। - अगर कोई सेव सचमुच रोका जाए, तो एक छोटा संदेश दिखता है। उसका शीर्षक Save blocked: missing CSRF header, Save blocked: cross-site request rejected या Save blocked: origin not trusted होता है।
इसे ठीक करने के लिए .env की भरोसेमंद लिस्ट में अपना पता जोड़ें:
CSRF_TRUSTED_ORIGINS=https://chat.example.com,http://203.0.113.10:7831सार्वजनिक या रिवर्स प्रॉक्सी वाले डोमेन के साथ होस्टनेम को भी इजाज़त दें:
TRUSTED_HOSTS=chat.example.comसीधे LAN, Tailscale, IPv4 और IPv6 पतों के लिए TRUSTED_HOSTS की ज़रूरत नहीं। लोकल .local/.home.arpa नाम और एक शब्द वाले मशीन नाम अपने आप स्वीकार हो जाते हैं। CSRF_TRUSTED_ORIGINS में पहले से लिखा हुआ पूरा होस्टनेम भी स्वीकार होता है।
लूपबैक, सामान्य LAN पते, Tailscale (100.64.0.0/10) और Docker ब्रिज (172.16.0.0/12) वाले ऑरिजिन अपने आप भरोसेमंद माने जाते हैं। सिर्फ़ सार्वजनिक IP पते और डोमेन नाम लिखने पड़ते हैं। बदलाव कुछ ही सेकंड में लागू हो जाता है, रीस्टार्ट की ज़रूरत नहीं।
ब्लॉक हुए लोकल प्रोवाइडर के बारे में एक बात
मान लें कि आप Marinara को किसी लोकल AI प्रोवाइडर से जोड़ते हैं, जैसे अपनी ही मशीन पर चल रहे किसी प्रोवाइडर से। हो सकता है रिक्वेस्ट "private, loopback, metadata, or reserved IP range" वाले संदेश के साथ मना कर दी जाए। यह एक अलग सुरक्षा जाँच है, जिसे SSRF प्रोटेक्शन कहते हैं। SSRF का मतलब है server-side request forgery। यह सर्वर को प्राइवेट पतों पर कॉल करने से रोकता है, जब तक आप इजाज़त न दें। एरर में वही .env वेरिएबल बताया जाता है जिसे सेट करना है, जैसे PROVIDER_LOCAL_URLS_ENABLED। पूरी लिस्ट के लिए देखें सर्वर कॉन्फ़िगरेशन रेफ़रेंस।
फ़ोन या टैबलेट से एक्सेस
उसी नेटवर्क पर लगे फ़ोन या टैबलेट से Marinara खोलने के लिए:
- जाँच लें कि
.envमेंHOST=0.0.0.0लगा है, ताकि सर्वर सभी इंटरफ़ेस पर सुने। - लॉगिन सेट करें (ऊपर विकल्प 1)। फ़ोन से आप यह उसी पेज पर कर सकते हैं जो आपको रोकता है, सर्वर लॉग के सेटअप कोड के साथ।
- सर्वर वाली मशीन का लोकल IP पता खोजें (जैसे
192.168.1.50)। - फ़ोन पर ब्राउज़र में
http://192.168.1.50:7860खोलें। डिफ़ॉल्ट पोर्ट7860है। - अपने यूज़रनेम और पासवर्ड से साइन इन करें।
अगर पेज लोड ही नहीं होता, तो शायद सर्वर तक पहुँच ही नहीं बन रही। HOST=0.0.0.0 और PORT की वैल्यू जाँच लें। इसकी जगह 403 मिले, तो आपका डिवाइस सर्वर तक पहुँच तो रहा है, पर उसे अभी अंदर आने की इजाज़त नहीं है। ऊपर चुना हुआ विकल्प दोबारा देखें।
अपडेट के बाद लॉक आउट हो जाना
नए वर्शन में अगर कोई विज़िट रिवर्स प्रॉक्सी, टनल, Tailscale Serve या Tailscale Funnel से आती है, तो लॉगिन माँगा जाता है। पुराने वर्शन ऐसी विज़िट को बिना पासवर्ड के अंदर आने देते थे। अगर अब आपको लॉगिन पेज, सेटअप पेज या 403 दिख रहा है, तो यही वजह है।
अपग्रेड नोट: अगर आप Tailscale Serve या उसी कंप्यूटर की किसी दूसरी प्रॉक्सी इस्तेमाल करते हैं और आपने कभी पासवर्ड सेट नहीं किया, तो अपडेट के बाद आपके दूसरे डिवाइस लॉक आउट हो जाते हैं। उसी कंप्यूटर की प्रॉक्सी आम तौर पर ऐसे सर्वर से बात करती है जो सिर्फ़ लूपबैक पर सुनता है, इसलिए सर्वर कोई सेटअप कोड नहीं छापता। इसके बजाय लॉगिन उसी कंप्यूटर पर सेट करें जिस पर Marinara चलता है।
वापस अंदर आने के लिए:
- जिस कंप्यूटर पर Marinara चल रहा है, उस पर उसे
http://localhost:7860(या अपनेPORT) पर खोलें। लोकल इस्तेमाल में पासवर्ड नहीं चाहिए। हेडलेस सर्वर पर पहले अपने कंप्यूटर परssh -L 7860:127.0.0.1:7860 user@serverचलाएँ, फिर वहाँhttp://localhost:7860खोलें। Docker में यह तभी सही है जब कोई लॉगिन औरIP_ALLOWLISTसेट न हो। नहीं तो सर्वर लॉग से सेटअप कोड (docker logs <container> 2>&1 | grep "setup code") उस पेज पर टाइप करें जो आपको रोकता है, या Settings → Advanced → Access में, या ऐसा ब्राउज़र इस्तेमाल करें जो अब भी साइन इन है। - Settings → Advanced → Access में जाएँ और Remote login के नीचे यूज़रनेम और पासवर्ड सेट करें। या उसी कंप्यूटर पर
.envफ़ाइल खोलें औरBASIC_AUTH_USERऔरBASIC_AUTH_PASSसेट करें। अगरIP_ALLOWLISTसेट है, तो उसमें अपने दूसरे डिवाइस का पता जोड़ें या उसे हटा दें, क्योंकि लिस्ट में न होने वाले डिवाइस को लॉगिन के साथ भी 403 मिलता है। - अपने दूसरे डिवाइस से उसी यूज़रनेम और पासवर्ड से साइन इन करें।
सर्च इंजन
Marinara सर्च इंजन से अनुरोध करता है कि वे उसके पेज इंडेक्स न करें (X-Robots-Tag: noindex, nofollow)। इससे आपका इंस्टॉलेशन सुरक्षित नहीं होता, और जो पेज पहले से इंडेक्स हो चुके हैं, वे हटते भी नहीं हैं। अपने इंस्टॉलेशन को निजी रखने के लिए ऊपर बताए गए एक्सेस कंट्रोल इस्तेमाल करें।
मिलती-जुलती गाइड
- सर्वर कॉन्फ़िगरेशन रेफ़रेंस में
.envकी सारी सेटिंग्स और खास मामलों की पूरी लिस्ट है। - Marinara Engine की समस्याएँ सुलझाना में कनेक्शन की गड़बड़ियाँ, मोबाइल एक्सेस और बाकी बातें दी गई हैं।
- अक्सर पूछे जाने वाले सवाल में दूसरे डिवाइस से Marinara खोलने का छोटा तरीका दिया गया है।