- स्टेट प्रबंधन — Terraform स्टेट संग्रहीत करने के लिए उपयोग किए जाने वाले S3 bucket को बूटस्ट्रैप करता है।
- EKS अवसंरचना — VPC, सबनेट्स, NAT gateways, IAM भूमिकाएँ, और EKS क्लस्टर और managed node groups प्रोविज़न करता है।
- स्टोरेज और लोड बैलेंसिंग — स्थायी volumes के लिए EBS CSI driver और ALB ingress के लिए AWS Load Balancer Controller तैनात करता है।
- Karpenter Autoscaling — Spot instance समर्थन और SQS और EventBridge के माध्यम से interruption handling के साथ गतिशील node प्रोविज़निंग स्थापित करता है।
- KEDA Autoscaling — CPU और मेमोरी सीमाओं के आधार पर pod-स्तरीय autoscaling के लिए KEDA तैनात करता है।
- डेटा सेवाएँ — Supabase (सेल्फ़-होस्टेड या Cloud), ElastiCache Redis, और Amazon MQ RabbitMQ प्रोविज़न करता है।
- Odin सेवाएँ — Helm के माध्यम से EKB एप्लिकेशन स्टैक (Web, FastAPI, Celery, Automator) तैनात करता है।
- SigNoz अवलोकन — SigNoz और k8s-infra agent के माध्यम से वितरित tracing, मेट्रिक्स और लॉग एकत्रीकरण तैनात करता है।
- अंतिम तैनाती — किसी भी शेष संसाधनों को समायोजित करने के लिए पूर्ण
terragrunt applyचलाता है।
<YOUR_*> placeholders भरे गए हैं। कई मान — जिनमें VPC ID, EKS क्लस्टर endpoint, और Redis और RabbitMQ endpoints शामिल हैं — केवल विशिष्ट चरण पूरे होने के बाद उपलब्ध हैं, इसलिए गाइड में ठीक बताया गया है कि उन्हें कब कैप्चर और लागू करना है।
पूर्व आवश्यकताएँ
- उपयुक्त अनुमतियों के साथ कॉन्फ़िगर किया गया AWS CLI
- Terraform (>= 1.0)
- Terragrunt (नवीनतम संस्करण)
- Kubernetes प्रबंधन के लिए
kubectl - Helm chart प्रबंधन के लिए
helm
स्थापना गाइड
Terragrunt स्थापित करें
macOS (Homebrew)kubectl स्थापित करें
macOS (Homebrew)Helm स्थापित करें
macOS (Homebrew)इंस्टॉलेशन सत्यापित करें
AWS CLI कॉन्फ़िगरेशन
एक नया वातावरण बनाएँ
चरण 1: वातावरण टेम्पलेट कॉपी करें
env-template-folder में <YOUR_*> placeholders के साथ पूर्व-संरचित फ़ाइलें हैं जो भरने के लिए तैयार हैं। अपना नया वातावरण फ़ोल्डर बनाने के लिए इसे पूरी तरह से कॉपी करें।
चरण 2: सत्यापित करें कि सभी Placeholders मौजूद हैं
<YOUR_*> परंपरा का पालन करते हैं। नीचे दिए गए चरण फ़ाइल-दर-फ़ाइल इन्हें भरने की व्याख्या करते हैं।
चरण 3: SSL प्रमाणपत्र प्रोविज़न करें (AWS ACM)
वातावरण चर सेट करने से पहले आपको प्रमाणपत्र ARNs चाहिए। अपने वातावरण द्वारा सेव किए जाने वाले सभी डोमेन के लिए AWS Certificate Manager (ACM) में SSL प्रमाणपत्र अनुरोध करने के लिए AWS Console का उपयोग करें। विकल्प A: एकल वाइल्डकार्ड प्रमाणपत्र (अनुशंसित) एकल वाइल्डकार्ड प्रमाणपत्र एक ARN से सभी subdomains को कवर करता है। उदाहरण के लिए, यदि आपका आधार डोमेनapp.example.com है, तो एकल *.app.example.com प्रमाणपत्र कवर करता है:
विकल्प B: प्रति-सेवा प्रमाणपत्र
यदि आप वाइल्डकार्ड का उपयोग नहीं कर सकते तो प्रति डोमेन एक प्रमाणपत्र अनुरोध करें। प्रत्येक डोमेन के लिए नीचे दिए गए चरण दोहराएँ:
<YOUR_WEB_DOMAIN>, <YOUR_API_DOMAIN>, <YOUR_AUTOMATOR_DOMAIN>, <YOUR_SUPABASE_DOMAIN> (केवल यदि ENABLE_SUPABASE=true), <YOUR_SIGNOZ_DOMAIN> (केवल यदि ENABLE_SIGNOZ=true)।
AWS Console में प्रमाणपत्र अनुरोध करना
- AWS Certificate Manager console खोलें
- सही क्षेत्र पर स्विच करें (ऊपरी-दाएँ) —
<YOUR_AWS_REGION>से मेल खाना चाहिए - Request a certificate क्लिक करें → Request a public certificate → Next
- Fully qualified domain name के अंतर्गत, वाइल्डकार्ड दर्ज करें (जैसे
*.app.example.com) या एक विशिष्ट डोमेन - Validation method को DNS validation सेट करें
- Request क्लिक करें — प्रमाणपत्र
Pending validationस्थिति में बनाया जाता है
यदि आपका DNS provider आवश्यकता रखता है तो CNAME मानों के अंत में trailing dot (
.) शामिल करें।- Cloudflare में लॉग इन करें → अपना डोमेन चुनें → DNS पर जाएँ → Records → Add record
- Type को
CNAMEसेट करें - ACM CNAME नाम को Name में और ACM CNAME मान को Target में पेस्ट करें
- Proxy status को DNS only (ग्रे क्लाउड आइकन) सेट करें — प्रमाणपत्र Cloudflare प्रॉक्सी के माध्यम से सत्यापित नहीं होगा
- Save क्लिक करें
- Route 53 console खोलें → Hosted zones → अपना ज़ोन चुनें → Create record
- Record type को
CNAMEसेट करें - ACM CNAME नाम को Record name (केवल subdomain भाग) में और मान को Value में पेस्ट करें
- TTL को
300सेट करें और Create records क्लिक करें
arn:aws:acm:<region>:<account-id>:certificate/<uuid> जैसा दिखता है। अगले चरण के लिए ARN(s) सुरक्षित रखें।
चरण 4: वातावरण चर सेट करें
कोई भी Terragrunt कमांड चलाने से पहले ये shell वातावरण चर सेट करें। इन्हेंterragrunt.hcl में get_env() कॉल्स द्वारा सीधे पढ़ा जाता है।
Spot Instances और स्टेटफुल वर्कलोड
Spot instances को पर्यावरण चरों के माध्यम से नहीं, बल्किvalues/karpenter.yaml में प्रति NodePool कॉन्फ़िगर किया जाता है। प्रत्येक NodePool अपनी क्षमता रणनीति घोषित करता है:
application NodePool m/c instance families (पीढ़ी 5+) का उपयोग केवल On-Demand के साथ करता है। Supabase सेवा pods nodeSelector: workload-type: "application" के माध्यम से यहाँ पिन किए जाते हैं ताकि यह गारंटी दी जा सके कि उन्हें कभी Spot पुनःप्राप्ति घटना से बाधित नहीं किया जाएगा।
database-dedicated NodePool कभी Spot का उपयोग नहीं करता। यह consolidationPolicy: WhenEmpty का उपयोग करता है ताकि Karpenter उस node को निकाले नहीं जिस पर अभी भी एक चलता हुआ pod है, जिससे PostgreSQL और CloudNativePG replicas जैसे स्टेटफुल वर्कलोड के लिए सुरक्षित हो।
Spot पर स्टेटफुल एप्लिकेशन के लिए दिशानिर्देश:
- Spot NodePools पर databases, स्थायी queues, या
PersistentVolumeClaimवाले किसी भी pod को शेड्यूल न करें। node-type: database-dedicatedको लक्षित करने वालेnodeSelectorऔर मिलानdatabase-workload: "true"toleration का उपयोग database pods के लिए करें।- उन उपयोगकर्ता-सामने की रहित सेवाओं के लिए
nodeSelector: workload-type: "application"का उपयोग करें जिन्हें बिना बाधा के उपलब्ध रहना चाहिए। - पृष्ठभूमि वर्कलोड (Web, API, Celery, Automator) के लिए,
generalSpot NodePool उपयुक्त है — Karpenter का SQS interruption handler AWS द्वारा पुनःप्राप्ति से पहले Spot nodes को सुरक्षित रूप से drain करता है, और KEDA की न्यूनतम रेप्लिका गणना (≥ 2) node प्रतिस्थापन के दौरान उपलब्धता सुनिश्चित करती है। - Spot को वैश्विक रूप से अक्षम करने के लिए,
values/karpenter.yamlमें प्रत्येक NodePool के values list से"spot"हटा दें।
terragrunt.hcl में karpenter ब्लॉक में कॉन्फ़िगर किया गया है:
चरण 5: वातावरण-विशिष्ट फ़ाइल मान अपडेट करें
नए env फ़ोल्डर में सभी फ़ाइलों में निम्नलिखित placeholders के लिए ढूँढें और बदलें:5.1 terragrunt.hcl — मुख्य क्लस्टर कॉन्फ़िगरेशन
5.2 state/terragrunt.hcl — S3 स्टेट bucket
5.3 values/infrastructure.yaml — AWS Load Balancer Controller
5.4 values/karpenter-values.yaml — Karpenter controller
5.5 values/karpenter-nodeclasses.yaml — Karpenter node classes
5.6 values/aws-ebs-csi-driver.yaml — EBS CSI Driver
5.7 values/karpenter.yaml — Karpenter NodePools
Node class names (
general, compute-intensive, memory-intensive, gpu, database) karpenter-nodeclasses.yaml में entries से मेल खाने चाहिए।
5.8 values/keda.yaml — KEDA Autoscaler
कोई वातावरण-विशिष्ट placeholders आवश्यक नहीं। संसाधन सीमाएँ और रेप्लिका गणनाएँ उचित डिफ़ॉल्ट्स के साथ पूर्व-कॉन्फ़िगर की गई हैं। समीक्षा करें और आवश्यकतानुसार समायोजित करें।
5.9 values/supabase.yaml — Supabase एप्लिकेशन (केवल यदि ENABLE_SUPABASE=true)
5.10 values/ha-supabase-db.yaml — Supabase HA Database (केवल यदि ENABLE_HA_SUPABASE_DB=true)
Storage class (
ebs-csi-gp2), instance गणनाएँ, और संसाधन सीमाएँ पूर्व-कॉन्फ़िगर हैं। अपनी अपेक्षित डेटा मात्रा के अनुसार postgres.storage.size और postgres.walStorage.size समायोजित करें।
5.11 values/cloudnative-pg.yaml — CloudNativePG Operator (केवल यदि ENABLE_CNPG=true)
कोई वातावरण-विशिष्ट placeholders आवश्यक नहीं। यह केवल CNPG operator controller तैनात करता है। डिफ़ॉल्ट सेटिंग्स (3 रेप्लिकास, संसाधन सीमाएँ) अधिकांश वातावरण के लिए उपयुक्त हैं।
5.12 values/odin-services.yaml — Odin एप्लिकेशन सेवाएँ
Supabase (
dataServiceConfig) — सेल्फ़-होस्टेड (ENABLE_SUPABASE=true):
Supabase (
dataServiceConfig) — Supabase Cloud (ENABLE_SUPABASE=false):
Redis:
ENABLE_SUPABASE=true):
वेब फ़्रंटएंड Supabase keys — Supabase Cloud (
ENABLE_SUPABASE=false):
5.13 values/signoz.yaml — SigNoz अवलोकन (केवल यदि ENABLE_SIGNOZ=true)
5.14 values/signoz-k8s-infra.yaml — SigNoz K8s मेट्रिक्स (केवल यदि ENABLE_SIGNOZ=true)
OTel collector endpoint (
signoz-otel-collector.monitoring.svc.cluster.local:4317) यह मानकर पूर्व-कॉन्फ़िगर किया गया है कि SigNoz और k8s-infra दोनों monitoring namespace में तैनात हैं। जब तक आप कस्टम release name का उपयोग नहीं करते, कोई बदलाव आवश्यक नहीं।
तैनाती क्रम अनुस्मारक
कुछ मान केवल कुछ अवसंरचना के तैनात होने के बाद उपलब्ध हैं। इस क्रम का पालन करें:- किसी भी तैनाती से पहले — सेट करें:
<YOUR_ENV_NAME>,<YOUR_AWS_REGION>,<YOUR_AWS_ACCOUNT_ID>,<YOUR_ENVIRONMENT>,<YOUR_PROJECT>,<YOUR_VPC_CIDR>, सभी डोमेन नाम, सभी प्रमाणपत्र ARNs, सभी Supabase मान,<YOUR_TOOLKIT_ENCRYPTION_KEY>, RabbitMQ username/password - EKS क्लस्टर बनाने के बाद — सेट करें:
<YOUR_VPC_ID>(infrastructure.yaml),<YOUR_EKS_CLUSTER_ENDPOINT>(karpenter-values.yaml) - AWS सेवाओं के लिए
terraform applyके बाद — सेट करें:<YOUR_REDIS_HOST>,<YOUR_RABBITMQ_HOST>(odin-services.yaml)
चरण 6: सत्यापित करें कि कोई Placeholders शेष नहीं हैं
चरण 1: स्टेट प्रबंधन सेटअप
उद्देश्य: Terraform स्टेट के लिए S3 bucket निर्माण। प्रत्येक वातावरण का स्टेट प्रबंधन मॉड्यूलodin-terraform-state-{environment-name} पैटर्न के साथ S3 bucket बनाता है, एन्क्रिप्शन, वर्शनिंग और पब्लिक एक्सेस ब्लॉकिंग कॉन्फ़िगर करता है, और स्टेट मॉड्यूल के लिए स्थानीय स्टेट का उपयोग करता है (बूटस्ट्रैप पैटर्न)।
चरण 2: EKS अवसंरचना तैनाती
उद्देश्य: मुख्य नेटवर्किंग (VPC, सबनेट्स, NAT gateway), IAM भूमिकाएँ और नीतियाँ, EKS क्लस्टर और managed node groups।2.1 ड्राई रन — EKS अवसंरचना
मुख्य अवसंरचनाकस्टम / निजी Docker Registry का उपयोग करना
डिफ़ॉल्ट रूप से, EKB imagesregcred नामक secret का उपयोग करके Docker Hub से पुल किए जाते हैं। यदि ग्राहक अलग registry में images होस्ट करता है, तो odin-services तैनात करने से पहले इन चरणों का पालन करें।
चरण 1 — लक्षित namespace में imagePullSecret बनाएँ
values/odin-services.yaml में secret नाम सेट करें
2.2 EKS अवसंरचना तैनात करें
चरण 1: मुख्य अवसंरचनाचरण 3: स्टोरेज और लोड बैलेंसिंग
उद्देश्य: स्थायी volumes के लिए EBS CSI driver, managed node group पर चलने वाला AWS Load Balancer Controller।3.1 ड्राई रन — स्टोरेज और लोड बैलेंसिंग
EBS CSI Driver3.2 स्टोरेज और लोड बैलेंसिंग तैनात करें
चरण 1: EBS CSI Driverचरण 4: Karpenter Autoscaling
उद्देश्य: Karpenter के लिए IAM भूमिकाएँ, Spot interruption handling, Karpenter controller और node pools।4.1 ड्राई रन — Karpenter
Karpenter IAM संसाधनterragrunt.hcl में सक्षम)
Plan के दौरान एक अपेक्षित त्रुटि दिखाई दे सकती है:
API did not recognize GroupVersionKind from manifest (CRD may not be installed). इसे अनदेखा करना सुरक्षित है — Kubernetes CRDs स्थापित होने से पहले plan समय पर लाइव API के विरुद्ध संसाधनों को सत्यापित करता है।4.2 Karpenter तैनात करें
चरण 1: Karpenter IAM संसाधनterragrunt.hcl में सक्षम)
चरण 5: KEDA Autoscaling
उद्देश्य: एप्लिकेशन-स्तरीय autoscaling के लिए KEDA।5.1 ड्राई रन — KEDA
5.2 KEDA तैनात करें
चरण 6: डेटा सेवाएँ
उद्देश्य: Supabase (डेटाबेस), ElastiCache (Redis), RabbitMQ (मैसेज क्यू)।पहले CloudNativePG operator तैनात करें, फिर HA Supabase DB क्लस्टर, फिर Supabase एप्लिकेशन। DB क्लस्टर Supabase शुरू होने से पहले तैयार होना चाहिए।
6.1 ड्राई रन — डेटा सेवाएँ
चरण 1: CloudNativePG operator (यदि सक्षम)6.2 डेटा सेवाएँ तैनात करें
चरण 1: CloudNativePG operator (यदि सक्षम)values/odin-services.yaml में SUPABASE_POSTGRES_HOST मान और values/supabase.yaml में secret.db.postgresHost के रूप में pooler ClusterIP (या यदि LoadBalancer हो तो EXTERNAL-IP) का उपयोग करें।
चरण 3: Supabase एप्लिकेशन (यदि सक्षम)
सभी Supabase सेवा pods Spot interruptions को रोकने के लिए केवल Karpenter application NodePool (केवल On-Demand) पर चलते हैं।
चरण 7: Odin सेवाएँ
उद्देश्य: Helm के माध्यम से एप्लिकेशन तैनाती।तैनात करने से पहले, प्रारंभिक डेटाबेस माइग्रेशन रन के लिए
fastapiBackend को अस्थायी रूप से एकल रेप्लिका तक स्केल-डाउन करें — replicaCount: 1, workers: 1, और keda.minReplicas: 1 सेट करें। एक बार माइग्रेशन सफलतापूर्वक पूरा हो जाने पर, पुनः-तैनाती से पहले इन मानों को उनके उत्पादन डिफ़ॉल्ट्स में वापस करें।7.1 ड्राई रन — Odin सेवाएँ
7.2 Odin सेवाएँ तैनात करें
चरण 8: SigNoz अवलोकन
उद्देश्य: लॉग्स और मेट्रिक्स निगरानी।8.1 ड्राई रन — SigNoz Charts
8.2 SigNoz Charts तैनात करें
चरण 9: अंतिम तैनाती
9.1 पूर्ण तैनाती
9.2 तैनाती सत्यापित करें
समस्या निवारण
स्टेट लॉक समस्याएँसफ़ाई
निगरानी और लॉगिंग
क्विक रेफ़रेंस — सभी तैनाती कमांड्स
अपने वास्तविक वातावरण नाम से
your-env-name को पूरी तरह से बदलें। हमेशा बदलाव लागू करने से पहले अपनी कॉन्फ़िगरेशन सत्यापित करने के लिए ड्राई रन्स (terragrunt plan) पहले चलाएँ।