[{"data":1,"prerenderedAt":13382},["ShallowReactive",2],{"navigation":3,"/microservices-with-django/deploying-microservices":1016,"/microservices-with-django/deploying-microservices-surround":13377},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":909,"body":1018,"description":1028,"extension":13372,"links":13373,"meta":13374,"navigation":1339,"path":910,"seo":13375,"stem":911,"__hash__":13376},"docs/27.microservices-with-django/09.deploying-microservices.md",{"type":1019,"value":1020,"toc":13339},"minimark",[1021,1025,1029,1034,1037,1042,1048,1094,1100,1118,1121,1141,1145,1150,1164,1169,1183,1188,1202,1207,1218,1222,1225,1229,1234,1272,1277,1291,1295,1298,1699,1704,1751,1755,1758,2181,2186,2211,2215,2218,3929,3934,3973,3978,4106,4110,4113,4118,4155,5317,5322,5441,5549,5554,5803,5808,5921,5924,5928,5931,5935,5938,5943,5986,5991,6029,6033,6036,6412,6417,6441,6445,6448,6768,6773,6922,6927,6957,6961,7596,7600,8962,8966,9334,9338,9623,9627,9631,10831,10835,10839,11531,11535,12041,12045,12049,12549,12553,13332,13335],[1022,1023,909],"h1",{"id":1024},"deploying-microservices",[1026,1027,1028],"p",{},"Deploying microservices requires careful orchestration of multiple services, their dependencies, and infrastructure components. This chapter covers deployment strategies, containerization, orchestration platforms, and best practices for production-ready Django microservices.",[1030,1031,1033],"h2",{"id":1032},"deployment-challenges-and-strategies","Deployment Challenges and Strategies",[1026,1035,1036],{},"Deploying microservices is fundamentally different from deploying a monolithic application. Instead of deploying one large application, you're deploying multiple small services that need to work together seamlessly. This creates unique challenges that require careful planning and the right tools.",[1038,1039,1041],"h3",{"id":1040},"understanding-microservices-deployment-complexity","Understanding Microservices Deployment Complexity",[1026,1043,1044],{},[1045,1046,1047],"strong",{},"Why Microservices Deployment is Challenging:",[1049,1050,1051,1058,1064,1070,1076,1082,1088],"ol",{},[1052,1053,1054,1057],"li",{},[1045,1055,1056],{},"Multiple Services",": Instead of one application, you might have 10, 20, or even 100 services to deploy",[1052,1059,1060,1063],{},[1045,1061,1062],{},"Service Dependencies",": Services depend on each other and need to start in the right order",[1052,1065,1066,1069],{},[1045,1067,1068],{},"Configuration Management",": Each service needs its own configuration for different environments",[1052,1071,1072,1075],{},[1045,1073,1074],{},"Network Communication",": Services communicate over the network, which can fail or be slow",[1052,1077,1078,1081],{},[1045,1079,1080],{},"Scaling",": Different services need to scale independently based on their load",[1052,1083,1084,1087],{},[1045,1085,1086],{},"Monitoring",": You need visibility into what's happening across all services",[1052,1089,1090,1093],{},[1045,1091,1092],{},"Rolling Updates",": Deploying new versions without downtime is complex",[1026,1095,1096,1099],{},[1045,1097,1098],{},"Real-World Example:","\nImagine you're running an e-commerce platform with these services:",[1101,1102,1103,1106,1109,1112,1115],"ul",{},[1052,1104,1105],{},"User Service (handles authentication)",[1052,1107,1108],{},"Product Service (manages product catalog)",[1052,1110,1111],{},"Order Service (processes orders)",[1052,1113,1114],{},"Payment Service (handles payments)",[1052,1116,1117],{},"Notification Service (sends emails)",[1026,1119,1120],{},"When you deploy a new version of the Order Service, you need to ensure:",[1101,1122,1123,1126,1129,1132,1135,1138],{},[1052,1124,1125],{},"The User Service is running (orders need user authentication)",[1052,1127,1128],{},"The Payment Service is available (orders need payment processing)",[1052,1130,1131],{},"The database is accessible",[1052,1133,1134],{},"The message queue is working",[1052,1136,1137],{},"Old orders in progress aren't lost",[1052,1139,1140],{},"New orders can be processed immediately",[1038,1142,1144],{"id":1143},"deployment-strategies-for-microservices","Deployment Strategies for Microservices",[1026,1146,1147],{},[1045,1148,1149],{},"1. Blue-Green Deployment:",[1101,1151,1152,1155,1158,1161],{},[1052,1153,1154],{},"Run two identical production environments (Blue and Green)",[1052,1156,1157],{},"Deploy new version to the inactive environment",[1052,1159,1160],{},"Switch traffic to the new environment",[1052,1162,1163],{},"Keep old environment as backup",[1026,1165,1166],{},[1045,1167,1168],{},"2. Rolling Deployment:",[1101,1170,1171,1174,1177,1180],{},[1052,1172,1173],{},"Gradually replace old instances with new ones",[1052,1175,1176],{},"Always have some instances running",[1052,1178,1179],{},"Minimal downtime",[1052,1181,1182],{},"Easy rollback if issues occur",[1026,1184,1185],{},[1045,1186,1187],{},"3. Canary Deployment:",[1101,1189,1190,1193,1196,1199],{},[1052,1191,1192],{},"Deploy new version to a small subset of users first",[1052,1194,1195],{},"Monitor for issues",[1052,1197,1198],{},"Gradually increase traffic to new version",[1052,1200,1201],{},"Roll back if problems detected",[1026,1203,1204],{},[1045,1205,1206],{},"4. Feature Flags:",[1101,1208,1209,1212,1215],{},[1052,1210,1211],{},"Deploy code with features turned off",[1052,1213,1214],{},"Enable features gradually for specific users",[1052,1216,1217],{},"Separate deployment from feature release",[1030,1219,1221],{"id":1220},"containerization-with-docker","Containerization with Docker",[1026,1223,1224],{},"Containerization is the foundation of modern microservices deployment. Docker containers package your application with all its dependencies, ensuring it runs consistently across different environments. Think of containers as lightweight, portable boxes that contain everything your service needs to run.",[1038,1226,1228],{"id":1227},"why-containers-are-perfect-for-microservices","Why Containers are Perfect for Microservices",[1026,1230,1231],{},[1045,1232,1233],{},"Benefits of Containerization:",[1049,1235,1236,1242,1248,1254,1260,1266],{},[1052,1237,1238,1241],{},[1045,1239,1240],{},"Consistency",": \"It works on my machine\" becomes \"It works everywhere\"",[1052,1243,1244,1247],{},[1045,1245,1246],{},"Isolation",": Each service runs in its own container with its own dependencies",[1052,1249,1250,1253],{},[1045,1251,1252],{},"Portability",": Containers run the same way on your laptop, staging, and production",[1052,1255,1256,1259],{},[1045,1257,1258],{},"Scalability",": Easy to spin up multiple instances of a service",[1052,1261,1262,1265],{},[1045,1263,1264],{},"Resource Efficiency",": Containers share the host OS kernel, using fewer resources than VMs",[1052,1267,1268,1271],{},[1045,1269,1270],{},"Fast Startup",": Containers start in seconds, not minutes",[1026,1273,1274],{},[1045,1275,1276],{},"Container vs Virtual Machine:",[1101,1278,1279,1285],{},[1052,1280,1281,1284],{},[1045,1282,1283],{},"Virtual Machine",": Includes entire operating system (heavy, slow to start)",[1052,1286,1287,1290],{},[1045,1288,1289],{},"Container",": Shares host OS kernel (lightweight, fast to start)",[1038,1292,1294],{"id":1293},"service-dockerfiles","Service Dockerfiles",[1026,1296,1297],{},"A Dockerfile is like a recipe that tells Docker how to build your container. Let's create production-ready Dockerfiles for our Django services:",[1299,1300,1305],"pre",{"className":1301,"code":1302,"language":1303,"meta":1304,"style":1304},"language-dockerfile shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# user_service/Dockerfile\n# Use official Python runtime as base image\nFROM python:3.11-slim\n\n# Set environment variables\n# PYTHONDONTWRITEBYTECODE: Prevents Python from writing pyc files to disc\n# PYTHONUNBUFFERED: Prevents Python from buffering stdout and stderr\nENV PYTHONDONTWRITEBYTECODE=1\nENV PYTHONUNBUFFERED=1\nENV DJANGO_SETTINGS_MODULE=user_service.settings.production\n\n# Set work directory inside container\nWORKDIR /app\n\n# Install system dependencies\n# We need these for PostgreSQL and other system-level packages\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends \\\n        postgresql-client \\\n        build-essential \\\n        libpq-dev \\\n        curl \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Install Python dependencies\n# Copy requirements first to leverage Docker layer caching\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Copy project files\nCOPY . .\n\n# Create non-root user for security\n# Running as root inside containers is a security risk\nRUN adduser --disabled-password --gecos '' appuser\nRUN chown -R appuser:appuser /app\nUSER appuser\n\n# Collect static files\n# Django needs this for serving CSS, JS, and images\nRUN python manage.py collectstatic --noinput\n\n# Health check - Docker will use this to verify the container is healthy\nHEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \\\n    CMD python manage.py check --deploy || exit 1\n\n# Expose port 8000 to the outside world\nEXPOSE 8000\n\n# Command to run when container starts\n# Using Gunicorn as WSGI server for production\nCMD [\"gunicorn\", \"--bind\", \"0.0.0.0:8000\", \"--workers\", \"4\", \"user_service.wsgi:application\"]\n","dockerfile","",[1306,1307,1308,1317,1323,1334,1341,1347,1353,1359,1368,1376,1384,1389,1395,1404,1409,1415,1421,1430,1436,1442,1448,1454,1460,1466,1471,1477,1483,1492,1500,1505,1511,1519,1524,1530,1536,1551,1559,1567,1572,1578,1584,1592,1597,1603,1612,1621,1626,1632,1641,1646,1652,1658],"code",{"__ignoreMap":1304},[1309,1310,1313],"span",{"class":1311,"line":1312},"line",1,[1309,1314,1316],{"class":1315},"s9Tkl","# user_service/Dockerfile\n",[1309,1318,1320],{"class":1311,"line":1319},2,[1309,1321,1322],{"class":1315},"# Use official Python runtime as base image\n",[1309,1324,1326,1330],{"class":1311,"line":1325},3,[1309,1327,1329],{"class":1328},"scgAs","FROM",[1309,1331,1333],{"class":1332},"sftqT"," python:3.11-slim\n",[1309,1335,1337],{"class":1311,"line":1336},4,[1309,1338,1340],{"emptyLinePlaceholder":1339},true,"\n",[1309,1342,1344],{"class":1311,"line":1343},5,[1309,1345,1346],{"class":1315},"# Set environment variables\n",[1309,1348,1350],{"class":1311,"line":1349},6,[1309,1351,1352],{"class":1315},"# PYTHONDONTWRITEBYTECODE: Prevents Python from writing pyc files to disc\n",[1309,1354,1356],{"class":1311,"line":1355},7,[1309,1357,1358],{"class":1315},"# PYTHONUNBUFFERED: Prevents Python from buffering stdout and stderr\n",[1309,1360,1362,1365],{"class":1311,"line":1361},8,[1309,1363,1364],{"class":1328},"ENV",[1309,1366,1367],{"class":1332}," PYTHONDONTWRITEBYTECODE=1\n",[1309,1369,1371,1373],{"class":1311,"line":1370},9,[1309,1372,1364],{"class":1328},[1309,1374,1375],{"class":1332}," PYTHONUNBUFFERED=1\n",[1309,1377,1379,1381],{"class":1311,"line":1378},10,[1309,1380,1364],{"class":1328},[1309,1382,1383],{"class":1332}," DJANGO_SETTINGS_MODULE=user_service.settings.production\n",[1309,1385,1387],{"class":1311,"line":1386},11,[1309,1388,1340],{"emptyLinePlaceholder":1339},[1309,1390,1392],{"class":1311,"line":1391},12,[1309,1393,1394],{"class":1315},"# Set work directory inside container\n",[1309,1396,1398,1401],{"class":1311,"line":1397},13,[1309,1399,1400],{"class":1328},"WORKDIR",[1309,1402,1403],{"class":1332}," /app\n",[1309,1405,1407],{"class":1311,"line":1406},14,[1309,1408,1340],{"emptyLinePlaceholder":1339},[1309,1410,1412],{"class":1311,"line":1411},15,[1309,1413,1414],{"class":1315},"# Install system dependencies\n",[1309,1416,1418],{"class":1311,"line":1417},16,[1309,1419,1420],{"class":1315},"# We need these for PostgreSQL and other system-level packages\n",[1309,1422,1424,1427],{"class":1311,"line":1423},17,[1309,1425,1426],{"class":1328},"RUN",[1309,1428,1429],{"class":1332}," apt-get update \\\n",[1309,1431,1433],{"class":1311,"line":1432},18,[1309,1434,1435],{"class":1332},"    && apt-get install -y --no-install-recommends \\\n",[1309,1437,1439],{"class":1311,"line":1438},19,[1309,1440,1441],{"class":1332},"        postgresql-client \\\n",[1309,1443,1445],{"class":1311,"line":1444},20,[1309,1446,1447],{"class":1332},"        build-essential \\\n",[1309,1449,1451],{"class":1311,"line":1450},21,[1309,1452,1453],{"class":1332},"        libpq-dev \\\n",[1309,1455,1457],{"class":1311,"line":1456},22,[1309,1458,1459],{"class":1332},"        curl \\\n",[1309,1461,1463],{"class":1311,"line":1462},23,[1309,1464,1465],{"class":1332},"    && rm -rf /var/lib/apt/lists/*\n",[1309,1467,1469],{"class":1311,"line":1468},24,[1309,1470,1340],{"emptyLinePlaceholder":1339},[1309,1472,1474],{"class":1311,"line":1473},25,[1309,1475,1476],{"class":1315},"# Install Python dependencies\n",[1309,1478,1480],{"class":1311,"line":1479},26,[1309,1481,1482],{"class":1315},"# Copy requirements first to leverage Docker layer caching\n",[1309,1484,1486,1489],{"class":1311,"line":1485},27,[1309,1487,1488],{"class":1328},"COPY",[1309,1490,1491],{"class":1332}," requirements.txt .\n",[1309,1493,1495,1497],{"class":1311,"line":1494},28,[1309,1496,1426],{"class":1328},[1309,1498,1499],{"class":1332}," pip install --no-cache-dir -r requirements.txt\n",[1309,1501,1503],{"class":1311,"line":1502},29,[1309,1504,1340],{"emptyLinePlaceholder":1339},[1309,1506,1508],{"class":1311,"line":1507},30,[1309,1509,1510],{"class":1315},"# Copy project files\n",[1309,1512,1514,1516],{"class":1311,"line":1513},31,[1309,1515,1488],{"class":1328},[1309,1517,1518],{"class":1332}," . .\n",[1309,1520,1522],{"class":1311,"line":1521},32,[1309,1523,1340],{"emptyLinePlaceholder":1339},[1309,1525,1527],{"class":1311,"line":1526},33,[1309,1528,1529],{"class":1315},"# Create non-root user for security\n",[1309,1531,1533],{"class":1311,"line":1532},34,[1309,1534,1535],{"class":1315},"# Running as root inside containers is a security risk\n",[1309,1537,1539,1541,1544,1548],{"class":1311,"line":1538},35,[1309,1540,1426],{"class":1328},[1309,1542,1543],{"class":1332}," adduser --disabled-password --gecos ",[1309,1545,1547],{"class":1546},"sTbE_","''",[1309,1549,1550],{"class":1332}," appuser\n",[1309,1552,1554,1556],{"class":1311,"line":1553},36,[1309,1555,1426],{"class":1328},[1309,1557,1558],{"class":1332}," chown -R appuser:appuser /app\n",[1309,1560,1562,1565],{"class":1311,"line":1561},37,[1309,1563,1564],{"class":1328},"USER",[1309,1566,1550],{"class":1332},[1309,1568,1570],{"class":1311,"line":1569},38,[1309,1571,1340],{"emptyLinePlaceholder":1339},[1309,1573,1575],{"class":1311,"line":1574},39,[1309,1576,1577],{"class":1315},"# Collect static files\n",[1309,1579,1581],{"class":1311,"line":1580},40,[1309,1582,1583],{"class":1315},"# Django needs this for serving CSS, JS, and images\n",[1309,1585,1587,1589],{"class":1311,"line":1586},41,[1309,1588,1426],{"class":1328},[1309,1590,1591],{"class":1332}," python manage.py collectstatic --noinput\n",[1309,1593,1595],{"class":1311,"line":1594},42,[1309,1596,1340],{"emptyLinePlaceholder":1339},[1309,1598,1600],{"class":1311,"line":1599},43,[1309,1601,1602],{"class":1315},"# Health check - Docker will use this to verify the container is healthy\n",[1309,1604,1606,1609],{"class":1311,"line":1605},44,[1309,1607,1608],{"class":1328},"HEALTHCHECK",[1309,1610,1611],{"class":1332}," --interval=30s --timeout=30s --start-period=5s --retries=3 \\\n",[1309,1613,1615,1618],{"class":1311,"line":1614},45,[1309,1616,1617],{"class":1328},"    CMD",[1309,1619,1620],{"class":1332}," python manage.py check --deploy || exit 1\n",[1309,1622,1624],{"class":1311,"line":1623},46,[1309,1625,1340],{"emptyLinePlaceholder":1339},[1309,1627,1629],{"class":1311,"line":1628},47,[1309,1630,1631],{"class":1315},"# Expose port 8000 to the outside world\n",[1309,1633,1635,1638],{"class":1311,"line":1634},48,[1309,1636,1637],{"class":1328},"EXPOSE",[1309,1639,1640],{"class":1332}," 8000\n",[1309,1642,1644],{"class":1311,"line":1643},49,[1309,1645,1340],{"emptyLinePlaceholder":1339},[1309,1647,1649],{"class":1311,"line":1648},50,[1309,1650,1651],{"class":1315},"# Command to run when container starts\n",[1309,1653,1655],{"class":1311,"line":1654},51,[1309,1656,1657],{"class":1315},"# Using Gunicorn as WSGI server for production\n",[1309,1659,1661,1664,1667,1670,1673,1676,1678,1681,1683,1686,1688,1691,1693,1696],{"class":1311,"line":1660},52,[1309,1662,1663],{"class":1328},"CMD",[1309,1665,1666],{"class":1332}," [",[1309,1668,1669],{"class":1546},"\"gunicorn\"",[1309,1671,1672],{"class":1332},", ",[1309,1674,1675],{"class":1546},"\"--bind\"",[1309,1677,1672],{"class":1332},[1309,1679,1680],{"class":1546},"\"0.0.0.0:8000\"",[1309,1682,1672],{"class":1332},[1309,1684,1685],{"class":1546},"\"--workers\"",[1309,1687,1672],{"class":1332},[1309,1689,1690],{"class":1546},"\"4\"",[1309,1692,1672],{"class":1332},[1309,1694,1695],{"class":1546},"\"user_service.wsgi:application\"",[1309,1697,1698],{"class":1332},"]\n",[1026,1700,1701],{},[1045,1702,1703],{},"Dockerfile Explanation:",[1049,1705,1706,1716,1722,1728,1734,1739,1745],{},[1052,1707,1708,1711,1712,1715],{},[1045,1709,1710],{},"Base Image",": ",[1306,1713,1714],{},"python:3.11-slim"," provides Python with minimal OS",[1052,1717,1718,1721],{},[1045,1719,1720],{},"Environment Variables",": Configure Python and Django behavior",[1052,1723,1724,1727],{},[1045,1725,1726],{},"System Dependencies",": Install packages needed for PostgreSQL and compilation",[1052,1729,1730,1733],{},[1045,1731,1732],{},"Layer Caching",": Copy requirements.txt first so dependency installation is cached",[1052,1735,1736,1738],{},[1045,1737,541],{},": Create and use non-root user",[1052,1740,1741,1744],{},[1045,1742,1743],{},"Health Check",": Allows Docker to verify the service is working",[1052,1746,1747,1750],{},[1045,1748,1749],{},"Production Server",": Use Gunicorn instead of Django's development server",[1038,1752,1754],{"id":1753},"multi-stage-build-for-optimization","Multi-stage Build for Optimization",[1026,1756,1757],{},"Multi-stage builds create smaller, more secure production images by separating build dependencies from runtime dependencies:",[1299,1759,1761],{"className":1301,"code":1760,"language":1303,"meta":1304,"style":1304},"# order_service/Dockerfile\n# Build stage - includes build tools and dependencies\nFROM python:3.11-slim as builder\n\nWORKDIR /app\n\n# Install build dependencies (needed for compiling packages)\nRUN apt-get update && apt-get install -y \\\n    build-essential \\\n    libpq-dev \\\n    gcc \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Install Python dependencies to a local directory\nCOPY requirements.txt .\nRUN pip install --user --no-cache-dir -r requirements.txt\n\n# Production stage - minimal runtime environment\nFROM python:3.11-slim\n\n# Set environment variables\nENV PYTHONDONTWRITEBYTECODE=1\nENV PYTHONUNBUFFERED=1\nENV PATH=/home/appuser/.local/bin:$PATH\n\n# Install only runtime dependencies (no build tools)\nRUN apt-get update && apt-get install -y \\\n    postgresql-client \\\n    curl \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Create non-root user\nRUN adduser --disabled-password --gecos '' appuser\n\n# Copy Python dependencies from builder stage\n# This excludes build tools, making the image smaller and more secure\nCOPY --from=builder /root/.local /home/appuser/.local\n\n# Set work directory and copy application\nWORKDIR /app\nCOPY --chown=appuser:appuser . .\n\n# Switch to non-root user\nUSER appuser\n\n# Collect static files\nRUN python manage.py collectstatic --noinput\n\n# Health check\nHEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \\\n    CMD curl -f http://localhost:8000/health/ || exit 1\n\nEXPOSE 8000\n\n# Use Gunicorn with optimized settings for production\nCMD [\"gunicorn\", \\\n     \"--bind\", \"0.0.0.0:8000\", \\\n     \"--workers\", \"3\", \\\n     \"--worker-class\", \"gevent\", \\\n     \"--worker-connections\", \"1000\", \\\n     \"--max-requests\", \"1000\", \\\n     \"--max-requests-jitter\", \"100\", \\\n     \"--timeout\", \"30\", \\\n     \"--keep-alive\", \"2\", \\\n     \"order_service.wsgi:application\"]\n",[1306,1762,1763,1768,1773,1786,1790,1796,1800,1805,1812,1817,1822,1827,1831,1835,1840,1846,1853,1857,1862,1868,1872,1876,1882,1888,1895,1899,1904,1910,1915,1920,1924,1928,1933,1943,1947,1952,1957,1964,1968,1973,1979,1986,1990,1995,2001,2005,2009,2015,2019,2024,2030,2037,2041,2048,2053,2059,2071,2083,2096,2109,2122,2134,2147,2160,2173],{"__ignoreMap":1304},[1309,1764,1765],{"class":1311,"line":1312},[1309,1766,1767],{"class":1315},"# order_service/Dockerfile\n",[1309,1769,1770],{"class":1311,"line":1319},[1309,1771,1772],{"class":1315},"# Build stage - includes build tools and dependencies\n",[1309,1774,1775,1777,1780,1783],{"class":1311,"line":1325},[1309,1776,1329],{"class":1328},[1309,1778,1779],{"class":1332}," python:3.11-slim ",[1309,1781,1782],{"class":1328},"as",[1309,1784,1785],{"class":1332}," builder\n",[1309,1787,1788],{"class":1311,"line":1336},[1309,1789,1340],{"emptyLinePlaceholder":1339},[1309,1791,1792,1794],{"class":1311,"line":1343},[1309,1793,1400],{"class":1328},[1309,1795,1403],{"class":1332},[1309,1797,1798],{"class":1311,"line":1349},[1309,1799,1340],{"emptyLinePlaceholder":1339},[1309,1801,1802],{"class":1311,"line":1355},[1309,1803,1804],{"class":1315},"# Install build dependencies (needed for compiling packages)\n",[1309,1806,1807,1809],{"class":1311,"line":1361},[1309,1808,1426],{"class":1328},[1309,1810,1811],{"class":1332}," apt-get update && apt-get install -y \\\n",[1309,1813,1814],{"class":1311,"line":1370},[1309,1815,1816],{"class":1332},"    build-essential \\\n",[1309,1818,1819],{"class":1311,"line":1378},[1309,1820,1821],{"class":1332},"    libpq-dev \\\n",[1309,1823,1824],{"class":1311,"line":1386},[1309,1825,1826],{"class":1332},"    gcc \\\n",[1309,1828,1829],{"class":1311,"line":1391},[1309,1830,1465],{"class":1332},[1309,1832,1833],{"class":1311,"line":1397},[1309,1834,1340],{"emptyLinePlaceholder":1339},[1309,1836,1837],{"class":1311,"line":1406},[1309,1838,1839],{"class":1315},"# Install Python dependencies to a local directory\n",[1309,1841,1842,1844],{"class":1311,"line":1411},[1309,1843,1488],{"class":1328},[1309,1845,1491],{"class":1332},[1309,1847,1848,1850],{"class":1311,"line":1417},[1309,1849,1426],{"class":1328},[1309,1851,1852],{"class":1332}," pip install --user --no-cache-dir -r requirements.txt\n",[1309,1854,1855],{"class":1311,"line":1423},[1309,1856,1340],{"emptyLinePlaceholder":1339},[1309,1858,1859],{"class":1311,"line":1432},[1309,1860,1861],{"class":1315},"# Production stage - minimal runtime environment\n",[1309,1863,1864,1866],{"class":1311,"line":1438},[1309,1865,1329],{"class":1328},[1309,1867,1333],{"class":1332},[1309,1869,1870],{"class":1311,"line":1444},[1309,1871,1340],{"emptyLinePlaceholder":1339},[1309,1873,1874],{"class":1311,"line":1450},[1309,1875,1346],{"class":1315},[1309,1877,1878,1880],{"class":1311,"line":1456},[1309,1879,1364],{"class":1328},[1309,1881,1367],{"class":1332},[1309,1883,1884,1886],{"class":1311,"line":1462},[1309,1885,1364],{"class":1328},[1309,1887,1375],{"class":1332},[1309,1889,1890,1892],{"class":1311,"line":1468},[1309,1891,1364],{"class":1328},[1309,1893,1894],{"class":1332}," PATH=/home/appuser/.local/bin:$PATH\n",[1309,1896,1897],{"class":1311,"line":1473},[1309,1898,1340],{"emptyLinePlaceholder":1339},[1309,1900,1901],{"class":1311,"line":1479},[1309,1902,1903],{"class":1315},"# Install only runtime dependencies (no build tools)\n",[1309,1905,1906,1908],{"class":1311,"line":1485},[1309,1907,1426],{"class":1328},[1309,1909,1811],{"class":1332},[1309,1911,1912],{"class":1311,"line":1494},[1309,1913,1914],{"class":1332},"    postgresql-client \\\n",[1309,1916,1917],{"class":1311,"line":1502},[1309,1918,1919],{"class":1332},"    curl \\\n",[1309,1921,1922],{"class":1311,"line":1507},[1309,1923,1465],{"class":1332},[1309,1925,1926],{"class":1311,"line":1513},[1309,1927,1340],{"emptyLinePlaceholder":1339},[1309,1929,1930],{"class":1311,"line":1521},[1309,1931,1932],{"class":1315},"# Create non-root user\n",[1309,1934,1935,1937,1939,1941],{"class":1311,"line":1526},[1309,1936,1426],{"class":1328},[1309,1938,1543],{"class":1332},[1309,1940,1547],{"class":1546},[1309,1942,1550],{"class":1332},[1309,1944,1945],{"class":1311,"line":1532},[1309,1946,1340],{"emptyLinePlaceholder":1339},[1309,1948,1949],{"class":1311,"line":1538},[1309,1950,1951],{"class":1315},"# Copy Python dependencies from builder stage\n",[1309,1953,1954],{"class":1311,"line":1553},[1309,1955,1956],{"class":1315},"# This excludes build tools, making the image smaller and more secure\n",[1309,1958,1959,1961],{"class":1311,"line":1561},[1309,1960,1488],{"class":1328},[1309,1962,1963],{"class":1332}," --from=builder /root/.local /home/appuser/.local\n",[1309,1965,1966],{"class":1311,"line":1569},[1309,1967,1340],{"emptyLinePlaceholder":1339},[1309,1969,1970],{"class":1311,"line":1574},[1309,1971,1972],{"class":1315},"# Set work directory and copy application\n",[1309,1974,1975,1977],{"class":1311,"line":1580},[1309,1976,1400],{"class":1328},[1309,1978,1403],{"class":1332},[1309,1980,1981,1983],{"class":1311,"line":1586},[1309,1982,1488],{"class":1328},[1309,1984,1985],{"class":1332}," --chown=appuser:appuser . .\n",[1309,1987,1988],{"class":1311,"line":1594},[1309,1989,1340],{"emptyLinePlaceholder":1339},[1309,1991,1992],{"class":1311,"line":1599},[1309,1993,1994],{"class":1315},"# Switch to non-root user\n",[1309,1996,1997,1999],{"class":1311,"line":1605},[1309,1998,1564],{"class":1328},[1309,2000,1550],{"class":1332},[1309,2002,2003],{"class":1311,"line":1614},[1309,2004,1340],{"emptyLinePlaceholder":1339},[1309,2006,2007],{"class":1311,"line":1623},[1309,2008,1577],{"class":1315},[1309,2010,2011,2013],{"class":1311,"line":1628},[1309,2012,1426],{"class":1328},[1309,2014,1591],{"class":1332},[1309,2016,2017],{"class":1311,"line":1634},[1309,2018,1340],{"emptyLinePlaceholder":1339},[1309,2020,2021],{"class":1311,"line":1643},[1309,2022,2023],{"class":1315},"# Health check\n",[1309,2025,2026,2028],{"class":1311,"line":1648},[1309,2027,1608],{"class":1328},[1309,2029,1611],{"class":1332},[1309,2031,2032,2034],{"class":1311,"line":1654},[1309,2033,1617],{"class":1328},[1309,2035,2036],{"class":1332}," curl -f http://localhost:8000/health/ || exit 1\n",[1309,2038,2039],{"class":1311,"line":1660},[1309,2040,1340],{"emptyLinePlaceholder":1339},[1309,2042,2044,2046],{"class":1311,"line":2043},53,[1309,2045,1637],{"class":1328},[1309,2047,1640],{"class":1332},[1309,2049,2051],{"class":1311,"line":2050},54,[1309,2052,1340],{"emptyLinePlaceholder":1339},[1309,2054,2056],{"class":1311,"line":2055},55,[1309,2057,2058],{"class":1315},"# Use Gunicorn with optimized settings for production\n",[1309,2060,2062,2064,2066,2068],{"class":1311,"line":2061},56,[1309,2063,1663],{"class":1328},[1309,2065,1666],{"class":1332},[1309,2067,1669],{"class":1546},[1309,2069,2070],{"class":1332},", \\\n",[1309,2072,2074,2077,2079,2081],{"class":1311,"line":2073},57,[1309,2075,2076],{"class":1546},"     \"--bind\"",[1309,2078,1672],{"class":1332},[1309,2080,1680],{"class":1546},[1309,2082,2070],{"class":1332},[1309,2084,2086,2089,2091,2094],{"class":1311,"line":2085},58,[1309,2087,2088],{"class":1546},"     \"--workers\"",[1309,2090,1672],{"class":1332},[1309,2092,2093],{"class":1546},"\"3\"",[1309,2095,2070],{"class":1332},[1309,2097,2099,2102,2104,2107],{"class":1311,"line":2098},59,[1309,2100,2101],{"class":1546},"     \"--worker-class\"",[1309,2103,1672],{"class":1332},[1309,2105,2106],{"class":1546},"\"gevent\"",[1309,2108,2070],{"class":1332},[1309,2110,2112,2115,2117,2120],{"class":1311,"line":2111},60,[1309,2113,2114],{"class":1546},"     \"--worker-connections\"",[1309,2116,1672],{"class":1332},[1309,2118,2119],{"class":1546},"\"1000\"",[1309,2121,2070],{"class":1332},[1309,2123,2125,2128,2130,2132],{"class":1311,"line":2124},61,[1309,2126,2127],{"class":1546},"     \"--max-requests\"",[1309,2129,1672],{"class":1332},[1309,2131,2119],{"class":1546},[1309,2133,2070],{"class":1332},[1309,2135,2137,2140,2142,2145],{"class":1311,"line":2136},62,[1309,2138,2139],{"class":1546},"     \"--max-requests-jitter\"",[1309,2141,1672],{"class":1332},[1309,2143,2144],{"class":1546},"\"100\"",[1309,2146,2070],{"class":1332},[1309,2148,2150,2153,2155,2158],{"class":1311,"line":2149},63,[1309,2151,2152],{"class":1546},"     \"--timeout\"",[1309,2154,1672],{"class":1332},[1309,2156,2157],{"class":1546},"\"30\"",[1309,2159,2070],{"class":1332},[1309,2161,2163,2166,2168,2171],{"class":1311,"line":2162},64,[1309,2164,2165],{"class":1546},"     \"--keep-alive\"",[1309,2167,1672],{"class":1332},[1309,2169,2170],{"class":1546},"\"2\"",[1309,2172,2070],{"class":1332},[1309,2174,2176,2179],{"class":1311,"line":2175},65,[1309,2177,2178],{"class":1546},"     \"order_service.wsgi:application\"",[1309,2180,1698],{"class":1332},[1026,2182,2183],{},[1045,2184,2185],{},"Multi-stage Benefits:",[1101,2187,2188,2194,2199,2205],{},[1052,2189,2190,2193],{},[1045,2191,2192],{},"Smaller Images",": Production image doesn't include build tools",[1052,2195,2196,2198],{},[1045,2197,541],{},": Fewer packages mean fewer potential vulnerabilities",[1052,2200,2201,2204],{},[1045,2202,2203],{},"Faster Deployment",": Smaller images transfer and start faster",[1052,2206,2207,2210],{},[1045,2208,2209],{},"Cost Savings",": Less storage and bandwidth usage",[1038,2212,2214],{"id":2213},"docker-compose-for-development","Docker Compose for Development",[1026,2216,2217],{},"Docker Compose orchestrates multiple containers for local development. It's like a conductor that starts all your services in the right order with the right configuration:",[1299,2219,2223],{"className":2220,"code":2221,"language":2222,"meta":1304,"style":1304},"language-yaml shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# docker-compose.yml\nversion: '3.8'\n\nservices:\n  # Database services\n  postgres:\n    image: postgres:13\n    container_name: microservices_postgres\n    environment:\n      POSTGRES_DB: microservices_db\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: postgres\n    volumes:\n      # Persist database data between container restarts\n      - postgres_data:/var/lib/postgresql/data\n      # Initialize database with custom scripts\n      - ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql\n    ports:\n      - \"5432:5432\"\n    networks:\n      - microservices_network\n    # Health check to ensure database is ready\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U postgres\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n\n  redis:\n    image: redis:7-alpine\n    container_name: microservices_redis\n    ports:\n      - \"6379:6379\"\n    networks:\n      - microservices_network\n    # Persist Redis data\n    volumes:\n      - redis_data:/data\n    # Redis configuration for better performance\n    command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru\n\n  # Message Broker\n  rabbitmq:\n    image: rabbitmq:3.11-management\n    container_name: microservices_rabbitmq\n    environment:\n      RABBITMQ_DEFAULT_USER: admin\n      RABBITMQ_DEFAULT_PASS: password123\n      # Enable management plugin\n      RABBITMQ_PLUGINS: rabbitmq_management\n    ports:\n      - \"5672:5672\"    # AMQP port\n      - \"15672:15672\"  # Management UI\n    volumes:\n      - rabbitmq_data:/var/lib/rabbitmq\n    networks:\n      - microservices_network\n    healthcheck:\n      test: [\"CMD\", \"rabbitmq-diagnostics\", \"-q\", \"ping\"]\n      interval: 30s\n      timeout: 30s\n      retries: 3\n\n  # Microservices\n  user-service:\n    build: \n      context: ./user_service\n      dockerfile: Dockerfile\n    container_name: user_service\n    ports:\n      - \"8000:8000\"\n    environment:\n      # Database connection\n      - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/microservices_db\n      # Cache connection\n      - REDIS_URL=redis://redis:6379/0\n      # Message queue connection\n      - CELERY_BROKER_URL=amqp://admin:password123@rabbitmq:5672//\n      # Django settings\n      - DJANGO_SETTINGS_MODULE=user_service.settings.development\n      - DEBUG=1\n    depends_on:\n      postgres:\n        condition: service_healthy\n      redis:\n        condition: service_started\n      rabbitmq:\n        condition: service_healthy\n    networks:\n      - microservices_network\n    volumes:\n      # Mount source code for development (hot reload)\n      - ./user_service:/app\n      # Don't mount these directories (use container versions)\n      - /app/node_modules\n      - /app/.venv\n    # Override command for development\n    command: >\n      sh -c \"python manage.py migrate &&\n             python manage.py runserver 0.0.0.0:8000\"\n    # Restart policy\n    restart: unless-stopped\n\n  # Celery worker for user service\n  user-worker:\n    build: ./user_service\n    container_name: user_worker\n    environment:\n      - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/microservices_db\n      - REDIS_URL=redis://redis:6379/0\n      - CELERY_BROKER_URL=amqp://admin:password123@rabbitmq:5672//\n      - DJANGO_SETTINGS_MODULE=user_service.settings.development\n    depends_on:\n      postgres:\n        condition: service_healthy\n      redis:\n        condition: service_started\n      rabbitmq:\n        condition: service_healthy\n    networks:\n      - microservices_network\n    volumes:\n      - ./user_service:/app\n    command: celery -A user_service worker --loglevel=info -Q user_queue\n    restart: unless-stopped\n\n  order-service:\n    build: ./order_service\n    container_name: order_service\n    ports:\n      - \"8001:8000\"\n    environment:\n      - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/microservices_db\n      - REDIS_URL=redis://redis:6379/0\n      - CELERY_BROKER_URL=amqp://admin:password123@rabbitmq:5672//\n      - USER_SERVICE_URL=http://user-service:8000\n      - DJANGO_SETTINGS_MODULE=order_service.settings.development\n    depends_on:\n      postgres:\n        condition: service_healthy\n      redis:\n        condition: service_started\n      rabbitmq:\n        condition: service_healthy\n      user-service:\n        condition: service_started\n    networks:\n      - microservices_network\n    volumes:\n      - ./order_service:/app\n    command: >\n      sh -c \"python manage.py migrate &&\n             python manage.py runserver 0.0.0.0:8000\"\n    restart: unless-stopped\n\n  order-worker:\n    build: ./order_service\n    container_name: order_worker\n    environment:\n      - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/microservices_db\n      - REDIS_URL=redis://redis:6379/0\n      - CELERY_BROKER_URL=amqp://admin:password123@rabbitmq:5672//\n      - USER_SERVICE_URL=http://user-service:8000\n    depends_on:\n      postgres:\n        condition: service_healthy\n      redis:\n        condition: service_started\n      rabbitmq:\n        condition: service_healthy\n    networks:\n      - microservices_network\n    volumes:\n      - ./order_service:/app\n    command: celery -A order_service worker --loglevel=info -Q order_queue\n    restart: unless-stopped\n\n  # API Gateway using Nginx\n  nginx:\n    image: nginx:alpine\n    container_name: api_gateway\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - ./nginx/nginx.conf:/etc/nginx/nginx.conf\n      - ./nginx/ssl:/etc/nginx/ssl\n    depends_on:\n      - user-service\n      - order-service\n    networks:\n      - microservices_network\n    restart: unless-stopped\n\n# Named volumes for data persistence\nvolumes:\n  postgres_data:\n    driver: local\n  redis_data:\n    driver: local\n  rabbitmq_data:\n    driver: local\n\n# Custom network for service communication\nnetworks:\n  microservices_network:\n    driver: bridge\n    ipam:\n      config:\n        - subnet: 172.20.0.0/16\n","yaml",[1306,2224,2225,2230,2250,2254,2262,2267,2274,2284,2294,2301,2311,2321,2330,2337,2342,2350,2355,2362,2369,2382,2389,2396,2401,2408,2437,2447,2457,2468,2472,2479,2488,2497,2503,2514,2520,2526,2531,2537,2544,2549,2559,2563,2568,2575,2584,2593,2599,2609,2619,2624,2634,2640,2654,2668,2674,2681,2687,2693,2699,2742,2751,2759,2768,2772,2777,2784,2795,2806,2817,2827,2834,2846,2853,2859,2867,2873,2881,2887,2895,2901,2909,2917,2925,2933,2944,2952,2962,2970,2979,2986,2993,3000,3006,3014,3020,3028,3036,3042,3053,3059,3065,3071,3082,3087,3093,3101,3110,3120,3127,3134,3141,3148,3155,3162,3169,3178,3185,3194,3201,3210,3217,3224,3231,3238,3248,3257,3262,3270,3280,3290,3297,3309,3316,3323,3330,3337,3345,3353,3360,3367,3376,3383,3392,3399,3408,3416,3425,3432,3439,3446,3454,3463,3468,3473,3482,3487,3495,3504,3514,3521,3528,3535,3542,3549,3556,3563,3572,3579,3588,3595,3604,3611,3618,3625,3632,3642,3651,3656,3662,3670,3680,3690,3697,3709,3721,3728,3736,3744,3751,3759,3767,3774,3781,3790,3795,3801,3809,3817,3828,3836,3845,3853,3862,3867,3873,3881,3889,3899,3907,3915],{"__ignoreMap":1304},[1309,2226,2227],{"class":1311,"line":1312},[1309,2228,2229],{"class":1315},"# docker-compose.yml\n",[1309,2231,2232,2236,2240,2244,2247],{"class":1311,"line":1319},[1309,2233,2235],{"class":2234},"suXOh","version",[1309,2237,2239],{"class":2238},"soVBu",":",[1309,2241,2243],{"class":2242},"sbYkP"," '",[1309,2245,2246],{"class":1546},"3.8",[1309,2248,2249],{"class":2242},"'\n",[1309,2251,2252],{"class":1311,"line":1325},[1309,2253,1340],{"emptyLinePlaceholder":1339},[1309,2255,2256,2259],{"class":1311,"line":1336},[1309,2257,2258],{"class":2234},"services",[1309,2260,2261],{"class":2238},":\n",[1309,2263,2264],{"class":1311,"line":1343},[1309,2265,2266],{"class":1315},"  # Database services\n",[1309,2268,2269,2272],{"class":1311,"line":1349},[1309,2270,2271],{"class":2234},"  postgres",[1309,2273,2261],{"class":2238},[1309,2275,2276,2279,2281],{"class":1311,"line":1355},[1309,2277,2278],{"class":2234},"    image",[1309,2280,2239],{"class":2238},[1309,2282,2283],{"class":1546}," postgres:13\n",[1309,2285,2286,2289,2291],{"class":1311,"line":1361},[1309,2287,2288],{"class":2234},"    container_name",[1309,2290,2239],{"class":2238},[1309,2292,2293],{"class":1546}," microservices_postgres\n",[1309,2295,2296,2299],{"class":1311,"line":1370},[1309,2297,2298],{"class":2234},"    environment",[1309,2300,2261],{"class":2238},[1309,2302,2303,2306,2308],{"class":1311,"line":1378},[1309,2304,2305],{"class":2234},"      POSTGRES_DB",[1309,2307,2239],{"class":2238},[1309,2309,2310],{"class":1546}," microservices_db\n",[1309,2312,2313,2316,2318],{"class":1311,"line":1386},[1309,2314,2315],{"class":2234},"      POSTGRES_USER",[1309,2317,2239],{"class":2238},[1309,2319,2320],{"class":1546}," postgres\n",[1309,2322,2323,2326,2328],{"class":1311,"line":1391},[1309,2324,2325],{"class":2234},"      POSTGRES_PASSWORD",[1309,2327,2239],{"class":2238},[1309,2329,2320],{"class":1546},[1309,2331,2332,2335],{"class":1311,"line":1397},[1309,2333,2334],{"class":2234},"    volumes",[1309,2336,2261],{"class":2238},[1309,2338,2339],{"class":1311,"line":1406},[1309,2340,2341],{"class":1315},"      # Persist database data between container restarts\n",[1309,2343,2344,2347],{"class":1311,"line":1411},[1309,2345,2346],{"class":2238},"      -",[1309,2348,2349],{"class":1546}," postgres_data:/var/lib/postgresql/data\n",[1309,2351,2352],{"class":1311,"line":1417},[1309,2353,2354],{"class":1315},"      # Initialize database with custom scripts\n",[1309,2356,2357,2359],{"class":1311,"line":1423},[1309,2358,2346],{"class":2238},[1309,2360,2361],{"class":1546}," ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql\n",[1309,2363,2364,2367],{"class":1311,"line":1432},[1309,2365,2366],{"class":2234},"    ports",[1309,2368,2261],{"class":2238},[1309,2370,2371,2373,2376,2379],{"class":1311,"line":1438},[1309,2372,2346],{"class":2238},[1309,2374,2375],{"class":2242}," \"",[1309,2377,2378],{"class":1546},"5432:5432",[1309,2380,2381],{"class":2242},"\"\n",[1309,2383,2384,2387],{"class":1311,"line":1444},[1309,2385,2386],{"class":2234},"    networks",[1309,2388,2261],{"class":2238},[1309,2390,2391,2393],{"class":1311,"line":1450},[1309,2392,2346],{"class":2238},[1309,2394,2395],{"class":1546}," microservices_network\n",[1309,2397,2398],{"class":1311,"line":1456},[1309,2399,2400],{"class":1315},"    # Health check to ensure database is ready\n",[1309,2402,2403,2406],{"class":1311,"line":1462},[1309,2404,2405],{"class":2234},"    healthcheck",[1309,2407,2261],{"class":2238},[1309,2409,2410,2413,2415,2417,2420,2423,2425,2428,2430,2433,2435],{"class":1311,"line":1468},[1309,2411,2412],{"class":2234},"      test",[1309,2414,2239],{"class":2238},[1309,2416,1666],{"class":2238},[1309,2418,2419],{"class":2242},"\"",[1309,2421,2422],{"class":1546},"CMD-SHELL",[1309,2424,2419],{"class":2242},[1309,2426,2427],{"class":2238},",",[1309,2429,2375],{"class":2242},[1309,2431,2432],{"class":1546},"pg_isready -U postgres",[1309,2434,2419],{"class":2242},[1309,2436,1698],{"class":2238},[1309,2438,2439,2442,2444],{"class":1311,"line":1473},[1309,2440,2441],{"class":2234},"      interval",[1309,2443,2239],{"class":2238},[1309,2445,2446],{"class":1546}," 10s\n",[1309,2448,2449,2452,2454],{"class":1311,"line":1479},[1309,2450,2451],{"class":2234},"      timeout",[1309,2453,2239],{"class":2238},[1309,2455,2456],{"class":1546}," 5s\n",[1309,2458,2459,2462,2464],{"class":1311,"line":1485},[1309,2460,2461],{"class":2234},"      retries",[1309,2463,2239],{"class":2238},[1309,2465,2467],{"class":2466},"s7CZa"," 5\n",[1309,2469,2470],{"class":1311,"line":1494},[1309,2471,1340],{"emptyLinePlaceholder":1339},[1309,2473,2474,2477],{"class":1311,"line":1502},[1309,2475,2476],{"class":2234},"  redis",[1309,2478,2261],{"class":2238},[1309,2480,2481,2483,2485],{"class":1311,"line":1507},[1309,2482,2278],{"class":2234},[1309,2484,2239],{"class":2238},[1309,2486,2487],{"class":1546}," redis:7-alpine\n",[1309,2489,2490,2492,2494],{"class":1311,"line":1513},[1309,2491,2288],{"class":2234},[1309,2493,2239],{"class":2238},[1309,2495,2496],{"class":1546}," microservices_redis\n",[1309,2498,2499,2501],{"class":1311,"line":1521},[1309,2500,2366],{"class":2234},[1309,2502,2261],{"class":2238},[1309,2504,2505,2507,2509,2512],{"class":1311,"line":1526},[1309,2506,2346],{"class":2238},[1309,2508,2375],{"class":2242},[1309,2510,2511],{"class":1546},"6379:6379",[1309,2513,2381],{"class":2242},[1309,2515,2516,2518],{"class":1311,"line":1532},[1309,2517,2386],{"class":2234},[1309,2519,2261],{"class":2238},[1309,2521,2522,2524],{"class":1311,"line":1538},[1309,2523,2346],{"class":2238},[1309,2525,2395],{"class":1546},[1309,2527,2528],{"class":1311,"line":1553},[1309,2529,2530],{"class":1315},"    # Persist Redis data\n",[1309,2532,2533,2535],{"class":1311,"line":1561},[1309,2534,2334],{"class":2234},[1309,2536,2261],{"class":2238},[1309,2538,2539,2541],{"class":1311,"line":1569},[1309,2540,2346],{"class":2238},[1309,2542,2543],{"class":1546}," redis_data:/data\n",[1309,2545,2546],{"class":1311,"line":1574},[1309,2547,2548],{"class":1315},"    # Redis configuration for better performance\n",[1309,2550,2551,2554,2556],{"class":1311,"line":1580},[1309,2552,2553],{"class":2234},"    command",[1309,2555,2239],{"class":2238},[1309,2557,2558],{"class":1546}," redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru\n",[1309,2560,2561],{"class":1311,"line":1586},[1309,2562,1340],{"emptyLinePlaceholder":1339},[1309,2564,2565],{"class":1311,"line":1594},[1309,2566,2567],{"class":1315},"  # Message Broker\n",[1309,2569,2570,2573],{"class":1311,"line":1599},[1309,2571,2572],{"class":2234},"  rabbitmq",[1309,2574,2261],{"class":2238},[1309,2576,2577,2579,2581],{"class":1311,"line":1605},[1309,2578,2278],{"class":2234},[1309,2580,2239],{"class":2238},[1309,2582,2583],{"class":1546}," rabbitmq:3.11-management\n",[1309,2585,2586,2588,2590],{"class":1311,"line":1614},[1309,2587,2288],{"class":2234},[1309,2589,2239],{"class":2238},[1309,2591,2592],{"class":1546}," microservices_rabbitmq\n",[1309,2594,2595,2597],{"class":1311,"line":1623},[1309,2596,2298],{"class":2234},[1309,2598,2261],{"class":2238},[1309,2600,2601,2604,2606],{"class":1311,"line":1628},[1309,2602,2603],{"class":2234},"      RABBITMQ_DEFAULT_USER",[1309,2605,2239],{"class":2238},[1309,2607,2608],{"class":1546}," admin\n",[1309,2610,2611,2614,2616],{"class":1311,"line":1634},[1309,2612,2613],{"class":2234},"      RABBITMQ_DEFAULT_PASS",[1309,2615,2239],{"class":2238},[1309,2617,2618],{"class":1546}," password123\n",[1309,2620,2621],{"class":1311,"line":1643},[1309,2622,2623],{"class":1315},"      # Enable management plugin\n",[1309,2625,2626,2629,2631],{"class":1311,"line":1648},[1309,2627,2628],{"class":2234},"      RABBITMQ_PLUGINS",[1309,2630,2239],{"class":2238},[1309,2632,2633],{"class":1546}," rabbitmq_management\n",[1309,2635,2636,2638],{"class":1311,"line":1654},[1309,2637,2366],{"class":2234},[1309,2639,2261],{"class":2238},[1309,2641,2642,2644,2646,2649,2651],{"class":1311,"line":1660},[1309,2643,2346],{"class":2238},[1309,2645,2375],{"class":2242},[1309,2647,2648],{"class":1546},"5672:5672",[1309,2650,2419],{"class":2242},[1309,2652,2653],{"class":1315},"    # AMQP port\n",[1309,2655,2656,2658,2660,2663,2665],{"class":1311,"line":2043},[1309,2657,2346],{"class":2238},[1309,2659,2375],{"class":2242},[1309,2661,2662],{"class":1546},"15672:15672",[1309,2664,2419],{"class":2242},[1309,2666,2667],{"class":1315},"  # Management UI\n",[1309,2669,2670,2672],{"class":1311,"line":2050},[1309,2671,2334],{"class":2234},[1309,2673,2261],{"class":2238},[1309,2675,2676,2678],{"class":1311,"line":2055},[1309,2677,2346],{"class":2238},[1309,2679,2680],{"class":1546}," rabbitmq_data:/var/lib/rabbitmq\n",[1309,2682,2683,2685],{"class":1311,"line":2061},[1309,2684,2386],{"class":2234},[1309,2686,2261],{"class":2238},[1309,2688,2689,2691],{"class":1311,"line":2073},[1309,2690,2346],{"class":2238},[1309,2692,2395],{"class":1546},[1309,2694,2695,2697],{"class":1311,"line":2085},[1309,2696,2405],{"class":2234},[1309,2698,2261],{"class":2238},[1309,2700,2701,2703,2705,2707,2709,2711,2713,2715,2717,2720,2722,2724,2726,2729,2731,2733,2735,2738,2740],{"class":1311,"line":2098},[1309,2702,2412],{"class":2234},[1309,2704,2239],{"class":2238},[1309,2706,1666],{"class":2238},[1309,2708,2419],{"class":2242},[1309,2710,1663],{"class":1546},[1309,2712,2419],{"class":2242},[1309,2714,2427],{"class":2238},[1309,2716,2375],{"class":2242},[1309,2718,2719],{"class":1546},"rabbitmq-diagnostics",[1309,2721,2419],{"class":2242},[1309,2723,2427],{"class":2238},[1309,2725,2375],{"class":2242},[1309,2727,2728],{"class":1546},"-q",[1309,2730,2419],{"class":2242},[1309,2732,2427],{"class":2238},[1309,2734,2375],{"class":2242},[1309,2736,2737],{"class":1546},"ping",[1309,2739,2419],{"class":2242},[1309,2741,1698],{"class":2238},[1309,2743,2744,2746,2748],{"class":1311,"line":2111},[1309,2745,2441],{"class":2234},[1309,2747,2239],{"class":2238},[1309,2749,2750],{"class":1546}," 30s\n",[1309,2752,2753,2755,2757],{"class":1311,"line":2124},[1309,2754,2451],{"class":2234},[1309,2756,2239],{"class":2238},[1309,2758,2750],{"class":1546},[1309,2760,2761,2763,2765],{"class":1311,"line":2136},[1309,2762,2461],{"class":2234},[1309,2764,2239],{"class":2238},[1309,2766,2767],{"class":2466}," 3\n",[1309,2769,2770],{"class":1311,"line":2149},[1309,2771,1340],{"emptyLinePlaceholder":1339},[1309,2773,2774],{"class":1311,"line":2162},[1309,2775,2776],{"class":1315},"  # Microservices\n",[1309,2778,2779,2782],{"class":1311,"line":2175},[1309,2780,2781],{"class":2234},"  user-service",[1309,2783,2261],{"class":2238},[1309,2785,2787,2790,2792],{"class":1311,"line":2786},66,[1309,2788,2789],{"class":2234},"    build",[1309,2791,2239],{"class":2238},[1309,2793,2794],{"class":1332}," \n",[1309,2796,2798,2801,2803],{"class":1311,"line":2797},67,[1309,2799,2800],{"class":2234},"      context",[1309,2802,2239],{"class":2238},[1309,2804,2805],{"class":1546}," ./user_service\n",[1309,2807,2809,2812,2814],{"class":1311,"line":2808},68,[1309,2810,2811],{"class":2234},"      dockerfile",[1309,2813,2239],{"class":2238},[1309,2815,2816],{"class":1546}," Dockerfile\n",[1309,2818,2820,2822,2824],{"class":1311,"line":2819},69,[1309,2821,2288],{"class":2234},[1309,2823,2239],{"class":2238},[1309,2825,2826],{"class":1546}," user_service\n",[1309,2828,2830,2832],{"class":1311,"line":2829},70,[1309,2831,2366],{"class":2234},[1309,2833,2261],{"class":2238},[1309,2835,2837,2839,2841,2844],{"class":1311,"line":2836},71,[1309,2838,2346],{"class":2238},[1309,2840,2375],{"class":2242},[1309,2842,2843],{"class":1546},"8000:8000",[1309,2845,2381],{"class":2242},[1309,2847,2849,2851],{"class":1311,"line":2848},72,[1309,2850,2298],{"class":2234},[1309,2852,2261],{"class":2238},[1309,2854,2856],{"class":1311,"line":2855},73,[1309,2857,2858],{"class":1315},"      # Database connection\n",[1309,2860,2862,2864],{"class":1311,"line":2861},74,[1309,2863,2346],{"class":2238},[1309,2865,2866],{"class":1546}," DATABASE_URL=postgresql://postgres:postgres@postgres:5432/microservices_db\n",[1309,2868,2870],{"class":1311,"line":2869},75,[1309,2871,2872],{"class":1315},"      # Cache connection\n",[1309,2874,2876,2878],{"class":1311,"line":2875},76,[1309,2877,2346],{"class":2238},[1309,2879,2880],{"class":1546}," REDIS_URL=redis://redis:6379/0\n",[1309,2882,2884],{"class":1311,"line":2883},77,[1309,2885,2886],{"class":1315},"      # Message queue connection\n",[1309,2888,2890,2892],{"class":1311,"line":2889},78,[1309,2891,2346],{"class":2238},[1309,2893,2894],{"class":1546}," CELERY_BROKER_URL=amqp://admin:password123@rabbitmq:5672//\n",[1309,2896,2898],{"class":1311,"line":2897},79,[1309,2899,2900],{"class":1315},"      # Django settings\n",[1309,2902,2904,2906],{"class":1311,"line":2903},80,[1309,2905,2346],{"class":2238},[1309,2907,2908],{"class":1546}," DJANGO_SETTINGS_MODULE=user_service.settings.development\n",[1309,2910,2912,2914],{"class":1311,"line":2911},81,[1309,2913,2346],{"class":2238},[1309,2915,2916],{"class":1546}," DEBUG=1\n",[1309,2918,2920,2923],{"class":1311,"line":2919},82,[1309,2921,2922],{"class":2234},"    depends_on",[1309,2924,2261],{"class":2238},[1309,2926,2928,2931],{"class":1311,"line":2927},83,[1309,2929,2930],{"class":2234},"      postgres",[1309,2932,2261],{"class":2238},[1309,2934,2936,2939,2941],{"class":1311,"line":2935},84,[1309,2937,2938],{"class":2234},"        condition",[1309,2940,2239],{"class":2238},[1309,2942,2943],{"class":1546}," service_healthy\n",[1309,2945,2947,2950],{"class":1311,"line":2946},85,[1309,2948,2949],{"class":2234},"      redis",[1309,2951,2261],{"class":2238},[1309,2953,2955,2957,2959],{"class":1311,"line":2954},86,[1309,2956,2938],{"class":2234},[1309,2958,2239],{"class":2238},[1309,2960,2961],{"class":1546}," service_started\n",[1309,2963,2965,2968],{"class":1311,"line":2964},87,[1309,2966,2967],{"class":2234},"      rabbitmq",[1309,2969,2261],{"class":2238},[1309,2971,2973,2975,2977],{"class":1311,"line":2972},88,[1309,2974,2938],{"class":2234},[1309,2976,2239],{"class":2238},[1309,2978,2943],{"class":1546},[1309,2980,2982,2984],{"class":1311,"line":2981},89,[1309,2983,2386],{"class":2234},[1309,2985,2261],{"class":2238},[1309,2987,2989,2991],{"class":1311,"line":2988},90,[1309,2990,2346],{"class":2238},[1309,2992,2395],{"class":1546},[1309,2994,2996,2998],{"class":1311,"line":2995},91,[1309,2997,2334],{"class":2234},[1309,2999,2261],{"class":2238},[1309,3001,3003],{"class":1311,"line":3002},92,[1309,3004,3005],{"class":1315},"      # Mount source code for development (hot reload)\n",[1309,3007,3009,3011],{"class":1311,"line":3008},93,[1309,3010,2346],{"class":2238},[1309,3012,3013],{"class":1546}," ./user_service:/app\n",[1309,3015,3017],{"class":1311,"line":3016},94,[1309,3018,3019],{"class":1315},"      # Don't mount these directories (use container versions)\n",[1309,3021,3023,3025],{"class":1311,"line":3022},95,[1309,3024,2346],{"class":2238},[1309,3026,3027],{"class":1546}," /app/node_modules\n",[1309,3029,3031,3033],{"class":1311,"line":3030},96,[1309,3032,2346],{"class":2238},[1309,3034,3035],{"class":1546}," /app/.venv\n",[1309,3037,3039],{"class":1311,"line":3038},97,[1309,3040,3041],{"class":1315},"    # Override command for development\n",[1309,3043,3045,3047,3049],{"class":1311,"line":3044},98,[1309,3046,2553],{"class":2234},[1309,3048,2239],{"class":2238},[1309,3050,3052],{"class":3051},"siDh9"," >\n",[1309,3054,3056],{"class":1311,"line":3055},99,[1309,3057,3058],{"class":1546},"      sh -c \"python manage.py migrate &&\n",[1309,3060,3062],{"class":1311,"line":3061},100,[1309,3063,3064],{"class":1546},"             python manage.py runserver 0.0.0.0:8000\"\n",[1309,3066,3068],{"class":1311,"line":3067},101,[1309,3069,3070],{"class":1315},"    # Restart policy\n",[1309,3072,3074,3077,3079],{"class":1311,"line":3073},102,[1309,3075,3076],{"class":2234},"    restart",[1309,3078,2239],{"class":2238},[1309,3080,3081],{"class":1546}," unless-stopped\n",[1309,3083,3085],{"class":1311,"line":3084},103,[1309,3086,1340],{"emptyLinePlaceholder":1339},[1309,3088,3090],{"class":1311,"line":3089},104,[1309,3091,3092],{"class":1315},"  # Celery worker for user service\n",[1309,3094,3096,3099],{"class":1311,"line":3095},105,[1309,3097,3098],{"class":2234},"  user-worker",[1309,3100,2261],{"class":2238},[1309,3102,3104,3106,3108],{"class":1311,"line":3103},106,[1309,3105,2789],{"class":2234},[1309,3107,2239],{"class":2238},[1309,3109,2805],{"class":1546},[1309,3111,3113,3115,3117],{"class":1311,"line":3112},107,[1309,3114,2288],{"class":2234},[1309,3116,2239],{"class":2238},[1309,3118,3119],{"class":1546}," user_worker\n",[1309,3121,3123,3125],{"class":1311,"line":3122},108,[1309,3124,2298],{"class":2234},[1309,3126,2261],{"class":2238},[1309,3128,3130,3132],{"class":1311,"line":3129},109,[1309,3131,2346],{"class":2238},[1309,3133,2866],{"class":1546},[1309,3135,3137,3139],{"class":1311,"line":3136},110,[1309,3138,2346],{"class":2238},[1309,3140,2880],{"class":1546},[1309,3142,3144,3146],{"class":1311,"line":3143},111,[1309,3145,2346],{"class":2238},[1309,3147,2894],{"class":1546},[1309,3149,3151,3153],{"class":1311,"line":3150},112,[1309,3152,2346],{"class":2238},[1309,3154,2908],{"class":1546},[1309,3156,3158,3160],{"class":1311,"line":3157},113,[1309,3159,2922],{"class":2234},[1309,3161,2261],{"class":2238},[1309,3163,3165,3167],{"class":1311,"line":3164},114,[1309,3166,2930],{"class":2234},[1309,3168,2261],{"class":2238},[1309,3170,3172,3174,3176],{"class":1311,"line":3171},115,[1309,3173,2938],{"class":2234},[1309,3175,2239],{"class":2238},[1309,3177,2943],{"class":1546},[1309,3179,3181,3183],{"class":1311,"line":3180},116,[1309,3182,2949],{"class":2234},[1309,3184,2261],{"class":2238},[1309,3186,3188,3190,3192],{"class":1311,"line":3187},117,[1309,3189,2938],{"class":2234},[1309,3191,2239],{"class":2238},[1309,3193,2961],{"class":1546},[1309,3195,3197,3199],{"class":1311,"line":3196},118,[1309,3198,2967],{"class":2234},[1309,3200,2261],{"class":2238},[1309,3202,3204,3206,3208],{"class":1311,"line":3203},119,[1309,3205,2938],{"class":2234},[1309,3207,2239],{"class":2238},[1309,3209,2943],{"class":1546},[1309,3211,3213,3215],{"class":1311,"line":3212},120,[1309,3214,2386],{"class":2234},[1309,3216,2261],{"class":2238},[1309,3218,3220,3222],{"class":1311,"line":3219},121,[1309,3221,2346],{"class":2238},[1309,3223,2395],{"class":1546},[1309,3225,3227,3229],{"class":1311,"line":3226},122,[1309,3228,2334],{"class":2234},[1309,3230,2261],{"class":2238},[1309,3232,3234,3236],{"class":1311,"line":3233},123,[1309,3235,2346],{"class":2238},[1309,3237,3013],{"class":1546},[1309,3239,3241,3243,3245],{"class":1311,"line":3240},124,[1309,3242,2553],{"class":2234},[1309,3244,2239],{"class":2238},[1309,3246,3247],{"class":1546}," celery -A user_service worker --loglevel=info -Q user_queue\n",[1309,3249,3251,3253,3255],{"class":1311,"line":3250},125,[1309,3252,3076],{"class":2234},[1309,3254,2239],{"class":2238},[1309,3256,3081],{"class":1546},[1309,3258,3260],{"class":1311,"line":3259},126,[1309,3261,1340],{"emptyLinePlaceholder":1339},[1309,3263,3265,3268],{"class":1311,"line":3264},127,[1309,3266,3267],{"class":2234},"  order-service",[1309,3269,2261],{"class":2238},[1309,3271,3273,3275,3277],{"class":1311,"line":3272},128,[1309,3274,2789],{"class":2234},[1309,3276,2239],{"class":2238},[1309,3278,3279],{"class":1546}," ./order_service\n",[1309,3281,3283,3285,3287],{"class":1311,"line":3282},129,[1309,3284,2288],{"class":2234},[1309,3286,2239],{"class":2238},[1309,3288,3289],{"class":1546}," order_service\n",[1309,3291,3293,3295],{"class":1311,"line":3292},130,[1309,3294,2366],{"class":2234},[1309,3296,2261],{"class":2238},[1309,3298,3300,3302,3304,3307],{"class":1311,"line":3299},131,[1309,3301,2346],{"class":2238},[1309,3303,2375],{"class":2242},[1309,3305,3306],{"class":1546},"8001:8000",[1309,3308,2381],{"class":2242},[1309,3310,3312,3314],{"class":1311,"line":3311},132,[1309,3313,2298],{"class":2234},[1309,3315,2261],{"class":2238},[1309,3317,3319,3321],{"class":1311,"line":3318},133,[1309,3320,2346],{"class":2238},[1309,3322,2866],{"class":1546},[1309,3324,3326,3328],{"class":1311,"line":3325},134,[1309,3327,2346],{"class":2238},[1309,3329,2880],{"class":1546},[1309,3331,3333,3335],{"class":1311,"line":3332},135,[1309,3334,2346],{"class":2238},[1309,3336,2894],{"class":1546},[1309,3338,3340,3342],{"class":1311,"line":3339},136,[1309,3341,2346],{"class":2238},[1309,3343,3344],{"class":1546}," USER_SERVICE_URL=http://user-service:8000\n",[1309,3346,3348,3350],{"class":1311,"line":3347},137,[1309,3349,2346],{"class":2238},[1309,3351,3352],{"class":1546}," DJANGO_SETTINGS_MODULE=order_service.settings.development\n",[1309,3354,3356,3358],{"class":1311,"line":3355},138,[1309,3357,2922],{"class":2234},[1309,3359,2261],{"class":2238},[1309,3361,3363,3365],{"class":1311,"line":3362},139,[1309,3364,2930],{"class":2234},[1309,3366,2261],{"class":2238},[1309,3368,3370,3372,3374],{"class":1311,"line":3369},140,[1309,3371,2938],{"class":2234},[1309,3373,2239],{"class":2238},[1309,3375,2943],{"class":1546},[1309,3377,3379,3381],{"class":1311,"line":3378},141,[1309,3380,2949],{"class":2234},[1309,3382,2261],{"class":2238},[1309,3384,3386,3388,3390],{"class":1311,"line":3385},142,[1309,3387,2938],{"class":2234},[1309,3389,2239],{"class":2238},[1309,3391,2961],{"class":1546},[1309,3393,3395,3397],{"class":1311,"line":3394},143,[1309,3396,2967],{"class":2234},[1309,3398,2261],{"class":2238},[1309,3400,3402,3404,3406],{"class":1311,"line":3401},144,[1309,3403,2938],{"class":2234},[1309,3405,2239],{"class":2238},[1309,3407,2943],{"class":1546},[1309,3409,3411,3414],{"class":1311,"line":3410},145,[1309,3412,3413],{"class":2234},"      user-service",[1309,3415,2261],{"class":2238},[1309,3417,3419,3421,3423],{"class":1311,"line":3418},146,[1309,3420,2938],{"class":2234},[1309,3422,2239],{"class":2238},[1309,3424,2961],{"class":1546},[1309,3426,3428,3430],{"class":1311,"line":3427},147,[1309,3429,2386],{"class":2234},[1309,3431,2261],{"class":2238},[1309,3433,3435,3437],{"class":1311,"line":3434},148,[1309,3436,2346],{"class":2238},[1309,3438,2395],{"class":1546},[1309,3440,3442,3444],{"class":1311,"line":3441},149,[1309,3443,2334],{"class":2234},[1309,3445,2261],{"class":2238},[1309,3447,3449,3451],{"class":1311,"line":3448},150,[1309,3450,2346],{"class":2238},[1309,3452,3453],{"class":1546}," ./order_service:/app\n",[1309,3455,3457,3459,3461],{"class":1311,"line":3456},151,[1309,3458,2553],{"class":2234},[1309,3460,2239],{"class":2238},[1309,3462,3052],{"class":3051},[1309,3464,3466],{"class":1311,"line":3465},152,[1309,3467,3058],{"class":1546},[1309,3469,3471],{"class":1311,"line":3470},153,[1309,3472,3064],{"class":1546},[1309,3474,3476,3478,3480],{"class":1311,"line":3475},154,[1309,3477,3076],{"class":2234},[1309,3479,2239],{"class":2238},[1309,3481,3081],{"class":1546},[1309,3483,3485],{"class":1311,"line":3484},155,[1309,3486,1340],{"emptyLinePlaceholder":1339},[1309,3488,3490,3493],{"class":1311,"line":3489},156,[1309,3491,3492],{"class":2234},"  order-worker",[1309,3494,2261],{"class":2238},[1309,3496,3498,3500,3502],{"class":1311,"line":3497},157,[1309,3499,2789],{"class":2234},[1309,3501,2239],{"class":2238},[1309,3503,3279],{"class":1546},[1309,3505,3507,3509,3511],{"class":1311,"line":3506},158,[1309,3508,2288],{"class":2234},[1309,3510,2239],{"class":2238},[1309,3512,3513],{"class":1546}," order_worker\n",[1309,3515,3517,3519],{"class":1311,"line":3516},159,[1309,3518,2298],{"class":2234},[1309,3520,2261],{"class":2238},[1309,3522,3524,3526],{"class":1311,"line":3523},160,[1309,3525,2346],{"class":2238},[1309,3527,2866],{"class":1546},[1309,3529,3531,3533],{"class":1311,"line":3530},161,[1309,3532,2346],{"class":2238},[1309,3534,2880],{"class":1546},[1309,3536,3538,3540],{"class":1311,"line":3537},162,[1309,3539,2346],{"class":2238},[1309,3541,2894],{"class":1546},[1309,3543,3545,3547],{"class":1311,"line":3544},163,[1309,3546,2346],{"class":2238},[1309,3548,3344],{"class":1546},[1309,3550,3552,3554],{"class":1311,"line":3551},164,[1309,3553,2922],{"class":2234},[1309,3555,2261],{"class":2238},[1309,3557,3559,3561],{"class":1311,"line":3558},165,[1309,3560,2930],{"class":2234},[1309,3562,2261],{"class":2238},[1309,3564,3566,3568,3570],{"class":1311,"line":3565},166,[1309,3567,2938],{"class":2234},[1309,3569,2239],{"class":2238},[1309,3571,2943],{"class":1546},[1309,3573,3575,3577],{"class":1311,"line":3574},167,[1309,3576,2949],{"class":2234},[1309,3578,2261],{"class":2238},[1309,3580,3582,3584,3586],{"class":1311,"line":3581},168,[1309,3583,2938],{"class":2234},[1309,3585,2239],{"class":2238},[1309,3587,2961],{"class":1546},[1309,3589,3591,3593],{"class":1311,"line":3590},169,[1309,3592,2967],{"class":2234},[1309,3594,2261],{"class":2238},[1309,3596,3598,3600,3602],{"class":1311,"line":3597},170,[1309,3599,2938],{"class":2234},[1309,3601,2239],{"class":2238},[1309,3603,2943],{"class":1546},[1309,3605,3607,3609],{"class":1311,"line":3606},171,[1309,3608,2386],{"class":2234},[1309,3610,2261],{"class":2238},[1309,3612,3614,3616],{"class":1311,"line":3613},172,[1309,3615,2346],{"class":2238},[1309,3617,2395],{"class":1546},[1309,3619,3621,3623],{"class":1311,"line":3620},173,[1309,3622,2334],{"class":2234},[1309,3624,2261],{"class":2238},[1309,3626,3628,3630],{"class":1311,"line":3627},174,[1309,3629,2346],{"class":2238},[1309,3631,3453],{"class":1546},[1309,3633,3635,3637,3639],{"class":1311,"line":3634},175,[1309,3636,2553],{"class":2234},[1309,3638,2239],{"class":2238},[1309,3640,3641],{"class":1546}," celery -A order_service worker --loglevel=info -Q order_queue\n",[1309,3643,3645,3647,3649],{"class":1311,"line":3644},176,[1309,3646,3076],{"class":2234},[1309,3648,2239],{"class":2238},[1309,3650,3081],{"class":1546},[1309,3652,3654],{"class":1311,"line":3653},177,[1309,3655,1340],{"emptyLinePlaceholder":1339},[1309,3657,3659],{"class":1311,"line":3658},178,[1309,3660,3661],{"class":1315},"  # API Gateway using Nginx\n",[1309,3663,3665,3668],{"class":1311,"line":3664},179,[1309,3666,3667],{"class":2234},"  nginx",[1309,3669,2261],{"class":2238},[1309,3671,3673,3675,3677],{"class":1311,"line":3672},180,[1309,3674,2278],{"class":2234},[1309,3676,2239],{"class":2238},[1309,3678,3679],{"class":1546}," nginx:alpine\n",[1309,3681,3683,3685,3687],{"class":1311,"line":3682},181,[1309,3684,2288],{"class":2234},[1309,3686,2239],{"class":2238},[1309,3688,3689],{"class":1546}," api_gateway\n",[1309,3691,3693,3695],{"class":1311,"line":3692},182,[1309,3694,2366],{"class":2234},[1309,3696,2261],{"class":2238},[1309,3698,3700,3702,3704,3707],{"class":1311,"line":3699},183,[1309,3701,2346],{"class":2238},[1309,3703,2375],{"class":2242},[1309,3705,3706],{"class":1546},"80:80",[1309,3708,2381],{"class":2242},[1309,3710,3712,3714,3716,3719],{"class":1311,"line":3711},184,[1309,3713,2346],{"class":2238},[1309,3715,2375],{"class":2242},[1309,3717,3718],{"class":1546},"443:443",[1309,3720,2381],{"class":2242},[1309,3722,3724,3726],{"class":1311,"line":3723},185,[1309,3725,2334],{"class":2234},[1309,3727,2261],{"class":2238},[1309,3729,3731,3733],{"class":1311,"line":3730},186,[1309,3732,2346],{"class":2238},[1309,3734,3735],{"class":1546}," ./nginx/nginx.conf:/etc/nginx/nginx.conf\n",[1309,3737,3739,3741],{"class":1311,"line":3738},187,[1309,3740,2346],{"class":2238},[1309,3742,3743],{"class":1546}," ./nginx/ssl:/etc/nginx/ssl\n",[1309,3745,3747,3749],{"class":1311,"line":3746},188,[1309,3748,2922],{"class":2234},[1309,3750,2261],{"class":2238},[1309,3752,3754,3756],{"class":1311,"line":3753},189,[1309,3755,2346],{"class":2238},[1309,3757,3758],{"class":1546}," user-service\n",[1309,3760,3762,3764],{"class":1311,"line":3761},190,[1309,3763,2346],{"class":2238},[1309,3765,3766],{"class":1546}," order-service\n",[1309,3768,3770,3772],{"class":1311,"line":3769},191,[1309,3771,2386],{"class":2234},[1309,3773,2261],{"class":2238},[1309,3775,3777,3779],{"class":1311,"line":3776},192,[1309,3778,2346],{"class":2238},[1309,3780,2395],{"class":1546},[1309,3782,3784,3786,3788],{"class":1311,"line":3783},193,[1309,3785,3076],{"class":2234},[1309,3787,2239],{"class":2238},[1309,3789,3081],{"class":1546},[1309,3791,3793],{"class":1311,"line":3792},194,[1309,3794,1340],{"emptyLinePlaceholder":1339},[1309,3796,3798],{"class":1311,"line":3797},195,[1309,3799,3800],{"class":1315},"# Named volumes for data persistence\n",[1309,3802,3804,3807],{"class":1311,"line":3803},196,[1309,3805,3806],{"class":2234},"volumes",[1309,3808,2261],{"class":2238},[1309,3810,3812,3815],{"class":1311,"line":3811},197,[1309,3813,3814],{"class":2234},"  postgres_data",[1309,3816,2261],{"class":2238},[1309,3818,3820,3823,3825],{"class":1311,"line":3819},198,[1309,3821,3822],{"class":2234},"    driver",[1309,3824,2239],{"class":2238},[1309,3826,3827],{"class":1546}," local\n",[1309,3829,3831,3834],{"class":1311,"line":3830},199,[1309,3832,3833],{"class":2234},"  redis_data",[1309,3835,2261],{"class":2238},[1309,3837,3839,3841,3843],{"class":1311,"line":3838},200,[1309,3840,3822],{"class":2234},[1309,3842,2239],{"class":2238},[1309,3844,3827],{"class":1546},[1309,3846,3848,3851],{"class":1311,"line":3847},201,[1309,3849,3850],{"class":2234},"  rabbitmq_data",[1309,3852,2261],{"class":2238},[1309,3854,3856,3858,3860],{"class":1311,"line":3855},202,[1309,3857,3822],{"class":2234},[1309,3859,2239],{"class":2238},[1309,3861,3827],{"class":1546},[1309,3863,3865],{"class":1311,"line":3864},203,[1309,3866,1340],{"emptyLinePlaceholder":1339},[1309,3868,3870],{"class":1311,"line":3869},204,[1309,3871,3872],{"class":1315},"# Custom network for service communication\n",[1309,3874,3876,3879],{"class":1311,"line":3875},205,[1309,3877,3878],{"class":2234},"networks",[1309,3880,2261],{"class":2238},[1309,3882,3884,3887],{"class":1311,"line":3883},206,[1309,3885,3886],{"class":2234},"  microservices_network",[1309,3888,2261],{"class":2238},[1309,3890,3892,3894,3896],{"class":1311,"line":3891},207,[1309,3893,3822],{"class":2234},[1309,3895,2239],{"class":2238},[1309,3897,3898],{"class":1546}," bridge\n",[1309,3900,3902,3905],{"class":1311,"line":3901},208,[1309,3903,3904],{"class":2234},"    ipam",[1309,3906,2261],{"class":2238},[1309,3908,3910,3913],{"class":1311,"line":3909},209,[1309,3911,3912],{"class":2234},"      config",[1309,3914,2261],{"class":2238},[1309,3916,3918,3921,3924,3926],{"class":1311,"line":3917},210,[1309,3919,3920],{"class":2238},"        -",[1309,3922,3923],{"class":2234}," subnet",[1309,3925,2239],{"class":2238},[1309,3927,3928],{"class":1546}," 172.20.0.0/16\n",[1026,3930,3931],{},[1045,3932,3933],{},"Docker Compose Features Explained:",[1049,3935,3936,3944,3950,3955,3961,3967],{},[1052,3937,3938,1711,3940,3943],{},[1045,3939,1062],{},[1306,3941,3942],{},"depends_on"," ensures services start in the right order",[1052,3945,3946,3949],{},[1045,3947,3948],{},"Health Checks",": Verify services are ready before starting dependent services",[1052,3951,3952,3954],{},[1045,3953,1720],{},": Configure services for different environments",[1052,3956,3957,3960],{},[1045,3958,3959],{},"Volume Mounts",": Persist data and enable hot reload for development",[1052,3962,3963,3966],{},[1045,3964,3965],{},"Networks",": Isolate services and enable communication",[1052,3968,3969,3972],{},[1045,3970,3971],{},"Restart Policies",": Automatically restart failed services",[1026,3974,3975],{},[1045,3976,3977],{},"Using Docker Compose:",[1299,3979,3983],{"className":3980,"code":3981,"language":3982,"meta":1304,"style":1304},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Start all services\ndocker-compose up -d\n\n# View logs\ndocker-compose logs -f user-service\n\n# Scale a service\ndocker-compose up -d --scale user-worker=3\n\n# Stop all services\ndocker-compose down\n\n# Rebuild and start\ndocker-compose up -d --build\n\n# Remove everything including volumes\ndocker-compose down -v\n","bash",[1306,3984,3985,3990,4003,4007,4012,4024,4028,4033,4051,4055,4060,4067,4071,4076,4087,4091,4096],{"__ignoreMap":1304},[1309,3986,3987],{"class":1311,"line":1312},[1309,3988,3989],{"class":1315},"# Start all services\n",[1309,3991,3992,3996,3999],{"class":1311,"line":1319},[1309,3993,3995],{"class":3994},"sYn-s","docker-compose",[1309,3997,3998],{"class":1546}," up",[1309,4000,4002],{"class":4001},"sz9Cv"," -d\n",[1309,4004,4005],{"class":1311,"line":1325},[1309,4006,1340],{"emptyLinePlaceholder":1339},[1309,4008,4009],{"class":1311,"line":1336},[1309,4010,4011],{"class":1315},"# View logs\n",[1309,4013,4014,4016,4019,4022],{"class":1311,"line":1343},[1309,4015,3995],{"class":3994},[1309,4017,4018],{"class":1546}," logs",[1309,4020,4021],{"class":4001}," -f",[1309,4023,3758],{"class":1546},[1309,4025,4026],{"class":1311,"line":1349},[1309,4027,1340],{"emptyLinePlaceholder":1339},[1309,4029,4030],{"class":1311,"line":1355},[1309,4031,4032],{"class":1315},"# Scale a service\n",[1309,4034,4035,4037,4039,4042,4045,4048],{"class":1311,"line":1361},[1309,4036,3995],{"class":3994},[1309,4038,3998],{"class":1546},[1309,4040,4041],{"class":4001}," -d",[1309,4043,4044],{"class":4001}," --scale",[1309,4046,4047],{"class":1546}," user-worker=",[1309,4049,4050],{"class":2466},"3\n",[1309,4052,4053],{"class":1311,"line":1370},[1309,4054,1340],{"emptyLinePlaceholder":1339},[1309,4056,4057],{"class":1311,"line":1378},[1309,4058,4059],{"class":1315},"# Stop all services\n",[1309,4061,4062,4064],{"class":1311,"line":1386},[1309,4063,3995],{"class":3994},[1309,4065,4066],{"class":1546}," down\n",[1309,4068,4069],{"class":1311,"line":1391},[1309,4070,1340],{"emptyLinePlaceholder":1339},[1309,4072,4073],{"class":1311,"line":1397},[1309,4074,4075],{"class":1315},"# Rebuild and start\n",[1309,4077,4078,4080,4082,4084],{"class":1311,"line":1406},[1309,4079,3995],{"class":3994},[1309,4081,3998],{"class":1546},[1309,4083,4041],{"class":4001},[1309,4085,4086],{"class":4001}," --build\n",[1309,4088,4089],{"class":1311,"line":1411},[1309,4090,1340],{"emptyLinePlaceholder":1339},[1309,4092,4093],{"class":1311,"line":1417},[1309,4094,4095],{"class":1315},"# Remove everything including volumes\n",[1309,4097,4098,4100,4103],{"class":1311,"line":1423},[1309,4099,3995],{"class":3994},[1309,4101,4102],{"class":1546}," down",[1309,4104,4105],{"class":4001}," -v\n",[1038,4107,4109],{"id":4108},"nginx-configuration","Nginx Configuration",[1026,4111,4112],{},"Nginx acts as an API Gateway and reverse proxy for your microservices. It's the single entry point that routes requests to the appropriate services, handles SSL termination, load balancing, and caching.",[1026,4114,4115],{},[1045,4116,4117],{},"Why Use Nginx as API Gateway:",[1101,4119,4120,4126,4132,4138,4143,4149],{},[1052,4121,4122,4125],{},[1045,4123,4124],{},"Single Entry Point",": Clients only need to know one URL",[1052,4127,4128,4131],{},[1045,4129,4130],{},"Load Balancing",": Distribute requests across multiple service instances",[1052,4133,4134,4137],{},[1045,4135,4136],{},"SSL Termination",": Handle HTTPS encryption/decryption",[1052,4139,4140,4142],{},[1045,4141,673],{},": Cache responses to reduce load on services",[1052,4144,4145,4148],{},[1045,4146,4147],{},"Rate Limiting",": Protect services from abuse",[1052,4150,4151,4154],{},[1045,4152,4153],{},"Request/Response Transformation",": Modify headers, add authentication",[1299,4156,4160],{"className":4157,"code":4158,"language":4159,"meta":1304,"style":1304},"language-nginx shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# nginx/nginx.conf\n# Main nginx configuration for microservices API gateway\n\n# Global settings\nuser nginx;\nworker_processes auto;  # Use all available CPU cores\nerror_log /var/log/nginx/error.log warn;\npid /var/run/nginx.pid;\n\n# Connection settings\nevents {\n    worker_connections 1024;  # Max connections per worker\n    use epoll;               # Efficient connection method for Linux\n    multi_accept on;         # Accept multiple connections at once\n}\n\nhttp {\n    # Basic settings\n    include /etc/nginx/mime.types;\n    default_type application/octet-stream;\n    \n    # Logging format\n    log_format main '$remote_addr - $remote_user [$time_local] \"$request\" '\n                    '$status $body_bytes_sent \"$http_referer\" '\n                    '\"$http_user_agent\" \"$http_x_forwarded_for\" '\n                    'rt=$request_time uct=\"$upstream_connect_time\" '\n                    'uht=\"$upstream_header_time\" urt=\"$upstream_response_time\"';\n    \n    access_log /var/log/nginx/access.log main;\n    \n    # Performance settings\n    sendfile on;              # Efficient file serving\n    tcp_nopush on;           # Send headers in one piece\n    tcp_nodelay on;          # Don't buffer data-sends\n    keepalive_timeout 65;    # Keep connections alive\n    types_hash_max_size 2048;\n    \n    # Gzip compression\n    gzip on;\n    gzip_vary on;\n    gzip_min_length 1024;\n    gzip_proxied any;\n    gzip_comp_level 6;\n    gzip_types\n        text/plain\n        text/css\n        text/xml\n        text/javascript\n        application/json\n        application/javascript\n        application/xml+rss\n        application/atom+xml\n        image/svg+xml;\n    \n    # Rate limiting zones\n    # Limit requests per IP to prevent abuse\n    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;\n    limit_req_zone $binary_remote_addr zone=auth:10m rate=5r/s;\n    \n    # Upstream definitions (backend services)\n    upstream user_service {\n        # Load balancing method\n        least_conn;  # Route to server with fewest active connections\n        \n        # Backend servers\n        server user-service:8000 max_fails=3 fail_timeout=30s;\n        # Add more instances for load balancing:\n        # server user-service-2:8000 max_fails=3 fail_timeout=30s;\n        # server user-service-3:8000 max_fails=3 fail_timeout=30s;\n        \n        # Health check (requires nginx-plus or custom module)\n        # health_check interval=10s fails=3 passes=2;\n    }\n    \n    upstream order_service {\n        least_conn;\n        server order-service:8000 max_fails=3 fail_timeout=30s;\n    }\n    \n    upstream payment_service {\n        least_conn;\n        server payment-service:8000 max_fails=3 fail_timeout=30s;\n    }\n    \n    # Main server block\n    server {\n        listen 80;\n        server_name api.yourdomain.com localhost;\n        \n        # Security headers\n        add_header X-Frame-Options DENY;\n        add_header X-Content-Type-Options nosniff;\n        add_header X-XSS-Protection \"1; mode=block\";\n        add_header Referrer-Policy \"strict-origin-when-cross-origin\";\n        \n        # CORS headers for API access\n        add_header Access-Control-Allow-Origin \"*\";\n        add_header Access-Control-Allow-Methods \"GET, POST, PUT, DELETE, OPTIONS\";\n        add_header Access-Control-Allow-Headers \"Origin, X-Requested-With, Content-Type, Accept, Authorization\";\n        \n        # Handle preflight requests\n        if ($request_method = 'OPTIONS') {\n            add_header Access-Control-Allow-Origin \"*\";\n            add_header Access-Control-Allow-Methods \"GET, POST, PUT, DELETE, OPTIONS\";\n            add_header Access-Control-Allow-Headers \"Origin, X-Requested-With, Content-Type, Accept, Authorization\";\n            add_header Access-Control-Max-Age 1728000;\n            add_header Content-Type \"text/plain charset=UTF-8\";\n            add_header Content-Length 0;\n            return 204;\n        }\n        \n        # User service routes\n        location /api/users/ {\n            # Apply rate limiting\n            limit_req zone=api burst=20 nodelay;\n            \n            # Proxy settings\n            proxy_pass http://user_service;\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n            proxy_set_header X-Forwarded-Proto $scheme;\n            \n            # Timeout settings\n            proxy_connect_timeout 5s;\n            proxy_send_timeout 10s;\n            proxy_read_timeout 10s;\n            \n            # Buffer settings\n            proxy_buffering on;\n            proxy_buffer_size 4k;\n            proxy_buffers 8 4k;\n            \n            # Error handling\n            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;\n        }\n        \n        # Authentication routes (stricter rate limiting)\n        location /api/auth/ {\n            limit_req zone=auth burst=10 nodelay;\n            \n            proxy_pass http://user_service;\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n            proxy_set_header X-Forwarded-Proto $scheme;\n            \n            # Shorter timeouts for auth\n            proxy_connect_timeout 3s;\n            proxy_send_timeout 5s;\n            proxy_read_timeout 5s;\n        }\n        \n        # Order service routes\n        location /api/orders/ {\n            limit_req zone=api burst=20 nodelay;\n            \n            proxy_pass http://order_service;\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n            proxy_set_header X-Forwarded-Proto $scheme;\n            \n            # Longer timeout for order processing\n            proxy_connect_timeout 5s;\n            proxy_send_timeout 30s;\n            proxy_read_timeout 30s;\n        }\n        \n        # Payment service routes (most secure)\n        location /api/payments/ {\n            # Stricter rate limiting for payments\n            limit_req zone=api burst=5 nodelay;\n            \n            proxy_pass http://payment_service;\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n            proxy_set_header X-Forwarded-Proto $scheme;\n            \n            # Additional security headers for payments\n            add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n            \n            # Longer timeout for payment processing\n            proxy_connect_timeout 5s;\n            proxy_send_timeout 60s;\n            proxy_read_timeout 60s;\n        }\n        \n        # Health check endpoint\n        location /health {\n            access_log off;\n            return 200 \"healthy\\n\";\n            add_header Content-Type text/plain;\n        }\n        \n        # Static files (if serving from nginx)\n        location /static/ {\n            alias /var/www/static/;\n            expires 1y;\n            add_header Cache-Control \"public, immutable\";\n        }\n        \n        # Media files\n        location /media/ {\n            alias /var/www/media/;\n            expires 30d;\n            add_header Cache-Control \"public\";\n        }\n        \n        # Default location (catch-all)\n        location / {\n            return 404 \"Not Found\";\n        }\n    }\n    \n    # HTTPS server (production)\n    server {\n        listen 443 ssl http2;\n        server_name api.yourdomain.com;\n        \n        # SSL configuration\n        ssl_certificate /etc/nginx/ssl/cert.pem;\n        ssl_certificate_key /etc/nginx/ssl/key.pem;\n        \n        # SSL settings\n        ssl_protocols TLSv1.2 TLSv1.3;\n        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;\n        ssl_prefer_server_ciphers off;\n        ssl_session_cache shared:SSL:10m;\n        ssl_session_timeout 10m;\n        \n        # HSTS header\n        add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n        \n        # Include all the location blocks from the HTTP server\n        include /etc/nginx/conf.d/api-locations.conf;\n    }\n}\n","nginx",[1306,4161,4162,4167,4172,4176,4181,4186,4191,4196,4201,4205,4210,4215,4220,4225,4230,4235,4239,4244,4249,4254,4259,4264,4269,4274,4279,4284,4289,4294,4298,4303,4307,4312,4317,4322,4327,4332,4337,4341,4346,4351,4356,4361,4366,4371,4376,4381,4386,4391,4396,4401,4406,4411,4416,4421,4425,4430,4435,4440,4445,4449,4454,4459,4464,4469,4474,4479,4484,4489,4494,4499,4503,4508,4513,4518,4522,4527,4532,4537,4541,4545,4550,4554,4559,4563,4567,4572,4577,4582,4587,4591,4596,4601,4606,4611,4616,4620,4625,4630,4635,4640,4644,4649,4654,4659,4664,4669,4674,4679,4684,4689,4694,4698,4703,4708,4713,4718,4723,4728,4733,4738,4743,4748,4753,4757,4762,4767,4772,4777,4781,4786,4791,4796,4801,4805,4810,4815,4819,4823,4828,4833,4838,4842,4846,4850,4854,4858,4862,4866,4871,4876,4881,4886,4890,4894,4899,4904,4908,4912,4917,4921,4925,4929,4933,4937,4942,4946,4951,4956,4960,4964,4969,4974,4979,4984,4988,4993,4997,5001,5005,5009,5013,5018,5023,5027,5032,5036,5041,5046,5050,5054,5059,5064,5069,5074,5079,5083,5087,5092,5097,5102,5107,5112,5116,5120,5125,5130,5135,5140,5145,5149,5153,5159,5165,5171,5176,5181,5186,5192,5197,5203,5209,5214,5220,5226,5232,5237,5243,5249,5255,5261,5267,5273,5278,5284,5290,5295,5301,5307,5312],{"__ignoreMap":1304},[1309,4163,4164],{"class":1311,"line":1312},[1309,4165,4166],{},"# nginx/nginx.conf\n",[1309,4168,4169],{"class":1311,"line":1319},[1309,4170,4171],{},"# Main nginx configuration for microservices API gateway\n",[1309,4173,4174],{"class":1311,"line":1325},[1309,4175,1340],{"emptyLinePlaceholder":1339},[1309,4177,4178],{"class":1311,"line":1336},[1309,4179,4180],{},"# Global settings\n",[1309,4182,4183],{"class":1311,"line":1343},[1309,4184,4185],{},"user nginx;\n",[1309,4187,4188],{"class":1311,"line":1349},[1309,4189,4190],{},"worker_processes auto;  # Use all available CPU cores\n",[1309,4192,4193],{"class":1311,"line":1355},[1309,4194,4195],{},"error_log /var/log/nginx/error.log warn;\n",[1309,4197,4198],{"class":1311,"line":1361},[1309,4199,4200],{},"pid /var/run/nginx.pid;\n",[1309,4202,4203],{"class":1311,"line":1370},[1309,4204,1340],{"emptyLinePlaceholder":1339},[1309,4206,4207],{"class":1311,"line":1378},[1309,4208,4209],{},"# Connection settings\n",[1309,4211,4212],{"class":1311,"line":1386},[1309,4213,4214],{},"events {\n",[1309,4216,4217],{"class":1311,"line":1391},[1309,4218,4219],{},"    worker_connections 1024;  # Max connections per worker\n",[1309,4221,4222],{"class":1311,"line":1397},[1309,4223,4224],{},"    use epoll;               # Efficient connection method for Linux\n",[1309,4226,4227],{"class":1311,"line":1406},[1309,4228,4229],{},"    multi_accept on;         # Accept multiple connections at once\n",[1309,4231,4232],{"class":1311,"line":1411},[1309,4233,4234],{},"}\n",[1309,4236,4237],{"class":1311,"line":1417},[1309,4238,1340],{"emptyLinePlaceholder":1339},[1309,4240,4241],{"class":1311,"line":1423},[1309,4242,4243],{},"http {\n",[1309,4245,4246],{"class":1311,"line":1432},[1309,4247,4248],{},"    # Basic settings\n",[1309,4250,4251],{"class":1311,"line":1438},[1309,4252,4253],{},"    include /etc/nginx/mime.types;\n",[1309,4255,4256],{"class":1311,"line":1444},[1309,4257,4258],{},"    default_type application/octet-stream;\n",[1309,4260,4261],{"class":1311,"line":1450},[1309,4262,4263],{},"    \n",[1309,4265,4266],{"class":1311,"line":1456},[1309,4267,4268],{},"    # Logging format\n",[1309,4270,4271],{"class":1311,"line":1462},[1309,4272,4273],{},"    log_format main '$remote_addr - $remote_user [$time_local] \"$request\" '\n",[1309,4275,4276],{"class":1311,"line":1468},[1309,4277,4278],{},"                    '$status $body_bytes_sent \"$http_referer\" '\n",[1309,4280,4281],{"class":1311,"line":1473},[1309,4282,4283],{},"                    '\"$http_user_agent\" \"$http_x_forwarded_for\" '\n",[1309,4285,4286],{"class":1311,"line":1479},[1309,4287,4288],{},"                    'rt=$request_time uct=\"$upstream_connect_time\" '\n",[1309,4290,4291],{"class":1311,"line":1485},[1309,4292,4293],{},"                    'uht=\"$upstream_header_time\" urt=\"$upstream_response_time\"';\n",[1309,4295,4296],{"class":1311,"line":1494},[1309,4297,4263],{},[1309,4299,4300],{"class":1311,"line":1502},[1309,4301,4302],{},"    access_log /var/log/nginx/access.log main;\n",[1309,4304,4305],{"class":1311,"line":1507},[1309,4306,4263],{},[1309,4308,4309],{"class":1311,"line":1513},[1309,4310,4311],{},"    # Performance settings\n",[1309,4313,4314],{"class":1311,"line":1521},[1309,4315,4316],{},"    sendfile on;              # Efficient file serving\n",[1309,4318,4319],{"class":1311,"line":1526},[1309,4320,4321],{},"    tcp_nopush on;           # Send headers in one piece\n",[1309,4323,4324],{"class":1311,"line":1532},[1309,4325,4326],{},"    tcp_nodelay on;          # Don't buffer data-sends\n",[1309,4328,4329],{"class":1311,"line":1538},[1309,4330,4331],{},"    keepalive_timeout 65;    # Keep connections alive\n",[1309,4333,4334],{"class":1311,"line":1553},[1309,4335,4336],{},"    types_hash_max_size 2048;\n",[1309,4338,4339],{"class":1311,"line":1561},[1309,4340,4263],{},[1309,4342,4343],{"class":1311,"line":1569},[1309,4344,4345],{},"    # Gzip compression\n",[1309,4347,4348],{"class":1311,"line":1574},[1309,4349,4350],{},"    gzip on;\n",[1309,4352,4353],{"class":1311,"line":1580},[1309,4354,4355],{},"    gzip_vary on;\n",[1309,4357,4358],{"class":1311,"line":1586},[1309,4359,4360],{},"    gzip_min_length 1024;\n",[1309,4362,4363],{"class":1311,"line":1594},[1309,4364,4365],{},"    gzip_proxied any;\n",[1309,4367,4368],{"class":1311,"line":1599},[1309,4369,4370],{},"    gzip_comp_level 6;\n",[1309,4372,4373],{"class":1311,"line":1605},[1309,4374,4375],{},"    gzip_types\n",[1309,4377,4378],{"class":1311,"line":1614},[1309,4379,4380],{},"        text/plain\n",[1309,4382,4383],{"class":1311,"line":1623},[1309,4384,4385],{},"        text/css\n",[1309,4387,4388],{"class":1311,"line":1628},[1309,4389,4390],{},"        text/xml\n",[1309,4392,4393],{"class":1311,"line":1634},[1309,4394,4395],{},"        text/javascript\n",[1309,4397,4398],{"class":1311,"line":1643},[1309,4399,4400],{},"        application/json\n",[1309,4402,4403],{"class":1311,"line":1648},[1309,4404,4405],{},"        application/javascript\n",[1309,4407,4408],{"class":1311,"line":1654},[1309,4409,4410],{},"        application/xml+rss\n",[1309,4412,4413],{"class":1311,"line":1660},[1309,4414,4415],{},"        application/atom+xml\n",[1309,4417,4418],{"class":1311,"line":2043},[1309,4419,4420],{},"        image/svg+xml;\n",[1309,4422,4423],{"class":1311,"line":2050},[1309,4424,4263],{},[1309,4426,4427],{"class":1311,"line":2055},[1309,4428,4429],{},"    # Rate limiting zones\n",[1309,4431,4432],{"class":1311,"line":2061},[1309,4433,4434],{},"    # Limit requests per IP to prevent abuse\n",[1309,4436,4437],{"class":1311,"line":2073},[1309,4438,4439],{},"    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;\n",[1309,4441,4442],{"class":1311,"line":2085},[1309,4443,4444],{},"    limit_req_zone $binary_remote_addr zone=auth:10m rate=5r/s;\n",[1309,4446,4447],{"class":1311,"line":2098},[1309,4448,4263],{},[1309,4450,4451],{"class":1311,"line":2111},[1309,4452,4453],{},"    # Upstream definitions (backend services)\n",[1309,4455,4456],{"class":1311,"line":2124},[1309,4457,4458],{},"    upstream user_service {\n",[1309,4460,4461],{"class":1311,"line":2136},[1309,4462,4463],{},"        # Load balancing method\n",[1309,4465,4466],{"class":1311,"line":2149},[1309,4467,4468],{},"        least_conn;  # Route to server with fewest active connections\n",[1309,4470,4471],{"class":1311,"line":2162},[1309,4472,4473],{},"        \n",[1309,4475,4476],{"class":1311,"line":2175},[1309,4477,4478],{},"        # Backend servers\n",[1309,4480,4481],{"class":1311,"line":2786},[1309,4482,4483],{},"        server user-service:8000 max_fails=3 fail_timeout=30s;\n",[1309,4485,4486],{"class":1311,"line":2797},[1309,4487,4488],{},"        # Add more instances for load balancing:\n",[1309,4490,4491],{"class":1311,"line":2808},[1309,4492,4493],{},"        # server user-service-2:8000 max_fails=3 fail_timeout=30s;\n",[1309,4495,4496],{"class":1311,"line":2819},[1309,4497,4498],{},"        # server user-service-3:8000 max_fails=3 fail_timeout=30s;\n",[1309,4500,4501],{"class":1311,"line":2829},[1309,4502,4473],{},[1309,4504,4505],{"class":1311,"line":2836},[1309,4506,4507],{},"        # Health check (requires nginx-plus or custom module)\n",[1309,4509,4510],{"class":1311,"line":2848},[1309,4511,4512],{},"        # health_check interval=10s fails=3 passes=2;\n",[1309,4514,4515],{"class":1311,"line":2855},[1309,4516,4517],{},"    }\n",[1309,4519,4520],{"class":1311,"line":2861},[1309,4521,4263],{},[1309,4523,4524],{"class":1311,"line":2869},[1309,4525,4526],{},"    upstream order_service {\n",[1309,4528,4529],{"class":1311,"line":2875},[1309,4530,4531],{},"        least_conn;\n",[1309,4533,4534],{"class":1311,"line":2883},[1309,4535,4536],{},"        server order-service:8000 max_fails=3 fail_timeout=30s;\n",[1309,4538,4539],{"class":1311,"line":2889},[1309,4540,4517],{},[1309,4542,4543],{"class":1311,"line":2897},[1309,4544,4263],{},[1309,4546,4547],{"class":1311,"line":2903},[1309,4548,4549],{},"    upstream payment_service {\n",[1309,4551,4552],{"class":1311,"line":2911},[1309,4553,4531],{},[1309,4555,4556],{"class":1311,"line":2919},[1309,4557,4558],{},"        server payment-service:8000 max_fails=3 fail_timeout=30s;\n",[1309,4560,4561],{"class":1311,"line":2927},[1309,4562,4517],{},[1309,4564,4565],{"class":1311,"line":2935},[1309,4566,4263],{},[1309,4568,4569],{"class":1311,"line":2946},[1309,4570,4571],{},"    # Main server block\n",[1309,4573,4574],{"class":1311,"line":2954},[1309,4575,4576],{},"    server {\n",[1309,4578,4579],{"class":1311,"line":2964},[1309,4580,4581],{},"        listen 80;\n",[1309,4583,4584],{"class":1311,"line":2972},[1309,4585,4586],{},"        server_name api.yourdomain.com localhost;\n",[1309,4588,4589],{"class":1311,"line":2981},[1309,4590,4473],{},[1309,4592,4593],{"class":1311,"line":2988},[1309,4594,4595],{},"        # Security headers\n",[1309,4597,4598],{"class":1311,"line":2995},[1309,4599,4600],{},"        add_header X-Frame-Options DENY;\n",[1309,4602,4603],{"class":1311,"line":3002},[1309,4604,4605],{},"        add_header X-Content-Type-Options nosniff;\n",[1309,4607,4608],{"class":1311,"line":3008},[1309,4609,4610],{},"        add_header X-XSS-Protection \"1; mode=block\";\n",[1309,4612,4613],{"class":1311,"line":3016},[1309,4614,4615],{},"        add_header Referrer-Policy \"strict-origin-when-cross-origin\";\n",[1309,4617,4618],{"class":1311,"line":3022},[1309,4619,4473],{},[1309,4621,4622],{"class":1311,"line":3030},[1309,4623,4624],{},"        # CORS headers for API access\n",[1309,4626,4627],{"class":1311,"line":3038},[1309,4628,4629],{},"        add_header Access-Control-Allow-Origin \"*\";\n",[1309,4631,4632],{"class":1311,"line":3044},[1309,4633,4634],{},"        add_header Access-Control-Allow-Methods \"GET, POST, PUT, DELETE, OPTIONS\";\n",[1309,4636,4637],{"class":1311,"line":3055},[1309,4638,4639],{},"        add_header Access-Control-Allow-Headers \"Origin, X-Requested-With, Content-Type, Accept, Authorization\";\n",[1309,4641,4642],{"class":1311,"line":3061},[1309,4643,4473],{},[1309,4645,4646],{"class":1311,"line":3067},[1309,4647,4648],{},"        # Handle preflight requests\n",[1309,4650,4651],{"class":1311,"line":3073},[1309,4652,4653],{},"        if ($request_method = 'OPTIONS') {\n",[1309,4655,4656],{"class":1311,"line":3084},[1309,4657,4658],{},"            add_header Access-Control-Allow-Origin \"*\";\n",[1309,4660,4661],{"class":1311,"line":3089},[1309,4662,4663],{},"            add_header Access-Control-Allow-Methods \"GET, POST, PUT, DELETE, OPTIONS\";\n",[1309,4665,4666],{"class":1311,"line":3095},[1309,4667,4668],{},"            add_header Access-Control-Allow-Headers \"Origin, X-Requested-With, Content-Type, Accept, Authorization\";\n",[1309,4670,4671],{"class":1311,"line":3103},[1309,4672,4673],{},"            add_header Access-Control-Max-Age 1728000;\n",[1309,4675,4676],{"class":1311,"line":3112},[1309,4677,4678],{},"            add_header Content-Type \"text/plain charset=UTF-8\";\n",[1309,4680,4681],{"class":1311,"line":3122},[1309,4682,4683],{},"            add_header Content-Length 0;\n",[1309,4685,4686],{"class":1311,"line":3129},[1309,4687,4688],{},"            return 204;\n",[1309,4690,4691],{"class":1311,"line":3136},[1309,4692,4693],{},"        }\n",[1309,4695,4696],{"class":1311,"line":3143},[1309,4697,4473],{},[1309,4699,4700],{"class":1311,"line":3150},[1309,4701,4702],{},"        # User service routes\n",[1309,4704,4705],{"class":1311,"line":3157},[1309,4706,4707],{},"        location /api/users/ {\n",[1309,4709,4710],{"class":1311,"line":3164},[1309,4711,4712],{},"            # Apply rate limiting\n",[1309,4714,4715],{"class":1311,"line":3171},[1309,4716,4717],{},"            limit_req zone=api burst=20 nodelay;\n",[1309,4719,4720],{"class":1311,"line":3180},[1309,4721,4722],{},"            \n",[1309,4724,4725],{"class":1311,"line":3187},[1309,4726,4727],{},"            # Proxy settings\n",[1309,4729,4730],{"class":1311,"line":3196},[1309,4731,4732],{},"            proxy_pass http://user_service;\n",[1309,4734,4735],{"class":1311,"line":3203},[1309,4736,4737],{},"            proxy_set_header Host $host;\n",[1309,4739,4740],{"class":1311,"line":3212},[1309,4741,4742],{},"            proxy_set_header X-Real-IP $remote_addr;\n",[1309,4744,4745],{"class":1311,"line":3219},[1309,4746,4747],{},"            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n",[1309,4749,4750],{"class":1311,"line":3226},[1309,4751,4752],{},"            proxy_set_header X-Forwarded-Proto $scheme;\n",[1309,4754,4755],{"class":1311,"line":3233},[1309,4756,4722],{},[1309,4758,4759],{"class":1311,"line":3240},[1309,4760,4761],{},"            # Timeout settings\n",[1309,4763,4764],{"class":1311,"line":3250},[1309,4765,4766],{},"            proxy_connect_timeout 5s;\n",[1309,4768,4769],{"class":1311,"line":3259},[1309,4770,4771],{},"            proxy_send_timeout 10s;\n",[1309,4773,4774],{"class":1311,"line":3264},[1309,4775,4776],{},"            proxy_read_timeout 10s;\n",[1309,4778,4779],{"class":1311,"line":3272},[1309,4780,4722],{},[1309,4782,4783],{"class":1311,"line":3282},[1309,4784,4785],{},"            # Buffer settings\n",[1309,4787,4788],{"class":1311,"line":3292},[1309,4789,4790],{},"            proxy_buffering on;\n",[1309,4792,4793],{"class":1311,"line":3299},[1309,4794,4795],{},"            proxy_buffer_size 4k;\n",[1309,4797,4798],{"class":1311,"line":3311},[1309,4799,4800],{},"            proxy_buffers 8 4k;\n",[1309,4802,4803],{"class":1311,"line":3318},[1309,4804,4722],{},[1309,4806,4807],{"class":1311,"line":3325},[1309,4808,4809],{},"            # Error handling\n",[1309,4811,4812],{"class":1311,"line":3332},[1309,4813,4814],{},"            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;\n",[1309,4816,4817],{"class":1311,"line":3339},[1309,4818,4693],{},[1309,4820,4821],{"class":1311,"line":3347},[1309,4822,4473],{},[1309,4824,4825],{"class":1311,"line":3355},[1309,4826,4827],{},"        # Authentication routes (stricter rate limiting)\n",[1309,4829,4830],{"class":1311,"line":3362},[1309,4831,4832],{},"        location /api/auth/ {\n",[1309,4834,4835],{"class":1311,"line":3369},[1309,4836,4837],{},"            limit_req zone=auth burst=10 nodelay;\n",[1309,4839,4840],{"class":1311,"line":3378},[1309,4841,4722],{},[1309,4843,4844],{"class":1311,"line":3385},[1309,4845,4732],{},[1309,4847,4848],{"class":1311,"line":3394},[1309,4849,4737],{},[1309,4851,4852],{"class":1311,"line":3401},[1309,4853,4742],{},[1309,4855,4856],{"class":1311,"line":3410},[1309,4857,4747],{},[1309,4859,4860],{"class":1311,"line":3418},[1309,4861,4752],{},[1309,4863,4864],{"class":1311,"line":3427},[1309,4865,4722],{},[1309,4867,4868],{"class":1311,"line":3434},[1309,4869,4870],{},"            # Shorter timeouts for auth\n",[1309,4872,4873],{"class":1311,"line":3441},[1309,4874,4875],{},"            proxy_connect_timeout 3s;\n",[1309,4877,4878],{"class":1311,"line":3448},[1309,4879,4880],{},"            proxy_send_timeout 5s;\n",[1309,4882,4883],{"class":1311,"line":3456},[1309,4884,4885],{},"            proxy_read_timeout 5s;\n",[1309,4887,4888],{"class":1311,"line":3465},[1309,4889,4693],{},[1309,4891,4892],{"class":1311,"line":3470},[1309,4893,4473],{},[1309,4895,4896],{"class":1311,"line":3475},[1309,4897,4898],{},"        # Order service routes\n",[1309,4900,4901],{"class":1311,"line":3484},[1309,4902,4903],{},"        location /api/orders/ {\n",[1309,4905,4906],{"class":1311,"line":3489},[1309,4907,4717],{},[1309,4909,4910],{"class":1311,"line":3497},[1309,4911,4722],{},[1309,4913,4914],{"class":1311,"line":3506},[1309,4915,4916],{},"            proxy_pass http://order_service;\n",[1309,4918,4919],{"class":1311,"line":3516},[1309,4920,4737],{},[1309,4922,4923],{"class":1311,"line":3523},[1309,4924,4742],{},[1309,4926,4927],{"class":1311,"line":3530},[1309,4928,4747],{},[1309,4930,4931],{"class":1311,"line":3537},[1309,4932,4752],{},[1309,4934,4935],{"class":1311,"line":3544},[1309,4936,4722],{},[1309,4938,4939],{"class":1311,"line":3551},[1309,4940,4941],{},"            # Longer timeout for order processing\n",[1309,4943,4944],{"class":1311,"line":3558},[1309,4945,4766],{},[1309,4947,4948],{"class":1311,"line":3565},[1309,4949,4950],{},"            proxy_send_timeout 30s;\n",[1309,4952,4953],{"class":1311,"line":3574},[1309,4954,4955],{},"            proxy_read_timeout 30s;\n",[1309,4957,4958],{"class":1311,"line":3581},[1309,4959,4693],{},[1309,4961,4962],{"class":1311,"line":3590},[1309,4963,4473],{},[1309,4965,4966],{"class":1311,"line":3597},[1309,4967,4968],{},"        # Payment service routes (most secure)\n",[1309,4970,4971],{"class":1311,"line":3606},[1309,4972,4973],{},"        location /api/payments/ {\n",[1309,4975,4976],{"class":1311,"line":3613},[1309,4977,4978],{},"            # Stricter rate limiting for payments\n",[1309,4980,4981],{"class":1311,"line":3620},[1309,4982,4983],{},"            limit_req zone=api burst=5 nodelay;\n",[1309,4985,4986],{"class":1311,"line":3627},[1309,4987,4722],{},[1309,4989,4990],{"class":1311,"line":3634},[1309,4991,4992],{},"            proxy_pass http://payment_service;\n",[1309,4994,4995],{"class":1311,"line":3644},[1309,4996,4737],{},[1309,4998,4999],{"class":1311,"line":3653},[1309,5000,4742],{},[1309,5002,5003],{"class":1311,"line":3658},[1309,5004,4747],{},[1309,5006,5007],{"class":1311,"line":3664},[1309,5008,4752],{},[1309,5010,5011],{"class":1311,"line":3672},[1309,5012,4722],{},[1309,5014,5015],{"class":1311,"line":3682},[1309,5016,5017],{},"            # Additional security headers for payments\n",[1309,5019,5020],{"class":1311,"line":3692},[1309,5021,5022],{},"            add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n",[1309,5024,5025],{"class":1311,"line":3699},[1309,5026,4722],{},[1309,5028,5029],{"class":1311,"line":3711},[1309,5030,5031],{},"            # Longer timeout for payment processing\n",[1309,5033,5034],{"class":1311,"line":3723},[1309,5035,4766],{},[1309,5037,5038],{"class":1311,"line":3730},[1309,5039,5040],{},"            proxy_send_timeout 60s;\n",[1309,5042,5043],{"class":1311,"line":3738},[1309,5044,5045],{},"            proxy_read_timeout 60s;\n",[1309,5047,5048],{"class":1311,"line":3746},[1309,5049,4693],{},[1309,5051,5052],{"class":1311,"line":3753},[1309,5053,4473],{},[1309,5055,5056],{"class":1311,"line":3761},[1309,5057,5058],{},"        # Health check endpoint\n",[1309,5060,5061],{"class":1311,"line":3769},[1309,5062,5063],{},"        location /health {\n",[1309,5065,5066],{"class":1311,"line":3776},[1309,5067,5068],{},"            access_log off;\n",[1309,5070,5071],{"class":1311,"line":3783},[1309,5072,5073],{},"            return 200 \"healthy\\n\";\n",[1309,5075,5076],{"class":1311,"line":3792},[1309,5077,5078],{},"            add_header Content-Type text/plain;\n",[1309,5080,5081],{"class":1311,"line":3797},[1309,5082,4693],{},[1309,5084,5085],{"class":1311,"line":3803},[1309,5086,4473],{},[1309,5088,5089],{"class":1311,"line":3811},[1309,5090,5091],{},"        # Static files (if serving from nginx)\n",[1309,5093,5094],{"class":1311,"line":3819},[1309,5095,5096],{},"        location /static/ {\n",[1309,5098,5099],{"class":1311,"line":3830},[1309,5100,5101],{},"            alias /var/www/static/;\n",[1309,5103,5104],{"class":1311,"line":3838},[1309,5105,5106],{},"            expires 1y;\n",[1309,5108,5109],{"class":1311,"line":3847},[1309,5110,5111],{},"            add_header Cache-Control \"public, immutable\";\n",[1309,5113,5114],{"class":1311,"line":3855},[1309,5115,4693],{},[1309,5117,5118],{"class":1311,"line":3864},[1309,5119,4473],{},[1309,5121,5122],{"class":1311,"line":3869},[1309,5123,5124],{},"        # Media files\n",[1309,5126,5127],{"class":1311,"line":3875},[1309,5128,5129],{},"        location /media/ {\n",[1309,5131,5132],{"class":1311,"line":3883},[1309,5133,5134],{},"            alias /var/www/media/;\n",[1309,5136,5137],{"class":1311,"line":3891},[1309,5138,5139],{},"            expires 30d;\n",[1309,5141,5142],{"class":1311,"line":3901},[1309,5143,5144],{},"            add_header Cache-Control \"public\";\n",[1309,5146,5147],{"class":1311,"line":3909},[1309,5148,4693],{},[1309,5150,5151],{"class":1311,"line":3917},[1309,5152,4473],{},[1309,5154,5156],{"class":1311,"line":5155},211,[1309,5157,5158],{},"        # Default location (catch-all)\n",[1309,5160,5162],{"class":1311,"line":5161},212,[1309,5163,5164],{},"        location / {\n",[1309,5166,5168],{"class":1311,"line":5167},213,[1309,5169,5170],{},"            return 404 \"Not Found\";\n",[1309,5172,5174],{"class":1311,"line":5173},214,[1309,5175,4693],{},[1309,5177,5179],{"class":1311,"line":5178},215,[1309,5180,4517],{},[1309,5182,5184],{"class":1311,"line":5183},216,[1309,5185,4263],{},[1309,5187,5189],{"class":1311,"line":5188},217,[1309,5190,5191],{},"    # HTTPS server (production)\n",[1309,5193,5195],{"class":1311,"line":5194},218,[1309,5196,4576],{},[1309,5198,5200],{"class":1311,"line":5199},219,[1309,5201,5202],{},"        listen 443 ssl http2;\n",[1309,5204,5206],{"class":1311,"line":5205},220,[1309,5207,5208],{},"        server_name api.yourdomain.com;\n",[1309,5210,5212],{"class":1311,"line":5211},221,[1309,5213,4473],{},[1309,5215,5217],{"class":1311,"line":5216},222,[1309,5218,5219],{},"        # SSL configuration\n",[1309,5221,5223],{"class":1311,"line":5222},223,[1309,5224,5225],{},"        ssl_certificate /etc/nginx/ssl/cert.pem;\n",[1309,5227,5229],{"class":1311,"line":5228},224,[1309,5230,5231],{},"        ssl_certificate_key /etc/nginx/ssl/key.pem;\n",[1309,5233,5235],{"class":1311,"line":5234},225,[1309,5236,4473],{},[1309,5238,5240],{"class":1311,"line":5239},226,[1309,5241,5242],{},"        # SSL settings\n",[1309,5244,5246],{"class":1311,"line":5245},227,[1309,5247,5248],{},"        ssl_protocols TLSv1.2 TLSv1.3;\n",[1309,5250,5252],{"class":1311,"line":5251},228,[1309,5253,5254],{},"        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;\n",[1309,5256,5258],{"class":1311,"line":5257},229,[1309,5259,5260],{},"        ssl_prefer_server_ciphers off;\n",[1309,5262,5264],{"class":1311,"line":5263},230,[1309,5265,5266],{},"        ssl_session_cache shared:SSL:10m;\n",[1309,5268,5270],{"class":1311,"line":5269},231,[1309,5271,5272],{},"        ssl_session_timeout 10m;\n",[1309,5274,5276],{"class":1311,"line":5275},232,[1309,5277,4473],{},[1309,5279,5281],{"class":1311,"line":5280},233,[1309,5282,5283],{},"        # HSTS header\n",[1309,5285,5287],{"class":1311,"line":5286},234,[1309,5288,5289],{},"        add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n",[1309,5291,5293],{"class":1311,"line":5292},235,[1309,5294,4473],{},[1309,5296,5298],{"class":1311,"line":5297},236,[1309,5299,5300],{},"        # Include all the location blocks from the HTTP server\n",[1309,5302,5304],{"class":1311,"line":5303},237,[1309,5305,5306],{},"        include /etc/nginx/conf.d/api-locations.conf;\n",[1309,5308,5310],{"class":1311,"line":5309},238,[1309,5311,4517],{},[1309,5313,5315],{"class":1311,"line":5314},239,[1309,5316,4234],{},[1026,5318,5319],{},[1045,5320,5321],{},"Advanced Nginx Features:",[1299,5323,5325],{"className":4157,"code":5324,"language":4159,"meta":1304,"style":1304},"# nginx/conf.d/caching.conf\n# Response caching configuration\n\n# Cache zones\nproxy_cache_path /var/cache/nginx/api levels=1:2 keys_zone=api_cache:10m max_size=1g inactive=60m use_temp_path=off;\n\n# Cache configuration for different endpoints\nlocation /api/users/ {\n    # Cache GET requests for user data\n    proxy_cache api_cache;\n    proxy_cache_methods GET HEAD;\n    proxy_cache_valid 200 5m;      # Cache successful responses for 5 minutes\n    proxy_cache_valid 404 1m;      # Cache 404s for 1 minute\n    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;\n    \n    # Cache headers\n    add_header X-Cache-Status $upstream_cache_status;\n    \n    # Don't cache authenticated requests\n    proxy_cache_bypass $http_authorization;\n    proxy_no_cache $http_authorization;\n    \n    proxy_pass http://user_service;\n}\n",[1306,5326,5327,5332,5337,5341,5346,5351,5355,5360,5365,5370,5375,5380,5385,5390,5395,5399,5404,5409,5413,5418,5423,5428,5432,5437],{"__ignoreMap":1304},[1309,5328,5329],{"class":1311,"line":1312},[1309,5330,5331],{},"# nginx/conf.d/caching.conf\n",[1309,5333,5334],{"class":1311,"line":1319},[1309,5335,5336],{},"# Response caching configuration\n",[1309,5338,5339],{"class":1311,"line":1325},[1309,5340,1340],{"emptyLinePlaceholder":1339},[1309,5342,5343],{"class":1311,"line":1336},[1309,5344,5345],{},"# Cache zones\n",[1309,5347,5348],{"class":1311,"line":1343},[1309,5349,5350],{},"proxy_cache_path /var/cache/nginx/api levels=1:2 keys_zone=api_cache:10m max_size=1g inactive=60m use_temp_path=off;\n",[1309,5352,5353],{"class":1311,"line":1349},[1309,5354,1340],{"emptyLinePlaceholder":1339},[1309,5356,5357],{"class":1311,"line":1355},[1309,5358,5359],{},"# Cache configuration for different endpoints\n",[1309,5361,5362],{"class":1311,"line":1361},[1309,5363,5364],{},"location /api/users/ {\n",[1309,5366,5367],{"class":1311,"line":1370},[1309,5368,5369],{},"    # Cache GET requests for user data\n",[1309,5371,5372],{"class":1311,"line":1378},[1309,5373,5374],{},"    proxy_cache api_cache;\n",[1309,5376,5377],{"class":1311,"line":1386},[1309,5378,5379],{},"    proxy_cache_methods GET HEAD;\n",[1309,5381,5382],{"class":1311,"line":1391},[1309,5383,5384],{},"    proxy_cache_valid 200 5m;      # Cache successful responses for 5 minutes\n",[1309,5386,5387],{"class":1311,"line":1397},[1309,5388,5389],{},"    proxy_cache_valid 404 1m;      # Cache 404s for 1 minute\n",[1309,5391,5392],{"class":1311,"line":1406},[1309,5393,5394],{},"    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;\n",[1309,5396,5397],{"class":1311,"line":1411},[1309,5398,4263],{},[1309,5400,5401],{"class":1311,"line":1417},[1309,5402,5403],{},"    # Cache headers\n",[1309,5405,5406],{"class":1311,"line":1423},[1309,5407,5408],{},"    add_header X-Cache-Status $upstream_cache_status;\n",[1309,5410,5411],{"class":1311,"line":1432},[1309,5412,4263],{},[1309,5414,5415],{"class":1311,"line":1438},[1309,5416,5417],{},"    # Don't cache authenticated requests\n",[1309,5419,5420],{"class":1311,"line":1444},[1309,5421,5422],{},"    proxy_cache_bypass $http_authorization;\n",[1309,5424,5425],{"class":1311,"line":1450},[1309,5426,5427],{},"    proxy_no_cache $http_authorization;\n",[1309,5429,5430],{"class":1311,"line":1456},[1309,5431,4263],{},[1309,5433,5434],{"class":1311,"line":1462},[1309,5435,5436],{},"    proxy_pass http://user_service;\n",[1309,5438,5439],{"class":1311,"line":1468},[1309,5440,4234],{},[1299,5442,5444],{"className":4157,"code":5443,"language":4159,"meta":1304,"style":1304},"# nginx/conf.d/monitoring.conf\n# Monitoring and metrics\n\n# Status page for monitoring\nserver {\n    listen 8080;\n    server_name localhost;\n    \n    location /nginx_status {\n        stub_status on;\n        access_log off;\n        allow 127.0.0.1;\n        allow 10.0.0.0/8;\n        deny all;\n    }\n    \n    location /health {\n        access_log off;\n        return 200 \"healthy\\n\";\n        add_header Content-Type text/plain;\n    }\n}\n",[1306,5445,5446,5451,5456,5460,5465,5470,5475,5480,5484,5489,5494,5499,5504,5509,5514,5518,5522,5527,5531,5536,5541,5545],{"__ignoreMap":1304},[1309,5447,5448],{"class":1311,"line":1312},[1309,5449,5450],{},"# nginx/conf.d/monitoring.conf\n",[1309,5452,5453],{"class":1311,"line":1319},[1309,5454,5455],{},"# Monitoring and metrics\n",[1309,5457,5458],{"class":1311,"line":1325},[1309,5459,1340],{"emptyLinePlaceholder":1339},[1309,5461,5462],{"class":1311,"line":1336},[1309,5463,5464],{},"# Status page for monitoring\n",[1309,5466,5467],{"class":1311,"line":1343},[1309,5468,5469],{},"server {\n",[1309,5471,5472],{"class":1311,"line":1349},[1309,5473,5474],{},"    listen 8080;\n",[1309,5476,5477],{"class":1311,"line":1355},[1309,5478,5479],{},"    server_name localhost;\n",[1309,5481,5482],{"class":1311,"line":1361},[1309,5483,4263],{},[1309,5485,5486],{"class":1311,"line":1370},[1309,5487,5488],{},"    location /nginx_status {\n",[1309,5490,5491],{"class":1311,"line":1378},[1309,5492,5493],{},"        stub_status on;\n",[1309,5495,5496],{"class":1311,"line":1386},[1309,5497,5498],{},"        access_log off;\n",[1309,5500,5501],{"class":1311,"line":1391},[1309,5502,5503],{},"        allow 127.0.0.1;\n",[1309,5505,5506],{"class":1311,"line":1397},[1309,5507,5508],{},"        allow 10.0.0.0/8;\n",[1309,5510,5511],{"class":1311,"line":1406},[1309,5512,5513],{},"        deny all;\n",[1309,5515,5516],{"class":1311,"line":1411},[1309,5517,4517],{},[1309,5519,5520],{"class":1311,"line":1417},[1309,5521,4263],{},[1309,5523,5524],{"class":1311,"line":1423},[1309,5525,5526],{},"    location /health {\n",[1309,5528,5529],{"class":1311,"line":1432},[1309,5530,5498],{},[1309,5532,5533],{"class":1311,"line":1438},[1309,5534,5535],{},"        return 200 \"healthy\\n\";\n",[1309,5537,5538],{"class":1311,"line":1444},[1309,5539,5540],{},"        add_header Content-Type text/plain;\n",[1309,5542,5543],{"class":1311,"line":1450},[1309,5544,4517],{},[1309,5546,5547],{"class":1311,"line":1456},[1309,5548,4234],{},[1026,5550,5551],{},[1045,5552,5553],{},"Docker Compose Integration:",[1299,5555,5557],{"className":2220,"code":5556,"language":2222,"meta":1304,"style":1304},"# nginx service in docker-compose.yml\nnginx:\n  image: nginx:alpine\n  container_name: api_gateway\n  ports:\n    - \"80:80\"\n    - \"443:443\"\n    - \"8080:8080\"  # Monitoring port\n  volumes:\n    - ./nginx/nginx.conf:/etc/nginx/nginx.conf\n    - ./nginx/conf.d:/etc/nginx/conf.d\n    - ./nginx/ssl:/etc/nginx/ssl\n    - ./static:/var/www/static\n    - ./media:/var/www/media\n    - nginx_cache:/var/cache/nginx\n  depends_on:\n    - user-service\n    - order-service\n    - payment-service\n  networks:\n    - microservices_network\n  restart: unless-stopped\n  healthcheck:\n    test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:8080/health\"]\n    interval: 30s\n    timeout: 10s\n    retries: 3\n",[1306,5558,5559,5564,5570,5579,5588,5595,5606,5616,5630,5637,5643,5650,5656,5663,5670,5677,5684,5690,5696,5703,5710,5716,5725,5732,5776,5785,5794],{"__ignoreMap":1304},[1309,5560,5561],{"class":1311,"line":1312},[1309,5562,5563],{"class":1315},"# nginx service in docker-compose.yml\n",[1309,5565,5566,5568],{"class":1311,"line":1319},[1309,5567,4159],{"class":2234},[1309,5569,2261],{"class":2238},[1309,5571,5572,5575,5577],{"class":1311,"line":1325},[1309,5573,5574],{"class":2234},"  image",[1309,5576,2239],{"class":2238},[1309,5578,3679],{"class":1546},[1309,5580,5581,5584,5586],{"class":1311,"line":1336},[1309,5582,5583],{"class":2234},"  container_name",[1309,5585,2239],{"class":2238},[1309,5587,3689],{"class":1546},[1309,5589,5590,5593],{"class":1311,"line":1343},[1309,5591,5592],{"class":2234},"  ports",[1309,5594,2261],{"class":2238},[1309,5596,5597,5600,5602,5604],{"class":1311,"line":1349},[1309,5598,5599],{"class":2238},"    -",[1309,5601,2375],{"class":2242},[1309,5603,3706],{"class":1546},[1309,5605,2381],{"class":2242},[1309,5607,5608,5610,5612,5614],{"class":1311,"line":1355},[1309,5609,5599],{"class":2238},[1309,5611,2375],{"class":2242},[1309,5613,3718],{"class":1546},[1309,5615,2381],{"class":2242},[1309,5617,5618,5620,5622,5625,5627],{"class":1311,"line":1361},[1309,5619,5599],{"class":2238},[1309,5621,2375],{"class":2242},[1309,5623,5624],{"class":1546},"8080:8080",[1309,5626,2419],{"class":2242},[1309,5628,5629],{"class":1315},"  # Monitoring port\n",[1309,5631,5632,5635],{"class":1311,"line":1370},[1309,5633,5634],{"class":2234},"  volumes",[1309,5636,2261],{"class":2238},[1309,5638,5639,5641],{"class":1311,"line":1378},[1309,5640,5599],{"class":2238},[1309,5642,3735],{"class":1546},[1309,5644,5645,5647],{"class":1311,"line":1386},[1309,5646,5599],{"class":2238},[1309,5648,5649],{"class":1546}," ./nginx/conf.d:/etc/nginx/conf.d\n",[1309,5651,5652,5654],{"class":1311,"line":1391},[1309,5653,5599],{"class":2238},[1309,5655,3743],{"class":1546},[1309,5657,5658,5660],{"class":1311,"line":1397},[1309,5659,5599],{"class":2238},[1309,5661,5662],{"class":1546}," ./static:/var/www/static\n",[1309,5664,5665,5667],{"class":1311,"line":1406},[1309,5666,5599],{"class":2238},[1309,5668,5669],{"class":1546}," ./media:/var/www/media\n",[1309,5671,5672,5674],{"class":1311,"line":1411},[1309,5673,5599],{"class":2238},[1309,5675,5676],{"class":1546}," nginx_cache:/var/cache/nginx\n",[1309,5678,5679,5682],{"class":1311,"line":1417},[1309,5680,5681],{"class":2234},"  depends_on",[1309,5683,2261],{"class":2238},[1309,5685,5686,5688],{"class":1311,"line":1423},[1309,5687,5599],{"class":2238},[1309,5689,3758],{"class":1546},[1309,5691,5692,5694],{"class":1311,"line":1432},[1309,5693,5599],{"class":2238},[1309,5695,3766],{"class":1546},[1309,5697,5698,5700],{"class":1311,"line":1438},[1309,5699,5599],{"class":2238},[1309,5701,5702],{"class":1546}," payment-service\n",[1309,5704,5705,5708],{"class":1311,"line":1444},[1309,5706,5707],{"class":2234},"  networks",[1309,5709,2261],{"class":2238},[1309,5711,5712,5714],{"class":1311,"line":1450},[1309,5713,5599],{"class":2238},[1309,5715,2395],{"class":1546},[1309,5717,5718,5721,5723],{"class":1311,"line":1456},[1309,5719,5720],{"class":2234},"  restart",[1309,5722,2239],{"class":2238},[1309,5724,3081],{"class":1546},[1309,5726,5727,5730],{"class":1311,"line":1462},[1309,5728,5729],{"class":2234},"  healthcheck",[1309,5731,2261],{"class":2238},[1309,5733,5734,5737,5739,5741,5743,5745,5747,5749,5751,5754,5756,5758,5760,5763,5765,5767,5769,5772,5774],{"class":1311,"line":1468},[1309,5735,5736],{"class":2234},"    test",[1309,5738,2239],{"class":2238},[1309,5740,1666],{"class":2238},[1309,5742,2419],{"class":2242},[1309,5744,1663],{"class":1546},[1309,5746,2419],{"class":2242},[1309,5748,2427],{"class":2238},[1309,5750,2375],{"class":2242},[1309,5752,5753],{"class":1546},"curl",[1309,5755,2419],{"class":2242},[1309,5757,2427],{"class":2238},[1309,5759,2375],{"class":2242},[1309,5761,5762],{"class":1546},"-f",[1309,5764,2419],{"class":2242},[1309,5766,2427],{"class":2238},[1309,5768,2375],{"class":2242},[1309,5770,5771],{"class":1546},"http://localhost:8080/health",[1309,5773,2419],{"class":2242},[1309,5775,1698],{"class":2238},[1309,5777,5778,5781,5783],{"class":1311,"line":1473},[1309,5779,5780],{"class":2234},"    interval",[1309,5782,2239],{"class":2238},[1309,5784,2750],{"class":1546},[1309,5786,5787,5790,5792],{"class":1311,"line":1479},[1309,5788,5789],{"class":2234},"    timeout",[1309,5791,2239],{"class":2238},[1309,5793,2446],{"class":1546},[1309,5795,5796,5799,5801],{"class":1311,"line":1485},[1309,5797,5798],{"class":2234},"    retries",[1309,5800,2239],{"class":2238},[1309,5802,2767],{"class":2466},[1026,5804,5805],{},[1045,5806,5807],{},"Testing Nginx Configuration:",[1299,5809,5811],{"className":3980,"code":5810,"language":3982,"meta":1304,"style":1304},"# Test configuration syntax\ndocker exec api_gateway nginx -t\n\n# Reload configuration without downtime\ndocker exec api_gateway nginx -s reload\n\n# View access logs\ndocker logs api_gateway -f\n\n# Test endpoints\ncurl -H \"Host: api.yourdomain.com\" http://localhost/api/users/\ncurl -H \"Host: api.yourdomain.com\" http://localhost/health\n",[1306,5812,5813,5818,5835,5839,5844,5860,5864,5869,5880,5884,5889,5906],{"__ignoreMap":1304},[1309,5814,5815],{"class":1311,"line":1312},[1309,5816,5817],{"class":1315},"# Test configuration syntax\n",[1309,5819,5820,5823,5826,5829,5832],{"class":1311,"line":1319},[1309,5821,5822],{"class":3994},"docker",[1309,5824,5825],{"class":1546}," exec",[1309,5827,5828],{"class":1546}," api_gateway",[1309,5830,5831],{"class":1546}," nginx",[1309,5833,5834],{"class":4001}," -t\n",[1309,5836,5837],{"class":1311,"line":1325},[1309,5838,1340],{"emptyLinePlaceholder":1339},[1309,5840,5841],{"class":1311,"line":1336},[1309,5842,5843],{"class":1315},"# Reload configuration without downtime\n",[1309,5845,5846,5848,5850,5852,5854,5857],{"class":1311,"line":1343},[1309,5847,5822],{"class":3994},[1309,5849,5825],{"class":1546},[1309,5851,5828],{"class":1546},[1309,5853,5831],{"class":1546},[1309,5855,5856],{"class":4001}," -s",[1309,5858,5859],{"class":1546}," reload\n",[1309,5861,5862],{"class":1311,"line":1349},[1309,5863,1340],{"emptyLinePlaceholder":1339},[1309,5865,5866],{"class":1311,"line":1355},[1309,5867,5868],{"class":1315},"# View access logs\n",[1309,5870,5871,5873,5875,5877],{"class":1311,"line":1361},[1309,5872,5822],{"class":3994},[1309,5874,4018],{"class":1546},[1309,5876,5828],{"class":1546},[1309,5878,5879],{"class":4001}," -f\n",[1309,5881,5882],{"class":1311,"line":1370},[1309,5883,1340],{"emptyLinePlaceholder":1339},[1309,5885,5886],{"class":1311,"line":1378},[1309,5887,5888],{"class":1315},"# Test endpoints\n",[1309,5890,5891,5893,5896,5898,5901,5903],{"class":1311,"line":1386},[1309,5892,5753],{"class":3994},[1309,5894,5895],{"class":4001}," -H",[1309,5897,2375],{"class":2242},[1309,5899,5900],{"class":1546},"Host: api.yourdomain.com",[1309,5902,2419],{"class":2242},[1309,5904,5905],{"class":1546}," http://localhost/api/users/\n",[1309,5907,5908,5910,5912,5914,5916,5918],{"class":1311,"line":1391},[1309,5909,5753],{"class":3994},[1309,5911,5895],{"class":4001},[1309,5913,2375],{"class":2242},[1309,5915,5900],{"class":1546},[1309,5917,2419],{"class":2242},[1309,5919,5920],{"class":1546}," http://localhost/health\n",[1026,5922,5923],{},"This Nginx configuration provides a production-ready API gateway with load balancing, caching, security headers, rate limiting, and monitoring capabilities.",[1030,5925,5927],{"id":5926},"kubernetes-deployment","Kubernetes Deployment",[1026,5929,5930],{},"Kubernetes (K8s) is a container orchestration platform that automates the deployment, scaling, and management of containerized applications. Think of Kubernetes as a sophisticated autopilot for your microservices - it ensures they're running, healthy, and can scale automatically based on demand.",[1038,5932,5934],{"id":5933},"understanding-kubernetes-concepts","Understanding Kubernetes Concepts",[1026,5936,5937],{},"Before diving into deployment, let's understand key Kubernetes concepts:",[1026,5939,5940],{},[1045,5941,5942],{},"Core Components:",[1101,5944,5945,5951,5956,5962,5968,5974,5980],{},[1052,5946,5947,5950],{},[1045,5948,5949],{},"Pod",": The smallest deployable unit (usually contains one container)",[1052,5952,5953,5955],{},[1045,5954,737],{},": Manages multiple replicas of your application",[1052,5957,5958,5961],{},[1045,5959,5960],{},"Service",": Provides stable networking for pods",[1052,5963,5964,5967],{},[1045,5965,5966],{},"ConfigMap",": Stores configuration data",[1052,5969,5970,5973],{},[1045,5971,5972],{},"Secret",": Stores sensitive data like passwords",[1052,5975,5976,5979],{},[1045,5977,5978],{},"Namespace",": Isolates resources within a cluster",[1052,5981,5982,5985],{},[1045,5983,5984],{},"Ingress",": Manages external access to services",[1026,5987,5988],{},[1045,5989,5990],{},"Why Kubernetes for Microservices:",[1101,5992,5993,5999,6005,6011,6017,6023],{},[1052,5994,5995,5998],{},[1045,5996,5997],{},"Auto-scaling",": Automatically scale services based on CPU/memory usage",[1052,6000,6001,6004],{},[1045,6002,6003],{},"Self-healing",": Restart failed containers automatically",[1052,6006,6007,6010],{},[1045,6008,6009],{},"Load balancing",": Distribute traffic across multiple instances",[1052,6012,6013,6016],{},[1045,6014,6015],{},"Rolling updates",": Deploy new versions without downtime",[1052,6018,6019,6022],{},[1045,6020,6021],{},"Service discovery",": Services can find each other automatically",[1052,6024,6025,6028],{},[1045,6026,6027],{},"Resource management",": Efficiently use cluster resources",[1038,6030,6032],{"id":6031},"namespace-and-configmap","Namespace and ConfigMap",[1026,6034,6035],{},"Namespaces provide isolation between different environments or teams. ConfigMaps store non-sensitive configuration data that can be shared across services.",[1299,6037,6039],{"className":2220,"code":6038,"language":2222,"meta":1304,"style":1304},"# k8s/namespace.yaml\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: microservices\n  labels:\n    name: microservices\n    environment: production\n\n---\n# k8s/configmap.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: microservices-config\n  namespace: microservices\n  labels:\n    app: microservices\ndata:\n  # Database configuration\n  POSTGRES_DB: \"microservices_db\"\n  POSTGRES_USER: \"postgres\"\n  \n  # Cache configuration\n  REDIS_URL: \"redis://redis-service:6379/0\"\n  \n  # Message queue configuration\n  CELERY_BROKER_URL: \"amqp://admin:password123@rabbitmq-service:5672//\"\n  \n  # Service URLs for inter-service communication\n  USER_SERVICE_URL: \"http://user-service:8000\"\n  ORDER_SERVICE_URL: \"http://order-service:8000\"\n  PAYMENT_SERVICE_URL: \"http://payment-service:8000\"\n  \n  # Django settings\n  DJANGO_SETTINGS_MODULE: \"user_service.settings.production\"\n  DEBUG: \"False\"\n  \n  # Logging configuration\n  LOG_LEVEL: \"INFO\"\n  \n  # Feature flags\n  ENABLE_CACHING: \"true\"\n  ENABLE_METRICS: \"true\"\n",[1306,6040,6041,6046,6056,6066,6073,6083,6090,6099,6108,6112,6117,6122,6130,6139,6145,6154,6163,6169,6178,6185,6190,6204,6218,6223,6228,6242,6246,6251,6265,6269,6274,6288,6302,6316,6320,6325,6339,6353,6357,6362,6376,6380,6385,6399],{"__ignoreMap":1304},[1309,6042,6043],{"class":1311,"line":1312},[1309,6044,6045],{"class":1315},"# k8s/namespace.yaml\n",[1309,6047,6048,6051,6053],{"class":1311,"line":1319},[1309,6049,6050],{"class":2234},"apiVersion",[1309,6052,2239],{"class":2238},[1309,6054,6055],{"class":1546}," v1\n",[1309,6057,6058,6061,6063],{"class":1311,"line":1325},[1309,6059,6060],{"class":2234},"kind",[1309,6062,2239],{"class":2238},[1309,6064,6065],{"class":1546}," Namespace\n",[1309,6067,6068,6071],{"class":1311,"line":1336},[1309,6069,6070],{"class":2234},"metadata",[1309,6072,2261],{"class":2238},[1309,6074,6075,6078,6080],{"class":1311,"line":1343},[1309,6076,6077],{"class":2234},"  name",[1309,6079,2239],{"class":2238},[1309,6081,6082],{"class":1546}," microservices\n",[1309,6084,6085,6088],{"class":1311,"line":1349},[1309,6086,6087],{"class":2234},"  labels",[1309,6089,2261],{"class":2238},[1309,6091,6092,6095,6097],{"class":1311,"line":1355},[1309,6093,6094],{"class":2234},"    name",[1309,6096,2239],{"class":2238},[1309,6098,6082],{"class":1546},[1309,6100,6101,6103,6105],{"class":1311,"line":1361},[1309,6102,2298],{"class":2234},[1309,6104,2239],{"class":2238},[1309,6106,6107],{"class":1546}," production\n",[1309,6109,6110],{"class":1311,"line":1370},[1309,6111,1340],{"emptyLinePlaceholder":1339},[1309,6113,6114],{"class":1311,"line":1378},[1309,6115,6116],{"class":3994},"---\n",[1309,6118,6119],{"class":1311,"line":1386},[1309,6120,6121],{"class":1315},"# k8s/configmap.yaml\n",[1309,6123,6124,6126,6128],{"class":1311,"line":1391},[1309,6125,6050],{"class":2234},[1309,6127,2239],{"class":2238},[1309,6129,6055],{"class":1546},[1309,6131,6132,6134,6136],{"class":1311,"line":1397},[1309,6133,6060],{"class":2234},[1309,6135,2239],{"class":2238},[1309,6137,6138],{"class":1546}," ConfigMap\n",[1309,6140,6141,6143],{"class":1311,"line":1406},[1309,6142,6070],{"class":2234},[1309,6144,2261],{"class":2238},[1309,6146,6147,6149,6151],{"class":1311,"line":1411},[1309,6148,6077],{"class":2234},[1309,6150,2239],{"class":2238},[1309,6152,6153],{"class":1546}," microservices-config\n",[1309,6155,6156,6159,6161],{"class":1311,"line":1417},[1309,6157,6158],{"class":2234},"  namespace",[1309,6160,2239],{"class":2238},[1309,6162,6082],{"class":1546},[1309,6164,6165,6167],{"class":1311,"line":1423},[1309,6166,6087],{"class":2234},[1309,6168,2261],{"class":2238},[1309,6170,6171,6174,6176],{"class":1311,"line":1432},[1309,6172,6173],{"class":2234},"    app",[1309,6175,2239],{"class":2238},[1309,6177,6082],{"class":1546},[1309,6179,6180,6183],{"class":1311,"line":1438},[1309,6181,6182],{"class":2234},"data",[1309,6184,2261],{"class":2238},[1309,6186,6187],{"class":1311,"line":1444},[1309,6188,6189],{"class":1315},"  # Database configuration\n",[1309,6191,6192,6195,6197,6199,6202],{"class":1311,"line":1450},[1309,6193,6194],{"class":2234},"  POSTGRES_DB",[1309,6196,2239],{"class":2238},[1309,6198,2375],{"class":2242},[1309,6200,6201],{"class":1546},"microservices_db",[1309,6203,2381],{"class":2242},[1309,6205,6206,6209,6211,6213,6216],{"class":1311,"line":1456},[1309,6207,6208],{"class":2234},"  POSTGRES_USER",[1309,6210,2239],{"class":2238},[1309,6212,2375],{"class":2242},[1309,6214,6215],{"class":1546},"postgres",[1309,6217,2381],{"class":2242},[1309,6219,6220],{"class":1311,"line":1462},[1309,6221,6222],{"class":1332},"  \n",[1309,6224,6225],{"class":1311,"line":1468},[1309,6226,6227],{"class":1315},"  # Cache configuration\n",[1309,6229,6230,6233,6235,6237,6240],{"class":1311,"line":1473},[1309,6231,6232],{"class":2234},"  REDIS_URL",[1309,6234,2239],{"class":2238},[1309,6236,2375],{"class":2242},[1309,6238,6239],{"class":1546},"redis://redis-service:6379/0",[1309,6241,2381],{"class":2242},[1309,6243,6244],{"class":1311,"line":1479},[1309,6245,6222],{"class":1332},[1309,6247,6248],{"class":1311,"line":1485},[1309,6249,6250],{"class":1315},"  # Message queue configuration\n",[1309,6252,6253,6256,6258,6260,6263],{"class":1311,"line":1494},[1309,6254,6255],{"class":2234},"  CELERY_BROKER_URL",[1309,6257,2239],{"class":2238},[1309,6259,2375],{"class":2242},[1309,6261,6262],{"class":1546},"amqp://admin:password123@rabbitmq-service:5672//",[1309,6264,2381],{"class":2242},[1309,6266,6267],{"class":1311,"line":1502},[1309,6268,6222],{"class":1332},[1309,6270,6271],{"class":1311,"line":1507},[1309,6272,6273],{"class":1315},"  # Service URLs for inter-service communication\n",[1309,6275,6276,6279,6281,6283,6286],{"class":1311,"line":1513},[1309,6277,6278],{"class":2234},"  USER_SERVICE_URL",[1309,6280,2239],{"class":2238},[1309,6282,2375],{"class":2242},[1309,6284,6285],{"class":1546},"http://user-service:8000",[1309,6287,2381],{"class":2242},[1309,6289,6290,6293,6295,6297,6300],{"class":1311,"line":1521},[1309,6291,6292],{"class":2234},"  ORDER_SERVICE_URL",[1309,6294,2239],{"class":2238},[1309,6296,2375],{"class":2242},[1309,6298,6299],{"class":1546},"http://order-service:8000",[1309,6301,2381],{"class":2242},[1309,6303,6304,6307,6309,6311,6314],{"class":1311,"line":1526},[1309,6305,6306],{"class":2234},"  PAYMENT_SERVICE_URL",[1309,6308,2239],{"class":2238},[1309,6310,2375],{"class":2242},[1309,6312,6313],{"class":1546},"http://payment-service:8000",[1309,6315,2381],{"class":2242},[1309,6317,6318],{"class":1311,"line":1532},[1309,6319,6222],{"class":1332},[1309,6321,6322],{"class":1311,"line":1538},[1309,6323,6324],{"class":1315},"  # Django settings\n",[1309,6326,6327,6330,6332,6334,6337],{"class":1311,"line":1553},[1309,6328,6329],{"class":2234},"  DJANGO_SETTINGS_MODULE",[1309,6331,2239],{"class":2238},[1309,6333,2375],{"class":2242},[1309,6335,6336],{"class":1546},"user_service.settings.production",[1309,6338,2381],{"class":2242},[1309,6340,6341,6344,6346,6348,6351],{"class":1311,"line":1561},[1309,6342,6343],{"class":2234},"  DEBUG",[1309,6345,2239],{"class":2238},[1309,6347,2375],{"class":2242},[1309,6349,6350],{"class":1546},"False",[1309,6352,2381],{"class":2242},[1309,6354,6355],{"class":1311,"line":1569},[1309,6356,6222],{"class":1332},[1309,6358,6359],{"class":1311,"line":1574},[1309,6360,6361],{"class":1315},"  # Logging configuration\n",[1309,6363,6364,6367,6369,6371,6374],{"class":1311,"line":1580},[1309,6365,6366],{"class":2234},"  LOG_LEVEL",[1309,6368,2239],{"class":2238},[1309,6370,2375],{"class":2242},[1309,6372,6373],{"class":1546},"INFO",[1309,6375,2381],{"class":2242},[1309,6377,6378],{"class":1311,"line":1586},[1309,6379,6222],{"class":1332},[1309,6381,6382],{"class":1311,"line":1594},[1309,6383,6384],{"class":1315},"  # Feature flags\n",[1309,6386,6387,6390,6392,6394,6397],{"class":1311,"line":1599},[1309,6388,6389],{"class":2234},"  ENABLE_CACHING",[1309,6391,2239],{"class":2238},[1309,6393,2375],{"class":2242},[1309,6395,6396],{"class":1546},"true",[1309,6398,2381],{"class":2242},[1309,6400,6401,6404,6406,6408,6410],{"class":1311,"line":1605},[1309,6402,6403],{"class":2234},"  ENABLE_METRICS",[1309,6405,2239],{"class":2238},[1309,6407,2375],{"class":2242},[1309,6409,6396],{"class":1546},[1309,6411,2381],{"class":2242},[1026,6413,6414],{},[1045,6415,6416],{},"ConfigMap Usage Explained:",[1101,6418,6419,6424,6430,6435],{},[1052,6420,6421,6423],{},[1045,6422,1720],{},": These values become environment variables in your containers",[1052,6425,6426,6429],{},[1045,6427,6428],{},"Service Discovery",": Services use these URLs to communicate with each other",[1052,6431,6432,6434],{},[1045,6433,1068],{},": Change config without rebuilding containers",[1052,6436,6437,6440],{},[1045,6438,6439],{},"Environment Consistency",": Same config structure across dev/staging/prod",[1038,6442,6444],{"id":6443},"secrets-management","Secrets Management",[1026,6446,6447],{},"Secrets store sensitive information like passwords, API keys, and certificates. Unlike ConfigMaps, Secrets are base64 encoded and can be encrypted at rest.",[1299,6449,6451],{"className":2220,"code":6450,"language":2222,"meta":1304,"style":1304},"# k8s/secrets.yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: microservices-secrets\n  namespace: microservices\n  labels:\n    app: microservices\ntype: Opaque\ndata:\n  # Database password (base64 encoded)\n  POSTGRES_PASSWORD: cG9zdGdyZXM=  # 'postgres' in base64\n  \n  # Django secret key (base64 encoded)\n  DJANGO_SECRET_KEY: eW91ci1zZWNyZXQta2V5LWhlcmU=  # your-secret-key-here\n  \n  # RabbitMQ password (base64 encoded)\n  RABBITMQ_PASSWORD: cGFzc3dvcmQxMjM=  # 'password123' in base64\n  \n  # JWT signing key\n  JWT_SECRET_KEY: and0LXNpZ25pbmcta2V5LWZvci1qd3Q=  # jwt-signing-key-for-jwt\n  \n  # External API keys\n  STRIPE_SECRET_KEY: c2tfbGl2ZV95b3VyX3N0cmlwZV9zZWNyZXRfa2V5  # sk_live_your_stripe_secret_key\n  SENDGRID_API_KEY: U0cuWW91clNlbmRHcmlkQVBJS2V5SGVyZQ==  # SG.YourSendGridAPIKeyHere\n\n---\n# Alternative: Using stringData (automatically base64 encoded)\napiVersion: v1\nkind: Secret\nmetadata:\n  name: microservices-secrets-alt\n  namespace: microservices\ntype: Opaque\nstringData:  # Kubernetes will automatically base64 encode these\n  POSTGRES_PASSWORD: \"postgres\"\n  DJANGO_SECRET_KEY: \"your-secret-key-here\"\n  RABBITMQ_PASSWORD: \"password123\"\n  JWT_SECRET_KEY: \"jwt-signing-key-for-jwt\"\n",[1306,6452,6453,6458,6466,6475,6481,6490,6498,6504,6512,6522,6528,6533,6546,6550,6555,6568,6572,6577,6590,6594,6599,6612,6616,6621,6634,6647,6651,6655,6660,6668,6676,6682,6691,6699,6707,6717,6729,6742,6755],{"__ignoreMap":1304},[1309,6454,6455],{"class":1311,"line":1312},[1309,6456,6457],{"class":1315},"# k8s/secrets.yaml\n",[1309,6459,6460,6462,6464],{"class":1311,"line":1319},[1309,6461,6050],{"class":2234},[1309,6463,2239],{"class":2238},[1309,6465,6055],{"class":1546},[1309,6467,6468,6470,6472],{"class":1311,"line":1325},[1309,6469,6060],{"class":2234},[1309,6471,2239],{"class":2238},[1309,6473,6474],{"class":1546}," Secret\n",[1309,6476,6477,6479],{"class":1311,"line":1336},[1309,6478,6070],{"class":2234},[1309,6480,2261],{"class":2238},[1309,6482,6483,6485,6487],{"class":1311,"line":1343},[1309,6484,6077],{"class":2234},[1309,6486,2239],{"class":2238},[1309,6488,6489],{"class":1546}," microservices-secrets\n",[1309,6491,6492,6494,6496],{"class":1311,"line":1349},[1309,6493,6158],{"class":2234},[1309,6495,2239],{"class":2238},[1309,6497,6082],{"class":1546},[1309,6499,6500,6502],{"class":1311,"line":1355},[1309,6501,6087],{"class":2234},[1309,6503,2261],{"class":2238},[1309,6505,6506,6508,6510],{"class":1311,"line":1361},[1309,6507,6173],{"class":2234},[1309,6509,2239],{"class":2238},[1309,6511,6082],{"class":1546},[1309,6513,6514,6517,6519],{"class":1311,"line":1370},[1309,6515,6516],{"class":2234},"type",[1309,6518,2239],{"class":2238},[1309,6520,6521],{"class":1546}," Opaque\n",[1309,6523,6524,6526],{"class":1311,"line":1378},[1309,6525,6182],{"class":2234},[1309,6527,2261],{"class":2238},[1309,6529,6530],{"class":1311,"line":1386},[1309,6531,6532],{"class":1315},"  # Database password (base64 encoded)\n",[1309,6534,6535,6538,6540,6543],{"class":1311,"line":1391},[1309,6536,6537],{"class":2234},"  POSTGRES_PASSWORD",[1309,6539,2239],{"class":2238},[1309,6541,6542],{"class":1546}," cG9zdGdyZXM=",[1309,6544,6545],{"class":1315},"  # 'postgres' in base64\n",[1309,6547,6548],{"class":1311,"line":1397},[1309,6549,6222],{"class":1332},[1309,6551,6552],{"class":1311,"line":1406},[1309,6553,6554],{"class":1315},"  # Django secret key (base64 encoded)\n",[1309,6556,6557,6560,6562,6565],{"class":1311,"line":1411},[1309,6558,6559],{"class":2234},"  DJANGO_SECRET_KEY",[1309,6561,2239],{"class":2238},[1309,6563,6564],{"class":1546}," eW91ci1zZWNyZXQta2V5LWhlcmU=",[1309,6566,6567],{"class":1315},"  # your-secret-key-here\n",[1309,6569,6570],{"class":1311,"line":1417},[1309,6571,6222],{"class":1332},[1309,6573,6574],{"class":1311,"line":1423},[1309,6575,6576],{"class":1315},"  # RabbitMQ password (base64 encoded)\n",[1309,6578,6579,6582,6584,6587],{"class":1311,"line":1432},[1309,6580,6581],{"class":2234},"  RABBITMQ_PASSWORD",[1309,6583,2239],{"class":2238},[1309,6585,6586],{"class":1546}," cGFzc3dvcmQxMjM=",[1309,6588,6589],{"class":1315},"  # 'password123' in base64\n",[1309,6591,6592],{"class":1311,"line":1438},[1309,6593,6222],{"class":1332},[1309,6595,6596],{"class":1311,"line":1444},[1309,6597,6598],{"class":1315},"  # JWT signing key\n",[1309,6600,6601,6604,6606,6609],{"class":1311,"line":1450},[1309,6602,6603],{"class":2234},"  JWT_SECRET_KEY",[1309,6605,2239],{"class":2238},[1309,6607,6608],{"class":1546}," and0LXNpZ25pbmcta2V5LWZvci1qd3Q=",[1309,6610,6611],{"class":1315},"  # jwt-signing-key-for-jwt\n",[1309,6613,6614],{"class":1311,"line":1456},[1309,6615,6222],{"class":1332},[1309,6617,6618],{"class":1311,"line":1462},[1309,6619,6620],{"class":1315},"  # External API keys\n",[1309,6622,6623,6626,6628,6631],{"class":1311,"line":1468},[1309,6624,6625],{"class":2234},"  STRIPE_SECRET_KEY",[1309,6627,2239],{"class":2238},[1309,6629,6630],{"class":1546}," c2tfbGl2ZV95b3VyX3N0cmlwZV9zZWNyZXRfa2V5",[1309,6632,6633],{"class":1315},"  # sk_live_your_stripe_secret_key\n",[1309,6635,6636,6639,6641,6644],{"class":1311,"line":1473},[1309,6637,6638],{"class":2234},"  SENDGRID_API_KEY",[1309,6640,2239],{"class":2238},[1309,6642,6643],{"class":1546}," U0cuWW91clNlbmRHcmlkQVBJS2V5SGVyZQ==",[1309,6645,6646],{"class":1315},"  # SG.YourSendGridAPIKeyHere\n",[1309,6648,6649],{"class":1311,"line":1479},[1309,6650,1340],{"emptyLinePlaceholder":1339},[1309,6652,6653],{"class":1311,"line":1485},[1309,6654,6116],{"class":3994},[1309,6656,6657],{"class":1311,"line":1494},[1309,6658,6659],{"class":1315},"# Alternative: Using stringData (automatically base64 encoded)\n",[1309,6661,6662,6664,6666],{"class":1311,"line":1502},[1309,6663,6050],{"class":2234},[1309,6665,2239],{"class":2238},[1309,6667,6055],{"class":1546},[1309,6669,6670,6672,6674],{"class":1311,"line":1507},[1309,6671,6060],{"class":2234},[1309,6673,2239],{"class":2238},[1309,6675,6474],{"class":1546},[1309,6677,6678,6680],{"class":1311,"line":1513},[1309,6679,6070],{"class":2234},[1309,6681,2261],{"class":2238},[1309,6683,6684,6686,6688],{"class":1311,"line":1521},[1309,6685,6077],{"class":2234},[1309,6687,2239],{"class":2238},[1309,6689,6690],{"class":1546}," microservices-secrets-alt\n",[1309,6692,6693,6695,6697],{"class":1311,"line":1526},[1309,6694,6158],{"class":2234},[1309,6696,2239],{"class":2238},[1309,6698,6082],{"class":1546},[1309,6700,6701,6703,6705],{"class":1311,"line":1532},[1309,6702,6516],{"class":2234},[1309,6704,2239],{"class":2238},[1309,6706,6521],{"class":1546},[1309,6708,6709,6712,6714],{"class":1311,"line":1538},[1309,6710,6711],{"class":2234},"stringData",[1309,6713,2239],{"class":2238},[1309,6715,6716],{"class":1315},"  # Kubernetes will automatically base64 encode these\n",[1309,6718,6719,6721,6723,6725,6727],{"class":1311,"line":1553},[1309,6720,6537],{"class":2234},[1309,6722,2239],{"class":2238},[1309,6724,2375],{"class":2242},[1309,6726,6215],{"class":1546},[1309,6728,2381],{"class":2242},[1309,6730,6731,6733,6735,6737,6740],{"class":1311,"line":1561},[1309,6732,6559],{"class":2234},[1309,6734,2239],{"class":2238},[1309,6736,2375],{"class":2242},[1309,6738,6739],{"class":1546},"your-secret-key-here",[1309,6741,2381],{"class":2242},[1309,6743,6744,6746,6748,6750,6753],{"class":1311,"line":1569},[1309,6745,6581],{"class":2234},[1309,6747,2239],{"class":2238},[1309,6749,2375],{"class":2242},[1309,6751,6752],{"class":1546},"password123",[1309,6754,2381],{"class":2242},[1309,6756,6757,6759,6761,6763,6766],{"class":1311,"line":1574},[1309,6758,6603],{"class":2234},[1309,6760,2239],{"class":2238},[1309,6762,2375],{"class":2242},[1309,6764,6765],{"class":1546},"jwt-signing-key-for-jwt",[1309,6767,2381],{"class":2242},[1026,6769,6770],{},[1045,6771,6772],{},"Creating Secrets from Command Line:",[1299,6774,6776],{"className":3980,"code":6775,"language":3982,"meta":1304,"style":1304},"# Create secret from literal values\nkubectl create secret generic microservices-secrets \\\n  --from-literal=POSTGRES_PASSWORD=postgres \\\n  --from-literal=DJANGO_SECRET_KEY=your-secret-key-here \\\n  --namespace=microservices\n\n# Create secret from files\nkubectl create secret generic ssl-certs \\\n  --from-file=tls.crt=path/to/cert.crt \\\n  --from-file=tls.key=path/to/cert.key \\\n  --namespace=microservices\n\n# Create secret for Docker registry authentication\nkubectl create secret docker-registry regcred \\\n  --docker-server=your-registry.com \\\n  --docker-username=your-username \\\n  --docker-password=your-password \\\n  --docker-email=your-email@example.com \\\n  --namespace=microservices\n",[1306,6777,6778,6783,6804,6811,6818,6823,6827,6832,6847,6854,6861,6865,6869,6874,6890,6897,6904,6911,6918],{"__ignoreMap":1304},[1309,6779,6780],{"class":1311,"line":1312},[1309,6781,6782],{"class":1315},"# Create secret from literal values\n",[1309,6784,6785,6788,6791,6794,6797,6800],{"class":1311,"line":1319},[1309,6786,6787],{"class":3994},"kubectl",[1309,6789,6790],{"class":1546}," create",[1309,6792,6793],{"class":1546}," secret",[1309,6795,6796],{"class":1546}," generic",[1309,6798,6799],{"class":1546}," microservices-secrets",[1309,6801,6803],{"class":6802},"se3Ec"," \\\n",[1309,6805,6806,6809],{"class":1311,"line":1325},[1309,6807,6808],{"class":4001},"  --from-literal=POSTGRES_PASSWORD=postgres",[1309,6810,6803],{"class":6802},[1309,6812,6813,6816],{"class":1311,"line":1336},[1309,6814,6815],{"class":4001},"  --from-literal=DJANGO_SECRET_KEY=your-secret-key-here",[1309,6817,6803],{"class":6802},[1309,6819,6820],{"class":1311,"line":1343},[1309,6821,6822],{"class":4001},"  --namespace=microservices\n",[1309,6824,6825],{"class":1311,"line":1349},[1309,6826,1340],{"emptyLinePlaceholder":1339},[1309,6828,6829],{"class":1311,"line":1355},[1309,6830,6831],{"class":1315},"# Create secret from files\n",[1309,6833,6834,6836,6838,6840,6842,6845],{"class":1311,"line":1361},[1309,6835,6787],{"class":3994},[1309,6837,6790],{"class":1546},[1309,6839,6793],{"class":1546},[1309,6841,6796],{"class":1546},[1309,6843,6844],{"class":1546}," ssl-certs",[1309,6846,6803],{"class":6802},[1309,6848,6849,6852],{"class":1311,"line":1370},[1309,6850,6851],{"class":4001},"  --from-file=tls.crt=path/to/cert.crt",[1309,6853,6803],{"class":6802},[1309,6855,6856,6859],{"class":1311,"line":1378},[1309,6857,6858],{"class":4001},"  --from-file=tls.key=path/to/cert.key",[1309,6860,6803],{"class":6802},[1309,6862,6863],{"class":1311,"line":1386},[1309,6864,6822],{"class":4001},[1309,6866,6867],{"class":1311,"line":1391},[1309,6868,1340],{"emptyLinePlaceholder":1339},[1309,6870,6871],{"class":1311,"line":1397},[1309,6872,6873],{"class":1315},"# Create secret for Docker registry authentication\n",[1309,6875,6876,6878,6880,6882,6885,6888],{"class":1311,"line":1406},[1309,6877,6787],{"class":3994},[1309,6879,6790],{"class":1546},[1309,6881,6793],{"class":1546},[1309,6883,6884],{"class":1546}," docker-registry",[1309,6886,6887],{"class":1546}," regcred",[1309,6889,6803],{"class":6802},[1309,6891,6892,6895],{"class":1311,"line":1411},[1309,6893,6894],{"class":4001},"  --docker-server=your-registry.com",[1309,6896,6803],{"class":6802},[1309,6898,6899,6902],{"class":1311,"line":1417},[1309,6900,6901],{"class":4001},"  --docker-username=your-username",[1309,6903,6803],{"class":6802},[1309,6905,6906,6909],{"class":1311,"line":1423},[1309,6907,6908],{"class":4001},"  --docker-password=your-password",[1309,6910,6803],{"class":6802},[1309,6912,6913,6916],{"class":1311,"line":1432},[1309,6914,6915],{"class":4001},"  --docker-email=your-email@example.com",[1309,6917,6803],{"class":6802},[1309,6919,6920],{"class":1311,"line":1438},[1309,6921,6822],{"class":4001},[1026,6923,6924],{},[1045,6925,6926],{},"Security Best Practices for Secrets:",[1049,6928,6929,6934,6940,6945,6951],{},[1052,6930,6931],{},[1045,6932,6933],{},"Never commit secrets to version control",[1052,6935,6936,6939],{},[1045,6937,6938],{},"Use external secret management"," (AWS Secrets Manager, HashiCorp Vault)",[1052,6941,6942],{},[1045,6943,6944],{},"Rotate secrets regularly",[1052,6946,6947,6950],{},[1045,6948,6949],{},"Limit access"," using RBAC (Role-Based Access Control)",[1052,6952,6953,6956],{},[1045,6954,6955],{},"Enable encryption at rest"," in etcd",[1038,6958,6960],{"id":6959},"database-deployment","Database Deployment",[1299,6962,6964],{"className":2220,"code":6963,"language":2222,"meta":1304,"style":1304},"# k8s/postgres.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: postgres\n  namespace: microservices\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: postgres\n  template:\n    metadata:\n      labels:\n        app: postgres\n    spec:\n      containers:\n      - name: postgres\n        image: postgres:13\n        ports:\n        - containerPort: 5432\n        env:\n        - name: POSTGRES_DB\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: POSTGRES_DB\n        - name: POSTGRES_USER\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: POSTGRES_USER\n        - name: POSTGRES_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: microservices-secrets\n              key: POSTGRES_PASSWORD\n        volumeMounts:\n        - name: postgres-storage\n          mountPath: /var/lib/postgresql/data\n        resources:\n          requests:\n            memory: \"256Mi\"\n            cpu: \"250m\"\n          limits:\n            memory: \"512Mi\"\n            cpu: \"500m\"\n      volumes:\n      - name: postgres-storage\n        persistentVolumeClaim:\n          claimName: postgres-pvc\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: postgres-service\n  namespace: microservices\nspec:\n  selector:\n    app: postgres\n  ports:\n  - port: 5432\n    targetPort: 5432\n  type: ClusterIP\n\n---\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: postgres-pvc\n  namespace: microservices\nspec:\n  accessModes:\n    - ReadWriteOnce\n  resources:\n    requests:\n      storage: 10Gi\n",[1306,6965,6966,6971,6980,6989,6995,7003,7011,7018,7028,7035,7042,7051,7058,7065,7072,7081,7088,7095,7106,7115,7122,7134,7141,7152,7159,7166,7175,7184,7195,7201,7207,7215,7223,7234,7240,7247,7255,7263,7270,7281,7291,7298,7305,7319,7333,7340,7353,7366,7373,7383,7390,7400,7404,7408,7416,7425,7431,7440,7448,7454,7460,7468,7474,7486,7495,7505,7509,7513,7521,7530,7536,7544,7552,7558,7565,7572,7579,7586],{"__ignoreMap":1304},[1309,6967,6968],{"class":1311,"line":1312},[1309,6969,6970],{"class":1315},"# k8s/postgres.yaml\n",[1309,6972,6973,6975,6977],{"class":1311,"line":1319},[1309,6974,6050],{"class":2234},[1309,6976,2239],{"class":2238},[1309,6978,6979],{"class":1546}," apps/v1\n",[1309,6981,6982,6984,6986],{"class":1311,"line":1325},[1309,6983,6060],{"class":2234},[1309,6985,2239],{"class":2238},[1309,6987,6988],{"class":1546}," Deployment\n",[1309,6990,6991,6993],{"class":1311,"line":1336},[1309,6992,6070],{"class":2234},[1309,6994,2261],{"class":2238},[1309,6996,6997,6999,7001],{"class":1311,"line":1343},[1309,6998,6077],{"class":2234},[1309,7000,2239],{"class":2238},[1309,7002,2320],{"class":1546},[1309,7004,7005,7007,7009],{"class":1311,"line":1349},[1309,7006,6158],{"class":2234},[1309,7008,2239],{"class":2238},[1309,7010,6082],{"class":1546},[1309,7012,7013,7016],{"class":1311,"line":1355},[1309,7014,7015],{"class":2234},"spec",[1309,7017,2261],{"class":2238},[1309,7019,7020,7023,7025],{"class":1311,"line":1361},[1309,7021,7022],{"class":2234},"  replicas",[1309,7024,2239],{"class":2238},[1309,7026,7027],{"class":2466}," 1\n",[1309,7029,7030,7033],{"class":1311,"line":1370},[1309,7031,7032],{"class":2234},"  selector",[1309,7034,2261],{"class":2238},[1309,7036,7037,7040],{"class":1311,"line":1378},[1309,7038,7039],{"class":2234},"    matchLabels",[1309,7041,2261],{"class":2238},[1309,7043,7044,7047,7049],{"class":1311,"line":1386},[1309,7045,7046],{"class":2234},"      app",[1309,7048,2239],{"class":2238},[1309,7050,2320],{"class":1546},[1309,7052,7053,7056],{"class":1311,"line":1391},[1309,7054,7055],{"class":2234},"  template",[1309,7057,2261],{"class":2238},[1309,7059,7060,7063],{"class":1311,"line":1397},[1309,7061,7062],{"class":2234},"    metadata",[1309,7064,2261],{"class":2238},[1309,7066,7067,7070],{"class":1311,"line":1406},[1309,7068,7069],{"class":2234},"      labels",[1309,7071,2261],{"class":2238},[1309,7073,7074,7077,7079],{"class":1311,"line":1411},[1309,7075,7076],{"class":2234},"        app",[1309,7078,2239],{"class":2238},[1309,7080,2320],{"class":1546},[1309,7082,7083,7086],{"class":1311,"line":1417},[1309,7084,7085],{"class":2234},"    spec",[1309,7087,2261],{"class":2238},[1309,7089,7090,7093],{"class":1311,"line":1423},[1309,7091,7092],{"class":2234},"      containers",[1309,7094,2261],{"class":2238},[1309,7096,7097,7099,7102,7104],{"class":1311,"line":1432},[1309,7098,2346],{"class":2238},[1309,7100,7101],{"class":2234}," name",[1309,7103,2239],{"class":2238},[1309,7105,2320],{"class":1546},[1309,7107,7108,7111,7113],{"class":1311,"line":1438},[1309,7109,7110],{"class":2234},"        image",[1309,7112,2239],{"class":2238},[1309,7114,2283],{"class":1546},[1309,7116,7117,7120],{"class":1311,"line":1444},[1309,7118,7119],{"class":2234},"        ports",[1309,7121,2261],{"class":2238},[1309,7123,7124,7126,7129,7131],{"class":1311,"line":1450},[1309,7125,3920],{"class":2238},[1309,7127,7128],{"class":2234}," containerPort",[1309,7130,2239],{"class":2238},[1309,7132,7133],{"class":2466}," 5432\n",[1309,7135,7136,7139],{"class":1311,"line":1456},[1309,7137,7138],{"class":2234},"        env",[1309,7140,2261],{"class":2238},[1309,7142,7143,7145,7147,7149],{"class":1311,"line":1462},[1309,7144,3920],{"class":2238},[1309,7146,7101],{"class":2234},[1309,7148,2239],{"class":2238},[1309,7150,7151],{"class":1546}," POSTGRES_DB\n",[1309,7153,7154,7157],{"class":1311,"line":1468},[1309,7155,7156],{"class":2234},"          valueFrom",[1309,7158,2261],{"class":2238},[1309,7160,7161,7164],{"class":1311,"line":1473},[1309,7162,7163],{"class":2234},"            configMapKeyRef",[1309,7165,2261],{"class":2238},[1309,7167,7168,7171,7173],{"class":1311,"line":1479},[1309,7169,7170],{"class":2234},"              name",[1309,7172,2239],{"class":2238},[1309,7174,6153],{"class":1546},[1309,7176,7177,7180,7182],{"class":1311,"line":1485},[1309,7178,7179],{"class":2234},"              key",[1309,7181,2239],{"class":2238},[1309,7183,7151],{"class":1546},[1309,7185,7186,7188,7190,7192],{"class":1311,"line":1494},[1309,7187,3920],{"class":2238},[1309,7189,7101],{"class":2234},[1309,7191,2239],{"class":2238},[1309,7193,7194],{"class":1546}," POSTGRES_USER\n",[1309,7196,7197,7199],{"class":1311,"line":1502},[1309,7198,7156],{"class":2234},[1309,7200,2261],{"class":2238},[1309,7202,7203,7205],{"class":1311,"line":1507},[1309,7204,7163],{"class":2234},[1309,7206,2261],{"class":2238},[1309,7208,7209,7211,7213],{"class":1311,"line":1513},[1309,7210,7170],{"class":2234},[1309,7212,2239],{"class":2238},[1309,7214,6153],{"class":1546},[1309,7216,7217,7219,7221],{"class":1311,"line":1521},[1309,7218,7179],{"class":2234},[1309,7220,2239],{"class":2238},[1309,7222,7194],{"class":1546},[1309,7224,7225,7227,7229,7231],{"class":1311,"line":1526},[1309,7226,3920],{"class":2238},[1309,7228,7101],{"class":2234},[1309,7230,2239],{"class":2238},[1309,7232,7233],{"class":1546}," POSTGRES_PASSWORD\n",[1309,7235,7236,7238],{"class":1311,"line":1532},[1309,7237,7156],{"class":2234},[1309,7239,2261],{"class":2238},[1309,7241,7242,7245],{"class":1311,"line":1538},[1309,7243,7244],{"class":2234},"            secretKeyRef",[1309,7246,2261],{"class":2238},[1309,7248,7249,7251,7253],{"class":1311,"line":1553},[1309,7250,7170],{"class":2234},[1309,7252,2239],{"class":2238},[1309,7254,6489],{"class":1546},[1309,7256,7257,7259,7261],{"class":1311,"line":1561},[1309,7258,7179],{"class":2234},[1309,7260,2239],{"class":2238},[1309,7262,7233],{"class":1546},[1309,7264,7265,7268],{"class":1311,"line":1569},[1309,7266,7267],{"class":2234},"        volumeMounts",[1309,7269,2261],{"class":2238},[1309,7271,7272,7274,7276,7278],{"class":1311,"line":1574},[1309,7273,3920],{"class":2238},[1309,7275,7101],{"class":2234},[1309,7277,2239],{"class":2238},[1309,7279,7280],{"class":1546}," postgres-storage\n",[1309,7282,7283,7286,7288],{"class":1311,"line":1580},[1309,7284,7285],{"class":2234},"          mountPath",[1309,7287,2239],{"class":2238},[1309,7289,7290],{"class":1546}," /var/lib/postgresql/data\n",[1309,7292,7293,7296],{"class":1311,"line":1586},[1309,7294,7295],{"class":2234},"        resources",[1309,7297,2261],{"class":2238},[1309,7299,7300,7303],{"class":1311,"line":1594},[1309,7301,7302],{"class":2234},"          requests",[1309,7304,2261],{"class":2238},[1309,7306,7307,7310,7312,7314,7317],{"class":1311,"line":1599},[1309,7308,7309],{"class":2234},"            memory",[1309,7311,2239],{"class":2238},[1309,7313,2375],{"class":2242},[1309,7315,7316],{"class":1546},"256Mi",[1309,7318,2381],{"class":2242},[1309,7320,7321,7324,7326,7328,7331],{"class":1311,"line":1605},[1309,7322,7323],{"class":2234},"            cpu",[1309,7325,2239],{"class":2238},[1309,7327,2375],{"class":2242},[1309,7329,7330],{"class":1546},"250m",[1309,7332,2381],{"class":2242},[1309,7334,7335,7338],{"class":1311,"line":1614},[1309,7336,7337],{"class":2234},"          limits",[1309,7339,2261],{"class":2238},[1309,7341,7342,7344,7346,7348,7351],{"class":1311,"line":1623},[1309,7343,7309],{"class":2234},[1309,7345,2239],{"class":2238},[1309,7347,2375],{"class":2242},[1309,7349,7350],{"class":1546},"512Mi",[1309,7352,2381],{"class":2242},[1309,7354,7355,7357,7359,7361,7364],{"class":1311,"line":1628},[1309,7356,7323],{"class":2234},[1309,7358,2239],{"class":2238},[1309,7360,2375],{"class":2242},[1309,7362,7363],{"class":1546},"500m",[1309,7365,2381],{"class":2242},[1309,7367,7368,7371],{"class":1311,"line":1634},[1309,7369,7370],{"class":2234},"      volumes",[1309,7372,2261],{"class":2238},[1309,7374,7375,7377,7379,7381],{"class":1311,"line":1643},[1309,7376,2346],{"class":2238},[1309,7378,7101],{"class":2234},[1309,7380,2239],{"class":2238},[1309,7382,7280],{"class":1546},[1309,7384,7385,7388],{"class":1311,"line":1648},[1309,7386,7387],{"class":2234},"        persistentVolumeClaim",[1309,7389,2261],{"class":2238},[1309,7391,7392,7395,7397],{"class":1311,"line":1654},[1309,7393,7394],{"class":2234},"          claimName",[1309,7396,2239],{"class":2238},[1309,7398,7399],{"class":1546}," postgres-pvc\n",[1309,7401,7402],{"class":1311,"line":1660},[1309,7403,1340],{"emptyLinePlaceholder":1339},[1309,7405,7406],{"class":1311,"line":2043},[1309,7407,6116],{"class":3994},[1309,7409,7410,7412,7414],{"class":1311,"line":2050},[1309,7411,6050],{"class":2234},[1309,7413,2239],{"class":2238},[1309,7415,6055],{"class":1546},[1309,7417,7418,7420,7422],{"class":1311,"line":2055},[1309,7419,6060],{"class":2234},[1309,7421,2239],{"class":2238},[1309,7423,7424],{"class":1546}," Service\n",[1309,7426,7427,7429],{"class":1311,"line":2061},[1309,7428,6070],{"class":2234},[1309,7430,2261],{"class":2238},[1309,7432,7433,7435,7437],{"class":1311,"line":2073},[1309,7434,6077],{"class":2234},[1309,7436,2239],{"class":2238},[1309,7438,7439],{"class":1546}," postgres-service\n",[1309,7441,7442,7444,7446],{"class":1311,"line":2085},[1309,7443,6158],{"class":2234},[1309,7445,2239],{"class":2238},[1309,7447,6082],{"class":1546},[1309,7449,7450,7452],{"class":1311,"line":2098},[1309,7451,7015],{"class":2234},[1309,7453,2261],{"class":2238},[1309,7455,7456,7458],{"class":1311,"line":2111},[1309,7457,7032],{"class":2234},[1309,7459,2261],{"class":2238},[1309,7461,7462,7464,7466],{"class":1311,"line":2124},[1309,7463,6173],{"class":2234},[1309,7465,2239],{"class":2238},[1309,7467,2320],{"class":1546},[1309,7469,7470,7472],{"class":1311,"line":2136},[1309,7471,5592],{"class":2234},[1309,7473,2261],{"class":2238},[1309,7475,7476,7479,7482,7484],{"class":1311,"line":2149},[1309,7477,7478],{"class":2238},"  -",[1309,7480,7481],{"class":2234}," port",[1309,7483,2239],{"class":2238},[1309,7485,7133],{"class":2466},[1309,7487,7488,7491,7493],{"class":1311,"line":2162},[1309,7489,7490],{"class":2234},"    targetPort",[1309,7492,2239],{"class":2238},[1309,7494,7133],{"class":2466},[1309,7496,7497,7500,7502],{"class":1311,"line":2175},[1309,7498,7499],{"class":2234},"  type",[1309,7501,2239],{"class":2238},[1309,7503,7504],{"class":1546}," ClusterIP\n",[1309,7506,7507],{"class":1311,"line":2786},[1309,7508,1340],{"emptyLinePlaceholder":1339},[1309,7510,7511],{"class":1311,"line":2797},[1309,7512,6116],{"class":3994},[1309,7514,7515,7517,7519],{"class":1311,"line":2808},[1309,7516,6050],{"class":2234},[1309,7518,2239],{"class":2238},[1309,7520,6055],{"class":1546},[1309,7522,7523,7525,7527],{"class":1311,"line":2819},[1309,7524,6060],{"class":2234},[1309,7526,2239],{"class":2238},[1309,7528,7529],{"class":1546}," PersistentVolumeClaim\n",[1309,7531,7532,7534],{"class":1311,"line":2829},[1309,7533,6070],{"class":2234},[1309,7535,2261],{"class":2238},[1309,7537,7538,7540,7542],{"class":1311,"line":2836},[1309,7539,6077],{"class":2234},[1309,7541,2239],{"class":2238},[1309,7543,7399],{"class":1546},[1309,7545,7546,7548,7550],{"class":1311,"line":2848},[1309,7547,6158],{"class":2234},[1309,7549,2239],{"class":2238},[1309,7551,6082],{"class":1546},[1309,7553,7554,7556],{"class":1311,"line":2855},[1309,7555,7015],{"class":2234},[1309,7557,2261],{"class":2238},[1309,7559,7560,7563],{"class":1311,"line":2861},[1309,7561,7562],{"class":2234},"  accessModes",[1309,7564,2261],{"class":2238},[1309,7566,7567,7569],{"class":1311,"line":2869},[1309,7568,5599],{"class":2238},[1309,7570,7571],{"class":1546}," ReadWriteOnce\n",[1309,7573,7574,7577],{"class":1311,"line":2875},[1309,7575,7576],{"class":2234},"  resources",[1309,7578,2261],{"class":2238},[1309,7580,7581,7584],{"class":1311,"line":2883},[1309,7582,7583],{"class":2234},"    requests",[1309,7585,2261],{"class":2238},[1309,7587,7588,7591,7593],{"class":1311,"line":2889},[1309,7589,7590],{"class":2234},"      storage",[1309,7592,2239],{"class":2238},[1309,7594,7595],{"class":1546}," 10Gi\n",[1038,7597,7599],{"id":7598},"user-service-deployment","User Service Deployment",[1299,7601,7603],{"className":2220,"code":7602,"language":2222,"meta":1304,"style":1304},"# k8s/user-service.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: user-service\n  namespace: microservices\n  labels:\n    app: user-service\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: user-service\n  template:\n    metadata:\n      labels:\n        app: user-service\n    spec:\n      containers:\n      - name: user-service\n        image: your-registry/user-service:latest\n        ports:\n        - containerPort: 8000\n        env:\n        - name: DATABASE_URL\n          value: \"postgresql://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@postgres-service:5432/$(POSTGRES_DB)\"\n        - name: POSTGRES_USER\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: POSTGRES_USER\n        - name: POSTGRES_DB\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: POSTGRES_DB\n        - name: POSTGRES_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: microservices-secrets\n              key: POSTGRES_PASSWORD\n        - name: DJANGO_SECRET_KEY\n          valueFrom:\n            secretKeyRef:\n              name: microservices-secrets\n              key: DJANGO_SECRET_KEY\n        - name: REDIS_URL\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: REDIS_URL\n        - name: CELERY_BROKER_URL\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: CELERY_BROKER_URL\n        livenessProbe:\n          httpGet:\n            path: /health/\n            port: 8000\n          initialDelaySeconds: 30\n          periodSeconds: 10\n        readinessProbe:\n          httpGet:\n            path: /ready/\n            port: 8000\n          initialDelaySeconds: 5\n          periodSeconds: 5\n        resources:\n          requests:\n            memory: \"256Mi\"\n            cpu: \"250m\"\n          limits:\n            memory: \"512Mi\"\n            cpu: \"500m\"\n      initContainers:\n      - name: migrate\n        image: your-registry/user-service:latest\n        command: ['python', 'manage.py', 'migrate']\n        env:\n        - name: DATABASE_URL\n          value: \"postgresql://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@postgres-service:5432/$(POSTGRES_DB)\"\n        - name: POSTGRES_USER\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: POSTGRES_USER\n        - name: POSTGRES_DB\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: POSTGRES_DB\n        - name: POSTGRES_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: microservices-secrets\n              key: POSTGRES_PASSWORD\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: user-service\n  namespace: microservices\nspec:\n  selector:\n    app: user-service\n  ports:\n  - port: 8000\n    targetPort: 8000\n  type: ClusterIP\n\n---\n# Celery Worker for User Service\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: user-worker\n  namespace: microservices\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: user-worker\n  template:\n    metadata:\n      labels:\n        app: user-worker\n    spec:\n      containers:\n      - name: user-worker\n        image: your-registry/user-service:latest\n        command: ['celery', '-A', 'user_service', 'worker', '--loglevel=info', '-Q', 'user_queue']\n        env:\n        - name: DATABASE_URL\n          value: \"postgresql://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@postgres-service:5432/$(POSTGRES_DB)\"\n        - name: POSTGRES_USER\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: POSTGRES_USER\n        - name: POSTGRES_DB\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: POSTGRES_DB\n        - name: POSTGRES_PASSWORD\n          valueFrom:\n            secretKeyRef:\n              name: microservices-secrets\n              key: POSTGRES_PASSWORD\n        - name: CELERY_BROKER_URL\n          valueFrom:\n            configMapKeyRef:\n              name: microservices-config\n              key: CELERY_BROKER_URL\n        resources:\n          requests:\n            memory: \"128Mi\"\n            cpu: \"100m\"\n          limits:\n            memory: \"256Mi\"\n            cpu: \"200m\"\n",[1306,7604,7605,7610,7618,7626,7632,7640,7648,7654,7662,7668,7676,7682,7688,7696,7702,7708,7714,7722,7728,7734,7744,7753,7759,7769,7775,7786,7800,7810,7816,7822,7830,7838,7848,7854,7860,7868,7876,7886,7892,7898,7906,7914,7925,7931,7937,7945,7953,7964,7970,7976,7984,7992,8003,8009,8015,8023,8031,8038,8045,8055,8064,8074,8084,8091,8097,8106,8114,8122,8130,8136,8142,8154,8166,8172,8184,8196,8203,8214,8222,8259,8265,8275,8287,8297,8303,8309,8317,8325,8335,8341,8347,8355,8363,8373,8379,8385,8393,8401,8405,8409,8417,8425,8431,8439,8447,8453,8459,8467,8473,8483,8491,8499,8503,8507,8512,8520,8528,8534,8543,8551,8557,8566,8572,8578,8586,8592,8598,8604,8612,8618,8624,8634,8642,8713,8719,8729,8741,8751,8757,8763,8771,8779,8789,8795,8801,8809,8817,8827,8833,8839,8847,8855,8865,8871,8877,8885,8893,8899,8905,8918,8931,8937,8949],{"__ignoreMap":1304},[1309,7606,7607],{"class":1311,"line":1312},[1309,7608,7609],{"class":1315},"# k8s/user-service.yaml\n",[1309,7611,7612,7614,7616],{"class":1311,"line":1319},[1309,7613,6050],{"class":2234},[1309,7615,2239],{"class":2238},[1309,7617,6979],{"class":1546},[1309,7619,7620,7622,7624],{"class":1311,"line":1325},[1309,7621,6060],{"class":2234},[1309,7623,2239],{"class":2238},[1309,7625,6988],{"class":1546},[1309,7627,7628,7630],{"class":1311,"line":1336},[1309,7629,6070],{"class":2234},[1309,7631,2261],{"class":2238},[1309,7633,7634,7636,7638],{"class":1311,"line":1343},[1309,7635,6077],{"class":2234},[1309,7637,2239],{"class":2238},[1309,7639,3758],{"class":1546},[1309,7641,7642,7644,7646],{"class":1311,"line":1349},[1309,7643,6158],{"class":2234},[1309,7645,2239],{"class":2238},[1309,7647,6082],{"class":1546},[1309,7649,7650,7652],{"class":1311,"line":1355},[1309,7651,6087],{"class":2234},[1309,7653,2261],{"class":2238},[1309,7655,7656,7658,7660],{"class":1311,"line":1361},[1309,7657,6173],{"class":2234},[1309,7659,2239],{"class":2238},[1309,7661,3758],{"class":1546},[1309,7663,7664,7666],{"class":1311,"line":1370},[1309,7665,7015],{"class":2234},[1309,7667,2261],{"class":2238},[1309,7669,7670,7672,7674],{"class":1311,"line":1378},[1309,7671,7022],{"class":2234},[1309,7673,2239],{"class":2238},[1309,7675,2767],{"class":2466},[1309,7677,7678,7680],{"class":1311,"line":1386},[1309,7679,7032],{"class":2234},[1309,7681,2261],{"class":2238},[1309,7683,7684,7686],{"class":1311,"line":1391},[1309,7685,7039],{"class":2234},[1309,7687,2261],{"class":2238},[1309,7689,7690,7692,7694],{"class":1311,"line":1397},[1309,7691,7046],{"class":2234},[1309,7693,2239],{"class":2238},[1309,7695,3758],{"class":1546},[1309,7697,7698,7700],{"class":1311,"line":1406},[1309,7699,7055],{"class":2234},[1309,7701,2261],{"class":2238},[1309,7703,7704,7706],{"class":1311,"line":1411},[1309,7705,7062],{"class":2234},[1309,7707,2261],{"class":2238},[1309,7709,7710,7712],{"class":1311,"line":1417},[1309,7711,7069],{"class":2234},[1309,7713,2261],{"class":2238},[1309,7715,7716,7718,7720],{"class":1311,"line":1423},[1309,7717,7076],{"class":2234},[1309,7719,2239],{"class":2238},[1309,7721,3758],{"class":1546},[1309,7723,7724,7726],{"class":1311,"line":1432},[1309,7725,7085],{"class":2234},[1309,7727,2261],{"class":2238},[1309,7729,7730,7732],{"class":1311,"line":1438},[1309,7731,7092],{"class":2234},[1309,7733,2261],{"class":2238},[1309,7735,7736,7738,7740,7742],{"class":1311,"line":1444},[1309,7737,2346],{"class":2238},[1309,7739,7101],{"class":2234},[1309,7741,2239],{"class":2238},[1309,7743,3758],{"class":1546},[1309,7745,7746,7748,7750],{"class":1311,"line":1450},[1309,7747,7110],{"class":2234},[1309,7749,2239],{"class":2238},[1309,7751,7752],{"class":1546}," your-registry/user-service:latest\n",[1309,7754,7755,7757],{"class":1311,"line":1456},[1309,7756,7119],{"class":2234},[1309,7758,2261],{"class":2238},[1309,7760,7761,7763,7765,7767],{"class":1311,"line":1462},[1309,7762,3920],{"class":2238},[1309,7764,7128],{"class":2234},[1309,7766,2239],{"class":2238},[1309,7768,1640],{"class":2466},[1309,7770,7771,7773],{"class":1311,"line":1468},[1309,7772,7138],{"class":2234},[1309,7774,2261],{"class":2238},[1309,7776,7777,7779,7781,7783],{"class":1311,"line":1473},[1309,7778,3920],{"class":2238},[1309,7780,7101],{"class":2234},[1309,7782,2239],{"class":2238},[1309,7784,7785],{"class":1546}," DATABASE_URL\n",[1309,7787,7788,7791,7793,7795,7798],{"class":1311,"line":1479},[1309,7789,7790],{"class":2234},"          value",[1309,7792,2239],{"class":2238},[1309,7794,2375],{"class":2242},[1309,7796,7797],{"class":1546},"postgresql://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@postgres-service:5432/$(POSTGRES_DB)",[1309,7799,2381],{"class":2242},[1309,7801,7802,7804,7806,7808],{"class":1311,"line":1485},[1309,7803,3920],{"class":2238},[1309,7805,7101],{"class":2234},[1309,7807,2239],{"class":2238},[1309,7809,7194],{"class":1546},[1309,7811,7812,7814],{"class":1311,"line":1494},[1309,7813,7156],{"class":2234},[1309,7815,2261],{"class":2238},[1309,7817,7818,7820],{"class":1311,"line":1502},[1309,7819,7163],{"class":2234},[1309,7821,2261],{"class":2238},[1309,7823,7824,7826,7828],{"class":1311,"line":1507},[1309,7825,7170],{"class":2234},[1309,7827,2239],{"class":2238},[1309,7829,6153],{"class":1546},[1309,7831,7832,7834,7836],{"class":1311,"line":1513},[1309,7833,7179],{"class":2234},[1309,7835,2239],{"class":2238},[1309,7837,7194],{"class":1546},[1309,7839,7840,7842,7844,7846],{"class":1311,"line":1521},[1309,7841,3920],{"class":2238},[1309,7843,7101],{"class":2234},[1309,7845,2239],{"class":2238},[1309,7847,7151],{"class":1546},[1309,7849,7850,7852],{"class":1311,"line":1526},[1309,7851,7156],{"class":2234},[1309,7853,2261],{"class":2238},[1309,7855,7856,7858],{"class":1311,"line":1532},[1309,7857,7163],{"class":2234},[1309,7859,2261],{"class":2238},[1309,7861,7862,7864,7866],{"class":1311,"line":1538},[1309,7863,7170],{"class":2234},[1309,7865,2239],{"class":2238},[1309,7867,6153],{"class":1546},[1309,7869,7870,7872,7874],{"class":1311,"line":1553},[1309,7871,7179],{"class":2234},[1309,7873,2239],{"class":2238},[1309,7875,7151],{"class":1546},[1309,7877,7878,7880,7882,7884],{"class":1311,"line":1561},[1309,7879,3920],{"class":2238},[1309,7881,7101],{"class":2234},[1309,7883,2239],{"class":2238},[1309,7885,7233],{"class":1546},[1309,7887,7888,7890],{"class":1311,"line":1569},[1309,7889,7156],{"class":2234},[1309,7891,2261],{"class":2238},[1309,7893,7894,7896],{"class":1311,"line":1574},[1309,7895,7244],{"class":2234},[1309,7897,2261],{"class":2238},[1309,7899,7900,7902,7904],{"class":1311,"line":1580},[1309,7901,7170],{"class":2234},[1309,7903,2239],{"class":2238},[1309,7905,6489],{"class":1546},[1309,7907,7908,7910,7912],{"class":1311,"line":1586},[1309,7909,7179],{"class":2234},[1309,7911,2239],{"class":2238},[1309,7913,7233],{"class":1546},[1309,7915,7916,7918,7920,7922],{"class":1311,"line":1594},[1309,7917,3920],{"class":2238},[1309,7919,7101],{"class":2234},[1309,7921,2239],{"class":2238},[1309,7923,7924],{"class":1546}," DJANGO_SECRET_KEY\n",[1309,7926,7927,7929],{"class":1311,"line":1599},[1309,7928,7156],{"class":2234},[1309,7930,2261],{"class":2238},[1309,7932,7933,7935],{"class":1311,"line":1605},[1309,7934,7244],{"class":2234},[1309,7936,2261],{"class":2238},[1309,7938,7939,7941,7943],{"class":1311,"line":1614},[1309,7940,7170],{"class":2234},[1309,7942,2239],{"class":2238},[1309,7944,6489],{"class":1546},[1309,7946,7947,7949,7951],{"class":1311,"line":1623},[1309,7948,7179],{"class":2234},[1309,7950,2239],{"class":2238},[1309,7952,7924],{"class":1546},[1309,7954,7955,7957,7959,7961],{"class":1311,"line":1628},[1309,7956,3920],{"class":2238},[1309,7958,7101],{"class":2234},[1309,7960,2239],{"class":2238},[1309,7962,7963],{"class":1546}," REDIS_URL\n",[1309,7965,7966,7968],{"class":1311,"line":1634},[1309,7967,7156],{"class":2234},[1309,7969,2261],{"class":2238},[1309,7971,7972,7974],{"class":1311,"line":1643},[1309,7973,7163],{"class":2234},[1309,7975,2261],{"class":2238},[1309,7977,7978,7980,7982],{"class":1311,"line":1648},[1309,7979,7170],{"class":2234},[1309,7981,2239],{"class":2238},[1309,7983,6153],{"class":1546},[1309,7985,7986,7988,7990],{"class":1311,"line":1654},[1309,7987,7179],{"class":2234},[1309,7989,2239],{"class":2238},[1309,7991,7963],{"class":1546},[1309,7993,7994,7996,7998,8000],{"class":1311,"line":1660},[1309,7995,3920],{"class":2238},[1309,7997,7101],{"class":2234},[1309,7999,2239],{"class":2238},[1309,8001,8002],{"class":1546}," CELERY_BROKER_URL\n",[1309,8004,8005,8007],{"class":1311,"line":2043},[1309,8006,7156],{"class":2234},[1309,8008,2261],{"class":2238},[1309,8010,8011,8013],{"class":1311,"line":2050},[1309,8012,7163],{"class":2234},[1309,8014,2261],{"class":2238},[1309,8016,8017,8019,8021],{"class":1311,"line":2055},[1309,8018,7170],{"class":2234},[1309,8020,2239],{"class":2238},[1309,8022,6153],{"class":1546},[1309,8024,8025,8027,8029],{"class":1311,"line":2061},[1309,8026,7179],{"class":2234},[1309,8028,2239],{"class":2238},[1309,8030,8002],{"class":1546},[1309,8032,8033,8036],{"class":1311,"line":2073},[1309,8034,8035],{"class":2234},"        livenessProbe",[1309,8037,2261],{"class":2238},[1309,8039,8040,8043],{"class":1311,"line":2085},[1309,8041,8042],{"class":2234},"          httpGet",[1309,8044,2261],{"class":2238},[1309,8046,8047,8050,8052],{"class":1311,"line":2098},[1309,8048,8049],{"class":2234},"            path",[1309,8051,2239],{"class":2238},[1309,8053,8054],{"class":1546}," /health/\n",[1309,8056,8057,8060,8062],{"class":1311,"line":2111},[1309,8058,8059],{"class":2234},"            port",[1309,8061,2239],{"class":2238},[1309,8063,1640],{"class":2466},[1309,8065,8066,8069,8071],{"class":1311,"line":2124},[1309,8067,8068],{"class":2234},"          initialDelaySeconds",[1309,8070,2239],{"class":2238},[1309,8072,8073],{"class":2466}," 30\n",[1309,8075,8076,8079,8081],{"class":1311,"line":2136},[1309,8077,8078],{"class":2234},"          periodSeconds",[1309,8080,2239],{"class":2238},[1309,8082,8083],{"class":2466}," 10\n",[1309,8085,8086,8089],{"class":1311,"line":2149},[1309,8087,8088],{"class":2234},"        readinessProbe",[1309,8090,2261],{"class":2238},[1309,8092,8093,8095],{"class":1311,"line":2162},[1309,8094,8042],{"class":2234},[1309,8096,2261],{"class":2238},[1309,8098,8099,8101,8103],{"class":1311,"line":2175},[1309,8100,8049],{"class":2234},[1309,8102,2239],{"class":2238},[1309,8104,8105],{"class":1546}," /ready/\n",[1309,8107,8108,8110,8112],{"class":1311,"line":2786},[1309,8109,8059],{"class":2234},[1309,8111,2239],{"class":2238},[1309,8113,1640],{"class":2466},[1309,8115,8116,8118,8120],{"class":1311,"line":2797},[1309,8117,8068],{"class":2234},[1309,8119,2239],{"class":2238},[1309,8121,2467],{"class":2466},[1309,8123,8124,8126,8128],{"class":1311,"line":2808},[1309,8125,8078],{"class":2234},[1309,8127,2239],{"class":2238},[1309,8129,2467],{"class":2466},[1309,8131,8132,8134],{"class":1311,"line":2819},[1309,8133,7295],{"class":2234},[1309,8135,2261],{"class":2238},[1309,8137,8138,8140],{"class":1311,"line":2829},[1309,8139,7302],{"class":2234},[1309,8141,2261],{"class":2238},[1309,8143,8144,8146,8148,8150,8152],{"class":1311,"line":2836},[1309,8145,7309],{"class":2234},[1309,8147,2239],{"class":2238},[1309,8149,2375],{"class":2242},[1309,8151,7316],{"class":1546},[1309,8153,2381],{"class":2242},[1309,8155,8156,8158,8160,8162,8164],{"class":1311,"line":2848},[1309,8157,7323],{"class":2234},[1309,8159,2239],{"class":2238},[1309,8161,2375],{"class":2242},[1309,8163,7330],{"class":1546},[1309,8165,2381],{"class":2242},[1309,8167,8168,8170],{"class":1311,"line":2855},[1309,8169,7337],{"class":2234},[1309,8171,2261],{"class":2238},[1309,8173,8174,8176,8178,8180,8182],{"class":1311,"line":2861},[1309,8175,7309],{"class":2234},[1309,8177,2239],{"class":2238},[1309,8179,2375],{"class":2242},[1309,8181,7350],{"class":1546},[1309,8183,2381],{"class":2242},[1309,8185,8186,8188,8190,8192,8194],{"class":1311,"line":2869},[1309,8187,7323],{"class":2234},[1309,8189,2239],{"class":2238},[1309,8191,2375],{"class":2242},[1309,8193,7363],{"class":1546},[1309,8195,2381],{"class":2242},[1309,8197,8198,8201],{"class":1311,"line":2875},[1309,8199,8200],{"class":2234},"      initContainers",[1309,8202,2261],{"class":2238},[1309,8204,8205,8207,8209,8211],{"class":1311,"line":2883},[1309,8206,2346],{"class":2238},[1309,8208,7101],{"class":2234},[1309,8210,2239],{"class":2238},[1309,8212,8213],{"class":1546}," migrate\n",[1309,8215,8216,8218,8220],{"class":1311,"line":2889},[1309,8217,7110],{"class":2234},[1309,8219,2239],{"class":2238},[1309,8221,7752],{"class":1546},[1309,8223,8224,8227,8229,8231,8234,8237,8239,8241,8243,8246,8248,8250,8252,8255,8257],{"class":1311,"line":2897},[1309,8225,8226],{"class":2234},"        command",[1309,8228,2239],{"class":2238},[1309,8230,1666],{"class":2238},[1309,8232,8233],{"class":2242},"'",[1309,8235,8236],{"class":1546},"python",[1309,8238,8233],{"class":2242},[1309,8240,2427],{"class":2238},[1309,8242,2243],{"class":2242},[1309,8244,8245],{"class":1546},"manage.py",[1309,8247,8233],{"class":2242},[1309,8249,2427],{"class":2238},[1309,8251,2243],{"class":2242},[1309,8253,8254],{"class":1546},"migrate",[1309,8256,8233],{"class":2242},[1309,8258,1698],{"class":2238},[1309,8260,8261,8263],{"class":1311,"line":2903},[1309,8262,7138],{"class":2234},[1309,8264,2261],{"class":2238},[1309,8266,8267,8269,8271,8273],{"class":1311,"line":2911},[1309,8268,3920],{"class":2238},[1309,8270,7101],{"class":2234},[1309,8272,2239],{"class":2238},[1309,8274,7785],{"class":1546},[1309,8276,8277,8279,8281,8283,8285],{"class":1311,"line":2919},[1309,8278,7790],{"class":2234},[1309,8280,2239],{"class":2238},[1309,8282,2375],{"class":2242},[1309,8284,7797],{"class":1546},[1309,8286,2381],{"class":2242},[1309,8288,8289,8291,8293,8295],{"class":1311,"line":2927},[1309,8290,3920],{"class":2238},[1309,8292,7101],{"class":2234},[1309,8294,2239],{"class":2238},[1309,8296,7194],{"class":1546},[1309,8298,8299,8301],{"class":1311,"line":2935},[1309,8300,7156],{"class":2234},[1309,8302,2261],{"class":2238},[1309,8304,8305,8307],{"class":1311,"line":2946},[1309,8306,7163],{"class":2234},[1309,8308,2261],{"class":2238},[1309,8310,8311,8313,8315],{"class":1311,"line":2954},[1309,8312,7170],{"class":2234},[1309,8314,2239],{"class":2238},[1309,8316,6153],{"class":1546},[1309,8318,8319,8321,8323],{"class":1311,"line":2964},[1309,8320,7179],{"class":2234},[1309,8322,2239],{"class":2238},[1309,8324,7194],{"class":1546},[1309,8326,8327,8329,8331,8333],{"class":1311,"line":2972},[1309,8328,3920],{"class":2238},[1309,8330,7101],{"class":2234},[1309,8332,2239],{"class":2238},[1309,8334,7151],{"class":1546},[1309,8336,8337,8339],{"class":1311,"line":2981},[1309,8338,7156],{"class":2234},[1309,8340,2261],{"class":2238},[1309,8342,8343,8345],{"class":1311,"line":2988},[1309,8344,7163],{"class":2234},[1309,8346,2261],{"class":2238},[1309,8348,8349,8351,8353],{"class":1311,"line":2995},[1309,8350,7170],{"class":2234},[1309,8352,2239],{"class":2238},[1309,8354,6153],{"class":1546},[1309,8356,8357,8359,8361],{"class":1311,"line":3002},[1309,8358,7179],{"class":2234},[1309,8360,2239],{"class":2238},[1309,8362,7151],{"class":1546},[1309,8364,8365,8367,8369,8371],{"class":1311,"line":3008},[1309,8366,3920],{"class":2238},[1309,8368,7101],{"class":2234},[1309,8370,2239],{"class":2238},[1309,8372,7233],{"class":1546},[1309,8374,8375,8377],{"class":1311,"line":3016},[1309,8376,7156],{"class":2234},[1309,8378,2261],{"class":2238},[1309,8380,8381,8383],{"class":1311,"line":3022},[1309,8382,7244],{"class":2234},[1309,8384,2261],{"class":2238},[1309,8386,8387,8389,8391],{"class":1311,"line":3030},[1309,8388,7170],{"class":2234},[1309,8390,2239],{"class":2238},[1309,8392,6489],{"class":1546},[1309,8394,8395,8397,8399],{"class":1311,"line":3038},[1309,8396,7179],{"class":2234},[1309,8398,2239],{"class":2238},[1309,8400,7233],{"class":1546},[1309,8402,8403],{"class":1311,"line":3044},[1309,8404,1340],{"emptyLinePlaceholder":1339},[1309,8406,8407],{"class":1311,"line":3055},[1309,8408,6116],{"class":3994},[1309,8410,8411,8413,8415],{"class":1311,"line":3061},[1309,8412,6050],{"class":2234},[1309,8414,2239],{"class":2238},[1309,8416,6055],{"class":1546},[1309,8418,8419,8421,8423],{"class":1311,"line":3067},[1309,8420,6060],{"class":2234},[1309,8422,2239],{"class":2238},[1309,8424,7424],{"class":1546},[1309,8426,8427,8429],{"class":1311,"line":3073},[1309,8428,6070],{"class":2234},[1309,8430,2261],{"class":2238},[1309,8432,8433,8435,8437],{"class":1311,"line":3084},[1309,8434,6077],{"class":2234},[1309,8436,2239],{"class":2238},[1309,8438,3758],{"class":1546},[1309,8440,8441,8443,8445],{"class":1311,"line":3089},[1309,8442,6158],{"class":2234},[1309,8444,2239],{"class":2238},[1309,8446,6082],{"class":1546},[1309,8448,8449,8451],{"class":1311,"line":3095},[1309,8450,7015],{"class":2234},[1309,8452,2261],{"class":2238},[1309,8454,8455,8457],{"class":1311,"line":3103},[1309,8456,7032],{"class":2234},[1309,8458,2261],{"class":2238},[1309,8460,8461,8463,8465],{"class":1311,"line":3112},[1309,8462,6173],{"class":2234},[1309,8464,2239],{"class":2238},[1309,8466,3758],{"class":1546},[1309,8468,8469,8471],{"class":1311,"line":3122},[1309,8470,5592],{"class":2234},[1309,8472,2261],{"class":2238},[1309,8474,8475,8477,8479,8481],{"class":1311,"line":3129},[1309,8476,7478],{"class":2238},[1309,8478,7481],{"class":2234},[1309,8480,2239],{"class":2238},[1309,8482,1640],{"class":2466},[1309,8484,8485,8487,8489],{"class":1311,"line":3136},[1309,8486,7490],{"class":2234},[1309,8488,2239],{"class":2238},[1309,8490,1640],{"class":2466},[1309,8492,8493,8495,8497],{"class":1311,"line":3143},[1309,8494,7499],{"class":2234},[1309,8496,2239],{"class":2238},[1309,8498,7504],{"class":1546},[1309,8500,8501],{"class":1311,"line":3150},[1309,8502,1340],{"emptyLinePlaceholder":1339},[1309,8504,8505],{"class":1311,"line":3157},[1309,8506,6116],{"class":3994},[1309,8508,8509],{"class":1311,"line":3164},[1309,8510,8511],{"class":1315},"# Celery Worker for User Service\n",[1309,8513,8514,8516,8518],{"class":1311,"line":3171},[1309,8515,6050],{"class":2234},[1309,8517,2239],{"class":2238},[1309,8519,6979],{"class":1546},[1309,8521,8522,8524,8526],{"class":1311,"line":3180},[1309,8523,6060],{"class":2234},[1309,8525,2239],{"class":2238},[1309,8527,6988],{"class":1546},[1309,8529,8530,8532],{"class":1311,"line":3187},[1309,8531,6070],{"class":2234},[1309,8533,2261],{"class":2238},[1309,8535,8536,8538,8540],{"class":1311,"line":3196},[1309,8537,6077],{"class":2234},[1309,8539,2239],{"class":2238},[1309,8541,8542],{"class":1546}," user-worker\n",[1309,8544,8545,8547,8549],{"class":1311,"line":3203},[1309,8546,6158],{"class":2234},[1309,8548,2239],{"class":2238},[1309,8550,6082],{"class":1546},[1309,8552,8553,8555],{"class":1311,"line":3212},[1309,8554,7015],{"class":2234},[1309,8556,2261],{"class":2238},[1309,8558,8559,8561,8563],{"class":1311,"line":3219},[1309,8560,7022],{"class":2234},[1309,8562,2239],{"class":2238},[1309,8564,8565],{"class":2466}," 2\n",[1309,8567,8568,8570],{"class":1311,"line":3226},[1309,8569,7032],{"class":2234},[1309,8571,2261],{"class":2238},[1309,8573,8574,8576],{"class":1311,"line":3233},[1309,8575,7039],{"class":2234},[1309,8577,2261],{"class":2238},[1309,8579,8580,8582,8584],{"class":1311,"line":3240},[1309,8581,7046],{"class":2234},[1309,8583,2239],{"class":2238},[1309,8585,8542],{"class":1546},[1309,8587,8588,8590],{"class":1311,"line":3250},[1309,8589,7055],{"class":2234},[1309,8591,2261],{"class":2238},[1309,8593,8594,8596],{"class":1311,"line":3259},[1309,8595,7062],{"class":2234},[1309,8597,2261],{"class":2238},[1309,8599,8600,8602],{"class":1311,"line":3264},[1309,8601,7069],{"class":2234},[1309,8603,2261],{"class":2238},[1309,8605,8606,8608,8610],{"class":1311,"line":3272},[1309,8607,7076],{"class":2234},[1309,8609,2239],{"class":2238},[1309,8611,8542],{"class":1546},[1309,8613,8614,8616],{"class":1311,"line":3282},[1309,8615,7085],{"class":2234},[1309,8617,2261],{"class":2238},[1309,8619,8620,8622],{"class":1311,"line":3292},[1309,8621,7092],{"class":2234},[1309,8623,2261],{"class":2238},[1309,8625,8626,8628,8630,8632],{"class":1311,"line":3299},[1309,8627,2346],{"class":2238},[1309,8629,7101],{"class":2234},[1309,8631,2239],{"class":2238},[1309,8633,8542],{"class":1546},[1309,8635,8636,8638,8640],{"class":1311,"line":3311},[1309,8637,7110],{"class":2234},[1309,8639,2239],{"class":2238},[1309,8641,7752],{"class":1546},[1309,8643,8644,8646,8648,8650,8652,8655,8657,8659,8661,8664,8666,8668,8670,8673,8675,8677,8679,8682,8684,8686,8688,8691,8693,8695,8697,8700,8702,8704,8706,8709,8711],{"class":1311,"line":3318},[1309,8645,8226],{"class":2234},[1309,8647,2239],{"class":2238},[1309,8649,1666],{"class":2238},[1309,8651,8233],{"class":2242},[1309,8653,8654],{"class":1546},"celery",[1309,8656,8233],{"class":2242},[1309,8658,2427],{"class":2238},[1309,8660,2243],{"class":2242},[1309,8662,8663],{"class":1546},"-A",[1309,8665,8233],{"class":2242},[1309,8667,2427],{"class":2238},[1309,8669,2243],{"class":2242},[1309,8671,8672],{"class":1546},"user_service",[1309,8674,8233],{"class":2242},[1309,8676,2427],{"class":2238},[1309,8678,2243],{"class":2242},[1309,8680,8681],{"class":1546},"worker",[1309,8683,8233],{"class":2242},[1309,8685,2427],{"class":2238},[1309,8687,2243],{"class":2242},[1309,8689,8690],{"class":1546},"--loglevel=info",[1309,8692,8233],{"class":2242},[1309,8694,2427],{"class":2238},[1309,8696,2243],{"class":2242},[1309,8698,8699],{"class":1546},"-Q",[1309,8701,8233],{"class":2242},[1309,8703,2427],{"class":2238},[1309,8705,2243],{"class":2242},[1309,8707,8708],{"class":1546},"user_queue",[1309,8710,8233],{"class":2242},[1309,8712,1698],{"class":2238},[1309,8714,8715,8717],{"class":1311,"line":3325},[1309,8716,7138],{"class":2234},[1309,8718,2261],{"class":2238},[1309,8720,8721,8723,8725,8727],{"class":1311,"line":3332},[1309,8722,3920],{"class":2238},[1309,8724,7101],{"class":2234},[1309,8726,2239],{"class":2238},[1309,8728,7785],{"class":1546},[1309,8730,8731,8733,8735,8737,8739],{"class":1311,"line":3339},[1309,8732,7790],{"class":2234},[1309,8734,2239],{"class":2238},[1309,8736,2375],{"class":2242},[1309,8738,7797],{"class":1546},[1309,8740,2381],{"class":2242},[1309,8742,8743,8745,8747,8749],{"class":1311,"line":3347},[1309,8744,3920],{"class":2238},[1309,8746,7101],{"class":2234},[1309,8748,2239],{"class":2238},[1309,8750,7194],{"class":1546},[1309,8752,8753,8755],{"class":1311,"line":3355},[1309,8754,7156],{"class":2234},[1309,8756,2261],{"class":2238},[1309,8758,8759,8761],{"class":1311,"line":3362},[1309,8760,7163],{"class":2234},[1309,8762,2261],{"class":2238},[1309,8764,8765,8767,8769],{"class":1311,"line":3369},[1309,8766,7170],{"class":2234},[1309,8768,2239],{"class":2238},[1309,8770,6153],{"class":1546},[1309,8772,8773,8775,8777],{"class":1311,"line":3378},[1309,8774,7179],{"class":2234},[1309,8776,2239],{"class":2238},[1309,8778,7194],{"class":1546},[1309,8780,8781,8783,8785,8787],{"class":1311,"line":3385},[1309,8782,3920],{"class":2238},[1309,8784,7101],{"class":2234},[1309,8786,2239],{"class":2238},[1309,8788,7151],{"class":1546},[1309,8790,8791,8793],{"class":1311,"line":3394},[1309,8792,7156],{"class":2234},[1309,8794,2261],{"class":2238},[1309,8796,8797,8799],{"class":1311,"line":3401},[1309,8798,7163],{"class":2234},[1309,8800,2261],{"class":2238},[1309,8802,8803,8805,8807],{"class":1311,"line":3410},[1309,8804,7170],{"class":2234},[1309,8806,2239],{"class":2238},[1309,8808,6153],{"class":1546},[1309,8810,8811,8813,8815],{"class":1311,"line":3418},[1309,8812,7179],{"class":2234},[1309,8814,2239],{"class":2238},[1309,8816,7151],{"class":1546},[1309,8818,8819,8821,8823,8825],{"class":1311,"line":3427},[1309,8820,3920],{"class":2238},[1309,8822,7101],{"class":2234},[1309,8824,2239],{"class":2238},[1309,8826,7233],{"class":1546},[1309,8828,8829,8831],{"class":1311,"line":3434},[1309,8830,7156],{"class":2234},[1309,8832,2261],{"class":2238},[1309,8834,8835,8837],{"class":1311,"line":3441},[1309,8836,7244],{"class":2234},[1309,8838,2261],{"class":2238},[1309,8840,8841,8843,8845],{"class":1311,"line":3448},[1309,8842,7170],{"class":2234},[1309,8844,2239],{"class":2238},[1309,8846,6489],{"class":1546},[1309,8848,8849,8851,8853],{"class":1311,"line":3456},[1309,8850,7179],{"class":2234},[1309,8852,2239],{"class":2238},[1309,8854,7233],{"class":1546},[1309,8856,8857,8859,8861,8863],{"class":1311,"line":3465},[1309,8858,3920],{"class":2238},[1309,8860,7101],{"class":2234},[1309,8862,2239],{"class":2238},[1309,8864,8002],{"class":1546},[1309,8866,8867,8869],{"class":1311,"line":3470},[1309,8868,7156],{"class":2234},[1309,8870,2261],{"class":2238},[1309,8872,8873,8875],{"class":1311,"line":3475},[1309,8874,7163],{"class":2234},[1309,8876,2261],{"class":2238},[1309,8878,8879,8881,8883],{"class":1311,"line":3484},[1309,8880,7170],{"class":2234},[1309,8882,2239],{"class":2238},[1309,8884,6153],{"class":1546},[1309,8886,8887,8889,8891],{"class":1311,"line":3489},[1309,8888,7179],{"class":2234},[1309,8890,2239],{"class":2238},[1309,8892,8002],{"class":1546},[1309,8894,8895,8897],{"class":1311,"line":3497},[1309,8896,7295],{"class":2234},[1309,8898,2261],{"class":2238},[1309,8900,8901,8903],{"class":1311,"line":3506},[1309,8902,7302],{"class":2234},[1309,8904,2261],{"class":2238},[1309,8906,8907,8909,8911,8913,8916],{"class":1311,"line":3516},[1309,8908,7309],{"class":2234},[1309,8910,2239],{"class":2238},[1309,8912,2375],{"class":2242},[1309,8914,8915],{"class":1546},"128Mi",[1309,8917,2381],{"class":2242},[1309,8919,8920,8922,8924,8926,8929],{"class":1311,"line":3523},[1309,8921,7323],{"class":2234},[1309,8923,2239],{"class":2238},[1309,8925,2375],{"class":2242},[1309,8927,8928],{"class":1546},"100m",[1309,8930,2381],{"class":2242},[1309,8932,8933,8935],{"class":1311,"line":3530},[1309,8934,7337],{"class":2234},[1309,8936,2261],{"class":2238},[1309,8938,8939,8941,8943,8945,8947],{"class":1311,"line":3537},[1309,8940,7309],{"class":2234},[1309,8942,2239],{"class":2238},[1309,8944,2375],{"class":2242},[1309,8946,7316],{"class":1546},[1309,8948,2381],{"class":2242},[1309,8950,8951,8953,8955,8957,8960],{"class":1311,"line":3544},[1309,8952,7323],{"class":2234},[1309,8954,2239],{"class":2238},[1309,8956,2375],{"class":2242},[1309,8958,8959],{"class":1546},"200m",[1309,8961,2381],{"class":2242},[1038,8963,8965],{"id":8964},"horizontal-pod-autoscaler","Horizontal Pod Autoscaler",[1299,8967,8969],{"className":2220,"code":8968,"language":2222,"meta":1304,"style":1304},"# k8s/hpa.yaml\napiVersion: autoscaling/v2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: user-service-hpa\n  namespace: microservices\nspec:\n  scaleTargetRef:\n    apiVersion: apps/v1\n    kind: Deployment\n    name: user-service\n  minReplicas: 2\n  maxReplicas: 10\n  metrics:\n  - type: Resource\n    resource:\n      name: cpu\n      target:\n        type: Utilization\n        averageUtilization: 70\n  - type: Resource\n    resource:\n      name: memory\n      target:\n        type: Utilization\n        averageUtilization: 80\n  behavior:\n    scaleDown:\n      stabilizationWindowSeconds: 300\n      policies:\n      - type: Percent\n        value: 10\n        periodSeconds: 60\n    scaleUp:\n      stabilizationWindowSeconds: 0\n      policies:\n      - type: Percent\n        value: 100\n        periodSeconds: 15\n      - type: Pods\n        value: 4\n        periodSeconds: 15\n      selectPolicy: Max\n",[1306,8970,8971,8976,8985,8994,9000,9009,9017,9023,9030,9039,9048,9056,9065,9074,9081,9093,9100,9110,9117,9127,9137,9147,9153,9162,9168,9176,9185,9192,9199,9209,9216,9227,9236,9246,9253,9262,9268,9278,9287,9296,9307,9316,9324],{"__ignoreMap":1304},[1309,8972,8973],{"class":1311,"line":1312},[1309,8974,8975],{"class":1315},"# k8s/hpa.yaml\n",[1309,8977,8978,8980,8982],{"class":1311,"line":1319},[1309,8979,6050],{"class":2234},[1309,8981,2239],{"class":2238},[1309,8983,8984],{"class":1546}," autoscaling/v2\n",[1309,8986,8987,8989,8991],{"class":1311,"line":1325},[1309,8988,6060],{"class":2234},[1309,8990,2239],{"class":2238},[1309,8992,8993],{"class":1546}," HorizontalPodAutoscaler\n",[1309,8995,8996,8998],{"class":1311,"line":1336},[1309,8997,6070],{"class":2234},[1309,8999,2261],{"class":2238},[1309,9001,9002,9004,9006],{"class":1311,"line":1343},[1309,9003,6077],{"class":2234},[1309,9005,2239],{"class":2238},[1309,9007,9008],{"class":1546}," user-service-hpa\n",[1309,9010,9011,9013,9015],{"class":1311,"line":1349},[1309,9012,6158],{"class":2234},[1309,9014,2239],{"class":2238},[1309,9016,6082],{"class":1546},[1309,9018,9019,9021],{"class":1311,"line":1355},[1309,9020,7015],{"class":2234},[1309,9022,2261],{"class":2238},[1309,9024,9025,9028],{"class":1311,"line":1361},[1309,9026,9027],{"class":2234},"  scaleTargetRef",[1309,9029,2261],{"class":2238},[1309,9031,9032,9035,9037],{"class":1311,"line":1370},[1309,9033,9034],{"class":2234},"    apiVersion",[1309,9036,2239],{"class":2238},[1309,9038,6979],{"class":1546},[1309,9040,9041,9044,9046],{"class":1311,"line":1378},[1309,9042,9043],{"class":2234},"    kind",[1309,9045,2239],{"class":2238},[1309,9047,6988],{"class":1546},[1309,9049,9050,9052,9054],{"class":1311,"line":1386},[1309,9051,6094],{"class":2234},[1309,9053,2239],{"class":2238},[1309,9055,3758],{"class":1546},[1309,9057,9058,9061,9063],{"class":1311,"line":1391},[1309,9059,9060],{"class":2234},"  minReplicas",[1309,9062,2239],{"class":2238},[1309,9064,8565],{"class":2466},[1309,9066,9067,9070,9072],{"class":1311,"line":1397},[1309,9068,9069],{"class":2234},"  maxReplicas",[1309,9071,2239],{"class":2238},[1309,9073,8083],{"class":2466},[1309,9075,9076,9079],{"class":1311,"line":1406},[1309,9077,9078],{"class":2234},"  metrics",[1309,9080,2261],{"class":2238},[1309,9082,9083,9085,9088,9090],{"class":1311,"line":1411},[1309,9084,7478],{"class":2238},[1309,9086,9087],{"class":2234}," type",[1309,9089,2239],{"class":2238},[1309,9091,9092],{"class":1546}," Resource\n",[1309,9094,9095,9098],{"class":1311,"line":1417},[1309,9096,9097],{"class":2234},"    resource",[1309,9099,2261],{"class":2238},[1309,9101,9102,9105,9107],{"class":1311,"line":1423},[1309,9103,9104],{"class":2234},"      name",[1309,9106,2239],{"class":2238},[1309,9108,9109],{"class":1546}," cpu\n",[1309,9111,9112,9115],{"class":1311,"line":1432},[1309,9113,9114],{"class":2234},"      target",[1309,9116,2261],{"class":2238},[1309,9118,9119,9122,9124],{"class":1311,"line":1438},[1309,9120,9121],{"class":2234},"        type",[1309,9123,2239],{"class":2238},[1309,9125,9126],{"class":1546}," Utilization\n",[1309,9128,9129,9132,9134],{"class":1311,"line":1444},[1309,9130,9131],{"class":2234},"        averageUtilization",[1309,9133,2239],{"class":2238},[1309,9135,9136],{"class":2466}," 70\n",[1309,9138,9139,9141,9143,9145],{"class":1311,"line":1450},[1309,9140,7478],{"class":2238},[1309,9142,9087],{"class":2234},[1309,9144,2239],{"class":2238},[1309,9146,9092],{"class":1546},[1309,9148,9149,9151],{"class":1311,"line":1456},[1309,9150,9097],{"class":2234},[1309,9152,2261],{"class":2238},[1309,9154,9155,9157,9159],{"class":1311,"line":1462},[1309,9156,9104],{"class":2234},[1309,9158,2239],{"class":2238},[1309,9160,9161],{"class":1546}," memory\n",[1309,9163,9164,9166],{"class":1311,"line":1468},[1309,9165,9114],{"class":2234},[1309,9167,2261],{"class":2238},[1309,9169,9170,9172,9174],{"class":1311,"line":1473},[1309,9171,9121],{"class":2234},[1309,9173,2239],{"class":2238},[1309,9175,9126],{"class":1546},[1309,9177,9178,9180,9182],{"class":1311,"line":1479},[1309,9179,9131],{"class":2234},[1309,9181,2239],{"class":2238},[1309,9183,9184],{"class":2466}," 80\n",[1309,9186,9187,9190],{"class":1311,"line":1485},[1309,9188,9189],{"class":2234},"  behavior",[1309,9191,2261],{"class":2238},[1309,9193,9194,9197],{"class":1311,"line":1494},[1309,9195,9196],{"class":2234},"    scaleDown",[1309,9198,2261],{"class":2238},[1309,9200,9201,9204,9206],{"class":1311,"line":1502},[1309,9202,9203],{"class":2234},"      stabilizationWindowSeconds",[1309,9205,2239],{"class":2238},[1309,9207,9208],{"class":2466}," 300\n",[1309,9210,9211,9214],{"class":1311,"line":1507},[1309,9212,9213],{"class":2234},"      policies",[1309,9215,2261],{"class":2238},[1309,9217,9218,9220,9222,9224],{"class":1311,"line":1513},[1309,9219,2346],{"class":2238},[1309,9221,9087],{"class":2234},[1309,9223,2239],{"class":2238},[1309,9225,9226],{"class":1546}," Percent\n",[1309,9228,9229,9232,9234],{"class":1311,"line":1521},[1309,9230,9231],{"class":2234},"        value",[1309,9233,2239],{"class":2238},[1309,9235,8083],{"class":2466},[1309,9237,9238,9241,9243],{"class":1311,"line":1526},[1309,9239,9240],{"class":2234},"        periodSeconds",[1309,9242,2239],{"class":2238},[1309,9244,9245],{"class":2466}," 60\n",[1309,9247,9248,9251],{"class":1311,"line":1532},[1309,9249,9250],{"class":2234},"    scaleUp",[1309,9252,2261],{"class":2238},[1309,9254,9255,9257,9259],{"class":1311,"line":1538},[1309,9256,9203],{"class":2234},[1309,9258,2239],{"class":2238},[1309,9260,9261],{"class":2466}," 0\n",[1309,9263,9264,9266],{"class":1311,"line":1553},[1309,9265,9213],{"class":2234},[1309,9267,2261],{"class":2238},[1309,9269,9270,9272,9274,9276],{"class":1311,"line":1561},[1309,9271,2346],{"class":2238},[1309,9273,9087],{"class":2234},[1309,9275,2239],{"class":2238},[1309,9277,9226],{"class":1546},[1309,9279,9280,9282,9284],{"class":1311,"line":1569},[1309,9281,9231],{"class":2234},[1309,9283,2239],{"class":2238},[1309,9285,9286],{"class":2466}," 100\n",[1309,9288,9289,9291,9293],{"class":1311,"line":1574},[1309,9290,9240],{"class":2234},[1309,9292,2239],{"class":2238},[1309,9294,9295],{"class":2466}," 15\n",[1309,9297,9298,9300,9302,9304],{"class":1311,"line":1580},[1309,9299,2346],{"class":2238},[1309,9301,9087],{"class":2234},[1309,9303,2239],{"class":2238},[1309,9305,9306],{"class":1546}," Pods\n",[1309,9308,9309,9311,9313],{"class":1311,"line":1586},[1309,9310,9231],{"class":2234},[1309,9312,2239],{"class":2238},[1309,9314,9315],{"class":2466}," 4\n",[1309,9317,9318,9320,9322],{"class":1311,"line":1594},[1309,9319,9240],{"class":2234},[1309,9321,2239],{"class":2238},[1309,9323,9295],{"class":2466},[1309,9325,9326,9329,9331],{"class":1311,"line":1599},[1309,9327,9328],{"class":2234},"      selectPolicy",[1309,9330,2239],{"class":2238},[1309,9332,9333],{"class":1546}," Max\n",[1038,9335,9337],{"id":9336},"ingress-configuration","Ingress Configuration",[1299,9339,9341],{"className":2220,"code":9340,"language":2222,"meta":1304,"style":1304},"# k8s/ingress.yaml\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: microservices-ingress\n  namespace: microservices\n  annotations:\n    kubernetes.io/ingress.class: nginx\n    nginx.ingress.kubernetes.io/rewrite-target: /$2\n    nginx.ingress.kubernetes.io/ssl-redirect: \"true\"\n    cert-manager.io/cluster-issuer: letsencrypt-prod\nspec:\n  tls:\n  - hosts:\n    - api.yourdomain.com\n    secretName: microservices-tls\n  rules:\n  - host: api.yourdomain.com\n    http:\n      paths:\n      - path: /users(/|$)(.*)\n        pathType: Prefix\n        backend:\n          service:\n            name: user-service\n            port:\n              number: 8000\n      - path: /orders(/|$)(.*)\n        pathType: Prefix\n        backend:\n          service:\n            name: order-service\n            port:\n              number: 8000\n",[1306,9342,9343,9348,9357,9366,9372,9381,9389,9396,9406,9416,9429,9439,9445,9452,9461,9468,9478,9485,9496,9503,9510,9522,9532,9539,9546,9555,9561,9570,9581,9589,9595,9601,9609,9615],{"__ignoreMap":1304},[1309,9344,9345],{"class":1311,"line":1312},[1309,9346,9347],{"class":1315},"# k8s/ingress.yaml\n",[1309,9349,9350,9352,9354],{"class":1311,"line":1319},[1309,9351,6050],{"class":2234},[1309,9353,2239],{"class":2238},[1309,9355,9356],{"class":1546}," networking.k8s.io/v1\n",[1309,9358,9359,9361,9363],{"class":1311,"line":1325},[1309,9360,6060],{"class":2234},[1309,9362,2239],{"class":2238},[1309,9364,9365],{"class":1546}," Ingress\n",[1309,9367,9368,9370],{"class":1311,"line":1336},[1309,9369,6070],{"class":2234},[1309,9371,2261],{"class":2238},[1309,9373,9374,9376,9378],{"class":1311,"line":1343},[1309,9375,6077],{"class":2234},[1309,9377,2239],{"class":2238},[1309,9379,9380],{"class":1546}," microservices-ingress\n",[1309,9382,9383,9385,9387],{"class":1311,"line":1349},[1309,9384,6158],{"class":2234},[1309,9386,2239],{"class":2238},[1309,9388,6082],{"class":1546},[1309,9390,9391,9394],{"class":1311,"line":1355},[1309,9392,9393],{"class":2234},"  annotations",[1309,9395,2261],{"class":2238},[1309,9397,9398,9401,9403],{"class":1311,"line":1361},[1309,9399,9400],{"class":2234},"    kubernetes.io/ingress.class",[1309,9402,2239],{"class":2238},[1309,9404,9405],{"class":1546}," nginx\n",[1309,9407,9408,9411,9413],{"class":1311,"line":1370},[1309,9409,9410],{"class":2234},"    nginx.ingress.kubernetes.io/rewrite-target",[1309,9412,2239],{"class":2238},[1309,9414,9415],{"class":1546}," /$2\n",[1309,9417,9418,9421,9423,9425,9427],{"class":1311,"line":1378},[1309,9419,9420],{"class":2234},"    nginx.ingress.kubernetes.io/ssl-redirect",[1309,9422,2239],{"class":2238},[1309,9424,2375],{"class":2242},[1309,9426,6396],{"class":1546},[1309,9428,2381],{"class":2242},[1309,9430,9431,9434,9436],{"class":1311,"line":1386},[1309,9432,9433],{"class":2234},"    cert-manager.io/cluster-issuer",[1309,9435,2239],{"class":2238},[1309,9437,9438],{"class":1546}," letsencrypt-prod\n",[1309,9440,9441,9443],{"class":1311,"line":1391},[1309,9442,7015],{"class":2234},[1309,9444,2261],{"class":2238},[1309,9446,9447,9450],{"class":1311,"line":1397},[1309,9448,9449],{"class":2234},"  tls",[1309,9451,2261],{"class":2238},[1309,9453,9454,9456,9459],{"class":1311,"line":1406},[1309,9455,7478],{"class":2238},[1309,9457,9458],{"class":2234}," hosts",[1309,9460,2261],{"class":2238},[1309,9462,9463,9465],{"class":1311,"line":1411},[1309,9464,5599],{"class":2238},[1309,9466,9467],{"class":1546}," api.yourdomain.com\n",[1309,9469,9470,9473,9475],{"class":1311,"line":1417},[1309,9471,9472],{"class":2234},"    secretName",[1309,9474,2239],{"class":2238},[1309,9476,9477],{"class":1546}," microservices-tls\n",[1309,9479,9480,9483],{"class":1311,"line":1423},[1309,9481,9482],{"class":2234},"  rules",[1309,9484,2261],{"class":2238},[1309,9486,9487,9489,9492,9494],{"class":1311,"line":1432},[1309,9488,7478],{"class":2238},[1309,9490,9491],{"class":2234}," host",[1309,9493,2239],{"class":2238},[1309,9495,9467],{"class":1546},[1309,9497,9498,9501],{"class":1311,"line":1438},[1309,9499,9500],{"class":2234},"    http",[1309,9502,2261],{"class":2238},[1309,9504,9505,9508],{"class":1311,"line":1444},[1309,9506,9507],{"class":2234},"      paths",[1309,9509,2261],{"class":2238},[1309,9511,9512,9514,9517,9519],{"class":1311,"line":1450},[1309,9513,2346],{"class":2238},[1309,9515,9516],{"class":2234}," path",[1309,9518,2239],{"class":2238},[1309,9520,9521],{"class":1546}," /users(/|$)(.*)\n",[1309,9523,9524,9527,9529],{"class":1311,"line":1456},[1309,9525,9526],{"class":2234},"        pathType",[1309,9528,2239],{"class":2238},[1309,9530,9531],{"class":1546}," Prefix\n",[1309,9533,9534,9537],{"class":1311,"line":1462},[1309,9535,9536],{"class":2234},"        backend",[1309,9538,2261],{"class":2238},[1309,9540,9541,9544],{"class":1311,"line":1468},[1309,9542,9543],{"class":2234},"          service",[1309,9545,2261],{"class":2238},[1309,9547,9548,9551,9553],{"class":1311,"line":1473},[1309,9549,9550],{"class":2234},"            name",[1309,9552,2239],{"class":2238},[1309,9554,3758],{"class":1546},[1309,9556,9557,9559],{"class":1311,"line":1479},[1309,9558,8059],{"class":2234},[1309,9560,2261],{"class":2238},[1309,9562,9563,9566,9568],{"class":1311,"line":1485},[1309,9564,9565],{"class":2234},"              number",[1309,9567,2239],{"class":2238},[1309,9569,1640],{"class":2466},[1309,9571,9572,9574,9576,9578],{"class":1311,"line":1494},[1309,9573,2346],{"class":2238},[1309,9575,9516],{"class":2234},[1309,9577,2239],{"class":2238},[1309,9579,9580],{"class":1546}," /orders(/|$)(.*)\n",[1309,9582,9583,9585,9587],{"class":1311,"line":1502},[1309,9584,9526],{"class":2234},[1309,9586,2239],{"class":2238},[1309,9588,9531],{"class":1546},[1309,9590,9591,9593],{"class":1311,"line":1507},[1309,9592,9536],{"class":2234},[1309,9594,2261],{"class":2238},[1309,9596,9597,9599],{"class":1311,"line":1513},[1309,9598,9543],{"class":2234},[1309,9600,2261],{"class":2238},[1309,9602,9603,9605,9607],{"class":1311,"line":1521},[1309,9604,9550],{"class":2234},[1309,9606,2239],{"class":2238},[1309,9608,3766],{"class":1546},[1309,9610,9611,9613],{"class":1311,"line":1526},[1309,9612,8059],{"class":2234},[1309,9614,2261],{"class":2238},[1309,9616,9617,9619,9621],{"class":1311,"line":1532},[1309,9618,9565],{"class":2234},[1309,9620,2239],{"class":2238},[1309,9622,1640],{"class":2466},[1030,9624,9626],{"id":9625},"cicd-pipeline","CI/CD Pipeline",[1038,9628,9630],{"id":9629},"github-actions-workflow","GitHub Actions Workflow",[1299,9632,9634],{"className":2220,"code":9633,"language":2222,"meta":1304,"style":1304},"# .github/workflows/deploy.yml\nname: Deploy Microservices\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        service: [user-service, order-service]\n    \n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v3\n    \n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: '3.11'\n    \n    - name: Install dependencies\n      run: |\n        cd ${{ matrix.service }}\n        pip install -r requirements.txt\n        pip install -r requirements-test.txt\n    \n    - name: Run tests\n      run: |\n        cd ${{ matrix.service }}\n        pytest --cov --cov-report=xml\n    \n    - name: Upload coverage\n      uses: codecov/codecov-action@v3\n      with:\n        file: ${{ matrix.service }}/coverage.xml\n\n  build-and-push:\n    needs: test\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs/heads/main'\n    strategy:\n      matrix:\n        service: [user-service, order-service]\n    \n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v3\n    \n    - name: Set up Docker Buildx\n      uses: docker/setup-buildx-action@v2\n    \n    - name: Log in to Container Registry\n      uses: docker/login-action@v2\n      with:\n        registry: ${{ env.REGISTRY }}\n        username: ${{ github.actor }}\n        password: ${{ secrets.GITHUB_TOKEN }}\n    \n    - name: Extract metadata\n      id: meta\n      uses: docker/metadata-action@v4\n      with:\n        images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ matrix.service }}\n        tags: |\n          type=ref,event=branch\n          type=ref,event=pr\n          type=sha,prefix={{branch}}-\n          type=raw,value=latest,enable={{is_default_branch}}\n    \n    - name: Build and push Docker image\n      uses: docker/build-push-action@v4\n      with:\n        context: ./${{ matrix.service }}\n        push: true\n        tags: ${{ steps.meta.outputs.tags }}\n        labels: ${{ steps.meta.outputs.labels }}\n        cache-from: type=gha\n        cache-to: type=gha,mode=max\n\n  deploy-staging:\n    needs: build-and-push\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs/heads/main'\n    environment: staging\n    \n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v3\n    \n    - name: Set up kubectl\n      uses: azure/setup-kubectl@v3\n      with:\n        version: 'v1.27.0'\n    \n    - name: Configure kubectl\n      run: |\n        echo \"${{ secrets.KUBE_CONFIG_STAGING }}\" | base64 -d > kubeconfig\n        export KUBECONFIG=kubeconfig\n    \n    - name: Deploy to staging\n      run: |\n        export KUBECONFIG=kubeconfig\n        \n        # Update image tags in deployment files\n        sed -i \"s|your-registry/user-service:latest|${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/user-service:${{ github.sha }}|g\" k8s/user-service.yaml\n        sed -i \"s|your-registry/order-service:latest|${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/order-service:${{ github.sha }}|g\" k8s/order-service.yaml\n        \n        # Apply Kubernetes manifests\n        kubectl apply -f k8s/namespace.yaml\n        kubectl apply -f k8s/configmap.yaml\n        kubectl apply -f k8s/secrets.yaml\n        kubectl apply -f k8s/postgres.yaml\n        kubectl apply -f k8s/redis.yaml\n        kubectl apply -f k8s/rabbitmq.yaml\n        kubectl apply -f k8s/user-service.yaml\n        kubectl apply -f k8s/order-service.yaml\n        kubectl apply -f k8s/hpa.yaml\n        kubectl apply -f k8s/ingress.yaml\n        \n        # Wait for deployments to be ready\n        kubectl rollout status deployment/user-service -n microservices --timeout=300s\n        kubectl rollout status deployment/order-service -n microservices --timeout=300s\n\n  deploy-production:\n    needs: deploy-staging\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs/heads/main'\n    environment: production\n    \n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v3\n    \n    - name: Set up kubectl\n      uses: azure/setup-kubectl@v3\n      with:\n        version: 'v1.27.0'\n    \n    - name: Configure kubectl\n      run: |\n        echo \"${{ secrets.KUBE_CONFIG_PRODUCTION }}\" | base64 -d > kubeconfig\n        export KUBECONFIG=kubeconfig\n    \n    - name: Deploy to production\n      run: |\n        export KUBECONFIG=kubeconfig\n        \n        # Update image tags\n        sed -i \"s|your-registry/user-service:latest|${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/user-service:${{ github.sha }}|g\" k8s/user-service.yaml\n        sed -i \"s|your-registry/order-service:latest|${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/order-service:${{ github.sha }}|g\" k8s/order-service.yaml\n        \n        # Rolling update deployment\n        kubectl set image deployment/user-service user-service=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/user-service:${{ github.sha }} -n microservices\n        kubectl set image deployment/order-service order-service=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/order-service:${{ github.sha }} -n microservices\n        \n        # Wait for rollout to complete\n        kubectl rollout status deployment/user-service -n microservices --timeout=600s\n        kubectl rollout status deployment/order-service -n microservices --timeout=600s\n",[1306,9635,9636,9641,9651,9655,9663,9670,9685,9692,9704,9708,9715,9725,9735,9739,9746,9753,9763,9770,9777,9796,9800,9807,9818,9828,9832,9843,9852,9859,9873,9877,9888,9898,9903,9908,9913,9917,9928,9936,9940,9945,9949,9960,9969,9975,9985,9989,9996,10006,10014,10024,10030,10036,10052,10056,10062,10072,10080,10084,10095,10104,10108,10119,10128,10134,10144,10154,10164,10168,10179,10189,10198,10204,10214,10223,10228,10233,10238,10243,10247,10258,10267,10273,10283,10293,10302,10312,10322,10332,10336,10343,10352,10360,10368,10377,10381,10387,10397,10405,10409,10420,10429,10435,10449,10453,10464,10472,10477,10482,10486,10497,10505,10509,10513,10518,10523,10528,10532,10537,10542,10547,10552,10557,10562,10567,10572,10577,10582,10587,10591,10596,10601,10606,10610,10617,10626,10634,10642,10650,10654,10660,10670,10678,10682,10692,10700,10706,10718,10722,10732,10740,10745,10749,10753,10764,10772,10776,10780,10785,10789,10793,10797,10802,10807,10812,10816,10821,10826],{"__ignoreMap":1304},[1309,9637,9638],{"class":1311,"line":1312},[1309,9639,9640],{"class":1315},"# .github/workflows/deploy.yml\n",[1309,9642,9643,9646,9648],{"class":1311,"line":1319},[1309,9644,9645],{"class":2234},"name",[1309,9647,2239],{"class":2238},[1309,9649,9650],{"class":1546}," Deploy Microservices\n",[1309,9652,9653],{"class":1311,"line":1325},[1309,9654,1340],{"emptyLinePlaceholder":1339},[1309,9656,9657,9661],{"class":1311,"line":1336},[1309,9658,9660],{"class":9659},"sq3J1","on",[1309,9662,2261],{"class":2238},[1309,9664,9665,9668],{"class":1311,"line":1343},[1309,9666,9667],{"class":2234},"  push",[1309,9669,2261],{"class":2238},[1309,9671,9672,9675,9677,9679,9682],{"class":1311,"line":1349},[1309,9673,9674],{"class":2234},"    branches",[1309,9676,2239],{"class":2238},[1309,9678,1666],{"class":2238},[1309,9680,9681],{"class":1546}," main",[1309,9683,9684],{"class":2238}," ]\n",[1309,9686,9687,9690],{"class":1311,"line":1355},[1309,9688,9689],{"class":2234},"  pull_request",[1309,9691,2261],{"class":2238},[1309,9693,9694,9696,9698,9700,9702],{"class":1311,"line":1361},[1309,9695,9674],{"class":2234},[1309,9697,2239],{"class":2238},[1309,9699,1666],{"class":2238},[1309,9701,9681],{"class":1546},[1309,9703,9684],{"class":2238},[1309,9705,9706],{"class":1311,"line":1370},[1309,9707,1340],{"emptyLinePlaceholder":1339},[1309,9709,9710,9713],{"class":1311,"line":1378},[1309,9711,9712],{"class":2234},"env",[1309,9714,2261],{"class":2238},[1309,9716,9717,9720,9722],{"class":1311,"line":1386},[1309,9718,9719],{"class":2234},"  REGISTRY",[1309,9721,2239],{"class":2238},[1309,9723,9724],{"class":1546}," ghcr.io\n",[1309,9726,9727,9730,9732],{"class":1311,"line":1391},[1309,9728,9729],{"class":2234},"  IMAGE_NAME",[1309,9731,2239],{"class":2238},[1309,9733,9734],{"class":1546}," ${{ github.repository }}\n",[1309,9736,9737],{"class":1311,"line":1397},[1309,9738,1340],{"emptyLinePlaceholder":1339},[1309,9740,9741,9744],{"class":1311,"line":1406},[1309,9742,9743],{"class":2234},"jobs",[1309,9745,2261],{"class":2238},[1309,9747,9748,9751],{"class":1311,"line":1411},[1309,9749,9750],{"class":2234},"  test",[1309,9752,2261],{"class":2238},[1309,9754,9755,9758,9760],{"class":1311,"line":1417},[1309,9756,9757],{"class":2234},"    runs-on",[1309,9759,2239],{"class":2238},[1309,9761,9762],{"class":1546}," ubuntu-latest\n",[1309,9764,9765,9768],{"class":1311,"line":1423},[1309,9766,9767],{"class":2234},"    strategy",[1309,9769,2261],{"class":2238},[1309,9771,9772,9775],{"class":1311,"line":1432},[1309,9773,9774],{"class":2234},"      matrix",[1309,9776,2261],{"class":2238},[1309,9778,9779,9782,9784,9786,9789,9791,9794],{"class":1311,"line":1438},[1309,9780,9781],{"class":2234},"        service",[1309,9783,2239],{"class":2238},[1309,9785,1666],{"class":2238},[1309,9787,9788],{"class":1546},"user-service",[1309,9790,2427],{"class":2238},[1309,9792,9793],{"class":1546}," order-service",[1309,9795,1698],{"class":2238},[1309,9797,9798],{"class":1311,"line":1444},[1309,9799,4263],{"class":1332},[1309,9801,9802,9805],{"class":1311,"line":1450},[1309,9803,9804],{"class":2234},"    steps",[1309,9806,2261],{"class":2238},[1309,9808,9809,9811,9813,9815],{"class":1311,"line":1456},[1309,9810,5599],{"class":2238},[1309,9812,7101],{"class":2234},[1309,9814,2239],{"class":2238},[1309,9816,9817],{"class":1546}," Checkout code\n",[1309,9819,9820,9823,9825],{"class":1311,"line":1462},[1309,9821,9822],{"class":2234},"      uses",[1309,9824,2239],{"class":2238},[1309,9826,9827],{"class":1546}," actions/checkout@v3\n",[1309,9829,9830],{"class":1311,"line":1468},[1309,9831,4263],{"class":1332},[1309,9833,9834,9836,9838,9840],{"class":1311,"line":1473},[1309,9835,5599],{"class":2238},[1309,9837,7101],{"class":2234},[1309,9839,2239],{"class":2238},[1309,9841,9842],{"class":1546}," Set up Python\n",[1309,9844,9845,9847,9849],{"class":1311,"line":1479},[1309,9846,9822],{"class":2234},[1309,9848,2239],{"class":2238},[1309,9850,9851],{"class":1546}," actions/setup-python@v4\n",[1309,9853,9854,9857],{"class":1311,"line":1485},[1309,9855,9856],{"class":2234},"      with",[1309,9858,2261],{"class":2238},[1309,9860,9861,9864,9866,9868,9871],{"class":1311,"line":1494},[1309,9862,9863],{"class":2234},"        python-version",[1309,9865,2239],{"class":2238},[1309,9867,2243],{"class":2242},[1309,9869,9870],{"class":1546},"3.11",[1309,9872,2249],{"class":2242},[1309,9874,9875],{"class":1311,"line":1502},[1309,9876,4263],{"class":1332},[1309,9878,9879,9881,9883,9885],{"class":1311,"line":1507},[1309,9880,5599],{"class":2238},[1309,9882,7101],{"class":2234},[1309,9884,2239],{"class":2238},[1309,9886,9887],{"class":1546}," Install dependencies\n",[1309,9889,9890,9893,9895],{"class":1311,"line":1513},[1309,9891,9892],{"class":2234},"      run",[1309,9894,2239],{"class":2238},[1309,9896,9897],{"class":3051}," |\n",[1309,9899,9900],{"class":1311,"line":1521},[1309,9901,9902],{"class":1546},"        cd ${{ matrix.service }}\n",[1309,9904,9905],{"class":1311,"line":1526},[1309,9906,9907],{"class":1546},"        pip install -r requirements.txt\n",[1309,9909,9910],{"class":1311,"line":1532},[1309,9911,9912],{"class":1546},"        pip install -r requirements-test.txt\n",[1309,9914,9915],{"class":1311,"line":1538},[1309,9916,4263],{"class":1546},[1309,9918,9919,9921,9923,9925],{"class":1311,"line":1553},[1309,9920,5599],{"class":2238},[1309,9922,7101],{"class":2234},[1309,9924,2239],{"class":2238},[1309,9926,9927],{"class":1546}," Run tests\n",[1309,9929,9930,9932,9934],{"class":1311,"line":1561},[1309,9931,9892],{"class":2234},[1309,9933,2239],{"class":2238},[1309,9935,9897],{"class":3051},[1309,9937,9938],{"class":1311,"line":1569},[1309,9939,9902],{"class":1546},[1309,9941,9942],{"class":1311,"line":1574},[1309,9943,9944],{"class":1546},"        pytest --cov --cov-report=xml\n",[1309,9946,9947],{"class":1311,"line":1580},[1309,9948,4263],{"class":1546},[1309,9950,9951,9953,9955,9957],{"class":1311,"line":1586},[1309,9952,5599],{"class":2238},[1309,9954,7101],{"class":2234},[1309,9956,2239],{"class":2238},[1309,9958,9959],{"class":1546}," Upload coverage\n",[1309,9961,9962,9964,9966],{"class":1311,"line":1594},[1309,9963,9822],{"class":2234},[1309,9965,2239],{"class":2238},[1309,9967,9968],{"class":1546}," codecov/codecov-action@v3\n",[1309,9970,9971,9973],{"class":1311,"line":1599},[1309,9972,9856],{"class":2234},[1309,9974,2261],{"class":2238},[1309,9976,9977,9980,9982],{"class":1311,"line":1605},[1309,9978,9979],{"class":2234},"        file",[1309,9981,2239],{"class":2238},[1309,9983,9984],{"class":1546}," ${{ matrix.service }}/coverage.xml\n",[1309,9986,9987],{"class":1311,"line":1614},[1309,9988,1340],{"emptyLinePlaceholder":1339},[1309,9990,9991,9994],{"class":1311,"line":1623},[1309,9992,9993],{"class":2234},"  build-and-push",[1309,9995,2261],{"class":2238},[1309,9997,9998,10001,10003],{"class":1311,"line":1628},[1309,9999,10000],{"class":2234},"    needs",[1309,10002,2239],{"class":2238},[1309,10004,10005],{"class":1546}," test\n",[1309,10007,10008,10010,10012],{"class":1311,"line":1634},[1309,10009,9757],{"class":2234},[1309,10011,2239],{"class":2238},[1309,10013,9762],{"class":1546},[1309,10015,10016,10019,10021],{"class":1311,"line":1643},[1309,10017,10018],{"class":2234},"    if",[1309,10020,2239],{"class":2238},[1309,10022,10023],{"class":1546}," github.ref == 'refs/heads/main'\n",[1309,10025,10026,10028],{"class":1311,"line":1648},[1309,10027,9767],{"class":2234},[1309,10029,2261],{"class":2238},[1309,10031,10032,10034],{"class":1311,"line":1654},[1309,10033,9774],{"class":2234},[1309,10035,2261],{"class":2238},[1309,10037,10038,10040,10042,10044,10046,10048,10050],{"class":1311,"line":1660},[1309,10039,9781],{"class":2234},[1309,10041,2239],{"class":2238},[1309,10043,1666],{"class":2238},[1309,10045,9788],{"class":1546},[1309,10047,2427],{"class":2238},[1309,10049,9793],{"class":1546},[1309,10051,1698],{"class":2238},[1309,10053,10054],{"class":1311,"line":2043},[1309,10055,4263],{"class":1332},[1309,10057,10058,10060],{"class":1311,"line":2050},[1309,10059,9804],{"class":2234},[1309,10061,2261],{"class":2238},[1309,10063,10064,10066,10068,10070],{"class":1311,"line":2055},[1309,10065,5599],{"class":2238},[1309,10067,7101],{"class":2234},[1309,10069,2239],{"class":2238},[1309,10071,9817],{"class":1546},[1309,10073,10074,10076,10078],{"class":1311,"line":2061},[1309,10075,9822],{"class":2234},[1309,10077,2239],{"class":2238},[1309,10079,9827],{"class":1546},[1309,10081,10082],{"class":1311,"line":2073},[1309,10083,4263],{"class":1332},[1309,10085,10086,10088,10090,10092],{"class":1311,"line":2085},[1309,10087,5599],{"class":2238},[1309,10089,7101],{"class":2234},[1309,10091,2239],{"class":2238},[1309,10093,10094],{"class":1546}," Set up Docker Buildx\n",[1309,10096,10097,10099,10101],{"class":1311,"line":2098},[1309,10098,9822],{"class":2234},[1309,10100,2239],{"class":2238},[1309,10102,10103],{"class":1546}," docker/setup-buildx-action@v2\n",[1309,10105,10106],{"class":1311,"line":2111},[1309,10107,4263],{"class":1332},[1309,10109,10110,10112,10114,10116],{"class":1311,"line":2124},[1309,10111,5599],{"class":2238},[1309,10113,7101],{"class":2234},[1309,10115,2239],{"class":2238},[1309,10117,10118],{"class":1546}," Log in to Container Registry\n",[1309,10120,10121,10123,10125],{"class":1311,"line":2136},[1309,10122,9822],{"class":2234},[1309,10124,2239],{"class":2238},[1309,10126,10127],{"class":1546}," docker/login-action@v2\n",[1309,10129,10130,10132],{"class":1311,"line":2149},[1309,10131,9856],{"class":2234},[1309,10133,2261],{"class":2238},[1309,10135,10136,10139,10141],{"class":1311,"line":2162},[1309,10137,10138],{"class":2234},"        registry",[1309,10140,2239],{"class":2238},[1309,10142,10143],{"class":1546}," ${{ env.REGISTRY }}\n",[1309,10145,10146,10149,10151],{"class":1311,"line":2175},[1309,10147,10148],{"class":2234},"        username",[1309,10150,2239],{"class":2238},[1309,10152,10153],{"class":1546}," ${{ github.actor }}\n",[1309,10155,10156,10159,10161],{"class":1311,"line":2786},[1309,10157,10158],{"class":2234},"        password",[1309,10160,2239],{"class":2238},[1309,10162,10163],{"class":1546}," ${{ secrets.GITHUB_TOKEN }}\n",[1309,10165,10166],{"class":1311,"line":2797},[1309,10167,4263],{"class":1332},[1309,10169,10170,10172,10174,10176],{"class":1311,"line":2808},[1309,10171,5599],{"class":2238},[1309,10173,7101],{"class":2234},[1309,10175,2239],{"class":2238},[1309,10177,10178],{"class":1546}," Extract metadata\n",[1309,10180,10181,10184,10186],{"class":1311,"line":2819},[1309,10182,10183],{"class":2234},"      id",[1309,10185,2239],{"class":2238},[1309,10187,10188],{"class":1546}," meta\n",[1309,10190,10191,10193,10195],{"class":1311,"line":2829},[1309,10192,9822],{"class":2234},[1309,10194,2239],{"class":2238},[1309,10196,10197],{"class":1546}," docker/metadata-action@v4\n",[1309,10199,10200,10202],{"class":1311,"line":2836},[1309,10201,9856],{"class":2234},[1309,10203,2261],{"class":2238},[1309,10205,10206,10209,10211],{"class":1311,"line":2848},[1309,10207,10208],{"class":2234},"        images",[1309,10210,2239],{"class":2238},[1309,10212,10213],{"class":1546}," ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ matrix.service }}\n",[1309,10215,10216,10219,10221],{"class":1311,"line":2855},[1309,10217,10218],{"class":2234},"        tags",[1309,10220,2239],{"class":2238},[1309,10222,9897],{"class":3051},[1309,10224,10225],{"class":1311,"line":2861},[1309,10226,10227],{"class":1546},"          type=ref,event=branch\n",[1309,10229,10230],{"class":1311,"line":2869},[1309,10231,10232],{"class":1546},"          type=ref,event=pr\n",[1309,10234,10235],{"class":1311,"line":2875},[1309,10236,10237],{"class":1546},"          type=sha,prefix={{branch}}-\n",[1309,10239,10240],{"class":1311,"line":2883},[1309,10241,10242],{"class":1546},"          type=raw,value=latest,enable={{is_default_branch}}\n",[1309,10244,10245],{"class":1311,"line":2889},[1309,10246,4263],{"class":1546},[1309,10248,10249,10251,10253,10255],{"class":1311,"line":2897},[1309,10250,5599],{"class":2238},[1309,10252,7101],{"class":2234},[1309,10254,2239],{"class":2238},[1309,10256,10257],{"class":1546}," Build and push Docker image\n",[1309,10259,10260,10262,10264],{"class":1311,"line":2903},[1309,10261,9822],{"class":2234},[1309,10263,2239],{"class":2238},[1309,10265,10266],{"class":1546}," docker/build-push-action@v4\n",[1309,10268,10269,10271],{"class":1311,"line":2911},[1309,10270,9856],{"class":2234},[1309,10272,2261],{"class":2238},[1309,10274,10275,10278,10280],{"class":1311,"line":2919},[1309,10276,10277],{"class":2234},"        context",[1309,10279,2239],{"class":2238},[1309,10281,10282],{"class":1546}," ./${{ matrix.service }}\n",[1309,10284,10285,10288,10290],{"class":1311,"line":2927},[1309,10286,10287],{"class":2234},"        push",[1309,10289,2239],{"class":2238},[1309,10291,10292],{"class":9659}," true\n",[1309,10294,10295,10297,10299],{"class":1311,"line":2935},[1309,10296,10218],{"class":2234},[1309,10298,2239],{"class":2238},[1309,10300,10301],{"class":1546}," ${{ steps.meta.outputs.tags }}\n",[1309,10303,10304,10307,10309],{"class":1311,"line":2946},[1309,10305,10306],{"class":2234},"        labels",[1309,10308,2239],{"class":2238},[1309,10310,10311],{"class":1546}," ${{ steps.meta.outputs.labels }}\n",[1309,10313,10314,10317,10319],{"class":1311,"line":2954},[1309,10315,10316],{"class":2234},"        cache-from",[1309,10318,2239],{"class":2238},[1309,10320,10321],{"class":1546}," type=gha\n",[1309,10323,10324,10327,10329],{"class":1311,"line":2964},[1309,10325,10326],{"class":2234},"        cache-to",[1309,10328,2239],{"class":2238},[1309,10330,10331],{"class":1546}," type=gha,mode=max\n",[1309,10333,10334],{"class":1311,"line":2972},[1309,10335,1340],{"emptyLinePlaceholder":1339},[1309,10337,10338,10341],{"class":1311,"line":2981},[1309,10339,10340],{"class":2234},"  deploy-staging",[1309,10342,2261],{"class":2238},[1309,10344,10345,10347,10349],{"class":1311,"line":2988},[1309,10346,10000],{"class":2234},[1309,10348,2239],{"class":2238},[1309,10350,10351],{"class":1546}," build-and-push\n",[1309,10353,10354,10356,10358],{"class":1311,"line":2995},[1309,10355,9757],{"class":2234},[1309,10357,2239],{"class":2238},[1309,10359,9762],{"class":1546},[1309,10361,10362,10364,10366],{"class":1311,"line":3002},[1309,10363,10018],{"class":2234},[1309,10365,2239],{"class":2238},[1309,10367,10023],{"class":1546},[1309,10369,10370,10372,10374],{"class":1311,"line":3008},[1309,10371,2298],{"class":2234},[1309,10373,2239],{"class":2238},[1309,10375,10376],{"class":1546}," staging\n",[1309,10378,10379],{"class":1311,"line":3016},[1309,10380,4263],{"class":1332},[1309,10382,10383,10385],{"class":1311,"line":3022},[1309,10384,9804],{"class":2234},[1309,10386,2261],{"class":2238},[1309,10388,10389,10391,10393,10395],{"class":1311,"line":3030},[1309,10390,5599],{"class":2238},[1309,10392,7101],{"class":2234},[1309,10394,2239],{"class":2238},[1309,10396,9817],{"class":1546},[1309,10398,10399,10401,10403],{"class":1311,"line":3038},[1309,10400,9822],{"class":2234},[1309,10402,2239],{"class":2238},[1309,10404,9827],{"class":1546},[1309,10406,10407],{"class":1311,"line":3044},[1309,10408,4263],{"class":1332},[1309,10410,10411,10413,10415,10417],{"class":1311,"line":3055},[1309,10412,5599],{"class":2238},[1309,10414,7101],{"class":2234},[1309,10416,2239],{"class":2238},[1309,10418,10419],{"class":1546}," Set up kubectl\n",[1309,10421,10422,10424,10426],{"class":1311,"line":3061},[1309,10423,9822],{"class":2234},[1309,10425,2239],{"class":2238},[1309,10427,10428],{"class":1546}," azure/setup-kubectl@v3\n",[1309,10430,10431,10433],{"class":1311,"line":3067},[1309,10432,9856],{"class":2234},[1309,10434,2261],{"class":2238},[1309,10436,10437,10440,10442,10444,10447],{"class":1311,"line":3073},[1309,10438,10439],{"class":2234},"        version",[1309,10441,2239],{"class":2238},[1309,10443,2243],{"class":2242},[1309,10445,10446],{"class":1546},"v1.27.0",[1309,10448,2249],{"class":2242},[1309,10450,10451],{"class":1311,"line":3084},[1309,10452,4263],{"class":1332},[1309,10454,10455,10457,10459,10461],{"class":1311,"line":3089},[1309,10456,5599],{"class":2238},[1309,10458,7101],{"class":2234},[1309,10460,2239],{"class":2238},[1309,10462,10463],{"class":1546}," Configure kubectl\n",[1309,10465,10466,10468,10470],{"class":1311,"line":3095},[1309,10467,9892],{"class":2234},[1309,10469,2239],{"class":2238},[1309,10471,9897],{"class":3051},[1309,10473,10474],{"class":1311,"line":3103},[1309,10475,10476],{"class":1546},"        echo \"${{ secrets.KUBE_CONFIG_STAGING }}\" | base64 -d > kubeconfig\n",[1309,10478,10479],{"class":1311,"line":3112},[1309,10480,10481],{"class":1546},"        export KUBECONFIG=kubeconfig\n",[1309,10483,10484],{"class":1311,"line":3122},[1309,10485,4263],{"class":1546},[1309,10487,10488,10490,10492,10494],{"class":1311,"line":3129},[1309,10489,5599],{"class":2238},[1309,10491,7101],{"class":2234},[1309,10493,2239],{"class":2238},[1309,10495,10496],{"class":1546}," Deploy to staging\n",[1309,10498,10499,10501,10503],{"class":1311,"line":3136},[1309,10500,9892],{"class":2234},[1309,10502,2239],{"class":2238},[1309,10504,9897],{"class":3051},[1309,10506,10507],{"class":1311,"line":3143},[1309,10508,10481],{"class":1546},[1309,10510,10511],{"class":1311,"line":3150},[1309,10512,4473],{"class":1546},[1309,10514,10515],{"class":1311,"line":3157},[1309,10516,10517],{"class":1546},"        # Update image tags in deployment files\n",[1309,10519,10520],{"class":1311,"line":3164},[1309,10521,10522],{"class":1546},"        sed -i \"s|your-registry/user-service:latest|${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/user-service:${{ github.sha }}|g\" k8s/user-service.yaml\n",[1309,10524,10525],{"class":1311,"line":3171},[1309,10526,10527],{"class":1546},"        sed -i \"s|your-registry/order-service:latest|${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/order-service:${{ github.sha }}|g\" k8s/order-service.yaml\n",[1309,10529,10530],{"class":1311,"line":3180},[1309,10531,4473],{"class":1546},[1309,10533,10534],{"class":1311,"line":3187},[1309,10535,10536],{"class":1546},"        # Apply Kubernetes manifests\n",[1309,10538,10539],{"class":1311,"line":3196},[1309,10540,10541],{"class":1546},"        kubectl apply -f k8s/namespace.yaml\n",[1309,10543,10544],{"class":1311,"line":3203},[1309,10545,10546],{"class":1546},"        kubectl apply -f k8s/configmap.yaml\n",[1309,10548,10549],{"class":1311,"line":3212},[1309,10550,10551],{"class":1546},"        kubectl apply -f k8s/secrets.yaml\n",[1309,10553,10554],{"class":1311,"line":3219},[1309,10555,10556],{"class":1546},"        kubectl apply -f k8s/postgres.yaml\n",[1309,10558,10559],{"class":1311,"line":3226},[1309,10560,10561],{"class":1546},"        kubectl apply -f k8s/redis.yaml\n",[1309,10563,10564],{"class":1311,"line":3233},[1309,10565,10566],{"class":1546},"        kubectl apply -f k8s/rabbitmq.yaml\n",[1309,10568,10569],{"class":1311,"line":3240},[1309,10570,10571],{"class":1546},"        kubectl apply -f k8s/user-service.yaml\n",[1309,10573,10574],{"class":1311,"line":3250},[1309,10575,10576],{"class":1546},"        kubectl apply -f k8s/order-service.yaml\n",[1309,10578,10579],{"class":1311,"line":3259},[1309,10580,10581],{"class":1546},"        kubectl apply -f k8s/hpa.yaml\n",[1309,10583,10584],{"class":1311,"line":3264},[1309,10585,10586],{"class":1546},"        kubectl apply -f k8s/ingress.yaml\n",[1309,10588,10589],{"class":1311,"line":3272},[1309,10590,4473],{"class":1546},[1309,10592,10593],{"class":1311,"line":3282},[1309,10594,10595],{"class":1546},"        # Wait for deployments to be ready\n",[1309,10597,10598],{"class":1311,"line":3292},[1309,10599,10600],{"class":1546},"        kubectl rollout status deployment/user-service -n microservices --timeout=300s\n",[1309,10602,10603],{"class":1311,"line":3299},[1309,10604,10605],{"class":1546},"        kubectl rollout status deployment/order-service -n microservices --timeout=300s\n",[1309,10607,10608],{"class":1311,"line":3311},[1309,10609,1340],{"emptyLinePlaceholder":1339},[1309,10611,10612,10615],{"class":1311,"line":3318},[1309,10613,10614],{"class":2234},"  deploy-production",[1309,10616,2261],{"class":2238},[1309,10618,10619,10621,10623],{"class":1311,"line":3325},[1309,10620,10000],{"class":2234},[1309,10622,2239],{"class":2238},[1309,10624,10625],{"class":1546}," deploy-staging\n",[1309,10627,10628,10630,10632],{"class":1311,"line":3332},[1309,10629,9757],{"class":2234},[1309,10631,2239],{"class":2238},[1309,10633,9762],{"class":1546},[1309,10635,10636,10638,10640],{"class":1311,"line":3339},[1309,10637,10018],{"class":2234},[1309,10639,2239],{"class":2238},[1309,10641,10023],{"class":1546},[1309,10643,10644,10646,10648],{"class":1311,"line":3347},[1309,10645,2298],{"class":2234},[1309,10647,2239],{"class":2238},[1309,10649,6107],{"class":1546},[1309,10651,10652],{"class":1311,"line":3355},[1309,10653,4263],{"class":1332},[1309,10655,10656,10658],{"class":1311,"line":3362},[1309,10657,9804],{"class":2234},[1309,10659,2261],{"class":2238},[1309,10661,10662,10664,10666,10668],{"class":1311,"line":3369},[1309,10663,5599],{"class":2238},[1309,10665,7101],{"class":2234},[1309,10667,2239],{"class":2238},[1309,10669,9817],{"class":1546},[1309,10671,10672,10674,10676],{"class":1311,"line":3378},[1309,10673,9822],{"class":2234},[1309,10675,2239],{"class":2238},[1309,10677,9827],{"class":1546},[1309,10679,10680],{"class":1311,"line":3385},[1309,10681,4263],{"class":1332},[1309,10683,10684,10686,10688,10690],{"class":1311,"line":3394},[1309,10685,5599],{"class":2238},[1309,10687,7101],{"class":2234},[1309,10689,2239],{"class":2238},[1309,10691,10419],{"class":1546},[1309,10693,10694,10696,10698],{"class":1311,"line":3401},[1309,10695,9822],{"class":2234},[1309,10697,2239],{"class":2238},[1309,10699,10428],{"class":1546},[1309,10701,10702,10704],{"class":1311,"line":3410},[1309,10703,9856],{"class":2234},[1309,10705,2261],{"class":2238},[1309,10707,10708,10710,10712,10714,10716],{"class":1311,"line":3418},[1309,10709,10439],{"class":2234},[1309,10711,2239],{"class":2238},[1309,10713,2243],{"class":2242},[1309,10715,10446],{"class":1546},[1309,10717,2249],{"class":2242},[1309,10719,10720],{"class":1311,"line":3427},[1309,10721,4263],{"class":1332},[1309,10723,10724,10726,10728,10730],{"class":1311,"line":3434},[1309,10725,5599],{"class":2238},[1309,10727,7101],{"class":2234},[1309,10729,2239],{"class":2238},[1309,10731,10463],{"class":1546},[1309,10733,10734,10736,10738],{"class":1311,"line":3441},[1309,10735,9892],{"class":2234},[1309,10737,2239],{"class":2238},[1309,10739,9897],{"class":3051},[1309,10741,10742],{"class":1311,"line":3448},[1309,10743,10744],{"class":1546},"        echo \"${{ secrets.KUBE_CONFIG_PRODUCTION }}\" | base64 -d > kubeconfig\n",[1309,10746,10747],{"class":1311,"line":3456},[1309,10748,10481],{"class":1546},[1309,10750,10751],{"class":1311,"line":3465},[1309,10752,4263],{"class":1546},[1309,10754,10755,10757,10759,10761],{"class":1311,"line":3470},[1309,10756,5599],{"class":2238},[1309,10758,7101],{"class":2234},[1309,10760,2239],{"class":2238},[1309,10762,10763],{"class":1546}," Deploy to production\n",[1309,10765,10766,10768,10770],{"class":1311,"line":3475},[1309,10767,9892],{"class":2234},[1309,10769,2239],{"class":2238},[1309,10771,9897],{"class":3051},[1309,10773,10774],{"class":1311,"line":3484},[1309,10775,10481],{"class":1546},[1309,10777,10778],{"class":1311,"line":3489},[1309,10779,4473],{"class":1546},[1309,10781,10782],{"class":1311,"line":3497},[1309,10783,10784],{"class":1546},"        # Update image tags\n",[1309,10786,10787],{"class":1311,"line":3506},[1309,10788,10522],{"class":1546},[1309,10790,10791],{"class":1311,"line":3516},[1309,10792,10527],{"class":1546},[1309,10794,10795],{"class":1311,"line":3523},[1309,10796,4473],{"class":1546},[1309,10798,10799],{"class":1311,"line":3530},[1309,10800,10801],{"class":1546},"        # Rolling update deployment\n",[1309,10803,10804],{"class":1311,"line":3537},[1309,10805,10806],{"class":1546},"        kubectl set image deployment/user-service user-service=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/user-service:${{ github.sha }} -n microservices\n",[1309,10808,10809],{"class":1311,"line":3544},[1309,10810,10811],{"class":1546},"        kubectl set image deployment/order-service order-service=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/order-service:${{ github.sha }} -n microservices\n",[1309,10813,10814],{"class":1311,"line":3551},[1309,10815,4473],{"class":1546},[1309,10817,10818],{"class":1311,"line":3558},[1309,10819,10820],{"class":1546},"        # Wait for rollout to complete\n",[1309,10822,10823],{"class":1311,"line":3565},[1309,10824,10825],{"class":1546},"        kubectl rollout status deployment/user-service -n microservices --timeout=600s\n",[1309,10827,10828],{"class":1311,"line":3574},[1309,10829,10830],{"class":1546},"        kubectl rollout status deployment/order-service -n microservices --timeout=600s\n",[1030,10832,10834],{"id":10833},"cloud-platform-deployments","Cloud Platform Deployments",[1038,10836,10838],{"id":10837},"aws-ecs-deployment","AWS ECS Deployment",[1299,10840,10844],{"className":10841,"code":10842,"language":10843,"meta":1304,"style":1304},"language-json shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","{\n  \"family\": \"user-service\",\n  \"networkMode\": \"awsvpc\",\n  \"requiresCompatibilities\": [\"FARGATE\"],\n  \"cpu\": \"512\",\n  \"memory\": \"1024\",\n  \"executionRoleArn\": \"arn:aws:iam::123456789012:role/ecsTaskExecutionRole\",\n  \"taskRoleArn\": \"arn:aws:iam::123456789012:role/ecsTaskRole\",\n  \"containerDefinitions\": [\n    {\n      \"name\": \"user-service\",\n      \"image\": \"your-account.dkr.ecr.us-west-2.amazonaws.com/user-service:latest\",\n      \"portMappings\": [\n        {\n          \"containerPort\": 8000,\n          \"protocol\": \"tcp\"\n        }\n      ],\n      \"environment\": [\n        {\n          \"name\": \"DJANGO_SETTINGS_MODULE\",\n          \"value\": \"user_service.settings.production\"\n        }\n      ],\n      \"secrets\": [\n        {\n          \"name\": \"DATABASE_URL\",\n          \"valueFrom\": \"arn:aws:secretsmanager:us-west-2:123456789012:secret:microservices/database-url\"\n        },\n        {\n          \"name\": \"DJANGO_SECRET_KEY\",\n          \"valueFrom\": \"arn:aws:secretsmanager:us-west-2:123456789012:secret:microservices/django-secret\"\n        }\n      ],\n      \"logConfiguration\": {\n        \"logDriver\": \"awslogs\",\n        \"options\": {\n          \"awslogs-group\": \"/ecs/user-service\",\n          \"awslogs-region\": \"us-west-2\",\n          \"awslogs-stream-prefix\": \"ecs\"\n        }\n      },\n      \"healthCheck\": {\n        \"command\": [\n          \"CMD-SHELL\",\n          \"curl -f http://localhost:8000/health/ || exit 1\"\n        ],\n        \"interval\": 30,\n        \"timeout\": 5,\n        \"retries\": 3,\n        \"startPeriod\": 60\n      }\n    }\n  ]\n}\n","json",[1306,10845,10846,10851,10874,10894,10917,10937,10957,10977,10997,11011,11016,11036,11056,11069,11074,11092,11110,11114,11119,11132,11136,11155,11172,11176,11180,11193,11197,11216,11234,11239,11243,11262,11279,11283,11287,11301,11322,11335,11355,11375,11393,11397,11402,11415,11428,11438,11447,11452,11468,11484,11500,11513,11518,11522,11527],{"__ignoreMap":1304},[1309,10847,10848],{"class":1311,"line":1312},[1309,10849,10850],{"class":2238},"{\n",[1309,10852,10853,10857,10861,10863,10865,10867,10869,10871],{"class":1311,"line":1319},[1309,10854,10856],{"class":10855},"s4Jsk","  \"",[1309,10858,10860],{"class":10859},"sLorS","family",[1309,10862,2419],{"class":10855},[1309,10864,2239],{"class":2238},[1309,10866,2375],{"class":2242},[1309,10868,9788],{"class":1546},[1309,10870,2419],{"class":2242},[1309,10872,10873],{"class":2238},",\n",[1309,10875,10876,10878,10881,10883,10885,10887,10890,10892],{"class":1311,"line":1325},[1309,10877,10856],{"class":10855},[1309,10879,10880],{"class":10859},"networkMode",[1309,10882,2419],{"class":10855},[1309,10884,2239],{"class":2238},[1309,10886,2375],{"class":2242},[1309,10888,10889],{"class":1546},"awsvpc",[1309,10891,2419],{"class":2242},[1309,10893,10873],{"class":2238},[1309,10895,10896,10898,10901,10903,10905,10907,10909,10912,10914],{"class":1311,"line":1336},[1309,10897,10856],{"class":10855},[1309,10899,10900],{"class":10859},"requiresCompatibilities",[1309,10902,2419],{"class":10855},[1309,10904,2239],{"class":2238},[1309,10906,1666],{"class":2238},[1309,10908,2419],{"class":2242},[1309,10910,10911],{"class":1546},"FARGATE",[1309,10913,2419],{"class":2242},[1309,10915,10916],{"class":2238},"],\n",[1309,10918,10919,10921,10924,10926,10928,10930,10933,10935],{"class":1311,"line":1343},[1309,10920,10856],{"class":10855},[1309,10922,10923],{"class":10859},"cpu",[1309,10925,2419],{"class":10855},[1309,10927,2239],{"class":2238},[1309,10929,2375],{"class":2242},[1309,10931,10932],{"class":1546},"512",[1309,10934,2419],{"class":2242},[1309,10936,10873],{"class":2238},[1309,10938,10939,10941,10944,10946,10948,10950,10953,10955],{"class":1311,"line":1349},[1309,10940,10856],{"class":10855},[1309,10942,10943],{"class":10859},"memory",[1309,10945,2419],{"class":10855},[1309,10947,2239],{"class":2238},[1309,10949,2375],{"class":2242},[1309,10951,10952],{"class":1546},"1024",[1309,10954,2419],{"class":2242},[1309,10956,10873],{"class":2238},[1309,10958,10959,10961,10964,10966,10968,10970,10973,10975],{"class":1311,"line":1355},[1309,10960,10856],{"class":10855},[1309,10962,10963],{"class":10859},"executionRoleArn",[1309,10965,2419],{"class":10855},[1309,10967,2239],{"class":2238},[1309,10969,2375],{"class":2242},[1309,10971,10972],{"class":1546},"arn:aws:iam::123456789012:role/ecsTaskExecutionRole",[1309,10974,2419],{"class":2242},[1309,10976,10873],{"class":2238},[1309,10978,10979,10981,10984,10986,10988,10990,10993,10995],{"class":1311,"line":1361},[1309,10980,10856],{"class":10855},[1309,10982,10983],{"class":10859},"taskRoleArn",[1309,10985,2419],{"class":10855},[1309,10987,2239],{"class":2238},[1309,10989,2375],{"class":2242},[1309,10991,10992],{"class":1546},"arn:aws:iam::123456789012:role/ecsTaskRole",[1309,10994,2419],{"class":2242},[1309,10996,10873],{"class":2238},[1309,10998,10999,11001,11004,11006,11008],{"class":1311,"line":1370},[1309,11000,10856],{"class":10855},[1309,11002,11003],{"class":10859},"containerDefinitions",[1309,11005,2419],{"class":10855},[1309,11007,2239],{"class":2238},[1309,11009,11010],{"class":2238}," [\n",[1309,11012,11013],{"class":1311,"line":1378},[1309,11014,11015],{"class":2238},"    {\n",[1309,11017,11018,11021,11024,11026,11028,11030,11032,11034],{"class":1311,"line":1386},[1309,11019,11020],{"class":10855},"      \"",[1309,11022,9645],{"class":11023},"sa2tF",[1309,11025,2419],{"class":10855},[1309,11027,2239],{"class":2238},[1309,11029,2375],{"class":2242},[1309,11031,9788],{"class":1546},[1309,11033,2419],{"class":2242},[1309,11035,10873],{"class":2238},[1309,11037,11038,11040,11043,11045,11047,11049,11052,11054],{"class":1311,"line":1391},[1309,11039,11020],{"class":10855},[1309,11041,11042],{"class":11023},"image",[1309,11044,2419],{"class":10855},[1309,11046,2239],{"class":2238},[1309,11048,2375],{"class":2242},[1309,11050,11051],{"class":1546},"your-account.dkr.ecr.us-west-2.amazonaws.com/user-service:latest",[1309,11053,2419],{"class":2242},[1309,11055,10873],{"class":2238},[1309,11057,11058,11060,11063,11065,11067],{"class":1311,"line":1397},[1309,11059,11020],{"class":10855},[1309,11061,11062],{"class":11023},"portMappings",[1309,11064,2419],{"class":10855},[1309,11066,2239],{"class":2238},[1309,11068,11010],{"class":2238},[1309,11070,11071],{"class":1311,"line":1406},[1309,11072,11073],{"class":2238},"        {\n",[1309,11075,11076,11079,11083,11085,11087,11090],{"class":1311,"line":1411},[1309,11077,11078],{"class":10855},"          \"",[1309,11080,11082],{"class":11081},"skNjk","containerPort",[1309,11084,2419],{"class":10855},[1309,11086,2239],{"class":2238},[1309,11088,11089],{"class":2466}," 8000",[1309,11091,10873],{"class":2238},[1309,11093,11094,11096,11099,11101,11103,11105,11108],{"class":1311,"line":1417},[1309,11095,11078],{"class":10855},[1309,11097,11098],{"class":11081},"protocol",[1309,11100,2419],{"class":10855},[1309,11102,2239],{"class":2238},[1309,11104,2375],{"class":2242},[1309,11106,11107],{"class":1546},"tcp",[1309,11109,2381],{"class":2242},[1309,11111,11112],{"class":1311,"line":1423},[1309,11113,4693],{"class":2238},[1309,11115,11116],{"class":1311,"line":1432},[1309,11117,11118],{"class":2238},"      ],\n",[1309,11120,11121,11123,11126,11128,11130],{"class":1311,"line":1438},[1309,11122,11020],{"class":10855},[1309,11124,11125],{"class":11023},"environment",[1309,11127,2419],{"class":10855},[1309,11129,2239],{"class":2238},[1309,11131,11010],{"class":2238},[1309,11133,11134],{"class":1311,"line":1444},[1309,11135,11073],{"class":2238},[1309,11137,11138,11140,11142,11144,11146,11148,11151,11153],{"class":1311,"line":1450},[1309,11139,11078],{"class":10855},[1309,11141,9645],{"class":11081},[1309,11143,2419],{"class":10855},[1309,11145,2239],{"class":2238},[1309,11147,2375],{"class":2242},[1309,11149,11150],{"class":1546},"DJANGO_SETTINGS_MODULE",[1309,11152,2419],{"class":2242},[1309,11154,10873],{"class":2238},[1309,11156,11157,11159,11162,11164,11166,11168,11170],{"class":1311,"line":1456},[1309,11158,11078],{"class":10855},[1309,11160,11161],{"class":11081},"value",[1309,11163,2419],{"class":10855},[1309,11165,2239],{"class":2238},[1309,11167,2375],{"class":2242},[1309,11169,6336],{"class":1546},[1309,11171,2381],{"class":2242},[1309,11173,11174],{"class":1311,"line":1462},[1309,11175,4693],{"class":2238},[1309,11177,11178],{"class":1311,"line":1468},[1309,11179,11118],{"class":2238},[1309,11181,11182,11184,11187,11189,11191],{"class":1311,"line":1473},[1309,11183,11020],{"class":10855},[1309,11185,11186],{"class":11023},"secrets",[1309,11188,2419],{"class":10855},[1309,11190,2239],{"class":2238},[1309,11192,11010],{"class":2238},[1309,11194,11195],{"class":1311,"line":1479},[1309,11196,11073],{"class":2238},[1309,11198,11199,11201,11203,11205,11207,11209,11212,11214],{"class":1311,"line":1485},[1309,11200,11078],{"class":10855},[1309,11202,9645],{"class":11081},[1309,11204,2419],{"class":10855},[1309,11206,2239],{"class":2238},[1309,11208,2375],{"class":2242},[1309,11210,11211],{"class":1546},"DATABASE_URL",[1309,11213,2419],{"class":2242},[1309,11215,10873],{"class":2238},[1309,11217,11218,11220,11223,11225,11227,11229,11232],{"class":1311,"line":1494},[1309,11219,11078],{"class":10855},[1309,11221,11222],{"class":11081},"valueFrom",[1309,11224,2419],{"class":10855},[1309,11226,2239],{"class":2238},[1309,11228,2375],{"class":2242},[1309,11230,11231],{"class":1546},"arn:aws:secretsmanager:us-west-2:123456789012:secret:microservices/database-url",[1309,11233,2381],{"class":2242},[1309,11235,11236],{"class":1311,"line":1502},[1309,11237,11238],{"class":2238},"        },\n",[1309,11240,11241],{"class":1311,"line":1507},[1309,11242,11073],{"class":2238},[1309,11244,11245,11247,11249,11251,11253,11255,11258,11260],{"class":1311,"line":1513},[1309,11246,11078],{"class":10855},[1309,11248,9645],{"class":11081},[1309,11250,2419],{"class":10855},[1309,11252,2239],{"class":2238},[1309,11254,2375],{"class":2242},[1309,11256,11257],{"class":1546},"DJANGO_SECRET_KEY",[1309,11259,2419],{"class":2242},[1309,11261,10873],{"class":2238},[1309,11263,11264,11266,11268,11270,11272,11274,11277],{"class":1311,"line":1521},[1309,11265,11078],{"class":10855},[1309,11267,11222],{"class":11081},[1309,11269,2419],{"class":10855},[1309,11271,2239],{"class":2238},[1309,11273,2375],{"class":2242},[1309,11275,11276],{"class":1546},"arn:aws:secretsmanager:us-west-2:123456789012:secret:microservices/django-secret",[1309,11278,2381],{"class":2242},[1309,11280,11281],{"class":1311,"line":1526},[1309,11282,4693],{"class":2238},[1309,11284,11285],{"class":1311,"line":1532},[1309,11286,11118],{"class":2238},[1309,11288,11289,11291,11294,11296,11298],{"class":1311,"line":1538},[1309,11290,11020],{"class":10855},[1309,11292,11293],{"class":11023},"logConfiguration",[1309,11295,2419],{"class":10855},[1309,11297,2239],{"class":2238},[1309,11299,11300],{"class":2238}," {\n",[1309,11302,11303,11306,11309,11311,11313,11315,11318,11320],{"class":1311,"line":1553},[1309,11304,11305],{"class":10855},"        \"",[1309,11307,11308],{"class":11081},"logDriver",[1309,11310,2419],{"class":10855},[1309,11312,2239],{"class":2238},[1309,11314,2375],{"class":2242},[1309,11316,11317],{"class":1546},"awslogs",[1309,11319,2419],{"class":2242},[1309,11321,10873],{"class":2238},[1309,11323,11324,11326,11329,11331,11333],{"class":1311,"line":1561},[1309,11325,11305],{"class":10855},[1309,11327,11328],{"class":11081},"options",[1309,11330,2419],{"class":10855},[1309,11332,2239],{"class":2238},[1309,11334,11300],{"class":2238},[1309,11336,11337,11339,11342,11344,11346,11348,11351,11353],{"class":1311,"line":1569},[1309,11338,11078],{"class":10855},[1309,11340,11341],{"class":2234},"awslogs-group",[1309,11343,2419],{"class":10855},[1309,11345,2239],{"class":2238},[1309,11347,2375],{"class":2242},[1309,11349,11350],{"class":1546},"/ecs/user-service",[1309,11352,2419],{"class":2242},[1309,11354,10873],{"class":2238},[1309,11356,11357,11359,11362,11364,11366,11368,11371,11373],{"class":1311,"line":1574},[1309,11358,11078],{"class":10855},[1309,11360,11361],{"class":2234},"awslogs-region",[1309,11363,2419],{"class":10855},[1309,11365,2239],{"class":2238},[1309,11367,2375],{"class":2242},[1309,11369,11370],{"class":1546},"us-west-2",[1309,11372,2419],{"class":2242},[1309,11374,10873],{"class":2238},[1309,11376,11377,11379,11382,11384,11386,11388,11391],{"class":1311,"line":1580},[1309,11378,11078],{"class":10855},[1309,11380,11381],{"class":2234},"awslogs-stream-prefix",[1309,11383,2419],{"class":10855},[1309,11385,2239],{"class":2238},[1309,11387,2375],{"class":2242},[1309,11389,11390],{"class":1546},"ecs",[1309,11392,2381],{"class":2242},[1309,11394,11395],{"class":1311,"line":1586},[1309,11396,4693],{"class":2238},[1309,11398,11399],{"class":1311,"line":1594},[1309,11400,11401],{"class":2238},"      },\n",[1309,11403,11404,11406,11409,11411,11413],{"class":1311,"line":1599},[1309,11405,11020],{"class":10855},[1309,11407,11408],{"class":11023},"healthCheck",[1309,11410,2419],{"class":10855},[1309,11412,2239],{"class":2238},[1309,11414,11300],{"class":2238},[1309,11416,11417,11419,11422,11424,11426],{"class":1311,"line":1605},[1309,11418,11305],{"class":10855},[1309,11420,11421],{"class":11081},"command",[1309,11423,2419],{"class":10855},[1309,11425,2239],{"class":2238},[1309,11427,11010],{"class":2238},[1309,11429,11430,11432,11434,11436],{"class":1311,"line":1614},[1309,11431,11078],{"class":2242},[1309,11433,2422],{"class":1546},[1309,11435,2419],{"class":2242},[1309,11437,10873],{"class":2238},[1309,11439,11440,11442,11445],{"class":1311,"line":1623},[1309,11441,11078],{"class":2242},[1309,11443,11444],{"class":1546},"curl -f http://localhost:8000/health/ || exit 1",[1309,11446,2381],{"class":2242},[1309,11448,11449],{"class":1311,"line":1628},[1309,11450,11451],{"class":2238},"        ],\n",[1309,11453,11454,11456,11459,11461,11463,11466],{"class":1311,"line":1634},[1309,11455,11305],{"class":10855},[1309,11457,11458],{"class":11081},"interval",[1309,11460,2419],{"class":10855},[1309,11462,2239],{"class":2238},[1309,11464,11465],{"class":2466}," 30",[1309,11467,10873],{"class":2238},[1309,11469,11470,11472,11475,11477,11479,11482],{"class":1311,"line":1643},[1309,11471,11305],{"class":10855},[1309,11473,11474],{"class":11081},"timeout",[1309,11476,2419],{"class":10855},[1309,11478,2239],{"class":2238},[1309,11480,11481],{"class":2466}," 5",[1309,11483,10873],{"class":2238},[1309,11485,11486,11488,11491,11493,11495,11498],{"class":1311,"line":1648},[1309,11487,11305],{"class":10855},[1309,11489,11490],{"class":11081},"retries",[1309,11492,2419],{"class":10855},[1309,11494,2239],{"class":2238},[1309,11496,11497],{"class":2466}," 3",[1309,11499,10873],{"class":2238},[1309,11501,11502,11504,11507,11509,11511],{"class":1311,"line":1654},[1309,11503,11305],{"class":10855},[1309,11505,11506],{"class":11081},"startPeriod",[1309,11508,2419],{"class":10855},[1309,11510,2239],{"class":2238},[1309,11512,9245],{"class":2466},[1309,11514,11515],{"class":1311,"line":1660},[1309,11516,11517],{"class":2238},"      }\n",[1309,11519,11520],{"class":1311,"line":2043},[1309,11521,4517],{"class":2238},[1309,11523,11524],{"class":1311,"line":2050},[1309,11525,11526],{"class":2238},"  ]\n",[1309,11528,11529],{"class":1311,"line":2055},[1309,11530,4234],{"class":2238},[1038,11532,11534],{"id":11533},"terraform-infrastructure","Terraform Infrastructure",[1299,11536,11540],{"className":11537,"code":11538,"language":11539,"meta":1304,"style":1304},"language-hcl shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# infrastructure/main.tf\nprovider \"aws\" {\n  region = var.aws_region\n}\n\n# VPC and Networking\nmodule \"vpc\" {\n  source = \"terraform-aws-modules/vpc/aws\"\n  \n  name = \"microservices-vpc\"\n  cidr = \"10.0.0.0/16\"\n  \n  azs             = [\"${var.aws_region}a\", \"${var.aws_region}b\", \"${var.aws_region}c\"]\n  private_subnets = [\"10.0.1.0/24\", \"10.0.2.0/24\", \"10.0.3.0/24\"]\n  public_subnets  = [\"10.0.101.0/24\", \"10.0.102.0/24\", \"10.0.103.0/24\"]\n  \n  enable_nat_gateway = true\n  enable_vpn_gateway = true\n  \n  tags = {\n    Environment = var.environment\n    Project     = \"microservices\"\n  }\n}\n\n# ECS Cluster\nresource \"aws_ecs_cluster\" \"microservices\" {\n  name = \"microservices-cluster\"\n  \n  capacity_providers = [\"FARGATE\", \"FARGATE_SPOT\"]\n  \n  default_capacity_provider_strategy {\n    capacity_provider = \"FARGATE\"\n    weight           = 1\n  }\n  \n  setting {\n    name  = \"containerInsights\"\n    value = \"enabled\"\n  }\n}\n\n# Application Load Balancer\nresource \"aws_lb\" \"microservices\" {\n  name               = \"microservices-alb\"\n  internal           = false\n  load_balancer_type = \"application\"\n  security_groups    = [aws_security_group.alb.id]\n  subnets           = module.vpc.public_subnets\n  \n  enable_deletion_protection = false\n  \n  tags = {\n    Environment = var.environment\n  }\n}\n\n# RDS Database\nresource \"aws_db_instance\" \"postgres\" {\n  identifier = \"microservices-postgres\"\n  \n  engine         = \"postgres\"\n  engine_version = \"13.7\"\n  instance_class = \"db.t3.micro\"\n  \n  allocated_storage     = 20\n  max_allocated_storage = 100\n  storage_type         = \"gp2\"\n  storage_encrypted    = true\n  \n  db_name  = \"microservices\"\n  username = \"postgres\"\n  password = var.db_password\n  \n  vpc_security_group_ids = [aws_security_group.rds.id]\n  db_subnet_group_name   = aws_db_subnet_group.postgres.name\n  \n  backup_retention_period = 7\n  backup_window          = \"03:00-04:00\"\n  maintenance_window     = \"sun:04:00-sun:05:00\"\n  \n  skip_final_snapshot = true\n  \n  tags = {\n    Environment = var.environment\n  }\n}\n\n# ElastiCache Redis\nresource \"aws_elasticache_subnet_group\" \"redis\" {\n  name       = \"microservices-redis-subnet-group\"\n  subnet_ids = module.vpc.private_subnets\n}\n\nresource \"aws_elasticache_cluster\" \"redis\" {\n  cluster_id           = \"microservices-redis\"\n  engine               = \"redis\"\n  node_type            = \"cache.t3.micro\"\n  num_cache_nodes      = 1\n  parameter_group_name = \"default.redis7\"\n  port                 = 6379\n  subnet_group_name    = aws_elasticache_subnet_group.redis.name\n  security_group_ids   = [aws_security_group.redis.id]\n  \n  tags = {\n    Environment = var.environment\n  }\n}\n","hcl",[1306,11541,11542,11547,11552,11557,11561,11565,11570,11575,11580,11584,11589,11594,11598,11603,11608,11613,11617,11622,11627,11631,11636,11641,11646,11651,11655,11659,11664,11669,11674,11678,11683,11687,11692,11697,11702,11706,11710,11715,11720,11725,11729,11733,11737,11742,11747,11752,11757,11762,11767,11772,11776,11781,11785,11789,11793,11797,11801,11805,11810,11815,11820,11824,11829,11834,11839,11843,11848,11853,11858,11863,11867,11872,11877,11882,11886,11891,11896,11900,11905,11910,11915,11919,11924,11928,11932,11936,11940,11944,11948,11953,11958,11963,11968,11972,11976,11981,11986,11991,11996,12001,12006,12011,12016,12021,12025,12029,12033,12037],{"__ignoreMap":1304},[1309,11543,11544],{"class":1311,"line":1312},[1309,11545,11546],{},"# infrastructure/main.tf\n",[1309,11548,11549],{"class":1311,"line":1319},[1309,11550,11551],{},"provider \"aws\" {\n",[1309,11553,11554],{"class":1311,"line":1325},[1309,11555,11556],{},"  region = var.aws_region\n",[1309,11558,11559],{"class":1311,"line":1336},[1309,11560,4234],{},[1309,11562,11563],{"class":1311,"line":1343},[1309,11564,1340],{"emptyLinePlaceholder":1339},[1309,11566,11567],{"class":1311,"line":1349},[1309,11568,11569],{},"# VPC and Networking\n",[1309,11571,11572],{"class":1311,"line":1355},[1309,11573,11574],{},"module \"vpc\" {\n",[1309,11576,11577],{"class":1311,"line":1361},[1309,11578,11579],{},"  source = \"terraform-aws-modules/vpc/aws\"\n",[1309,11581,11582],{"class":1311,"line":1370},[1309,11583,6222],{},[1309,11585,11586],{"class":1311,"line":1378},[1309,11587,11588],{},"  name = \"microservices-vpc\"\n",[1309,11590,11591],{"class":1311,"line":1386},[1309,11592,11593],{},"  cidr = \"10.0.0.0/16\"\n",[1309,11595,11596],{"class":1311,"line":1391},[1309,11597,6222],{},[1309,11599,11600],{"class":1311,"line":1397},[1309,11601,11602],{},"  azs             = [\"${var.aws_region}a\", \"${var.aws_region}b\", \"${var.aws_region}c\"]\n",[1309,11604,11605],{"class":1311,"line":1406},[1309,11606,11607],{},"  private_subnets = [\"10.0.1.0/24\", \"10.0.2.0/24\", \"10.0.3.0/24\"]\n",[1309,11609,11610],{"class":1311,"line":1411},[1309,11611,11612],{},"  public_subnets  = [\"10.0.101.0/24\", \"10.0.102.0/24\", \"10.0.103.0/24\"]\n",[1309,11614,11615],{"class":1311,"line":1417},[1309,11616,6222],{},[1309,11618,11619],{"class":1311,"line":1423},[1309,11620,11621],{},"  enable_nat_gateway = true\n",[1309,11623,11624],{"class":1311,"line":1432},[1309,11625,11626],{},"  enable_vpn_gateway = true\n",[1309,11628,11629],{"class":1311,"line":1438},[1309,11630,6222],{},[1309,11632,11633],{"class":1311,"line":1444},[1309,11634,11635],{},"  tags = {\n",[1309,11637,11638],{"class":1311,"line":1450},[1309,11639,11640],{},"    Environment = var.environment\n",[1309,11642,11643],{"class":1311,"line":1456},[1309,11644,11645],{},"    Project     = \"microservices\"\n",[1309,11647,11648],{"class":1311,"line":1462},[1309,11649,11650],{},"  }\n",[1309,11652,11653],{"class":1311,"line":1468},[1309,11654,4234],{},[1309,11656,11657],{"class":1311,"line":1473},[1309,11658,1340],{"emptyLinePlaceholder":1339},[1309,11660,11661],{"class":1311,"line":1479},[1309,11662,11663],{},"# ECS Cluster\n",[1309,11665,11666],{"class":1311,"line":1485},[1309,11667,11668],{},"resource \"aws_ecs_cluster\" \"microservices\" {\n",[1309,11670,11671],{"class":1311,"line":1494},[1309,11672,11673],{},"  name = \"microservices-cluster\"\n",[1309,11675,11676],{"class":1311,"line":1502},[1309,11677,6222],{},[1309,11679,11680],{"class":1311,"line":1507},[1309,11681,11682],{},"  capacity_providers = [\"FARGATE\", \"FARGATE_SPOT\"]\n",[1309,11684,11685],{"class":1311,"line":1513},[1309,11686,6222],{},[1309,11688,11689],{"class":1311,"line":1521},[1309,11690,11691],{},"  default_capacity_provider_strategy {\n",[1309,11693,11694],{"class":1311,"line":1526},[1309,11695,11696],{},"    capacity_provider = \"FARGATE\"\n",[1309,11698,11699],{"class":1311,"line":1532},[1309,11700,11701],{},"    weight           = 1\n",[1309,11703,11704],{"class":1311,"line":1538},[1309,11705,11650],{},[1309,11707,11708],{"class":1311,"line":1553},[1309,11709,6222],{},[1309,11711,11712],{"class":1311,"line":1561},[1309,11713,11714],{},"  setting {\n",[1309,11716,11717],{"class":1311,"line":1569},[1309,11718,11719],{},"    name  = \"containerInsights\"\n",[1309,11721,11722],{"class":1311,"line":1574},[1309,11723,11724],{},"    value = \"enabled\"\n",[1309,11726,11727],{"class":1311,"line":1580},[1309,11728,11650],{},[1309,11730,11731],{"class":1311,"line":1586},[1309,11732,4234],{},[1309,11734,11735],{"class":1311,"line":1594},[1309,11736,1340],{"emptyLinePlaceholder":1339},[1309,11738,11739],{"class":1311,"line":1599},[1309,11740,11741],{},"# Application Load Balancer\n",[1309,11743,11744],{"class":1311,"line":1605},[1309,11745,11746],{},"resource \"aws_lb\" \"microservices\" {\n",[1309,11748,11749],{"class":1311,"line":1614},[1309,11750,11751],{},"  name               = \"microservices-alb\"\n",[1309,11753,11754],{"class":1311,"line":1623},[1309,11755,11756],{},"  internal           = false\n",[1309,11758,11759],{"class":1311,"line":1628},[1309,11760,11761],{},"  load_balancer_type = \"application\"\n",[1309,11763,11764],{"class":1311,"line":1634},[1309,11765,11766],{},"  security_groups    = [aws_security_group.alb.id]\n",[1309,11768,11769],{"class":1311,"line":1643},[1309,11770,11771],{},"  subnets           = module.vpc.public_subnets\n",[1309,11773,11774],{"class":1311,"line":1648},[1309,11775,6222],{},[1309,11777,11778],{"class":1311,"line":1654},[1309,11779,11780],{},"  enable_deletion_protection = false\n",[1309,11782,11783],{"class":1311,"line":1660},[1309,11784,6222],{},[1309,11786,11787],{"class":1311,"line":2043},[1309,11788,11635],{},[1309,11790,11791],{"class":1311,"line":2050},[1309,11792,11640],{},[1309,11794,11795],{"class":1311,"line":2055},[1309,11796,11650],{},[1309,11798,11799],{"class":1311,"line":2061},[1309,11800,4234],{},[1309,11802,11803],{"class":1311,"line":2073},[1309,11804,1340],{"emptyLinePlaceholder":1339},[1309,11806,11807],{"class":1311,"line":2085},[1309,11808,11809],{},"# RDS Database\n",[1309,11811,11812],{"class":1311,"line":2098},[1309,11813,11814],{},"resource \"aws_db_instance\" \"postgres\" {\n",[1309,11816,11817],{"class":1311,"line":2111},[1309,11818,11819],{},"  identifier = \"microservices-postgres\"\n",[1309,11821,11822],{"class":1311,"line":2124},[1309,11823,6222],{},[1309,11825,11826],{"class":1311,"line":2136},[1309,11827,11828],{},"  engine         = \"postgres\"\n",[1309,11830,11831],{"class":1311,"line":2149},[1309,11832,11833],{},"  engine_version = \"13.7\"\n",[1309,11835,11836],{"class":1311,"line":2162},[1309,11837,11838],{},"  instance_class = \"db.t3.micro\"\n",[1309,11840,11841],{"class":1311,"line":2175},[1309,11842,6222],{},[1309,11844,11845],{"class":1311,"line":2786},[1309,11846,11847],{},"  allocated_storage     = 20\n",[1309,11849,11850],{"class":1311,"line":2797},[1309,11851,11852],{},"  max_allocated_storage = 100\n",[1309,11854,11855],{"class":1311,"line":2808},[1309,11856,11857],{},"  storage_type         = \"gp2\"\n",[1309,11859,11860],{"class":1311,"line":2819},[1309,11861,11862],{},"  storage_encrypted    = true\n",[1309,11864,11865],{"class":1311,"line":2829},[1309,11866,6222],{},[1309,11868,11869],{"class":1311,"line":2836},[1309,11870,11871],{},"  db_name  = \"microservices\"\n",[1309,11873,11874],{"class":1311,"line":2848},[1309,11875,11876],{},"  username = \"postgres\"\n",[1309,11878,11879],{"class":1311,"line":2855},[1309,11880,11881],{},"  password = var.db_password\n",[1309,11883,11884],{"class":1311,"line":2861},[1309,11885,6222],{},[1309,11887,11888],{"class":1311,"line":2869},[1309,11889,11890],{},"  vpc_security_group_ids = [aws_security_group.rds.id]\n",[1309,11892,11893],{"class":1311,"line":2875},[1309,11894,11895],{},"  db_subnet_group_name   = aws_db_subnet_group.postgres.name\n",[1309,11897,11898],{"class":1311,"line":2883},[1309,11899,6222],{},[1309,11901,11902],{"class":1311,"line":2889},[1309,11903,11904],{},"  backup_retention_period = 7\n",[1309,11906,11907],{"class":1311,"line":2897},[1309,11908,11909],{},"  backup_window          = \"03:00-04:00\"\n",[1309,11911,11912],{"class":1311,"line":2903},[1309,11913,11914],{},"  maintenance_window     = \"sun:04:00-sun:05:00\"\n",[1309,11916,11917],{"class":1311,"line":2911},[1309,11918,6222],{},[1309,11920,11921],{"class":1311,"line":2919},[1309,11922,11923],{},"  skip_final_snapshot = true\n",[1309,11925,11926],{"class":1311,"line":2927},[1309,11927,6222],{},[1309,11929,11930],{"class":1311,"line":2935},[1309,11931,11635],{},[1309,11933,11934],{"class":1311,"line":2946},[1309,11935,11640],{},[1309,11937,11938],{"class":1311,"line":2954},[1309,11939,11650],{},[1309,11941,11942],{"class":1311,"line":2964},[1309,11943,4234],{},[1309,11945,11946],{"class":1311,"line":2972},[1309,11947,1340],{"emptyLinePlaceholder":1339},[1309,11949,11950],{"class":1311,"line":2981},[1309,11951,11952],{},"# ElastiCache Redis\n",[1309,11954,11955],{"class":1311,"line":2988},[1309,11956,11957],{},"resource \"aws_elasticache_subnet_group\" \"redis\" {\n",[1309,11959,11960],{"class":1311,"line":2995},[1309,11961,11962],{},"  name       = \"microservices-redis-subnet-group\"\n",[1309,11964,11965],{"class":1311,"line":3002},[1309,11966,11967],{},"  subnet_ids = module.vpc.private_subnets\n",[1309,11969,11970],{"class":1311,"line":3008},[1309,11971,4234],{},[1309,11973,11974],{"class":1311,"line":3016},[1309,11975,1340],{"emptyLinePlaceholder":1339},[1309,11977,11978],{"class":1311,"line":3022},[1309,11979,11980],{},"resource \"aws_elasticache_cluster\" \"redis\" {\n",[1309,11982,11983],{"class":1311,"line":3030},[1309,11984,11985],{},"  cluster_id           = \"microservices-redis\"\n",[1309,11987,11988],{"class":1311,"line":3038},[1309,11989,11990],{},"  engine               = \"redis\"\n",[1309,11992,11993],{"class":1311,"line":3044},[1309,11994,11995],{},"  node_type            = \"cache.t3.micro\"\n",[1309,11997,11998],{"class":1311,"line":3055},[1309,11999,12000],{},"  num_cache_nodes      = 1\n",[1309,12002,12003],{"class":1311,"line":3061},[1309,12004,12005],{},"  parameter_group_name = \"default.redis7\"\n",[1309,12007,12008],{"class":1311,"line":3067},[1309,12009,12010],{},"  port                 = 6379\n",[1309,12012,12013],{"class":1311,"line":3073},[1309,12014,12015],{},"  subnet_group_name    = aws_elasticache_subnet_group.redis.name\n",[1309,12017,12018],{"class":1311,"line":3084},[1309,12019,12020],{},"  security_group_ids   = [aws_security_group.redis.id]\n",[1309,12022,12023],{"class":1311,"line":3089},[1309,12024,6222],{},[1309,12026,12027],{"class":1311,"line":3095},[1309,12028,11635],{},[1309,12030,12031],{"class":1311,"line":3103},[1309,12032,11640],{},[1309,12034,12035],{"class":1311,"line":3112},[1309,12036,11650],{},[1309,12038,12039],{"class":1311,"line":3122},[1309,12040,4234],{},[1030,12042,12044],{"id":12043},"monitoring-and-observability","Monitoring and Observability",[1038,12046,12048],{"id":12047},"prometheus-and-grafana-setup","Prometheus and Grafana Setup",[1299,12050,12052],{"className":2220,"code":12051,"language":2222,"meta":1304,"style":1304},"# k8s/monitoring.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: prometheus-config\n  namespace: microservices\ndata:\n  prometheus.yml: |\n    global:\n      scrape_interval: 15s\n    \n    scrape_configs:\n    - job_name: 'user-service'\n      static_configs:\n      - targets: ['user-service:8000']\n      metrics_path: '/metrics'\n    \n    - job_name: 'order-service'\n      static_configs:\n      - targets: ['order-service:8000']\n      metrics_path: '/metrics'\n    \n    - job_name: 'kubernetes-pods'\n      kubernetes_sd_configs:\n      - role: pod\n      relabel_configs:\n      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]\n        action: keep\n        regex: true\n\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: prometheus\n  namespace: microservices\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: prometheus\n  template:\n    metadata:\n      labels:\n        app: prometheus\n    spec:\n      containers:\n      - name: prometheus\n        image: prom/prometheus:latest\n        ports:\n        - containerPort: 9090\n        volumeMounts:\n        - name: config-volume\n          mountPath: /etc/prometheus\n        - name: storage-volume\n          mountPath: /prometheus\n        command:\n        - '/bin/prometheus'\n        - '--config.file=/etc/prometheus/prometheus.yml'\n        - '--storage.tsdb.path=/prometheus'\n        - '--web.console.libraries=/etc/prometheus/console_libraries'\n        - '--web.console.templates=/etc/prometheus/consoles'\n        - '--storage.tsdb.retention.time=200h'\n        - '--web.enable-lifecycle'\n      volumes:\n      - name: config-volume\n        configMap:\n          name: prometheus-config\n      - name: storage-volume\n        emptyDir: {}\n",[1306,12053,12054,12059,12067,12075,12081,12090,12098,12104,12113,12118,12123,12127,12132,12137,12142,12147,12152,12156,12161,12165,12170,12174,12178,12183,12188,12193,12198,12203,12208,12213,12217,12221,12229,12237,12243,12252,12260,12266,12274,12280,12286,12294,12300,12306,12312,12320,12326,12332,12342,12351,12357,12368,12374,12385,12394,12405,12414,12420,12431,12442,12453,12464,12475,12486,12497,12503,12513,12520,12529,12539],{"__ignoreMap":1304},[1309,12055,12056],{"class":1311,"line":1312},[1309,12057,12058],{"class":1315},"# k8s/monitoring.yaml\n",[1309,12060,12061,12063,12065],{"class":1311,"line":1319},[1309,12062,6050],{"class":2234},[1309,12064,2239],{"class":2238},[1309,12066,6055],{"class":1546},[1309,12068,12069,12071,12073],{"class":1311,"line":1325},[1309,12070,6060],{"class":2234},[1309,12072,2239],{"class":2238},[1309,12074,6138],{"class":1546},[1309,12076,12077,12079],{"class":1311,"line":1336},[1309,12078,6070],{"class":2234},[1309,12080,2261],{"class":2238},[1309,12082,12083,12085,12087],{"class":1311,"line":1343},[1309,12084,6077],{"class":2234},[1309,12086,2239],{"class":2238},[1309,12088,12089],{"class":1546}," prometheus-config\n",[1309,12091,12092,12094,12096],{"class":1311,"line":1349},[1309,12093,6158],{"class":2234},[1309,12095,2239],{"class":2238},[1309,12097,6082],{"class":1546},[1309,12099,12100,12102],{"class":1311,"line":1355},[1309,12101,6182],{"class":2234},[1309,12103,2261],{"class":2238},[1309,12105,12106,12109,12111],{"class":1311,"line":1361},[1309,12107,12108],{"class":2234},"  prometheus.yml",[1309,12110,2239],{"class":2238},[1309,12112,9897],{"class":3051},[1309,12114,12115],{"class":1311,"line":1370},[1309,12116,12117],{"class":1546},"    global:\n",[1309,12119,12120],{"class":1311,"line":1378},[1309,12121,12122],{"class":1546},"      scrape_interval: 15s\n",[1309,12124,12125],{"class":1311,"line":1386},[1309,12126,4263],{"class":1546},[1309,12128,12129],{"class":1311,"line":1391},[1309,12130,12131],{"class":1546},"    scrape_configs:\n",[1309,12133,12134],{"class":1311,"line":1397},[1309,12135,12136],{"class":1546},"    - job_name: 'user-service'\n",[1309,12138,12139],{"class":1311,"line":1406},[1309,12140,12141],{"class":1546},"      static_configs:\n",[1309,12143,12144],{"class":1311,"line":1411},[1309,12145,12146],{"class":1546},"      - targets: ['user-service:8000']\n",[1309,12148,12149],{"class":1311,"line":1417},[1309,12150,12151],{"class":1546},"      metrics_path: '/metrics'\n",[1309,12153,12154],{"class":1311,"line":1423},[1309,12155,4263],{"class":1546},[1309,12157,12158],{"class":1311,"line":1432},[1309,12159,12160],{"class":1546},"    - job_name: 'order-service'\n",[1309,12162,12163],{"class":1311,"line":1438},[1309,12164,12141],{"class":1546},[1309,12166,12167],{"class":1311,"line":1444},[1309,12168,12169],{"class":1546},"      - targets: ['order-service:8000']\n",[1309,12171,12172],{"class":1311,"line":1450},[1309,12173,12151],{"class":1546},[1309,12175,12176],{"class":1311,"line":1456},[1309,12177,4263],{"class":1546},[1309,12179,12180],{"class":1311,"line":1462},[1309,12181,12182],{"class":1546},"    - job_name: 'kubernetes-pods'\n",[1309,12184,12185],{"class":1311,"line":1468},[1309,12186,12187],{"class":1546},"      kubernetes_sd_configs:\n",[1309,12189,12190],{"class":1311,"line":1473},[1309,12191,12192],{"class":1546},"      - role: pod\n",[1309,12194,12195],{"class":1311,"line":1479},[1309,12196,12197],{"class":1546},"      relabel_configs:\n",[1309,12199,12200],{"class":1311,"line":1485},[1309,12201,12202],{"class":1546},"      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]\n",[1309,12204,12205],{"class":1311,"line":1494},[1309,12206,12207],{"class":1546},"        action: keep\n",[1309,12209,12210],{"class":1311,"line":1502},[1309,12211,12212],{"class":1546},"        regex: true\n",[1309,12214,12215],{"class":1311,"line":1507},[1309,12216,1340],{"emptyLinePlaceholder":1339},[1309,12218,12219],{"class":1311,"line":1513},[1309,12220,6116],{"class":3994},[1309,12222,12223,12225,12227],{"class":1311,"line":1521},[1309,12224,6050],{"class":2234},[1309,12226,2239],{"class":2238},[1309,12228,6979],{"class":1546},[1309,12230,12231,12233,12235],{"class":1311,"line":1526},[1309,12232,6060],{"class":2234},[1309,12234,2239],{"class":2238},[1309,12236,6988],{"class":1546},[1309,12238,12239,12241],{"class":1311,"line":1532},[1309,12240,6070],{"class":2234},[1309,12242,2261],{"class":2238},[1309,12244,12245,12247,12249],{"class":1311,"line":1538},[1309,12246,6077],{"class":2234},[1309,12248,2239],{"class":2238},[1309,12250,12251],{"class":1546}," prometheus\n",[1309,12253,12254,12256,12258],{"class":1311,"line":1553},[1309,12255,6158],{"class":2234},[1309,12257,2239],{"class":2238},[1309,12259,6082],{"class":1546},[1309,12261,12262,12264],{"class":1311,"line":1561},[1309,12263,7015],{"class":2234},[1309,12265,2261],{"class":2238},[1309,12267,12268,12270,12272],{"class":1311,"line":1569},[1309,12269,7022],{"class":2234},[1309,12271,2239],{"class":2238},[1309,12273,7027],{"class":2466},[1309,12275,12276,12278],{"class":1311,"line":1574},[1309,12277,7032],{"class":2234},[1309,12279,2261],{"class":2238},[1309,12281,12282,12284],{"class":1311,"line":1580},[1309,12283,7039],{"class":2234},[1309,12285,2261],{"class":2238},[1309,12287,12288,12290,12292],{"class":1311,"line":1586},[1309,12289,7046],{"class":2234},[1309,12291,2239],{"class":2238},[1309,12293,12251],{"class":1546},[1309,12295,12296,12298],{"class":1311,"line":1594},[1309,12297,7055],{"class":2234},[1309,12299,2261],{"class":2238},[1309,12301,12302,12304],{"class":1311,"line":1599},[1309,12303,7062],{"class":2234},[1309,12305,2261],{"class":2238},[1309,12307,12308,12310],{"class":1311,"line":1605},[1309,12309,7069],{"class":2234},[1309,12311,2261],{"class":2238},[1309,12313,12314,12316,12318],{"class":1311,"line":1614},[1309,12315,7076],{"class":2234},[1309,12317,2239],{"class":2238},[1309,12319,12251],{"class":1546},[1309,12321,12322,12324],{"class":1311,"line":1623},[1309,12323,7085],{"class":2234},[1309,12325,2261],{"class":2238},[1309,12327,12328,12330],{"class":1311,"line":1628},[1309,12329,7092],{"class":2234},[1309,12331,2261],{"class":2238},[1309,12333,12334,12336,12338,12340],{"class":1311,"line":1634},[1309,12335,2346],{"class":2238},[1309,12337,7101],{"class":2234},[1309,12339,2239],{"class":2238},[1309,12341,12251],{"class":1546},[1309,12343,12344,12346,12348],{"class":1311,"line":1643},[1309,12345,7110],{"class":2234},[1309,12347,2239],{"class":2238},[1309,12349,12350],{"class":1546}," prom/prometheus:latest\n",[1309,12352,12353,12355],{"class":1311,"line":1648},[1309,12354,7119],{"class":2234},[1309,12356,2261],{"class":2238},[1309,12358,12359,12361,12363,12365],{"class":1311,"line":1654},[1309,12360,3920],{"class":2238},[1309,12362,7128],{"class":2234},[1309,12364,2239],{"class":2238},[1309,12366,12367],{"class":2466}," 9090\n",[1309,12369,12370,12372],{"class":1311,"line":1660},[1309,12371,7267],{"class":2234},[1309,12373,2261],{"class":2238},[1309,12375,12376,12378,12380,12382],{"class":1311,"line":2043},[1309,12377,3920],{"class":2238},[1309,12379,7101],{"class":2234},[1309,12381,2239],{"class":2238},[1309,12383,12384],{"class":1546}," config-volume\n",[1309,12386,12387,12389,12391],{"class":1311,"line":2050},[1309,12388,7285],{"class":2234},[1309,12390,2239],{"class":2238},[1309,12392,12393],{"class":1546}," /etc/prometheus\n",[1309,12395,12396,12398,12400,12402],{"class":1311,"line":2055},[1309,12397,3920],{"class":2238},[1309,12399,7101],{"class":2234},[1309,12401,2239],{"class":2238},[1309,12403,12404],{"class":1546}," storage-volume\n",[1309,12406,12407,12409,12411],{"class":1311,"line":2061},[1309,12408,7285],{"class":2234},[1309,12410,2239],{"class":2238},[1309,12412,12413],{"class":1546}," /prometheus\n",[1309,12415,12416,12418],{"class":1311,"line":2073},[1309,12417,8226],{"class":2234},[1309,12419,2261],{"class":2238},[1309,12421,12422,12424,12426,12429],{"class":1311,"line":2085},[1309,12423,3920],{"class":2238},[1309,12425,2243],{"class":2242},[1309,12427,12428],{"class":1546},"/bin/prometheus",[1309,12430,2249],{"class":2242},[1309,12432,12433,12435,12437,12440],{"class":1311,"line":2098},[1309,12434,3920],{"class":2238},[1309,12436,2243],{"class":2242},[1309,12438,12439],{"class":1546},"--config.file=/etc/prometheus/prometheus.yml",[1309,12441,2249],{"class":2242},[1309,12443,12444,12446,12448,12451],{"class":1311,"line":2111},[1309,12445,3920],{"class":2238},[1309,12447,2243],{"class":2242},[1309,12449,12450],{"class":1546},"--storage.tsdb.path=/prometheus",[1309,12452,2249],{"class":2242},[1309,12454,12455,12457,12459,12462],{"class":1311,"line":2124},[1309,12456,3920],{"class":2238},[1309,12458,2243],{"class":2242},[1309,12460,12461],{"class":1546},"--web.console.libraries=/etc/prometheus/console_libraries",[1309,12463,2249],{"class":2242},[1309,12465,12466,12468,12470,12473],{"class":1311,"line":2136},[1309,12467,3920],{"class":2238},[1309,12469,2243],{"class":2242},[1309,12471,12472],{"class":1546},"--web.console.templates=/etc/prometheus/consoles",[1309,12474,2249],{"class":2242},[1309,12476,12477,12479,12481,12484],{"class":1311,"line":2149},[1309,12478,3920],{"class":2238},[1309,12480,2243],{"class":2242},[1309,12482,12483],{"class":1546},"--storage.tsdb.retention.time=200h",[1309,12485,2249],{"class":2242},[1309,12487,12488,12490,12492,12495],{"class":1311,"line":2162},[1309,12489,3920],{"class":2238},[1309,12491,2243],{"class":2242},[1309,12493,12494],{"class":1546},"--web.enable-lifecycle",[1309,12496,2249],{"class":2242},[1309,12498,12499,12501],{"class":1311,"line":2175},[1309,12500,7370],{"class":2234},[1309,12502,2261],{"class":2238},[1309,12504,12505,12507,12509,12511],{"class":1311,"line":2786},[1309,12506,2346],{"class":2238},[1309,12508,7101],{"class":2234},[1309,12510,2239],{"class":2238},[1309,12512,12384],{"class":1546},[1309,12514,12515,12518],{"class":1311,"line":2797},[1309,12516,12517],{"class":2234},"        configMap",[1309,12519,2261],{"class":2238},[1309,12521,12522,12525,12527],{"class":1311,"line":2808},[1309,12523,12524],{"class":2234},"          name",[1309,12526,2239],{"class":2238},[1309,12528,12089],{"class":1546},[1309,12530,12531,12533,12535,12537],{"class":1311,"line":2819},[1309,12532,2346],{"class":2238},[1309,12534,7101],{"class":2234},[1309,12536,2239],{"class":2238},[1309,12538,12404],{"class":1546},[1309,12540,12541,12544,12546],{"class":1311,"line":2829},[1309,12542,12543],{"class":2234},"        emptyDir",[1309,12545,2239],{"class":2238},[1309,12547,12548],{"class":2238}," {}\n",[1038,12550,12552],{"id":12551},"health-check-endpoints","Health Check Endpoints",[1299,12554,12557],{"className":12555,"code":12556,"language":8236,"meta":1304,"style":1304},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# user_service/health/views.py\nfrom django.http import JsonResponse\nfrom django.db import connections\nfrom django.core.cache import cache\nimport redis\nimport logging\n\nlogger = logging.getLogger(__name__)\n\ndef health_check(request):\n    \"\"\"Basic health check endpoint\"\"\"\n    return JsonResponse({\n        'status': 'healthy',\n        'service': 'user-service',\n        'version': '1.0.0'\n    })\n\ndef readiness_check(request):\n    \"\"\"Readiness check with dependency verification\"\"\"\n    checks = {\n        'database': check_database(),\n        'cache': check_cache(),\n        'external_services': check_external_services()\n    }\n    \n    all_healthy = all(checks.values())\n    status_code = 200 if all_healthy else 503\n    \n    return JsonResponse({\n        'status': 'ready' if all_healthy else 'not_ready',\n        'checks': checks\n    }, status=status_code)\n\ndef check_database():\n    \"\"\"Check database connectivity\"\"\"\n    try:\n        db_conn = connections['default']\n        db_conn.cursor()\n        return True\n    except Exception as e:\n        logger.error(f\"Database check failed: {e}\")\n        return False\n\ndef check_cache():\n    \"\"\"Check cache connectivity\"\"\"\n    try:\n        cache.set('health_check', 'ok', 30)\n        return cache.get('health_check') == 'ok'\n    except Exception as e:\n        logger.error(f\"Cache check failed: {e}\")\n        return False\n\ndef check_external_services():\n    \"\"\"Check external service dependencies\"\"\"\n    try:\n        # Add checks for external services\n        return True\n    except Exception as e:\n        logger.error(f\"External service check failed: {e}\")\n        return False\n",[1306,12558,12559,12564,12584,12600,12621,12628,12635,12639,12666,12670,12689,12702,12713,12734,12753,12770,12775,12779,12792,12801,12810,12827,12843,12860,12864,12868,12892,12914,12918,12926,12958,12971,12987,12991,13000,13009,13016,13038,13050,13059,13075,13107,13114,13118,13126,13135,13141,13175,13208,13220,13245,13251,13255,13263,13272,13278,13283,13289,13301,13326],{"__ignoreMap":1304},[1309,12560,12561],{"class":1311,"line":1312},[1309,12562,12563],{"class":1315},"# user_service/health/views.py\n",[1309,12565,12566,12569,12572,12575,12578,12581],{"class":1311,"line":1319},[1309,12567,12568],{"class":3051},"from",[1309,12570,12571],{"class":1332}," django",[1309,12573,12574],{"class":2238},".",[1309,12576,12577],{"class":1332},"http ",[1309,12579,12580],{"class":3051},"import",[1309,12582,12583],{"class":1332}," JsonResponse\n",[1309,12585,12586,12588,12590,12592,12595,12597],{"class":1311,"line":1325},[1309,12587,12568],{"class":3051},[1309,12589,12571],{"class":1332},[1309,12591,12574],{"class":2238},[1309,12593,12594],{"class":1332},"db ",[1309,12596,12580],{"class":3051},[1309,12598,12599],{"class":1332}," connections\n",[1309,12601,12602,12604,12606,12608,12611,12613,12616,12618],{"class":1311,"line":1336},[1309,12603,12568],{"class":3051},[1309,12605,12571],{"class":1332},[1309,12607,12574],{"class":2238},[1309,12609,12610],{"class":1332},"core",[1309,12612,12574],{"class":2238},[1309,12614,12615],{"class":1332},"cache ",[1309,12617,12580],{"class":3051},[1309,12619,12620],{"class":1332}," cache\n",[1309,12622,12623,12625],{"class":1311,"line":1343},[1309,12624,12580],{"class":3051},[1309,12626,12627],{"class":1332}," redis\n",[1309,12629,12630,12632],{"class":1311,"line":1349},[1309,12631,12580],{"class":3051},[1309,12633,12634],{"class":1332}," logging\n",[1309,12636,12637],{"class":1311,"line":1355},[1309,12638,1340],{"emptyLinePlaceholder":1339},[1309,12640,12641,12644,12647,12650,12652,12656,12659,12663],{"class":1311,"line":1361},[1309,12642,12643],{"class":1332},"logger ",[1309,12645,12646],{"class":2238},"=",[1309,12648,12649],{"class":1332}," logging",[1309,12651,12574],{"class":2238},[1309,12653,12655],{"class":12654},"siWMO","getLogger",[1309,12657,12658],{"class":2238},"(",[1309,12660,12662],{"class":12661},"s131V","__name__",[1309,12664,12665],{"class":2238},")\n",[1309,12667,12668],{"class":1311,"line":1370},[1309,12669,1340],{"emptyLinePlaceholder":1339},[1309,12671,12672,12676,12680,12682,12686],{"class":1311,"line":1378},[1309,12673,12675],{"class":12674},"s5Kfy","def",[1309,12677,12679],{"class":12678},"sljsM"," health_check",[1309,12681,12658],{"class":2238},[1309,12683,12685],{"class":12684},"sCyAa","request",[1309,12687,12688],{"class":2238},"):\n",[1309,12690,12691,12695,12699],{"class":1311,"line":1386},[1309,12692,12694],{"class":12693},"sm7ve","    \"\"\"",[1309,12696,12698],{"class":12697},"sVyVU","Basic health check endpoint",[1309,12700,12701],{"class":12693},"\"\"\"\n",[1309,12703,12704,12707,12710],{"class":1311,"line":1391},[1309,12705,12706],{"class":3051},"    return",[1309,12708,12709],{"class":12654}," JsonResponse",[1309,12711,12712],{"class":2238},"({\n",[1309,12714,12715,12718,12721,12723,12725,12727,12730,12732],{"class":1311,"line":1397},[1309,12716,12717],{"class":2242},"        '",[1309,12719,12720],{"class":1546},"status",[1309,12722,8233],{"class":2242},[1309,12724,2239],{"class":2238},[1309,12726,2243],{"class":2242},[1309,12728,12729],{"class":1546},"healthy",[1309,12731,8233],{"class":2242},[1309,12733,10873],{"class":2238},[1309,12735,12736,12738,12741,12743,12745,12747,12749,12751],{"class":1311,"line":1406},[1309,12737,12717],{"class":2242},[1309,12739,12740],{"class":1546},"service",[1309,12742,8233],{"class":2242},[1309,12744,2239],{"class":2238},[1309,12746,2243],{"class":2242},[1309,12748,9788],{"class":1546},[1309,12750,8233],{"class":2242},[1309,12752,10873],{"class":2238},[1309,12754,12755,12757,12759,12761,12763,12765,12768],{"class":1311,"line":1411},[1309,12756,12717],{"class":2242},[1309,12758,2235],{"class":1546},[1309,12760,8233],{"class":2242},[1309,12762,2239],{"class":2238},[1309,12764,2243],{"class":2242},[1309,12766,12767],{"class":1546},"1.0.0",[1309,12769,2249],{"class":2242},[1309,12771,12772],{"class":1311,"line":1417},[1309,12773,12774],{"class":2238},"    })\n",[1309,12776,12777],{"class":1311,"line":1423},[1309,12778,1340],{"emptyLinePlaceholder":1339},[1309,12780,12781,12783,12786,12788,12790],{"class":1311,"line":1432},[1309,12782,12675],{"class":12674},[1309,12784,12785],{"class":12678}," readiness_check",[1309,12787,12658],{"class":2238},[1309,12789,12685],{"class":12684},[1309,12791,12688],{"class":2238},[1309,12793,12794,12796,12799],{"class":1311,"line":1438},[1309,12795,12694],{"class":12693},[1309,12797,12798],{"class":12697},"Readiness check with dependency verification",[1309,12800,12701],{"class":12693},[1309,12802,12803,12806,12808],{"class":1311,"line":1444},[1309,12804,12805],{"class":1332},"    checks ",[1309,12807,12646],{"class":2238},[1309,12809,11300],{"class":2238},[1309,12811,12812,12814,12817,12819,12821,12824],{"class":1311,"line":1450},[1309,12813,12717],{"class":2242},[1309,12815,12816],{"class":1546},"database",[1309,12818,8233],{"class":2242},[1309,12820,2239],{"class":2238},[1309,12822,12823],{"class":12654}," check_database",[1309,12825,12826],{"class":2238},"(),\n",[1309,12828,12829,12831,12834,12836,12838,12841],{"class":1311,"line":1456},[1309,12830,12717],{"class":2242},[1309,12832,12833],{"class":1546},"cache",[1309,12835,8233],{"class":2242},[1309,12837,2239],{"class":2238},[1309,12839,12840],{"class":12654}," check_cache",[1309,12842,12826],{"class":2238},[1309,12844,12845,12847,12850,12852,12854,12857],{"class":1311,"line":1462},[1309,12846,12717],{"class":2242},[1309,12848,12849],{"class":1546},"external_services",[1309,12851,8233],{"class":2242},[1309,12853,2239],{"class":2238},[1309,12855,12856],{"class":12654}," check_external_services",[1309,12858,12859],{"class":2238},"()\n",[1309,12861,12862],{"class":1311,"line":1468},[1309,12863,4517],{"class":2238},[1309,12865,12866],{"class":1311,"line":1473},[1309,12867,4263],{"class":1332},[1309,12869,12870,12873,12875,12879,12881,12884,12886,12889],{"class":1311,"line":1479},[1309,12871,12872],{"class":1332},"    all_healthy ",[1309,12874,12646],{"class":2238},[1309,12876,12878],{"class":12877},"sJdAF"," all",[1309,12880,12658],{"class":2238},[1309,12882,12883],{"class":12654},"checks",[1309,12885,12574],{"class":2238},[1309,12887,12888],{"class":12654},"values",[1309,12890,12891],{"class":2238},"())\n",[1309,12893,12894,12897,12899,12902,12905,12908,12911],{"class":1311,"line":1485},[1309,12895,12896],{"class":1332},"    status_code ",[1309,12898,12646],{"class":2238},[1309,12900,12901],{"class":2466}," 200",[1309,12903,12904],{"class":3051}," if",[1309,12906,12907],{"class":1332}," all_healthy ",[1309,12909,12910],{"class":3051},"else",[1309,12912,12913],{"class":2466}," 503\n",[1309,12915,12916],{"class":1311,"line":1494},[1309,12917,4263],{"class":1332},[1309,12919,12920,12922,12924],{"class":1311,"line":1502},[1309,12921,12706],{"class":3051},[1309,12923,12709],{"class":12654},[1309,12925,12712],{"class":2238},[1309,12927,12928,12930,12932,12934,12936,12938,12941,12943,12945,12947,12949,12951,12954,12956],{"class":1311,"line":1507},[1309,12929,12717],{"class":2242},[1309,12931,12720],{"class":1546},[1309,12933,8233],{"class":2242},[1309,12935,2239],{"class":2238},[1309,12937,2243],{"class":2242},[1309,12939,12940],{"class":1546},"ready",[1309,12942,8233],{"class":2242},[1309,12944,12904],{"class":3051},[1309,12946,12907],{"class":12654},[1309,12948,12910],{"class":3051},[1309,12950,2243],{"class":2242},[1309,12952,12953],{"class":1546},"not_ready",[1309,12955,8233],{"class":2242},[1309,12957,10873],{"class":2238},[1309,12959,12960,12962,12964,12966,12968],{"class":1311,"line":1513},[1309,12961,12717],{"class":2242},[1309,12963,12883],{"class":1546},[1309,12965,8233],{"class":2242},[1309,12967,2239],{"class":2238},[1309,12969,12970],{"class":12654}," checks\n",[1309,12972,12973,12976,12980,12982,12985],{"class":1311,"line":1521},[1309,12974,12975],{"class":2238},"    },",[1309,12977,12979],{"class":12978},"sqOPj"," status",[1309,12981,12646],{"class":2238},[1309,12983,12984],{"class":12654},"status_code",[1309,12986,12665],{"class":2238},[1309,12988,12989],{"class":1311,"line":1526},[1309,12990,1340],{"emptyLinePlaceholder":1339},[1309,12992,12993,12995,12997],{"class":1311,"line":1532},[1309,12994,12675],{"class":12674},[1309,12996,12823],{"class":12678},[1309,12998,12999],{"class":2238},"():\n",[1309,13001,13002,13004,13007],{"class":1311,"line":1538},[1309,13003,12694],{"class":12693},[1309,13005,13006],{"class":12697},"Check database connectivity",[1309,13008,12701],{"class":12693},[1309,13010,13011,13014],{"class":1311,"line":1553},[1309,13012,13013],{"class":3051},"    try",[1309,13015,2261],{"class":2238},[1309,13017,13018,13021,13023,13026,13029,13031,13034,13036],{"class":1311,"line":1561},[1309,13019,13020],{"class":1332},"        db_conn ",[1309,13022,12646],{"class":2238},[1309,13024,13025],{"class":1332}," connections",[1309,13027,13028],{"class":2238},"[",[1309,13030,8233],{"class":2242},[1309,13032,13033],{"class":1546},"default",[1309,13035,8233],{"class":2242},[1309,13037,1698],{"class":2238},[1309,13039,13040,13043,13045,13048],{"class":1311,"line":1569},[1309,13041,13042],{"class":1332},"        db_conn",[1309,13044,12574],{"class":2238},[1309,13046,13047],{"class":12654},"cursor",[1309,13049,12859],{"class":2238},[1309,13051,13052,13055],{"class":1311,"line":1574},[1309,13053,13054],{"class":3051},"        return",[1309,13056,13058],{"class":13057},"s8XtY"," True\n",[1309,13060,13061,13064,13067,13070,13073],{"class":1311,"line":1580},[1309,13062,13063],{"class":3051},"    except",[1309,13065,13066],{"class":11023}," Exception",[1309,13068,13069],{"class":3051}," as",[1309,13071,13072],{"class":1332}," e",[1309,13074,2261],{"class":2238},[1309,13076,13077,13080,13082,13085,13087,13090,13093,13097,13100,13103,13105],{"class":1311,"line":1586},[1309,13078,13079],{"class":1332},"        logger",[1309,13081,12574],{"class":2238},[1309,13083,13084],{"class":12654},"error",[1309,13086,12658],{"class":2238},[1309,13088,13089],{"class":12674},"f",[1309,13091,13092],{"class":1546},"\"Database check failed: ",[1309,13094,13096],{"class":13095},"s3h35","{",[1309,13098,13099],{"class":12654},"e",[1309,13101,13102],{"class":13095},"}",[1309,13104,2419],{"class":1546},[1309,13106,12665],{"class":2238},[1309,13108,13109,13111],{"class":1311,"line":1594},[1309,13110,13054],{"class":3051},[1309,13112,13113],{"class":13057}," False\n",[1309,13115,13116],{"class":1311,"line":1599},[1309,13117,1340],{"emptyLinePlaceholder":1339},[1309,13119,13120,13122,13124],{"class":1311,"line":1605},[1309,13121,12675],{"class":12674},[1309,13123,12840],{"class":12678},[1309,13125,12999],{"class":2238},[1309,13127,13128,13130,13133],{"class":1311,"line":1614},[1309,13129,12694],{"class":12693},[1309,13131,13132],{"class":12697},"Check cache connectivity",[1309,13134,12701],{"class":12693},[1309,13136,13137,13139],{"class":1311,"line":1623},[1309,13138,13013],{"class":3051},[1309,13140,2261],{"class":2238},[1309,13142,13143,13146,13148,13151,13153,13155,13158,13160,13162,13164,13167,13169,13171,13173],{"class":1311,"line":1628},[1309,13144,13145],{"class":1332},"        cache",[1309,13147,12574],{"class":2238},[1309,13149,13150],{"class":12654},"set",[1309,13152,12658],{"class":2238},[1309,13154,8233],{"class":2242},[1309,13156,13157],{"class":1546},"health_check",[1309,13159,8233],{"class":2242},[1309,13161,2427],{"class":2238},[1309,13163,2243],{"class":2242},[1309,13165,13166],{"class":1546},"ok",[1309,13168,8233],{"class":2242},[1309,13170,2427],{"class":2238},[1309,13172,11465],{"class":2466},[1309,13174,12665],{"class":2238},[1309,13176,13177,13179,13182,13184,13187,13189,13191,13193,13195,13198,13202,13204,13206],{"class":1311,"line":1634},[1309,13178,13054],{"class":3051},[1309,13180,13181],{"class":1332}," cache",[1309,13183,12574],{"class":2238},[1309,13185,13186],{"class":12654},"get",[1309,13188,12658],{"class":2238},[1309,13190,8233],{"class":2242},[1309,13192,13157],{"class":1546},[1309,13194,8233],{"class":2242},[1309,13196,13197],{"class":2238},")",[1309,13199,13201],{"class":13200},"sVsLi"," ==",[1309,13203,2243],{"class":2242},[1309,13205,13166],{"class":1546},[1309,13207,2249],{"class":2242},[1309,13209,13210,13212,13214,13216,13218],{"class":1311,"line":1643},[1309,13211,13063],{"class":3051},[1309,13213,13066],{"class":11023},[1309,13215,13069],{"class":3051},[1309,13217,13072],{"class":1332},[1309,13219,2261],{"class":2238},[1309,13221,13222,13224,13226,13228,13230,13232,13235,13237,13239,13241,13243],{"class":1311,"line":1648},[1309,13223,13079],{"class":1332},[1309,13225,12574],{"class":2238},[1309,13227,13084],{"class":12654},[1309,13229,12658],{"class":2238},[1309,13231,13089],{"class":12674},[1309,13233,13234],{"class":1546},"\"Cache check failed: ",[1309,13236,13096],{"class":13095},[1309,13238,13099],{"class":12654},[1309,13240,13102],{"class":13095},[1309,13242,2419],{"class":1546},[1309,13244,12665],{"class":2238},[1309,13246,13247,13249],{"class":1311,"line":1654},[1309,13248,13054],{"class":3051},[1309,13250,13113],{"class":13057},[1309,13252,13253],{"class":1311,"line":1660},[1309,13254,1340],{"emptyLinePlaceholder":1339},[1309,13256,13257,13259,13261],{"class":1311,"line":2043},[1309,13258,12675],{"class":12674},[1309,13260,12856],{"class":12678},[1309,13262,12999],{"class":2238},[1309,13264,13265,13267,13270],{"class":1311,"line":2050},[1309,13266,12694],{"class":12693},[1309,13268,13269],{"class":12697},"Check external service dependencies",[1309,13271,12701],{"class":12693},[1309,13273,13274,13276],{"class":1311,"line":2055},[1309,13275,13013],{"class":3051},[1309,13277,2261],{"class":2238},[1309,13279,13280],{"class":1311,"line":2061},[1309,13281,13282],{"class":1315},"        # Add checks for external services\n",[1309,13284,13285,13287],{"class":1311,"line":2073},[1309,13286,13054],{"class":3051},[1309,13288,13058],{"class":13057},[1309,13290,13291,13293,13295,13297,13299],{"class":1311,"line":2085},[1309,13292,13063],{"class":3051},[1309,13294,13066],{"class":11023},[1309,13296,13069],{"class":3051},[1309,13298,13072],{"class":1332},[1309,13300,2261],{"class":2238},[1309,13302,13303,13305,13307,13309,13311,13313,13316,13318,13320,13322,13324],{"class":1311,"line":2098},[1309,13304,13079],{"class":1332},[1309,13306,12574],{"class":2238},[1309,13308,13084],{"class":12654},[1309,13310,12658],{"class":2238},[1309,13312,13089],{"class":12674},[1309,13314,13315],{"class":1546},"\"External service check failed: ",[1309,13317,13096],{"class":13095},[1309,13319,13099],{"class":12654},[1309,13321,13102],{"class":13095},[1309,13323,2419],{"class":1546},[1309,13325,12665],{"class":2238},[1309,13327,13328,13330],{"class":1311,"line":2111},[1309,13329,13054],{"class":3051},[1309,13331,13113],{"class":13057},[1026,13333,13334],{},"This comprehensive deployment guide covers containerization, orchestration, CI/CD, cloud deployments, and monitoring for Django microservices. The examples provide production-ready configurations that can be adapted to your specific requirements and infrastructure.",[13336,13337,13338],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .scgAs, html code.shiki .scgAs{--shiki-light:#F76D47;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .suXOh, html code.shiki .suXOh{--shiki-light:#E53935;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sq3J1, html code.shiki .sq3J1{--shiki-light:#FF5370;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s4Jsk, html code.shiki .s4Jsk{--shiki-light:#39ADB5;--shiki-default:#99841877;--shiki-dark:#B8A96577}html pre.shiki code .sLorS, html code.shiki .sLorS{--shiki-light:#9C3EDA;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .skNjk, html code.shiki .skNjk{--shiki-light:#F76D47;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}",{"title":1304,"searchDepth":1312,"depth":1319,"links":13340},[13341,13345,13352,13361,13364,13368],{"id":1032,"depth":1319,"text":1033,"children":13342},[13343,13344],{"id":1040,"depth":1325,"text":1041},{"id":1143,"depth":1325,"text":1144},{"id":1220,"depth":1319,"text":1221,"children":13346},[13347,13348,13349,13350,13351],{"id":1227,"depth":1325,"text":1228},{"id":1293,"depth":1325,"text":1294},{"id":1753,"depth":1325,"text":1754},{"id":2213,"depth":1325,"text":2214},{"id":4108,"depth":1325,"text":4109},{"id":5926,"depth":1319,"text":5927,"children":13353},[13354,13355,13356,13357,13358,13359,13360],{"id":5933,"depth":1325,"text":5934},{"id":6031,"depth":1325,"text":6032},{"id":6443,"depth":1325,"text":6444},{"id":6959,"depth":1325,"text":6960},{"id":7598,"depth":1325,"text":7599},{"id":8964,"depth":1325,"text":8965},{"id":9336,"depth":1325,"text":9337},{"id":9625,"depth":1319,"text":9626,"children":13362},[13363],{"id":9629,"depth":1325,"text":9630},{"id":10833,"depth":1319,"text":10834,"children":13365},[13366,13367],{"id":10837,"depth":1325,"text":10838},{"id":11533,"depth":1325,"text":11534},{"id":12043,"depth":1319,"text":12044,"children":13369},[13370,13371],{"id":12047,"depth":1325,"text":12048},{"id":12551,"depth":1325,"text":12552},"md",null,{},{"title":909,"description":1028},"PXOag0m76HAiNKKk92tEJUXeZyEMsi_UNQZ1NdkievE",[13378,13380],{"title":905,"path":906,"stem":907,"description":13379,"children":-1},"Testing microservices presents unique challenges compared to monolithic applications. This chapter covers comprehensive testing strategies, tools, and best practices for ensuring reliability and quality in your Django microservices architecture.",{"title":913,"path":914,"stem":915,"description":13381,"children":-1},"Security in microservices architecture requires a comprehensive approach covering authentication, authorization, network security, data protection, and monitoring. This section explores security best practices and implementation strategies for Django microservices.",1772474964245]