रिमोट एक्सेस: लॉगिन और IP अलाउलिस्ट

इस गाइड में बताया गया है कि Marinara Engine को किसी दूसरे डिवाइस से कैसे खोलें, जैसे अपने फ़ोन, लैपटॉप या किसी Docker कंटेनर से। इसमें मुख्य विकल्प के रूप में लॉगिन शामिल है। साथ ही IP अलाउलिस्ट, लॉगिन प्रॉक्सी, HTTPS, Admin Access (एडमिन एक्सेस) और "save blocked" वाले CSRF संदेश के बारे में भी बताया गया है। यहाँ की लगभग हर सेटिंग सर्वर की .env फ़ाइल में रहती है, ऐप में नहीं।

इस गाइड में बार-बार आने वाले कुछ शब्द:

Tailscale से कहीं से भी कनेक्ट करना

Tailscale आपके अपने डिवाइस के लिए एक प्राइवेट नेटवर्क है। इससे आप Marinara को अपने फ़ोन या लैपटॉप पर खोल सकते हैं, चाहे आप घर पर हों या बाहर, वह भी अपने राउटर पर पोर्ट खोले बिना या Marinara को सार्वजनिक इंटरनेट पर डाले बिना। जो डिवाइस सीधे Tailscale से जुड़ते हैं, उन पर Marinara भरोसा करता है, इसलिए आपको लॉगिन सेट करने की ज़रूरत नहीं।

  1. Tailscale को उस कंप्यूटर पर इंस्टॉल करें जिस पर Marinara चलता है, और अपने दूसरे डिवाइस पर भी। इसे tailscale.com/download से लें।
  2. दोनों डिवाइस पर एक ही अकाउंट से Tailscale में साइन इन करें।
  3. Marinara को start.sh, start.bat, start-termux.sh या Windows इंस्टॉलर से शुरू करें। ये दूसरे डिवाइस को कनेक्ट होने देते हैं। अगर आप इसकी जगह pnpm start चलाते हैं, तो पहले अपनी .env फ़ाइल में HOST=0.0.0.0 जोड़ें (देखें .env फ़ाइल कहाँ रहती है)।
  4. Marinara वाले कंप्यूटर का Tailscale पता खोजें। उस पर Tailscale ऐप खोलें, या tailscale ip -4 चलाएँ। पता 100. से शुरू होता है, जैसे 100.101.102.103।
  5. अपने दूसरे डिवाइस पर 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 इंस्टॉल दूसरे डिवाइस के कनेक्शन तब तक मना करता है, जब तक एक्सेस कंट्रोल सेट न हो जाए। डिफ़ॉल्ट रूप से सिर्फ़ तीन तरह के क्लाइंट भरोसेमंद माने जाते हैं:

  1. लूपबैक (127.0.0.1 या ::1), यानी वही मशीन जिस पर सर्वर चल रहा है। उसी मशीन पर चल रही रिवर्स प्रॉक्सी या टनल से आगे भेजे गए विज़िटर इसमें नहीं गिने जाते; देखें उसी कंप्यूटर पर रिवर्स प्रॉक्सी और टनल।
  2. आपके tailnet के Tailscale डिवाइस। Tailscale एक प्राइवेट नेटवर्क टूल है और इसके पते 100.64.0.0/10 रेंज में आते हैं।
  3. उसी होस्ट पर चल रहे 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.bat127.0.0.1
start.sh, start.bat, Windows इंस्टॉलर, start-termux.sh0.0.0.0
Docker इमेजकंटेनर के अंदर 0.0.0.0
docker-compose.ymlपोर्ट सिर्फ़ 127.0.0.1 पर पब्लिश करता है

कौन सा विकल्प चुनें

