{"id":26924,"date":"2026-07-18T18:54:36","date_gmt":"2026-07-18T18:54:36","guid":{"rendered":"https:\/\/umang.pk\/2026\/07\/18\/%d8%a7%d9%86%d8%af%d8%b1%d9%88%d9%86%db%8c-%da%88%d9%88%db%8c%d9%84%d9%be%d8%b1-%d9%be%d9%84%db%8c%d9%b9-%d9%81%d8%a7%d8%b1%d9%85-%da%a9%db%8c%d8%b3%db%92-%d8%a8%d9%86%d8%a7%db%8c%d8%a7-%d8%ac%d8%a7\/"},"modified":"2026-07-18T18:54:36","modified_gmt":"2026-07-18T18:54:36","slug":"%d8%a7%d9%86%d8%af%d8%b1%d9%88%d9%86%db%8c-%da%88%d9%88%db%8c%d9%84%d9%be%d8%b1-%d9%be%d9%84%db%8c%d9%b9-%d9%81%d8%a7%d8%b1%d9%85-%da%a9%db%8c%d8%b3%db%92-%d8%a8%d9%86%d8%a7%db%8c%d8%a7-%d8%ac%d8%a7","status":"publish","type":"post","link":"https:\/\/umang.pk\/en_us\/2026\/07\/18\/%d8%a7%d9%86%d8%af%d8%b1%d9%88%d9%86%db%8c-%da%88%d9%88%db%8c%d9%84%d9%be%d8%b1-%d9%be%d9%84%db%8c%d9%b9-%d9%81%d8%a7%d8%b1%d9%85-%da%a9%db%8c%d8%b3%db%92-%d8%a8%d9%86%d8%a7%db%8c%d8%a7-%d8%ac%d8%a7\/","title":{"rendered":"\u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0688\u0648\u06cc\u0644\u067e\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06a9\u06cc\u0633\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2: \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c\u060c \u0622\u0631\u06af\u0648 \u0633\u06cc \u0688\u06cc\u060c \u0627\u0648\u0631 \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u06af\u0627\u0626\u06cc\u0688"},"content":{"rendered":"\n<div id=\"\">\n<p>\u06c1\u0631 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u062a\u0631\u0642\u06cc \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0679\u06cc\u0645 \u0622\u062e\u0631 \u06a9\u0627\u0631 \u0627\u06cc\u06a9 \u06c1\u06cc \u062f\u06cc\u0648\u0627\u0631 \u0633\u06d2 \u0679\u06a9\u0631\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u06a9\u0679 \u062c\u0645\u0639 \u06a9\u0631\u0648\u0627\u0626\u06cc\u06ba\u06d4 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 \u0627\u0633\u06d2 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u062f\u0648 \u06c1\u0641\u062a\u0648\u06ba \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0645\u0627\u062d\u0648\u0644 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2. \u067e\u0686\u06be\u0644\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0627 \u0645\u0634\u0627\u06c1\u062f\u0627\u062a\u06cc \u0627\u0633\u0679\u06cc\u06a9 \u063a\u0627\u0626\u0628 \u062a\u06be\u0627 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633\u06d2 \u067e\u0686\u06be\u0644\u06d2 \u0645\u0627\u062d\u0648\u0644 \u0633\u06d2 \u0642\u062f\u0631\u06d2 \u0645\u062e\u062a\u0644\u0641 \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u060c \u0646\u0627\u0645 \u062f\u06cc\u0646\u06d2 \u06a9\u06d2 \u06a9\u0646\u0648\u0646\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0648 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0633\u06cc\u0679 \u0627\u067e \u0633\u06d2 \u0645\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06be\u0627\u062a\u0627 \u062a\u06be\u0627\u06d4 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06cc\u0627 \u06af\u06cc\u0627\u06d4 \u06a9\u0686\u06be \u0679\u0648\u0679 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06a9\u0648\u0626\u06cc \u0646\u06c1\u06cc\u06ba \u062c\u0627\u0646\u062a\u0627 \u06a9\u06cc\u0648\u06ba\u061f<\/p>\n<p>\u0645\u0633\u0626\u0644\u06c1 \u0679\u06a9\u0679 \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u0627 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0645\u0633\u0626\u0644\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0648\u0626\u06cc \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u062f\u0648\u0633\u0631\u06d2 \u0644\u0641\u0638\u0648\u06ba \u0645\u06cc\u06ba\u060c \u06cc\u06c1 \u0627\u06cc\u06a9 \u067e\u06a9\u06cc \u0633\u0691\u06a9 \u06c1\u06d2 \u062c\u0648 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0648 \u06c1\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0645\u0633\u062a\u0642\u0644\u060c \u0642\u0627\u0628\u0644 \u0633\u0645\u0627\u0639\u062a\u060c \u0627\u0648\u0631 \u0645\u062d\u0641\u0648\u0638 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631\u060c \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u0648\u06ba \u0627\u0648\u0631 \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u0633\u06cc\u0644\u0641 \u0633\u0631\u0648\u0633 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0688\u0648\u06cc\u0644\u067e\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 (IDP) \u0627\u0633 \u0645\u0633\u0626\u0644\u06d2 \u06a9\u0648 \u062d\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u0635\u0648\u06cc\u0631 \u0633\u06d2 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0632 \u06a9\u0648 \u06c1\u0679\u0627 \u06a9\u0631 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0628\u0644\u06a9\u06c1 \u0627\u0646 \u06a9\u06d2 \u06a9\u0627\u0645 \u06a9\u0648 \u0627\u0646\u0641\u0631\u0627\u062f\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u067e\u0631 \u0639\u0645\u0644 \u062f\u0631\u0622\u0645\u062f \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0627\u06cc\u0633\u06d2 \u0646\u0638\u0627\u0645\u0648\u06ba \u06a9\u06cc \u062a\u0639\u0645\u06cc\u0631 \u0645\u06cc\u06ba \u0645\u0646\u062a\u0642\u0644 \u06a9\u0631 \u06a9\u06d2 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0648 \u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u06cc\u06c1 \u06c1\u06cc\u0646\u0688 \u0628\u06a9 \u062a\u06cc\u0646 CNCF \u0679\u0648\u0644\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06af\u0631\u06cc\u0688 IDPs \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2 \u062c\u0648 2026 \u0645\u06cc\u06ba \u0627\u0633 \u06a9\u0627 \u0628\u0646\u06cc\u0627\u062f\u06cc \u062d\u0635\u06c1 \u0628\u0646\u06cc\u06ba \u06af\u06d2: \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c\u060c \u0627\u06cc\u06a9 \u0688\u0648\u06cc\u0644\u067e\u0631 \u067e\u0648\u0631\u0679\u0644 \u0627\u0648\u0631 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u06a9\u06cc\u0679\u0644\u0627\u06af\u060c ArgoCD\u060c \u0627\u06cc\u06a9 GitOps \u0645\u0633\u0644\u0633\u0644 \u0688\u06cc\u0644\u06cc\u0648\u0631\u06cc \u0627\u0646\u062c\u0646\u060c \u0627\u0648\u0631 Crossplane\u060c Kubernetes \u067e\u0631 \u0645\u0628\u0646\u06cc \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0637\u06cc\u0627\u0631\u06c1\u06d4<\/p>\n<p>\u0628\u0627\u0644\u0622\u062e\u0631\u060c \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u067e\u0631 \u0645\u0648\u062c\u0648\u062f \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0644\u0627\u0624\u0688 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u0633\u0679\u06cc\u062c\u0646\u06af \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0679\u06a9\u0679 \u062c\u0645\u0639 \u06a9\u0631\u0627\u0626\u06d2 \u0628\u063a\u06cc\u0631 \u06a9\u06cc\u0679\u0644\u0627\u06af \u0645\u06cc\u06ba \u0646\u0626\u06cc \u200b\u200b\u062e\u062f\u0645\u0627\u062a \u06a9\u0648 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-what-youll-learn\">\u062c\u0648 \u0622\u067e \u0633\u06cc\u06a9\u06be\u06cc\u06ba \u06af\u06d2\u06d4<\/h2>\n<ul>\n<li>\n<p>\u062a\u06cc\u0646 \u062f\u0631\u062c\u06d2 \u06a9\u0627 IDP \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0627\u0648\u0631 \u06a9\u06cc\u0648\u06ba \u06c1\u0631 \u067e\u0631\u062a \u06a9\u0648 \u0627\u06cc\u06a9 \u0645\u062e\u0635\u0648\u0635 \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u0644\u0627\u06af\u0648 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0645\u0644\u0679\u06cc \u0627\u0646\u0648\u0627\u0626\u0631\u0645\u0646\u0679 GitOps \u067e\u0631\u0648\u0648\u06cc\u0698\u0646\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 ApplicationSets \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 ArgoCD \u06a9\u0648 \u0627\u0646\u0633\u0679\u0627\u0644 \u0627\u0648\u0631 \u06a9\u0646\u0641\u06cc\u06af\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u0627 \u0637\u0631\u06cc\u0642\u06c1<\/p>\n<\/li>\n<li>\n<p>Kubernetes \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0644\u0627\u0624\u0688 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0634\u0646\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0633\u06d2 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u06a9\u06cc\u0679\u0644\u0627\u06af \u0627\u0648\u0631 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u062a\u0639\u06cc\u0646\u0627\u062a \u0627\u0648\u0631 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c\u060c \u0622\u0631\u06af\u0648 \u0633\u06cc \u0688\u06cc\u060c \u0627\u0648\u0631 \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0648 \u0627\u06cc\u06a9 \u06c1\u06cc \u0633\u06cc\u0644\u0641 \u0633\u0631\u0648\u0633 \u0633\u0646\u06c1\u0631\u06cc \u0631\u0627\u0633\u062a\u06d2 \u0633\u06d2 \u06a9\u06cc\u0633\u06d2 \u062c\u0648\u0691\u06cc\u06ba<\/p>\n<\/li>\n<li>\n<p>IDP \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u0627\u06af\u062a \u06a9\u0627 \u0627\u0646\u062a\u0633\u0627\u0628 \u06a9\u06cc\u0633\u06d2 \u0644\u0627\u06af\u0648 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u062a\u0627\u06a9\u06c1 IDP \u06a9\u06cc\u0631\u06cc \u0679\u06cc\u0645 \u0627\u0648\u0631 \u0644\u0627\u06af\u062a \u0633\u06cc\u0646\u0679\u0631 \u0645\u06cc\u0679\u0627 \u0688\u06cc\u0679\u0627 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062f\u06c1 \u062a\u0645\u0627\u0645 \u0648\u0633\u0627\u0626\u0644\u06d4<\/p>\n<\/li>\n<li>\n<p>CNCF \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0645\u06cc\u0686\u0648\u0631\u0679\u06cc \u0645\u0627\u0688\u0644 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 IDP \u06a9\u06cc \u067e\u062e\u062a\u06af\u06cc \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u06cc\u0633\u06d2 \u06a9\u06cc \u062c\u0627\u0626\u06d2<\/p>\n<\/li>\n<\/ul>\n<p>\u0622\u0626\u06cc\u06d2 \u0627\u0633\u06d2 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0627\u0626\u0637<\/h2>\n<p>\u067e\u06cc\u0631\u0648\u06cc \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u0622\u067e \u06a9\u0648 \u0636\u0631\u0648\u0631\u062a \u06c1\u0648 \u06af\u06cc:<\/p>\n<p><strong>\u0639\u0644\u0645:<\/strong><\/p>\n<ul>\n<li>\n<p>Kubernetes \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0648\u0627\u0642\u0641 \u06c1\u0648\u06ba: \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u06cc\u06ba\u060c YAML \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0644\u06a9\u06be\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0646\u0627\u0645 \u06a9\u06cc \u062c\u06af\u06c1\u0648\u06ba \u0627\u0648\u0631 RBAC \u06a9\u0648 \u0633\u0645\u062c\u06be\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc GitOps \u06a9\u0648 \u0633\u0645\u062c\u06be\u06cc\u06ba: \u062c\u0627\u0646\u06cc\u06ba \u06a9\u06c1 &quot;\u0633\u0686 \u06a9\u06d2 \u0645\u0627\u062e\u0630 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 Git&#8221; \u06a9\u0627 \u0627\u0635\u0644 \u0645\u0637\u0644\u0628 \u06a9\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u067e\u0691\u06be\u0646\u06d2 \u06a9\u06cc \u0633\u0637\u062d \u067e\u0631 Helm\u060c Terraform HCL\u060c \u0627\u0648\u0631 TypeScript \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0622\u0631\u0627\u0645\u06d4<\/p>\n<\/li>\n<li>\n<p>AWS \u062e\u062f\u0645\u0627\u062a \u06a9\u0648 \u0633\u0645\u062c\u06be\u0646\u0627: EKS, RDS, S3, IAM<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0627\u0648\u0632\u0627\u0631 \u0627\u0648\u0631 \u0631\u0633\u0627\u0626\u06cc:<\/strong><\/p>\n<ul>\n<li>\n<p>\u06a9\u0645 \u0627\u0632 \u06a9\u0645 3 \u0646\u0648\u0688\u0633 (m5.xlarge \u06cc\u0627 \u0645\u0633\u0627\u0648\u06cc) \u06a9\u06d2 \u0633\u0627\u062a\u06be Kubernetes 1.28 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627 EKS \u06a9\u0644\u0633\u0679\u0631\u06d4<\/p>\n<\/li>\n<li>\n<p><code>kubectl<\/code>    \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0646\u0627 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u06cc \u0637\u0631\u0641 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u0646\u0627<\/p>\n<\/li>\n<li>\n<p><code>helm<\/code>    3.12 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0627\u0646\u0633\u0679\u0627\u0644 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>AWS CLI v2 \u0627\u0646\u062a\u0638\u0627\u0645\u06cc \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0646\u062a\u0638\u0645 \u06a9\u06cc \u0633\u0637\u062d \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u0627 \u06af\u06cc\u0627<\/p>\n<\/li>\n<li>\n<p>Node.js 18+ \u0627\u0648\u0631 \u06cc\u0627\u0631\u0646 (\u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06a9\u06d2 \u0644\u06cc\u06d2)<\/p>\n<\/li>\n<li>\n<p>\u0627\u06cc\u06a9 GitHub \u062a\u0646\u0638\u06cc\u0645 \u062c\u0633\u06d2 \u0622\u067e \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba (GitOps \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc\u0632 \u0627\u0648\u0631 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c GitHub \u0627\u0646\u0636\u0645\u0627\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2)<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0633\u0627\u062a\u06be\u06cc \u0630\u062e\u06cc\u0631\u06c1:<\/strong><\/p>\n<pre><code class=\"language-bash\">git clone https:\/\/github.com\/aayostem\/platform-toolkit\ncd platform-toolkit\n<\/code><\/pre>\n<p>\u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u0645\u06cc\u06ba \u062a\u0645\u0627\u0645 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679\u0633\u060c \u06c1\u06cc\u0644\u0645 \u0648\u06cc\u0644\u06cc\u0648 \u0641\u0627\u0626\u0644\u0632\u060c \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0634\u0646\u0632\u060c \u0627\u0648\u0631 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba \u062c\u0646 \u06a9\u0627 \u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u0645\u06cc\u06ba \u062d\u0648\u0627\u0644\u06c1 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06c1\u0631 \u062d\u0635\u06c1 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u0645\u06cc\u06ba \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u06a9\u0627 \u0646\u0642\u0634\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p><strong>\u062a\u062e\u0645\u06cc\u0646\u06cc \u0648\u0642\u062a:<\/strong> \u0627\u06cc\u06a9 \u062a\u062c\u0631\u0628\u06c1 \u06a9\u0627\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0645\u06a9\u0645\u0644 \u0646\u0641\u0627\u0630 \u0645\u06cc\u06ba 1-2 \u062f\u0646 \u0644\u06af\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u06a9\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc GitOps \u0688\u06cc\u0644\u06cc\u0648\u0631\u06cc \u067e\u0631\u062a \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062d\u0635\u06d2 1-3 \u06a9\u0648 \u0635\u0628\u062d \u0645\u06cc\u06ba \u0645\u06a9\u0645\u0644 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-part-1-idp-architecture-the-three-layer-model\">\u062d\u0635\u06c1 1: \u0622\u0626\u06cc \u0688\u06cc \u067e\u06cc \u0622\u0631\u06a9\u06cc\u0679\u06cc\u06a9\u0686\u0631 &#8211; \u062a\u06be\u0631\u06cc \u0644\u06cc\u0626\u0631 \u0645\u0627\u0688\u0644<\/h2>\n<h3 id=\"heading-11-what-an-idp-actually-is\">1.1 \u0622\u0626\u06cc \u0688\u06cc \u067e\u06cc \u062f\u0631\u0627\u0635\u0644 \u06a9\u06cc\u0627 \u06c1\u06d2\u061f<\/h3>\n<p>\u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u0688\u0648\u06cc\u0644\u067e\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0627\u06cc\u06a9 \u0679\u0648\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u067e\u0631\u0648\u0688\u06a9\u0679 \u06c1\u06d2\u06d4 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u0627\u0648\u0631 \u0628\u0631\u0642\u0631\u0627\u0631 \u0631\u06a9\u06be\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0679\u0648\u0644\u0632\u060c \u0648\u0631\u06a9 \u0641\u0644\u0648\u060c \u0627\u0648\u0631 \u062a\u062c\u0631\u06cc\u062f\u0648\u06ba \u06a9\u0627 \u0627\u06cc\u06a9 \u0645\u062c\u0645\u0648\u0639\u06c1 \u062c\u0648 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0648 \u062e\u0648\u062f \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u0622\u06af\u06d2 \u0628\u0691\u06be\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0645\u062a\u06cc\u0627\u0632 \u0627\u06c1\u0645 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u062a\u0645\u0627\u0645 \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0641\u06cc\u0635\u0644\u0648\u06ba \u06a9\u0648 \u062a\u0634\u06a9\u06cc\u0644 \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0679\u0648\u0644 \u0627\u0646\u0633\u0679\u0627\u0644 \u0627\u0648\u0631 \u06a9\u0646\u0641\u06cc\u06af\u0631 \u06c1\u0648 \u0686\u06a9\u0627 \u06c1\u06d2\u06d4 \u0645\u0635\u0646\u0648\u0639\u0627\u062a \u06a9\u0648 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u060c \u0641\u06cc\u0688 \u0628\u06cc\u06a9 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 \u062f\u06c1\u0631\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0627\u0633 \u0628\u0627\u062a \u0633\u06d2 \u0645\u0627\u067e\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u0635\u0627\u0631\u0641\u06cc\u0646 \u0627\u0635\u0644 \u0645\u06cc\u06ba \u067e\u0631\u0648\u0688\u06a9\u0679 \u06a9\u0648 \u0627\u067e\u0646\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 \u062c\u0648 \u0622\u0626\u06cc \u0688\u06cc \u067e\u06cc\u0632 \u0628\u0646\u0627\u062a\u06cc \u06c1\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u0688\u0648\u06cc\u0644\u067e\u0631 \u067e\u0633\u0646\u062f \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u067e\u0631\u0648\u0688\u06a9\u0679 \u0645\u06cc\u0646\u06cc\u062c\u0631\u0632 \u06a9\u06cc \u0637\u0631\u062d \u0633\u0648\u0686\u062a\u06d2 \u06c1\u06cc\u06ba \u0646\u06c1 \u06a9\u06c1 \u0633\u0633\u0679\u0645 \u0627\u06cc\u0688\u0645\u0646\u0633\u0679\u0631\u06cc\u0679\u0631\u0632\u06d4<\/p>\n<p>DORA 2025 \u06a9\u06cc \u0631\u067e\u0648\u0631\u0679 \u0645\u06cc\u06ba \u067e\u062a\u0627 \u0686\u0644\u0627 \u06c1\u06d2 \u06a9\u06c1 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 90% \u06a9\u0645\u067e\u0646\u06cc\u0648\u06ba \u06a9\u06d2 \u067e\u0627\u0633 \u0627\u0628 \u06a9\u0633\u06cc \u0646\u06c1 \u06a9\u0633\u06cc \u0634\u06a9\u0644 \u06a9\u0627 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u06a9 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06c1\u0648\u0646\u0627 \u0627\u0648\u0631 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06c1\u0648\u0646\u0627 \u062c\u0633\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631 \u062f\u0631\u062d\u0642\u06cc\u0642\u062a \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u062f\u0648 \u0645\u062e\u062a\u0644\u0641 \u0686\u06cc\u0632\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u0633\u0631\u0648\u06d2 \u0638\u0627\u06c1\u0631 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0627\u0646\u062f\u0631\u0648\u0646\u06cc \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0648\u0633\u06cc\u0639 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0645\u062e\u062a\u0644\u0641 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0648\u0631 \u0645\u0637\u0645\u0626\u0646 \u0627\u0648\u0631 \u063a\u06cc\u0631 \u0645\u0637\u0645\u0626\u0646 \u0679\u06cc\u0645\u0648\u06ba \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u0641\u0631\u0642 \u06a9\u0627 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u062a\u0639\u0644\u0642 \u0627\u0633 \u0628\u0627\u062a \u0633\u06d2 \u06c1\u06d2 \u06a9\u06c1 \u0622\u06cc\u0627 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 IDP \u06a9\u0648 \u0631\u0648\u0688 \u0645\u06cc\u067e \u0627\u0648\u0631 \u0635\u0627\u0631\u0641 \u06a9\u06cc \u062a\u062d\u0642\u06cc\u0642 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u067e\u0631\u0648\u0688\u06a9\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u060c \u06cc\u0627 \u0679\u06a9\u0679\u0648\u06ba \u06a9\u06cc \u0642\u0637\u0627\u0631 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u06d4<\/p>\n<p>\u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u0645\u06cc\u06ba \u062a\u06cc\u0646 \u0679\u0648\u0644\u0632 &#8211; \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c\u060c \u0622\u0631\u06af\u0648 \u0633\u06cc \u0688\u06cc\u060c \u0627\u0648\u0631 \u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 &#8211; 2026 \u0645\u06cc\u06ba \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0622\u0626\u06cc \u0688\u06cc \u067e\u06cc\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u0628 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0648\u0633\u06cc\u0639 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0627\u067e\u0646\u0627\u0626\u06d2 \u062c\u0627\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0627\u0648\u067e\u0646 \u0633\u0648\u0631\u0633 \u0627\u0633\u0679\u06cc\u06a9\u0633 \u06c1\u0648\u06ba \u06af\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u0627\u0646 \u06a9\u0648 \u062c\u0648\u0691\u0646\u06d2 \u0648\u0627\u0644\u0627 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631 \u0627\u062a\u0646\u0627 \u06c1\u06cc \u0627\u06c1\u0645 \u06c1\u06d2 \u062c\u062a\u0646\u0627 \u06a9\u06c1 \u062e\u0648\u062f \u0679\u0648\u0644\u0632\u06d4<\/p>\n<h3 id=\"heading-12-the-three-layer-architecture\">1.2 \u062a\u06cc\u0646 \u062f\u0631\u062c\u06d2 \u06a9\u0627 \u0641\u0646 \u062a\u0639\u0645\u06cc\u0631<\/h3>\n<p>\u0627\u06cc\u06a9 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631\u06cc IDP \u06a9\u06d2 \u062a\u06cc\u0646 \u062f\u0631\u062c\u06d2 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u06cc \u0630\u0645\u06c1 \u062f\u0627\u0631\u06cc \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">Layer 1: Developer Interface (Backstage)\n\u251c\u2500\u2500 Software catalog \u2014 inventory of all services, APIs, and resources\n\u251c\u2500\u2500 Software Templates \u2014 self-service forms that trigger provisioning workflows\n\u251c\u2500\u2500 TechDocs \u2014 documentation co-located with each catalog entity\n\u2514\u2500\u2500 Plugins \u2014 integrations with ArgoCD, Kubernetes, PagerDuty, Grafana\n\nLayer 2: Delivery Layer (ArgoCD)\n\u251c\u2500\u2500 GitOps sync \u2014 continuous reconciliation of cluster state to Git\n\u251c\u2500\u2500 ApplicationSets \u2014 multi-environment deployment from a single definition\n\u251c\u2500\u2500 Rollout management \u2014 progressive delivery with health checks\n\u2514\u2500\u2500 Audit trail \u2014 every deployment change linked to a Git commit\n\nLayer 3: Infrastructure Layer (Crossplane)\n\u251c\u2500\u2500 Composite Resources \u2014 cloud resources defined as Kubernetes CRDs\n\u251c\u2500\u2500 Compositions \u2014 templates that expand a simple claim into full AWS infrastructure\n\u251c\u2500\u2500 ProviderConfigs \u2014 credentials and region configuration for each cloud provider\n\u2514\u2500\u2500 Usage tracking \u2014 every provisioned resource tagged with team and cost centre\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u0627\u06c1\u0645 \u062a\u0639\u0645\u06cc\u0631\u0627\u062a\u06cc \u0627\u0635\u0648\u0644: Backstage \u06a9\u0628\u06be\u06cc \u0628\u06be\u06cc Kubernetes \u06cc\u0627 \u06a9\u0644\u0627\u0624\u0688 APIs \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0628\u0627\u062a \u0686\u06cc\u062a \u0646\u06c1\u06cc\u06ba \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u06a9\u0648\u0626\u06cc \u0688\u0648\u06cc\u0644\u067e\u0631 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0645\u06cc\u06ba \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u062c\u0645\u0639 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u0624\u0679 \u067e\u0679 \u0627\u06cc\u06a9 \u06af\u0679 \u06a9\u0645\u0679 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 (\u06cc\u0627 \u062a\u0648 \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0644\u06cc\u0645 \u06cc\u0627 \u0627\u06cc\u06a9 YAML \u0641\u0627\u0626\u0644 \u062c\u0648 ArgoCD \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u06a9\u06cc \u0646\u0645\u0627\u0626\u0646\u062f\u06af\u06cc \u06a9\u0631\u062a\u06cc \u06c1\u06d2)\u06d4 ArgoCD \u0627\u0633 \u06a9\u0645\u0679 \u06a9\u0648 \u0627\u0679\u06be\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u067e\u0631 \u0644\u0627\u06af\u0648 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u06a9\u0644\u0633\u0679\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u062d\u0642\u06cc\u0642\u06cc \u06a9\u0644\u0627\u0624\u0688 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1 \u0628\u0627\u0644\u0648\u0627\u0633\u0637\u06c1 \u0631\u0627\u0633\u062a\u06c1 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u06a9\u06cc \u062e\u0627\u0637\u0631 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06c1\u0631 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc \u0645\u0635\u0646\u0641\u060c \u0679\u0627\u0626\u0645 \u0627\u0633\u0679\u06cc\u0645\u067e\u060c \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u060c \u0627\u0648\u0631 \u062c\u0627\u0626\u0632\u06c1 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u06af\u0679 \u06a9\u0645\u0679 \u06c1\u06d2\u06d4 \u0622\u0688\u0679 \u06a9\u06d2 \u0631\u0627\u0633\u062a\u06d2 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06c1\u06cc\u06ba\u06d4 \u0631\u0648\u0644 \u0628\u06cc\u06a9 \u0645\u06cc\u06a9\u0627\u0646\u0632\u0645 \u0645\u0646\u062f\u0631\u062c\u06c1 \u0630\u06cc\u0644 \u06c1\u06d2: <code>git revert<\/code>.<\/p>\n<pre><code class=\"language-plaintext\">Developer \u2192 Backstage Template \u2192 Git commit \u2192 ArgoCD \u2192 Crossplane \u2192 AWS\n                                     \u2191\n                          Single source of truth\n                          Full audit trail\n                          Rollback = git revert\n<\/code><\/pre>\n<p>\u063a\u0644\u0637 \u0645\u062a\u0628\u0627\u062f\u0644\u0627\u062a \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06cc\u06ba: \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2 \u0628\u0627\u062f\u0644 API \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0633\u06d2 \u06a9\u0627\u0644 \u06a9\u0631\u0646\u0627\u06d4<\/p>\n<pre><code class=\"language-typescript\">\/\/ Bad: Backstage template calling AWS SDK directly\n\/\/ No audit trail, no rollback, no reconciliation loop\n\/\/ If the call fails halfway, you have partial infrastructure with no record\nimport { S3Client, CreateBucketCommand } from \"@aws-sdk\/client-s3\";\n\nconst client = new S3Client({ region: \"us-east-1\" });\nawait client.send(new CreateBucketCommand({ Bucket: bucketName }));\n<\/code><\/pre>\n<p>\u0627\u0648\u0631 \u0635\u062d\u06cc\u062d \u0646\u0642\u0637\u06c1 \u0646\u0638\u0631 &#8211; \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0633\u06d2 \u06af\u0679 \u067e\u0631 \u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u06a9\u06d2 \u062f\u0639\u0648\u0648\u06ba \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u0622\u0624\u0679 \u067e\u0679 \u06a9\u0631\u06cc\u06ba:<\/p>\n<pre><code class=\"language-yaml\"># Good: Backstage template output \u2014 a Crossplane claim committed to Git\n# ArgoCD applies it, Crossplane reconciles it, AWS creates the bucket\n# Every step is tracked, auditable, and reversible\napiVersion: platform.cloudfrugal.com\/v1alpha1\nkind: S3Bucket\nmetadata:\n  name: ${{ values.bucket_name }}\n  namespace: ${{ values.team_namespace }}\n  labels:\n    team: ${{ values.team_name }}\n    cost-centre: ${{ values.cost_centre }}\n    environment: ${{ values.environment }}\nspec:\n  versioning: true\n  encryption: AES256\n  region: us-east-1\n<\/code><\/pre>\n<h3 id=\"heading-13-implementation-order\">1.3 \u0646\u0641\u0627\u0630 \u06a9\u0627 \u062d\u06a9\u0645<\/h3>\n<p>\u0627\u0633 \u062a\u0631\u062a\u06cc\u0628 \u0645\u06cc\u06ba \u062a\u0639\u0645\u06cc\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u0627\u0633 \u0633\u06d2 \u0627\u0646\u062d\u0631\u0627\u0641 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0646\u062a\u06cc\u062c\u06d2 \u0645\u06cc\u06ba \u0627\u0646\u0636\u0645\u0627\u0645 \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u067e\u06cc\u062f\u0627 \u06c1\u0648\u06ba \u06af\u06d2 \u062c\u0646 \u06a9\u0648 \u0688\u06cc\u0628\u06af \u06a9\u0631\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">Step 1: ArgoCD \u2014 the delivery foundation everything else depends on\nStep 2: Crossplane \u2014 infrastructure control plane, delivered by ArgoCD\nStep 3: Backstage \u2014 the portal, pointing at ArgoCD and Crossplane as backends\nStep 4: Wire together \u2014 Software Templates that produce GitOps manifests\nStep 5: FinOps layer \u2014 cost attribution metadata in every provisioned resource\n<\/code><\/pre>\n<h2 id=\"heading-part-2-argocd-the-gitops-foundation\">\u062d\u0635\u06c1 2: ArgoCD &#8211; GitOps \u0641\u0627\u0624\u0646\u0688\u06cc\u0634\u0646<\/h2>\n<p>ArgoCD Kubernetes \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0645\u0633\u0644\u0633\u0644 \u0688\u06cc\u0644\u06cc\u0648\u0631\u06cc \u0679\u0648\u0644 \u06c1\u06d2 \u062c\u0648 GitOps \u067e\u06cc\u0679\u0631\u0646 \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0622\u067e \u0646\u06d2 \u067e\u06c1\u0644\u06d2 \u06a9\u0628\u06be\u06cc GitOps \u0679\u0648\u0644 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0628\u0646\u06cc\u0627\u062f\u06cc \u062e\u06cc\u0627\u0644 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u0622\u067e \u06a9\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u067e\u0631 \u06a9\u06cc\u0627 \u0686\u0644\u0646\u0627 \u0686\u0627\u06c1\u0626\u06d2 \u0627\u0633 \u06a9\u06d2 \u0644\u0626\u06d2 \u0622\u067e \u06a9\u0627 Git \u0630\u062e\u06cc\u0631\u06c1 \u0622\u067e \u06a9\u0627 \u0648\u0627\u062d\u062f \u0630\u0631\u06cc\u0639\u06c1 \u06c1\u06d2\u060c \u0627\u0648\u0631 ArgoCD \u0627\u0633 \u0633\u06d2 \u0645\u0644\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 \u0627\u0635\u0644 \u06a9\u0644\u0633\u0679\u0631 \u062d\u0627\u0644\u062a \u06a9\u0648 \u0645\u0633\u0644\u0633\u0644 \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 ArgoCD \u0628\u0691\u06be\u06d2 \u06a9\u0627 \u067e\u062a\u06c1 \u0644\u06af\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba Git \u0645\u06cc\u06ba \u062f\u0648\u0628\u0627\u0631\u06c1 \u06c1\u0645 \u0622\u06c1\u0646\u06af \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u06af\u0679 \u062a\u0628\u062f\u06cc\u0644 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062a\u0648\u060c ArgoCD \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0646\u0633\u0627\u0646\u06cc \u0645\u062f\u0627\u062e\u0644\u062a \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2 \u0627\u0648\u0631 \u0641\u0639\u0627\u0644 \u0637\u0648\u0631 \u067e\u0631 \u062d\u0648\u0635\u0644\u06c1 \u0634\u06a9\u0646\u06cc \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0645\u0642\u0635\u062f \u0627\u06cc\u06a9 \u06a9\u0644\u0633\u0679\u0631 \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u062d\u0627\u0644\u062a \u06c1\u0645\u06cc\u0634\u06c1 \u06af\u0679 \u0645\u06cc\u06ba \u0645\u0648\u062c\u0648\u062f \u0686\u06cc\u0632\u0648\u06ba \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u067e\u0648\u0631\u06cc \u0637\u0631\u062d \u0633\u06d2 \u0628\u06cc\u0627\u0646 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>ArgoCD \u0627\u06cc\u06a9 CNCF \u06af\u0631\u06cc\u062c\u0648\u06cc\u0634\u0646 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u0627\u0648\u0631 \u0648\u0633\u06cc\u0639 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0648\u06cc\u0628 UI\u060c CLI\u060c \u0627\u0648\u0631 REST API \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u067e\u0648\u0688\u0632 \u06a9\u06d2 \u0633\u06cc\u0679 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0686\u0644\u062a\u0627 \u06c1\u06d2\u06d4 \u06c1\u0631 \u0648\u06c1 \u0686\u06cc\u0632 \u062c\u0633 \u06a9\u06cc \u0622\u067e \u06a9\u0648 \u0645\u062a\u0639\u062f\u062f \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u0648\u06ba \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u0627\u06cc\u06a9 \u062c\u06af\u06c1 \u067e\u0631 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-21-installing-argocd\">2.1 ArgoCD \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-bash\"># Create the ArgoCD namespace\nkubectl create namespace argocd\n\n# Install ArgoCD using the official manifest\nkubectl apply -n argocd \\\n  -f https:\/\/raw.githubusercontent.com\/argoproj\/argo-cd\/stable\/manifests\/install.yaml\n\n# Wait for all pods to be running before proceeding\nkubectl wait --for=condition=Ready pods \\\n  --all -n argocd --timeout=300s\n\n# Get the initial admin password\nargocd_password=$(kubectl -n argocd get secret argocd-initial-admin-secret \\\n  -o jsonpath=\"{.data.password}\" | base64 -d)\n\necho \"ArgoCD initial password: $argocd_password\"\necho \"Save this somewhere secure before proceeding\"\n\n# Port-forward to access the ArgoCD UI locally\nkubectl port-forward svc\/argocd-server -n argocd 8080:443 &\n\n# Login via CLI\nargocd login localhost:8080 \\\n  --username admin \\\n  --password \"$argocd_password\" \\\n  --insecure\n\n# Change the password immediately\nargocd account update-password \\\n  --current-password \"$argocd_password\" \\\n  --new-password \"your-secure-password\"\n<\/code><\/pre>\n<h3 id=\"heading-22-repository-structure-for-gitops\">2.2 GitOps \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u06cc \u0633\u0627\u062e\u062a<\/h3>\n<p>ArgoCD \u06a9\u0644\u0627\u06a9 \u0633\u0679\u0648\u0631\u06cc\u062c \u06a9\u0627 \u0688\u06be\u0627\u0646\u0686\u06c1 \u0627\u0633 \u0628\u0627\u062a \u06a9\u0627 \u062a\u0639\u06cc\u0646 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0645\u062a\u0639\u062f\u062f \u0645\u0627\u062d\u0648\u0644 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u06cc\u0633\u06d2 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 Kustomize \u06a9\u06d2 \u0632\u06cc\u0631 \u0627\u0646\u062a\u0638\u0627\u0645 \u0627\u0648\u0648\u0631\u0644\u06cc\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u06cc\u06a9 \u0641\u06cc \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0645\u0627\u062d\u0648\u0644 \u062c\u0648 \u0633\u0628 \u0633\u06d2 \u0628\u06c1\u062a\u0631 \u067e\u06cc\u0645\u0627\u0646\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>Kustomize \u0627\u06cc\u06a9 Kubernetes \u067e\u0631 \u0645\u0628\u0646\u06cc \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u0679\u0648\u0644 \u06c1\u06d2 \u062c\u0648 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u0628\u06cc\u0633 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u0646\u06d2 \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u0645\u0627\u062d\u0648\u0644 \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u0645\u062e\u0635\u0648\u0635 \u0627\u0648\u0648\u0631 \u0631\u0627\u0626\u06cc\u0688\u0632 \u06a9\u0648 \u067e\u0631\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0633\u0679\u06cc\u062c\u0646\u06af \u0627\u0648\u0631 \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646\u0632 \u0627\u06cc\u06a9 \u06c1\u06cc YAML \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u0627 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u0646\u0642\u0644 \u06a9\u06cc \u062a\u0639\u062f\u0627\u062f\u060c \u062a\u0635\u0648\u06cc\u0631\u06cc \u0679\u06cc\u06af\u0632\u060c \u0627\u0648\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062d\u062f\u0648\u062f \u0645\u062e\u062a\u0644\u0641 \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-plaintext\">gitops-repo\/\n\u251c\u2500\u2500 apps\/\n\u2502   \u251c\u2500\u2500 base\/                    # Shared configuration across all environments\n\u2502   \u2502   \u251c\u2500\u2500 payment-api\/\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 deployment.yaml\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 service.yaml\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 kustomization.yaml\n\u2502   \u2502   \u2514\u2500\u2500 user-api\/\n\u2502   \u2502       \u251c\u2500\u2500 deployment.yaml\n\u2502   \u2502       \u251c\u2500\u2500 service.yaml\n\u2502   \u2502       \u2514\u2500\u2500 kustomization.yaml\n\u2502   \u2514\u2500\u2500 overlays\/\n\u2502       \u251c\u2500\u2500 staging\/             # Staging-specific overrides\n\u2502       \u2502   \u251c\u2500\u2500 payment-api\/\n\u2502       \u2502   \u2502   \u2514\u2500\u2500 kustomization.yaml   # Override: 1 replica, staging image tag\n\u2502       \u2502   \u2514\u2500\u2500 kustomization.yaml\n\u2502       \u2514\u2500\u2500 production\/          # Production-specific overrides\n\u2502           \u251c\u2500\u2500 payment-api\/\n\u2502           \u2502   \u2514\u2500\u2500 kustomization.yaml   # Override: 3 replicas, pinned image tag\n\u2502           \u2514\u2500\u2500 kustomization.yaml\n\u2514\u2500\u2500 infrastructure\/\n    \u251c\u2500\u2500 crossplane\/              # Crossplane installation and providers\n    \u251c\u2500\u2500 monitoring\/              # Prometheus, Grafana\n    \u2514\u2500\u2500 ingress\/                 # NGINX or ALB ingress controller\n<\/code><\/pre>\n<h3 id=\"heading-23-applicationsets-managing-multiple-environments\">2.3 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0633\u06cc\u0679\u0633 &#8211; \u0645\u062a\u0639\u062f\u062f \u0645\u0627\u062d\u0648\u0644 \u06a9\u0627 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u0646\u0627<\/h3>\n<p>ApplicationSet \u0627\u06cc\u06a9 ArgoCD \u0648\u0633\u06cc\u0644\u06c1 \u06c1\u06d2 \u062c\u0648 \u0627\u06cc\u06a9 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u0633\u06d2 \u0645\u062a\u0639\u062f\u062f \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0622\u0628\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0645\u06cc\u0646\u06cc \u0641\u06cc\u0633\u0679 \u0641\u06cc \u0633\u0631\u0648\u0633 \u0641\u06cc \u0645\u0627\u062d\u0648\u0644 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u062c\u0633 \u06a9\u0627 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u0646\u0627 \u0645\u0634\u06a9\u0644 \u06c1\u06d2\u060c \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0627 \u0627\u06cc\u06a9 \u0633\u06cc\u0679 \u0645\u062a\u0639\u06cc\u0646 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u062a\u0645\u0627\u0645 \u0645\u0627\u062d\u0648\u0644 \u0645\u06cc\u06ba \u062a\u0645\u0627\u0645 \u0633\u0631\u0648\u0633\u0632 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06d2\u06d4 \u0645\u06cc\u0679\u0631\u06a9\u0633 \u062c\u0646\u0631\u06cc\u0679\u0631 \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u06a9\u0648 \u06af\u0679 \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0627\u0633\u06a9\u06cc\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062c\u0648\u0691\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u062a\u0645\u0627\u0645 \u0627\u0645\u062a\u0632\u0627\u062c\u0627\u062a \u067e\u06cc\u062f\u0627 \u06c1\u0648\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\"># applicationset-apps.yaml\n# This single resource generates one ArgoCD Application\n# for each combination of environment and application directory\napiVersion: argoproj.io\/v1alpha1\nkind: ApplicationSet\nmetadata:\n  name: platform-apps\n  namespace: argocd\nspec:\n  generators:\n    - matrix:\n        generators:\n          # Generator 1: environments\n          - list:\n              elements:\n                - environment: staging\n                  cluster: https:\/\/staging.eks.cluster.local\n                - environment: production\n                  cluster: https:\/\/production.eks.cluster.local\n\n          # Generator 2: application directories in the overlay\n          - git:\n              repoURL: https:\/\/github.com\/your-org\/gitops-repo\n              revision: HEAD\n              directories:\n                - path: apps\/overlays\/{{environment}}\/*\n\n  template:\n    metadata:\n      name: \"{{environment}}-{{path.basename}}\"\n      labels:\n        environment: \"{{environment}}\"\n        app: \"{{path.basename}}\"\n    spec:\n      project: default\n      source:\n        repoURL: https:\/\/github.com\/your-org\/gitops-repo\n        targetRevision: HEAD\n        path: \"apps\/overlays\/{{environment}}\/{{path.basename}}\"\n      destination:\n        server: \"{{cluster}}\"\n        namespace: \"{{path.basename}}\"\n      syncPolicy:\n        automated:\n          prune: true        # Delete resources removed from Git\n          selfHeal: true     # Revert manual cluster changes\n        syncOptions:\n          - CreateNamespace=true\n          - PrunePropagationPolicy=foreground\n<\/code><\/pre>\n<p>\u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 ApplicationSet \u0645\u062a\u0648\u0642\u0639 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\"># List all generated Applications\nkubectl get applications -n argocd\n\n# Expected output: one Application per environment per app\n# staging-payment-api    Synced    Healthy\n# staging-user-api       Synced    Healthy\n# production-payment-api Synced    Healthy\n# production-user-api    Synced    Healthy\n\n# Check sync status for a specific application\nargocd app get staging-payment-api\n<\/code><\/pre>\n<h3 id=\"heading-24-argocd-rbac-for-platform-teams\">\u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 2.4 ArgoCD RBAC<\/h3>\n<p>\u0627\u06cc\u06a9 \u06a9\u062b\u06cc\u0631 \u0679\u06cc\u0645 IDP \u06a9\u06d2 \u0644\u06cc\u06d2 \u06c1\u0631 \u0679\u06cc\u0645 \u06a9\u0648 ArgoCD \u062a\u06a9 \u0631\u0633\u0627\u0626\u06cc \u06a9\u06cc \u0645\u062e\u062a\u0644\u0641 \u0633\u0637\u062d\u0648\u06ba \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0679\u06cc\u0645\u0648\u06ba \u06a9\u0648 \u0627\u067e\u0646\u06cc \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u062f\u06cc\u06a9\u06be\u0646\u06d2 \u0627\u0648\u0631 \u06c1\u0645 \u0622\u06c1\u0646\u06af \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0642\u0627\u0628\u0644 \u06c1\u0648\u0646\u0627 \u0636\u0631\u0648\u0631\u06cc \u06c1\u06d2\u06d4 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645\u0648\u06ba \u06a9\u0648 \u0648\u0633\u06cc\u0639 \u062a\u0631 \u0631\u0633\u0627\u0626\u06cc \u062d\u0627\u0635\u0644 \u06c1\u0648\u0646\u06cc \u0686\u0627\u06c1\u06cc\u06d2\u06d4 ArgoCD \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06a9\u0633\u06cc \u06a9\u06d2 \u067e\u0627\u0633 \u0644\u0627\u0645\u062d\u062f\u0648\u062f \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u0646\u06c1\u06cc\u06ba \u06c1\u0648\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba\u06d4<\/p>\n<p>\u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u067e\u0627\u0644\u06cc\u0633\u06cc \u06c1\u06d2: <code>readonly<\/code> &#8211; \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0645\u0633\u062a\u0646\u062f \u0635\u0627\u0631\u0641 \u0633\u0628 \u06a9\u0686\u06be \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0644\u06cc\u06a9\u0646 \u06a9\u0686\u06be \u062a\u0628\u062f\u06cc\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u0627\u06d4<\/p>\n<pre><code class=\"language-yaml\"># argocd-rbac-configmap.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: argocd-rbac-cm\n  namespace: argocd\ndata:\n  policy.default: role:readonly\n  policy.csv: |\n    # Platform team: full access to all applications\n    p, role:platform-team, applications, *, *\/*, allow\n    p, role:platform-team, clusters, get, *, allow\n    p, role:platform-team, repositories, *, *, allow\n\n    # Application teams: sync and get their own namespace only\n    p, role:app-team, applications, get, *\/staging-*, allow\n    p, role:app-team, applications, sync, *\/staging-*, allow\n\n    # Bind roles to GitHub teams\n    g, your-org:platform-engineers, role:platform-team\n    g, your-org:developers, role:app-team\n\n  scopes: '[groups]'\n<\/code><\/pre>\n<h2 id=\"heading-part-3-crossplane-infrastructure-as-kubernetes-resources\">\u062d\u0635\u06c1 3: \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 &#8211; \u0627\u06cc\u06a9 Kubernetes \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631<\/h2>\n<p>\u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u0627\u06cc\u06a9 CNCF- \u06af\u0631\u06cc\u0688 \u0627\u0648\u067e\u0646 \u0633\u0648\u0631\u0633 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u06c1\u06d2 \u062c\u0648 Kubernetes \u06a9\u0648 \u0639\u0627\u0645 \u0645\u0642\u0635\u062f \u06a9\u06d2 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06d2 \u06a9\u0646\u0679\u0631\u0648\u0644 \u0648\u0627\u0644\u06d2 \u062c\u06c1\u0627\u0632 \u0645\u06cc\u06ba \u067e\u06be\u06cc\u0644\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0644\u06cc\u062f\u06cc \u062e\u06cc\u0627\u0644: \u06a9\u0644\u0627\u0624\u0688 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0645\u0646\u0638\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u067e\u0646\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0633\u06d2 \u0628\u0627\u06c1\u0631 Terraform \u06cc\u0627 CloudFormation \u062c\u06cc\u0633\u06d2 \u0639\u0644\u06cc\u062d\u062f\u06c1 \u0679\u0648\u0644\u0632 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2\u060c \u0622\u067e \u06a9\u0644\u0627\u0624\u0688 \u0631\u06cc\u0633\u0648\u0631\u0633\u0632 (RDS \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633\u060c S3 buckets\u060c VPCs\u060c IAM \u0631\u0648\u0644\u0632) \u06a9\u0648 Kubernetes \u06a9\u06d2 \u062d\u0633\u0628 \u0636\u0631\u0648\u0631\u062a \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u0628\u06cc\u0627\u0646 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>\u062c\u0628 \u0622\u067e \u0627\u067e\u0646\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u067e\u0631 \u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u06a9\u0627 \u06a9\u0646\u0679\u0631\u0648\u0644\u0631 \u0645\u0637\u0644\u0648\u0628\u06c1 \u062d\u0627\u0644\u062a \u067e\u0631 \u0642\u0628\u0636\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0627\u0635\u0644 AWS \u062d\u0627\u0644\u062a \u0633\u06d2 \u0645\u0645\u0627\u062b\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u0688\u062c\u0633\u0679 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0628\u0627\u0644\u06a9\u0644 \u0627\u0633\u06cc \u0637\u0631\u062d Kubernetes \u0686\u0644\u062a\u06cc \u06c1\u0648\u0626\u06cc \u067e\u0648\u0688\u0632 \u06a9\u06d2 \u0633\u06cc\u0679 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u0648\u06ba \u06a9\u0648 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u0627\u0633 \u06a9\u06d2 \u0627\u0648\u067e\u0631 \u062c\u0648 \u0627\u06c1\u0645 \u062a\u062c\u0631\u06cc\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0648\u06c1 \u062c\u0627\u0645\u0639 \u0648\u0633\u0627\u0626\u0644 \u06c1\u06d2\u06d4 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 \u0627\u0639\u0644\u06cc \u0633\u0637\u062d \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4 <code>PostgreSQLDatabase<\/code> \u0627\u06cc\u06a9 \u0642\u0633\u0645 \u062c\u0648 \u062d\u0642\u06cc\u0642\u06cc RDS \u0645\u062b\u0627\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u06a9\u0627\u0631 30 \u0633\u06d2 \u200b\u200b\u0632\u06cc\u0627\u062f\u06c1 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0641\u06cc\u0644\u0688\u0632 \u06a9\u0627 \u062e\u0644\u0627\u0635\u06c1 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u0633\u0627\u062f\u06c1 \u0627\u0642\u0633\u0627\u0645 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0639\u0627\u0645\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 Crossplane \u0627\u0633\u06d2 \u0622\u067e \u06a9\u06d2 AWS \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0645\u06a9\u0645\u0644 \u062a\u0631\u062a\u06cc\u0628 \u062a\u06a9 \u0628\u0691\u06be\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 \u06a9\u06cc \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u0627\u0648\u0631 \u0622\u067e\u0631\u06cc\u0634\u0646\u0644 \u0645\u0639\u06cc\u0627\u0631\u0627\u062a \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0627\u06cc\u0633\u0627 \u0645\u0639\u06cc\u0627\u0631 \u06c1\u06d2 \u062c\u0633\u06d2 \u0646\u0638\u0631\u0627\u0646\u062f\u0627\u0632 \u0646\u06c1\u06cc\u06ba \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0688\u0648\u06cc\u0644\u067e\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0641\u06cc\u0644\u0688\u0632 \u0646\u06c1\u06cc\u06ba \u062f\u06cc\u06a9\u06be \u0633\u06a9\u062a\u06d2\u06d4<\/p>\n<h3 id=\"heading-31-installing-crossplane\">3.1 \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u06cc \u062a\u0646\u0635\u06cc\u0628<\/h3>\n<p>\u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u06a9\u0648 \u0622\u0631\u06af\u0648 \u0633\u06cc \u0688\u06cc \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06a9\u0644\u0633\u0679\u0631\u0632 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0627\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062c\u0648 \u062f\u0648 \u0679\u0648\u0644\u0632 \u06a9\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646 \u067e\u06c1\u0644\u0627 \u0627\u0646\u0636\u0645\u0627\u0645 \u06c1\u06d2\u06d4 \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0648 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 ArgoCD \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4 <code>helm install<\/code> \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0622\u067e \u06a9\u06d2 GitOps \u0645\u06cc\u0646\u062c\u0645\u0646\u0679 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u0627 \u062d\u0635\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u062a\u0645\u0627\u0645 \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba Git \u067e\u0631\u0639\u0632\u0645 \u06c1\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0646 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-yaml\"># infrastructure\/crossplane\/application.yaml\n# ArgoCD Application that installs Crossplane via Helm\napiVersion: argoproj.io\/v1alpha1\nkind: Application\nmetadata:\n  name: crossplane\n  namespace: argocd\nspec:\n  project: default\n  source:\n    repoURL: https:\/\/charts.crossplane.io\/stable\n    chart: crossplane\n    targetRevision: 1.15.0\n    helm:\n      values: |\n        provider:\n          packages:\n            # AWS provider \u2014 manages all AWS resources\n            - xpkg.upbound.io\/upbound\/provider-aws-s3:v1.2.0\n            - xpkg.upbound.io\/upbound\/provider-aws-rds:v1.2.0\n            - xpkg.upbound.io\/upbound\/provider-aws-iam:v1.2.0\n  destination:\n    server: https:\/\/kubernetes.default.svc\n    namespace: crossplane-system\n  syncPolicy:\n    automated:\n      prune: true\n      selfHeal: true\n    syncOptions:\n      - CreateNamespace=true\n<\/code><\/pre>\n<pre><code class=\"language-bash\"># Apply the ArgoCD Application \u2014 ArgoCD installs Crossplane\nkubectl apply -f infrastructure\/crossplane\/application.yaml\n\n# Watch Crossplane pods come up\nkubectl get pods -n crossplane-system -w\n\n# Verify providers are installed and healthy\nkubectl get providers\n# Expected:\n# NAME                          INSTALLED   HEALTHY   PACKAGE\n# upbound-provider-aws-s3       True        True      xpkg.upbound.io\/...\n# upbound-provider-aws-rds      True        True      xpkg.upbound.io\/...\n<\/code><\/pre>\n<h3 id=\"heading-32-provider-credentials\">3.2 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0646\u0646\u062f\u06c1 \u06a9\u06cc \u0627\u0633\u0646\u0627\u062f<\/h3>\n<p>\u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u06a9\u0648 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 AWS \u0627\u0633\u0646\u0627\u062f \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4 EKS \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u062c\u0648\u06cc\u0632 \u06a9\u0631\u062f\u06c1 \u0637\u0631\u06cc\u0642\u06c1 IAM \u0631\u0648\u0644\u0632 \u0641\u0627\u0631 \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679\u0633 (IRSA) \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0637\u0631\u06cc\u0642\u06c1 \u06a9\u0627\u0631 Kubernetes pods \u06a9\u0648 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u0627\u0633\u0646\u0627\u062f \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u06cc\u06d2 \u0628\u063a\u06cc\u0631 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a IAM \u06a9\u06d2 \u06a9\u0631\u062f\u0627\u0631 \u0633\u0646\u0628\u06be\u0627\u0644\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u067e\u0648\u0688 \u06a9\u06d2 Kubernetes \u0633\u0631\u0648\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679 \u06a9\u0648 IAM \u0631\u0648\u0644 ARN \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0634\u0631\u06cc\u062d \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u062c\u0628 \u067e\u0648\u0688 API \u06a9\u0648 \u06a9\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062a\u0648 AWS \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0645\u062e\u062a\u0635\u0631 \u0645\u062f\u062a \u06a9\u06d2 \u0627\u0633\u0646\u0627\u062f \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0631\u0633\u0627\u0626\u06cc \u06a9\u06cc \u06a9\u0648\u0626\u06cc \u0686\u0627\u0628\u06cc\u0627\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u062a\u0628\u062f\u06cc\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0631\u0627\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u063a\u0644\u0637\u06cc \u0633\u06d2 \u0628\u06d2 \u0646\u0642\u0627\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0648\u0626\u06cc \u0627\u0633\u0646\u0627\u062f \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\"># Create the IAM role for Crossplane with the necessary AWS permissions\naws iam create-role \\\n  --role-name CrossplaneProviderRole \\\n  --assume-role-policy-document '{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [{\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"Federated\": \"arn:aws:iam::YOUR_ACCOUNT_ID:oidc-provider\/oidc.eks.us-east-1.amazonaws.com\/id\/YOUR_OIDC_ID\"\n      },\n      \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n      \"Condition\": {\n        \"StringEquals\": {\n          \"oidc.eks.us-east-1.amazonaws.com\/id\/YOUR_OIDC_ID:sub\":\n            \"system:serviceaccount:crossplane-system:provider-aws\"\n        }\n      }\n    }]\n  }'\n\n# Attach the permissions policy (scope this to minimum required in production)\naws iam attach-role-policy \\\n  --role-name CrossplaneProviderRole \\\n  --policy-arn arn:aws:iam::aws:policy\/AdministratorAccess\n<\/code><\/pre>\n<pre><code class=\"language-yaml\"># provider-config.yaml\n# Configure the AWS provider with IRSA \u2014 no static credentials\napiVersion: aws.upbound.io\/v1beta1\nkind: ProviderConfig\nmetadata:\n  name: default\nspec:\n  credentials:\n    source: IRSA   # Use the IAM role attached to the provider service account\n<\/code><\/pre>\n<h3 id=\"heading-33-defining-a-composite-resource-postgresql-database\">3.3 \u062c\u0627\u0645\u0639 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062a\u0639\u0631\u06cc\u0641 &#8211; PostgreSQL \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633<\/h3>\n<p>\u06cc\u06c1 \u0648\u06c1 \u062c\u06af\u06c1 \u06c1\u06d2 \u062c\u06c1\u0627\u06ba IDP \u062a\u062c\u0631\u06cc\u062f \u06a9\u06be\u06cc\u0644 \u0645\u06cc\u06ba \u0622\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 \u062f\u0648 YAML \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2: <code>CompositeResourceDefinition<\/code> (XRD) \u0627\u0633 \u0641\u0627\u0631\u0645\u06cc\u0679 \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c <code>Composition<\/code>\u0627\u0633 \u0628\u0627\u062a \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0633 \u0637\u0631\u062d \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u0627\u0635\u0644 AWS \u0648\u0633\u0627\u0626\u0644 \u062a\u06a9 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u06a9\u06cc \u062c\u0627\u062a\u06cc \u06c1\u06cc\u06ba \u062c\u0646 \u067e\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06a9\u06d2 \u0645\u0639\u06cc\u0627\u0631\u0627\u062a \u0644\u0627\u06af\u0648 \u06c1\u0648\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<p>XRD \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 API \u0645\u0639\u0627\u06c1\u062f\u06c1 \u06c1\u06d2\u06d4 \u0627\u0633\u06d2 \u0633\u0627\u062f\u06c1 \u0631\u06a9\u06be\u06cc\u06ba\u06d4 \u06cc\u06c1\u0627\u06ba \u0635\u0631\u0641 \u0648\u06c1\u06cc \u0641\u06cc\u0644\u0688\u0632 \u0638\u0627\u06c1\u0631 \u06c1\u0648\u0646\u06d2 \u0686\u0627\u06c1\u0626\u06cc\u06ba \u062c\u0646\u06c1\u06cc\u06ba \u0688\u06cc\u0648\u0644\u067e\u0631 \u06a9\u0648 \u06a9\u0646\u0679\u0631\u0648\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-yaml\"># xrd-postgresql.yaml\n# Defines the PostgreSQLDatabase type that developers can request\n# Developers never see the RDS-specific configuration below\napiVersion: apiextensions.crossplane.io\/v1\nkind: CompositeResourceDefinition\nmetadata:\n  name: xpostgresqldatabases.platform.cloudfrugal.com\nspec:\n  group: platform.cloudfrugal.com\n  names:\n    kind: XPostgreSQLDatabase\n    plural: xpostgresqldatabases\n  claimNames:\n    kind: PostgreSQLDatabase     # This is what developers create\n    plural: postgresqldatabases\n  versions:\n    - name: v1alpha1\n      served: true\n      referenceable: true\n      schema:\n        openAPIV3Schema:\n          type: object\n          properties:\n            spec:\n              type: object\n              properties:\n                # Developer-facing fields only \u2014 simple and bounded\n                storageGB:\n                  type: integer\n                  minimum: 20\n                  maximum: 1000\n                  description: \"Storage in GB. Min 20, max 1000.\"\n                instanceClass:\n                  type: string\n                  enum: [\"small\", \"medium\", \"large\"]\n                  description: \"small=db.t4g.medium, medium=db.r7g.large, large=db.r7g.2xlarge\"\n                environment:\n                  type: string\n                  enum: [\"staging\", \"production\"]\n<\/code><\/pre>\n<p>\u0627\u06cc\u06a9 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0634\u0646 \u0627\u06cc\u06a9 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 \u06a9\u0627 \u0646\u0641\u0627\u0630 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0633\u0627\u062f\u06c1 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0641\u06cc\u0644\u0688\u0632 \u06a9\u0648 \u0645\u06a9\u0645\u0644 RDS \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u0645\u06cc\u06ba \u0646\u0642\u0634\u06c1 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06a9\u06d2 \u0645\u0639\u06cc\u0627\u0631\u0627\u062a \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062c\u0646\u06c1\u06cc\u06ba \u0688\u0648\u06cc\u0644\u067e\u0631 \u0627\u0648\u0648\u0631 \u0631\u0627\u0626\u0688 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0633\u06a9\u062a\u06d2\u06d4<\/p>\n<pre><code class=\"language-yaml\"># composition-postgresql.yaml\n# Defines what a PostgreSQLDatabase claim expands into\n# Platform standards (encryption, backup, deletion protection) are applied here\n# Developers cannot override them \u2014 the platform enforces them\napiVersion: apiextensions.crossplane.io\/v1\nkind: Composition\nmetadata:\n  name: postgresql-aws-composition\n  labels:\n    provider: aws\nspec:\n  compositeTypeRef:\n    apiVersion: platform.cloudfrugal.com\/v1alpha1\n    kind: XPostgreSQLDatabase\n\n  resources:\n    # The actual RDS instance \u2014 expanded from the simple developer claim\n    - name: rds-instance\n      base:\n        apiVersion: rds.aws.upbound.io\/v1beta1\n        kind: Instance\n        spec:\n          forProvider:\n            region: us-east-1\n            engine: postgres\n            engineVersion: \"15.4\"\n            # Platform standards \u2014 always applied, not developer-configurable\n            storageEncrypted: true           # Always encrypted\n            backupRetentionPeriod: 7         # Always 7-day backup\n            deletionProtection: true         # Always deletion-protected\n            multiAZ: false                   # Overridden to true for production (see patches)\n            dbSubnetGroupNameSelector:\n              matchLabels:\n                platform.cloudfrugal.com\/subnet-group: private\n      patches:\n        # Map the developer's simple instanceClass to the actual RDS instance type\n        - type: CombineFromComposite\n          combine:\n            variables:\n              - fromFieldPath: spec.instanceClass\n            strategy: string\n            string:\n              fmt: |\n                %s\n          toFieldPath: spec.forProvider.dbInstanceClass\n          transforms:\n            - type: map\n              map:\n                small:  db.t4g.medium\n                medium: db.r7g.large\n                large:  db.r7g.2xlarge\n\n        # Enable Multi-AZ for production automatically\n        - type: FromCompositeFieldPath\n          fromFieldPath: spec.environment\n          toFieldPath: spec.forProvider.multiAZ\n          transforms:\n            - type: map\n              map:\n                staging:    \"false\"\n                production: \"true\"\n\n        # Copy team labels from the claim to the RDS instance for cost attribution\n        - type: FromCompositeFieldPath\n          fromFieldPath: metadata.labels\n          toFieldPath: spec.forProvider.tags\n<\/code><\/pre>\n<p>PostgreSQL \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0627\u0628 \u0644\u06a9\u06be\u062a\u06d2 \u06c1\u06cc\u06ba:<\/p>\n<pre><code class=\"language-yaml\"># Developer creates this in their team's namespace\n# No RDS knowledge required. No IAM configuration. No subnet group lookup.\napiVersion: platform.cloudfrugal.com\/v1alpha1\nkind: PostgreSQLDatabase\nmetadata:\n  name: payment-service-db\n  namespace: payments-team\n  labels:\n    team: payments\n    cost-centre: payments-engineering\n    environment: staging\nspec:\n  storageGB: 100\n  instanceClass: medium\n  environment: staging\n<\/code><\/pre>\n<p>\u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u0627\u0633 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0648 \u0645\u0646\u0679\u0648\u06ba \u0645\u06cc\u06ba \u0622\u067e \u06a9\u06d2 \u067e\u0648\u0631\u06d2 RDS \u0645\u062b\u0627\u0644 \u0645\u06cc\u06ba \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062e\u0648\u062f\u06a9\u0627\u0631 \u0637\u0648\u0631 \u067e\u0631 \u0627\u0646\u06a9\u0631\u067e\u0634\u0646\u060c \u0628\u06cc\u06a9 \u0627\u067e\u0633\u060c \u0627\u0648\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06a9\u06d2 \u062a\u0645\u0627\u0645 \u0645\u0639\u06cc\u0627\u0631\u0627\u062a \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-34-verifying-crossplane-resource-provisioning\">3.4 \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc \u06a9\u06cc \u062a\u0635\u062f\u06cc\u0642 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-bash\"># Watch the claim status \u2014 it should transition to Ready=True\nkubectl get postgresqldatabases -n payments-team -w\n\n# Check the composite resource for detailed status\nkubectl describe xpostgresqldatabases.platform.cloudfrugal.com\n\n# Verify the actual AWS resource was created\naws rds describe-db-instances \\\n  --query 'DBInstances[?TagList[?Key==`team` && Value==`payments`]].[DBInstanceIdentifier,DBInstanceStatus]' \\\n  --output table\n<\/code><\/pre>\n<h2 id=\"heading-part-4-backstage-the-developer-portal\">\u062d\u0635\u06c1 4: \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c &#8211; \u0688\u0648\u06cc\u0644\u067e\u0631 \u067e\u0648\u0631\u0679\u0644<\/h2>\n<p>\u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0627\u06cc\u06a9 CNCF-\u0627\u0646\u06a9\u06cc\u0648\u0628\u06cc\u0679\u0688 \u0627\u0648\u067e\u0646 \u0633\u0648\u0631\u0633 \u0641\u0631\u06cc\u0645 \u0648\u0631\u06a9 \u06c1\u06d2 \u062c\u0648 \u0627\u0635\u0644 \u0645\u06cc\u06ba Spotify \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4 \u06cc\u06c1 IDP \u067e\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0627\u0646\u0679\u0631\u0641\u06cc\u0633 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u06cc\u06a9 \u0648\u0627\u062d\u062f \u062c\u06af\u06c1 \u062c\u06c1\u0627\u06ba \u0688\u0648\u06cc\u0644\u067e\u0631 \u062e\u062f\u0645\u0627\u062a \u06a9\u0648 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06cc\u06c1 \u062c\u0627\u0646\u0646\u06d2 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u0627\u062a \u062a\u0644\u0627\u0634 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u0627 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0646\u0638\u0627\u0645 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u062a\u06cc\u0646 \u0628\u0646\u06cc\u0627\u062f\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2:<\/p>\n<ol>\n<li>\n<p>\u0627\u06cc\u06a9 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u06a9\u06cc\u0679\u0644\u0627\u06af \u062c\u0648 \u0622\u067e \u06a9\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06a9\u06cc \u062a\u0645\u0627\u0645 \u062e\u062f\u0645\u0627\u062a\u060c APIs\u060c \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0648\u06ba \u0627\u0648\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u0641\u06c1\u0631\u0633\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 \u062c\u0648 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0648 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc \u0627\u0648\u0631 \u0646\u0626\u06cc \u0633\u0631\u0648\u0633 \u0627\u0633\u06a9\u0627\u0641\u0648\u0644\u0688\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2 \u0633\u06cc\u0644\u0641 \u0633\u0631\u0648\u0633 \u0641\u0627\u0631\u0645 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba<\/p>\n<\/li>\n<li>\n<p>TechDoc \u0627\u0633 \u06a9\u06cc\u0679\u0644\u0627\u06af \u06c1\u0633\u062a\u06cc \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0644 \u06a9\u0631 \u0648\u0627\u0642\u0639 \u06c1\u06d2 \u062c\u0648 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u06a9\u0648 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 \u062f\u0633\u062a\u0627\u0648\u06cc\u0632 \u06c1\u0645\u06cc\u0634\u06c1 \u0627\u0633\u06cc \u062c\u06af\u06c1 \u067e\u0631 \u0645\u0644 \u0633\u06a9\u06d2 \u062c\u0633 \u0645\u06cc\u06ba \u0627\u0633 \u0633\u0631\u0648\u0633 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ol>\n<p>\u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0679\u0627\u0626\u067e \u0627\u0633\u06a9\u0631\u067e\u0679 \u0645\u06cc\u06ba \u0631\u06cc \u0627\u06cc\u06a9\u0679 \u0641\u0631\u0646\u0679 \u0627\u06cc\u0646\u0688 \u0627\u0648\u0631 Node.js \u0628\u06cc\u06a9 \u0627\u06cc\u0646\u0688 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0628\u0646\u0627\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u062a\u0631\u062a\u06cc\u0628 \u0634\u062f\u06c1 \u06c1\u06d2\u060c \u0627\u0646\u0633\u0679\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0627\u06cc\u067e \u0628\u0646\u0627\u0626\u06cc\u06ba\u060c \u0627\u0633\u06d2 \u0627\u067e\u0646\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06a9\u06cc \u062a\u0641\u0635\u06cc\u0644\u0627\u062a \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u060c \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0627\u067e\u0646\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u06ba \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-41-creating-and-configuring-backstage\">4.1 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06a9\u06cc \u062a\u062e\u0644\u06cc\u0642 \u0627\u0648\u0631 \u062a\u0631\u062a\u06cc\u0628<\/h3>\n<pre><code class=\"language-bash\"># Create a new Backstage app\nnpx @backstage\/create-app@latest\n\n# When prompted:\n# App name: platform-portal\n# Choose SQLite for local development, PostgreSQL for production\n\ncd platform-portal\n<\/code><\/pre>\n<p>\u0627\u067e\u0646\u06d2 ArgoCD \u0645\u062b\u0627\u0644 \u0627\u0648\u0631 GitHub \u0633\u06d2 \u062c\u0691\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06a9\u0648 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\"># app-config.production.yaml\napp:\n  title: Cloudfrugal Platform Portal\n  baseUrl: https:\/\/platform.your-company.com\n\nbackend:\n  baseUrl: https:\/\/platform.your-company.com\n  database:\n    client: pg\n    connection:\n      host: ${POSTGRES_HOST}\n      port: 5432\n      user: ${POSTGRES_USER}\n      password: ${POSTGRES_PASSWORD}\n      database: backstage\n\n# GitHub integration for catalog discovery and template scaffolding\nintegrations:\n  github:\n    - host: github.com\n      apps:\n        - appId: ${GITHUB_APP_ID}\n          webhookSecret: ${GITHUB_WEBHOOK_SECRET}\n          clientId: ${GITHUB_CLIENT_ID}\n          clientSecret: ${GITHUB_CLIENT_SECRET}\n          privateKey: ${GITHUB_PRIVATE_KEY}\n\n# ArgoCD plugin configuration\nargocd:\n  username: ${ARGOCD_USERNAME}\n  password: ${ARGOCD_PASSWORD}\n  appLocatorMethods:\n    - type: 'config'\n      instances:\n        - name: main\n          url: https:\/\/argocd.your-company.com\n\n# Catalog auto-discovery \u2014 finds catalog-info.yaml files across your GitHub org\ncatalog:\n  providers:\n    github:\n      your-org:\n        organization: 'your-github-org'\n        catalogPath: '\/catalog-info.yaml'\n        filters:\n          branch: 'main'\n<\/code><\/pre>\n<h3 id=\"heading-42-the-software-catalog-registering-services\">4.2 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u06a9\u06cc\u0679\u0644\u0627\u06af &#8211; \u0633\u0631\u0648\u0633 \u0631\u062c\u0633\u0679\u0631\u06cc\u0634\u0646<\/h3>\n<p>\u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u067e\u0631 \u0645\u0648\u062c\u0648\u062f \u062a\u0645\u0627\u0645 \u062e\u062f\u0645\u0627\u062a\u060c APIs\u060c \u0644\u0627\u0626\u0628\u0631\u06cc\u0631\u06cc\u0627\u06ba\u060c \u0627\u0648\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u0648 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06a9\u06cc\u0679\u0644\u0627\u06af \u0645\u06cc\u06ba \u062f\u0631\u062c \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u0628\u0630\u0631\u06cc\u0639\u06c1: <code>catalog-info.yaml<\/code> \u0641\u0627\u0626\u0644\u06cc\u06ba \u0633\u0631\u0648\u0633 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0627\u0628\u0646\u062f \u06c1\u06cc\u06ba\u06d4 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u0627\u0646 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 GitHub \u0627\u0646\u0636\u0645\u0627\u0645 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06af\u0631 \u0641\u0627\u0626\u0644 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2 \u062a\u0648 \u0627\u0633\u06d2 \u062f\u0633\u062a\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u0646\u06c1\u06cc\u06ba \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-yaml\"># catalog-info.yaml \u2014 committed to each service's repository root\n# Backstage discovers this automatically via the GitHub integration\napiVersion: backstage.io\/v1alpha1\nkind: Component\nmetadata:\n  name: payment-api\n  title: Payment API\n  description: \"Core payment processing service. Handles transaction initiation, authorisation, and settlement.\"\n  annotations:\n    # Links ArgoCD to show deployment status in the Backstage UI\n    argocd\/app-name: production-payment-api\n    # Links GitHub Actions workflow status\n    github.com\/project-slug: your-org\/payment-api\n    # Links Grafana dashboard for this service\n    grafana\/dashboard-selector: \"title=Payment API\"\n    # Links PagerDuty on-call schedule\n    pagerduty.com\/service-id: P123456\n  tags:\n    - payments\n    - typescript\n    - critical\n  links:\n    - url: https:\/\/payment-api.docs.your-company.com\n      title: Documentation\n    - url: https:\/\/grafana.your-company.com\/d\/payment-api\n      title: Grafana Dashboard\nspec:\n  type: service\n  lifecycle: production\n  owner: group:payments-team\n  system: payment-platform\n  dependsOn:\n    - component:user-api\n    - resource:payment-service-db\n  providesApis:\n    - payment-api-v2\n<\/code><\/pre>\n<h3 id=\"heading-43-software-templates-self-service-infrastructure\">4.3 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 &#8211; \u0633\u06cc\u0644\u0641 \u0633\u0631\u0648\u0633 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631<\/h3>\n<p>\u0627\u06cc\u06a9 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u0627\u06cc\u06a9 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0641\u0627\u0631\u0645 \u06c1\u06d2 \u062c\u0648 \u062c\u0645\u0639 \u06a9\u0631\u0627\u0626\u06d2 \u062c\u0627\u0646\u06d2 \u067e\u0631 \u0627\u06cc\u06a9 Git \u06a9\u0645\u0679 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u06a9\u0645\u0679 \u0645\u06cc\u06ba \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc YAML\u060c \u06a9\u0648\u0688\u060c \u06cc\u0627 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062c\u0633 \u06a9\u06cc \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0622\u0624\u0679 \u067e\u0679 \u0627\u06cc\u06a9 \u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u06a9\u0644\u06cc\u0645 \u06c1\u06d2\u06d4 \u0646\u0626\u06cc \u0633\u0631\u0648\u0633 \u0627\u0633\u06a9\u0627\u0641\u0648\u0644\u0688\u0646\u06af \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u0622\u0624\u0679 \u067e\u0679 \u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u0633\u0631\u0648\u0633 \u06a9\u0646\u06a9\u0627\u0644 \u06c1\u06d2 \u062c\u0648 \u0646\u0626\u06d2 \u0631\u06cc\u067e\u0648\u0632\u0679\u0631\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0631\u0639\u0632\u0645 \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u0644\u06cc\u062f\u06cc \u0688\u06cc\u0632\u0627\u0626\u0646 \u06a9\u0627 \u0641\u06cc\u0635\u0644\u06c1: \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0636\u0645 \u06c1\u0648\u0646\u06d2 \u06a9\u06cc \u0628\u062c\u0627\u0626\u06d2 \u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u067e\u06cc\u062f\u0627 \u06a9\u0631\u0646\u06cc \u0686\u0627\u06c1\u0626\u06cc\u06ba\u06d4 PR \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 \u06a9\u0648 \u0645\u0631\u0626\u06cc\u062a \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0688\u06cc\u0648\u0644\u067e\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u0645\u062d\u0627\u062a \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u06c1\u0631 \u0627\u06cc\u06a9 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0622\u0688\u0679 \u0679\u0631\u06cc\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u0646\u0636\u0645\u0627\u0645 \u06a9\u06cc \u067e\u0627\u0644\u06cc\u0633\u06cc\u0627\u06ba \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u0622\u0624\u0679 \u067e\u0679 \u067e\u0631 \u0627\u0639\u062a\u0645\u0627\u062f \u0642\u0627\u0626\u0645 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u06a9\u0645 \u062e\u0637\u0631\u06d2 \u06a9\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc \u06a9\u06d2 \u0644\u06cc\u06d2 \u062c\u0627\u0626\u0632\u06d2 \u06a9\u06d2 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u06a9\u0648 \u062e\u062a\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\"># templates\/postgresql-database\/template.yaml\n# This template gives developers a form to request a PostgreSQL database\n# The output is a Crossplane PostgreSQLDatabase claim committed to the GitOps repo\napiVersion: scaffolder.backstage.io\/v1beta3\nkind: Template\nmetadata:\n  name: postgresql-database\n  title: PostgreSQL Database\n  description: Provision a managed PostgreSQL database on AWS RDS. Encryption, backups, and deletion protection are configured automatically by the platform.\n  tags:\n    - database\n    - postgresql\n    - aws\nspec:\n  owner: group:platform-team\n  type: infrastructure\n\n  # The form developers fill out in the Backstage UI\n  parameters:\n    - title: Database Configuration\n      required: [name, team, environment, storageGB, instanceClass]\n      properties:\n        name:\n          title: Database Name\n          type: string\n          description: \"Lowercase, hyphens only. E.g. payment-service-db\"\n          pattern: '^[a-z][a-z0-9-]*$'\n\n        team:\n          title: Owning Team\n          type: string\n          description: \"Your team name. Used for cost attribution and ownership.\"\n          ui:field: OwnerPicker\n          ui:options:\n            catalogFilter:\n              kind: Group\n\n        environment:\n          title: Environment\n          type: string\n          enum: [staging, production]\n          default: staging\n\n        storageGB:\n          title: Storage (GB)\n          type: integer\n          minimum: 20\n          maximum: 1000\n          default: 50\n\n        instanceClass:\n          title: Instance Size\n          type: string\n          enum: [small, medium, large]\n          enumNames:\n            - \"Small (db.t4g.medium) \u2014 dev\/staging workloads\"\n            - \"Medium (db.r7g.large) \u2014 moderate production traffic\"\n            - \"Large (db.r7g.2xlarge) \u2014 high-throughput production\"\n          default: small\n\n  # What the template does when submitted\n  steps:\n    - id: generate-claim\n      name: Generate Crossplane Claim\n      action: fetch:template\n      input:\n        url: .\/skeleton    # Contains the Crossplane claim YAML template\n        values:\n          name: ${{ parameters.name }}\n          team: ${{ parameters.team | parseEntityRef | pick('name') }}\n          environment: ${{ parameters.environment }}\n          storageGB: ${{ parameters.storageGB }}\n          instanceClass: ${{ parameters.instanceClass }}\n\n    - id: create-pr\n      name: Create Pull Request to GitOps Repo\n      action: publish:github:pull-request\n      input:\n        repoUrl: github.com?repo=gitops-repo&owner=your-org\n        title: \"Platform: Provision PostgreSQL database ${{ parameters.name }} for ${{ parameters.team }}\"\n        branchName: \"provision-db-${{ parameters.name }}-${{ '' | now }}\"\n        description: |\n          Requesting PostgreSQL database provisioned by Crossplane.\n\n          - **Name:** ${{ parameters.name }}\n          - **Team:** ${{ parameters.team }}\n          - **Environment:** ${{ parameters.environment }}\n          - **Storage:** ${{ parameters.storageGB }}GB\n          - **Instance:** ${{ parameters.instanceClass }}\n\n          Approve this PR to trigger provisioning. ArgoCD will pick up the change and Crossplane will create the RDS instance within ~5 minutes of merge.\n        sourcePath: .\/skeleton\n\n  output:\n    links:\n      - title: View Pull Request\n        url: ${{ steps['create-pr'].output.remoteUrl }}\n      - title: Track Provisioning in ArgoCD\n        url: https:\/\/argocd.your-company.com\/applications\n<\/code><\/pre>\n<p>\u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u0633\u06a9\u06cc\u0644\u06cc\u0679\u0646 \u0688\u0627\u0626\u0631\u06a9\u0679\u0631\u06cc \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u0645\u062a\u063a\u06cc\u0631 \u067e\u0644\u06cc\u0633 \u06c1\u0648\u0644\u0688\u0631\u0632 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0644\u06cc\u0645\u0632 \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-yaml\"># templates\/postgresql-database\/skeleton\/databases\/${{ values.name }}.yaml\napiVersion: platform.cloudfrugal.com\/v1alpha1\nkind: PostgreSQLDatabase\nmetadata:\n  name: ${{ values.name }}\n  namespace: ${{ values.team }}-platform\n  labels:\n    team: ${{ values.team }}\n    cost-centre: ${{ values.team }}-engineering\n    environment: ${{ values.environment }}\n    managed-by: backstage-scaffolder\nspec:\n  storageGB: ${{ values.storageGB }}\n  instanceClass: ${{ values.instanceClass }}\n  environment: ${{ values.environment }}\n<\/code><\/pre>\n<h2 id=\"heading-part-5-wiring-it-together-the-golden-path\">\u062d\u0635\u06c1 5: \u0627\u06cc\u06a9 \u0633\u0627\u062a\u06be \u062c\u0691\u0646\u0627 &#8211; \u0633\u0646\u06c1\u0631\u06cc \u0631\u0627\u0633\u062a\u06c1<\/h2>\n<p>\u06af\u0648\u0644\u0688\u0646 \u067e\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u0627\u06cc\u0646\u0688 \u0679\u0648 \u0627\u06cc\u0646\u0688 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u0688\u0648\u06cc\u0644\u067e\u0631 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0648\u06c1 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u06af\u0679 \u06a9\u0645\u0679 \u0628\u0646 \u062c\u0627\u062a\u06cc \u06c1\u06d2\u060c ArgoCD \u06a9\u0644\u0633\u0679\u0631 \u067e\u0631 \u06a9\u0645\u0679 \u06a9\u0627 \u0627\u0637\u0644\u0627\u0642 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u0627\u0635\u0644 AWS \u0648\u0633\u0627\u0626\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u0627\u0648\u0631 \u0646\u062a\u0627\u0626\u062c \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06a9\u06cc\u0679\u0644\u0627\u06af \u0627\u0648\u0631 ArgoCD \u0688\u06cc\u0634 \u0628\u0648\u0631\u0688 \u062f\u0648\u0646\u0648\u06ba \u0645\u06cc\u06ba \u062f\u06a9\u06be\u0627\u0626\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-51-the-complete-flow\">5.1 \u0645\u062c\u0645\u0648\u0639\u06cc \u0628\u06c1\u0627\u0624<\/h3>\n<pre><code class=\"language-plaintext\">Developer fills form in Backstage\n    \u2193\nBackstage Software Template renders the Crossplane claim YAML\n    \u2193\nBackstage creates a Pull Request in the GitOps repository\n    \u2193\nPlatform engineer (or auto-merge policy) approves and merges the PR\n    \u2193\nArgoCD detects the new file in the GitOps repository\n    \u2193\nArgoCD applies the Crossplane claim to the cluster\n    \u2193\nCrossplane reconciles the claim to an actual AWS RDS instance\n    \u2193\nDeveloper receives the database endpoint via Kubernetes Secret\n    \u2193\nBackstage catalog shows the new resource, owned by the requesting team\n<\/code><\/pre>\n<h3 id=\"heading-52-surfacing-resource-status-back-in-backstage\">5.2 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0645\u06cc\u06ba \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u06a9\u0648 \u062f\u0648\u0628\u0627\u0631\u06c1 \u062f\u06a9\u06be\u0627\u0626\u06cc\u06ba\u06d4<\/h3>\n<p>Backstage Kubernetes \u067e\u0644\u06af \u0627\u0646 \u0622\u067e \u06a9\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u0633\u06d2 \u0644\u0627\u0626\u06cc\u0648 \u067e\u0648\u0688 \u0627\u0648\u0631 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u06a9\u0648 \u0628\u0627\u0632\u06cc\u0627\u0641\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0646\u06c1\u06cc\u06ba \u06c1\u0631 \u06a9\u06cc\u0679\u0644\u0627\u06af \u06c1\u0633\u062a\u06cc \u06a9\u06d2 \u0635\u0641\u062d\u06c1 \u067e\u0631 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u0686\u06cc\u06a9 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u06a9\u06c1 \u0622\u06cc\u0627 \u06a9\u0648\u0626\u06cc \u0633\u0631\u0648\u0633 \u0686\u0644 \u0631\u06c1\u06cc \u06c1\u06d2\u060c \u06a9\u062a\u0646\u06cc \u0646\u0642\u0644\u06cc\u06ba \u0635\u062d\u062a \u0645\u0646\u062f \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u06a9\u06cc\u0627 \u0622\u062e\u0631\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0648 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u0686\u06be\u0648\u0691\u0646\u06d2 \u06cc\u0627 \u06a9\u0686\u06be \u0633\u06cc\u06a9\u06be\u0646\u06d2 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u06c1\u0645 \u0622\u06c1\u0646\u06af \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4 <code>kubectl<\/code>:<\/p>\n<pre><code class=\"language-bash\"># Install the Kubernetes plugin packages\ncd platform-portal\nyarn --cwd packages\/app add @backstage\/plugin-kubernetes\nyarn --cwd packages\/backend add @backstage\/plugin-kubernetes-backend\n<\/code><\/pre>\n<pre><code class=\"language-yaml\"># app-config.production.yaml \u2014 add Kubernetes cluster configuration\nkubernetes:\n  serviceLocatorMethod:\n    type: 'multiTenant'\n  clusterLocatorMethods:\n    - type: 'config'\n      clusters:\n        - name: production-eks\n          url: ${PRODUCTION_CLUSTER_URL}\n          authProvider: serviceAccount\n          serviceAccountToken: ${PRODUCTION_SA_TOKEN}\n          caData: ${PRODUCTION_CA_DATA}\n        - name: staging-eks\n          url: ${STAGING_CLUSTER_URL}\n          authProvider: serviceAccount\n          serviceAccountToken: ${STAGING_SA_TOKEN}\n          caData: ${STAGING_CA_DATA}\n<\/code><\/pre>\n<p>\u06c1\u0631 \u06a9\u06cc\u0679\u0644\u0627\u06af \u06c1\u0633\u062a\u06cc \u06a9\u06cc \u062a\u0634\u0631\u06cc\u062d \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0633\u06d2 Kubernetes \u0648\u0633\u0627\u0626\u0644 \u0633\u06d2 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-yaml\"># In each service's catalog-info.yaml\nannotations:\n  backstage.io\/kubernetes-label-selector: 'app=payment-api'\n  backstage.io\/kubernetes-namespace: payments-team\n<\/code><\/pre>\n<h3 id=\"heading-53-installing-the-argocd-plugin\">5.3 ArgoCD \u067e\u0644\u06af \u0627\u0646 \u06a9\u06cc \u062a\u0646\u0635\u06cc\u0628<\/h3>\n<p>ArgoCD \u067e\u0644\u06af \u0627\u0646 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06cc \u062a\u0627\u0631\u06cc\u062e \u0627\u0648\u0631 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631\u06cc \u06a9\u06cc \u062d\u06cc\u062b\u06cc\u062a \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06c1\u0633\u062a\u06cc \u06a9\u06d2 \u0635\u0641\u062d\u06c1 \u067e\u0631 \u062f\u06a9\u06be\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u062c\u0628 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u06cc\u0679\u0644\u0627\u06af \u0645\u06cc\u06ba \u0628\u0644\u0646\u06af API \u06a9\u0627 \u0635\u0641\u062d\u06c1 \u06a9\u06be\u0648\u0644\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062a\u0648 \u0648\u06c1 \u0622\u062e\u0631\u06cc 10 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc\u0648\u06ba\u060c \u0645\u0648\u062c\u0648\u062f\u06c1 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631\u06cc \u06a9\u06cc \u0635\u0648\u0631\u062a\u062d\u0627\u0644\u060c \u0627\u0648\u0631 ArgoCD UI \u06a9\u0648 \u06a9\u06be\u0648\u0644\u06d2 \u0628\u063a\u06cc\u0631 \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0635\u062d\u062a \u0645\u0646\u062f \u06c1\u06d2 \u06cc\u0627 \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">yarn --cwd packages\/app add @roadiehq\/backstage-plugin-argo-cd\n<\/code><\/pre>\n<pre><code class=\"language-typescript\">\/\/ packages\/app\/src\/components\/catalog\/EntityPage.tsx\nimport { EntityArgoCDOverviewCard } from '@roadiehq\/backstage-plugin-argo-cd';\n\n\/\/ Add to the service entity page layout\nconst serviceEntityPage = (\n  <entitylayout>\n    <entitylayout.route path=\"\/\" title=\"Overview\">\n      <grid container=\"\" spacing=\"{3}\">\n        <grid item=\"\" md=\"{6}\">\n          <entityaboutcard variant=\"gridItem\"\/>\n        <\/grid>\n        <grid item=\"\" md=\"{6}\">\n          {\/* ArgoCD deployment status \u2014 shows sync state and recent deployments *\/}\n          <entityargocdoverviewcard\/>\n        <\/grid>\n      <\/grid>\n    <\/entitylayout.route>\n  <\/entitylayout>\n);\n<\/code><\/pre>\n<h2 id=\"heading-part-6-finops-integration-cost-attribution-on-the-idp\">\u062d\u0635\u06c1 6: FinOps \u0627\u0646\u0679\u06cc\u06af\u0631\u06cc\u0634\u0646 &#8211; IDPs \u06a9\u06d2 \u0644\u06cc\u06d2 \u0644\u0627\u06af\u062a \u06a9\u0627 \u0627\u0646\u062a\u0633\u0627\u0628<\/h2>\n<p>\u0622\u0626\u06cc \u0688\u06cc \u067e\u06cc\u0632 \u062c\u0648 \u0628\u063a\u06cc\u0631 \u0644\u0627\u06af\u062a \u06a9\u06d2 \u0627\u0646\u062a\u0633\u0627\u0628 \u06a9\u06d2 \u0648\u0633\u0627\u0626\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba \u0646\u0626\u06d2 \u0686\u06cc\u0644\u0646\u062c\u0632 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0628 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u062f\u06c1 \u0628\u0644\u0648\u06ba \u06a9\u06cc \u0648\u0627\u0636\u062d \u0645\u0644\u06a9\u06cc\u062a \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc \u06c1\u06d2\u06d4 IDP \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0628\u0646\u0627\u0626\u06d2 \u06af\u0626\u06d2 \u062a\u0645\u0627\u0645 \u0648\u0633\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0679\u06cc\u0645 \u0627\u0648\u0631 \u0644\u0627\u06af\u062a \u06a9\u06d2 \u0645\u0631\u06a9\u0632 \u06a9\u0627 \u0645\u06cc\u0679\u0627 \u0688\u06cc\u0679\u0627 \u0627\u0633 \u0648\u0642\u062a \u0633\u06d2 \u0644\u06d2 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 \u062c\u0628 \u0633\u06d2 \u0648\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u06cc\u06d2 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-61-mandatory-labels-on-every-crossplane-composition\">6.1 \u062a\u0645\u0627\u0645 \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0637\u0644\u0648\u0628\u06c1 \u0644\u06cc\u0628\u0644<\/h3>\n<p>\u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0634\u0646\u0632 \u0648\u06c1 \u06c1\u06cc\u06ba \u062c\u06c1\u0627\u06ba \u0644\u0627\u06af\u062a \u06a9\u0627 \u0627\u0646\u062a\u0633\u0627\u0628 \u0627\u06cc\u06a9 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u067e\u0631\u062a \u067e\u0631 \u0646\u0627\u0641\u0630 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2 \u062c\u0633\u06d2 \u0688\u06cc\u0648\u0644\u067e\u0631 \u062f\u0631\u067e\u06cc\u0634 \u062f\u0639\u0648\u0648\u06ba \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0688\u06cc\u0648\u0644\u067e\u0631\u0632 \u06a9\u0648 \u0631\u0648\u06a9 \u0646\u06c1\u06cc\u06ba \u0633\u06a9\u062a\u06d2\u06d4 \u06cc\u06c1 \u0644\u06cc\u0628\u0644 \u0627\u0635\u0644 AWS \u0648\u0633\u0627\u0626\u0644 \u0645\u06cc\u06ba \u0628\u0637\u0648\u0631 \u0679\u06cc\u06af \u0628\u06be\u06cc\u062c\u06d2 \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06cc\u06c1 AWS Cost Explorer \u0645\u06cc\u06ba \u0638\u0627\u06c1\u0631 \u06c1\u0648\u06af\u0627 \u0627\u0648\u0631 \u0627\u0633\u06d2 \u0679\u06cc\u0645 \u06a9\u06cc \u0633\u0637\u062d \u06a9\u06cc \u0644\u0627\u06af\u062a \u06a9\u06cc \u0631\u067e\u0648\u0631\u0679\u0633 \u0628\u0646\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-yaml\"># In every Composition, add mandatory cost attribution patches\npatches:\n  # These labels flow to the actual AWS resource as tags\n  # They can't be omitted or overridden by the developer claim\n  - type: FromCompositeFieldPath\n    fromFieldPath: metadata.labels[team]\n    toFieldPath: spec.forProvider.tags[team]\n\n  - type: FromCompositeFieldPath\n    fromFieldPath: metadata.labels[cost-centre]\n    toFieldPath: spec.forProvider.tags[cost-centre]\n\n  - type: FromCompositeFieldPath\n    fromFieldPath: metadata.labels[environment]\n    toFieldPath: spec.forProvider.tags[environment]\n\n  # Add a managed-by tag to identify all IDP-provisioned resources\n  - type: FromCompositeFieldPath\n    fromFieldPath: metadata.name\n    toFieldPath: spec.forProvider.tags[managed-by]\n    transforms:\n      - type: string\n        string:\n          fmt: \"idp-crossplane\"\n<\/code><\/pre>\n<h3 id=\"heading-62-cost-attribution-query\">6.2 \u0644\u0627\u06af\u062a \u0633\u06d2 \u0645\u062a\u0639\u0644\u0642 \u0627\u0633\u062a\u0641\u0633\u0627\u0631<\/h3>\n<p>\u062a\u0645\u0627\u0645 \u0648\u0633\u0627\u0626\u0644 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u0637\u0644\u0648\u0628\u06c1 \u0679\u06cc\u06af\u0632 \u0622\u067e \u06a9\u0648 AWS Cost Explorer \u0633\u06d2 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0679\u06cc\u0645 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0635\u0644 \u0627\u062e\u0631\u0627\u062c\u0627\u062a \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0641\u0633\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\"># Monthly cost breakdown by team \u2014 all IDP-provisioned resources\naws ce get-cost-and-usage \\\n  --time-period Start=$(date -d 'last month' +%Y-%m-01),End=$(date +%Y-%m-01) \\\n  --granularity MONTHLY \\\n  --filter '{\n    \"Tags\": {\n      \"Key\": \"managed-by\",\n      \"Values\": [\"idp-crossplane\"]\n    }\n  }' \\\n  --group-by Type=TAG,Key=team \\\n  --metrics UnblendedCost \\\n  --query 'ResultsByTime[0].Groups[*].{Team:Keys[0],Cost:Metrics.UnblendedCost.Amount}' \\\n  --output table\n<\/code><\/pre>\n<p>\u062a\u0645\u0627\u0645 \u0679\u06cc\u0645\u06cc\u06ba \u062c\u0648 \u0622\u0626\u06cc \u0688\u06cc \u067e\u06cc \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0648\u0633\u0627\u0626\u0644 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06cc\u06ba \u0627\u0628 \u0627\u0646 \u06a9\u06cc \u0644\u0627\u06af\u062a \u06a9\u06cc \u0631\u067e\u0648\u0631\u0679\u0648\u06ba \u067e\u0631 \u0627\u0646 \u06a9\u06cc \u0679\u06cc\u0645 \u06a9\u06d2 \u0646\u0627\u0645 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u06a9 \u0644\u0627\u0626\u0646 \u06c1\u0648\u06af\u06cc\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0686\u0627\u0631\u062c \u0628\u06cc\u06a9 \u0645\u0627\u0688\u0644 \u06c1\u06d2 \u062c\u0648 FinOps \u06a9\u0648 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u067e\u06cc\u0645\u0627\u0646\u06d2 \u067e\u0631 \u067e\u0627\u0626\u06cc\u062f\u0627\u0631 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u0634\u0631\u0627\u06a9\u062a\u06cc\u06ba \u062e\u0648\u062f\u06a9\u0627\u0631 \u06c1\u06cc\u06ba\u060c \u062f\u0633\u062a\u06cc \u0646\u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-part-7-the-platform-maturity-model-measuring-what-youve-built\">\u062d\u0635\u06c1 7: \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0645\u06cc\u0686\u0648\u0631\u0679\u06cc \u0645\u0627\u0688\u0644 &#8211; \u0622\u067e \u0646\u06d2 \u062c\u0648 \u0628\u0646\u0627\u06cc\u0627 \u06c1\u06d2 \u0627\u0633 \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>CNCF \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0645\u06cc\u0686\u0648\u0631\u0679\u06cc \u0645\u0627\u0688\u0644 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06a9\u06cc \u067e\u062e\u062a\u06af\u06cc \u06a9\u06cc \u067e\u0627\u0646\u0686 \u0633\u0637\u062d\u0648\u06ba \u06a9\u06cc \u0648\u0636\u0627\u062d\u062a \u06a9\u0631\u062a\u0627 \u06c1\u06d2: \u0622\u067e \u06a9\u06c1\u0627\u06ba \u06c1\u06cc\u06ba \u06cc\u06c1 \u062c\u0627\u0646\u0646\u0627 \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u0641\u06cc\u0635\u0644\u06c1 \u06a9\u0631\u0646\u06d2 \u0645\u06cc\u06ba \u0645\u062f\u062f \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0627\u06af\u0644\u0627 \u06a9\u06cc\u0627 \u0628\u0646\u0627\u0646\u0627 \u06c1\u06d2 \u0627\u0648\u0631 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0644\u06cc\u0688\u0631\u0648\u06ba \u06a9\u0648 \u067e\u06cc\u0634\u0631\u0641\u062a \u0633\u06d2 \u0622\u06af\u0627\u06c1 \u06a9\u0631\u0646\u0627 \u06c1\u06d2\u06d4<\/p>\n<table>\n<thead>\n<tr>\n<th>\u067e\u0627\u0646\u06cc \u06a9\u06cc \u0633\u0637\u062d<\/th>\n<th>\u0646\u0627\u0645<\/th>\n<th>\u062e\u0635\u0648\u0635\u06cc\u0627\u062a<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>\u0639\u0627\u0631\u0636\u06cc<\/td>\n<td>\u06a9\u0648\u0626\u06cc \u0627\u06cc\u0688\u06c1\u0627\u06a9 \u0627\u0633\u06a9\u0631\u067e\u0679\u0633 \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u062f\u0633\u062a\u06cc \u0641\u0631\u0627\u06c1\u0645\u06cc \u0646\u06c1\u06cc\u06ba\u060c \u06a9\u0648\u0626\u06cc \u0645\u0639\u06cc\u0627\u0631\u06cc \u0679\u0648\u0644\u0632 \u0646\u06c1\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>\u06a9\u0627\u0645<\/td>\n<td>\u0645\u0639\u06cc\u0627\u0631\u06cc \u0679\u0648\u0644\u0632\u060c \u06a9\u0686\u06be \u0622\u0679\u0648\u0645\u06cc\u0634\u0646\u060c Kubernetes \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>\u0642\u0627\u0628\u0644 \u062a\u0648\u0633\u06cc\u0639<\/td>\n<td>\u0633\u06cc\u0644\u0641 \u0633\u0631\u0648\u0633 \u067e\u0648\u0631\u0679\u0644\u060c GitOps \u0633\u06d2 \u0686\u0644\u0646\u06d2 \u0648\u0627\u0644\u0627\u060c \u062f\u0633\u062a\u0627\u0648\u06cc\u0632\u06cc \u06af\u0648\u0644\u0688\u0646 \u067e\u0627\u062a\u06be<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>\u0627\u0635\u0644\u0627\u062d<\/td>\n<td>\u0644\u0627\u06af\u062a \u06a9\u0627 \u0627\u0646\u062a\u0633\u0627\u0628\u060c \u062e\u0648\u062f \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06a9\u0627 SLO\u060c \u0635\u0627\u0631\u0641 \u06a9\u06cc \u0631\u0627\u0626\u06d2 \u06a9\u0627 \u0644\u0648\u067e<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>\u0622\u067e\u0679\u0645\u0627\u0626\u0632\u0688<\/td>\n<td>AI \u06a9\u06cc \u0645\u062f\u062f \u0633\u06d2 \u0641\u0631\u0627\u06c1\u0645\u06cc\u060c \u067e\u06cc\u0634\u0646 \u06af\u0648\u0626\u06cc \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634\u060c \u0627\u0648\u0631 \u0645\u06a9\u0645\u0644 FinOps \u0627\u0646\u0636\u0645\u0627\u0645<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0622\u067e \u0645\u06a9\u0645\u0644 Backstage + ArgoCD + Crossplane \u0646\u0641\u0627\u0630 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0644\u06cc\u0648\u0644 3 \u062a\u06a9 \u067e\u06c1\u0646\u0686 \u062c\u0627\u0626\u06cc\u06ba \u06af\u06d2\u060c \u0644\u0627\u06af\u062a \u06a9\u06d2 \u0627\u0646\u062a\u0633\u0627\u0628 \u0627\u0648\u0631 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u06a9\u0645\u0644 \u062c\u0648 \u0633\u0628 \u0633\u06d2 \u0639\u0627\u0645 \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0648\u06ba \u06a9\u0648 \u067e\u0648\u0631\u0627 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0644\u06cc\u0648\u0644 4 \u067e\u0631 \u062c\u0627\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06a9\u06cc \u0635\u062d\u062a \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba SLO \u0627\u0644\u0631\u0679\u0633 \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2\u060c \u0633\u06c1 \u0645\u0627\u06c1\u06cc \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u06d2 \u062a\u062c\u0631\u0628\u06d2 \u06a9\u06d2 \u0633\u0631\u0648\u06d2 \u0686\u0644\u0627\u0646\u06d2\u060c \u0627\u0648\u0631 \u0627\u0646\u062a\u0633\u0627\u0628 \u0679\u06cc\u06af\u0632 \u0633\u06d2 \u0679\u06cc\u0645 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0645\u062e\u0635\u0648\u0635 \u0644\u0627\u06af\u062a \u06a9\u06cc \u0631\u067e\u0648\u0631\u0679\u0633 \u062a\u06cc\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u0648\u0644 3 \u0645\u06cc\u06ba \u0633\u0628 \u0633\u06d2 \u0639\u0627\u0645 \u063a\u0644\u0637\u06cc \u06af\u0648\u062f \u0644\u06cc\u0646\u06d2 \u06a9\u06cc \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 \u0645\u0632\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0628\u0646\u0627\u0646\u0627 \u06c1\u06d2\u06d4 \u0627\u06cc\u06a9 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u062c\u0633 \u0645\u06cc\u06ba 12 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 \u06c1\u06cc\u06ba \u0644\u06cc\u06a9\u0646 \u0628\u0627\u0642\u0627\u0639\u062f\u06af\u06cc \u0633\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06d2 \u0635\u0631\u0641 2 \u0644\u06cc\u0648\u0644 3 \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u067e\u06c1\u0646\u0686\u06d2\u06d4 \u06c1\u0645 \u0645\u0632\u06cc\u062f YAML \u0633\u0645\u06cc\u062a \u0644\u06cc\u0648\u0644 2 \u067e\u0631 \u067e\u06c1\u0646\u0686 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4 \u067e\u06cc\u0645\u0627\u0626\u0634 \u06a9\u0631\u06cc\u06ba \u06a9\u06c1 \u06a9\u0648\u0646 \u0633\u06d2 \u0633\u0646\u06c1\u0631\u06cc \u0631\u0627\u0633\u062a\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u06d2 \u062c\u0627 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0627 \u0627\u0646\u0679\u0631\u0648\u06cc\u0648 \u06a9\u0631\u06cc\u06ba \u062c\u0648 \u067e\u0648\u0631\u0679\u0644 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0646\u06c1\u06cc\u06ba \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u0634\u0627\u0645\u0644 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0631\u06af\u0691 \u06a9\u0648 \u062f\u0648\u0631 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-best-practices-summary\">\u0628\u06c1\u062a\u0631\u06cc\u0646 \u0637\u0631\u06cc\u0642\u0648\u06ba \u06a9\u0627 \u062e\u0644\u0627\u0635\u06c1<\/h2>\n<p> <strong>\u06a9\u0631\u0646\u0627:<\/strong> \u0627\u0646\u06c1\u06cc\u06ba \u062a\u0631\u062a\u06cc\u0628 \u0633\u06d2 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u0633\u0628 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06cc\u06c1 ArgoCD\u060c Crossplane\u060c \u0627\u0648\u0631 Backstage \u067e\u0631 \u0645\u0634\u062a\u0645\u0644 \u06c1\u06d2\u06d4 \u06c1\u0631 \u067e\u0631\u062a \u067e\u0686\u06be\u0644\u06cc \u067e\u0631\u062a \u067e\u0631 \u0645\u0646\u062d\u0635\u0631 \u06c1\u06d2\u06d4<\/p>\n<p> <strong>\u06a9\u0631\u0646\u0627:<\/strong> \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06a9\u0648 \u0628\u0637\u0648\u0631 \u06af\u0679 \u06a9\u0645\u0679 \u062c\u0646\u0631\u06cc\u0679\u0631 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u060c \u0646\u06c1 \u06a9\u06c1 \u0627\u0646\u0641\u0631\u0627\u0633\u0679\u0631\u06a9\u0686\u0631 \u06a9\u0627\u0644\u0631 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631\u06d4 \u062a\u0645\u0627\u0645 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0688\u06be\u0627\u0646\u0686\u06d2 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0627\u06ba \u0642\u0627\u0628\u0644 \u0622\u0688\u0679 \u06c1\u0648\u0646\u06cc \u0686\u0627\u06c1\u0626\u06cc\u06ba \u06af\u0679 \u06a9\u0645\u0679\u06d4<\/p>\n<p> <strong>\u06a9\u0631\u0646\u0627:<\/strong> \u06a9\u0631\u0627\u0633 \u067e\u0644\u06cc\u0646 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0634\u0646 \u0644\u06cc\u0626\u0631\u0632 \u067e\u0631 \u0644\u0627\u06af\u062a \u06a9\u06d2 \u0627\u0646\u062a\u0633\u0627\u0628 \u06a9\u06d2 \u0679\u06cc\u06af\u0632 \u0644\u06af\u0627\u0626\u06cc\u06ba\u060c \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u06d2 \u062f\u0639\u0648\u0648\u06ba \u067e\u0631 \u0646\u06c1\u06cc\u06ba\u06d4 \u06a9\u0648\u0626\u06cc \u0628\u06be\u06cc \u0627\u0646\u062a\u0633\u0627\u0628 \u062c\u0648 \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06c1 \u0646\u0638\u0631\u0627\u0646\u062f\u0627\u0632 \u06a9\u06cc\u0627 \u062c\u0627\u0633\u06a9\u062a\u0627 \u06c1\u06d2 \u0627\u0633\u06d2 \u0646\u0638\u0631\u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/p>\n<p> <strong>\u06a9\u0631\u0646\u0627:<\/strong> \u062f\u0648 \u06cc\u0627 \u062a\u06cc\u0646 \u0633\u0627\u0641\u0679 \u0648\u06cc\u0626\u0631 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0634\u0631\u0648\u0639 \u06a9\u0631\u06cc\u06ba \u0627\u0648\u0631 \u0645\u0632\u06cc\u062f \u0628\u0646\u0627\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2 \u0627\u0646\u06c1\u06cc\u06ba \u0627\u0686\u06be\u0627 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679 \u06a9\u0648 \u0627\u067e\u0646\u0627\u0646\u0627 \u0633\u0628 \u0633\u06d2 \u0627\u06c1\u0645 \u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u0627\u0634\u0627\u0631\u06d2 \u06c1\u06d2\u06d4<\/p>\n<p> <strong>\u06a9\u0631\u0646\u0627:<\/strong> \u067e\u06c1\u0644\u06d2 \u062f\u0646 \u0633\u06d2 \u0627\u067e\u0646\u06cc \u062a\u0645\u0627\u0645 \u062e\u062f\u0645\u0627\u062a \u06a9\u0648 \u0628\u06cc\u06a9 \u0627\u0633\u0679\u06cc\u062c \u06a9\u06cc\u0679\u0644\u0627\u06af \u0645\u06cc\u06ba \u0631\u062c\u0633\u0679\u0631 \u06a9\u0631\u06cc\u06ba\u06d4 \u06a9\u06cc\u0679\u0644\u0627\u06af \u06a9\u06cc \u0642\u062f\u0631 \u0627\u0633 \u06a9\u06d2 \u062f\u0627\u0626\u0631\u06c1 \u06a9\u0627\u0631 \u06a9\u06d2 \u0645\u062a\u0646\u0627\u0633\u0628 \u06c1\u06d2\u06d4<\/p>\n<p> <strong>\u06a9\u0631\u0646\u0627:<\/strong> ArgoCD \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u067e\u0646\u06d2 \u06a9\u0644\u0633\u0679\u0631 \u06a9\u0648 \u06a9\u0631\u0627\u0633\u067e\u0644\u06cc\u0646 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06cc\u06ba\u06d4 <code>helm install<\/code>. \u06c1\u0631 \u0648\u06c1 \u0686\u06cc\u0632 \u062c\u0633 \u06a9\u0627 IDP \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u062e\u0648\u062f IDP \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u0627\u0646\u062a\u0638\u0627\u0645 \u06a9\u06cc\u0627 \u062c\u0627\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2\u06d4<\/p>\n<p> <strong>\u0645\u062a \u06a9\u0631\u0648:<\/strong> Backstage \u06a9\u0648 \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u06a9\u0644\u0627\u0624\u0688 APIs \u0633\u06d2 \u0645\u0631\u0628\u0648\u0637 \u06a9\u0631\u06cc\u06ba\u06d4 \u06a9\u0648\u0626\u06cc \u0622\u0688\u0679 \u0679\u0631\u06cc\u0644\u060c \u0631\u0648\u0644 \u0628\u06cc\u06a9\u0633\u060c \u06cc\u0627 \u0645\u0641\u0627\u06c1\u0645\u062a\u06cc\u06ba \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/p>\n<p> <strong>\u0645\u062a \u06a9\u0631\u0648:<\/strong> Crossplane XRD \u0628\u0631\u0627\u06c1 \u0631\u0627\u0633\u062a \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0648 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u06cc\u06ba\u06d4 \u0622\u0631 \u0688\u06cc \u0627\u06cc\u0633 \u06a9\u06cc \u0645\u062e\u0635\u0648\u0635 \u0633\u0627\u062e\u062a \u06a9\u0648 \u0686\u06be\u067e\u0627\u0646\u06d2 \u0627\u0648\u0631 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u06a9\u06d2 \u0645\u0639\u06cc\u0627\u0631\u0627\u062a \u06a9\u0648 \u0646\u0627\u0641\u0630 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0645\u067e\u0648\u0632\u06cc\u0634\u0646 \u062e\u0644\u0627\u0635\u06c1 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2\u06d4 \u0627\u0633 \u06a9\u0648 \u0646\u0638\u0631\u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u0645\u0642\u0635\u062f \u062e\u062a\u0645 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p> <strong>\u0645\u062a \u06a9\u0631\u0648:<\/strong> IDP \u06a9\u0648 \u0622\u0632\u0627\u062f\u0627\u0646\u06c1 \u0637\u0648\u0631 \u067e\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0645\u06a9\u0645\u0644 \u06c1\u0648\u0646\u06d2 \u067e\u0631 \u0627\u0633\u06d2 \u0645\u0637\u0644\u0639 \u06a9\u0631\u06cc\u06ba\u06d4 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u067e\u0631\u0648\u0688\u06a9\u0679 \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u06c1\u06d2\u06d4 \u067e\u06c1\u0644\u06d2 \u062f\u0648 \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679\u0633 \u06a9\u06d2 \u0641\u0639\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0635\u0627\u0631\u0641 \u06a9\u06d2 \u0627\u0646\u0679\u0631\u0648\u06cc\u0648\u0632 \u06a9\u0627 \u0634\u06cc\u0688\u0648\u0644 \u0628\u0646\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<p> <strong>\u0645\u062a \u06a9\u0631\u0648:<\/strong> ArgoCD RBAC \u06a9\u0646\u0641\u06cc\u06af\u0631\u06cc\u0634\u0646 \u06a9\u0648 \u0686\u06be\u0648\u0691 \u062f\u06cc\u06ba\u06d4 \u0688\u06cc\u0644\u06cc\u0648\u0631\u06cc \u0644\u06cc\u0626\u0631 \u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u06c1\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u0648 \u06a9\u0644\u0633\u0679\u0631 \u0645\u06cc\u0646\u06cc\u062c\u0631 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06d2 IDPs \u0646\u06d2 \u0627\u0646 \u06a9\u06d2 \u062d\u0644 \u06a9\u06cc\u06d2 \u062c\u0627\u0646\u06d2 \u0633\u06d2 \u06a9\u06c1\u06cc\u06ba \u0632\u06cc\u0627\u062f\u06c1 \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc \u06a9\u06d2 \u0645\u0633\u0627\u0626\u0644 \u067e\u06cc\u062f\u0627 \u06a9\u06cc\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-resources\">\u0648\u0633\u0627\u0626\u0644<\/h2>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u06c1\u0631 \u062a\u06cc\u0632\u06cc \u0633\u06d2 \u062a\u0631\u0642\u06cc \u06a9\u0631\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0627\u0646\u062c\u06cc\u0646\u0626\u0631\u0646\u06af \u0679\u06cc\u0645 \u0622\u062e\u0631 \u06a9\u0627\u0631 \u0627\u06cc\u06a9 \u06c1\u06cc \u062f\u06cc\u0648\u0627\u0631 \u0633\u06d2 \u0679\u06a9\u0631\u0627\u062a\u06cc \u06c1\u06d2\u06d4 \u0688\u0648\u06cc\u0644\u067e\u0631\u0632 \u06a9\u0648 \u0627\u06cc\u06a9 \u0646\u0626\u06d2 \u0627\u0633\u0679\u06cc\u062c\u0646\u06af \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u0636\u0631\u0648\u0631\u062a \u06c1\u06d2 \u0627\u0648\u0631 \u0679\u06a9\u0679 \u062c\u0645\u0639 \u06a9\u0631\u0648\u0627\u0626\u06cc\u06ba\u06d4 \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645 \u0679\u06cc\u0645 \u0627\u0633\u06d2 \u0642\u0637\u0627\u0631 \u0645\u06cc\u06ba \u0631\u06a9\u06be\u062a\u06cc \u06c1\u06d2\u06d4 \u062f\u0648 \u06c1\u0641\u062a\u0648\u06ba \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0645\u0627\u062d\u0648\u0644 \u0645\u0648\u062c\u0648\u062f \u06c1\u06d2. \u067e\u0686\u06be\u0644\u06d2 \u0645\u0627\u062d\u0648\u0644 \u06a9\u0627 \u0645\u0634\u0627\u06c1\u062f\u0627\u062a\u06cc \u0627\u0633\u0679\u06cc\u06a9 \u063a\u0627\u0626\u0628 \u062a\u06be\u0627 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633\u06d2 \u067e\u0686\u06be\u0644\u06d2 \u0645\u0627\u062d\u0648\u0644 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-26924","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/26924","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/comments?post=26924"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/posts\/26924\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/media?parent=26924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/categories?post=26924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/en_us\/wp-json\/wp\/v2\/tags?post=26924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}