मिनी PC पर Docker + Cloudflare Tunnel से सेल्फ़ होस्टिंग
घर के एक मिनी PC से कई वेब सर्विस सुरक्षित तरीक़े से पब्लिक करने का तरीक़ा। बिना पोर्ट खोले Cloudflare Tunnel से HTTPS जोड़ते हैं और Docker Compose से चलाते हैं।
मुख्य सारांश
मिनी PC पर Docker Compose से सर्विस चलाएं और Cloudflare Tunnel (cloudflared) से बिना पोर्ट खोले डोमेन और HTTPS जोड़ें। न राउटर सेटिंग चाहिए, न स्टैटिक IP, न सर्टिफ़िकेट रिन्यूअल।
इस पेज पर
क्लाउड का बिल छोटे प्रोजेक्ट के लिए अच्छा-ख़ासा बोझ बन जाता है। मैं यह ब्लॉग समेत कई सर्विस घर के एक मिनी PC पर चलाता हूं। तरीक़ा शेयर कर रहा हूं।
मिनी PC क्यों
- हमेशा चालू रहता है, बिजली का ख़र्च महीने में मामूली
- Docker हो तो डिप्लॉय एनवायरनमेंट क्लाउड जैसा ही
- ट्रैफ़िक बढ़े तो तब शिफ़्ट कर लेंगे
समस्या बस एक है, "घर के नेटवर्क को बाहर सुरक्षित तरीक़े से कैसे खोलें"।
पोर्ट मत खोलिए
पारंपरिक तरीक़ा है राउटर पोर्ट फ़ॉरवर्डिंग + DDNS + सर्टिफ़िकेट रिन्यूअल। झंझट भरा है, और होम नेटवर्क को सीधे इंटरनेट पर खोलने जैसा है, इसलिए ख़तरनाक भी।
इसके बजाय Cloudflare Tunnel इस्तेमाल करते हैं। मिनी PC पर cloudflared Cloudflare की ओर बाहर की तरफ़ कनेक्शन खोलता है, और ट्रैफ़िक उसी टनल से अंदर आता है। बाहर से खुला इनबाउंड पोर्ट 0 है।
사용자 → Cloudflare(HTTPS) → 터널 → 미니 PC 의 컨테이너
- पब्लिक IP और पोर्ट फ़ॉरवर्डिंग की ज़रूरत नहीं
- HTTPS सर्टिफ़िकेट Cloudflare अपने आप संभालता है
- डायनैमिक IP हो तो भी कोई फ़र्क़ नहीं
Docker Compose से सर्विस बांधना
हर सर्विस कंटेनर के रूप में चलाते हैं। Next.js ऐप हो तो output: "standalone" से बिल्ड करके हल्की इमेज बनाते हैं।
services:
blog:
build:
context: .
dockerfile: apps/blog/Dockerfile
container_name: why-next-blog
restart: unless-stopped
networks: [api]
networks:
api:
external: true # cloudflared 와 같은 네트워크
मुख्य बात है cloudflared के साथ एक ही Docker नेटवर्क में रखना। तभी टनल कंटेनर के नाम से सर्विस तक पहुंच पाता है।
डोमेन जोड़ना
Cloudflare डैशबोर्ड (या टनल सेटिंग) में एक Public Hostname जोड़ते हैं।
blog.example.com → http://why-next-blog:3001
बस, हो गया। docker compose up -d --build करें और कुछ मिनट बाद डोमेन पर साइट खुल जाती है।
सार
- मिनी PC + Docker = सस्ता और क्लाउड जैसा ही डिप्लॉयमेंट
- Cloudflare Tunnel से बिना पोर्ट खोले HTTPS और डोमेन
- कंटेनर को cloudflared के साथ एक ही नेटवर्क में रखें
- Public Hostname से
डोमेन → कंटेनर:पोर्टमैपिंग
छोटी सर्विस के लिए यही कॉम्बिनेशन काफ़ी लंबे समय तक चल जाता है। मैं भी इसी तरह कई ऐप चलाते हुए बनाई हुई चीज़ें बढ़ाता जा रहा हूं।
अक्सर पूछे जाने वाले सवाल
घर का IP डायनैमिक है, चलेगा?
बिल्कुल चलेगा। Cloudflare Tunnel में मिनी PC खुद Cloudflare की ओर बाहर की तरफ़ कनेक्शन खोलता है, इसलिए पब्लिक IP, पोर्ट फ़ॉरवर्डिंग या DDNS की बिल्कुल ज़रूरत नहीं।
क्या इसमें ख़र्च आता है?
Cloudflare Tunnel खुद मुफ़्त है। सिर्फ़ डोमेन का ख़र्च हो तो शुरू कर सकते हैं।
संबंधित लेख
- 💻 डेवलपमेंट
एक bucket के मालिक दो हों, तो आखिरी apply करने वाला जीतता है
S3 lifecycle का एक rule जोड़ते ही terraform apply fail हो गया। वजह थी वह structure जिसमें एक ही bucket की lifecycle configuration के मालिक दो resources थे। S3 lifecycle rule स्तर पर नहीं, document स्तर पर चलता है, इसलिए आखिरी विजेता दूसरे के rules चुपचाप मिटा देता है।
- 💻 डेवलपमेंट
Test हरे थे, पर notification एक बार भी नहीं गया था
Queue में job डालने वाला code पहले दिन से हर बार fail हो रहा था। error निगल लिया गया, और mock की बदौलत test हरे रहते थे। एक colon ने तीन feature चुपचाप मार दिए, यह उसी की कहानी है।
- 💻 डेवलपमेंट
अलर्ट आया कि DB मर गया। DB कभी मरा ही नहीं था
एक ही दिन में चार CRITICAL अलर्ट जमा हो गए। 504, Prisma P2028, एडमिन 500, और 'DATABASE सर्विस डाउन'। सबसे पहले RDS मेट्रिक खोले तो 21 घंटे तक CPU अधिकतम 19.7% पर बिल्कुल ठीक चल रहा था। धीमा DB नहीं था, धीमी थी वह राउंड ट्रिप जो एक रिक्वेस्ट में पच्चीस बार अटलांटिक पार करती थी। और 'डाउन' वाला अलर्ट हेल्थ चेक ने ख़ुद ही पैदा किया था।