इन्हें क्रम से पढ़ें और जहाँ आपकी बात मिल जाए, वहीं रुक जाएँ।

  1. आप सिर्फ़ सीधे Tailscale से जुड़ते हैं, या सिर्फ़ उसी होस्ट पर चल रहे Docker कंटेनर से। pnpm start के साथ सीधे Tailscale क्लाइंट लॉगिन छोड़ देते हैं; उन्हें सर्वर तक पहुँचने देने के लिए HOST=0.0.0.0 सेट करें। डिफ़ॉल्ट Compose फ़ाइल सिर्फ़ 127.0.0.1 पर पब्लिश करती है। अगर आप पोर्ट को लूपबैक से आगे पब्लिश करते हैं ताकि कोई Tailscale डिवाइस उस तक पहुँच सके, तो पहले लॉगिन सेट करें। तब Docker हर डिवाइस से वह लॉगिन माँगता है, Tailscale डिवाइस भी शामिल, क्योंकि Docker उन्हें गेटवे पते पर देखता है। देखें Tailscale और Docker बायपास।
  2. आप घर के Wi-Fi पर लगे फ़ोन, टैबलेट या लैपटॉप से Marinara खोलना चाहते हैं। लॉगिन सेट करें (नीचे विकल्प 1)।
  3. आप Marinara को सार्वजनिक इंटरनेट पर खोल रहे हैं। लॉगिन सेट करें और HTTPS इस्तेमाल करें।
  4. आपके नेटवर्क पर कोई लॉगिन प्रॉक्सी है, जैसे tinyauth, Authelia या Authentik, जो हर विज़िटर से पहले ही लॉगिन करवा लेती है। लॉगिन प्रॉक्सी (फ़ॉरवर्ड-ऑथ) पढ़ें।

लॉगिन सबसे लचीला विकल्प है। यह किसी भी IP से काम करता है, हर डिवाइस पर अलग सेटअप नहीं माँगता, और हर ब्राउज़र साइन इन रहता है।

विकल्प 1: लॉगिन (यही सुझाया जाता है)

लॉगिन यानी यूज़रनेम और पासवर्ड, जो हर रिमोट डिवाइस को चाहिए। इसे तीन तरीकों से सेट कर सकते हैं:

BASIC_AUTH_USER=alice
BASIC_AUTH_PASS=correct-horse-battery-staple

.env में सेट किया लॉगिन ऐप में सेट किए लॉगिन पर भारी पड़ता है, और उसे आप सिर्फ़ .env में बदलते हैं। .env सेव करें। बदलाव कुछ ही सेकंड में लागू हो जाता है, रीस्टार्ट की ज़रूरत नहीं।

मज़बूत और अनोखा पासवर्ड चुनें। ऐप कम से कम 10 अक्षर माँगता है। रैंडम पासवर्ड इस तरह बना सकते हैं:

openssl rand -base64 24

इसके बाद रिमोट डिवाइस पर ये स्टेप अपनाएँ।

  1. सर्वर के पते से ब्राउज़र में Marinara खोलें, जैसे http://192.168.1.50:7860।
  2. साइन-इन पेज पर अपना यूज़रनेम और पासवर्ड डालें।
  3. ऐप लोड हो जाना चाहिए। ब्राउज़र एक साल तक साइन इन रहता है, जब तक आप उसे साइन आउट न करें। स्क्रिप्ट और 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 बदलता है; यह साइन-इन पेज को नहीं बदलता।

लॉगिन होने पर भी कुछ क्लाइंट को पासवर्ड नहीं देना पड़ता:

ज़रूरी बात: 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 अलाउलिस्ट कैसे काम करती है:

अलाउलिस्ट से ऐसा सेटअप नहीं बनता जिसमें लिस्ट वाले डिवाइस बिना पासवर्ड अंदर जाएँ और बाकी सब लॉगिन करें। अगर आप चाहते हैं कि दूसरे डिवाइस पासवर्ड से लॉगिन करें, तो 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 एड्रेस, भले ही प्रॉक्सी कोई हेडर न जोड़े। इसके बाद वह हर रिक्वेस्ट को वैसा ही रिमोट विज़िटर मानता है, जैसा वह असल में है:

उस मशीन पर 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 दिखता है।

इसे सेट करने से पहले:

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 के साथ।

इसे जोड़ने के दो तरीके हैं।

  1. बिल्ट-इन TLS। सर्वर को सर्टिफ़िकेट और प्राइवेट कुंजी वाली फ़ाइल का पथ दें:
SSL_CERT=/path/to/cert.pem
SSL_KEY=/path/to/key.pem
  1. रिवर्स प्रॉक्सी। Marinara को nginx, Caddy, Traefik या Cloudflare Tunnel के पीछे रखें। प्रॉक्सी HTTPS वाला हिस्सा संभालती है और उसी मशीन पर सादे HTTP से Marinara तक आगे भेज देती है। पहले उसी कंप्यूटर पर रिवर्स प्रॉक्सी और टनल पढ़ें।

SSL_CERT और SSL_KEY सेट करने से पहले सर्टिफ़िकेट और कुंजी बनानी होगी। लोकल इस्तेमाल के लिए mkcert जैसे टूल से, और सार्वजनिक डोमेन के लिए certbot से बना सकते हैं। फ़ाइलें न मिलें या पढ़ी न जा सकें, तो सर्वर शुरू होते ही रुक जाता है और वही पथ बता देता है जिन्हें उसने आज़माया था।

