# Fully Booked - Dockerized Deployment के साथ DigitalOcean और Cloudflare

Company: Fully Booked
Service: DevOps इंजीनियरिंग
Period: 2023-04 - 2025-06
Tech: Docker, DigitalOcean, Cloudflare, DNS, SSL Certificates, Caddy
Web: https://fully-booked.uk/
Canonical: https://webanion.com/hi/portfolio/fully-booked-dockerized-deployment-with-digital-ocean-and-cloudflare

Fully Booked, Cloudflare के पीछे एक DigitalOcean ड्रॉपलेट पर पाँच Docker सर्विस के रूप में लॉन्च हुआ, ताकि एक बहुत छोटी टीम भी डिपॉज़िट रखने वाला मार्केटप्लेस चला सके। एक ही रिपॉज़िटरी हर इमेज बनाती थी, एक compose फ़ाइल और एक Makefile रिलीज़ को pull, build और up तक सीमित कर देते थे, सर्टिफ़िकेट और सिक्योरिटी हेडर एक Caddy प्रॉक्सी संभालता था, और हर कोट और इनवॉइस का PDF सर्वर पर Playwright बनाता था। सर्विसें शुरू से अलग-अलग थीं, इसलिए बाद में वे बिना किसी रीबिल्ड के एक सेल्फ़-होस्टेड Kubernetes क्लस्टर पर चली गईं।

## पूरी कहानी

वह इंफ़्रास्ट्रक्चर जिसने जमा राशि लेने वाले एक मार्केटप्लेस को छोटी टीम के साथ, बिना किसी अचानक परेशानी के, पाँच सर्विस चलाने दीं।

### जमा राशि रखने वाला मार्केटप्लेस बंद नहीं हो सकता

<p>Fully Booked ग्राहकों की जमा राशि लेता है, ऑपरेटरों को उनकी कमाई भेजता है और वे दस्तावेज़ पहुँचाता है जिन पर दोनों पक्ष निर्भर हैं। यहाँ आउटेज सिर्फ़ असुविधा नहीं है: जो ग्राहक भुगतान नहीं कर पाता वह कहीं और बुक कर लेता है, और जो ऑपरेटर कोट नहीं खोल पाता वह काम खो देता है।</p><p>प्लेटफ़ॉर्म में पाँच सर्विस हैं, एक कस्टमर साइट, एक ऑपरेटर साइट, एक एडमिन डैशबोर्ड, एक डॉक्यूमेंटेशन साइट और एक बैकएंड, जिन्हें एक बहुत छोटी टीम ने बनाया और संभाला। डिप्लॉयमेंट को इतना सरल होना था कि हाथ से चलाया जा सके, और इतना मज़बूत कि उस पर भरोसा किया जा सके।</p>

### पाँच सर्विस, एक रिपॉज़िटरी, एक कमांड

<p>हर सर्विस एक ही रिपॉज़िटरी से अपनी अलग Docker इमेज के रूप में निकलती है। चारों वेबसाइटें छोटे स्टैटिक सर्वरों में बनती हैं, NestJS बैकएंड GraphQL API संभालता है, और MongoDB व अपलोड की गई फ़ाइलें परसिस्टेंट वॉल्यूम पर रहती हैं। एक compose फ़ाइल उन्हें एक प्राइवेट नेटवर्क पर जोड़ती है, और एक Makefile किसी रिलीज़ को pull, build और up तक समेट देती है।</p>

### आगे Cloudflare, दो सोचे-समझे अपवादों के साथ

<p>Cloudflare हर सबडोमेन का DNS संभालता है और कैशिंग, सर्टिफ़िकेट और सुरक्षा के लिए पब्लिक साइटों को प्रॉक्सी करता है। दो रिकॉर्ड जानबूझकर सीधे रखे गए हैं: ऑपरेटर साइट, ताकि Apple वह फ़ाइल पढ़ सके जिससे लिंक ऐप में खुलते हैं, और API, ताकि Square के पेमेंट वेबहुक बिना रुकावट पहुँचें।</p><p>इनमें से किसी में भी गलती होती तो हर PDF के डीप लिंक टूट जाते या भुगतान की पुष्टि रुक जाती, इसीलिए दोनों को DNS टेबल के साथ दर्ज किया गया है।</p>

### एक रिवर्स प्रॉक्सी जो सुरक्षा का काम करता है

<p>किनारे पर एक Caddy कंटेनर अपने आप सर्टिफ़िकेट जारी करता है, रिस्पॉन्स कंप्रेस करता है, हर www पते को रीडायरेक्ट करता है, API में strict transport, frame और content type हेडर जोड़ता है, और ऐप एसोसिएशन फ़ाइलों को उसी content type के साथ परोसता है जिसकी स्टोर अपेक्षा करते हैं।</p>

### प्रोडक्शन में बनने वाले दस्तावेज़

<p>हर कोटेशन, रद्दीकरण पत्र, इनवॉइस, बुकिंग पुष्टि और ड्राइवर शीट सर्वर पर बैकएंड इमेज के भीतर चलने वाले Playwright से बनती है। प्रोडक्शन कंटेनर के भीतर एक हेडलेस ब्राउज़र इंस्टॉल करवाना पूरे काम का सबसे कठिन हिस्सा था, और इसी की बदौलत कोई ऑपरेटर फ़ोन से कुछ ही सेकंड में एक सुंदर PDF भेज पाता है।</p>

### एक ड्रॉपलेट से एक क्लस्टर तक

<p>शुरुआती चरणों में ड्रॉपलेट ने ही प्लेटफ़ॉर्म को संभाला। जब मासिक बिल और एक अकेली मशीन की सीमाएँ मायने रखने लगीं, तो वही इमेज <a href="/portfolio/fully-booked-zero-downtime-migration-to-self-hosted-kubernetes">बिना किसी डाउनटाइम के एक सेल्फ़-होस्टेड Kubernetes क्लस्टर</a> पर चली गईं, जो इसलिए संभव हुआ क्योंकि उन्हें शुरू से ही स्वतंत्र सर्विस के रूप में बनाया गया था।</p><p>संस्थापक के लिए इसका मतलब था न दोबारा निर्माण, न आउटेज, और ऑपरेटरों व ग्राहकों के लिए कुछ नहीं बदला, सिवाय इसके कि सब चलता रहा। सर्विस की पूरी कहानी <a href="/portfolio/fully-booked-all-in-one-smart-booking-solution">Fully Booked की कहानी</a> में है।</p>
