# Fully Booked - Docker এবং DigitalOcean এবং Cloudflare সহ ডিপ্লয়মেন্ট

Company: Fully Booked
Service: ডেভঅপস ইঞ্জিনিয়ারিং
Period: 2023-04 - 2025-06
Tech: Docker, DigitalOcean, Cloudflare, DNS, SSL Certificates, Caddy
Web: https://fully-booked.uk/
Canonical: https://webanion.com/bn/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>প্রতিটি সাবডোমেইনের DNS রাখে Cloudflare, আর ক্যাশিং, সার্টিফিকেট ও সুরক্ষার জন্য পাবলিক সাইটগুলোকে প্রক্সি করে। দুটি রেকর্ড ইচ্ছা করেই সরাসরি রাখা হয়েছে: অপারেটর সাইট, যাতে 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>