Admin Access और खास अधिकार वाले काम

कुछ काम बाकी से ज़्यादा संवेदनशील हैं: डेटा मिटाना, बैकअप बनाना या डाउनलोड करना, प्रोफ़ाइल इंपोर्ट और एक्सपोर्ट करना, थीम और एजेंट इंस्टॉल करना, और Local Model रनटाइम इंस्टॉल करना। ऊपर चुने गए एक्सेस विकल्प के अलावा इनके लिए एक अलग साझा सीक्रेट भी चाहिए, जिसे एडमिन सीक्रेट कहते हैं।

लूपबैक मशीन पर ये काम आम तौर पर बिना एडमिन सीक्रेट के भी हो जाते हैं। रिमोट डिवाइस से करने के लिए सीक्रेट सेट करना पड़ता है। इसे आप ऐप में बना सकते हैं या .env में सेट कर सकते हैं।

Home स्क्रीन वाले एजेंट जैसे इंस्टॉल किए गए एजेंट के लिए एडमिन सीक्रेट नहीं चाहिए। जिस डिवाइस ने लॉगिन से साइन इन किया है, वह इन्हें इस्तेमाल कर सकता है। किसी एजेंट को इंस्टॉल करने, अपडेट करने और हटाने के लिए यह अब भी चाहिए।

ऐप में एडमिन सीक्रेट बनाना

  1. Marinara चलाने वाले कंप्यूटर पर Settings (सेटिंग्स) खोलें, फिर Advanced टैब, फिर Admin Access सेक्शन खोलें।
  2. Make admin secret पर क्लिक करें। Marinara नया सीक्रेट एक बार दिखाता है और उसे इसी ब्राउज़र में सेव कर देता है।
  3. हर रिमोट डिवाइस पर Settings → Advanced → Admin Access (सेटिंग्स → एडवांस्ड → एडमिन एक्सेस) खोलें, सीक्रेट बॉक्स में टाइप करें, फिर Save पर क्लिक करें। छोटे-बड़े अक्षर, स्पेस और डैश से कोई फ़र्क नहीं पड़ता।

जिस डिवाइस में सीक्रेट पहले से है, वह भी इसे बना सकता है। जो डिवाइस सिर्फ़ लॉगिन से साइन इन है, वह नहीं बना सकता। इससे चुराया गया साइन-इन जोखिम वाले कामों पर कब्ज़ा नहीं कर पाता।

Docker में आपका ब्राउज़र Docker नेटवर्क के ज़रिए Marinara तक पहुँचता है, इसलिए Marinara उसे उसी कंप्यूटर जैसा नहीं मानता। इसकी जगह पहला सीक्रेट .env में सेट करें (नीचे देखें)।

सीक्रेट बदलने के लिए Replace admin secret पर क्लिक करें। पुराना सीक्रेट हर डिवाइस पर काम करना बंद कर देता है। इसे बंद करना हो, तो Remove admin secret पर क्लिक करें। Marinara सीक्रेट का सिर्फ़ एक फ़िंगरप्रिंट रखता है, जो डेटा फ़ोल्डर में .admin-secret.json में रहता है। वह फ़ाइल मिटाने से भी सीक्रेट हट जाता है।

.env में एडमिन सीक्रेट सेट करना

  1. .env में कोई मज़बूत रैंडम वैल्यू सेट करके सेव करें। यह कुछ ही सेकंड में लागू हो जाती है, रीस्टार्ट की ज़रूरत नहीं।
ADMIN_SECRET=some-long-random-string
  1. रिमोट डिवाइस पर Settings → Advanced → Admin Access खोलें।
  2. वही वैल्यू बॉक्स में पेस्ट करें (उसका प्लेसहोल्डर ADMIN_SECRET है), फिर Save पर क्लिक करें।
  3. Admin secret saved for this browser संदेश दिखना चाहिए।

.env का ADMIN_SECRET ऐप में बने सीक्रेट पर भारी पड़ता है। जब तक यह सेट है, Admin Access यही बताता है, और सीक्रेट आप सिर्फ़ .env में बदलते हैं।

जानने लायक बातें

अगर रिमोट डिवाइस पर खास अधिकार वाला कोई काम नाकाम हो जाए, तो Marinara दो उपाय बताने वाला एरर संदेश दिखाता है। एक उपाय है ऐप को localhost से खोलना। दूसरा है ऊपर बताए तरीके से एडमिन सीक्रेट सेट करना।

मेरा सेव ब्लॉक क्यों हो रहा है (CSRF)

CSRF का मतलब है cross-site request forgery। यह एक सुरक्षा उपाय है जो आपके ब्राउज़र में खुली किसी दूसरी वेबसाइट को आपकी इजाज़त के बिना Marinara में चुपचाप बदलाव करने से रोकता है। यह अपने आप चलता है। इसे चालू करने की कोई सेटिंग नहीं है।

कई बार CSRF आपके अपने सेव भी रोक देता है। ऐसा आम तौर पर तब होता है जब आप Marinara को किसी सार्वजनिक डोमेन नाम से या ऐसे असामान्य पोर्ट से खोलते हैं जिस पर सर्वर को अभी भरोसा नहीं है। ऐसा होने पर दो चीज़ें आपको इसकी जानकारी देती हैं।

इसे ठीक करने के लिए .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 खोलने के लिए:

  1. जाँच लें कि .env में HOST=0.0.0.0 लगा है, ताकि सर्वर सभी इंटरफ़ेस पर सुने।
  2. लॉगिन सेट करें (ऊपर विकल्प 1)। फ़ोन से आप यह उसी पेज पर कर सकते हैं जो आपको रोकता है, सर्वर लॉग के सेटअप कोड के साथ।
  3. सर्वर वाली मशीन का लोकल IP पता खोजें (जैसे 192.168.1.50)।
  4. फ़ोन पर ब्राउज़र में http://192.168.1.50:7860 खोलें। डिफ़ॉल्ट पोर्ट 7860 है।
  5. अपने यूज़रनेम और पासवर्ड से साइन इन करें।

अगर पेज लोड ही नहीं होता, तो शायद सर्वर तक पहुँच ही नहीं बन रही। HOST=0.0.0.0 और PORT की वैल्यू जाँच लें। इसकी जगह 403 मिले, तो आपका डिवाइस सर्वर तक पहुँच तो रहा है, पर उसे अभी अंदर आने की इजाज़त नहीं है। ऊपर चुना हुआ विकल्प दोबारा देखें।

अपडेट के बाद लॉक आउट हो जाना

नए वर्शन में अगर कोई विज़िट रिवर्स प्रॉक्सी, टनल, Tailscale Serve या Tailscale Funnel से आती है, तो लॉगिन माँगा जाता है। पुराने वर्शन ऐसी विज़िट को बिना पासवर्ड के अंदर आने देते थे। अगर अब आपको लॉगिन पेज, सेटअप पेज या 403 दिख रहा है, तो यही वजह है।

अपग्रेड नोट: अगर आप Tailscale Serve या उसी कंप्यूटर की किसी दूसरी प्रॉक्सी इस्तेमाल करते हैं और आपने कभी पासवर्ड सेट नहीं किया, तो अपडेट के बाद आपके दूसरे डिवाइस लॉक आउट हो जाते हैं। उसी कंप्यूटर की प्रॉक्सी आम तौर पर ऐसे सर्वर से बात करती है जो सिर्फ़ लूपबैक पर सुनता है, इसलिए सर्वर कोई सेटअप कोड नहीं छापता। इसके बजाय लॉगिन उसी कंप्यूटर पर सेट करें जिस पर Marinara चलता है।

वापस अंदर आने के लिए:

  1. जिस कंप्यूटर पर 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 में, या ऐसा ब्राउज़र इस्तेमाल करें जो अब भी साइन इन है।
  2. Settings → Advanced → Access में जाएँ और Remote login के नीचे यूज़रनेम और पासवर्ड सेट करें। या उसी कंप्यूटर पर .env फ़ाइल खोलें और BASIC_AUTH_USER और BASIC_AUTH_PASS सेट करें। अगर IP_ALLOWLIST सेट है, तो उसमें अपने दूसरे डिवाइस का पता जोड़ें या उसे हटा दें, क्योंकि लिस्ट में न होने वाले डिवाइस को लॉगिन के साथ भी 403 मिलता है।
  3. अपने दूसरे डिवाइस से उसी यूज़रनेम और पासवर्ड से साइन इन करें।

सर्च इंजन

Marinara सर्च इंजन से अनुरोध करता है कि वे उसके पेज इंडेक्स न करें (X-Robots-Tag: noindex, nofollow)। इससे आपका इंस्टॉलेशन सुरक्षित नहीं होता, और जो पेज पहले से इंडेक्स हो चुके हैं, वे हटते भी नहीं हैं। अपने इंस्टॉलेशन को निजी रखने के लिए ऊपर बताए गए एक्सेस कंट्रोल इस्तेमाल करें।

मिलती-जुलती गाइड