[{"data":1,"prerenderedAt":34626},["ShallowReactive",2],{"navigation":3,"/deployment/cloud-deployment-guides":1016,"/deployment/cloud-deployment-guides-surround":34621},[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":759,"body":1018,"description":1028,"extension":34616,"links":34617,"meta":34618,"navigation":1302,"path":760,"seo":34619,"stem":761,"__hash__":34620},"docs/20.deployment/06.cloud-deployment-guides.md",{"type":1019,"value":1020,"toc":34568},"minimark",[1021,1025,1029,1034,1039,1045,1061,1066,1080,1085,1099,1104,1118,1122,1127,1138,1143,1149,1153,1158,1169,1174,1185,1190,1201,1206,1217,1221,1224,1228,1233,1365,1370,1649,1653,1656,1661,1667,1672,2853,2858,3010,3015,3914,3919,4088,4093,4266,4270,4275,4702,4707,5374,5378,5381,5386,6786,6791,7377,7382,7984,7988,7993,8202,8207,8872,8876,8881,9115,9120,9651,9655,9660,9852,9857,10172,10176,13344,13348,13351,13355,13360,13699,13703,13706,13711,14301,14306,15520,15525,15577,15582,15741,15745,15750,15940,15945,15996,16000,16005,16096,16100,16103,16108,16343,16348,16959,16964,17443,17448,17659,17664,18240,18244,19032,19036,20718,20722,20725,20729,20734,20889,20893,20896,20901,21156,21161,22247,22252,23043,23047,23052,23306,23310,23315,23457,23461,23466,23563,23567,24533,24537,24540,24544,24547,24552,24850,24855,25943,25948,26234,26239,26518,26906,26910,26913,26918,27196,27201,27273,27277,27280,27285,27463,27468,27648,27818,27822,27825,27830,28319,28324,28482,28486,28489,29377,29381,29385,29390,30287,30290,30295,31406,31410,31415,31975,31979,31984,33866,33870,33875,33883,33975,33982,34140,34147,34239,34246,34558,34561,34564],[1022,1023,759],"h1",{"id":1024},"cloud-deployment-guides",[1026,1027,1028],"p",{},"Cloud deployment transforms Django applications from single-server setups to globally distributed, auto-scaling, and highly available systems. This comprehensive guide covers everything Django developers need to know about deploying to major cloud platforms, from basic concepts to advanced architectures, cost optimization, and production best practices.",[1030,1031,1033],"h2",{"id":1032},"cloud-deployment-fundamentals","Cloud Deployment Fundamentals",[1035,1036,1038],"h3",{"id":1037},"understanding-cloud-computing-models","Understanding Cloud Computing Models",[1026,1040,1041],{},[1042,1043,1044],"strong",{},"Infrastructure as a Service (IaaS)",[1046,1047,1048,1052,1055,1058],"ul",{},[1049,1050,1051],"li",{},"Virtual machines, storage, and networking",[1049,1053,1054],{},"Full control over the operating system and runtime",[1049,1056,1057],{},"Examples: AWS EC2, Google Compute Engine, Azure Virtual Machines",[1049,1059,1060],{},"Best for: Custom configurations, legacy applications, specific OS requirements",[1026,1062,1063],{},[1042,1064,1065],{},"Platform as a Service (PaaS)",[1046,1067,1068,1071,1074,1077],{},[1049,1069,1070],{},"Managed runtime environment for applications",[1049,1072,1073],{},"Automatic scaling, load balancing, and maintenance",[1049,1075,1076],{},"Examples: AWS Elastic Beanstalk, Google App Engine, Azure App Service",[1049,1078,1079],{},"Best for: Rapid deployment, minimal DevOps overhead, standard web applications",[1026,1081,1082],{},[1042,1083,1084],{},"Function as a Service (FaaS) / Serverless",[1046,1086,1087,1090,1093,1096],{},[1049,1088,1089],{},"Event-driven, stateless compute functions",[1049,1091,1092],{},"Pay-per-execution pricing model",[1049,1094,1095],{},"Examples: AWS Lambda, Google Cloud Functions, Azure Functions",[1049,1097,1098],{},"Best for: Microservices, API endpoints, background processing",[1026,1100,1101],{},[1042,1102,1103],{},"Container as a Service (CaaS)",[1046,1105,1106,1109,1112,1115],{},[1049,1107,1108],{},"Managed container orchestration platforms",[1049,1110,1111],{},"Docker container deployment and scaling",[1049,1113,1114],{},"Examples: AWS ECS/EKS, Google GKE, Azure AKS",[1049,1116,1117],{},"Best for: Microservices, containerized applications, Kubernetes workloads",[1035,1119,1121],{"id":1120},"cloud-architecture-patterns-for-django","Cloud Architecture Patterns for Django",[1026,1123,1124],{},[1042,1125,1126],{},"Single-Region Architecture",[1128,1129,1134],"pre",{"className":1130,"code":1132,"language":1133},[1131],"language-text","┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐\n│   Load Balancer │───▶│   Web Servers   │───▶│    Database     │\n│   (ALB/CLB)     │    │ (Auto Scaling)  │    │   (RDS/SQL)     │\n└─────────────────┘    └─────────────────┘    └─────────────────┘\n         │                       │                       │\n         ▼                       ▼                       ▼\n┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐\n│   CDN/Static    │    │   File Storage  │    │   Cache Layer   │\n│ (CloudFront/S3) │    │   (S3/Blob)     │    │ (ElastiCache)   │\n└─────────────────┘    └─────────────────┘    └─────────────────┘\n","text",[1135,1136,1132],"code",{"__ignoreMap":1137},"",[1026,1139,1140],{},[1042,1141,1142],{},"Multi-Region Architecture",[1128,1144,1147],{"className":1145,"code":1146,"language":1133},[1131],"┌─────────────────────────────────────────────────────────────────┐\n│                        Global Load Balancer                     │\n│                     (Route 53/Cloud DNS)                       │\n└─────────────────────────────────────────────────────────────────┘\n                                │\n                ┌───────────────┼───────────────┐\n                ▼               ▼               ▼\n        ┌─────────────┐ ┌─────────────┐ ┌─────────────┐\n        │   Region 1  │ │   Region 2  │ │   Region 3  │\n        │   (Primary) │ │ (Secondary) │ │   (DR)      │\n        └─────────────┘ └─────────────┘ └─────────────┘\n                │               │               │\n                ▼               ▼               ▼\n        ┌─────────────┐ ┌─────────────┐ ┌─────────────┐\n        │ DB Primary  │ │ DB Replica  │ │ DB Backup   │\n        └─────────────┘ └─────────────┘ └─────────────┘\n",[1135,1148,1146],{"__ignoreMap":1137},[1035,1150,1152],{"id":1151},"cost-optimization-strategies","Cost Optimization Strategies",[1026,1154,1155],{},[1042,1156,1157],{},"Right-Sizing Resources",[1046,1159,1160,1163,1166],{},[1049,1161,1162],{},"Start small and scale based on actual usage",[1049,1164,1165],{},"Use monitoring to identify over-provisioned resources",[1049,1167,1168],{},"Implement auto-scaling to match demand",[1026,1170,1171],{},[1042,1172,1173],{},"Reserved Instances and Savings Plans",[1046,1175,1176,1179,1182],{},[1049,1177,1178],{},"Commit to 1-3 year terms for significant discounts",[1049,1180,1181],{},"Use for predictable, steady-state workloads",[1049,1183,1184],{},"Combine with spot instances for cost-effective scaling",[1026,1186,1187],{},[1042,1188,1189],{},"Storage Optimization",[1046,1191,1192,1195,1198],{},[1049,1193,1194],{},"Use appropriate storage classes (Standard, IA, Archive)",[1049,1196,1197],{},"Implement lifecycle policies for automatic transitions",[1049,1199,1200],{},"Compress and optimize static files",[1026,1202,1203],{},[1042,1204,1205],{},"Network Cost Management",[1046,1207,1208,1211,1214],{},[1049,1209,1210],{},"Use CDNs to reduce data transfer costs",[1049,1212,1213],{},"Keep traffic within the same region when possible",[1049,1215,1216],{},"Optimize API calls and database queries",[1030,1218,1220],{"id":1219},"amazon-web-services-aws","Amazon Web Services (AWS)",[1026,1222,1223],{},"AWS is the most comprehensive cloud platform with over 200 services. For Django developers, key services include EC2 (compute), RDS (databases), S3 (storage), CloudFront (CDN), and Elastic Beanstalk (PaaS).",[1035,1225,1227],{"id":1226},"aws-account-setup-and-security","AWS Account Setup and Security",[1026,1229,1230],{},[1042,1231,1232],{},"Initial Account Configuration",[1128,1234,1238],{"className":1235,"code":1236,"language":1237,"meta":1137,"style":1137},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Install AWS CLI\ncurl \"https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip\" -o \"awscliv2.zip\"\nunzip awscliv2.zip\nsudo ./aws/install\n\n# Configure AWS CLI\naws configure\n# AWS Access Key ID: [Your Access Key]\n# AWS Secret Access Key: [Your Secret Key]\n# Default region name: us-east-1\n# Default output format: json\n\n# Verify configuration\naws sts get-caller-identity\n","bash",[1135,1239,1240,1249,1279,1288,1297,1304,1310,1319,1325,1331,1337,1343,1348,1354],{"__ignoreMap":1137},[1241,1242,1245],"span",{"class":1243,"line":1244},"line",1,[1241,1246,1248],{"class":1247},"s9Tkl","# Install AWS CLI\n",[1241,1250,1252,1256,1260,1264,1267,1271,1273,1276],{"class":1243,"line":1251},2,[1241,1253,1255],{"class":1254},"sYn-s","curl",[1241,1257,1259],{"class":1258},"sbYkP"," \"",[1241,1261,1263],{"class":1262},"sTbE_","https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip",[1241,1265,1266],{"class":1258},"\"",[1241,1268,1270],{"class":1269},"sz9Cv"," -o",[1241,1272,1259],{"class":1258},[1241,1274,1275],{"class":1262},"awscliv2.zip",[1241,1277,1278],{"class":1258},"\"\n",[1241,1280,1282,1285],{"class":1243,"line":1281},3,[1241,1283,1284],{"class":1254},"unzip",[1241,1286,1287],{"class":1262}," awscliv2.zip\n",[1241,1289,1291,1294],{"class":1243,"line":1290},4,[1241,1292,1293],{"class":1254},"sudo",[1241,1295,1296],{"class":1262}," ./aws/install\n",[1241,1298,1300],{"class":1243,"line":1299},5,[1241,1301,1303],{"emptyLinePlaceholder":1302},true,"\n",[1241,1305,1307],{"class":1243,"line":1306},6,[1241,1308,1309],{"class":1247},"# Configure AWS CLI\n",[1241,1311,1313,1316],{"class":1243,"line":1312},7,[1241,1314,1315],{"class":1254},"aws",[1241,1317,1318],{"class":1262}," configure\n",[1241,1320,1322],{"class":1243,"line":1321},8,[1241,1323,1324],{"class":1247},"# AWS Access Key ID: [Your Access Key]\n",[1241,1326,1328],{"class":1243,"line":1327},9,[1241,1329,1330],{"class":1247},"# AWS Secret Access Key: [Your Secret Key]\n",[1241,1332,1334],{"class":1243,"line":1333},10,[1241,1335,1336],{"class":1247},"# Default region name: us-east-1\n",[1241,1338,1340],{"class":1243,"line":1339},11,[1241,1341,1342],{"class":1247},"# Default output format: json\n",[1241,1344,1346],{"class":1243,"line":1345},12,[1241,1347,1303],{"emptyLinePlaceholder":1302},[1241,1349,1351],{"class":1243,"line":1350},13,[1241,1352,1353],{"class":1247},"# Verify configuration\n",[1241,1355,1357,1359,1362],{"class":1243,"line":1356},14,[1241,1358,1315],{"class":1254},[1241,1360,1361],{"class":1262}," sts",[1241,1363,1364],{"class":1262}," get-caller-identity\n",[1026,1366,1367],{},[1042,1368,1369],{},"IAM Security Best Practices",[1128,1371,1375],{"className":1372,"code":1373,"language":1374,"meta":1137,"style":1137},"language-json shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"ec2:*\",\n        \"rds:*\",\n        \"s3:*\",\n        \"elasticbeanstalk:*\",\n        \"iam:PassRole\",\n        \"cloudformation:*\"\n      ],\n      \"Resource\": \"*\",\n      \"Condition\": {\n        \"StringEquals\": {\n          \"aws:RequestedRegion\": [\"us-east-1\", \"us-west-2\"]\n        }\n      }\n    }\n  ]\n}\n","json",[1135,1376,1377,1383,1408,1422,1427,1449,1462,1474,1485,1496,1507,1518,1527,1532,1552,1567,1582,1619,1625,1631,1637,1643],{"__ignoreMap":1137},[1241,1378,1379],{"class":1243,"line":1244},[1241,1380,1382],{"class":1381},"soVBu","{\n",[1241,1384,1385,1389,1393,1395,1398,1400,1403,1405],{"class":1243,"line":1251},[1241,1386,1388],{"class":1387},"s4Jsk","  \"",[1241,1390,1392],{"class":1391},"sLorS","Version",[1241,1394,1266],{"class":1387},[1241,1396,1397],{"class":1381},":",[1241,1399,1259],{"class":1258},[1241,1401,1402],{"class":1262},"2012-10-17",[1241,1404,1266],{"class":1258},[1241,1406,1407],{"class":1381},",\n",[1241,1409,1410,1412,1415,1417,1419],{"class":1243,"line":1281},[1241,1411,1388],{"class":1387},[1241,1413,1414],{"class":1391},"Statement",[1241,1416,1266],{"class":1387},[1241,1418,1397],{"class":1381},[1241,1420,1421],{"class":1381}," [\n",[1241,1423,1424],{"class":1243,"line":1290},[1241,1425,1426],{"class":1381},"    {\n",[1241,1428,1429,1432,1436,1438,1440,1442,1445,1447],{"class":1243,"line":1299},[1241,1430,1431],{"class":1387},"      \"",[1241,1433,1435],{"class":1434},"sa2tF","Effect",[1241,1437,1266],{"class":1387},[1241,1439,1397],{"class":1381},[1241,1441,1259],{"class":1258},[1241,1443,1444],{"class":1262},"Allow",[1241,1446,1266],{"class":1258},[1241,1448,1407],{"class":1381},[1241,1450,1451,1453,1456,1458,1460],{"class":1243,"line":1306},[1241,1452,1431],{"class":1387},[1241,1454,1455],{"class":1434},"Action",[1241,1457,1266],{"class":1387},[1241,1459,1397],{"class":1381},[1241,1461,1421],{"class":1381},[1241,1463,1464,1467,1470,1472],{"class":1243,"line":1312},[1241,1465,1466],{"class":1258},"        \"",[1241,1468,1469],{"class":1262},"ec2:*",[1241,1471,1266],{"class":1258},[1241,1473,1407],{"class":1381},[1241,1475,1476,1478,1481,1483],{"class":1243,"line":1321},[1241,1477,1466],{"class":1258},[1241,1479,1480],{"class":1262},"rds:*",[1241,1482,1266],{"class":1258},[1241,1484,1407],{"class":1381},[1241,1486,1487,1489,1492,1494],{"class":1243,"line":1327},[1241,1488,1466],{"class":1258},[1241,1490,1491],{"class":1262},"s3:*",[1241,1493,1266],{"class":1258},[1241,1495,1407],{"class":1381},[1241,1497,1498,1500,1503,1505],{"class":1243,"line":1333},[1241,1499,1466],{"class":1258},[1241,1501,1502],{"class":1262},"elasticbeanstalk:*",[1241,1504,1266],{"class":1258},[1241,1506,1407],{"class":1381},[1241,1508,1509,1511,1514,1516],{"class":1243,"line":1339},[1241,1510,1466],{"class":1258},[1241,1512,1513],{"class":1262},"iam:PassRole",[1241,1515,1266],{"class":1258},[1241,1517,1407],{"class":1381},[1241,1519,1520,1522,1525],{"class":1243,"line":1345},[1241,1521,1466],{"class":1258},[1241,1523,1524],{"class":1262},"cloudformation:*",[1241,1526,1278],{"class":1258},[1241,1528,1529],{"class":1243,"line":1350},[1241,1530,1531],{"class":1381},"      ],\n",[1241,1533,1534,1536,1539,1541,1543,1545,1548,1550],{"class":1243,"line":1356},[1241,1535,1431],{"class":1387},[1241,1537,1538],{"class":1434},"Resource",[1241,1540,1266],{"class":1387},[1241,1542,1397],{"class":1381},[1241,1544,1259],{"class":1258},[1241,1546,1547],{"class":1262},"*",[1241,1549,1266],{"class":1258},[1241,1551,1407],{"class":1381},[1241,1553,1555,1557,1560,1562,1564],{"class":1243,"line":1554},15,[1241,1556,1431],{"class":1387},[1241,1558,1559],{"class":1434},"Condition",[1241,1561,1266],{"class":1387},[1241,1563,1397],{"class":1381},[1241,1565,1566],{"class":1381}," {\n",[1241,1568,1570,1572,1576,1578,1580],{"class":1243,"line":1569},16,[1241,1571,1466],{"class":1387},[1241,1573,1575],{"class":1574},"skNjk","StringEquals",[1241,1577,1266],{"class":1387},[1241,1579,1397],{"class":1381},[1241,1581,1566],{"class":1381},[1241,1583,1585,1588,1592,1594,1596,1599,1601,1604,1606,1609,1611,1614,1616],{"class":1243,"line":1584},17,[1241,1586,1587],{"class":1387},"          \"",[1241,1589,1591],{"class":1590},"suXOh","aws:RequestedRegion",[1241,1593,1266],{"class":1387},[1241,1595,1397],{"class":1381},[1241,1597,1598],{"class":1381}," [",[1241,1600,1266],{"class":1258},[1241,1602,1603],{"class":1262},"us-east-1",[1241,1605,1266],{"class":1258},[1241,1607,1608],{"class":1381},",",[1241,1610,1259],{"class":1258},[1241,1612,1613],{"class":1262},"us-west-2",[1241,1615,1266],{"class":1258},[1241,1617,1618],{"class":1381},"]\n",[1241,1620,1622],{"class":1243,"line":1621},18,[1241,1623,1624],{"class":1381},"        }\n",[1241,1626,1628],{"class":1243,"line":1627},19,[1241,1629,1630],{"class":1381},"      }\n",[1241,1632,1634],{"class":1243,"line":1633},20,[1241,1635,1636],{"class":1381},"    }\n",[1241,1638,1640],{"class":1243,"line":1639},21,[1241,1641,1642],{"class":1381},"  ]\n",[1241,1644,1646],{"class":1243,"line":1645},22,[1241,1647,1648],{"class":1381},"}\n",[1035,1650,1652],{"id":1651},"elastic-beanstalk-deployment","Elastic Beanstalk Deployment",[1026,1654,1655],{},"Elastic Beanstalk is AWS's PaaS offering that simplifies Django deployment while maintaining full control over underlying resources.",[1026,1657,1658],{},[1042,1659,1660],{},"Project Structure for Beanstalk",[1128,1662,1665],{"className":1663,"code":1664,"language":1133},[1131],"myproject/\n├── .ebextensions/\n│   ├── 01_packages.config\n│   ├── 02_python.config\n│   ├── 03_django.config\n│   └── 04_https.config\n├── .elasticbeanstalk/\n│   └── config.yml\n├── requirements.txt\n├── manage.py\n├── myproject/\n│   ├── settings/\n│   │   ├── __init__.py\n│   │   ├── base.py\n│   │   ├── development.py\n│   │   └── production.py\n│   └── wsgi.py\n└── application.py  # EB entry point\n",[1135,1666,1664],{"__ignoreMap":1137},[1026,1668,1669],{},[1042,1670,1671],{},"Django Settings for Elastic Beanstalk",[1128,1673,1677],{"className":1674,"code":1675,"language":1676,"meta":1137,"style":1137},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# settings/production.py\nimport os\nfrom .base import *\n\n# Elastic Beanstalk environment variables\nDEBUG = False\nALLOWED_HOSTS = [\n    '.elasticbeanstalk.com',\n    '.amazonaws.com',\n    os.environ.get('DOMAIN_NAME', ''),\n]\n\n# Database configuration from EB environment\nif 'RDS_HOSTNAME' in os.environ:\n    DATABASES = {\n        'default': {\n            'ENGINE': 'django.db.backends.postgresql',\n            'NAME': os.environ['RDS_DB_NAME'],\n            'USER': os.environ['RDS_USERNAME'],\n            'PASSWORD': os.environ['RDS_PASSWORD'],\n            'HOST': os.environ['RDS_HOSTNAME'],\n            'PORT': os.environ['RDS_PORT'],\n            'OPTIONS': {\n                'sslmode': 'require',\n            },\n        }\n    }\n\n# S3 Static and Media Files\nAWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')\nAWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')\nAWS_STORAGE_BUCKET_NAME = os.environ.get('S3_BUCKET_NAME')\nAWS_S3_REGION_NAME = os.environ.get('AWS_DEFAULT_REGION', 'us-east-1')\nAWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'\n\n# Static files configuration\nSTATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'\nSTATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'\n\n# Media files configuration\nDEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'\nMEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'\n\n# S3 settings\nAWS_DEFAULT_ACL = 'public-read'\nAWS_S3_OBJECT_PARAMETERS = {\n    'CacheControl': 'max-age=86400',\n}\nAWS_S3_FILE_OVERWRITE = False\nAWS_QUERYSTRING_AUTH = False\n\n# Security settings\nSECURE_SSL_REDIRECT = True\nSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')\nSECURE_HSTS_SECONDS = 31536000\nSECURE_HSTS_INCLUDE_SUBDOMAINS = True\nSECURE_HSTS_PRELOAD = True\n\n# Session and CSRF cookies\nSESSION_COOKIE_SECURE = True\nCSRF_COOKIE_SECURE = True\n\n# Logging to CloudWatch\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'file': {\n            'level': 'INFO',\n            'class': 'logging.FileHandler',\n            'filename': '/opt/python/log/django.log',\n        },\n        'console': {\n            'level': 'INFO',\n            'class': 'logging.StreamHandler',\n        },\n    },\n    'loggers': {\n        'django': {\n            'handlers': ['file', 'console'],\n            'level': 'INFO',\n            'propagate': True,\n        },\n    },\n}\n","python",[1135,1678,1679,1684,1694,1711,1715,1720,1733,1742,1755,1766,1802,1806,1810,1815,1841,1850,1864,1885,1915,1943,1971,1998,2026,2040,2062,2068,2073,2078,2083,2089,2118,2146,2175,2212,2238,2243,2249,2265,2287,2292,2298,2312,2333,2338,2344,2359,2369,2390,2395,2405,2415,2420,2426,2437,2466,2478,2488,2498,2503,2509,2519,2529,2534,2540,2550,2567,2584,2598,2612,2633,2654,2675,2681,2695,2714,2734,2739,2745,2759,2773,2802,2821,2838,2843,2848],{"__ignoreMap":1137},[1241,1680,1681],{"class":1243,"line":1244},[1241,1682,1683],{"class":1247},"# settings/production.py\n",[1241,1685,1686,1690],{"class":1243,"line":1251},[1241,1687,1689],{"class":1688},"siDh9","import",[1241,1691,1693],{"class":1692},"sftqT"," os\n",[1241,1695,1696,1699,1702,1705,1707],{"class":1243,"line":1281},[1241,1697,1698],{"class":1688},"from",[1241,1700,1701],{"class":1381}," .",[1241,1703,1704],{"class":1692},"base ",[1241,1706,1689],{"class":1688},[1241,1708,1710],{"class":1709},"sVsLi"," *\n",[1241,1712,1713],{"class":1243,"line":1290},[1241,1714,1303],{"emptyLinePlaceholder":1302},[1241,1716,1717],{"class":1243,"line":1299},[1241,1718,1719],{"class":1247},"# Elastic Beanstalk environment variables\n",[1241,1721,1722,1726,1729],{"class":1243,"line":1306},[1241,1723,1725],{"class":1724},"se3Ec","DEBUG",[1241,1727,1728],{"class":1381}," =",[1241,1730,1732],{"class":1731},"s8XtY"," False\n",[1241,1734,1735,1738,1740],{"class":1243,"line":1312},[1241,1736,1737],{"class":1724},"ALLOWED_HOSTS",[1241,1739,1728],{"class":1381},[1241,1741,1421],{"class":1381},[1241,1743,1744,1747,1750,1753],{"class":1243,"line":1321},[1241,1745,1746],{"class":1258},"    '",[1241,1748,1749],{"class":1262},".elasticbeanstalk.com",[1241,1751,1752],{"class":1258},"'",[1241,1754,1407],{"class":1381},[1241,1756,1757,1759,1762,1764],{"class":1243,"line":1327},[1241,1758,1746],{"class":1258},[1241,1760,1761],{"class":1262},".amazonaws.com",[1241,1763,1752],{"class":1258},[1241,1765,1407],{"class":1381},[1241,1767,1768,1771,1774,1778,1780,1784,1787,1789,1792,1794,1796,1799],{"class":1243,"line":1333},[1241,1769,1770],{"class":1692},"    os",[1241,1772,1773],{"class":1381},".",[1241,1775,1777],{"class":1776},"sBPpx","environ",[1241,1779,1773],{"class":1381},[1241,1781,1783],{"class":1782},"siWMO","get",[1241,1785,1786],{"class":1381},"(",[1241,1788,1752],{"class":1258},[1241,1790,1791],{"class":1262},"DOMAIN_NAME",[1241,1793,1752],{"class":1258},[1241,1795,1608],{"class":1381},[1241,1797,1798],{"class":1258}," ''",[1241,1800,1801],{"class":1381},"),\n",[1241,1803,1804],{"class":1243,"line":1339},[1241,1805,1618],{"class":1381},[1241,1807,1808],{"class":1243,"line":1345},[1241,1809,1303],{"emptyLinePlaceholder":1302},[1241,1811,1812],{"class":1243,"line":1350},[1241,1813,1814],{"class":1247},"# Database configuration from EB environment\n",[1241,1816,1817,1820,1823,1826,1828,1831,1834,1836,1838],{"class":1243,"line":1356},[1241,1818,1819],{"class":1688},"if",[1241,1821,1822],{"class":1258}," '",[1241,1824,1825],{"class":1262},"RDS_HOSTNAME",[1241,1827,1752],{"class":1258},[1241,1829,1830],{"class":1709}," in",[1241,1832,1833],{"class":1692}," os",[1241,1835,1773],{"class":1381},[1241,1837,1777],{"class":1776},[1241,1839,1840],{"class":1381},":\n",[1241,1842,1843,1846,1848],{"class":1243,"line":1554},[1241,1844,1845],{"class":1724},"    DATABASES",[1241,1847,1728],{"class":1381},[1241,1849,1566],{"class":1381},[1241,1851,1852,1855,1858,1860,1862],{"class":1243,"line":1569},[1241,1853,1854],{"class":1258},"        '",[1241,1856,1857],{"class":1262},"default",[1241,1859,1752],{"class":1258},[1241,1861,1397],{"class":1381},[1241,1863,1566],{"class":1381},[1241,1865,1866,1869,1872,1874,1876,1878,1881,1883],{"class":1243,"line":1584},[1241,1867,1868],{"class":1258},"            '",[1241,1870,1871],{"class":1262},"ENGINE",[1241,1873,1752],{"class":1258},[1241,1875,1397],{"class":1381},[1241,1877,1822],{"class":1258},[1241,1879,1880],{"class":1262},"django.db.backends.postgresql",[1241,1882,1752],{"class":1258},[1241,1884,1407],{"class":1381},[1241,1886,1887,1889,1892,1894,1896,1898,1900,1902,1905,1907,1910,1912],{"class":1243,"line":1621},[1241,1888,1868],{"class":1258},[1241,1890,1891],{"class":1262},"NAME",[1241,1893,1752],{"class":1258},[1241,1895,1397],{"class":1381},[1241,1897,1833],{"class":1692},[1241,1899,1773],{"class":1381},[1241,1901,1777],{"class":1776},[1241,1903,1904],{"class":1381},"[",[1241,1906,1752],{"class":1258},[1241,1908,1909],{"class":1262},"RDS_DB_NAME",[1241,1911,1752],{"class":1258},[1241,1913,1914],{"class":1381},"],\n",[1241,1916,1917,1919,1922,1924,1926,1928,1930,1932,1934,1936,1939,1941],{"class":1243,"line":1627},[1241,1918,1868],{"class":1258},[1241,1920,1921],{"class":1262},"USER",[1241,1923,1752],{"class":1258},[1241,1925,1397],{"class":1381},[1241,1927,1833],{"class":1692},[1241,1929,1773],{"class":1381},[1241,1931,1777],{"class":1776},[1241,1933,1904],{"class":1381},[1241,1935,1752],{"class":1258},[1241,1937,1938],{"class":1262},"RDS_USERNAME",[1241,1940,1752],{"class":1258},[1241,1942,1914],{"class":1381},[1241,1944,1945,1947,1950,1952,1954,1956,1958,1960,1962,1964,1967,1969],{"class":1243,"line":1633},[1241,1946,1868],{"class":1258},[1241,1948,1949],{"class":1262},"PASSWORD",[1241,1951,1752],{"class":1258},[1241,1953,1397],{"class":1381},[1241,1955,1833],{"class":1692},[1241,1957,1773],{"class":1381},[1241,1959,1777],{"class":1776},[1241,1961,1904],{"class":1381},[1241,1963,1752],{"class":1258},[1241,1965,1966],{"class":1262},"RDS_PASSWORD",[1241,1968,1752],{"class":1258},[1241,1970,1914],{"class":1381},[1241,1972,1973,1975,1978,1980,1982,1984,1986,1988,1990,1992,1994,1996],{"class":1243,"line":1639},[1241,1974,1868],{"class":1258},[1241,1976,1977],{"class":1262},"HOST",[1241,1979,1752],{"class":1258},[1241,1981,1397],{"class":1381},[1241,1983,1833],{"class":1692},[1241,1985,1773],{"class":1381},[1241,1987,1777],{"class":1776},[1241,1989,1904],{"class":1381},[1241,1991,1752],{"class":1258},[1241,1993,1825],{"class":1262},[1241,1995,1752],{"class":1258},[1241,1997,1914],{"class":1381},[1241,1999,2000,2002,2005,2007,2009,2011,2013,2015,2017,2019,2022,2024],{"class":1243,"line":1645},[1241,2001,1868],{"class":1258},[1241,2003,2004],{"class":1262},"PORT",[1241,2006,1752],{"class":1258},[1241,2008,1397],{"class":1381},[1241,2010,1833],{"class":1692},[1241,2012,1773],{"class":1381},[1241,2014,1777],{"class":1776},[1241,2016,1904],{"class":1381},[1241,2018,1752],{"class":1258},[1241,2020,2021],{"class":1262},"RDS_PORT",[1241,2023,1752],{"class":1258},[1241,2025,1914],{"class":1381},[1241,2027,2029,2031,2034,2036,2038],{"class":1243,"line":2028},23,[1241,2030,1868],{"class":1258},[1241,2032,2033],{"class":1262},"OPTIONS",[1241,2035,1752],{"class":1258},[1241,2037,1397],{"class":1381},[1241,2039,1566],{"class":1381},[1241,2041,2043,2046,2049,2051,2053,2055,2058,2060],{"class":1243,"line":2042},24,[1241,2044,2045],{"class":1258},"                '",[1241,2047,2048],{"class":1262},"sslmode",[1241,2050,1752],{"class":1258},[1241,2052,1397],{"class":1381},[1241,2054,1822],{"class":1258},[1241,2056,2057],{"class":1262},"require",[1241,2059,1752],{"class":1258},[1241,2061,1407],{"class":1381},[1241,2063,2065],{"class":1243,"line":2064},25,[1241,2066,2067],{"class":1381},"            },\n",[1241,2069,2071],{"class":1243,"line":2070},26,[1241,2072,1624],{"class":1381},[1241,2074,2076],{"class":1243,"line":2075},27,[1241,2077,1636],{"class":1381},[1241,2079,2081],{"class":1243,"line":2080},28,[1241,2082,1303],{"emptyLinePlaceholder":1302},[1241,2084,2086],{"class":1243,"line":2085},29,[1241,2087,2088],{"class":1247},"# S3 Static and Media Files\n",[1241,2090,2092,2095,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115],{"class":1243,"line":2091},30,[1241,2093,2094],{"class":1724},"AWS_ACCESS_KEY_ID",[1241,2096,1728],{"class":1381},[1241,2098,1833],{"class":1692},[1241,2100,1773],{"class":1381},[1241,2102,1777],{"class":1776},[1241,2104,1773],{"class":1381},[1241,2106,1783],{"class":1782},[1241,2108,1786],{"class":1381},[1241,2110,1752],{"class":1258},[1241,2112,2094],{"class":1262},[1241,2114,1752],{"class":1258},[1241,2116,2117],{"class":1381},")\n",[1241,2119,2121,2124,2126,2128,2130,2132,2134,2136,2138,2140,2142,2144],{"class":1243,"line":2120},31,[1241,2122,2123],{"class":1724},"AWS_SECRET_ACCESS_KEY",[1241,2125,1728],{"class":1381},[1241,2127,1833],{"class":1692},[1241,2129,1773],{"class":1381},[1241,2131,1777],{"class":1776},[1241,2133,1773],{"class":1381},[1241,2135,1783],{"class":1782},[1241,2137,1786],{"class":1381},[1241,2139,1752],{"class":1258},[1241,2141,2123],{"class":1262},[1241,2143,1752],{"class":1258},[1241,2145,2117],{"class":1381},[1241,2147,2149,2152,2154,2156,2158,2160,2162,2164,2166,2168,2171,2173],{"class":1243,"line":2148},32,[1241,2150,2151],{"class":1724},"AWS_STORAGE_BUCKET_NAME",[1241,2153,1728],{"class":1381},[1241,2155,1833],{"class":1692},[1241,2157,1773],{"class":1381},[1241,2159,1777],{"class":1776},[1241,2161,1773],{"class":1381},[1241,2163,1783],{"class":1782},[1241,2165,1786],{"class":1381},[1241,2167,1752],{"class":1258},[1241,2169,2170],{"class":1262},"S3_BUCKET_NAME",[1241,2172,1752],{"class":1258},[1241,2174,2117],{"class":1381},[1241,2176,2178,2181,2183,2185,2187,2189,2191,2193,2195,2197,2200,2202,2204,2206,2208,2210],{"class":1243,"line":2177},33,[1241,2179,2180],{"class":1724},"AWS_S3_REGION_NAME",[1241,2182,1728],{"class":1381},[1241,2184,1833],{"class":1692},[1241,2186,1773],{"class":1381},[1241,2188,1777],{"class":1776},[1241,2190,1773],{"class":1381},[1241,2192,1783],{"class":1782},[1241,2194,1786],{"class":1381},[1241,2196,1752],{"class":1258},[1241,2198,2199],{"class":1262},"AWS_DEFAULT_REGION",[1241,2201,1752],{"class":1258},[1241,2203,1608],{"class":1381},[1241,2205,1822],{"class":1258},[1241,2207,1603],{"class":1262},[1241,2209,1752],{"class":1258},[1241,2211,2117],{"class":1381},[1241,2213,2215,2218,2220,2224,2226,2230,2232,2235],{"class":1243,"line":2214},34,[1241,2216,2217],{"class":1724},"AWS_S3_CUSTOM_DOMAIN",[1241,2219,1728],{"class":1381},[1241,2221,2223],{"class":2222},"s5Kfy"," f",[1241,2225,1752],{"class":1262},[1241,2227,2229],{"class":2228},"s3h35","{",[1241,2231,2151],{"class":1724},[1241,2233,2234],{"class":2228},"}",[1241,2236,2237],{"class":1262},".s3.amazonaws.com'\n",[1241,2239,2241],{"class":1243,"line":2240},35,[1241,2242,1303],{"emptyLinePlaceholder":1302},[1241,2244,2246],{"class":1243,"line":2245},36,[1241,2247,2248],{"class":1247},"# Static files configuration\n",[1241,2250,2252,2255,2257,2259,2262],{"class":1243,"line":2251},37,[1241,2253,2254],{"class":1724},"STATICFILES_STORAGE",[1241,2256,1728],{"class":1381},[1241,2258,1822],{"class":1258},[1241,2260,2261],{"class":1262},"storages.backends.s3boto3.S3Boto3Storage",[1241,2263,2264],{"class":1258},"'\n",[1241,2266,2268,2271,2273,2275,2278,2280,2282,2284],{"class":1243,"line":2267},38,[1241,2269,2270],{"class":1724},"STATIC_URL",[1241,2272,1728],{"class":1381},[1241,2274,2223],{"class":2222},[1241,2276,2277],{"class":1262},"'https://",[1241,2279,2229],{"class":2228},[1241,2281,2217],{"class":1724},[1241,2283,2234],{"class":2228},[1241,2285,2286],{"class":1262},"/static/'\n",[1241,2288,2290],{"class":1243,"line":2289},39,[1241,2291,1303],{"emptyLinePlaceholder":1302},[1241,2293,2295],{"class":1243,"line":2294},40,[1241,2296,2297],{"class":1247},"# Media files configuration\n",[1241,2299,2301,2304,2306,2308,2310],{"class":1243,"line":2300},41,[1241,2302,2303],{"class":1724},"DEFAULT_FILE_STORAGE",[1241,2305,1728],{"class":1381},[1241,2307,1822],{"class":1258},[1241,2309,2261],{"class":1262},[1241,2311,2264],{"class":1258},[1241,2313,2315,2318,2320,2322,2324,2326,2328,2330],{"class":1243,"line":2314},42,[1241,2316,2317],{"class":1724},"MEDIA_URL",[1241,2319,1728],{"class":1381},[1241,2321,2223],{"class":2222},[1241,2323,2277],{"class":1262},[1241,2325,2229],{"class":2228},[1241,2327,2217],{"class":1724},[1241,2329,2234],{"class":2228},[1241,2331,2332],{"class":1262},"/media/'\n",[1241,2334,2336],{"class":1243,"line":2335},43,[1241,2337,1303],{"emptyLinePlaceholder":1302},[1241,2339,2341],{"class":1243,"line":2340},44,[1241,2342,2343],{"class":1247},"# S3 settings\n",[1241,2345,2347,2350,2352,2354,2357],{"class":1243,"line":2346},45,[1241,2348,2349],{"class":1724},"AWS_DEFAULT_ACL",[1241,2351,1728],{"class":1381},[1241,2353,1822],{"class":1258},[1241,2355,2356],{"class":1262},"public-read",[1241,2358,2264],{"class":1258},[1241,2360,2362,2365,2367],{"class":1243,"line":2361},46,[1241,2363,2364],{"class":1724},"AWS_S3_OBJECT_PARAMETERS",[1241,2366,1728],{"class":1381},[1241,2368,1566],{"class":1381},[1241,2370,2372,2374,2377,2379,2381,2383,2386,2388],{"class":1243,"line":2371},47,[1241,2373,1746],{"class":1258},[1241,2375,2376],{"class":1262},"CacheControl",[1241,2378,1752],{"class":1258},[1241,2380,1397],{"class":1381},[1241,2382,1822],{"class":1258},[1241,2384,2385],{"class":1262},"max-age=86400",[1241,2387,1752],{"class":1258},[1241,2389,1407],{"class":1381},[1241,2391,2393],{"class":1243,"line":2392},48,[1241,2394,1648],{"class":1381},[1241,2396,2398,2401,2403],{"class":1243,"line":2397},49,[1241,2399,2400],{"class":1724},"AWS_S3_FILE_OVERWRITE",[1241,2402,1728],{"class":1381},[1241,2404,1732],{"class":1731},[1241,2406,2408,2411,2413],{"class":1243,"line":2407},50,[1241,2409,2410],{"class":1724},"AWS_QUERYSTRING_AUTH",[1241,2412,1728],{"class":1381},[1241,2414,1732],{"class":1731},[1241,2416,2418],{"class":1243,"line":2417},51,[1241,2419,1303],{"emptyLinePlaceholder":1302},[1241,2421,2423],{"class":1243,"line":2422},52,[1241,2424,2425],{"class":1247},"# Security settings\n",[1241,2427,2429,2432,2434],{"class":1243,"line":2428},53,[1241,2430,2431],{"class":1724},"SECURE_SSL_REDIRECT",[1241,2433,1728],{"class":1381},[1241,2435,2436],{"class":1731}," True\n",[1241,2438,2440,2443,2445,2448,2450,2453,2455,2457,2459,2462,2464],{"class":1243,"line":2439},54,[1241,2441,2442],{"class":1724},"SECURE_PROXY_SSL_HEADER",[1241,2444,1728],{"class":1381},[1241,2446,2447],{"class":1381}," (",[1241,2449,1752],{"class":1258},[1241,2451,2452],{"class":1262},"HTTP_X_FORWARDED_PROTO",[1241,2454,1752],{"class":1258},[1241,2456,1608],{"class":1381},[1241,2458,1822],{"class":1258},[1241,2460,2461],{"class":1262},"https",[1241,2463,1752],{"class":1258},[1241,2465,2117],{"class":1381},[1241,2467,2469,2472,2474],{"class":1243,"line":2468},55,[1241,2470,2471],{"class":1724},"SECURE_HSTS_SECONDS",[1241,2473,1728],{"class":1381},[1241,2475,2477],{"class":2476},"s7CZa"," 31536000\n",[1241,2479,2481,2484,2486],{"class":1243,"line":2480},56,[1241,2482,2483],{"class":1724},"SECURE_HSTS_INCLUDE_SUBDOMAINS",[1241,2485,1728],{"class":1381},[1241,2487,2436],{"class":1731},[1241,2489,2491,2494,2496],{"class":1243,"line":2490},57,[1241,2492,2493],{"class":1724},"SECURE_HSTS_PRELOAD",[1241,2495,1728],{"class":1381},[1241,2497,2436],{"class":1731},[1241,2499,2501],{"class":1243,"line":2500},58,[1241,2502,1303],{"emptyLinePlaceholder":1302},[1241,2504,2506],{"class":1243,"line":2505},59,[1241,2507,2508],{"class":1247},"# Session and CSRF cookies\n",[1241,2510,2512,2515,2517],{"class":1243,"line":2511},60,[1241,2513,2514],{"class":1724},"SESSION_COOKIE_SECURE",[1241,2516,1728],{"class":1381},[1241,2518,2436],{"class":1731},[1241,2520,2522,2525,2527],{"class":1243,"line":2521},61,[1241,2523,2524],{"class":1724},"CSRF_COOKIE_SECURE",[1241,2526,1728],{"class":1381},[1241,2528,2436],{"class":1731},[1241,2530,2532],{"class":1243,"line":2531},62,[1241,2533,1303],{"emptyLinePlaceholder":1302},[1241,2535,2537],{"class":1243,"line":2536},63,[1241,2538,2539],{"class":1247},"# Logging to CloudWatch\n",[1241,2541,2543,2546,2548],{"class":1243,"line":2542},64,[1241,2544,2545],{"class":1724},"LOGGING",[1241,2547,1728],{"class":1381},[1241,2549,1566],{"class":1381},[1241,2551,2553,2555,2558,2560,2562,2565],{"class":1243,"line":2552},65,[1241,2554,1746],{"class":1258},[1241,2556,2557],{"class":1262},"version",[1241,2559,1752],{"class":1258},[1241,2561,1397],{"class":1381},[1241,2563,2564],{"class":2476}," 1",[1241,2566,1407],{"class":1381},[1241,2568,2570,2572,2575,2577,2579,2582],{"class":1243,"line":2569},66,[1241,2571,1746],{"class":1258},[1241,2573,2574],{"class":1262},"disable_existing_loggers",[1241,2576,1752],{"class":1258},[1241,2578,1397],{"class":1381},[1241,2580,2581],{"class":1731}," False",[1241,2583,1407],{"class":1381},[1241,2585,2587,2589,2592,2594,2596],{"class":1243,"line":2586},67,[1241,2588,1746],{"class":1258},[1241,2590,2591],{"class":1262},"handlers",[1241,2593,1752],{"class":1258},[1241,2595,1397],{"class":1381},[1241,2597,1566],{"class":1381},[1241,2599,2601,2603,2606,2608,2610],{"class":1243,"line":2600},68,[1241,2602,1854],{"class":1258},[1241,2604,2605],{"class":1262},"file",[1241,2607,1752],{"class":1258},[1241,2609,1397],{"class":1381},[1241,2611,1566],{"class":1381},[1241,2613,2615,2617,2620,2622,2624,2626,2629,2631],{"class":1243,"line":2614},69,[1241,2616,1868],{"class":1258},[1241,2618,2619],{"class":1262},"level",[1241,2621,1752],{"class":1258},[1241,2623,1397],{"class":1381},[1241,2625,1822],{"class":1258},[1241,2627,2628],{"class":1262},"INFO",[1241,2630,1752],{"class":1258},[1241,2632,1407],{"class":1381},[1241,2634,2636,2638,2641,2643,2645,2647,2650,2652],{"class":1243,"line":2635},70,[1241,2637,1868],{"class":1258},[1241,2639,2640],{"class":1262},"class",[1241,2642,1752],{"class":1258},[1241,2644,1397],{"class":1381},[1241,2646,1822],{"class":1258},[1241,2648,2649],{"class":1262},"logging.FileHandler",[1241,2651,1752],{"class":1258},[1241,2653,1407],{"class":1381},[1241,2655,2657,2659,2662,2664,2666,2668,2671,2673],{"class":1243,"line":2656},71,[1241,2658,1868],{"class":1258},[1241,2660,2661],{"class":1262},"filename",[1241,2663,1752],{"class":1258},[1241,2665,1397],{"class":1381},[1241,2667,1822],{"class":1258},[1241,2669,2670],{"class":1262},"/opt/python/log/django.log",[1241,2672,1752],{"class":1258},[1241,2674,1407],{"class":1381},[1241,2676,2678],{"class":1243,"line":2677},72,[1241,2679,2680],{"class":1381},"        },\n",[1241,2682,2684,2686,2689,2691,2693],{"class":1243,"line":2683},73,[1241,2685,1854],{"class":1258},[1241,2687,2688],{"class":1262},"console",[1241,2690,1752],{"class":1258},[1241,2692,1397],{"class":1381},[1241,2694,1566],{"class":1381},[1241,2696,2698,2700,2702,2704,2706,2708,2710,2712],{"class":1243,"line":2697},74,[1241,2699,1868],{"class":1258},[1241,2701,2619],{"class":1262},[1241,2703,1752],{"class":1258},[1241,2705,1397],{"class":1381},[1241,2707,1822],{"class":1258},[1241,2709,2628],{"class":1262},[1241,2711,1752],{"class":1258},[1241,2713,1407],{"class":1381},[1241,2715,2717,2719,2721,2723,2725,2727,2730,2732],{"class":1243,"line":2716},75,[1241,2718,1868],{"class":1258},[1241,2720,2640],{"class":1262},[1241,2722,1752],{"class":1258},[1241,2724,1397],{"class":1381},[1241,2726,1822],{"class":1258},[1241,2728,2729],{"class":1262},"logging.StreamHandler",[1241,2731,1752],{"class":1258},[1241,2733,1407],{"class":1381},[1241,2735,2737],{"class":1243,"line":2736},76,[1241,2738,2680],{"class":1381},[1241,2740,2742],{"class":1243,"line":2741},77,[1241,2743,2744],{"class":1381},"    },\n",[1241,2746,2748,2750,2753,2755,2757],{"class":1243,"line":2747},78,[1241,2749,1746],{"class":1258},[1241,2751,2752],{"class":1262},"loggers",[1241,2754,1752],{"class":1258},[1241,2756,1397],{"class":1381},[1241,2758,1566],{"class":1381},[1241,2760,2762,2764,2767,2769,2771],{"class":1243,"line":2761},79,[1241,2763,1854],{"class":1258},[1241,2765,2766],{"class":1262},"django",[1241,2768,1752],{"class":1258},[1241,2770,1397],{"class":1381},[1241,2772,1566],{"class":1381},[1241,2774,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798,2800],{"class":1243,"line":2775},80,[1241,2777,1868],{"class":1258},[1241,2779,2591],{"class":1262},[1241,2781,1752],{"class":1258},[1241,2783,1397],{"class":1381},[1241,2785,1598],{"class":1381},[1241,2787,1752],{"class":1258},[1241,2789,2605],{"class":1262},[1241,2791,1752],{"class":1258},[1241,2793,1608],{"class":1381},[1241,2795,1822],{"class":1258},[1241,2797,2688],{"class":1262},[1241,2799,1752],{"class":1258},[1241,2801,1914],{"class":1381},[1241,2803,2805,2807,2809,2811,2813,2815,2817,2819],{"class":1243,"line":2804},81,[1241,2806,1868],{"class":1258},[1241,2808,2619],{"class":1262},[1241,2810,1752],{"class":1258},[1241,2812,1397],{"class":1381},[1241,2814,1822],{"class":1258},[1241,2816,2628],{"class":1262},[1241,2818,1752],{"class":1258},[1241,2820,1407],{"class":1381},[1241,2822,2824,2826,2829,2831,2833,2836],{"class":1243,"line":2823},82,[1241,2825,1868],{"class":1258},[1241,2827,2828],{"class":1262},"propagate",[1241,2830,1752],{"class":1258},[1241,2832,1397],{"class":1381},[1241,2834,2835],{"class":1731}," True",[1241,2837,1407],{"class":1381},[1241,2839,2841],{"class":1243,"line":2840},83,[1241,2842,2680],{"class":1381},[1241,2844,2846],{"class":1243,"line":2845},84,[1241,2847,2744],{"class":1381},[1241,2849,2851],{"class":1243,"line":2850},85,[1241,2852,1648],{"class":1381},[1026,2854,2855],{},[1042,2856,2857],{},"Application Entry Point",[1128,2859,2861],{"className":1674,"code":2860,"language":1676,"meta":1137,"style":1137},"# application.py\nimport os\nimport sys\n\n# Add the project directory to Python path\nsys.path.insert(0, os.path.dirname(__file__))\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.production')\n\nfrom django.core.wsgi import get_wsgi_application\napplication = get_wsgi_application()\n",[1135,2862,2863,2868,2874,2881,2885,2890,2932,2936,2970,2974,2996],{"__ignoreMap":1137},[1241,2864,2865],{"class":1243,"line":1244},[1241,2866,2867],{"class":1247},"# application.py\n",[1241,2869,2870,2872],{"class":1243,"line":1251},[1241,2871,1689],{"class":1688},[1241,2873,1693],{"class":1692},[1241,2875,2876,2878],{"class":1243,"line":1281},[1241,2877,1689],{"class":1688},[1241,2879,2880],{"class":1692}," sys\n",[1241,2882,2883],{"class":1243,"line":1290},[1241,2884,1303],{"emptyLinePlaceholder":1302},[1241,2886,2887],{"class":1243,"line":1299},[1241,2888,2889],{"class":1247},"# Add the project directory to Python path\n",[1241,2891,2892,2895,2897,2900,2902,2905,2907,2910,2912,2914,2916,2918,2920,2923,2925,2929],{"class":1243,"line":1306},[1241,2893,2894],{"class":1692},"sys",[1241,2896,1773],{"class":1381},[1241,2898,2899],{"class":1776},"path",[1241,2901,1773],{"class":1381},[1241,2903,2904],{"class":1782},"insert",[1241,2906,1786],{"class":1381},[1241,2908,2909],{"class":2476},"0",[1241,2911,1608],{"class":1381},[1241,2913,1833],{"class":1782},[1241,2915,1773],{"class":1381},[1241,2917,2899],{"class":1776},[1241,2919,1773],{"class":1381},[1241,2921,2922],{"class":1782},"dirname",[1241,2924,1786],{"class":1381},[1241,2926,2928],{"class":2927},"s131V","__file__",[1241,2930,2931],{"class":1381},"))\n",[1241,2933,2934],{"class":1243,"line":1312},[1241,2935,1303],{"emptyLinePlaceholder":1302},[1241,2937,2938,2941,2943,2945,2947,2950,2952,2954,2957,2959,2961,2963,2966,2968],{"class":1243,"line":1321},[1241,2939,2940],{"class":1692},"os",[1241,2942,1773],{"class":1381},[1241,2944,1777],{"class":1776},[1241,2946,1773],{"class":1381},[1241,2948,2949],{"class":1782},"setdefault",[1241,2951,1786],{"class":1381},[1241,2953,1752],{"class":1258},[1241,2955,2956],{"class":1262},"DJANGO_SETTINGS_MODULE",[1241,2958,1752],{"class":1258},[1241,2960,1608],{"class":1381},[1241,2962,1822],{"class":1258},[1241,2964,2965],{"class":1262},"myproject.settings.production",[1241,2967,1752],{"class":1258},[1241,2969,2117],{"class":1381},[1241,2971,2972],{"class":1243,"line":1327},[1241,2973,1303],{"emptyLinePlaceholder":1302},[1241,2975,2976,2978,2981,2983,2986,2988,2991,2993],{"class":1243,"line":1333},[1241,2977,1698],{"class":1688},[1241,2979,2980],{"class":1692}," django",[1241,2982,1773],{"class":1381},[1241,2984,2985],{"class":1692},"core",[1241,2987,1773],{"class":1381},[1241,2989,2990],{"class":1692},"wsgi ",[1241,2992,1689],{"class":1688},[1241,2994,2995],{"class":1692}," get_wsgi_application\n",[1241,2997,2998,3001,3004,3007],{"class":1243,"line":1339},[1241,2999,3000],{"class":1692},"application ",[1241,3002,3003],{"class":1381},"=",[1241,3005,3006],{"class":1782}," get_wsgi_application",[1241,3008,3009],{"class":1381},"()\n",[1026,3011,3012],{},[1042,3013,3014],{},"Elastic Beanstalk Configuration Files",[1128,3016,3020],{"className":3017,"code":3018,"language":3019,"meta":1137,"style":1137},"language-yaml shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# .ebextensions/01_packages.config\npackages:\n  yum:\n    git: []\n    postgresql-devel: []\n    libjpeg-turbo-devel: []\n    libffi-devel: []\n    openssl-devel: []\n\n# .ebextensions/02_python.config\noption_settings:\n  aws:elasticbeanstalk:container:python:\n    WSGIPath: application:application\n  aws:elasticbeanstalk:application:environment:\n    DJANGO_SETTINGS_MODULE: myproject.settings.production\n    PYTHONPATH: /opt/python/current/app\n  aws:elasticbeanstalk:container:python:staticfiles:\n    /static/: staticfiles/\n  aws:elasticbeanstalk:environment:proxy:staticfiles:\n    /static: staticfiles\n\n# .ebextensions/03_django.config\ncontainer_commands:\n  01_migrate:\n    command: \"source /opt/python/run/venv/bin/activate && python manage.py migrate --noinput\"\n    leader_only: true\n  02_collectstatic:\n    command: \"source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput\"\n    leader_only: true\n  03_compress_static:\n    command: \"source /opt/python/run/venv/bin/activate && python manage.py compress --force\"\n    leader_only: true\n  04_create_cache_table:\n    command: \"source /opt/python/run/venv/bin/activate && python manage.py createcachetable\"\n    leader_only: true\n  05_load_fixtures:\n    command: \"source /opt/python/run/venv/bin/activate && python manage.py loaddata initial_data.json\"\n    leader_only: true\n    ignoreErrors: true\n\noption_settings:\n  aws:autoscaling:launchconfiguration:\n    IamInstanceProfile: aws-elasticbeanstalk-ec2-role\n    SecurityGroups: sg-12345678\n    InstanceType: t3.medium\n  aws:autoscaling:asg:\n    MinSize: 2\n    MaxSize: 10\n    Cooldown: 300\n  aws:autoscaling:trigger:\n    MeasureName: CPUUtilization\n    Unit: Percent\n    UpperThreshold: 80\n    LowerThreshold: 20\n    ScaleUpIncrement: 2\n    ScaleDownIncrement: -1\n  aws:elasticbeanstalk:environment:\n    LoadBalancerType: application\n    ServiceRole: aws-elasticbeanstalk-service-role\n  aws:elbv2:loadbalancer:\n    IdleTimeout: 300\n    SecurityGroups: sg-12345678\n  aws:elbv2:listener:443:\n    Protocol: HTTPS\n    SSLCertificateArns: arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012\n  aws:elasticbeanstalk:healthreporting:system:\n    SystemType: enhanced\n    HealthCheckSuccessThreshold: Ok\n    HealthCheckURL: /health/\n  aws:elasticbeanstalk:cloudwatch:logs:\n    StreamLogs: true\n    DeleteOnTerminate: false\n    RetentionInDays: 7\n\n# .ebextensions/04_https.config\nResources:\n  sslSecurityGroupIngress:\n    Type: AWS::EC2::SecurityGroupIngress\n    Properties:\n      GroupId: {\"Fn::GetAtt\": [\"AWSEBSecurityGroup\", \"GroupId\"]}\n      IpProtocol: tcp\n      ToPort: 443\n      FromPort: 443\n      CidrIp: 0.0.0.0/0\n\n# .ebextensions/05_environment_variables.config\noption_settings:\n  aws:elasticbeanstalk:application:environment:\n    DEBUG: \"False\"\n    SECRET_KEY: \"your-secret-key-from-parameter-store\"\n    S3_BUCKET_NAME: \"your-s3-bucket-name\"\n    REDIS_URL: \"redis://your-elasticache-endpoint:6379/1\"\n    SENTRY_DSN: \"your-sentry-dsn\"\n    EMAIL_HOST: \"email-smtp.us-east-1.amazonaws.com\"\n    EMAIL_PORT: \"587\"\n    EMAIL_USE_TLS: \"True\"\n","yaml",[1135,3021,3022,3027,3034,3041,3051,3060,3069,3078,3087,3091,3096,3103,3110,3120,3127,3137,3147,3154,3164,3171,3181,3185,3190,3197,3204,3218,3229,3236,3249,3257,3264,3277,3285,3292,3305,3313,3320,3333,3341,3350,3354,3360,3367,3377,3387,3397,3404,3414,3424,3434,3441,3451,3461,3471,3481,3490,3500,3507,3517,3527,3534,3543,3551,3558,3568,3578,3585,3595,3605,3615,3622,3631,3641,3651,3655,3660,3667,3674,3684,3691,3731,3741,3751,3760,3770,3774,3780,3787,3794,3809,3824,3839,3854,3869,3884,3899],{"__ignoreMap":1137},[1241,3023,3024],{"class":1243,"line":1244},[1241,3025,3026],{"class":1247},"# .ebextensions/01_packages.config\n",[1241,3028,3029,3032],{"class":1243,"line":1251},[1241,3030,3031],{"class":1590},"packages",[1241,3033,1840],{"class":1381},[1241,3035,3036,3039],{"class":1243,"line":1281},[1241,3037,3038],{"class":1590},"  yum",[1241,3040,1840],{"class":1381},[1241,3042,3043,3046,3048],{"class":1243,"line":1290},[1241,3044,3045],{"class":1590},"    git",[1241,3047,1397],{"class":1381},[1241,3049,3050],{"class":1381}," []\n",[1241,3052,3053,3056,3058],{"class":1243,"line":1299},[1241,3054,3055],{"class":1590},"    postgresql-devel",[1241,3057,1397],{"class":1381},[1241,3059,3050],{"class":1381},[1241,3061,3062,3065,3067],{"class":1243,"line":1306},[1241,3063,3064],{"class":1590},"    libjpeg-turbo-devel",[1241,3066,1397],{"class":1381},[1241,3068,3050],{"class":1381},[1241,3070,3071,3074,3076],{"class":1243,"line":1312},[1241,3072,3073],{"class":1590},"    libffi-devel",[1241,3075,1397],{"class":1381},[1241,3077,3050],{"class":1381},[1241,3079,3080,3083,3085],{"class":1243,"line":1321},[1241,3081,3082],{"class":1590},"    openssl-devel",[1241,3084,1397],{"class":1381},[1241,3086,3050],{"class":1381},[1241,3088,3089],{"class":1243,"line":1327},[1241,3090,1303],{"emptyLinePlaceholder":1302},[1241,3092,3093],{"class":1243,"line":1333},[1241,3094,3095],{"class":1247},"# .ebextensions/02_python.config\n",[1241,3097,3098,3101],{"class":1243,"line":1339},[1241,3099,3100],{"class":1590},"option_settings",[1241,3102,1840],{"class":1381},[1241,3104,3105,3108],{"class":1243,"line":1345},[1241,3106,3107],{"class":1590},"  aws:elasticbeanstalk:container:python",[1241,3109,1840],{"class":1381},[1241,3111,3112,3115,3117],{"class":1243,"line":1350},[1241,3113,3114],{"class":1590},"    WSGIPath",[1241,3116,1397],{"class":1381},[1241,3118,3119],{"class":1262}," application:application\n",[1241,3121,3122,3125],{"class":1243,"line":1356},[1241,3123,3124],{"class":1590},"  aws:elasticbeanstalk:application:environment",[1241,3126,1840],{"class":1381},[1241,3128,3129,3132,3134],{"class":1243,"line":1554},[1241,3130,3131],{"class":1590},"    DJANGO_SETTINGS_MODULE",[1241,3133,1397],{"class":1381},[1241,3135,3136],{"class":1262}," myproject.settings.production\n",[1241,3138,3139,3142,3144],{"class":1243,"line":1569},[1241,3140,3141],{"class":1590},"    PYTHONPATH",[1241,3143,1397],{"class":1381},[1241,3145,3146],{"class":1262}," /opt/python/current/app\n",[1241,3148,3149,3152],{"class":1243,"line":1584},[1241,3150,3151],{"class":1590},"  aws:elasticbeanstalk:container:python:staticfiles",[1241,3153,1840],{"class":1381},[1241,3155,3156,3159,3161],{"class":1243,"line":1621},[1241,3157,3158],{"class":1590},"    /static/",[1241,3160,1397],{"class":1381},[1241,3162,3163],{"class":1262}," staticfiles/\n",[1241,3165,3166,3169],{"class":1243,"line":1627},[1241,3167,3168],{"class":1590},"  aws:elasticbeanstalk:environment:proxy:staticfiles",[1241,3170,1840],{"class":1381},[1241,3172,3173,3176,3178],{"class":1243,"line":1633},[1241,3174,3175],{"class":1590},"    /static",[1241,3177,1397],{"class":1381},[1241,3179,3180],{"class":1262}," staticfiles\n",[1241,3182,3183],{"class":1243,"line":1639},[1241,3184,1303],{"emptyLinePlaceholder":1302},[1241,3186,3187],{"class":1243,"line":1645},[1241,3188,3189],{"class":1247},"# .ebextensions/03_django.config\n",[1241,3191,3192,3195],{"class":1243,"line":2028},[1241,3193,3194],{"class":1590},"container_commands",[1241,3196,1840],{"class":1381},[1241,3198,3199,3202],{"class":1243,"line":2042},[1241,3200,3201],{"class":1590},"  01_migrate",[1241,3203,1840],{"class":1381},[1241,3205,3206,3209,3211,3213,3216],{"class":1243,"line":2064},[1241,3207,3208],{"class":1590},"    command",[1241,3210,1397],{"class":1381},[1241,3212,1259],{"class":1258},[1241,3214,3215],{"class":1262},"source /opt/python/run/venv/bin/activate && python manage.py migrate --noinput",[1241,3217,1278],{"class":1258},[1241,3219,3220,3223,3225],{"class":1243,"line":2070},[1241,3221,3222],{"class":1590},"    leader_only",[1241,3224,1397],{"class":1381},[1241,3226,3228],{"class":3227},"sq3J1"," true\n",[1241,3230,3231,3234],{"class":1243,"line":2075},[1241,3232,3233],{"class":1590},"  02_collectstatic",[1241,3235,1840],{"class":1381},[1241,3237,3238,3240,3242,3244,3247],{"class":1243,"line":2080},[1241,3239,3208],{"class":1590},[1241,3241,1397],{"class":1381},[1241,3243,1259],{"class":1258},[1241,3245,3246],{"class":1262},"source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput",[1241,3248,1278],{"class":1258},[1241,3250,3251,3253,3255],{"class":1243,"line":2085},[1241,3252,3222],{"class":1590},[1241,3254,1397],{"class":1381},[1241,3256,3228],{"class":3227},[1241,3258,3259,3262],{"class":1243,"line":2091},[1241,3260,3261],{"class":1590},"  03_compress_static",[1241,3263,1840],{"class":1381},[1241,3265,3266,3268,3270,3272,3275],{"class":1243,"line":2120},[1241,3267,3208],{"class":1590},[1241,3269,1397],{"class":1381},[1241,3271,1259],{"class":1258},[1241,3273,3274],{"class":1262},"source /opt/python/run/venv/bin/activate && python manage.py compress --force",[1241,3276,1278],{"class":1258},[1241,3278,3279,3281,3283],{"class":1243,"line":2148},[1241,3280,3222],{"class":1590},[1241,3282,1397],{"class":1381},[1241,3284,3228],{"class":3227},[1241,3286,3287,3290],{"class":1243,"line":2177},[1241,3288,3289],{"class":1590},"  04_create_cache_table",[1241,3291,1840],{"class":1381},[1241,3293,3294,3296,3298,3300,3303],{"class":1243,"line":2214},[1241,3295,3208],{"class":1590},[1241,3297,1397],{"class":1381},[1241,3299,1259],{"class":1258},[1241,3301,3302],{"class":1262},"source /opt/python/run/venv/bin/activate && python manage.py createcachetable",[1241,3304,1278],{"class":1258},[1241,3306,3307,3309,3311],{"class":1243,"line":2240},[1241,3308,3222],{"class":1590},[1241,3310,1397],{"class":1381},[1241,3312,3228],{"class":3227},[1241,3314,3315,3318],{"class":1243,"line":2245},[1241,3316,3317],{"class":1590},"  05_load_fixtures",[1241,3319,1840],{"class":1381},[1241,3321,3322,3324,3326,3328,3331],{"class":1243,"line":2251},[1241,3323,3208],{"class":1590},[1241,3325,1397],{"class":1381},[1241,3327,1259],{"class":1258},[1241,3329,3330],{"class":1262},"source /opt/python/run/venv/bin/activate && python manage.py loaddata initial_data.json",[1241,3332,1278],{"class":1258},[1241,3334,3335,3337,3339],{"class":1243,"line":2267},[1241,3336,3222],{"class":1590},[1241,3338,1397],{"class":1381},[1241,3340,3228],{"class":3227},[1241,3342,3343,3346,3348],{"class":1243,"line":2289},[1241,3344,3345],{"class":1590},"    ignoreErrors",[1241,3347,1397],{"class":1381},[1241,3349,3228],{"class":3227},[1241,3351,3352],{"class":1243,"line":2294},[1241,3353,1303],{"emptyLinePlaceholder":1302},[1241,3355,3356,3358],{"class":1243,"line":2300},[1241,3357,3100],{"class":1590},[1241,3359,1840],{"class":1381},[1241,3361,3362,3365],{"class":1243,"line":2314},[1241,3363,3364],{"class":1590},"  aws:autoscaling:launchconfiguration",[1241,3366,1840],{"class":1381},[1241,3368,3369,3372,3374],{"class":1243,"line":2335},[1241,3370,3371],{"class":1590},"    IamInstanceProfile",[1241,3373,1397],{"class":1381},[1241,3375,3376],{"class":1262}," aws-elasticbeanstalk-ec2-role\n",[1241,3378,3379,3382,3384],{"class":1243,"line":2340},[1241,3380,3381],{"class":1590},"    SecurityGroups",[1241,3383,1397],{"class":1381},[1241,3385,3386],{"class":1262}," sg-12345678\n",[1241,3388,3389,3392,3394],{"class":1243,"line":2346},[1241,3390,3391],{"class":1590},"    InstanceType",[1241,3393,1397],{"class":1381},[1241,3395,3396],{"class":1262}," t3.medium\n",[1241,3398,3399,3402],{"class":1243,"line":2361},[1241,3400,3401],{"class":1590},"  aws:autoscaling:asg",[1241,3403,1840],{"class":1381},[1241,3405,3406,3409,3411],{"class":1243,"line":2371},[1241,3407,3408],{"class":1590},"    MinSize",[1241,3410,1397],{"class":1381},[1241,3412,3413],{"class":2476}," 2\n",[1241,3415,3416,3419,3421],{"class":1243,"line":2392},[1241,3417,3418],{"class":1590},"    MaxSize",[1241,3420,1397],{"class":1381},[1241,3422,3423],{"class":2476}," 10\n",[1241,3425,3426,3429,3431],{"class":1243,"line":2397},[1241,3427,3428],{"class":1590},"    Cooldown",[1241,3430,1397],{"class":1381},[1241,3432,3433],{"class":2476}," 300\n",[1241,3435,3436,3439],{"class":1243,"line":2407},[1241,3437,3438],{"class":1590},"  aws:autoscaling:trigger",[1241,3440,1840],{"class":1381},[1241,3442,3443,3446,3448],{"class":1243,"line":2417},[1241,3444,3445],{"class":1590},"    MeasureName",[1241,3447,1397],{"class":1381},[1241,3449,3450],{"class":1262}," CPUUtilization\n",[1241,3452,3453,3456,3458],{"class":1243,"line":2422},[1241,3454,3455],{"class":1590},"    Unit",[1241,3457,1397],{"class":1381},[1241,3459,3460],{"class":1262}," Percent\n",[1241,3462,3463,3466,3468],{"class":1243,"line":2428},[1241,3464,3465],{"class":1590},"    UpperThreshold",[1241,3467,1397],{"class":1381},[1241,3469,3470],{"class":2476}," 80\n",[1241,3472,3473,3476,3478],{"class":1243,"line":2439},[1241,3474,3475],{"class":1590},"    LowerThreshold",[1241,3477,1397],{"class":1381},[1241,3479,3480],{"class":2476}," 20\n",[1241,3482,3483,3486,3488],{"class":1243,"line":2468},[1241,3484,3485],{"class":1590},"    ScaleUpIncrement",[1241,3487,1397],{"class":1381},[1241,3489,3413],{"class":2476},[1241,3491,3492,3495,3497],{"class":1243,"line":2480},[1241,3493,3494],{"class":1590},"    ScaleDownIncrement",[1241,3496,1397],{"class":1381},[1241,3498,3499],{"class":2476}," -1\n",[1241,3501,3502,3505],{"class":1243,"line":2490},[1241,3503,3504],{"class":1590},"  aws:elasticbeanstalk:environment",[1241,3506,1840],{"class":1381},[1241,3508,3509,3512,3514],{"class":1243,"line":2500},[1241,3510,3511],{"class":1590},"    LoadBalancerType",[1241,3513,1397],{"class":1381},[1241,3515,3516],{"class":1262}," application\n",[1241,3518,3519,3522,3524],{"class":1243,"line":2505},[1241,3520,3521],{"class":1590},"    ServiceRole",[1241,3523,1397],{"class":1381},[1241,3525,3526],{"class":1262}," aws-elasticbeanstalk-service-role\n",[1241,3528,3529,3532],{"class":1243,"line":2511},[1241,3530,3531],{"class":1590},"  aws:elbv2:loadbalancer",[1241,3533,1840],{"class":1381},[1241,3535,3536,3539,3541],{"class":1243,"line":2521},[1241,3537,3538],{"class":1590},"    IdleTimeout",[1241,3540,1397],{"class":1381},[1241,3542,3433],{"class":2476},[1241,3544,3545,3547,3549],{"class":1243,"line":2531},[1241,3546,3381],{"class":1590},[1241,3548,1397],{"class":1381},[1241,3550,3386],{"class":1262},[1241,3552,3553,3556],{"class":1243,"line":2536},[1241,3554,3555],{"class":1590},"  aws:elbv2:listener:443",[1241,3557,1840],{"class":1381},[1241,3559,3560,3563,3565],{"class":1243,"line":2542},[1241,3561,3562],{"class":1590},"    Protocol",[1241,3564,1397],{"class":1381},[1241,3566,3567],{"class":1262}," HTTPS\n",[1241,3569,3570,3573,3575],{"class":1243,"line":2552},[1241,3571,3572],{"class":1590},"    SSLCertificateArns",[1241,3574,1397],{"class":1381},[1241,3576,3577],{"class":1262}," arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012\n",[1241,3579,3580,3583],{"class":1243,"line":2569},[1241,3581,3582],{"class":1590},"  aws:elasticbeanstalk:healthreporting:system",[1241,3584,1840],{"class":1381},[1241,3586,3587,3590,3592],{"class":1243,"line":2586},[1241,3588,3589],{"class":1590},"    SystemType",[1241,3591,1397],{"class":1381},[1241,3593,3594],{"class":1262}," enhanced\n",[1241,3596,3597,3600,3602],{"class":1243,"line":2600},[1241,3598,3599],{"class":1590},"    HealthCheckSuccessThreshold",[1241,3601,1397],{"class":1381},[1241,3603,3604],{"class":1262}," Ok\n",[1241,3606,3607,3610,3612],{"class":1243,"line":2614},[1241,3608,3609],{"class":1590},"    HealthCheckURL",[1241,3611,1397],{"class":1381},[1241,3613,3614],{"class":1262}," /health/\n",[1241,3616,3617,3620],{"class":1243,"line":2635},[1241,3618,3619],{"class":1590},"  aws:elasticbeanstalk:cloudwatch:logs",[1241,3621,1840],{"class":1381},[1241,3623,3624,3627,3629],{"class":1243,"line":2656},[1241,3625,3626],{"class":1590},"    StreamLogs",[1241,3628,1397],{"class":1381},[1241,3630,3228],{"class":3227},[1241,3632,3633,3636,3638],{"class":1243,"line":2677},[1241,3634,3635],{"class":1590},"    DeleteOnTerminate",[1241,3637,1397],{"class":1381},[1241,3639,3640],{"class":3227}," false\n",[1241,3642,3643,3646,3648],{"class":1243,"line":2683},[1241,3644,3645],{"class":1590},"    RetentionInDays",[1241,3647,1397],{"class":1381},[1241,3649,3650],{"class":2476}," 7\n",[1241,3652,3653],{"class":1243,"line":2697},[1241,3654,1303],{"emptyLinePlaceholder":1302},[1241,3656,3657],{"class":1243,"line":2716},[1241,3658,3659],{"class":1247},"# .ebextensions/04_https.config\n",[1241,3661,3662,3665],{"class":1243,"line":2736},[1241,3663,3664],{"class":1590},"Resources",[1241,3666,1840],{"class":1381},[1241,3668,3669,3672],{"class":1243,"line":2741},[1241,3670,3671],{"class":1590},"  sslSecurityGroupIngress",[1241,3673,1840],{"class":1381},[1241,3675,3676,3679,3681],{"class":1243,"line":2747},[1241,3677,3678],{"class":1590},"    Type",[1241,3680,1397],{"class":1381},[1241,3682,3683],{"class":1262}," AWS::EC2::SecurityGroupIngress\n",[1241,3685,3686,3689],{"class":1243,"line":2761},[1241,3687,3688],{"class":1590},"    Properties",[1241,3690,1840],{"class":1381},[1241,3692,3693,3696,3698,3701,3703,3706,3708,3710,3712,3714,3717,3719,3721,3723,3726,3728],{"class":1243,"line":2775},[1241,3694,3695],{"class":1590},"      GroupId",[1241,3697,1397],{"class":1381},[1241,3699,3700],{"class":1381}," {",[1241,3702,1266],{"class":1258},[1241,3704,3705],{"class":1262},"Fn::GetAtt",[1241,3707,1266],{"class":1258},[1241,3709,1397],{"class":1381},[1241,3711,1598],{"class":1381},[1241,3713,1266],{"class":1258},[1241,3715,3716],{"class":1262},"AWSEBSecurityGroup",[1241,3718,1266],{"class":1258},[1241,3720,1608],{"class":1381},[1241,3722,1259],{"class":1258},[1241,3724,3725],{"class":1262},"GroupId",[1241,3727,1266],{"class":1258},[1241,3729,3730],{"class":1381},"]}\n",[1241,3732,3733,3736,3738],{"class":1243,"line":2804},[1241,3734,3735],{"class":1590},"      IpProtocol",[1241,3737,1397],{"class":1381},[1241,3739,3740],{"class":1262}," tcp\n",[1241,3742,3743,3746,3748],{"class":1243,"line":2823},[1241,3744,3745],{"class":1590},"      ToPort",[1241,3747,1397],{"class":1381},[1241,3749,3750],{"class":2476}," 443\n",[1241,3752,3753,3756,3758],{"class":1243,"line":2840},[1241,3754,3755],{"class":1590},"      FromPort",[1241,3757,1397],{"class":1381},[1241,3759,3750],{"class":2476},[1241,3761,3762,3765,3767],{"class":1243,"line":2845},[1241,3763,3764],{"class":1590},"      CidrIp",[1241,3766,1397],{"class":1381},[1241,3768,3769],{"class":1262}," 0.0.0.0/0\n",[1241,3771,3772],{"class":1243,"line":2850},[1241,3773,1303],{"emptyLinePlaceholder":1302},[1241,3775,3777],{"class":1243,"line":3776},86,[1241,3778,3779],{"class":1247},"# .ebextensions/05_environment_variables.config\n",[1241,3781,3783,3785],{"class":1243,"line":3782},87,[1241,3784,3100],{"class":1590},[1241,3786,1840],{"class":1381},[1241,3788,3790,3792],{"class":1243,"line":3789},88,[1241,3791,3124],{"class":1590},[1241,3793,1840],{"class":1381},[1241,3795,3797,3800,3802,3804,3807],{"class":1243,"line":3796},89,[1241,3798,3799],{"class":1590},"    DEBUG",[1241,3801,1397],{"class":1381},[1241,3803,1259],{"class":1258},[1241,3805,3806],{"class":1262},"False",[1241,3808,1278],{"class":1258},[1241,3810,3812,3815,3817,3819,3822],{"class":1243,"line":3811},90,[1241,3813,3814],{"class":1590},"    SECRET_KEY",[1241,3816,1397],{"class":1381},[1241,3818,1259],{"class":1258},[1241,3820,3821],{"class":1262},"your-secret-key-from-parameter-store",[1241,3823,1278],{"class":1258},[1241,3825,3827,3830,3832,3834,3837],{"class":1243,"line":3826},91,[1241,3828,3829],{"class":1590},"    S3_BUCKET_NAME",[1241,3831,1397],{"class":1381},[1241,3833,1259],{"class":1258},[1241,3835,3836],{"class":1262},"your-s3-bucket-name",[1241,3838,1278],{"class":1258},[1241,3840,3842,3845,3847,3849,3852],{"class":1243,"line":3841},92,[1241,3843,3844],{"class":1590},"    REDIS_URL",[1241,3846,1397],{"class":1381},[1241,3848,1259],{"class":1258},[1241,3850,3851],{"class":1262},"redis://your-elasticache-endpoint:6379/1",[1241,3853,1278],{"class":1258},[1241,3855,3857,3860,3862,3864,3867],{"class":1243,"line":3856},93,[1241,3858,3859],{"class":1590},"    SENTRY_DSN",[1241,3861,1397],{"class":1381},[1241,3863,1259],{"class":1258},[1241,3865,3866],{"class":1262},"your-sentry-dsn",[1241,3868,1278],{"class":1258},[1241,3870,3872,3875,3877,3879,3882],{"class":1243,"line":3871},94,[1241,3873,3874],{"class":1590},"    EMAIL_HOST",[1241,3876,1397],{"class":1381},[1241,3878,1259],{"class":1258},[1241,3880,3881],{"class":1262},"email-smtp.us-east-1.amazonaws.com",[1241,3883,1278],{"class":1258},[1241,3885,3887,3890,3892,3894,3897],{"class":1243,"line":3886},95,[1241,3888,3889],{"class":1590},"    EMAIL_PORT",[1241,3891,1397],{"class":1381},[1241,3893,1259],{"class":1258},[1241,3895,3896],{"class":1262},"587",[1241,3898,1278],{"class":1258},[1241,3900,3902,3905,3907,3909,3912],{"class":1243,"line":3901},96,[1241,3903,3904],{"class":1590},"    EMAIL_USE_TLS",[1241,3906,1397],{"class":1381},[1241,3908,1259],{"class":1258},[1241,3910,3911],{"class":1262},"True",[1241,3913,1278],{"class":1258},[1026,3915,3916],{},[1042,3917,3918],{},"Deployment Commands",[1128,3920,3922],{"className":1235,"code":3921,"language":1237,"meta":1137,"style":1137},"# Initialize Elastic Beanstalk application\neb init -p python-3.9 django-app --region us-east-1\n\n# Create environment\neb create production --database.engine postgres --database.size db.t3.micro\n\n# Deploy application\neb deploy\n\n# Set environment variables\neb setenv DEBUG=False SECRET_KEY=your-secret-key\n\n# Open application in browser\neb open\n\n# View logs\neb logs\n\n# SSH into instance\neb ssh\n\n# Terminate environment (careful!)\neb terminate production\n",[1135,3923,3924,3929,3952,3956,3961,3983,3987,3992,3999,4003,4008,4021,4025,4030,4037,4041,4046,4053,4057,4062,4069,4073,4078],{"__ignoreMap":1137},[1241,3925,3926],{"class":1243,"line":1244},[1241,3927,3928],{"class":1247},"# Initialize Elastic Beanstalk application\n",[1241,3930,3931,3934,3937,3940,3943,3946,3949],{"class":1243,"line":1251},[1241,3932,3933],{"class":1254},"eb",[1241,3935,3936],{"class":1262}," init",[1241,3938,3939],{"class":1269}," -p",[1241,3941,3942],{"class":1262}," python-3.9",[1241,3944,3945],{"class":1262}," django-app",[1241,3947,3948],{"class":1269}," --region",[1241,3950,3951],{"class":1262}," us-east-1\n",[1241,3953,3954],{"class":1243,"line":1281},[1241,3955,1303],{"emptyLinePlaceholder":1302},[1241,3957,3958],{"class":1243,"line":1290},[1241,3959,3960],{"class":1247},"# Create environment\n",[1241,3962,3963,3965,3968,3971,3974,3977,3980],{"class":1243,"line":1299},[1241,3964,3933],{"class":1254},[1241,3966,3967],{"class":1262}," create",[1241,3969,3970],{"class":1262}," production",[1241,3972,3973],{"class":1269}," --database.engine",[1241,3975,3976],{"class":1262}," postgres",[1241,3978,3979],{"class":1269}," --database.size",[1241,3981,3982],{"class":1262}," db.t3.micro\n",[1241,3984,3985],{"class":1243,"line":1306},[1241,3986,1303],{"emptyLinePlaceholder":1302},[1241,3988,3989],{"class":1243,"line":1312},[1241,3990,3991],{"class":1247},"# Deploy application\n",[1241,3993,3994,3996],{"class":1243,"line":1321},[1241,3995,3933],{"class":1254},[1241,3997,3998],{"class":1262}," deploy\n",[1241,4000,4001],{"class":1243,"line":1327},[1241,4002,1303],{"emptyLinePlaceholder":1302},[1241,4004,4005],{"class":1243,"line":1333},[1241,4006,4007],{"class":1247},"# Set environment variables\n",[1241,4009,4010,4012,4015,4018],{"class":1243,"line":1339},[1241,4011,3933],{"class":1254},[1241,4013,4014],{"class":1262}," setenv",[1241,4016,4017],{"class":1262}," DEBUG=False",[1241,4019,4020],{"class":1262}," SECRET_KEY=your-secret-key\n",[1241,4022,4023],{"class":1243,"line":1345},[1241,4024,1303],{"emptyLinePlaceholder":1302},[1241,4026,4027],{"class":1243,"line":1350},[1241,4028,4029],{"class":1247},"# Open application in browser\n",[1241,4031,4032,4034],{"class":1243,"line":1356},[1241,4033,3933],{"class":1254},[1241,4035,4036],{"class":1262}," open\n",[1241,4038,4039],{"class":1243,"line":1554},[1241,4040,1303],{"emptyLinePlaceholder":1302},[1241,4042,4043],{"class":1243,"line":1569},[1241,4044,4045],{"class":1247},"# View logs\n",[1241,4047,4048,4050],{"class":1243,"line":1584},[1241,4049,3933],{"class":1254},[1241,4051,4052],{"class":1262}," logs\n",[1241,4054,4055],{"class":1243,"line":1621},[1241,4056,1303],{"emptyLinePlaceholder":1302},[1241,4058,4059],{"class":1243,"line":1627},[1241,4060,4061],{"class":1247},"# SSH into instance\n",[1241,4063,4064,4066],{"class":1243,"line":1633},[1241,4065,3933],{"class":1254},[1241,4067,4068],{"class":1262}," ssh\n",[1241,4070,4071],{"class":1243,"line":1639},[1241,4072,1303],{"emptyLinePlaceholder":1302},[1241,4074,4075],{"class":1243,"line":1645},[1241,4076,4077],{"class":1247},"# Terminate environment (careful!)\n",[1241,4079,4080,4082,4085],{"class":1243,"line":2028},[1241,4081,3933],{"class":1254},[1241,4083,4084],{"class":1262}," terminate",[1241,4086,4087],{"class":1262}," production\n",[1026,4089,4090],{},[1042,4091,4092],{},"Advanced Beanstalk Configuration",[1128,4094,4096],{"className":3017,"code":4095,"language":3019,"meta":1137,"style":1137},"# .elasticbeanstalk/config.yml\nbranch-defaults:\n  main:\n    environment: production\n    group_suffix: null\nglobal:\n  application_name: django-app\n  branch: null\n  default_ec2_keyname: my-key-pair\n  default_platform: Python 3.9 running on 64bit Amazon Linux 2\n  default_region: us-east-1\n  include_git_submodules: true\n  instance_profile: null\n  platform_name: null\n  platform_version: null\n  profile: eb-cli\n  repository: null\n  sc: git\n  workspace_type: Application\n",[1135,4097,4098,4103,4110,4117,4126,4136,4143,4153,4162,4172,4182,4191,4200,4209,4218,4227,4237,4246,4256],{"__ignoreMap":1137},[1241,4099,4100],{"class":1243,"line":1244},[1241,4101,4102],{"class":1247},"# .elasticbeanstalk/config.yml\n",[1241,4104,4105,4108],{"class":1243,"line":1251},[1241,4106,4107],{"class":1590},"branch-defaults",[1241,4109,1840],{"class":1381},[1241,4111,4112,4115],{"class":1243,"line":1281},[1241,4113,4114],{"class":1590},"  main",[1241,4116,1840],{"class":1381},[1241,4118,4119,4122,4124],{"class":1243,"line":1290},[1241,4120,4121],{"class":1590},"    environment",[1241,4123,1397],{"class":1381},[1241,4125,4087],{"class":1262},[1241,4127,4128,4131,4133],{"class":1243,"line":1299},[1241,4129,4130],{"class":1590},"    group_suffix",[1241,4132,1397],{"class":1381},[1241,4134,4135],{"class":1709}," null\n",[1241,4137,4138,4141],{"class":1243,"line":1306},[1241,4139,4140],{"class":1590},"global",[1241,4142,1840],{"class":1381},[1241,4144,4145,4148,4150],{"class":1243,"line":1312},[1241,4146,4147],{"class":1590},"  application_name",[1241,4149,1397],{"class":1381},[1241,4151,4152],{"class":1262}," django-app\n",[1241,4154,4155,4158,4160],{"class":1243,"line":1321},[1241,4156,4157],{"class":1590},"  branch",[1241,4159,1397],{"class":1381},[1241,4161,4135],{"class":1709},[1241,4163,4164,4167,4169],{"class":1243,"line":1327},[1241,4165,4166],{"class":1590},"  default_ec2_keyname",[1241,4168,1397],{"class":1381},[1241,4170,4171],{"class":1262}," my-key-pair\n",[1241,4173,4174,4177,4179],{"class":1243,"line":1333},[1241,4175,4176],{"class":1590},"  default_platform",[1241,4178,1397],{"class":1381},[1241,4180,4181],{"class":1262}," Python 3.9 running on 64bit Amazon Linux 2\n",[1241,4183,4184,4187,4189],{"class":1243,"line":1339},[1241,4185,4186],{"class":1590},"  default_region",[1241,4188,1397],{"class":1381},[1241,4190,3951],{"class":1262},[1241,4192,4193,4196,4198],{"class":1243,"line":1345},[1241,4194,4195],{"class":1590},"  include_git_submodules",[1241,4197,1397],{"class":1381},[1241,4199,3228],{"class":3227},[1241,4201,4202,4205,4207],{"class":1243,"line":1350},[1241,4203,4204],{"class":1590},"  instance_profile",[1241,4206,1397],{"class":1381},[1241,4208,4135],{"class":1709},[1241,4210,4211,4214,4216],{"class":1243,"line":1356},[1241,4212,4213],{"class":1590},"  platform_name",[1241,4215,1397],{"class":1381},[1241,4217,4135],{"class":1709},[1241,4219,4220,4223,4225],{"class":1243,"line":1554},[1241,4221,4222],{"class":1590},"  platform_version",[1241,4224,1397],{"class":1381},[1241,4226,4135],{"class":1709},[1241,4228,4229,4232,4234],{"class":1243,"line":1569},[1241,4230,4231],{"class":1590},"  profile",[1241,4233,1397],{"class":1381},[1241,4235,4236],{"class":1262}," eb-cli\n",[1241,4238,4239,4242,4244],{"class":1243,"line":1584},[1241,4240,4241],{"class":1590},"  repository",[1241,4243,1397],{"class":1381},[1241,4245,4135],{"class":1709},[1241,4247,4248,4251,4253],{"class":1243,"line":1621},[1241,4249,4250],{"class":1590},"  sc",[1241,4252,1397],{"class":1381},[1241,4254,4255],{"class":1262}," git\n",[1241,4257,4258,4261,4263],{"class":1243,"line":1627},[1241,4259,4260],{"class":1590},"  workspace_type",[1241,4262,1397],{"class":1381},[1241,4264,4265],{"class":1262}," Application\n",[1035,4267,4269],{"id":4268},"aws-lambda-serverless-django","AWS Lambda Serverless Django",[1026,4271,4272],{},[1042,4273,4274],{},"Serverless Django with Zappa",[1128,4276,4278],{"className":1674,"code":4277,"language":1676,"meta":1137,"style":1137},"# zappa_settings.json\n{\n    \"production\": {\n        \"app_function\": \"myproject.wsgi.application\",\n        \"aws_region\": \"us-east-1\",\n        \"profile_name\": \"default\",\n        \"project_name\": \"django-serverless\",\n        \"runtime\": \"python3.9\",\n        \"s3_bucket\": \"django-serverless-deployments\",\n        \"memory_size\": 512,\n        \"timeout_seconds\": 30,\n        \"environment_variables\": {\n            \"DJANGO_SETTINGS_MODULE\": \"myproject.settings.production\"\n        },\n        \"vpc_config\": {\n            \"SubnetIds\": [\"subnet-12345\", \"subnet-67890\"],\n            \"SecurityGroupIds\": [\"sg-12345678\"]\n        },\n        \"keep_warm\": false,\n        \"slim_handler\": true,\n        \"exclude\": [\n            \"*.pyc\",\n            \"__pycache__\",\n            \"tests/\",\n            \"docs/\",\n            \".git/\"\n        ]\n    }\n}\n\n# Deploy commands\npip install zappa\nzappa init\nzappa deploy production\nzappa update production\nzappa undeploy production\n",[1135,4279,4280,4285,4289,4303,4323,4342,4361,4381,4401,4421,4437,4453,4466,4483,4487,4500,4531,4553,4557,4573,4589,4602,4613,4624,4635,4646,4655,4660,4664,4668,4672,4677,4682,4687,4692,4697],{"__ignoreMap":1137},[1241,4281,4282],{"class":1243,"line":1244},[1241,4283,4284],{"class":1247},"# zappa_settings.json\n",[1241,4286,4287],{"class":1243,"line":1251},[1241,4288,1382],{"class":1381},[1241,4290,4291,4294,4297,4299,4301],{"class":1243,"line":1281},[1241,4292,4293],{"class":1258},"    \"",[1241,4295,4296],{"class":1262},"production",[1241,4298,1266],{"class":1258},[1241,4300,1397],{"class":1381},[1241,4302,1566],{"class":1381},[1241,4304,4305,4307,4310,4312,4314,4316,4319,4321],{"class":1243,"line":1290},[1241,4306,1466],{"class":1258},[1241,4308,4309],{"class":1262},"app_function",[1241,4311,1266],{"class":1258},[1241,4313,1397],{"class":1381},[1241,4315,1259],{"class":1258},[1241,4317,4318],{"class":1262},"myproject.wsgi.application",[1241,4320,1266],{"class":1258},[1241,4322,1407],{"class":1381},[1241,4324,4325,4327,4330,4332,4334,4336,4338,4340],{"class":1243,"line":1299},[1241,4326,1466],{"class":1258},[1241,4328,4329],{"class":1262},"aws_region",[1241,4331,1266],{"class":1258},[1241,4333,1397],{"class":1381},[1241,4335,1259],{"class":1258},[1241,4337,1603],{"class":1262},[1241,4339,1266],{"class":1258},[1241,4341,1407],{"class":1381},[1241,4343,4344,4346,4349,4351,4353,4355,4357,4359],{"class":1243,"line":1306},[1241,4345,1466],{"class":1258},[1241,4347,4348],{"class":1262},"profile_name",[1241,4350,1266],{"class":1258},[1241,4352,1397],{"class":1381},[1241,4354,1259],{"class":1258},[1241,4356,1857],{"class":1262},[1241,4358,1266],{"class":1258},[1241,4360,1407],{"class":1381},[1241,4362,4363,4365,4368,4370,4372,4374,4377,4379],{"class":1243,"line":1312},[1241,4364,1466],{"class":1258},[1241,4366,4367],{"class":1262},"project_name",[1241,4369,1266],{"class":1258},[1241,4371,1397],{"class":1381},[1241,4373,1259],{"class":1258},[1241,4375,4376],{"class":1262},"django-serverless",[1241,4378,1266],{"class":1258},[1241,4380,1407],{"class":1381},[1241,4382,4383,4385,4388,4390,4392,4394,4397,4399],{"class":1243,"line":1321},[1241,4384,1466],{"class":1258},[1241,4386,4387],{"class":1262},"runtime",[1241,4389,1266],{"class":1258},[1241,4391,1397],{"class":1381},[1241,4393,1259],{"class":1258},[1241,4395,4396],{"class":1262},"python3.9",[1241,4398,1266],{"class":1258},[1241,4400,1407],{"class":1381},[1241,4402,4403,4405,4408,4410,4412,4414,4417,4419],{"class":1243,"line":1327},[1241,4404,1466],{"class":1258},[1241,4406,4407],{"class":1262},"s3_bucket",[1241,4409,1266],{"class":1258},[1241,4411,1397],{"class":1381},[1241,4413,1259],{"class":1258},[1241,4415,4416],{"class":1262},"django-serverless-deployments",[1241,4418,1266],{"class":1258},[1241,4420,1407],{"class":1381},[1241,4422,4423,4425,4428,4430,4432,4435],{"class":1243,"line":1333},[1241,4424,1466],{"class":1258},[1241,4426,4427],{"class":1262},"memory_size",[1241,4429,1266],{"class":1258},[1241,4431,1397],{"class":1381},[1241,4433,4434],{"class":2476}," 512",[1241,4436,1407],{"class":1381},[1241,4438,4439,4441,4444,4446,4448,4451],{"class":1243,"line":1339},[1241,4440,1466],{"class":1258},[1241,4442,4443],{"class":1262},"timeout_seconds",[1241,4445,1266],{"class":1258},[1241,4447,1397],{"class":1381},[1241,4449,4450],{"class":2476}," 30",[1241,4452,1407],{"class":1381},[1241,4454,4455,4457,4460,4462,4464],{"class":1243,"line":1345},[1241,4456,1466],{"class":1258},[1241,4458,4459],{"class":1262},"environment_variables",[1241,4461,1266],{"class":1258},[1241,4463,1397],{"class":1381},[1241,4465,1566],{"class":1381},[1241,4467,4468,4471,4473,4475,4477,4479,4481],{"class":1243,"line":1350},[1241,4469,4470],{"class":1258},"            \"",[1241,4472,2956],{"class":1262},[1241,4474,1266],{"class":1258},[1241,4476,1397],{"class":1381},[1241,4478,1259],{"class":1258},[1241,4480,2965],{"class":1262},[1241,4482,1278],{"class":1258},[1241,4484,4485],{"class":1243,"line":1356},[1241,4486,2680],{"class":1381},[1241,4488,4489,4491,4494,4496,4498],{"class":1243,"line":1554},[1241,4490,1466],{"class":1258},[1241,4492,4493],{"class":1262},"vpc_config",[1241,4495,1266],{"class":1258},[1241,4497,1397],{"class":1381},[1241,4499,1566],{"class":1381},[1241,4501,4502,4504,4507,4509,4511,4513,4515,4518,4520,4522,4524,4527,4529],{"class":1243,"line":1569},[1241,4503,4470],{"class":1258},[1241,4505,4506],{"class":1262},"SubnetIds",[1241,4508,1266],{"class":1258},[1241,4510,1397],{"class":1381},[1241,4512,1598],{"class":1381},[1241,4514,1266],{"class":1258},[1241,4516,4517],{"class":1262},"subnet-12345",[1241,4519,1266],{"class":1258},[1241,4521,1608],{"class":1381},[1241,4523,1259],{"class":1258},[1241,4525,4526],{"class":1262},"subnet-67890",[1241,4528,1266],{"class":1258},[1241,4530,1914],{"class":1381},[1241,4532,4533,4535,4538,4540,4542,4544,4546,4549,4551],{"class":1243,"line":1584},[1241,4534,4470],{"class":1258},[1241,4536,4537],{"class":1262},"SecurityGroupIds",[1241,4539,1266],{"class":1258},[1241,4541,1397],{"class":1381},[1241,4543,1598],{"class":1381},[1241,4545,1266],{"class":1258},[1241,4547,4548],{"class":1262},"sg-12345678",[1241,4550,1266],{"class":1258},[1241,4552,1618],{"class":1381},[1241,4554,4555],{"class":1243,"line":1621},[1241,4556,2680],{"class":1381},[1241,4558,4559,4561,4564,4566,4568,4571],{"class":1243,"line":1627},[1241,4560,1466],{"class":1258},[1241,4562,4563],{"class":1262},"keep_warm",[1241,4565,1266],{"class":1258},[1241,4567,1397],{"class":1381},[1241,4569,4570],{"class":1692}," false",[1241,4572,1407],{"class":1381},[1241,4574,4575,4577,4580,4582,4584,4587],{"class":1243,"line":1633},[1241,4576,1466],{"class":1258},[1241,4578,4579],{"class":1262},"slim_handler",[1241,4581,1266],{"class":1258},[1241,4583,1397],{"class":1381},[1241,4585,4586],{"class":1692}," true",[1241,4588,1407],{"class":1381},[1241,4590,4591,4593,4596,4598,4600],{"class":1243,"line":1639},[1241,4592,1466],{"class":1258},[1241,4594,4595],{"class":1262},"exclude",[1241,4597,1266],{"class":1258},[1241,4599,1397],{"class":1381},[1241,4601,1421],{"class":1381},[1241,4603,4604,4606,4609,4611],{"class":1243,"line":1645},[1241,4605,4470],{"class":1258},[1241,4607,4608],{"class":1262},"*.pyc",[1241,4610,1266],{"class":1258},[1241,4612,1407],{"class":1381},[1241,4614,4615,4617,4620,4622],{"class":1243,"line":2028},[1241,4616,4470],{"class":1258},[1241,4618,4619],{"class":1262},"__pycache__",[1241,4621,1266],{"class":1258},[1241,4623,1407],{"class":1381},[1241,4625,4626,4628,4631,4633],{"class":1243,"line":2042},[1241,4627,4470],{"class":1258},[1241,4629,4630],{"class":1262},"tests/",[1241,4632,1266],{"class":1258},[1241,4634,1407],{"class":1381},[1241,4636,4637,4639,4642,4644],{"class":1243,"line":2064},[1241,4638,4470],{"class":1258},[1241,4640,4641],{"class":1262},"docs/",[1241,4643,1266],{"class":1258},[1241,4645,1407],{"class":1381},[1241,4647,4648,4650,4653],{"class":1243,"line":2070},[1241,4649,4470],{"class":1258},[1241,4651,4652],{"class":1262},".git/",[1241,4654,1278],{"class":1258},[1241,4656,4657],{"class":1243,"line":2075},[1241,4658,4659],{"class":1381},"        ]\n",[1241,4661,4662],{"class":1243,"line":2080},[1241,4663,1636],{"class":1381},[1241,4665,4666],{"class":1243,"line":2085},[1241,4667,1648],{"class":1381},[1241,4669,4670],{"class":1243,"line":2091},[1241,4671,1303],{"emptyLinePlaceholder":1302},[1241,4673,4674],{"class":1243,"line":2120},[1241,4675,4676],{"class":1247},"# Deploy commands\n",[1241,4678,4679],{"class":1243,"line":2148},[1241,4680,4681],{"class":1692},"pip install zappa\n",[1241,4683,4684],{"class":1243,"line":2177},[1241,4685,4686],{"class":1692},"zappa init\n",[1241,4688,4689],{"class":1243,"line":2214},[1241,4690,4691],{"class":1692},"zappa deploy production\n",[1241,4693,4694],{"class":1243,"line":2240},[1241,4695,4696],{"class":1692},"zappa update production\n",[1241,4698,4699],{"class":1243,"line":2245},[1241,4700,4701],{"class":1692},"zappa undeploy production\n",[1026,4703,4704],{},[1042,4705,4706],{},"Serverless Django Settings",[1128,4708,4710],{"className":1674,"code":4709,"language":1676,"meta":1137,"style":1137},"# settings/serverless.py\nimport os\nfrom .base import *\n\n# Lambda-specific settings\nDEBUG = False\nALLOWED_HOSTS = ['*']  # API Gateway handles routing\n\n# Database - use RDS Proxy for connection pooling\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': os.environ['DB_NAME'],\n        'USER': os.environ['DB_USER'],\n        'PASSWORD': os.environ['DB_PASSWORD'],\n        'HOST': os.environ['DB_PROXY_ENDPOINT'],  # RDS Proxy endpoint\n        'PORT': '5432',\n        'OPTIONS': {\n            'sslmode': 'require',\n        },\n        'CONN_MAX_AGE': 0,  # Don't persist connections in Lambda\n    }\n}\n\n# Use S3 for static and media files\nSTATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'\nDEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'\n\n# Cache using DynamoDB or ElastiCache\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': os.environ['REDIS_URL'],\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n            'CONNECTION_POOL_KWARGS': {\n                'max_connections': 1,  # Limit connections in Lambda\n            },\n        },\n    }\n}\n\n# Session storage\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'default'\n\n# Logging for CloudWatch\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'console': {\n            'class': 'logging.StreamHandler',\n        },\n    },\n    'root': {\n        'handlers': ['console'],\n    },\n}\n",[1135,4711,4712,4717,4723,4735,4739,4744,4752,4772,4776,4781,4790,4802,4820,4847,4874,4901,4932,4951,4963,4981,4985,5004,5008,5012,5016,5021,5033,5045,5049,5054,5063,5075,5095,5123,5135,5155,5168,5186,5190,5194,5198,5202,5206,5211,5225,5238,5242,5247,5255,5269,5283,5295,5307,5325,5329,5333,5346,5366,5370],{"__ignoreMap":1137},[1241,4713,4714],{"class":1243,"line":1244},[1241,4715,4716],{"class":1247},"# settings/serverless.py\n",[1241,4718,4719,4721],{"class":1243,"line":1251},[1241,4720,1689],{"class":1688},[1241,4722,1693],{"class":1692},[1241,4724,4725,4727,4729,4731,4733],{"class":1243,"line":1281},[1241,4726,1698],{"class":1688},[1241,4728,1701],{"class":1381},[1241,4730,1704],{"class":1692},[1241,4732,1689],{"class":1688},[1241,4734,1710],{"class":1709},[1241,4736,4737],{"class":1243,"line":1290},[1241,4738,1303],{"emptyLinePlaceholder":1302},[1241,4740,4741],{"class":1243,"line":1299},[1241,4742,4743],{"class":1247},"# Lambda-specific settings\n",[1241,4745,4746,4748,4750],{"class":1243,"line":1306},[1241,4747,1725],{"class":1724},[1241,4749,1728],{"class":1381},[1241,4751,1732],{"class":1731},[1241,4753,4754,4756,4758,4760,4762,4764,4766,4769],{"class":1243,"line":1312},[1241,4755,1737],{"class":1724},[1241,4757,1728],{"class":1381},[1241,4759,1598],{"class":1381},[1241,4761,1752],{"class":1258},[1241,4763,1547],{"class":1262},[1241,4765,1752],{"class":1258},[1241,4767,4768],{"class":1381},"]",[1241,4770,4771],{"class":1247},"  # API Gateway handles routing\n",[1241,4773,4774],{"class":1243,"line":1321},[1241,4775,1303],{"emptyLinePlaceholder":1302},[1241,4777,4778],{"class":1243,"line":1327},[1241,4779,4780],{"class":1247},"# Database - use RDS Proxy for connection pooling\n",[1241,4782,4783,4786,4788],{"class":1243,"line":1333},[1241,4784,4785],{"class":1724},"DATABASES",[1241,4787,1728],{"class":1381},[1241,4789,1566],{"class":1381},[1241,4791,4792,4794,4796,4798,4800],{"class":1243,"line":1339},[1241,4793,1746],{"class":1258},[1241,4795,1857],{"class":1262},[1241,4797,1752],{"class":1258},[1241,4799,1397],{"class":1381},[1241,4801,1566],{"class":1381},[1241,4803,4804,4806,4808,4810,4812,4814,4816,4818],{"class":1243,"line":1345},[1241,4805,1854],{"class":1258},[1241,4807,1871],{"class":1262},[1241,4809,1752],{"class":1258},[1241,4811,1397],{"class":1381},[1241,4813,1822],{"class":1258},[1241,4815,1880],{"class":1262},[1241,4817,1752],{"class":1258},[1241,4819,1407],{"class":1381},[1241,4821,4822,4824,4826,4828,4830,4832,4834,4836,4838,4840,4843,4845],{"class":1243,"line":1350},[1241,4823,1854],{"class":1258},[1241,4825,1891],{"class":1262},[1241,4827,1752],{"class":1258},[1241,4829,1397],{"class":1381},[1241,4831,1833],{"class":1692},[1241,4833,1773],{"class":1381},[1241,4835,1777],{"class":1776},[1241,4837,1904],{"class":1381},[1241,4839,1752],{"class":1258},[1241,4841,4842],{"class":1262},"DB_NAME",[1241,4844,1752],{"class":1258},[1241,4846,1914],{"class":1381},[1241,4848,4849,4851,4853,4855,4857,4859,4861,4863,4865,4867,4870,4872],{"class":1243,"line":1356},[1241,4850,1854],{"class":1258},[1241,4852,1921],{"class":1262},[1241,4854,1752],{"class":1258},[1241,4856,1397],{"class":1381},[1241,4858,1833],{"class":1692},[1241,4860,1773],{"class":1381},[1241,4862,1777],{"class":1776},[1241,4864,1904],{"class":1381},[1241,4866,1752],{"class":1258},[1241,4868,4869],{"class":1262},"DB_USER",[1241,4871,1752],{"class":1258},[1241,4873,1914],{"class":1381},[1241,4875,4876,4878,4880,4882,4884,4886,4888,4890,4892,4894,4897,4899],{"class":1243,"line":1554},[1241,4877,1854],{"class":1258},[1241,4879,1949],{"class":1262},[1241,4881,1752],{"class":1258},[1241,4883,1397],{"class":1381},[1241,4885,1833],{"class":1692},[1241,4887,1773],{"class":1381},[1241,4889,1777],{"class":1776},[1241,4891,1904],{"class":1381},[1241,4893,1752],{"class":1258},[1241,4895,4896],{"class":1262},"DB_PASSWORD",[1241,4898,1752],{"class":1258},[1241,4900,1914],{"class":1381},[1241,4902,4903,4905,4907,4909,4911,4913,4915,4917,4919,4921,4924,4926,4929],{"class":1243,"line":1569},[1241,4904,1854],{"class":1258},[1241,4906,1977],{"class":1262},[1241,4908,1752],{"class":1258},[1241,4910,1397],{"class":1381},[1241,4912,1833],{"class":1692},[1241,4914,1773],{"class":1381},[1241,4916,1777],{"class":1776},[1241,4918,1904],{"class":1381},[1241,4920,1752],{"class":1258},[1241,4922,4923],{"class":1262},"DB_PROXY_ENDPOINT",[1241,4925,1752],{"class":1258},[1241,4927,4928],{"class":1381},"],",[1241,4930,4931],{"class":1247},"  # RDS Proxy endpoint\n",[1241,4933,4934,4936,4938,4940,4942,4944,4947,4949],{"class":1243,"line":1584},[1241,4935,1854],{"class":1258},[1241,4937,2004],{"class":1262},[1241,4939,1752],{"class":1258},[1241,4941,1397],{"class":1381},[1241,4943,1822],{"class":1258},[1241,4945,4946],{"class":1262},"5432",[1241,4948,1752],{"class":1258},[1241,4950,1407],{"class":1381},[1241,4952,4953,4955,4957,4959,4961],{"class":1243,"line":1621},[1241,4954,1854],{"class":1258},[1241,4956,2033],{"class":1262},[1241,4958,1752],{"class":1258},[1241,4960,1397],{"class":1381},[1241,4962,1566],{"class":1381},[1241,4964,4965,4967,4969,4971,4973,4975,4977,4979],{"class":1243,"line":1627},[1241,4966,1868],{"class":1258},[1241,4968,2048],{"class":1262},[1241,4970,1752],{"class":1258},[1241,4972,1397],{"class":1381},[1241,4974,1822],{"class":1258},[1241,4976,2057],{"class":1262},[1241,4978,1752],{"class":1258},[1241,4980,1407],{"class":1381},[1241,4982,4983],{"class":1243,"line":1633},[1241,4984,2680],{"class":1381},[1241,4986,4987,4989,4992,4994,4996,4999,5001],{"class":1243,"line":1639},[1241,4988,1854],{"class":1258},[1241,4990,4991],{"class":1262},"CONN_MAX_AGE",[1241,4993,1752],{"class":1258},[1241,4995,1397],{"class":1381},[1241,4997,4998],{"class":2476}," 0",[1241,5000,1608],{"class":1381},[1241,5002,5003],{"class":1247},"  # Don't persist connections in Lambda\n",[1241,5005,5006],{"class":1243,"line":1645},[1241,5007,1636],{"class":1381},[1241,5009,5010],{"class":1243,"line":2028},[1241,5011,1648],{"class":1381},[1241,5013,5014],{"class":1243,"line":2042},[1241,5015,1303],{"emptyLinePlaceholder":1302},[1241,5017,5018],{"class":1243,"line":2064},[1241,5019,5020],{"class":1247},"# Use S3 for static and media files\n",[1241,5022,5023,5025,5027,5029,5031],{"class":1243,"line":2070},[1241,5024,2254],{"class":1724},[1241,5026,1728],{"class":1381},[1241,5028,1822],{"class":1258},[1241,5030,2261],{"class":1262},[1241,5032,2264],{"class":1258},[1241,5034,5035,5037,5039,5041,5043],{"class":1243,"line":2075},[1241,5036,2303],{"class":1724},[1241,5038,1728],{"class":1381},[1241,5040,1822],{"class":1258},[1241,5042,2261],{"class":1262},[1241,5044,2264],{"class":1258},[1241,5046,5047],{"class":1243,"line":2080},[1241,5048,1303],{"emptyLinePlaceholder":1302},[1241,5050,5051],{"class":1243,"line":2085},[1241,5052,5053],{"class":1247},"# Cache using DynamoDB or ElastiCache\n",[1241,5055,5056,5059,5061],{"class":1243,"line":2091},[1241,5057,5058],{"class":1724},"CACHES",[1241,5060,1728],{"class":1381},[1241,5062,1566],{"class":1381},[1241,5064,5065,5067,5069,5071,5073],{"class":1243,"line":2120},[1241,5066,1746],{"class":1258},[1241,5068,1857],{"class":1262},[1241,5070,1752],{"class":1258},[1241,5072,1397],{"class":1381},[1241,5074,1566],{"class":1381},[1241,5076,5077,5079,5082,5084,5086,5088,5091,5093],{"class":1243,"line":2148},[1241,5078,1854],{"class":1258},[1241,5080,5081],{"class":1262},"BACKEND",[1241,5083,1752],{"class":1258},[1241,5085,1397],{"class":1381},[1241,5087,1822],{"class":1258},[1241,5089,5090],{"class":1262},"django_redis.cache.RedisCache",[1241,5092,1752],{"class":1258},[1241,5094,1407],{"class":1381},[1241,5096,5097,5099,5102,5104,5106,5108,5110,5112,5114,5116,5119,5121],{"class":1243,"line":2177},[1241,5098,1854],{"class":1258},[1241,5100,5101],{"class":1262},"LOCATION",[1241,5103,1752],{"class":1258},[1241,5105,1397],{"class":1381},[1241,5107,1833],{"class":1692},[1241,5109,1773],{"class":1381},[1241,5111,1777],{"class":1776},[1241,5113,1904],{"class":1381},[1241,5115,1752],{"class":1258},[1241,5117,5118],{"class":1262},"REDIS_URL",[1241,5120,1752],{"class":1258},[1241,5122,1914],{"class":1381},[1241,5124,5125,5127,5129,5131,5133],{"class":1243,"line":2214},[1241,5126,1854],{"class":1258},[1241,5128,2033],{"class":1262},[1241,5130,1752],{"class":1258},[1241,5132,1397],{"class":1381},[1241,5134,1566],{"class":1381},[1241,5136,5137,5139,5142,5144,5146,5148,5151,5153],{"class":1243,"line":2240},[1241,5138,1868],{"class":1258},[1241,5140,5141],{"class":1262},"CLIENT_CLASS",[1241,5143,1752],{"class":1258},[1241,5145,1397],{"class":1381},[1241,5147,1822],{"class":1258},[1241,5149,5150],{"class":1262},"django_redis.client.DefaultClient",[1241,5152,1752],{"class":1258},[1241,5154,1407],{"class":1381},[1241,5156,5157,5159,5162,5164,5166],{"class":1243,"line":2245},[1241,5158,1868],{"class":1258},[1241,5160,5161],{"class":1262},"CONNECTION_POOL_KWARGS",[1241,5163,1752],{"class":1258},[1241,5165,1397],{"class":1381},[1241,5167,1566],{"class":1381},[1241,5169,5170,5172,5175,5177,5179,5181,5183],{"class":1243,"line":2251},[1241,5171,2045],{"class":1258},[1241,5173,5174],{"class":1262},"max_connections",[1241,5176,1752],{"class":1258},[1241,5178,1397],{"class":1381},[1241,5180,2564],{"class":2476},[1241,5182,1608],{"class":1381},[1241,5184,5185],{"class":1247},"  # Limit connections in Lambda\n",[1241,5187,5188],{"class":1243,"line":2267},[1241,5189,2067],{"class":1381},[1241,5191,5192],{"class":1243,"line":2289},[1241,5193,2680],{"class":1381},[1241,5195,5196],{"class":1243,"line":2294},[1241,5197,1636],{"class":1381},[1241,5199,5200],{"class":1243,"line":2300},[1241,5201,1648],{"class":1381},[1241,5203,5204],{"class":1243,"line":2314},[1241,5205,1303],{"emptyLinePlaceholder":1302},[1241,5207,5208],{"class":1243,"line":2335},[1241,5209,5210],{"class":1247},"# Session storage\n",[1241,5212,5213,5216,5218,5220,5223],{"class":1243,"line":2340},[1241,5214,5215],{"class":1724},"SESSION_ENGINE",[1241,5217,1728],{"class":1381},[1241,5219,1822],{"class":1258},[1241,5221,5222],{"class":1262},"django.contrib.sessions.backends.cache",[1241,5224,2264],{"class":1258},[1241,5226,5227,5230,5232,5234,5236],{"class":1243,"line":2346},[1241,5228,5229],{"class":1724},"SESSION_CACHE_ALIAS",[1241,5231,1728],{"class":1381},[1241,5233,1822],{"class":1258},[1241,5235,1857],{"class":1262},[1241,5237,2264],{"class":1258},[1241,5239,5240],{"class":1243,"line":2361},[1241,5241,1303],{"emptyLinePlaceholder":1302},[1241,5243,5244],{"class":1243,"line":2371},[1241,5245,5246],{"class":1247},"# Logging for CloudWatch\n",[1241,5248,5249,5251,5253],{"class":1243,"line":2392},[1241,5250,2545],{"class":1724},[1241,5252,1728],{"class":1381},[1241,5254,1566],{"class":1381},[1241,5256,5257,5259,5261,5263,5265,5267],{"class":1243,"line":2397},[1241,5258,1746],{"class":1258},[1241,5260,2557],{"class":1262},[1241,5262,1752],{"class":1258},[1241,5264,1397],{"class":1381},[1241,5266,2564],{"class":2476},[1241,5268,1407],{"class":1381},[1241,5270,5271,5273,5275,5277,5279,5281],{"class":1243,"line":2407},[1241,5272,1746],{"class":1258},[1241,5274,2574],{"class":1262},[1241,5276,1752],{"class":1258},[1241,5278,1397],{"class":1381},[1241,5280,2581],{"class":1731},[1241,5282,1407],{"class":1381},[1241,5284,5285,5287,5289,5291,5293],{"class":1243,"line":2417},[1241,5286,1746],{"class":1258},[1241,5288,2591],{"class":1262},[1241,5290,1752],{"class":1258},[1241,5292,1397],{"class":1381},[1241,5294,1566],{"class":1381},[1241,5296,5297,5299,5301,5303,5305],{"class":1243,"line":2422},[1241,5298,1854],{"class":1258},[1241,5300,2688],{"class":1262},[1241,5302,1752],{"class":1258},[1241,5304,1397],{"class":1381},[1241,5306,1566],{"class":1381},[1241,5308,5309,5311,5313,5315,5317,5319,5321,5323],{"class":1243,"line":2428},[1241,5310,1868],{"class":1258},[1241,5312,2640],{"class":1262},[1241,5314,1752],{"class":1258},[1241,5316,1397],{"class":1381},[1241,5318,1822],{"class":1258},[1241,5320,2729],{"class":1262},[1241,5322,1752],{"class":1258},[1241,5324,1407],{"class":1381},[1241,5326,5327],{"class":1243,"line":2439},[1241,5328,2680],{"class":1381},[1241,5330,5331],{"class":1243,"line":2468},[1241,5332,2744],{"class":1381},[1241,5334,5335,5337,5340,5342,5344],{"class":1243,"line":2480},[1241,5336,1746],{"class":1258},[1241,5338,5339],{"class":1262},"root",[1241,5341,1752],{"class":1258},[1241,5343,1397],{"class":1381},[1241,5345,1566],{"class":1381},[1241,5347,5348,5350,5352,5354,5356,5358,5360,5362,5364],{"class":1243,"line":2490},[1241,5349,1854],{"class":1258},[1241,5351,2591],{"class":1262},[1241,5353,1752],{"class":1258},[1241,5355,1397],{"class":1381},[1241,5357,1598],{"class":1381},[1241,5359,1752],{"class":1258},[1241,5361,2688],{"class":1262},[1241,5363,1752],{"class":1258},[1241,5365,1914],{"class":1381},[1241,5367,5368],{"class":1243,"line":2500},[1241,5369,2744],{"class":1381},[1241,5371,5372],{"class":1243,"line":2505},[1241,5373,1648],{"class":1381},[1035,5375,5377],{"id":5376},"ecs-with-fargate","ECS with Fargate",[1026,5379,5380],{},"Amazon ECS (Elastic Container Service) with Fargate provides serverless container deployment without managing EC2 instances.",[1026,5382,5383],{},[1042,5384,5385],{},"ECS Task Definition",[1128,5387,5389],{"className":1372,"code":5388,"language":1374,"meta":1137,"style":1137},"{\n  \"family\": \"django-app\",\n  \"networkMode\": \"awsvpc\",\n  \"requiresCompatibilities\": [\"FARGATE\"],\n  \"cpu\": \"1024\",\n  \"memory\": \"2048\",\n  \"executionRoleArn\": \"arn:aws:iam::123456789012:role/ecsTaskExecutionRole\",\n  \"taskRoleArn\": \"arn:aws:iam::123456789012:role/ecsTaskRole\",\n  \"containerDefinitions\": [\n    {\n      \"name\": \"django-web\",\n      \"image\": \"123456789012.dkr.ecr.us-east-1.amazonaws.com/django-app:latest\",\n      \"portMappings\": [\n        {\n          \"containerPort\": 8000,\n          \"protocol\": \"tcp\"\n        }\n      ],\n      \"essential\": true,\n      \"environment\": [\n        {\n          \"name\": \"DJANGO_SETTINGS_MODULE\",\n          \"value\": \"myproject.settings.production\"\n        },\n        {\n          \"name\": \"AWS_DEFAULT_REGION\",\n          \"value\": \"us-east-1\"\n        }\n      ],\n      \"secrets\": [\n        {\n          \"name\": \"SECRET_KEY\",\n          \"valueFrom\": \"arn:aws:secretsmanager:us-east-1:123456789012:secret:django/secret-key-AbCdEf\"\n        },\n        {\n          \"name\": \"DATABASE_URL\",\n          \"valueFrom\": \"arn:aws:secretsmanager:us-east-1:123456789012:secret:django/database-url-XyZ123\"\n        },\n        {\n          \"name\": \"REDIS_URL\",\n          \"valueFrom\": \"arn:aws:secretsmanager:us-east-1:123456789012:secret:django/redis-url-MnOpQr\"\n        }\n      ],\n      \"logConfiguration\": {\n        \"logDriver\": \"awslogs\",\n        \"options\": {\n          \"awslogs-group\": \"/ecs/django-app\",\n          \"awslogs-region\": \"us-east-1\",\n          \"awslogs-stream-prefix\": \"ecs\",\n          \"awslogs-create-group\": \"true\"\n        }\n      },\n      \"healthCheck\": {\n        \"command\": [\"CMD-SHELL\", \"curl -f http://localhost:8000/health/ || exit 1\"],\n        \"interval\": 30,\n        \"timeout\": 10,\n        \"retries\": 3,\n        \"startPeriod\": 60\n      },\n      \"mountPoints\": [\n        {\n          \"sourceVolume\": \"static-files\",\n          \"containerPath\": \"/app/staticfiles\",\n          \"readOnly\": false\n        }\n      ]\n    },\n    {\n      \"name\": \"nginx\",\n      \"image\": \"nginx:alpine\",\n      \"portMappings\": [\n        {\n          \"containerPort\": 80,\n          \"protocol\": \"tcp\"\n        }\n      ],\n      \"essential\": true,\n      \"dependsOn\": [\n        {\n          \"containerName\": \"django-web\",\n          \"condition\": \"HEALTHY\"\n        }\n      ],\n      \"mountPoints\": [\n        {\n          \"sourceVolume\": \"static-files\",\n          \"containerPath\": \"/usr/share/nginx/html/static\",\n          \"readOnly\": true\n        },\n        {\n          \"sourceVolume\": \"nginx-config\",\n          \"containerPath\": \"/etc/nginx/conf.d\",\n          \"readOnly\": true\n        }\n      ],\n      \"logConfiguration\": {\n        \"logDriver\": \"awslogs\",\n        \"options\": {\n          \"awslogs-group\": \"/ecs/django-app\",\n          \"awslogs-region\": \"us-east-1\",\n          \"awslogs-stream-prefix\": \"nginx\"\n        }\n      }\n    }\n  ],\n  \"volumes\": [\n    {\n      \"name\": \"static-files\"\n    },\n    {\n      \"name\": \"nginx-config\",\n      \"host\": {\n        \"sourcePath\": \"/ecs/nginx-config\"\n      }\n    }\n  ]\n}\n",[1135,5390,5391,5395,5415,5435,5457,5477,5497,5517,5537,5550,5554,5574,5594,5607,5612,5628,5646,5650,5654,5669,5682,5686,5704,5721,5725,5729,5747,5763,5767,5771,5784,5788,5807,5825,5829,5833,5852,5869,5873,5877,5895,5912,5916,5920,5933,5953,5966,5986,6005,6025,6043,6047,6052,6065,6096,6111,6127,6143,6157,6161,6174,6178,6198,6218,6231,6235,6240,6244,6248,6267,6286,6298,6302,6317,6333,6337,6341,6355,6368,6372,6391,6409,6413,6417,6429,6433,6451,6470,6482,6486,6490,6509,6528,6540,6544,6548,6560,6579,6592,6611,6630,6647,6652,6657,6662,6668,6682,6687,6704,6709,6714,6733,6747,6766,6771,6776,6781],{"__ignoreMap":1137},[1241,5392,5393],{"class":1243,"line":1244},[1241,5394,1382],{"class":1381},[1241,5396,5397,5399,5402,5404,5406,5408,5411,5413],{"class":1243,"line":1251},[1241,5398,1388],{"class":1387},[1241,5400,5401],{"class":1391},"family",[1241,5403,1266],{"class":1387},[1241,5405,1397],{"class":1381},[1241,5407,1259],{"class":1258},[1241,5409,5410],{"class":1262},"django-app",[1241,5412,1266],{"class":1258},[1241,5414,1407],{"class":1381},[1241,5416,5417,5419,5422,5424,5426,5428,5431,5433],{"class":1243,"line":1281},[1241,5418,1388],{"class":1387},[1241,5420,5421],{"class":1391},"networkMode",[1241,5423,1266],{"class":1387},[1241,5425,1397],{"class":1381},[1241,5427,1259],{"class":1258},[1241,5429,5430],{"class":1262},"awsvpc",[1241,5432,1266],{"class":1258},[1241,5434,1407],{"class":1381},[1241,5436,5437,5439,5442,5444,5446,5448,5450,5453,5455],{"class":1243,"line":1290},[1241,5438,1388],{"class":1387},[1241,5440,5441],{"class":1391},"requiresCompatibilities",[1241,5443,1266],{"class":1387},[1241,5445,1397],{"class":1381},[1241,5447,1598],{"class":1381},[1241,5449,1266],{"class":1258},[1241,5451,5452],{"class":1262},"FARGATE",[1241,5454,1266],{"class":1258},[1241,5456,1914],{"class":1381},[1241,5458,5459,5461,5464,5466,5468,5470,5473,5475],{"class":1243,"line":1299},[1241,5460,1388],{"class":1387},[1241,5462,5463],{"class":1391},"cpu",[1241,5465,1266],{"class":1387},[1241,5467,1397],{"class":1381},[1241,5469,1259],{"class":1258},[1241,5471,5472],{"class":1262},"1024",[1241,5474,1266],{"class":1258},[1241,5476,1407],{"class":1381},[1241,5478,5479,5481,5484,5486,5488,5490,5493,5495],{"class":1243,"line":1306},[1241,5480,1388],{"class":1387},[1241,5482,5483],{"class":1391},"memory",[1241,5485,1266],{"class":1387},[1241,5487,1397],{"class":1381},[1241,5489,1259],{"class":1258},[1241,5491,5492],{"class":1262},"2048",[1241,5494,1266],{"class":1258},[1241,5496,1407],{"class":1381},[1241,5498,5499,5501,5504,5506,5508,5510,5513,5515],{"class":1243,"line":1312},[1241,5500,1388],{"class":1387},[1241,5502,5503],{"class":1391},"executionRoleArn",[1241,5505,1266],{"class":1387},[1241,5507,1397],{"class":1381},[1241,5509,1259],{"class":1258},[1241,5511,5512],{"class":1262},"arn:aws:iam::123456789012:role/ecsTaskExecutionRole",[1241,5514,1266],{"class":1258},[1241,5516,1407],{"class":1381},[1241,5518,5519,5521,5524,5526,5528,5530,5533,5535],{"class":1243,"line":1321},[1241,5520,1388],{"class":1387},[1241,5522,5523],{"class":1391},"taskRoleArn",[1241,5525,1266],{"class":1387},[1241,5527,1397],{"class":1381},[1241,5529,1259],{"class":1258},[1241,5531,5532],{"class":1262},"arn:aws:iam::123456789012:role/ecsTaskRole",[1241,5534,1266],{"class":1258},[1241,5536,1407],{"class":1381},[1241,5538,5539,5541,5544,5546,5548],{"class":1243,"line":1327},[1241,5540,1388],{"class":1387},[1241,5542,5543],{"class":1391},"containerDefinitions",[1241,5545,1266],{"class":1387},[1241,5547,1397],{"class":1381},[1241,5549,1421],{"class":1381},[1241,5551,5552],{"class":1243,"line":1333},[1241,5553,1426],{"class":1381},[1241,5555,5556,5558,5561,5563,5565,5567,5570,5572],{"class":1243,"line":1339},[1241,5557,1431],{"class":1387},[1241,5559,5560],{"class":1434},"name",[1241,5562,1266],{"class":1387},[1241,5564,1397],{"class":1381},[1241,5566,1259],{"class":1258},[1241,5568,5569],{"class":1262},"django-web",[1241,5571,1266],{"class":1258},[1241,5573,1407],{"class":1381},[1241,5575,5576,5578,5581,5583,5585,5587,5590,5592],{"class":1243,"line":1345},[1241,5577,1431],{"class":1387},[1241,5579,5580],{"class":1434},"image",[1241,5582,1266],{"class":1387},[1241,5584,1397],{"class":1381},[1241,5586,1259],{"class":1258},[1241,5588,5589],{"class":1262},"123456789012.dkr.ecr.us-east-1.amazonaws.com/django-app:latest",[1241,5591,1266],{"class":1258},[1241,5593,1407],{"class":1381},[1241,5595,5596,5598,5601,5603,5605],{"class":1243,"line":1350},[1241,5597,1431],{"class":1387},[1241,5599,5600],{"class":1434},"portMappings",[1241,5602,1266],{"class":1387},[1241,5604,1397],{"class":1381},[1241,5606,1421],{"class":1381},[1241,5608,5609],{"class":1243,"line":1356},[1241,5610,5611],{"class":1381},"        {\n",[1241,5613,5614,5616,5619,5621,5623,5626],{"class":1243,"line":1554},[1241,5615,1587],{"class":1387},[1241,5617,5618],{"class":1574},"containerPort",[1241,5620,1266],{"class":1387},[1241,5622,1397],{"class":1381},[1241,5624,5625],{"class":2476}," 8000",[1241,5627,1407],{"class":1381},[1241,5629,5630,5632,5635,5637,5639,5641,5644],{"class":1243,"line":1569},[1241,5631,1587],{"class":1387},[1241,5633,5634],{"class":1574},"protocol",[1241,5636,1266],{"class":1387},[1241,5638,1397],{"class":1381},[1241,5640,1259],{"class":1258},[1241,5642,5643],{"class":1262},"tcp",[1241,5645,1278],{"class":1258},[1241,5647,5648],{"class":1243,"line":1584},[1241,5649,1624],{"class":1381},[1241,5651,5652],{"class":1243,"line":1621},[1241,5653,1531],{"class":1381},[1241,5655,5656,5658,5661,5663,5665,5667],{"class":1243,"line":1627},[1241,5657,1431],{"class":1387},[1241,5659,5660],{"class":1434},"essential",[1241,5662,1266],{"class":1387},[1241,5664,1397],{"class":1381},[1241,5666,4586],{"class":1731},[1241,5668,1407],{"class":1381},[1241,5670,5671,5673,5676,5678,5680],{"class":1243,"line":1633},[1241,5672,1431],{"class":1387},[1241,5674,5675],{"class":1434},"environment",[1241,5677,1266],{"class":1387},[1241,5679,1397],{"class":1381},[1241,5681,1421],{"class":1381},[1241,5683,5684],{"class":1243,"line":1639},[1241,5685,5611],{"class":1381},[1241,5687,5688,5690,5692,5694,5696,5698,5700,5702],{"class":1243,"line":1645},[1241,5689,1587],{"class":1387},[1241,5691,5560],{"class":1574},[1241,5693,1266],{"class":1387},[1241,5695,1397],{"class":1381},[1241,5697,1259],{"class":1258},[1241,5699,2956],{"class":1262},[1241,5701,1266],{"class":1258},[1241,5703,1407],{"class":1381},[1241,5705,5706,5708,5711,5713,5715,5717,5719],{"class":1243,"line":2028},[1241,5707,1587],{"class":1387},[1241,5709,5710],{"class":1574},"value",[1241,5712,1266],{"class":1387},[1241,5714,1397],{"class":1381},[1241,5716,1259],{"class":1258},[1241,5718,2965],{"class":1262},[1241,5720,1278],{"class":1258},[1241,5722,5723],{"class":1243,"line":2042},[1241,5724,2680],{"class":1381},[1241,5726,5727],{"class":1243,"line":2064},[1241,5728,5611],{"class":1381},[1241,5730,5731,5733,5735,5737,5739,5741,5743,5745],{"class":1243,"line":2070},[1241,5732,1587],{"class":1387},[1241,5734,5560],{"class":1574},[1241,5736,1266],{"class":1387},[1241,5738,1397],{"class":1381},[1241,5740,1259],{"class":1258},[1241,5742,2199],{"class":1262},[1241,5744,1266],{"class":1258},[1241,5746,1407],{"class":1381},[1241,5748,5749,5751,5753,5755,5757,5759,5761],{"class":1243,"line":2075},[1241,5750,1587],{"class":1387},[1241,5752,5710],{"class":1574},[1241,5754,1266],{"class":1387},[1241,5756,1397],{"class":1381},[1241,5758,1259],{"class":1258},[1241,5760,1603],{"class":1262},[1241,5762,1278],{"class":1258},[1241,5764,5765],{"class":1243,"line":2080},[1241,5766,1624],{"class":1381},[1241,5768,5769],{"class":1243,"line":2085},[1241,5770,1531],{"class":1381},[1241,5772,5773,5775,5778,5780,5782],{"class":1243,"line":2091},[1241,5774,1431],{"class":1387},[1241,5776,5777],{"class":1434},"secrets",[1241,5779,1266],{"class":1387},[1241,5781,1397],{"class":1381},[1241,5783,1421],{"class":1381},[1241,5785,5786],{"class":1243,"line":2120},[1241,5787,5611],{"class":1381},[1241,5789,5790,5792,5794,5796,5798,5800,5803,5805],{"class":1243,"line":2148},[1241,5791,1587],{"class":1387},[1241,5793,5560],{"class":1574},[1241,5795,1266],{"class":1387},[1241,5797,1397],{"class":1381},[1241,5799,1259],{"class":1258},[1241,5801,5802],{"class":1262},"SECRET_KEY",[1241,5804,1266],{"class":1258},[1241,5806,1407],{"class":1381},[1241,5808,5809,5811,5814,5816,5818,5820,5823],{"class":1243,"line":2177},[1241,5810,1587],{"class":1387},[1241,5812,5813],{"class":1574},"valueFrom",[1241,5815,1266],{"class":1387},[1241,5817,1397],{"class":1381},[1241,5819,1259],{"class":1258},[1241,5821,5822],{"class":1262},"arn:aws:secretsmanager:us-east-1:123456789012:secret:django/secret-key-AbCdEf",[1241,5824,1278],{"class":1258},[1241,5826,5827],{"class":1243,"line":2214},[1241,5828,2680],{"class":1381},[1241,5830,5831],{"class":1243,"line":2240},[1241,5832,5611],{"class":1381},[1241,5834,5835,5837,5839,5841,5843,5845,5848,5850],{"class":1243,"line":2245},[1241,5836,1587],{"class":1387},[1241,5838,5560],{"class":1574},[1241,5840,1266],{"class":1387},[1241,5842,1397],{"class":1381},[1241,5844,1259],{"class":1258},[1241,5846,5847],{"class":1262},"DATABASE_URL",[1241,5849,1266],{"class":1258},[1241,5851,1407],{"class":1381},[1241,5853,5854,5856,5858,5860,5862,5864,5867],{"class":1243,"line":2251},[1241,5855,1587],{"class":1387},[1241,5857,5813],{"class":1574},[1241,5859,1266],{"class":1387},[1241,5861,1397],{"class":1381},[1241,5863,1259],{"class":1258},[1241,5865,5866],{"class":1262},"arn:aws:secretsmanager:us-east-1:123456789012:secret:django/database-url-XyZ123",[1241,5868,1278],{"class":1258},[1241,5870,5871],{"class":1243,"line":2267},[1241,5872,2680],{"class":1381},[1241,5874,5875],{"class":1243,"line":2289},[1241,5876,5611],{"class":1381},[1241,5878,5879,5881,5883,5885,5887,5889,5891,5893],{"class":1243,"line":2294},[1241,5880,1587],{"class":1387},[1241,5882,5560],{"class":1574},[1241,5884,1266],{"class":1387},[1241,5886,1397],{"class":1381},[1241,5888,1259],{"class":1258},[1241,5890,5118],{"class":1262},[1241,5892,1266],{"class":1258},[1241,5894,1407],{"class":1381},[1241,5896,5897,5899,5901,5903,5905,5907,5910],{"class":1243,"line":2300},[1241,5898,1587],{"class":1387},[1241,5900,5813],{"class":1574},[1241,5902,1266],{"class":1387},[1241,5904,1397],{"class":1381},[1241,5906,1259],{"class":1258},[1241,5908,5909],{"class":1262},"arn:aws:secretsmanager:us-east-1:123456789012:secret:django/redis-url-MnOpQr",[1241,5911,1278],{"class":1258},[1241,5913,5914],{"class":1243,"line":2314},[1241,5915,1624],{"class":1381},[1241,5917,5918],{"class":1243,"line":2335},[1241,5919,1531],{"class":1381},[1241,5921,5922,5924,5927,5929,5931],{"class":1243,"line":2340},[1241,5923,1431],{"class":1387},[1241,5925,5926],{"class":1434},"logConfiguration",[1241,5928,1266],{"class":1387},[1241,5930,1397],{"class":1381},[1241,5932,1566],{"class":1381},[1241,5934,5935,5937,5940,5942,5944,5946,5949,5951],{"class":1243,"line":2346},[1241,5936,1466],{"class":1387},[1241,5938,5939],{"class":1574},"logDriver",[1241,5941,1266],{"class":1387},[1241,5943,1397],{"class":1381},[1241,5945,1259],{"class":1258},[1241,5947,5948],{"class":1262},"awslogs",[1241,5950,1266],{"class":1258},[1241,5952,1407],{"class":1381},[1241,5954,5955,5957,5960,5962,5964],{"class":1243,"line":2361},[1241,5956,1466],{"class":1387},[1241,5958,5959],{"class":1574},"options",[1241,5961,1266],{"class":1387},[1241,5963,1397],{"class":1381},[1241,5965,1566],{"class":1381},[1241,5967,5968,5970,5973,5975,5977,5979,5982,5984],{"class":1243,"line":2371},[1241,5969,1587],{"class":1387},[1241,5971,5972],{"class":1590},"awslogs-group",[1241,5974,1266],{"class":1387},[1241,5976,1397],{"class":1381},[1241,5978,1259],{"class":1258},[1241,5980,5981],{"class":1262},"/ecs/django-app",[1241,5983,1266],{"class":1258},[1241,5985,1407],{"class":1381},[1241,5987,5988,5990,5993,5995,5997,5999,6001,6003],{"class":1243,"line":2392},[1241,5989,1587],{"class":1387},[1241,5991,5992],{"class":1590},"awslogs-region",[1241,5994,1266],{"class":1387},[1241,5996,1397],{"class":1381},[1241,5998,1259],{"class":1258},[1241,6000,1603],{"class":1262},[1241,6002,1266],{"class":1258},[1241,6004,1407],{"class":1381},[1241,6006,6007,6009,6012,6014,6016,6018,6021,6023],{"class":1243,"line":2397},[1241,6008,1587],{"class":1387},[1241,6010,6011],{"class":1590},"awslogs-stream-prefix",[1241,6013,1266],{"class":1387},[1241,6015,1397],{"class":1381},[1241,6017,1259],{"class":1258},[1241,6019,6020],{"class":1262},"ecs",[1241,6022,1266],{"class":1258},[1241,6024,1407],{"class":1381},[1241,6026,6027,6029,6032,6034,6036,6038,6041],{"class":1243,"line":2407},[1241,6028,1587],{"class":1387},[1241,6030,6031],{"class":1590},"awslogs-create-group",[1241,6033,1266],{"class":1387},[1241,6035,1397],{"class":1381},[1241,6037,1259],{"class":1258},[1241,6039,6040],{"class":1262},"true",[1241,6042,1278],{"class":1258},[1241,6044,6045],{"class":1243,"line":2417},[1241,6046,1624],{"class":1381},[1241,6048,6049],{"class":1243,"line":2422},[1241,6050,6051],{"class":1381},"      },\n",[1241,6053,6054,6056,6059,6061,6063],{"class":1243,"line":2428},[1241,6055,1431],{"class":1387},[1241,6057,6058],{"class":1434},"healthCheck",[1241,6060,1266],{"class":1387},[1241,6062,1397],{"class":1381},[1241,6064,1566],{"class":1381},[1241,6066,6067,6069,6072,6074,6076,6078,6080,6083,6085,6087,6089,6092,6094],{"class":1243,"line":2439},[1241,6068,1466],{"class":1387},[1241,6070,6071],{"class":1574},"command",[1241,6073,1266],{"class":1387},[1241,6075,1397],{"class":1381},[1241,6077,1598],{"class":1381},[1241,6079,1266],{"class":1258},[1241,6081,6082],{"class":1262},"CMD-SHELL",[1241,6084,1266],{"class":1258},[1241,6086,1608],{"class":1381},[1241,6088,1259],{"class":1258},[1241,6090,6091],{"class":1262},"curl -f http://localhost:8000/health/ || exit 1",[1241,6093,1266],{"class":1258},[1241,6095,1914],{"class":1381},[1241,6097,6098,6100,6103,6105,6107,6109],{"class":1243,"line":2468},[1241,6099,1466],{"class":1387},[1241,6101,6102],{"class":1574},"interval",[1241,6104,1266],{"class":1387},[1241,6106,1397],{"class":1381},[1241,6108,4450],{"class":2476},[1241,6110,1407],{"class":1381},[1241,6112,6113,6115,6118,6120,6122,6125],{"class":1243,"line":2480},[1241,6114,1466],{"class":1387},[1241,6116,6117],{"class":1574},"timeout",[1241,6119,1266],{"class":1387},[1241,6121,1397],{"class":1381},[1241,6123,6124],{"class":2476}," 10",[1241,6126,1407],{"class":1381},[1241,6128,6129,6131,6134,6136,6138,6141],{"class":1243,"line":2490},[1241,6130,1466],{"class":1387},[1241,6132,6133],{"class":1574},"retries",[1241,6135,1266],{"class":1387},[1241,6137,1397],{"class":1381},[1241,6139,6140],{"class":2476}," 3",[1241,6142,1407],{"class":1381},[1241,6144,6145,6147,6150,6152,6154],{"class":1243,"line":2500},[1241,6146,1466],{"class":1387},[1241,6148,6149],{"class":1574},"startPeriod",[1241,6151,1266],{"class":1387},[1241,6153,1397],{"class":1381},[1241,6155,6156],{"class":2476}," 60\n",[1241,6158,6159],{"class":1243,"line":2505},[1241,6160,6051],{"class":1381},[1241,6162,6163,6165,6168,6170,6172],{"class":1243,"line":2511},[1241,6164,1431],{"class":1387},[1241,6166,6167],{"class":1434},"mountPoints",[1241,6169,1266],{"class":1387},[1241,6171,1397],{"class":1381},[1241,6173,1421],{"class":1381},[1241,6175,6176],{"class":1243,"line":2521},[1241,6177,5611],{"class":1381},[1241,6179,6180,6182,6185,6187,6189,6191,6194,6196],{"class":1243,"line":2531},[1241,6181,1587],{"class":1387},[1241,6183,6184],{"class":1574},"sourceVolume",[1241,6186,1266],{"class":1387},[1241,6188,1397],{"class":1381},[1241,6190,1259],{"class":1258},[1241,6192,6193],{"class":1262},"static-files",[1241,6195,1266],{"class":1258},[1241,6197,1407],{"class":1381},[1241,6199,6200,6202,6205,6207,6209,6211,6214,6216],{"class":1243,"line":2536},[1241,6201,1587],{"class":1387},[1241,6203,6204],{"class":1574},"containerPath",[1241,6206,1266],{"class":1387},[1241,6208,1397],{"class":1381},[1241,6210,1259],{"class":1258},[1241,6212,6213],{"class":1262},"/app/staticfiles",[1241,6215,1266],{"class":1258},[1241,6217,1407],{"class":1381},[1241,6219,6220,6222,6225,6227,6229],{"class":1243,"line":2542},[1241,6221,1587],{"class":1387},[1241,6223,6224],{"class":1574},"readOnly",[1241,6226,1266],{"class":1387},[1241,6228,1397],{"class":1381},[1241,6230,3640],{"class":1731},[1241,6232,6233],{"class":1243,"line":2552},[1241,6234,1624],{"class":1381},[1241,6236,6237],{"class":1243,"line":2569},[1241,6238,6239],{"class":1381},"      ]\n",[1241,6241,6242],{"class":1243,"line":2586},[1241,6243,2744],{"class":1381},[1241,6245,6246],{"class":1243,"line":2600},[1241,6247,1426],{"class":1381},[1241,6249,6250,6252,6254,6256,6258,6260,6263,6265],{"class":1243,"line":2614},[1241,6251,1431],{"class":1387},[1241,6253,5560],{"class":1434},[1241,6255,1266],{"class":1387},[1241,6257,1397],{"class":1381},[1241,6259,1259],{"class":1258},[1241,6261,6262],{"class":1262},"nginx",[1241,6264,1266],{"class":1258},[1241,6266,1407],{"class":1381},[1241,6268,6269,6271,6273,6275,6277,6279,6282,6284],{"class":1243,"line":2635},[1241,6270,1431],{"class":1387},[1241,6272,5580],{"class":1434},[1241,6274,1266],{"class":1387},[1241,6276,1397],{"class":1381},[1241,6278,1259],{"class":1258},[1241,6280,6281],{"class":1262},"nginx:alpine",[1241,6283,1266],{"class":1258},[1241,6285,1407],{"class":1381},[1241,6287,6288,6290,6292,6294,6296],{"class":1243,"line":2656},[1241,6289,1431],{"class":1387},[1241,6291,5600],{"class":1434},[1241,6293,1266],{"class":1387},[1241,6295,1397],{"class":1381},[1241,6297,1421],{"class":1381},[1241,6299,6300],{"class":1243,"line":2677},[1241,6301,5611],{"class":1381},[1241,6303,6304,6306,6308,6310,6312,6315],{"class":1243,"line":2683},[1241,6305,1587],{"class":1387},[1241,6307,5618],{"class":1574},[1241,6309,1266],{"class":1387},[1241,6311,1397],{"class":1381},[1241,6313,6314],{"class":2476}," 80",[1241,6316,1407],{"class":1381},[1241,6318,6319,6321,6323,6325,6327,6329,6331],{"class":1243,"line":2697},[1241,6320,1587],{"class":1387},[1241,6322,5634],{"class":1574},[1241,6324,1266],{"class":1387},[1241,6326,1397],{"class":1381},[1241,6328,1259],{"class":1258},[1241,6330,5643],{"class":1262},[1241,6332,1278],{"class":1258},[1241,6334,6335],{"class":1243,"line":2716},[1241,6336,1624],{"class":1381},[1241,6338,6339],{"class":1243,"line":2736},[1241,6340,1531],{"class":1381},[1241,6342,6343,6345,6347,6349,6351,6353],{"class":1243,"line":2741},[1241,6344,1431],{"class":1387},[1241,6346,5660],{"class":1434},[1241,6348,1266],{"class":1387},[1241,6350,1397],{"class":1381},[1241,6352,4586],{"class":1731},[1241,6354,1407],{"class":1381},[1241,6356,6357,6359,6362,6364,6366],{"class":1243,"line":2747},[1241,6358,1431],{"class":1387},[1241,6360,6361],{"class":1434},"dependsOn",[1241,6363,1266],{"class":1387},[1241,6365,1397],{"class":1381},[1241,6367,1421],{"class":1381},[1241,6369,6370],{"class":1243,"line":2761},[1241,6371,5611],{"class":1381},[1241,6373,6374,6376,6379,6381,6383,6385,6387,6389],{"class":1243,"line":2775},[1241,6375,1587],{"class":1387},[1241,6377,6378],{"class":1574},"containerName",[1241,6380,1266],{"class":1387},[1241,6382,1397],{"class":1381},[1241,6384,1259],{"class":1258},[1241,6386,5569],{"class":1262},[1241,6388,1266],{"class":1258},[1241,6390,1407],{"class":1381},[1241,6392,6393,6395,6398,6400,6402,6404,6407],{"class":1243,"line":2804},[1241,6394,1587],{"class":1387},[1241,6396,6397],{"class":1574},"condition",[1241,6399,1266],{"class":1387},[1241,6401,1397],{"class":1381},[1241,6403,1259],{"class":1258},[1241,6405,6406],{"class":1262},"HEALTHY",[1241,6408,1278],{"class":1258},[1241,6410,6411],{"class":1243,"line":2823},[1241,6412,1624],{"class":1381},[1241,6414,6415],{"class":1243,"line":2840},[1241,6416,1531],{"class":1381},[1241,6418,6419,6421,6423,6425,6427],{"class":1243,"line":2845},[1241,6420,1431],{"class":1387},[1241,6422,6167],{"class":1434},[1241,6424,1266],{"class":1387},[1241,6426,1397],{"class":1381},[1241,6428,1421],{"class":1381},[1241,6430,6431],{"class":1243,"line":2850},[1241,6432,5611],{"class":1381},[1241,6434,6435,6437,6439,6441,6443,6445,6447,6449],{"class":1243,"line":3776},[1241,6436,1587],{"class":1387},[1241,6438,6184],{"class":1574},[1241,6440,1266],{"class":1387},[1241,6442,1397],{"class":1381},[1241,6444,1259],{"class":1258},[1241,6446,6193],{"class":1262},[1241,6448,1266],{"class":1258},[1241,6450,1407],{"class":1381},[1241,6452,6453,6455,6457,6459,6461,6463,6466,6468],{"class":1243,"line":3782},[1241,6454,1587],{"class":1387},[1241,6456,6204],{"class":1574},[1241,6458,1266],{"class":1387},[1241,6460,1397],{"class":1381},[1241,6462,1259],{"class":1258},[1241,6464,6465],{"class":1262},"/usr/share/nginx/html/static",[1241,6467,1266],{"class":1258},[1241,6469,1407],{"class":1381},[1241,6471,6472,6474,6476,6478,6480],{"class":1243,"line":3789},[1241,6473,1587],{"class":1387},[1241,6475,6224],{"class":1574},[1241,6477,1266],{"class":1387},[1241,6479,1397],{"class":1381},[1241,6481,3228],{"class":1731},[1241,6483,6484],{"class":1243,"line":3796},[1241,6485,2680],{"class":1381},[1241,6487,6488],{"class":1243,"line":3811},[1241,6489,5611],{"class":1381},[1241,6491,6492,6494,6496,6498,6500,6502,6505,6507],{"class":1243,"line":3826},[1241,6493,1587],{"class":1387},[1241,6495,6184],{"class":1574},[1241,6497,1266],{"class":1387},[1241,6499,1397],{"class":1381},[1241,6501,1259],{"class":1258},[1241,6503,6504],{"class":1262},"nginx-config",[1241,6506,1266],{"class":1258},[1241,6508,1407],{"class":1381},[1241,6510,6511,6513,6515,6517,6519,6521,6524,6526],{"class":1243,"line":3841},[1241,6512,1587],{"class":1387},[1241,6514,6204],{"class":1574},[1241,6516,1266],{"class":1387},[1241,6518,1397],{"class":1381},[1241,6520,1259],{"class":1258},[1241,6522,6523],{"class":1262},"/etc/nginx/conf.d",[1241,6525,1266],{"class":1258},[1241,6527,1407],{"class":1381},[1241,6529,6530,6532,6534,6536,6538],{"class":1243,"line":3856},[1241,6531,1587],{"class":1387},[1241,6533,6224],{"class":1574},[1241,6535,1266],{"class":1387},[1241,6537,1397],{"class":1381},[1241,6539,3228],{"class":1731},[1241,6541,6542],{"class":1243,"line":3871},[1241,6543,1624],{"class":1381},[1241,6545,6546],{"class":1243,"line":3886},[1241,6547,1531],{"class":1381},[1241,6549,6550,6552,6554,6556,6558],{"class":1243,"line":3901},[1241,6551,1431],{"class":1387},[1241,6553,5926],{"class":1434},[1241,6555,1266],{"class":1387},[1241,6557,1397],{"class":1381},[1241,6559,1566],{"class":1381},[1241,6561,6563,6565,6567,6569,6571,6573,6575,6577],{"class":1243,"line":6562},97,[1241,6564,1466],{"class":1387},[1241,6566,5939],{"class":1574},[1241,6568,1266],{"class":1387},[1241,6570,1397],{"class":1381},[1241,6572,1259],{"class":1258},[1241,6574,5948],{"class":1262},[1241,6576,1266],{"class":1258},[1241,6578,1407],{"class":1381},[1241,6580,6582,6584,6586,6588,6590],{"class":1243,"line":6581},98,[1241,6583,1466],{"class":1387},[1241,6585,5959],{"class":1574},[1241,6587,1266],{"class":1387},[1241,6589,1397],{"class":1381},[1241,6591,1566],{"class":1381},[1241,6593,6595,6597,6599,6601,6603,6605,6607,6609],{"class":1243,"line":6594},99,[1241,6596,1587],{"class":1387},[1241,6598,5972],{"class":1590},[1241,6600,1266],{"class":1387},[1241,6602,1397],{"class":1381},[1241,6604,1259],{"class":1258},[1241,6606,5981],{"class":1262},[1241,6608,1266],{"class":1258},[1241,6610,1407],{"class":1381},[1241,6612,6614,6616,6618,6620,6622,6624,6626,6628],{"class":1243,"line":6613},100,[1241,6615,1587],{"class":1387},[1241,6617,5992],{"class":1590},[1241,6619,1266],{"class":1387},[1241,6621,1397],{"class":1381},[1241,6623,1259],{"class":1258},[1241,6625,1603],{"class":1262},[1241,6627,1266],{"class":1258},[1241,6629,1407],{"class":1381},[1241,6631,6633,6635,6637,6639,6641,6643,6645],{"class":1243,"line":6632},101,[1241,6634,1587],{"class":1387},[1241,6636,6011],{"class":1590},[1241,6638,1266],{"class":1387},[1241,6640,1397],{"class":1381},[1241,6642,1259],{"class":1258},[1241,6644,6262],{"class":1262},[1241,6646,1278],{"class":1258},[1241,6648,6650],{"class":1243,"line":6649},102,[1241,6651,1624],{"class":1381},[1241,6653,6655],{"class":1243,"line":6654},103,[1241,6656,1630],{"class":1381},[1241,6658,6660],{"class":1243,"line":6659},104,[1241,6661,1636],{"class":1381},[1241,6663,6665],{"class":1243,"line":6664},105,[1241,6666,6667],{"class":1381},"  ],\n",[1241,6669,6671,6673,6676,6678,6680],{"class":1243,"line":6670},106,[1241,6672,1388],{"class":1387},[1241,6674,6675],{"class":1391},"volumes",[1241,6677,1266],{"class":1387},[1241,6679,1397],{"class":1381},[1241,6681,1421],{"class":1381},[1241,6683,6685],{"class":1243,"line":6684},107,[1241,6686,1426],{"class":1381},[1241,6688,6690,6692,6694,6696,6698,6700,6702],{"class":1243,"line":6689},108,[1241,6691,1431],{"class":1387},[1241,6693,5560],{"class":1434},[1241,6695,1266],{"class":1387},[1241,6697,1397],{"class":1381},[1241,6699,1259],{"class":1258},[1241,6701,6193],{"class":1262},[1241,6703,1278],{"class":1258},[1241,6705,6707],{"class":1243,"line":6706},109,[1241,6708,2744],{"class":1381},[1241,6710,6712],{"class":1243,"line":6711},110,[1241,6713,1426],{"class":1381},[1241,6715,6717,6719,6721,6723,6725,6727,6729,6731],{"class":1243,"line":6716},111,[1241,6718,1431],{"class":1387},[1241,6720,5560],{"class":1434},[1241,6722,1266],{"class":1387},[1241,6724,1397],{"class":1381},[1241,6726,1259],{"class":1258},[1241,6728,6504],{"class":1262},[1241,6730,1266],{"class":1258},[1241,6732,1407],{"class":1381},[1241,6734,6736,6738,6741,6743,6745],{"class":1243,"line":6735},112,[1241,6737,1431],{"class":1387},[1241,6739,6740],{"class":1434},"host",[1241,6742,1266],{"class":1387},[1241,6744,1397],{"class":1381},[1241,6746,1566],{"class":1381},[1241,6748,6750,6752,6755,6757,6759,6761,6764],{"class":1243,"line":6749},113,[1241,6751,1466],{"class":1387},[1241,6753,6754],{"class":1574},"sourcePath",[1241,6756,1266],{"class":1387},[1241,6758,1397],{"class":1381},[1241,6760,1259],{"class":1258},[1241,6762,6763],{"class":1262},"/ecs/nginx-config",[1241,6765,1278],{"class":1258},[1241,6767,6769],{"class":1243,"line":6768},114,[1241,6770,1630],{"class":1381},[1241,6772,6774],{"class":1243,"line":6773},115,[1241,6775,1636],{"class":1381},[1241,6777,6779],{"class":1243,"line":6778},116,[1241,6780,1642],{"class":1381},[1241,6782,6784],{"class":1243,"line":6783},117,[1241,6785,1648],{"class":1381},[1026,6787,6788],{},[1042,6789,6790],{},"ECS Service Definition",[1128,6792,6794],{"className":1372,"code":6793,"language":1374,"meta":1137,"style":1137},"{\n  \"serviceName\": \"django-app-service\",\n  \"cluster\": \"django-cluster\",\n  \"taskDefinition\": \"django-app:1\",\n  \"desiredCount\": 3,\n  \"launchType\": \"FARGATE\",\n  \"networkConfiguration\": {\n    \"awsvpcConfiguration\": {\n      \"subnets\": [\n        \"subnet-12345678\",\n        \"subnet-87654321\"\n      ],\n      \"securityGroups\": [\n        \"sg-12345678\"\n      ],\n      \"assignPublicIp\": \"DISABLED\"\n    }\n  },\n  \"loadBalancers\": [\n    {\n      \"targetGroupArn\": \"arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/django-tg/1234567890123456\",\n      \"containerName\": \"nginx\",\n      \"containerPort\": 80\n    }\n  ],\n  \"serviceRegistries\": [\n    {\n      \"registryArn\": \"arn:aws:servicediscovery:us-east-1:123456789012:service/srv-12345678\",\n      \"containerName\": \"django-web\",\n      \"containerPort\": 8000\n    }\n  ],\n  \"deploymentConfiguration\": {\n    \"maximumPercent\": 200,\n    \"minimumHealthyPercent\": 50,\n    \"deploymentCircuitBreaker\": {\n      \"enable\": true,\n      \"rollback\": true\n    }\n  },\n  \"enableExecuteCommand\": true,\n  \"tags\": [\n    {\n      \"key\": \"Environment\",\n      \"value\": \"production\"\n    },\n    {\n      \"key\": \"Application\",\n      \"value\": \"django-app\"\n    }\n  ]\n}\n",[1135,6795,6796,6800,6820,6840,6860,6875,6894,6907,6920,6933,6944,6953,6957,6970,6978,6982,7000,7004,7009,7022,7026,7046,7064,7076,7080,7084,7097,7101,7121,7139,7152,7156,7160,7173,7189,7205,7218,7233,7246,7250,7254,7269,7282,7286,7306,7322,7326,7330,7349,7365,7369,7373],{"__ignoreMap":1137},[1241,6797,6798],{"class":1243,"line":1244},[1241,6799,1382],{"class":1381},[1241,6801,6802,6804,6807,6809,6811,6813,6816,6818],{"class":1243,"line":1251},[1241,6803,1388],{"class":1387},[1241,6805,6806],{"class":1391},"serviceName",[1241,6808,1266],{"class":1387},[1241,6810,1397],{"class":1381},[1241,6812,1259],{"class":1258},[1241,6814,6815],{"class":1262},"django-app-service",[1241,6817,1266],{"class":1258},[1241,6819,1407],{"class":1381},[1241,6821,6822,6824,6827,6829,6831,6833,6836,6838],{"class":1243,"line":1281},[1241,6823,1388],{"class":1387},[1241,6825,6826],{"class":1391},"cluster",[1241,6828,1266],{"class":1387},[1241,6830,1397],{"class":1381},[1241,6832,1259],{"class":1258},[1241,6834,6835],{"class":1262},"django-cluster",[1241,6837,1266],{"class":1258},[1241,6839,1407],{"class":1381},[1241,6841,6842,6844,6847,6849,6851,6853,6856,6858],{"class":1243,"line":1290},[1241,6843,1388],{"class":1387},[1241,6845,6846],{"class":1391},"taskDefinition",[1241,6848,1266],{"class":1387},[1241,6850,1397],{"class":1381},[1241,6852,1259],{"class":1258},[1241,6854,6855],{"class":1262},"django-app:1",[1241,6857,1266],{"class":1258},[1241,6859,1407],{"class":1381},[1241,6861,6862,6864,6867,6869,6871,6873],{"class":1243,"line":1299},[1241,6863,1388],{"class":1387},[1241,6865,6866],{"class":1391},"desiredCount",[1241,6868,1266],{"class":1387},[1241,6870,1397],{"class":1381},[1241,6872,6140],{"class":2476},[1241,6874,1407],{"class":1381},[1241,6876,6877,6879,6882,6884,6886,6888,6890,6892],{"class":1243,"line":1306},[1241,6878,1388],{"class":1387},[1241,6880,6881],{"class":1391},"launchType",[1241,6883,1266],{"class":1387},[1241,6885,1397],{"class":1381},[1241,6887,1259],{"class":1258},[1241,6889,5452],{"class":1262},[1241,6891,1266],{"class":1258},[1241,6893,1407],{"class":1381},[1241,6895,6896,6898,6901,6903,6905],{"class":1243,"line":1312},[1241,6897,1388],{"class":1387},[1241,6899,6900],{"class":1391},"networkConfiguration",[1241,6902,1266],{"class":1387},[1241,6904,1397],{"class":1381},[1241,6906,1566],{"class":1381},[1241,6908,6909,6911,6914,6916,6918],{"class":1243,"line":1321},[1241,6910,4293],{"class":1387},[1241,6912,6913],{"class":1434},"awsvpcConfiguration",[1241,6915,1266],{"class":1387},[1241,6917,1397],{"class":1381},[1241,6919,1566],{"class":1381},[1241,6921,6922,6924,6927,6929,6931],{"class":1243,"line":1327},[1241,6923,1431],{"class":1387},[1241,6925,6926],{"class":1574},"subnets",[1241,6928,1266],{"class":1387},[1241,6930,1397],{"class":1381},[1241,6932,1421],{"class":1381},[1241,6934,6935,6937,6940,6942],{"class":1243,"line":1333},[1241,6936,1466],{"class":1258},[1241,6938,6939],{"class":1262},"subnet-12345678",[1241,6941,1266],{"class":1258},[1241,6943,1407],{"class":1381},[1241,6945,6946,6948,6951],{"class":1243,"line":1339},[1241,6947,1466],{"class":1258},[1241,6949,6950],{"class":1262},"subnet-87654321",[1241,6952,1278],{"class":1258},[1241,6954,6955],{"class":1243,"line":1345},[1241,6956,1531],{"class":1381},[1241,6958,6959,6961,6964,6966,6968],{"class":1243,"line":1350},[1241,6960,1431],{"class":1387},[1241,6962,6963],{"class":1574},"securityGroups",[1241,6965,1266],{"class":1387},[1241,6967,1397],{"class":1381},[1241,6969,1421],{"class":1381},[1241,6971,6972,6974,6976],{"class":1243,"line":1356},[1241,6973,1466],{"class":1258},[1241,6975,4548],{"class":1262},[1241,6977,1278],{"class":1258},[1241,6979,6980],{"class":1243,"line":1554},[1241,6981,1531],{"class":1381},[1241,6983,6984,6986,6989,6991,6993,6995,6998],{"class":1243,"line":1569},[1241,6985,1431],{"class":1387},[1241,6987,6988],{"class":1574},"assignPublicIp",[1241,6990,1266],{"class":1387},[1241,6992,1397],{"class":1381},[1241,6994,1259],{"class":1258},[1241,6996,6997],{"class":1262},"DISABLED",[1241,6999,1278],{"class":1258},[1241,7001,7002],{"class":1243,"line":1584},[1241,7003,1636],{"class":1381},[1241,7005,7006],{"class":1243,"line":1621},[1241,7007,7008],{"class":1381},"  },\n",[1241,7010,7011,7013,7016,7018,7020],{"class":1243,"line":1627},[1241,7012,1388],{"class":1387},[1241,7014,7015],{"class":1391},"loadBalancers",[1241,7017,1266],{"class":1387},[1241,7019,1397],{"class":1381},[1241,7021,1421],{"class":1381},[1241,7023,7024],{"class":1243,"line":1633},[1241,7025,1426],{"class":1381},[1241,7027,7028,7030,7033,7035,7037,7039,7042,7044],{"class":1243,"line":1639},[1241,7029,1431],{"class":1387},[1241,7031,7032],{"class":1434},"targetGroupArn",[1241,7034,1266],{"class":1387},[1241,7036,1397],{"class":1381},[1241,7038,1259],{"class":1258},[1241,7040,7041],{"class":1262},"arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/django-tg/1234567890123456",[1241,7043,1266],{"class":1258},[1241,7045,1407],{"class":1381},[1241,7047,7048,7050,7052,7054,7056,7058,7060,7062],{"class":1243,"line":1645},[1241,7049,1431],{"class":1387},[1241,7051,6378],{"class":1434},[1241,7053,1266],{"class":1387},[1241,7055,1397],{"class":1381},[1241,7057,1259],{"class":1258},[1241,7059,6262],{"class":1262},[1241,7061,1266],{"class":1258},[1241,7063,1407],{"class":1381},[1241,7065,7066,7068,7070,7072,7074],{"class":1243,"line":2028},[1241,7067,1431],{"class":1387},[1241,7069,5618],{"class":1434},[1241,7071,1266],{"class":1387},[1241,7073,1397],{"class":1381},[1241,7075,3470],{"class":2476},[1241,7077,7078],{"class":1243,"line":2042},[1241,7079,1636],{"class":1381},[1241,7081,7082],{"class":1243,"line":2064},[1241,7083,6667],{"class":1381},[1241,7085,7086,7088,7091,7093,7095],{"class":1243,"line":2070},[1241,7087,1388],{"class":1387},[1241,7089,7090],{"class":1391},"serviceRegistries",[1241,7092,1266],{"class":1387},[1241,7094,1397],{"class":1381},[1241,7096,1421],{"class":1381},[1241,7098,7099],{"class":1243,"line":2075},[1241,7100,1426],{"class":1381},[1241,7102,7103,7105,7108,7110,7112,7114,7117,7119],{"class":1243,"line":2080},[1241,7104,1431],{"class":1387},[1241,7106,7107],{"class":1434},"registryArn",[1241,7109,1266],{"class":1387},[1241,7111,1397],{"class":1381},[1241,7113,1259],{"class":1258},[1241,7115,7116],{"class":1262},"arn:aws:servicediscovery:us-east-1:123456789012:service/srv-12345678",[1241,7118,1266],{"class":1258},[1241,7120,1407],{"class":1381},[1241,7122,7123,7125,7127,7129,7131,7133,7135,7137],{"class":1243,"line":2085},[1241,7124,1431],{"class":1387},[1241,7126,6378],{"class":1434},[1241,7128,1266],{"class":1387},[1241,7130,1397],{"class":1381},[1241,7132,1259],{"class":1258},[1241,7134,5569],{"class":1262},[1241,7136,1266],{"class":1258},[1241,7138,1407],{"class":1381},[1241,7140,7141,7143,7145,7147,7149],{"class":1243,"line":2091},[1241,7142,1431],{"class":1387},[1241,7144,5618],{"class":1434},[1241,7146,1266],{"class":1387},[1241,7148,1397],{"class":1381},[1241,7150,7151],{"class":2476}," 8000\n",[1241,7153,7154],{"class":1243,"line":2120},[1241,7155,1636],{"class":1381},[1241,7157,7158],{"class":1243,"line":2148},[1241,7159,6667],{"class":1381},[1241,7161,7162,7164,7167,7169,7171],{"class":1243,"line":2177},[1241,7163,1388],{"class":1387},[1241,7165,7166],{"class":1391},"deploymentConfiguration",[1241,7168,1266],{"class":1387},[1241,7170,1397],{"class":1381},[1241,7172,1566],{"class":1381},[1241,7174,7175,7177,7180,7182,7184,7187],{"class":1243,"line":2214},[1241,7176,4293],{"class":1387},[1241,7178,7179],{"class":1434},"maximumPercent",[1241,7181,1266],{"class":1387},[1241,7183,1397],{"class":1381},[1241,7185,7186],{"class":2476}," 200",[1241,7188,1407],{"class":1381},[1241,7190,7191,7193,7196,7198,7200,7203],{"class":1243,"line":2240},[1241,7192,4293],{"class":1387},[1241,7194,7195],{"class":1434},"minimumHealthyPercent",[1241,7197,1266],{"class":1387},[1241,7199,1397],{"class":1381},[1241,7201,7202],{"class":2476}," 50",[1241,7204,1407],{"class":1381},[1241,7206,7207,7209,7212,7214,7216],{"class":1243,"line":2245},[1241,7208,4293],{"class":1387},[1241,7210,7211],{"class":1434},"deploymentCircuitBreaker",[1241,7213,1266],{"class":1387},[1241,7215,1397],{"class":1381},[1241,7217,1566],{"class":1381},[1241,7219,7220,7222,7225,7227,7229,7231],{"class":1243,"line":2251},[1241,7221,1431],{"class":1387},[1241,7223,7224],{"class":1574},"enable",[1241,7226,1266],{"class":1387},[1241,7228,1397],{"class":1381},[1241,7230,4586],{"class":1731},[1241,7232,1407],{"class":1381},[1241,7234,7235,7237,7240,7242,7244],{"class":1243,"line":2267},[1241,7236,1431],{"class":1387},[1241,7238,7239],{"class":1574},"rollback",[1241,7241,1266],{"class":1387},[1241,7243,1397],{"class":1381},[1241,7245,3228],{"class":1731},[1241,7247,7248],{"class":1243,"line":2289},[1241,7249,1636],{"class":1381},[1241,7251,7252],{"class":1243,"line":2294},[1241,7253,7008],{"class":1381},[1241,7255,7256,7258,7261,7263,7265,7267],{"class":1243,"line":2300},[1241,7257,1388],{"class":1387},[1241,7259,7260],{"class":1391},"enableExecuteCommand",[1241,7262,1266],{"class":1387},[1241,7264,1397],{"class":1381},[1241,7266,4586],{"class":1731},[1241,7268,1407],{"class":1381},[1241,7270,7271,7273,7276,7278,7280],{"class":1243,"line":2314},[1241,7272,1388],{"class":1387},[1241,7274,7275],{"class":1391},"tags",[1241,7277,1266],{"class":1387},[1241,7279,1397],{"class":1381},[1241,7281,1421],{"class":1381},[1241,7283,7284],{"class":1243,"line":2335},[1241,7285,1426],{"class":1381},[1241,7287,7288,7290,7293,7295,7297,7299,7302,7304],{"class":1243,"line":2340},[1241,7289,1431],{"class":1387},[1241,7291,7292],{"class":1434},"key",[1241,7294,1266],{"class":1387},[1241,7296,1397],{"class":1381},[1241,7298,1259],{"class":1258},[1241,7300,7301],{"class":1262},"Environment",[1241,7303,1266],{"class":1258},[1241,7305,1407],{"class":1381},[1241,7307,7308,7310,7312,7314,7316,7318,7320],{"class":1243,"line":2346},[1241,7309,1431],{"class":1387},[1241,7311,5710],{"class":1434},[1241,7313,1266],{"class":1387},[1241,7315,1397],{"class":1381},[1241,7317,1259],{"class":1258},[1241,7319,4296],{"class":1262},[1241,7321,1278],{"class":1258},[1241,7323,7324],{"class":1243,"line":2361},[1241,7325,2744],{"class":1381},[1241,7327,7328],{"class":1243,"line":2371},[1241,7329,1426],{"class":1381},[1241,7331,7332,7334,7336,7338,7340,7342,7345,7347],{"class":1243,"line":2392},[1241,7333,1431],{"class":1387},[1241,7335,7292],{"class":1434},[1241,7337,1266],{"class":1387},[1241,7339,1397],{"class":1381},[1241,7341,1259],{"class":1258},[1241,7343,7344],{"class":1262},"Application",[1241,7346,1266],{"class":1258},[1241,7348,1407],{"class":1381},[1241,7350,7351,7353,7355,7357,7359,7361,7363],{"class":1243,"line":2397},[1241,7352,1431],{"class":1387},[1241,7354,5710],{"class":1434},[1241,7356,1266],{"class":1387},[1241,7358,1397],{"class":1381},[1241,7360,1259],{"class":1258},[1241,7362,5410],{"class":1262},[1241,7364,1278],{"class":1258},[1241,7366,7367],{"class":1243,"line":2407},[1241,7368,1636],{"class":1381},[1241,7370,7371],{"class":1243,"line":2417},[1241,7372,1642],{"class":1381},[1241,7374,7375],{"class":1243,"line":2422},[1241,7376,1648],{"class":1381},[1026,7378,7379],{},[1042,7380,7381],{},"ECS Deployment Script",[1128,7383,7385],{"className":1235,"code":7384,"language":1237,"meta":1137,"style":1137},"#!/bin/bash\n# deploy-ecs.sh\n\nset -e\n\n# Configuration\nAWS_REGION=\"us-east-1\"\nECR_REPOSITORY=\"123456789012.dkr.ecr.us-east-1.amazonaws.com/django-app\"\nCLUSTER_NAME=\"django-cluster\"\nSERVICE_NAME=\"django-app-service\"\nTASK_FAMILY=\"django-app\"\n\necho \"🚀 Starting ECS deployment...\"\n\n# Build and push Docker image\necho \"📦 Building Docker image...\"\ndocker build -t django-app:latest .\n\n# Tag for ECR\ndocker tag django-app:latest $ECR_REPOSITORY:latest\ndocker tag django-app:latest $ECR_REPOSITORY:$(git rev-parse --short HEAD)\n\n# Login to ECR\necho \"🔐 Logging in to ECR...\"\naws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ECR_REPOSITORY\n\n# Push images\necho \"📤 Pushing images to ECR...\"\ndocker push $ECR_REPOSITORY:latest\ndocker push $ECR_REPOSITORY:$(git rev-parse --short HEAD)\n\n# Update task definition\necho \"📝 Updating task definition...\"\nTASK_DEFINITION=$(aws ecs describe-task-definition --task-definition $TASK_FAMILY --query 'taskDefinition')\n\n# Create new task definition with updated image\nNEW_TASK_DEFINITION=$(echo $TASK_DEFINITION | jq --arg IMAGE \"$ECR_REPOSITORY:$(git rev-parse --short HEAD)\" '.containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.placementConstraints) | del(.compatibilities) | del(.registeredAt) | del(.registeredBy)')\n\n# Register new task definition\necho \"📋 Registering new task definition...\"\naws ecs register-task-definition --cli-input-json \"$NEW_TASK_DEFINITION\"\n\n# Update service\necho \"🔄 Updating ECS service...\"\naws ecs update-service \\\n    --cluster $CLUSTER_NAME \\\n    --service $SERVICE_NAME \\\n    --task-definition $TASK_FAMILY\n\n# Wait for deployment to complete\necho \"⏳ Waiting for deployment to complete...\"\naws ecs wait services-stable \\\n    --cluster $CLUSTER_NAME \\\n    --services $SERVICE_NAME\n\necho \"✅ ECS deployment completed successfully!\"\n",[1135,7386,7387,7392,7397,7401,7410,7414,7419,7433,7447,7460,7473,7486,7490,7502,7506,7511,7522,7539,7543,7548,7563,7592,7596,7601,7612,7648,7652,7657,7668,7679,7701,7705,7710,7721,7754,7758,7763,7820,7824,7829,7840,7859,7863,7868,7879,7891,7901,7911,7919,7923,7928,7939,7953,7961,7969,7973],{"__ignoreMap":1137},[1241,7388,7389],{"class":1243,"line":1244},[1241,7390,7391],{"class":1247},"#!/bin/bash\n",[1241,7393,7394],{"class":1243,"line":1251},[1241,7395,7396],{"class":1247},"# deploy-ecs.sh\n",[1241,7398,7399],{"class":1243,"line":1281},[1241,7400,1303],{"emptyLinePlaceholder":1302},[1241,7402,7403,7407],{"class":1243,"line":1290},[1241,7404,7406],{"class":7405},"sJdAF","set",[1241,7408,7409],{"class":1269}," -e\n",[1241,7411,7412],{"class":1243,"line":1299},[1241,7413,1303],{"emptyLinePlaceholder":1302},[1241,7415,7416],{"class":1243,"line":1306},[1241,7417,7418],{"class":1247},"# Configuration\n",[1241,7420,7421,7425,7427,7429,7431],{"class":1243,"line":1312},[1241,7422,7424],{"class":7423},"sSC40","AWS_REGION",[1241,7426,3003],{"class":1381},[1241,7428,1266],{"class":1258},[1241,7430,1603],{"class":1262},[1241,7432,1278],{"class":1258},[1241,7434,7435,7438,7440,7442,7445],{"class":1243,"line":1321},[1241,7436,7437],{"class":7423},"ECR_REPOSITORY",[1241,7439,3003],{"class":1381},[1241,7441,1266],{"class":1258},[1241,7443,7444],{"class":1262},"123456789012.dkr.ecr.us-east-1.amazonaws.com/django-app",[1241,7446,1278],{"class":1258},[1241,7448,7449,7452,7454,7456,7458],{"class":1243,"line":1327},[1241,7450,7451],{"class":7423},"CLUSTER_NAME",[1241,7453,3003],{"class":1381},[1241,7455,1266],{"class":1258},[1241,7457,6835],{"class":1262},[1241,7459,1278],{"class":1258},[1241,7461,7462,7465,7467,7469,7471],{"class":1243,"line":1333},[1241,7463,7464],{"class":7423},"SERVICE_NAME",[1241,7466,3003],{"class":1381},[1241,7468,1266],{"class":1258},[1241,7470,6815],{"class":1262},[1241,7472,1278],{"class":1258},[1241,7474,7475,7478,7480,7482,7484],{"class":1243,"line":1339},[1241,7476,7477],{"class":7423},"TASK_FAMILY",[1241,7479,3003],{"class":1381},[1241,7481,1266],{"class":1258},[1241,7483,5410],{"class":1262},[1241,7485,1278],{"class":1258},[1241,7487,7488],{"class":1243,"line":1345},[1241,7489,1303],{"emptyLinePlaceholder":1302},[1241,7491,7492,7495,7497,7500],{"class":1243,"line":1350},[1241,7493,7494],{"class":7405},"echo",[1241,7496,1259],{"class":1258},[1241,7498,7499],{"class":1262},"🚀 Starting ECS deployment...",[1241,7501,1278],{"class":1258},[1241,7503,7504],{"class":1243,"line":1356},[1241,7505,1303],{"emptyLinePlaceholder":1302},[1241,7507,7508],{"class":1243,"line":1554},[1241,7509,7510],{"class":1247},"# Build and push Docker image\n",[1241,7512,7513,7515,7517,7520],{"class":1243,"line":1569},[1241,7514,7494],{"class":7405},[1241,7516,1259],{"class":1258},[1241,7518,7519],{"class":1262},"📦 Building Docker image...",[1241,7521,1278],{"class":1258},[1241,7523,7524,7527,7530,7533,7536],{"class":1243,"line":1584},[1241,7525,7526],{"class":1254},"docker",[1241,7528,7529],{"class":1262}," build",[1241,7531,7532],{"class":1269}," -t",[1241,7534,7535],{"class":1262}," django-app:latest",[1241,7537,7538],{"class":1262}," .\n",[1241,7540,7541],{"class":1243,"line":1621},[1241,7542,1303],{"emptyLinePlaceholder":1302},[1241,7544,7545],{"class":1243,"line":1627},[1241,7546,7547],{"class":1247},"# Tag for ECR\n",[1241,7549,7550,7552,7555,7557,7560],{"class":1243,"line":1633},[1241,7551,7526],{"class":1254},[1241,7553,7554],{"class":1262}," tag",[1241,7556,7535],{"class":1262},[1241,7558,7559],{"class":7423}," $ECR_REPOSITORY",[1241,7561,7562],{"class":1262},":latest\n",[1241,7564,7565,7567,7569,7571,7573,7575,7578,7581,7584,7587,7590],{"class":1243,"line":1639},[1241,7566,7526],{"class":1254},[1241,7568,7554],{"class":1262},[1241,7570,7535],{"class":1262},[1241,7572,7559],{"class":7423},[1241,7574,1397],{"class":1262},[1241,7576,7577],{"class":1381},"$(",[1241,7579,7580],{"class":1254},"git",[1241,7582,7583],{"class":1262}," rev-parse",[1241,7585,7586],{"class":1269}," --short",[1241,7588,7589],{"class":1262}," HEAD",[1241,7591,2117],{"class":1381},[1241,7593,7594],{"class":1243,"line":1645},[1241,7595,1303],{"emptyLinePlaceholder":1302},[1241,7597,7598],{"class":1243,"line":2028},[1241,7599,7600],{"class":1247},"# Login to ECR\n",[1241,7602,7603,7605,7607,7610],{"class":1243,"line":2042},[1241,7604,7494],{"class":7405},[1241,7606,1259],{"class":1258},[1241,7608,7609],{"class":1262},"🔐 Logging in to ECR...",[1241,7611,1278],{"class":1258},[1241,7613,7614,7616,7619,7622,7624,7627,7630,7633,7636,7639,7642,7645],{"class":1243,"line":2064},[1241,7615,1315],{"class":1254},[1241,7617,7618],{"class":1262}," ecr",[1241,7620,7621],{"class":1262}," get-login-password",[1241,7623,3948],{"class":1269},[1241,7625,7626],{"class":7423}," $AWS_REGION",[1241,7628,7629],{"class":1709}," |",[1241,7631,7632],{"class":1254}," docker",[1241,7634,7635],{"class":1262}," login",[1241,7637,7638],{"class":1269}," --username",[1241,7640,7641],{"class":1262}," AWS",[1241,7643,7644],{"class":1269}," --password-stdin",[1241,7646,7647],{"class":7423}," $ECR_REPOSITORY\n",[1241,7649,7650],{"class":1243,"line":2070},[1241,7651,1303],{"emptyLinePlaceholder":1302},[1241,7653,7654],{"class":1243,"line":2075},[1241,7655,7656],{"class":1247},"# Push images\n",[1241,7658,7659,7661,7663,7666],{"class":1243,"line":2080},[1241,7660,7494],{"class":7405},[1241,7662,1259],{"class":1258},[1241,7664,7665],{"class":1262},"📤 Pushing images to ECR...",[1241,7667,1278],{"class":1258},[1241,7669,7670,7672,7675,7677],{"class":1243,"line":2085},[1241,7671,7526],{"class":1254},[1241,7673,7674],{"class":1262}," push",[1241,7676,7559],{"class":7423},[1241,7678,7562],{"class":1262},[1241,7680,7681,7683,7685,7687,7689,7691,7693,7695,7697,7699],{"class":1243,"line":2091},[1241,7682,7526],{"class":1254},[1241,7684,7674],{"class":1262},[1241,7686,7559],{"class":7423},[1241,7688,1397],{"class":1262},[1241,7690,7577],{"class":1381},[1241,7692,7580],{"class":1254},[1241,7694,7583],{"class":1262},[1241,7696,7586],{"class":1269},[1241,7698,7589],{"class":1262},[1241,7700,2117],{"class":1381},[1241,7702,7703],{"class":1243,"line":2120},[1241,7704,1303],{"emptyLinePlaceholder":1302},[1241,7706,7707],{"class":1243,"line":2148},[1241,7708,7709],{"class":1247},"# Update task definition\n",[1241,7711,7712,7714,7716,7719],{"class":1243,"line":2177},[1241,7713,7494],{"class":7405},[1241,7715,1259],{"class":1258},[1241,7717,7718],{"class":1262},"📝 Updating task definition...",[1241,7720,1278],{"class":1258},[1241,7722,7723,7726,7729,7731,7734,7737,7740,7743,7746,7748,7750,7752],{"class":1243,"line":2214},[1241,7724,7725],{"class":7423},"TASK_DEFINITION",[1241,7727,7728],{"class":1381},"=$(",[1241,7730,1315],{"class":1254},[1241,7732,7733],{"class":1262}," ecs",[1241,7735,7736],{"class":1262}," describe-task-definition",[1241,7738,7739],{"class":1269}," --task-definition",[1241,7741,7742],{"class":7423}," $TASK_FAMILY",[1241,7744,7745],{"class":1269}," --query",[1241,7747,1822],{"class":1258},[1241,7749,6846],{"class":1262},[1241,7751,1752],{"class":1258},[1241,7753,2117],{"class":1381},[1241,7755,7756],{"class":1243,"line":2240},[1241,7757,1303],{"emptyLinePlaceholder":1302},[1241,7759,7760],{"class":1243,"line":2245},[1241,7761,7762],{"class":1247},"# Create new task definition with updated image\n",[1241,7764,7765,7768,7770,7772,7775,7777,7780,7783,7786,7788,7792,7794,7796,7798,7801,7804,7806,7809,7811,7813,7816,7818],{"class":1243,"line":2251},[1241,7766,7767],{"class":7423},"NEW_TASK_DEFINITION",[1241,7769,7728],{"class":1381},[1241,7771,7494],{"class":7405},[1241,7773,7774],{"class":7423}," $TASK_DEFINITION",[1241,7776,7629],{"class":1709},[1241,7778,7779],{"class":1254}," jq",[1241,7781,7782],{"class":1269}," --arg",[1241,7784,7785],{"class":1262}," IMAGE",[1241,7787,1259],{"class":1258},[1241,7789,7791],{"class":7790},"su_V2","$ECR_REPOSITORY",[1241,7793,1397],{"class":1262},[1241,7795,7577],{"class":1381},[1241,7797,7580],{"class":1254},[1241,7799,7800],{"class":1262}," rev-parse ",[1241,7802,7803],{"class":1269},"--short",[1241,7805,7589],{"class":1262},[1241,7807,7808],{"class":1381},")",[1241,7810,1266],{"class":1258},[1241,7812,1822],{"class":1258},[1241,7814,7815],{"class":1262},".containerDefinitions[0].image = $IMAGE | del(.taskDefinitionArn) | del(.revision) | del(.status) | del(.requiresAttributes) | del(.placementConstraints) | del(.compatibilities) | del(.registeredAt) | del(.registeredBy)",[1241,7817,1752],{"class":1258},[1241,7819,2117],{"class":1381},[1241,7821,7822],{"class":1243,"line":2267},[1241,7823,1303],{"emptyLinePlaceholder":1302},[1241,7825,7826],{"class":1243,"line":2289},[1241,7827,7828],{"class":1247},"# Register new task definition\n",[1241,7830,7831,7833,7835,7838],{"class":1243,"line":2294},[1241,7832,7494],{"class":7405},[1241,7834,1259],{"class":1258},[1241,7836,7837],{"class":1262},"📋 Registering new task definition...",[1241,7839,1278],{"class":1258},[1241,7841,7842,7844,7846,7849,7852,7854,7857],{"class":1243,"line":2300},[1241,7843,1315],{"class":1254},[1241,7845,7733],{"class":1262},[1241,7847,7848],{"class":1262}," register-task-definition",[1241,7850,7851],{"class":1269}," --cli-input-json",[1241,7853,1259],{"class":1258},[1241,7855,7856],{"class":7790},"$NEW_TASK_DEFINITION",[1241,7858,1278],{"class":1258},[1241,7860,7861],{"class":1243,"line":2314},[1241,7862,1303],{"emptyLinePlaceholder":1302},[1241,7864,7865],{"class":1243,"line":2335},[1241,7866,7867],{"class":1247},"# Update service\n",[1241,7869,7870,7872,7874,7877],{"class":1243,"line":2340},[1241,7871,7494],{"class":7405},[1241,7873,1259],{"class":1258},[1241,7875,7876],{"class":1262},"🔄 Updating ECS service...",[1241,7878,1278],{"class":1258},[1241,7880,7881,7883,7885,7888],{"class":1243,"line":2346},[1241,7882,1315],{"class":1254},[1241,7884,7733],{"class":1262},[1241,7886,7887],{"class":1262}," update-service",[1241,7889,7890],{"class":1724}," \\\n",[1241,7892,7893,7896,7899],{"class":1243,"line":2361},[1241,7894,7895],{"class":1269},"    --cluster",[1241,7897,7898],{"class":7423}," $CLUSTER_NAME",[1241,7900,7890],{"class":1724},[1241,7902,7903,7906,7909],{"class":1243,"line":2371},[1241,7904,7905],{"class":1269},"    --service",[1241,7907,7908],{"class":7423}," $SERVICE_NAME",[1241,7910,7890],{"class":1724},[1241,7912,7913,7916],{"class":1243,"line":2392},[1241,7914,7915],{"class":1269},"    --task-definition",[1241,7917,7918],{"class":7423}," $TASK_FAMILY\n",[1241,7920,7921],{"class":1243,"line":2397},[1241,7922,1303],{"emptyLinePlaceholder":1302},[1241,7924,7925],{"class":1243,"line":2407},[1241,7926,7927],{"class":1247},"# Wait for deployment to complete\n",[1241,7929,7930,7932,7934,7937],{"class":1243,"line":2417},[1241,7931,7494],{"class":7405},[1241,7933,1259],{"class":1258},[1241,7935,7936],{"class":1262},"⏳ Waiting for deployment to complete...",[1241,7938,1278],{"class":1258},[1241,7940,7941,7943,7945,7948,7951],{"class":1243,"line":2422},[1241,7942,1315],{"class":1254},[1241,7944,7733],{"class":1262},[1241,7946,7947],{"class":1262}," wait",[1241,7949,7950],{"class":1262}," services-stable",[1241,7952,7890],{"class":1724},[1241,7954,7955,7957,7959],{"class":1243,"line":2428},[1241,7956,7895],{"class":1269},[1241,7958,7898],{"class":7423},[1241,7960,7890],{"class":1724},[1241,7962,7963,7966],{"class":1243,"line":2439},[1241,7964,7965],{"class":1269},"    --services",[1241,7967,7968],{"class":7423}," $SERVICE_NAME\n",[1241,7970,7971],{"class":1243,"line":2468},[1241,7972,1303],{"emptyLinePlaceholder":1302},[1241,7974,7975,7977,7979,7982],{"class":1243,"line":2480},[1241,7976,7494],{"class":7405},[1241,7978,1259],{"class":1258},[1241,7980,7981],{"class":1262},"✅ ECS deployment completed successfully!",[1241,7983,1278],{"class":1258},[1035,7985,7987],{"id":7986},"aws-rds-database-setup","AWS RDS Database Setup",[1026,7989,7990],{},[1042,7991,7992],{},"RDS PostgreSQL Configuration",[1128,7994,7996],{"className":1235,"code":7995,"language":1237,"meta":1137,"style":1137},"# Create RDS subnet group\naws rds create-db-subnet-group \\\n    --db-subnet-group-name django-db-subnet-group \\\n    --db-subnet-group-description \"Subnet group for Django RDS\" \\\n    --subnet-ids subnet-12345678 subnet-87654321\n\n# Create RDS instance\naws rds create-db-instance \\\n    --db-instance-identifier django-production-db \\\n    --db-instance-class db.t3.medium \\\n    --engine postgres \\\n    --engine-version 13.7 \\\n    --master-username postgres \\\n    --master-user-password SecurePassword123! \\\n    --allocated-storage 100 \\\n    --storage-type gp2 \\\n    --storage-encrypted \\\n    --vpc-security-group-ids sg-12345678 \\\n    --db-subnet-group-name django-db-subnet-group \\\n    --backup-retention-period 7 \\\n    --multi-az \\\n    --auto-minor-version-upgrade \\\n    --deletion-protection\n",[1135,7997,7998,8003,8015,8025,8039,8050,8054,8059,8070,8080,8090,8099,8109,8118,8128,8138,8148,8155,8165,8173,8183,8190,8197],{"__ignoreMap":1137},[1241,7999,8000],{"class":1243,"line":1244},[1241,8001,8002],{"class":1247},"# Create RDS subnet group\n",[1241,8004,8005,8007,8010,8013],{"class":1243,"line":1251},[1241,8006,1315],{"class":1254},[1241,8008,8009],{"class":1262}," rds",[1241,8011,8012],{"class":1262}," create-db-subnet-group",[1241,8014,7890],{"class":1724},[1241,8016,8017,8020,8023],{"class":1243,"line":1281},[1241,8018,8019],{"class":1269},"    --db-subnet-group-name",[1241,8021,8022],{"class":1262}," django-db-subnet-group",[1241,8024,7890],{"class":1724},[1241,8026,8027,8030,8032,8035,8037],{"class":1243,"line":1290},[1241,8028,8029],{"class":1269},"    --db-subnet-group-description",[1241,8031,1259],{"class":1258},[1241,8033,8034],{"class":1262},"Subnet group for Django RDS",[1241,8036,1266],{"class":1258},[1241,8038,7890],{"class":1724},[1241,8040,8041,8044,8047],{"class":1243,"line":1299},[1241,8042,8043],{"class":1269},"    --subnet-ids",[1241,8045,8046],{"class":1262}," subnet-12345678",[1241,8048,8049],{"class":1262}," subnet-87654321\n",[1241,8051,8052],{"class":1243,"line":1306},[1241,8053,1303],{"emptyLinePlaceholder":1302},[1241,8055,8056],{"class":1243,"line":1312},[1241,8057,8058],{"class":1247},"# Create RDS instance\n",[1241,8060,8061,8063,8065,8068],{"class":1243,"line":1321},[1241,8062,1315],{"class":1254},[1241,8064,8009],{"class":1262},[1241,8066,8067],{"class":1262}," create-db-instance",[1241,8069,7890],{"class":1724},[1241,8071,8072,8075,8078],{"class":1243,"line":1327},[1241,8073,8074],{"class":1269},"    --db-instance-identifier",[1241,8076,8077],{"class":1262}," django-production-db",[1241,8079,7890],{"class":1724},[1241,8081,8082,8085,8088],{"class":1243,"line":1333},[1241,8083,8084],{"class":1269},"    --db-instance-class",[1241,8086,8087],{"class":1262}," db.t3.medium",[1241,8089,7890],{"class":1724},[1241,8091,8092,8095,8097],{"class":1243,"line":1339},[1241,8093,8094],{"class":1269},"    --engine",[1241,8096,3976],{"class":1262},[1241,8098,7890],{"class":1724},[1241,8100,8101,8104,8107],{"class":1243,"line":1345},[1241,8102,8103],{"class":1269},"    --engine-version",[1241,8105,8106],{"class":2476}," 13.7",[1241,8108,7890],{"class":1724},[1241,8110,8111,8114,8116],{"class":1243,"line":1350},[1241,8112,8113],{"class":1269},"    --master-username",[1241,8115,3976],{"class":1262},[1241,8117,7890],{"class":1724},[1241,8119,8120,8123,8126],{"class":1243,"line":1356},[1241,8121,8122],{"class":1269},"    --master-user-password",[1241,8124,8125],{"class":1262}," SecurePassword123!",[1241,8127,7890],{"class":1724},[1241,8129,8130,8133,8136],{"class":1243,"line":1554},[1241,8131,8132],{"class":1269},"    --allocated-storage",[1241,8134,8135],{"class":2476}," 100",[1241,8137,7890],{"class":1724},[1241,8139,8140,8143,8146],{"class":1243,"line":1569},[1241,8141,8142],{"class":1269},"    --storage-type",[1241,8144,8145],{"class":1262}," gp2",[1241,8147,7890],{"class":1724},[1241,8149,8150,8153],{"class":1243,"line":1584},[1241,8151,8152],{"class":1269},"    --storage-encrypted",[1241,8154,7890],{"class":1724},[1241,8156,8157,8160,8163],{"class":1243,"line":1621},[1241,8158,8159],{"class":1269},"    --vpc-security-group-ids",[1241,8161,8162],{"class":1262}," sg-12345678",[1241,8164,7890],{"class":1724},[1241,8166,8167,8169,8171],{"class":1243,"line":1627},[1241,8168,8019],{"class":1269},[1241,8170,8022],{"class":1262},[1241,8172,7890],{"class":1724},[1241,8174,8175,8178,8181],{"class":1243,"line":1633},[1241,8176,8177],{"class":1269},"    --backup-retention-period",[1241,8179,8180],{"class":2476}," 7",[1241,8182,7890],{"class":1724},[1241,8184,8185,8188],{"class":1243,"line":1639},[1241,8186,8187],{"class":1269},"    --multi-az",[1241,8189,7890],{"class":1724},[1241,8191,8192,8195],{"class":1243,"line":1645},[1241,8193,8194],{"class":1269},"    --auto-minor-version-upgrade",[1241,8196,7890],{"class":1724},[1241,8198,8199],{"class":1243,"line":2028},[1241,8200,8201],{"class":1269},"    --deletion-protection\n",[1026,8203,8204],{},[1042,8205,8206],{},"RDS Connection in Django",[1128,8208,8210],{"className":1674,"code":8209,"language":1676,"meta":1137,"style":1137},"# settings/production.py\nimport os\n\n# RDS Database configuration\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': os.environ.get('RDS_DB_NAME', 'django_app'),\n        'USER': os.environ.get('RDS_USERNAME', 'postgres'),\n        'PASSWORD': os.environ.get('RDS_PASSWORD'),\n        'HOST': os.environ.get('RDS_HOSTNAME'),\n        'PORT': os.environ.get('RDS_PORT', '5432'),\n        'OPTIONS': {\n            'sslmode': 'require',\n            'connect_timeout': 10,\n            'options': '-c default_transaction_isolation=read_committed'\n        },\n        'CONN_MAX_AGE': 600,\n        'CONN_HEALTH_CHECKS': True,\n    }\n}\n\n# Read replica configuration\nif os.environ.get('RDS_READ_HOSTNAME'):\n    DATABASES['read'] = {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': os.environ.get('RDS_DB_NAME', 'django_app'),\n        'USER': os.environ.get('RDS_READ_USERNAME', 'postgres'),\n        'PASSWORD': os.environ.get('RDS_READ_PASSWORD'),\n        'HOST': os.environ.get('RDS_READ_HOSTNAME'),\n        'PORT': os.environ.get('RDS_PORT', '5432'),\n        'OPTIONS': {\n            'sslmode': 'require',\n        },\n        'CONN_MAX_AGE': 600,\n    }\n    \n    DATABASE_ROUTERS = ['myproject.routers.DatabaseRouter']\n",[1135,8211,8212,8216,8222,8226,8231,8239,8251,8269,8308,8347,8377,8407,8445,8457,8475,8490,8507,8511,8526,8541,8545,8549,8553,8558,8584,8603,8621,8659,8698,8729,8759,8797,8809,8827,8831,8845,8849,8854],{"__ignoreMap":1137},[1241,8213,8214],{"class":1243,"line":1244},[1241,8215,1683],{"class":1247},[1241,8217,8218,8220],{"class":1243,"line":1251},[1241,8219,1689],{"class":1688},[1241,8221,1693],{"class":1692},[1241,8223,8224],{"class":1243,"line":1281},[1241,8225,1303],{"emptyLinePlaceholder":1302},[1241,8227,8228],{"class":1243,"line":1290},[1241,8229,8230],{"class":1247},"# RDS Database configuration\n",[1241,8232,8233,8235,8237],{"class":1243,"line":1299},[1241,8234,4785],{"class":1724},[1241,8236,1728],{"class":1381},[1241,8238,1566],{"class":1381},[1241,8240,8241,8243,8245,8247,8249],{"class":1243,"line":1306},[1241,8242,1746],{"class":1258},[1241,8244,1857],{"class":1262},[1241,8246,1752],{"class":1258},[1241,8248,1397],{"class":1381},[1241,8250,1566],{"class":1381},[1241,8252,8253,8255,8257,8259,8261,8263,8265,8267],{"class":1243,"line":1312},[1241,8254,1854],{"class":1258},[1241,8256,1871],{"class":1262},[1241,8258,1752],{"class":1258},[1241,8260,1397],{"class":1381},[1241,8262,1822],{"class":1258},[1241,8264,1880],{"class":1262},[1241,8266,1752],{"class":1258},[1241,8268,1407],{"class":1381},[1241,8270,8271,8273,8275,8277,8279,8281,8283,8285,8287,8289,8291,8293,8295,8297,8299,8301,8304,8306],{"class":1243,"line":1321},[1241,8272,1854],{"class":1258},[1241,8274,1891],{"class":1262},[1241,8276,1752],{"class":1258},[1241,8278,1397],{"class":1381},[1241,8280,1833],{"class":1692},[1241,8282,1773],{"class":1381},[1241,8284,1777],{"class":1776},[1241,8286,1773],{"class":1381},[1241,8288,1783],{"class":1782},[1241,8290,1786],{"class":1381},[1241,8292,1752],{"class":1258},[1241,8294,1909],{"class":1262},[1241,8296,1752],{"class":1258},[1241,8298,1608],{"class":1381},[1241,8300,1822],{"class":1258},[1241,8302,8303],{"class":1262},"django_app",[1241,8305,1752],{"class":1258},[1241,8307,1801],{"class":1381},[1241,8309,8310,8312,8314,8316,8318,8320,8322,8324,8326,8328,8330,8332,8334,8336,8338,8340,8343,8345],{"class":1243,"line":1327},[1241,8311,1854],{"class":1258},[1241,8313,1921],{"class":1262},[1241,8315,1752],{"class":1258},[1241,8317,1397],{"class":1381},[1241,8319,1833],{"class":1692},[1241,8321,1773],{"class":1381},[1241,8323,1777],{"class":1776},[1241,8325,1773],{"class":1381},[1241,8327,1783],{"class":1782},[1241,8329,1786],{"class":1381},[1241,8331,1752],{"class":1258},[1241,8333,1938],{"class":1262},[1241,8335,1752],{"class":1258},[1241,8337,1608],{"class":1381},[1241,8339,1822],{"class":1258},[1241,8341,8342],{"class":1262},"postgres",[1241,8344,1752],{"class":1258},[1241,8346,1801],{"class":1381},[1241,8348,8349,8351,8353,8355,8357,8359,8361,8363,8365,8367,8369,8371,8373,8375],{"class":1243,"line":1333},[1241,8350,1854],{"class":1258},[1241,8352,1949],{"class":1262},[1241,8354,1752],{"class":1258},[1241,8356,1397],{"class":1381},[1241,8358,1833],{"class":1692},[1241,8360,1773],{"class":1381},[1241,8362,1777],{"class":1776},[1241,8364,1773],{"class":1381},[1241,8366,1783],{"class":1782},[1241,8368,1786],{"class":1381},[1241,8370,1752],{"class":1258},[1241,8372,1966],{"class":1262},[1241,8374,1752],{"class":1258},[1241,8376,1801],{"class":1381},[1241,8378,8379,8381,8383,8385,8387,8389,8391,8393,8395,8397,8399,8401,8403,8405],{"class":1243,"line":1339},[1241,8380,1854],{"class":1258},[1241,8382,1977],{"class":1262},[1241,8384,1752],{"class":1258},[1241,8386,1397],{"class":1381},[1241,8388,1833],{"class":1692},[1241,8390,1773],{"class":1381},[1241,8392,1777],{"class":1776},[1241,8394,1773],{"class":1381},[1241,8396,1783],{"class":1782},[1241,8398,1786],{"class":1381},[1241,8400,1752],{"class":1258},[1241,8402,1825],{"class":1262},[1241,8404,1752],{"class":1258},[1241,8406,1801],{"class":1381},[1241,8408,8409,8411,8413,8415,8417,8419,8421,8423,8425,8427,8429,8431,8433,8435,8437,8439,8441,8443],{"class":1243,"line":1345},[1241,8410,1854],{"class":1258},[1241,8412,2004],{"class":1262},[1241,8414,1752],{"class":1258},[1241,8416,1397],{"class":1381},[1241,8418,1833],{"class":1692},[1241,8420,1773],{"class":1381},[1241,8422,1777],{"class":1776},[1241,8424,1773],{"class":1381},[1241,8426,1783],{"class":1782},[1241,8428,1786],{"class":1381},[1241,8430,1752],{"class":1258},[1241,8432,2021],{"class":1262},[1241,8434,1752],{"class":1258},[1241,8436,1608],{"class":1381},[1241,8438,1822],{"class":1258},[1241,8440,4946],{"class":1262},[1241,8442,1752],{"class":1258},[1241,8444,1801],{"class":1381},[1241,8446,8447,8449,8451,8453,8455],{"class":1243,"line":1350},[1241,8448,1854],{"class":1258},[1241,8450,2033],{"class":1262},[1241,8452,1752],{"class":1258},[1241,8454,1397],{"class":1381},[1241,8456,1566],{"class":1381},[1241,8458,8459,8461,8463,8465,8467,8469,8471,8473],{"class":1243,"line":1356},[1241,8460,1868],{"class":1258},[1241,8462,2048],{"class":1262},[1241,8464,1752],{"class":1258},[1241,8466,1397],{"class":1381},[1241,8468,1822],{"class":1258},[1241,8470,2057],{"class":1262},[1241,8472,1752],{"class":1258},[1241,8474,1407],{"class":1381},[1241,8476,8477,8479,8482,8484,8486,8488],{"class":1243,"line":1554},[1241,8478,1868],{"class":1258},[1241,8480,8481],{"class":1262},"connect_timeout",[1241,8483,1752],{"class":1258},[1241,8485,1397],{"class":1381},[1241,8487,6124],{"class":2476},[1241,8489,1407],{"class":1381},[1241,8491,8492,8494,8496,8498,8500,8502,8505],{"class":1243,"line":1569},[1241,8493,1868],{"class":1258},[1241,8495,5959],{"class":1262},[1241,8497,1752],{"class":1258},[1241,8499,1397],{"class":1381},[1241,8501,1822],{"class":1258},[1241,8503,8504],{"class":1262},"-c default_transaction_isolation=read_committed",[1241,8506,2264],{"class":1258},[1241,8508,8509],{"class":1243,"line":1584},[1241,8510,2680],{"class":1381},[1241,8512,8513,8515,8517,8519,8521,8524],{"class":1243,"line":1621},[1241,8514,1854],{"class":1258},[1241,8516,4991],{"class":1262},[1241,8518,1752],{"class":1258},[1241,8520,1397],{"class":1381},[1241,8522,8523],{"class":2476}," 600",[1241,8525,1407],{"class":1381},[1241,8527,8528,8530,8533,8535,8537,8539],{"class":1243,"line":1627},[1241,8529,1854],{"class":1258},[1241,8531,8532],{"class":1262},"CONN_HEALTH_CHECKS",[1241,8534,1752],{"class":1258},[1241,8536,1397],{"class":1381},[1241,8538,2835],{"class":1731},[1241,8540,1407],{"class":1381},[1241,8542,8543],{"class":1243,"line":1633},[1241,8544,1636],{"class":1381},[1241,8546,8547],{"class":1243,"line":1639},[1241,8548,1648],{"class":1381},[1241,8550,8551],{"class":1243,"line":1645},[1241,8552,1303],{"emptyLinePlaceholder":1302},[1241,8554,8555],{"class":1243,"line":2028},[1241,8556,8557],{"class":1247},"# Read replica configuration\n",[1241,8559,8560,8562,8564,8566,8568,8570,8572,8574,8576,8579,8581],{"class":1243,"line":2042},[1241,8561,1819],{"class":1688},[1241,8563,1833],{"class":1692},[1241,8565,1773],{"class":1381},[1241,8567,1777],{"class":1776},[1241,8569,1773],{"class":1381},[1241,8571,1783],{"class":1782},[1241,8573,1786],{"class":1381},[1241,8575,1752],{"class":1258},[1241,8577,8578],{"class":1262},"RDS_READ_HOSTNAME",[1241,8580,1752],{"class":1258},[1241,8582,8583],{"class":1381},"):\n",[1241,8585,8586,8588,8590,8592,8595,8597,8599,8601],{"class":1243,"line":2064},[1241,8587,1845],{"class":1724},[1241,8589,1904],{"class":1381},[1241,8591,1752],{"class":1258},[1241,8593,8594],{"class":1262},"read",[1241,8596,1752],{"class":1258},[1241,8598,4768],{"class":1381},[1241,8600,1728],{"class":1381},[1241,8602,1566],{"class":1381},[1241,8604,8605,8607,8609,8611,8613,8615,8617,8619],{"class":1243,"line":2070},[1241,8606,1854],{"class":1258},[1241,8608,1871],{"class":1262},[1241,8610,1752],{"class":1258},[1241,8612,1397],{"class":1381},[1241,8614,1822],{"class":1258},[1241,8616,1880],{"class":1262},[1241,8618,1752],{"class":1258},[1241,8620,1407],{"class":1381},[1241,8622,8623,8625,8627,8629,8631,8633,8635,8637,8639,8641,8643,8645,8647,8649,8651,8653,8655,8657],{"class":1243,"line":2075},[1241,8624,1854],{"class":1258},[1241,8626,1891],{"class":1262},[1241,8628,1752],{"class":1258},[1241,8630,1397],{"class":1381},[1241,8632,1833],{"class":1692},[1241,8634,1773],{"class":1381},[1241,8636,1777],{"class":1776},[1241,8638,1773],{"class":1381},[1241,8640,1783],{"class":1782},[1241,8642,1786],{"class":1381},[1241,8644,1752],{"class":1258},[1241,8646,1909],{"class":1262},[1241,8648,1752],{"class":1258},[1241,8650,1608],{"class":1381},[1241,8652,1822],{"class":1258},[1241,8654,8303],{"class":1262},[1241,8656,1752],{"class":1258},[1241,8658,1801],{"class":1381},[1241,8660,8661,8663,8665,8667,8669,8671,8673,8675,8677,8679,8681,8683,8686,8688,8690,8692,8694,8696],{"class":1243,"line":2080},[1241,8662,1854],{"class":1258},[1241,8664,1921],{"class":1262},[1241,8666,1752],{"class":1258},[1241,8668,1397],{"class":1381},[1241,8670,1833],{"class":1692},[1241,8672,1773],{"class":1381},[1241,8674,1777],{"class":1776},[1241,8676,1773],{"class":1381},[1241,8678,1783],{"class":1782},[1241,8680,1786],{"class":1381},[1241,8682,1752],{"class":1258},[1241,8684,8685],{"class":1262},"RDS_READ_USERNAME",[1241,8687,1752],{"class":1258},[1241,8689,1608],{"class":1381},[1241,8691,1822],{"class":1258},[1241,8693,8342],{"class":1262},[1241,8695,1752],{"class":1258},[1241,8697,1801],{"class":1381},[1241,8699,8700,8702,8704,8706,8708,8710,8712,8714,8716,8718,8720,8722,8725,8727],{"class":1243,"line":2085},[1241,8701,1854],{"class":1258},[1241,8703,1949],{"class":1262},[1241,8705,1752],{"class":1258},[1241,8707,1397],{"class":1381},[1241,8709,1833],{"class":1692},[1241,8711,1773],{"class":1381},[1241,8713,1777],{"class":1776},[1241,8715,1773],{"class":1381},[1241,8717,1783],{"class":1782},[1241,8719,1786],{"class":1381},[1241,8721,1752],{"class":1258},[1241,8723,8724],{"class":1262},"RDS_READ_PASSWORD",[1241,8726,1752],{"class":1258},[1241,8728,1801],{"class":1381},[1241,8730,8731,8733,8735,8737,8739,8741,8743,8745,8747,8749,8751,8753,8755,8757],{"class":1243,"line":2091},[1241,8732,1854],{"class":1258},[1241,8734,1977],{"class":1262},[1241,8736,1752],{"class":1258},[1241,8738,1397],{"class":1381},[1241,8740,1833],{"class":1692},[1241,8742,1773],{"class":1381},[1241,8744,1777],{"class":1776},[1241,8746,1773],{"class":1381},[1241,8748,1783],{"class":1782},[1241,8750,1786],{"class":1381},[1241,8752,1752],{"class":1258},[1241,8754,8578],{"class":1262},[1241,8756,1752],{"class":1258},[1241,8758,1801],{"class":1381},[1241,8760,8761,8763,8765,8767,8769,8771,8773,8775,8777,8779,8781,8783,8785,8787,8789,8791,8793,8795],{"class":1243,"line":2120},[1241,8762,1854],{"class":1258},[1241,8764,2004],{"class":1262},[1241,8766,1752],{"class":1258},[1241,8768,1397],{"class":1381},[1241,8770,1833],{"class":1692},[1241,8772,1773],{"class":1381},[1241,8774,1777],{"class":1776},[1241,8776,1773],{"class":1381},[1241,8778,1783],{"class":1782},[1241,8780,1786],{"class":1381},[1241,8782,1752],{"class":1258},[1241,8784,2021],{"class":1262},[1241,8786,1752],{"class":1258},[1241,8788,1608],{"class":1381},[1241,8790,1822],{"class":1258},[1241,8792,4946],{"class":1262},[1241,8794,1752],{"class":1258},[1241,8796,1801],{"class":1381},[1241,8798,8799,8801,8803,8805,8807],{"class":1243,"line":2148},[1241,8800,1854],{"class":1258},[1241,8802,2033],{"class":1262},[1241,8804,1752],{"class":1258},[1241,8806,1397],{"class":1381},[1241,8808,1566],{"class":1381},[1241,8810,8811,8813,8815,8817,8819,8821,8823,8825],{"class":1243,"line":2177},[1241,8812,1868],{"class":1258},[1241,8814,2048],{"class":1262},[1241,8816,1752],{"class":1258},[1241,8818,1397],{"class":1381},[1241,8820,1822],{"class":1258},[1241,8822,2057],{"class":1262},[1241,8824,1752],{"class":1258},[1241,8826,1407],{"class":1381},[1241,8828,8829],{"class":1243,"line":2214},[1241,8830,2680],{"class":1381},[1241,8832,8833,8835,8837,8839,8841,8843],{"class":1243,"line":2240},[1241,8834,1854],{"class":1258},[1241,8836,4991],{"class":1262},[1241,8838,1752],{"class":1258},[1241,8840,1397],{"class":1381},[1241,8842,8523],{"class":2476},[1241,8844,1407],{"class":1381},[1241,8846,8847],{"class":1243,"line":2245},[1241,8848,1636],{"class":1381},[1241,8850,8851],{"class":1243,"line":2251},[1241,8852,8853],{"class":1692},"    \n",[1241,8855,8856,8859,8861,8863,8865,8868,8870],{"class":1243,"line":2267},[1241,8857,8858],{"class":1724},"    DATABASE_ROUTERS",[1241,8860,1728],{"class":1381},[1241,8862,1598],{"class":1381},[1241,8864,1752],{"class":1258},[1241,8866,8867],{"class":1262},"myproject.routers.DatabaseRouter",[1241,8869,1752],{"class":1258},[1241,8871,1618],{"class":1381},[1035,8873,8875],{"id":8874},"s3-static-and-media-files","S3 Static and Media Files",[1026,8877,8878],{},[1042,8879,8880],{},"S3 Bucket Configuration",[1128,8882,8884],{"className":1235,"code":8883,"language":1237,"meta":1137,"style":1137},"# Create S3 bucket\naws s3 mb s3://django-app-static-files --region us-east-1\n\n# Configure bucket policy\ncat > bucket-policy.json \u003C\u003C EOF\n{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Sid\": \"PublicReadGetObject\",\n            \"Effect\": \"Allow\",\n            \"Principal\": \"*\",\n            \"Action\": \"s3:GetObject\",\n            \"Resource\": \"arn:aws:s3:::django-app-static-files/static/*\"\n        }\n    ]\n}\nEOF\n\naws s3api put-bucket-policy --bucket django-app-static-files --policy file://bucket-policy.json\n\n# Configure CORS\ncat > cors-config.json \u003C\u003C EOF\n{\n    \"CORSRules\": [\n        {\n            \"AllowedOrigins\": [\"https://yourdomain.com\"],\n            \"AllowedHeaders\": [\"*\"],\n            \"AllowedMethods\": [\"GET\", \"HEAD\"],\n            \"MaxAgeSeconds\": 3000\n        }\n    ]\n}\nEOF\n\naws s3api put-bucket-cors --bucket django-app-static-files --cors-configuration file://cors-config.json\n",[1135,8885,8886,8891,8908,8912,8917,8934,8938,8943,8948,8952,8957,8962,8967,8972,8977,8981,8986,8990,8995,8999,9021,9025,9030,9043,9047,9052,9056,9061,9066,9071,9076,9080,9084,9088,9092,9096],{"__ignoreMap":1137},[1241,8887,8888],{"class":1243,"line":1244},[1241,8889,8890],{"class":1247},"# Create S3 bucket\n",[1241,8892,8893,8895,8898,8901,8904,8906],{"class":1243,"line":1251},[1241,8894,1315],{"class":1254},[1241,8896,8897],{"class":1262}," s3",[1241,8899,8900],{"class":1262}," mb",[1241,8902,8903],{"class":1262}," s3://django-app-static-files",[1241,8905,3948],{"class":1269},[1241,8907,3951],{"class":1262},[1241,8909,8910],{"class":1243,"line":1281},[1241,8911,1303],{"emptyLinePlaceholder":1302},[1241,8913,8914],{"class":1243,"line":1290},[1241,8915,8916],{"class":1247},"# Configure bucket policy\n",[1241,8918,8919,8922,8925,8928,8931],{"class":1243,"line":1299},[1241,8920,8921],{"class":1254},"cat",[1241,8923,8924],{"class":1709}," >",[1241,8926,8927],{"class":1262}," bucket-policy.json",[1241,8929,8930],{"class":1709}," \u003C\u003C",[1241,8932,8933],{"class":1258}," EOF\n",[1241,8935,8936],{"class":1243,"line":1306},[1241,8937,1382],{"class":1262},[1241,8939,8940],{"class":1243,"line":1312},[1241,8941,8942],{"class":1262},"    \"Version\": \"2012-10-17\",\n",[1241,8944,8945],{"class":1243,"line":1321},[1241,8946,8947],{"class":1262},"    \"Statement\": [\n",[1241,8949,8950],{"class":1243,"line":1327},[1241,8951,5611],{"class":1262},[1241,8953,8954],{"class":1243,"line":1333},[1241,8955,8956],{"class":1262},"            \"Sid\": \"PublicReadGetObject\",\n",[1241,8958,8959],{"class":1243,"line":1339},[1241,8960,8961],{"class":1262},"            \"Effect\": \"Allow\",\n",[1241,8963,8964],{"class":1243,"line":1345},[1241,8965,8966],{"class":1262},"            \"Principal\": \"*\",\n",[1241,8968,8969],{"class":1243,"line":1350},[1241,8970,8971],{"class":1262},"            \"Action\": \"s3:GetObject\",\n",[1241,8973,8974],{"class":1243,"line":1356},[1241,8975,8976],{"class":1262},"            \"Resource\": \"arn:aws:s3:::django-app-static-files/static/*\"\n",[1241,8978,8979],{"class":1243,"line":1554},[1241,8980,1624],{"class":1262},[1241,8982,8983],{"class":1243,"line":1569},[1241,8984,8985],{"class":1262},"    ]\n",[1241,8987,8988],{"class":1243,"line":1584},[1241,8989,1648],{"class":1262},[1241,8991,8992],{"class":1243,"line":1621},[1241,8993,8994],{"class":1258},"EOF\n",[1241,8996,8997],{"class":1243,"line":1627},[1241,8998,1303],{"emptyLinePlaceholder":1302},[1241,9000,9001,9003,9006,9009,9012,9015,9018],{"class":1243,"line":1633},[1241,9002,1315],{"class":1254},[1241,9004,9005],{"class":1262}," s3api",[1241,9007,9008],{"class":1262}," put-bucket-policy",[1241,9010,9011],{"class":1269}," --bucket",[1241,9013,9014],{"class":1262}," django-app-static-files",[1241,9016,9017],{"class":1269}," --policy",[1241,9019,9020],{"class":1262}," file://bucket-policy.json\n",[1241,9022,9023],{"class":1243,"line":1639},[1241,9024,1303],{"emptyLinePlaceholder":1302},[1241,9026,9027],{"class":1243,"line":1645},[1241,9028,9029],{"class":1247},"# Configure CORS\n",[1241,9031,9032,9034,9036,9039,9041],{"class":1243,"line":2028},[1241,9033,8921],{"class":1254},[1241,9035,8924],{"class":1709},[1241,9037,9038],{"class":1262}," cors-config.json",[1241,9040,8930],{"class":1709},[1241,9042,8933],{"class":1258},[1241,9044,9045],{"class":1243,"line":2042},[1241,9046,1382],{"class":1262},[1241,9048,9049],{"class":1243,"line":2064},[1241,9050,9051],{"class":1262},"    \"CORSRules\": [\n",[1241,9053,9054],{"class":1243,"line":2070},[1241,9055,5611],{"class":1262},[1241,9057,9058],{"class":1243,"line":2075},[1241,9059,9060],{"class":1262},"            \"AllowedOrigins\": [\"https://yourdomain.com\"],\n",[1241,9062,9063],{"class":1243,"line":2080},[1241,9064,9065],{"class":1262},"            \"AllowedHeaders\": [\"*\"],\n",[1241,9067,9068],{"class":1243,"line":2085},[1241,9069,9070],{"class":1262},"            \"AllowedMethods\": [\"GET\", \"HEAD\"],\n",[1241,9072,9073],{"class":1243,"line":2091},[1241,9074,9075],{"class":1262},"            \"MaxAgeSeconds\": 3000\n",[1241,9077,9078],{"class":1243,"line":2120},[1241,9079,1624],{"class":1262},[1241,9081,9082],{"class":1243,"line":2148},[1241,9083,8985],{"class":1262},[1241,9085,9086],{"class":1243,"line":2177},[1241,9087,1648],{"class":1262},[1241,9089,9090],{"class":1243,"line":2214},[1241,9091,8994],{"class":1258},[1241,9093,9094],{"class":1243,"line":2240},[1241,9095,1303],{"emptyLinePlaceholder":1302},[1241,9097,9098,9100,9102,9105,9107,9109,9112],{"class":1243,"line":2245},[1241,9099,1315],{"class":1254},[1241,9101,9005],{"class":1262},[1241,9103,9104],{"class":1262}," put-bucket-cors",[1241,9106,9011],{"class":1269},[1241,9108,9014],{"class":1262},[1241,9110,9111],{"class":1269}," --cors-configuration",[1241,9113,9114],{"class":1262}," file://cors-config.json\n",[1026,9116,9117],{},[1042,9118,9119],{},"Django S3 Storage Configuration",[1128,9121,9123],{"className":1674,"code":9122,"language":1676,"meta":1137,"style":1137},"# storage_backends.py\nfrom storages.backends.s3boto3 import S3Boto3Storage\n\nclass StaticStorage(S3Boto3Storage):\n    location = 'static'\n    default_acl = 'public-read'\n    file_overwrite = True\n\nclass MediaStorage(S3Boto3Storage):\n    location = 'media'\n    default_acl = 'public-read'\n    file_overwrite = False\n\n# settings/production.py\nAWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')\nAWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')\nAWS_STORAGE_BUCKET_NAME = os.environ.get('S3_BUCKET_NAME')\nAWS_S3_REGION_NAME = os.environ.get('AWS_DEFAULT_REGION', 'us-east-1')\nAWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'\n\n# Static files\nSTATICFILES_STORAGE = 'myproject.storage_backends.StaticStorage'\nSTATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'\n\n# Media files\nDEFAULT_FILE_STORAGE = 'myproject.storage_backends.MediaStorage'\nMEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'\n\n# S3 settings\nAWS_DEFAULT_ACL = None\nAWS_S3_OBJECT_PARAMETERS = {\n    'CacheControl': 'max-age=86400',\n}\nAWS_S3_FILE_OVERWRITE = False\nAWS_QUERYSTRING_AUTH = False\nAWS_S3_SIGNATURE_VERSION = 's3v4'\n\n# CloudFront CDN (optional)\nif os.environ.get('CLOUDFRONT_DOMAIN'):\n    AWS_S3_CUSTOM_DOMAIN = os.environ.get('CLOUDFRONT_DOMAIN')\n    STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'\n    MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'\n",[1135,9124,9125,9130,9152,9156,9171,9185,9198,9207,9211,9224,9237,9249,9257,9261,9265,9291,9317,9343,9377,9395,9399,9404,9417,9435,9439,9444,9457,9475,9479,9483,9492,9500,9518,9522,9530,9538,9552,9556,9561,9586,9613,9632],{"__ignoreMap":1137},[1241,9126,9127],{"class":1243,"line":1244},[1241,9128,9129],{"class":1247},"# storage_backends.py\n",[1241,9131,9132,9134,9137,9139,9142,9144,9147,9149],{"class":1243,"line":1251},[1241,9133,1698],{"class":1688},[1241,9135,9136],{"class":1692}," storages",[1241,9138,1773],{"class":1381},[1241,9140,9141],{"class":1692},"backends",[1241,9143,1773],{"class":1381},[1241,9145,9146],{"class":1692},"s3boto3 ",[1241,9148,1689],{"class":1688},[1241,9150,9151],{"class":1692}," S3Boto3Storage\n",[1241,9153,9154],{"class":1243,"line":1281},[1241,9155,1303],{"emptyLinePlaceholder":1302},[1241,9157,9158,9160,9164,9166,9169],{"class":1243,"line":1290},[1241,9159,2640],{"class":2222},[1241,9161,9163],{"class":9162},"sD-vU"," StaticStorage",[1241,9165,1786],{"class":1381},[1241,9167,9168],{"class":1254},"S3Boto3Storage",[1241,9170,8583],{"class":1381},[1241,9172,9173,9176,9178,9180,9183],{"class":1243,"line":1299},[1241,9174,9175],{"class":1692},"    location ",[1241,9177,3003],{"class":1381},[1241,9179,1822],{"class":1258},[1241,9181,9182],{"class":1262},"static",[1241,9184,2264],{"class":1258},[1241,9186,9187,9190,9192,9194,9196],{"class":1243,"line":1306},[1241,9188,9189],{"class":1692},"    default_acl ",[1241,9191,3003],{"class":1381},[1241,9193,1822],{"class":1258},[1241,9195,2356],{"class":1262},[1241,9197,2264],{"class":1258},[1241,9199,9200,9203,9205],{"class":1243,"line":1312},[1241,9201,9202],{"class":1692},"    file_overwrite ",[1241,9204,3003],{"class":1381},[1241,9206,2436],{"class":1731},[1241,9208,9209],{"class":1243,"line":1321},[1241,9210,1303],{"emptyLinePlaceholder":1302},[1241,9212,9213,9215,9218,9220,9222],{"class":1243,"line":1327},[1241,9214,2640],{"class":2222},[1241,9216,9217],{"class":9162}," MediaStorage",[1241,9219,1786],{"class":1381},[1241,9221,9168],{"class":1254},[1241,9223,8583],{"class":1381},[1241,9225,9226,9228,9230,9232,9235],{"class":1243,"line":1333},[1241,9227,9175],{"class":1692},[1241,9229,3003],{"class":1381},[1241,9231,1822],{"class":1258},[1241,9233,9234],{"class":1262},"media",[1241,9236,2264],{"class":1258},[1241,9238,9239,9241,9243,9245,9247],{"class":1243,"line":1339},[1241,9240,9189],{"class":1692},[1241,9242,3003],{"class":1381},[1241,9244,1822],{"class":1258},[1241,9246,2356],{"class":1262},[1241,9248,2264],{"class":1258},[1241,9250,9251,9253,9255],{"class":1243,"line":1345},[1241,9252,9202],{"class":1692},[1241,9254,3003],{"class":1381},[1241,9256,1732],{"class":1731},[1241,9258,9259],{"class":1243,"line":1350},[1241,9260,1303],{"emptyLinePlaceholder":1302},[1241,9262,9263],{"class":1243,"line":1356},[1241,9264,1683],{"class":1247},[1241,9266,9267,9269,9271,9273,9275,9277,9279,9281,9283,9285,9287,9289],{"class":1243,"line":1554},[1241,9268,2094],{"class":1724},[1241,9270,1728],{"class":1381},[1241,9272,1833],{"class":1692},[1241,9274,1773],{"class":1381},[1241,9276,1777],{"class":1776},[1241,9278,1773],{"class":1381},[1241,9280,1783],{"class":1782},[1241,9282,1786],{"class":1381},[1241,9284,1752],{"class":1258},[1241,9286,2094],{"class":1262},[1241,9288,1752],{"class":1258},[1241,9290,2117],{"class":1381},[1241,9292,9293,9295,9297,9299,9301,9303,9305,9307,9309,9311,9313,9315],{"class":1243,"line":1569},[1241,9294,2123],{"class":1724},[1241,9296,1728],{"class":1381},[1241,9298,1833],{"class":1692},[1241,9300,1773],{"class":1381},[1241,9302,1777],{"class":1776},[1241,9304,1773],{"class":1381},[1241,9306,1783],{"class":1782},[1241,9308,1786],{"class":1381},[1241,9310,1752],{"class":1258},[1241,9312,2123],{"class":1262},[1241,9314,1752],{"class":1258},[1241,9316,2117],{"class":1381},[1241,9318,9319,9321,9323,9325,9327,9329,9331,9333,9335,9337,9339,9341],{"class":1243,"line":1584},[1241,9320,2151],{"class":1724},[1241,9322,1728],{"class":1381},[1241,9324,1833],{"class":1692},[1241,9326,1773],{"class":1381},[1241,9328,1777],{"class":1776},[1241,9330,1773],{"class":1381},[1241,9332,1783],{"class":1782},[1241,9334,1786],{"class":1381},[1241,9336,1752],{"class":1258},[1241,9338,2170],{"class":1262},[1241,9340,1752],{"class":1258},[1241,9342,2117],{"class":1381},[1241,9344,9345,9347,9349,9351,9353,9355,9357,9359,9361,9363,9365,9367,9369,9371,9373,9375],{"class":1243,"line":1621},[1241,9346,2180],{"class":1724},[1241,9348,1728],{"class":1381},[1241,9350,1833],{"class":1692},[1241,9352,1773],{"class":1381},[1241,9354,1777],{"class":1776},[1241,9356,1773],{"class":1381},[1241,9358,1783],{"class":1782},[1241,9360,1786],{"class":1381},[1241,9362,1752],{"class":1258},[1241,9364,2199],{"class":1262},[1241,9366,1752],{"class":1258},[1241,9368,1608],{"class":1381},[1241,9370,1822],{"class":1258},[1241,9372,1603],{"class":1262},[1241,9374,1752],{"class":1258},[1241,9376,2117],{"class":1381},[1241,9378,9379,9381,9383,9385,9387,9389,9391,9393],{"class":1243,"line":1627},[1241,9380,2217],{"class":1724},[1241,9382,1728],{"class":1381},[1241,9384,2223],{"class":2222},[1241,9386,1752],{"class":1262},[1241,9388,2229],{"class":2228},[1241,9390,2151],{"class":1724},[1241,9392,2234],{"class":2228},[1241,9394,2237],{"class":1262},[1241,9396,9397],{"class":1243,"line":1633},[1241,9398,1303],{"emptyLinePlaceholder":1302},[1241,9400,9401],{"class":1243,"line":1639},[1241,9402,9403],{"class":1247},"# Static files\n",[1241,9405,9406,9408,9410,9412,9415],{"class":1243,"line":1645},[1241,9407,2254],{"class":1724},[1241,9409,1728],{"class":1381},[1241,9411,1822],{"class":1258},[1241,9413,9414],{"class":1262},"myproject.storage_backends.StaticStorage",[1241,9416,2264],{"class":1258},[1241,9418,9419,9421,9423,9425,9427,9429,9431,9433],{"class":1243,"line":2028},[1241,9420,2270],{"class":1724},[1241,9422,1728],{"class":1381},[1241,9424,2223],{"class":2222},[1241,9426,2277],{"class":1262},[1241,9428,2229],{"class":2228},[1241,9430,2217],{"class":1724},[1241,9432,2234],{"class":2228},[1241,9434,2286],{"class":1262},[1241,9436,9437],{"class":1243,"line":2042},[1241,9438,1303],{"emptyLinePlaceholder":1302},[1241,9440,9441],{"class":1243,"line":2064},[1241,9442,9443],{"class":1247},"# Media files\n",[1241,9445,9446,9448,9450,9452,9455],{"class":1243,"line":2070},[1241,9447,2303],{"class":1724},[1241,9449,1728],{"class":1381},[1241,9451,1822],{"class":1258},[1241,9453,9454],{"class":1262},"myproject.storage_backends.MediaStorage",[1241,9456,2264],{"class":1258},[1241,9458,9459,9461,9463,9465,9467,9469,9471,9473],{"class":1243,"line":2075},[1241,9460,2317],{"class":1724},[1241,9462,1728],{"class":1381},[1241,9464,2223],{"class":2222},[1241,9466,2277],{"class":1262},[1241,9468,2229],{"class":2228},[1241,9470,2217],{"class":1724},[1241,9472,2234],{"class":2228},[1241,9474,2332],{"class":1262},[1241,9476,9477],{"class":1243,"line":2080},[1241,9478,1303],{"emptyLinePlaceholder":1302},[1241,9480,9481],{"class":1243,"line":2085},[1241,9482,2343],{"class":1247},[1241,9484,9485,9487,9489],{"class":1243,"line":2091},[1241,9486,2349],{"class":1724},[1241,9488,1728],{"class":1381},[1241,9490,9491],{"class":1731}," None\n",[1241,9493,9494,9496,9498],{"class":1243,"line":2120},[1241,9495,2364],{"class":1724},[1241,9497,1728],{"class":1381},[1241,9499,1566],{"class":1381},[1241,9501,9502,9504,9506,9508,9510,9512,9514,9516],{"class":1243,"line":2148},[1241,9503,1746],{"class":1258},[1241,9505,2376],{"class":1262},[1241,9507,1752],{"class":1258},[1241,9509,1397],{"class":1381},[1241,9511,1822],{"class":1258},[1241,9513,2385],{"class":1262},[1241,9515,1752],{"class":1258},[1241,9517,1407],{"class":1381},[1241,9519,9520],{"class":1243,"line":2177},[1241,9521,1648],{"class":1381},[1241,9523,9524,9526,9528],{"class":1243,"line":2214},[1241,9525,2400],{"class":1724},[1241,9527,1728],{"class":1381},[1241,9529,1732],{"class":1731},[1241,9531,9532,9534,9536],{"class":1243,"line":2240},[1241,9533,2410],{"class":1724},[1241,9535,1728],{"class":1381},[1241,9537,1732],{"class":1731},[1241,9539,9540,9543,9545,9547,9550],{"class":1243,"line":2245},[1241,9541,9542],{"class":1724},"AWS_S3_SIGNATURE_VERSION",[1241,9544,1728],{"class":1381},[1241,9546,1822],{"class":1258},[1241,9548,9549],{"class":1262},"s3v4",[1241,9551,2264],{"class":1258},[1241,9553,9554],{"class":1243,"line":2251},[1241,9555,1303],{"emptyLinePlaceholder":1302},[1241,9557,9558],{"class":1243,"line":2267},[1241,9559,9560],{"class":1247},"# CloudFront CDN (optional)\n",[1241,9562,9563,9565,9567,9569,9571,9573,9575,9577,9579,9582,9584],{"class":1243,"line":2289},[1241,9564,1819],{"class":1688},[1241,9566,1833],{"class":1692},[1241,9568,1773],{"class":1381},[1241,9570,1777],{"class":1776},[1241,9572,1773],{"class":1381},[1241,9574,1783],{"class":1782},[1241,9576,1786],{"class":1381},[1241,9578,1752],{"class":1258},[1241,9580,9581],{"class":1262},"CLOUDFRONT_DOMAIN",[1241,9583,1752],{"class":1258},[1241,9585,8583],{"class":1381},[1241,9587,9588,9591,9593,9595,9597,9599,9601,9603,9605,9607,9609,9611],{"class":1243,"line":2294},[1241,9589,9590],{"class":1724},"    AWS_S3_CUSTOM_DOMAIN",[1241,9592,1728],{"class":1381},[1241,9594,1833],{"class":1692},[1241,9596,1773],{"class":1381},[1241,9598,1777],{"class":1776},[1241,9600,1773],{"class":1381},[1241,9602,1783],{"class":1782},[1241,9604,1786],{"class":1381},[1241,9606,1752],{"class":1258},[1241,9608,9581],{"class":1262},[1241,9610,1752],{"class":1258},[1241,9612,2117],{"class":1381},[1241,9614,9615,9618,9620,9622,9624,9626,9628,9630],{"class":1243,"line":2300},[1241,9616,9617],{"class":1724},"    STATIC_URL",[1241,9619,1728],{"class":1381},[1241,9621,2223],{"class":2222},[1241,9623,2277],{"class":1262},[1241,9625,2229],{"class":2228},[1241,9627,2217],{"class":1724},[1241,9629,2234],{"class":2228},[1241,9631,2286],{"class":1262},[1241,9633,9634,9637,9639,9641,9643,9645,9647,9649],{"class":1243,"line":2314},[1241,9635,9636],{"class":1724},"    MEDIA_URL",[1241,9638,1728],{"class":1381},[1241,9640,2223],{"class":2222},[1241,9642,2277],{"class":1262},[1241,9644,2229],{"class":2228},[1241,9646,2217],{"class":1724},[1241,9648,2234],{"class":2228},[1241,9650,2332],{"class":1262},[1035,9652,9654],{"id":9653},"elasticache-redis-setup","ElastiCache Redis Setup",[1026,9656,9657],{},[1042,9658,9659],{},"ElastiCache Configuration",[1128,9661,9663],{"className":1235,"code":9662,"language":1237,"meta":1137,"style":1137},"# Create cache subnet group\naws elasticache create-cache-subnet-group \\\n    --cache-subnet-group-name django-cache-subnet-group \\\n    --cache-subnet-group-description \"Subnet group for Django ElastiCache\" \\\n    --subnet-ids subnet-12345678 subnet-87654321\n\n# Create Redis cluster\naws elasticache create-replication-group \\\n    --replication-group-id django-redis-cluster \\\n    --description \"Redis cluster for Django\" \\\n    --num-cache-clusters 2 \\\n    --cache-node-type cache.t3.micro \\\n    --engine redis \\\n    --engine-version 6.2 \\\n    --cache-parameter-group-name default.redis6.x \\\n    --cache-subnet-group-name django-cache-subnet-group \\\n    --security-group-ids sg-12345678 \\\n    --at-rest-encryption-enabled \\\n    --transit-encryption-enabled \\\n    --auth-token YourAuthTokenHere \\\n    --automatic-failover-enabled\n",[1135,9664,9665,9670,9682,9692,9706,9714,9718,9723,9734,9744,9758,9768,9778,9787,9796,9806,9814,9823,9830,9837,9847],{"__ignoreMap":1137},[1241,9666,9667],{"class":1243,"line":1244},[1241,9668,9669],{"class":1247},"# Create cache subnet group\n",[1241,9671,9672,9674,9677,9680],{"class":1243,"line":1251},[1241,9673,1315],{"class":1254},[1241,9675,9676],{"class":1262}," elasticache",[1241,9678,9679],{"class":1262}," create-cache-subnet-group",[1241,9681,7890],{"class":1724},[1241,9683,9684,9687,9690],{"class":1243,"line":1281},[1241,9685,9686],{"class":1269},"    --cache-subnet-group-name",[1241,9688,9689],{"class":1262}," django-cache-subnet-group",[1241,9691,7890],{"class":1724},[1241,9693,9694,9697,9699,9702,9704],{"class":1243,"line":1290},[1241,9695,9696],{"class":1269},"    --cache-subnet-group-description",[1241,9698,1259],{"class":1258},[1241,9700,9701],{"class":1262},"Subnet group for Django ElastiCache",[1241,9703,1266],{"class":1258},[1241,9705,7890],{"class":1724},[1241,9707,9708,9710,9712],{"class":1243,"line":1299},[1241,9709,8043],{"class":1269},[1241,9711,8046],{"class":1262},[1241,9713,8049],{"class":1262},[1241,9715,9716],{"class":1243,"line":1306},[1241,9717,1303],{"emptyLinePlaceholder":1302},[1241,9719,9720],{"class":1243,"line":1312},[1241,9721,9722],{"class":1247},"# Create Redis cluster\n",[1241,9724,9725,9727,9729,9732],{"class":1243,"line":1321},[1241,9726,1315],{"class":1254},[1241,9728,9676],{"class":1262},[1241,9730,9731],{"class":1262}," create-replication-group",[1241,9733,7890],{"class":1724},[1241,9735,9736,9739,9742],{"class":1243,"line":1327},[1241,9737,9738],{"class":1269},"    --replication-group-id",[1241,9740,9741],{"class":1262}," django-redis-cluster",[1241,9743,7890],{"class":1724},[1241,9745,9746,9749,9751,9754,9756],{"class":1243,"line":1333},[1241,9747,9748],{"class":1269},"    --description",[1241,9750,1259],{"class":1258},[1241,9752,9753],{"class":1262},"Redis cluster for Django",[1241,9755,1266],{"class":1258},[1241,9757,7890],{"class":1724},[1241,9759,9760,9763,9766],{"class":1243,"line":1339},[1241,9761,9762],{"class":1269},"    --num-cache-clusters",[1241,9764,9765],{"class":2476}," 2",[1241,9767,7890],{"class":1724},[1241,9769,9770,9773,9776],{"class":1243,"line":1345},[1241,9771,9772],{"class":1269},"    --cache-node-type",[1241,9774,9775],{"class":1262}," cache.t3.micro",[1241,9777,7890],{"class":1724},[1241,9779,9780,9782,9785],{"class":1243,"line":1350},[1241,9781,8094],{"class":1269},[1241,9783,9784],{"class":1262}," redis",[1241,9786,7890],{"class":1724},[1241,9788,9789,9791,9794],{"class":1243,"line":1356},[1241,9790,8103],{"class":1269},[1241,9792,9793],{"class":2476}," 6.2",[1241,9795,7890],{"class":1724},[1241,9797,9798,9801,9804],{"class":1243,"line":1554},[1241,9799,9800],{"class":1269},"    --cache-parameter-group-name",[1241,9802,9803],{"class":1262}," default.redis6.x",[1241,9805,7890],{"class":1724},[1241,9807,9808,9810,9812],{"class":1243,"line":1569},[1241,9809,9686],{"class":1269},[1241,9811,9689],{"class":1262},[1241,9813,7890],{"class":1724},[1241,9815,9816,9819,9821],{"class":1243,"line":1584},[1241,9817,9818],{"class":1269},"    --security-group-ids",[1241,9820,8162],{"class":1262},[1241,9822,7890],{"class":1724},[1241,9824,9825,9828],{"class":1243,"line":1621},[1241,9826,9827],{"class":1269},"    --at-rest-encryption-enabled",[1241,9829,7890],{"class":1724},[1241,9831,9832,9835],{"class":1243,"line":1627},[1241,9833,9834],{"class":1269},"    --transit-encryption-enabled",[1241,9836,7890],{"class":1724},[1241,9838,9839,9842,9845],{"class":1243,"line":1633},[1241,9840,9841],{"class":1269},"    --auth-token",[1241,9843,9844],{"class":1262}," YourAuthTokenHere",[1241,9846,7890],{"class":1724},[1241,9848,9849],{"class":1243,"line":1639},[1241,9850,9851],{"class":1269},"    --automatic-failover-enabled\n",[1026,9853,9854],{},[1042,9855,9856],{},"Django Redis Configuration",[1128,9858,9860],{"className":1674,"code":9859,"language":1676,"meta":1137,"style":1137},"# settings/production.py\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': f\"redis://:{os.environ.get('REDIS_AUTH_TOKEN')}@{os.environ.get('REDIS_ENDPOINT')}:6379/1\",\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n            'CONNECTION_POOL_KWARGS': {\n                'max_connections': 50,\n                'retry_on_timeout': True,\n                'ssl_cert_reqs': None,\n            },\n        },\n        'KEY_PREFIX': 'django',\n        'VERSION': 1,\n        'TIMEOUT': 300,\n    }\n}\n\n# Session storage\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'default'\nSESSION_COOKIE_AGE = 86400\n",[1135,9861,9862,9866,9874,9886,9904,9977,9989,10007,10019,10033,10048,10064,10068,10072,10091,10106,10122,10126,10130,10134,10138,10150,10162],{"__ignoreMap":1137},[1241,9863,9864],{"class":1243,"line":1244},[1241,9865,1683],{"class":1247},[1241,9867,9868,9870,9872],{"class":1243,"line":1251},[1241,9869,5058],{"class":1724},[1241,9871,1728],{"class":1381},[1241,9873,1566],{"class":1381},[1241,9875,9876,9878,9880,9882,9884],{"class":1243,"line":1281},[1241,9877,1746],{"class":1258},[1241,9879,1857],{"class":1262},[1241,9881,1752],{"class":1258},[1241,9883,1397],{"class":1381},[1241,9885,1566],{"class":1381},[1241,9887,9888,9890,9892,9894,9896,9898,9900,9902],{"class":1243,"line":1290},[1241,9889,1854],{"class":1258},[1241,9891,5081],{"class":1262},[1241,9893,1752],{"class":1258},[1241,9895,1397],{"class":1381},[1241,9897,1822],{"class":1258},[1241,9899,5090],{"class":1262},[1241,9901,1752],{"class":1258},[1241,9903,1407],{"class":1381},[1241,9905,9906,9908,9910,9912,9914,9916,9919,9921,9923,9925,9927,9929,9931,9933,9935,9938,9940,9942,9944,9947,9949,9951,9953,9955,9957,9959,9961,9963,9966,9968,9970,9972,9975],{"class":1243,"line":1299},[1241,9907,1854],{"class":1258},[1241,9909,5101],{"class":1262},[1241,9911,1752],{"class":1258},[1241,9913,1397],{"class":1381},[1241,9915,2223],{"class":2222},[1241,9917,9918],{"class":1262},"\"redis://:",[1241,9920,2229],{"class":2228},[1241,9922,2940],{"class":1692},[1241,9924,1773],{"class":1381},[1241,9926,1777],{"class":1776},[1241,9928,1773],{"class":1381},[1241,9930,1783],{"class":1782},[1241,9932,1786],{"class":1381},[1241,9934,1752],{"class":1258},[1241,9936,9937],{"class":1262},"REDIS_AUTH_TOKEN",[1241,9939,1752],{"class":1258},[1241,9941,7808],{"class":1381},[1241,9943,2234],{"class":2228},[1241,9945,9946],{"class":1262},"@",[1241,9948,2229],{"class":2228},[1241,9950,2940],{"class":1692},[1241,9952,1773],{"class":1381},[1241,9954,1777],{"class":1776},[1241,9956,1773],{"class":1381},[1241,9958,1783],{"class":1782},[1241,9960,1786],{"class":1381},[1241,9962,1752],{"class":1258},[1241,9964,9965],{"class":1262},"REDIS_ENDPOINT",[1241,9967,1752],{"class":1258},[1241,9969,7808],{"class":1381},[1241,9971,2234],{"class":2228},[1241,9973,9974],{"class":1262},":6379/1\"",[1241,9976,1407],{"class":1381},[1241,9978,9979,9981,9983,9985,9987],{"class":1243,"line":1306},[1241,9980,1854],{"class":1258},[1241,9982,2033],{"class":1262},[1241,9984,1752],{"class":1258},[1241,9986,1397],{"class":1381},[1241,9988,1566],{"class":1381},[1241,9990,9991,9993,9995,9997,9999,10001,10003,10005],{"class":1243,"line":1312},[1241,9992,1868],{"class":1258},[1241,9994,5141],{"class":1262},[1241,9996,1752],{"class":1258},[1241,9998,1397],{"class":1381},[1241,10000,1822],{"class":1258},[1241,10002,5150],{"class":1262},[1241,10004,1752],{"class":1258},[1241,10006,1407],{"class":1381},[1241,10008,10009,10011,10013,10015,10017],{"class":1243,"line":1321},[1241,10010,1868],{"class":1258},[1241,10012,5161],{"class":1262},[1241,10014,1752],{"class":1258},[1241,10016,1397],{"class":1381},[1241,10018,1566],{"class":1381},[1241,10020,10021,10023,10025,10027,10029,10031],{"class":1243,"line":1327},[1241,10022,2045],{"class":1258},[1241,10024,5174],{"class":1262},[1241,10026,1752],{"class":1258},[1241,10028,1397],{"class":1381},[1241,10030,7202],{"class":2476},[1241,10032,1407],{"class":1381},[1241,10034,10035,10037,10040,10042,10044,10046],{"class":1243,"line":1333},[1241,10036,2045],{"class":1258},[1241,10038,10039],{"class":1262},"retry_on_timeout",[1241,10041,1752],{"class":1258},[1241,10043,1397],{"class":1381},[1241,10045,2835],{"class":1731},[1241,10047,1407],{"class":1381},[1241,10049,10050,10052,10055,10057,10059,10062],{"class":1243,"line":1339},[1241,10051,2045],{"class":1258},[1241,10053,10054],{"class":1262},"ssl_cert_reqs",[1241,10056,1752],{"class":1258},[1241,10058,1397],{"class":1381},[1241,10060,10061],{"class":1731}," None",[1241,10063,1407],{"class":1381},[1241,10065,10066],{"class":1243,"line":1345},[1241,10067,2067],{"class":1381},[1241,10069,10070],{"class":1243,"line":1350},[1241,10071,2680],{"class":1381},[1241,10073,10074,10076,10079,10081,10083,10085,10087,10089],{"class":1243,"line":1356},[1241,10075,1854],{"class":1258},[1241,10077,10078],{"class":1262},"KEY_PREFIX",[1241,10080,1752],{"class":1258},[1241,10082,1397],{"class":1381},[1241,10084,1822],{"class":1258},[1241,10086,2766],{"class":1262},[1241,10088,1752],{"class":1258},[1241,10090,1407],{"class":1381},[1241,10092,10093,10095,10098,10100,10102,10104],{"class":1243,"line":1554},[1241,10094,1854],{"class":1258},[1241,10096,10097],{"class":1262},"VERSION",[1241,10099,1752],{"class":1258},[1241,10101,1397],{"class":1381},[1241,10103,2564],{"class":2476},[1241,10105,1407],{"class":1381},[1241,10107,10108,10110,10113,10115,10117,10120],{"class":1243,"line":1569},[1241,10109,1854],{"class":1258},[1241,10111,10112],{"class":1262},"TIMEOUT",[1241,10114,1752],{"class":1258},[1241,10116,1397],{"class":1381},[1241,10118,10119],{"class":2476}," 300",[1241,10121,1407],{"class":1381},[1241,10123,10124],{"class":1243,"line":1584},[1241,10125,1636],{"class":1381},[1241,10127,10128],{"class":1243,"line":1621},[1241,10129,1648],{"class":1381},[1241,10131,10132],{"class":1243,"line":1627},[1241,10133,1303],{"emptyLinePlaceholder":1302},[1241,10135,10136],{"class":1243,"line":1633},[1241,10137,5210],{"class":1247},[1241,10139,10140,10142,10144,10146,10148],{"class":1243,"line":1639},[1241,10141,5215],{"class":1724},[1241,10143,1728],{"class":1381},[1241,10145,1822],{"class":1258},[1241,10147,5222],{"class":1262},[1241,10149,2264],{"class":1258},[1241,10151,10152,10154,10156,10158,10160],{"class":1243,"line":1645},[1241,10153,5229],{"class":1724},[1241,10155,1728],{"class":1381},[1241,10157,1822],{"class":1258},[1241,10159,1857],{"class":1262},[1241,10161,2264],{"class":1258},[1241,10163,10164,10167,10169],{"class":1243,"line":2028},[1241,10165,10166],{"class":1724},"SESSION_COOKIE_AGE",[1241,10168,1728],{"class":1381},[1241,10170,10171],{"class":2476}," 86400\n",[1035,10173,10175],{"id":10174},"cloudformation-template","CloudFormation Template",[1128,10177,10179],{"className":3017,"code":10178,"language":3019,"meta":1137,"style":1137},"# cloudformation/django-infrastructure.yml\nAWSTemplateFormatVersion: '2010-09-09'\nDescription: 'Django Application Infrastructure'\n\nParameters:\n  Environment:\n    Type: String\n    Default: production\n    AllowedValues: [development, staging, production]\n  \n  InstanceType:\n    Type: String\n    Default: t3.medium\n    AllowedValues: [t3.small, t3.medium, t3.large]\n\nResources:\n  # VPC and Networking\n  VPC:\n    Type: AWS::EC2::VPC\n    Properties:\n      CidrBlock: 10.0.0.0/16\n      EnableDnsHostnames: true\n      EnableDnsSupport: true\n      Tags:\n        - Key: Name\n          Value: !Sub ${Environment}-django-vpc\n\n  PublicSubnet1:\n    Type: AWS::EC2::Subnet\n    Properties:\n      VpcId: !Ref VPC\n      AvailabilityZone: !Select [0, !GetAZs '']\n      CidrBlock: 10.0.1.0/24\n      MapPublicIpOnLaunch: true\n      Tags:\n        - Key: Name\n          Value: !Sub ${Environment}-public-subnet-1\n\n  PublicSubnet2:\n    Type: AWS::EC2::Subnet\n    Properties:\n      VpcId: !Ref VPC\n      AvailabilityZone: !Select [1, !GetAZs '']\n      CidrBlock: 10.0.2.0/24\n      MapPublicIpOnLaunch: true\n      Tags:\n        - Key: Name\n          Value: !Sub ${Environment}-public-subnet-2\n\n  PrivateSubnet1:\n    Type: AWS::EC2::Subnet\n    Properties:\n      VpcId: !Ref VPC\n      AvailabilityZone: !Select [0, !GetAZs '']\n      CidrBlock: 10.0.3.0/24\n      Tags:\n        - Key: Name\n          Value: !Sub ${Environment}-private-subnet-1\n\n  PrivateSubnet2:\n    Type: AWS::EC2::Subnet\n    Properties:\n      VpcId: !Ref VPC\n      AvailabilityZone: !Select [1, !GetAZs '']\n      CidrBlock: 10.0.4.0/24\n      Tags:\n        - Key: Name\n          Value: !Sub ${Environment}-private-subnet-2\n\n  # Internet Gateway\n  InternetGateway:\n    Type: AWS::EC2::InternetGateway\n    Properties:\n      Tags:\n        - Key: Name\n          Value: !Sub ${Environment}-igw\n\n  InternetGatewayAttachment:\n    Type: AWS::EC2::VPCGatewayAttachment\n    Properties:\n      InternetGatewayId: !Ref InternetGateway\n      VpcId: !Ref VPC\n\n  # Route Tables\n  PublicRouteTable:\n    Type: AWS::EC2::RouteTable\n    Properties:\n      VpcId: !Ref VPC\n      Tags:\n        - Key: Name\n          Value: !Sub ${Environment}-public-routes\n\n  DefaultPublicRoute:\n    Type: AWS::EC2::Route\n    DependsOn: InternetGatewayAttachment\n    Properties:\n      RouteTableId: !Ref PublicRouteTable\n      DestinationCidrBlock: 0.0.0.0/0\n      GatewayId: !Ref InternetGateway\n\n  PublicSubnet1RouteTableAssociation:\n    Type: AWS::EC2::SubnetRouteTableAssociation\n    Properties:\n      RouteTableId: !Ref PublicRouteTable\n      SubnetId: !Ref PublicSubnet1\n\n  PublicSubnet2RouteTableAssociation:\n    Type: AWS::EC2::SubnetRouteTableAssociation\n    Properties:\n      RouteTableId: !Ref PublicRouteTable\n      SubnetId: !Ref PublicSubnet2\n\n  # Security Groups\n  LoadBalancerSecurityGroup:\n    Type: AWS::EC2::SecurityGroup\n    Properties:\n      GroupName: !Sub ${Environment}-alb-sg\n      GroupDescription: Security group for Application Load Balancer\n      VpcId: !Ref VPC\n      SecurityGroupIngress:\n        - IpProtocol: tcp\n          FromPort: 80\n          ToPort: 80\n          CidrIp: 0.0.0.0/0\n        - IpProtocol: tcp\n          FromPort: 443\n          ToPort: 443\n          CidrIp: 0.0.0.0/0\n\n  WebServerSecurityGroup:\n    Type: AWS::EC2::SecurityGroup\n    Properties:\n      GroupName: !Sub ${Environment}-web-sg\n      GroupDescription: Security group for web servers\n      VpcId: !Ref VPC\n      SecurityGroupIngress:\n        - IpProtocol: tcp\n          FromPort: 8000\n          ToPort: 8000\n          SourceSecurityGroupId: !Ref LoadBalancerSecurityGroup\n        - IpProtocol: tcp\n          FromPort: 22\n          ToPort: 22\n          CidrIp: 10.0.0.0/16\n\n  DatabaseSecurityGroup:\n    Type: AWS::EC2::SecurityGroup\n    Properties:\n      GroupName: !Sub ${Environment}-db-sg\n      GroupDescription: Security group for database\n      VpcId: !Ref VPC\n      SecurityGroupIngress:\n        - IpProtocol: tcp\n          FromPort: 5432\n          ToPort: 5432\n          SourceSecurityGroupId: !Ref WebServerSecurityGroup\n\n  # RDS Database\n  DBSubnetGroup:\n    Type: AWS::RDS::DBSubnetGroup\n    Properties:\n      DBSubnetGroupDescription: Subnet group for RDS database\n      SubnetIds:\n        - !Ref PrivateSubnet1\n        - !Ref PrivateSubnet2\n      Tags:\n        - Key: Name\n          Value: !Sub ${Environment}-db-subnet-group\n\n  Database:\n    Type: AWS::RDS::DBInstance\n    Properties:\n      DBInstanceIdentifier: !Sub ${Environment}-django-db\n      DBInstanceClass: db.t3.micro\n      Engine: postgres\n      EngineVersion: '13.7'\n      MasterUsername: postgres\n      MasterUserPassword: !Ref DatabasePassword\n      AllocatedStorage: 20\n      StorageType: gp2\n      StorageEncrypted: true\n      VPCSecurityGroups:\n        - !Ref DatabaseSecurityGroup\n      DBSubnetGroupName: !Ref DBSubnetGroup\n      BackupRetentionPeriod: 7\n      MultiAZ: !If [IsProduction, true, false]\n      DeletionProtection: !If [IsProduction, true, false]\n\n  # ElastiCache Redis\n  CacheSubnetGroup:\n    Type: AWS::ElastiCache::SubnetGroup\n    Properties:\n      Description: Subnet group for ElastiCache\n      SubnetIds:\n        - !Ref PrivateSubnet1\n        - !Ref PrivateSubnet2\n\n  CacheCluster:\n    Type: AWS::ElastiCache::CacheCluster\n    Properties:\n      CacheNodeType: cache.t3.micro\n      Engine: redis\n      NumCacheNodes: 1\n      CacheSubnetGroupName: !Ref CacheSubnetGroup\n      VpcSecurityGroupIds:\n        - !Ref CacheSecurityGroup\n\n  CacheSecurityGroup:\n    Type: AWS::EC2::SecurityGroup\n    Properties:\n      GroupDescription: Security group for ElastiCache\n      VpcId: !Ref VPC\n      SecurityGroupIngress:\n        - IpProtocol: tcp\n          FromPort: 6379\n          ToPort: 6379\n          SourceSecurityGroupId: !Ref WebServerSecurityGroup\n\n  # Application Load Balancer\n  LoadBalancer:\n    Type: AWS::ElasticLoadBalancingV2::LoadBalancer\n    Properties:\n      Name: !Sub ${Environment}-django-alb\n      Scheme: internet-facing\n      SecurityGroups:\n        - !Ref LoadBalancerSecurityGroup\n      Subnets:\n        - !Ref PublicSubnet1\n        - !Ref PublicSubnet2\n\n  TargetGroup:\n    Type: AWS::ElasticLoadBalancingV2::TargetGroup\n    Properties:\n      Name: !Sub ${Environment}-django-tg\n      Port: 8000\n      Protocol: HTTP\n      VpcId: !Ref VPC\n      HealthCheckPath: /health/\n      HealthCheckProtocol: HTTP\n      HealthCheckIntervalSeconds: 30\n      HealthCheckTimeoutSeconds: 5\n      HealthyThresholdCount: 2\n      UnhealthyThresholdCount: 3\n\n  LoadBalancerListener:\n    Type: AWS::ElasticLoadBalancingV2::Listener\n    Properties:\n      DefaultActions:\n        - Type: forward\n          TargetGroupArn: !Ref TargetGroup\n      LoadBalancerArn: !Ref LoadBalancer\n      Port: 80\n      Protocol: HTTP\n\n  # Auto Scaling Group\n  LaunchTemplate:\n    Type: AWS::EC2::LaunchTemplate\n    Properties:\n      LaunchTemplateName: !Sub ${Environment}-django-lt\n      LaunchTemplateData:\n        ImageId: ami-0c02fb55956c7d316  # Amazon Linux 2\n        InstanceType: !Ref InstanceType\n        SecurityGroupIds:\n          - !Ref WebServerSecurityGroup\n        IamInstanceProfile:\n          Arn: !GetAtt InstanceProfile.Arn\n        UserData:\n          Fn::Base64: !Sub |\n            #!/bin/bash\n            yum update -y\n            yum install -y docker\n            service docker start\n            usermod -a -G docker ec2-user\n            \n            # Install Docker Compose\n            curl -L \"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\n            chmod +x /usr/local/bin/docker-compose\n            \n            # Deploy application\n            mkdir -p /opt/django_app\n            cd /opt/django_app\n            \n            # Create environment file\n            cat > .env \u003C\u003C EOF\n            DJANGO_SETTINGS_MODULE=myproject.settings.production\n            DATABASE_URL=postgresql://postgres:${DatabasePassword}@${Database.Endpoint.Address}:5432/postgres\n            REDIS_URL=redis://${CacheCluster.RedisEndpoint.Address}:6379/1\n            EOF\n            \n            # Pull and run application\n            docker run -d --name django-app \\\n              --env-file .env \\\n              -p 8000:8000 \\\n              123456789012.dkr.ecr.us-east-1.amazonaws.com/django-app:latest\n\n  AutoScalingGroup:\n    Type: AWS::AutoScaling::AutoScalingGroup\n    Properties:\n      AutoScalingGroupName: !Sub ${Environment}-django-asg\n      VPCZoneIdentifier:\n        - !Ref PrivateSubnet1\n        - !Ref PrivateSubnet2\n      LaunchTemplate:\n        LaunchTemplateId: !Ref LaunchTemplate\n        Version: !GetAtt LaunchTemplate.LatestVersionNumber\n      MinSize: 1\n      MaxSize: 4\n      DesiredCapacity: 2\n      TargetGroupARNs:\n        - !Ref TargetGroup\n      HealthCheckType: ELB\n      HealthCheckGracePeriod: 300\n\n  # IAM Roles\n  InstanceRole:\n    Type: AWS::IAM::Role\n    Properties:\n      AssumeRolePolicyDocument:\n        Version: '2012-10-17'\n        Statement:\n          - Effect: Allow\n            Principal:\n              Service: ec2.amazonaws.com\n            Action: sts:AssumeRole\n      ManagedPolicyArns:\n        - arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy\n        - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly\n\n  InstanceProfile:\n    Type: AWS::IAM::InstanceProfile\n    Properties:\n      Roles:\n        - !Ref InstanceRole\n\nConditions:\n  IsProduction: !Equals [!Ref Environment, production]\n\nParameters:\n  DatabasePassword:\n    Type: String\n    NoEcho: true\n    Description: Password for the RDS database\n\nOutputs:\n  LoadBalancerDNS:\n    Description: DNS name of the load balancer\n    Value: !GetAtt LoadBalancer.DNSName\n    Export:\n      Name: !Sub ${Environment}-LoadBalancerDNS\n\n  DatabaseEndpoint:\n    Description: RDS database endpoint\n    Value: !GetAtt Database.Endpoint.Address\n    Export:\n      Name: !Sub ${Environment}-DatabaseEndpoint\n",[1135,10180,10181,10186,10200,10214,10218,10225,10232,10241,10250,10273,10278,10285,10293,10301,10324,10328,10334,10339,10346,10355,10361,10371,10380,10389,10396,10409,10422,10426,10433,10442,10448,10461,10484,10493,10502,10508,10518,10529,10533,10540,10548,10554,10564,10585,10594,10602,10608,10618,10629,10633,10640,10648,10654,10664,10684,10693,10699,10709,10720,10724,10731,10739,10745,10755,10775,10784,10790,10800,10811,10815,10820,10827,10836,10842,10848,10858,10869,10873,10880,10889,10895,10907,10917,10921,10926,10933,10942,10948,10958,10964,10974,10985,10989,10996,11005,11015,11021,11033,11042,11053,11057,11064,11073,11079,11089,11101,11105,11112,11120,11126,11136,11147,11151,11156,11163,11172,11178,11190,11201,11212,11220,11232,11242,11252,11262,11273,11282,11291,11300,11305,11313,11322,11329,11341,11351,11362,11369,11380,11389,11398,11411,11422,11432,11441,11450,11455,11463,11472,11479,11491,11501,11512,11519,11530,11540,11549,11561,11566,11572,11580,11590,11597,11608,11616,11626,11636,11643,11654,11666,11671,11679,11689,11696,11709,11719,11730,11745,11755,11768,11778,11789,11799,11807,11817,11830,11840,11866,11890,11895,11901,11909,11919,11926,11937,11944,11953,11962,11967,11975,11985,11992,12003,12013,12024,12037,12045,12055,12060,12068,12077,12084,12094,12105,12112,12123,12133,12142,12153,12158,12164,12172,12182,12189,12202,12213,12221,12230,12238,12247,12256,12261,12269,12279,12286,12298,12308,12319,12330,12340,12350,12361,12372,12382,12393,12398,12406,12416,12423,12431,12444,12457,12470,12479,12488,12493,12499,12507,12517,12524,12537,12545,12559,12572,12580,12590,12598,12612,12620,12633,12639,12645,12651,12657,12663,12669,12675,12681,12687,12692,12698,12704,12710,12715,12721,12727,12733,12739,12745,12751,12756,12762,12768,12774,12780,12786,12791,12799,12809,12816,12829,12837,12846,12855,12863,12876,12889,12899,12910,12920,12928,12937,12948,12958,12963,12969,12977,12987,12994,13002,13015,13023,13036,13044,13055,13066,13074,13082,13090,13095,13103,13113,13120,13128,13138,13143,13151,13176,13181,13188,13196,13205,13215,13226,13231,13239,13247,13257,13270,13278,13290,13295,13303,13313,13325,13332],{"__ignoreMap":1137},[1241,10182,10183],{"class":1243,"line":1244},[1241,10184,10185],{"class":1247},"# cloudformation/django-infrastructure.yml\n",[1241,10187,10188,10191,10193,10195,10198],{"class":1243,"line":1251},[1241,10189,10190],{"class":1590},"AWSTemplateFormatVersion",[1241,10192,1397],{"class":1381},[1241,10194,1822],{"class":1258},[1241,10196,10197],{"class":1262},"2010-09-09",[1241,10199,2264],{"class":1258},[1241,10201,10202,10205,10207,10209,10212],{"class":1243,"line":1281},[1241,10203,10204],{"class":1590},"Description",[1241,10206,1397],{"class":1381},[1241,10208,1822],{"class":1258},[1241,10210,10211],{"class":1262},"Django Application Infrastructure",[1241,10213,2264],{"class":1258},[1241,10215,10216],{"class":1243,"line":1290},[1241,10217,1303],{"emptyLinePlaceholder":1302},[1241,10219,10220,10223],{"class":1243,"line":1299},[1241,10221,10222],{"class":1590},"Parameters",[1241,10224,1840],{"class":1381},[1241,10226,10227,10230],{"class":1243,"line":1306},[1241,10228,10229],{"class":1590},"  Environment",[1241,10231,1840],{"class":1381},[1241,10233,10234,10236,10238],{"class":1243,"line":1312},[1241,10235,3678],{"class":1590},[1241,10237,1397],{"class":1381},[1241,10239,10240],{"class":1262}," String\n",[1241,10242,10243,10246,10248],{"class":1243,"line":1321},[1241,10244,10245],{"class":1590},"    Default",[1241,10247,1397],{"class":1381},[1241,10249,4087],{"class":1262},[1241,10251,10252,10255,10257,10259,10262,10264,10267,10269,10271],{"class":1243,"line":1327},[1241,10253,10254],{"class":1590},"    AllowedValues",[1241,10256,1397],{"class":1381},[1241,10258,1598],{"class":1381},[1241,10260,10261],{"class":1262},"development",[1241,10263,1608],{"class":1381},[1241,10265,10266],{"class":1262}," staging",[1241,10268,1608],{"class":1381},[1241,10270,3970],{"class":1262},[1241,10272,1618],{"class":1381},[1241,10274,10275],{"class":1243,"line":1333},[1241,10276,10277],{"class":1692},"  \n",[1241,10279,10280,10283],{"class":1243,"line":1339},[1241,10281,10282],{"class":1590},"  InstanceType",[1241,10284,1840],{"class":1381},[1241,10286,10287,10289,10291],{"class":1243,"line":1345},[1241,10288,3678],{"class":1590},[1241,10290,1397],{"class":1381},[1241,10292,10240],{"class":1262},[1241,10294,10295,10297,10299],{"class":1243,"line":1350},[1241,10296,10245],{"class":1590},[1241,10298,1397],{"class":1381},[1241,10300,3396],{"class":1262},[1241,10302,10303,10305,10307,10309,10312,10314,10317,10319,10322],{"class":1243,"line":1356},[1241,10304,10254],{"class":1590},[1241,10306,1397],{"class":1381},[1241,10308,1598],{"class":1381},[1241,10310,10311],{"class":1262},"t3.small",[1241,10313,1608],{"class":1381},[1241,10315,10316],{"class":1262}," t3.medium",[1241,10318,1608],{"class":1381},[1241,10320,10321],{"class":1262}," t3.large",[1241,10323,1618],{"class":1381},[1241,10325,10326],{"class":1243,"line":1554},[1241,10327,1303],{"emptyLinePlaceholder":1302},[1241,10329,10330,10332],{"class":1243,"line":1569},[1241,10331,3664],{"class":1590},[1241,10333,1840],{"class":1381},[1241,10335,10336],{"class":1243,"line":1584},[1241,10337,10338],{"class":1247},"  # VPC and Networking\n",[1241,10340,10341,10344],{"class":1243,"line":1621},[1241,10342,10343],{"class":1590},"  VPC",[1241,10345,1840],{"class":1381},[1241,10347,10348,10350,10352],{"class":1243,"line":1627},[1241,10349,3678],{"class":1590},[1241,10351,1397],{"class":1381},[1241,10353,10354],{"class":1262}," AWS::EC2::VPC\n",[1241,10356,10357,10359],{"class":1243,"line":1633},[1241,10358,3688],{"class":1590},[1241,10360,1840],{"class":1381},[1241,10362,10363,10366,10368],{"class":1243,"line":1639},[1241,10364,10365],{"class":1590},"      CidrBlock",[1241,10367,1397],{"class":1381},[1241,10369,10370],{"class":1262}," 10.0.0.0/16\n",[1241,10372,10373,10376,10378],{"class":1243,"line":1645},[1241,10374,10375],{"class":1590},"      EnableDnsHostnames",[1241,10377,1397],{"class":1381},[1241,10379,3228],{"class":3227},[1241,10381,10382,10385,10387],{"class":1243,"line":2028},[1241,10383,10384],{"class":1590},"      EnableDnsSupport",[1241,10386,1397],{"class":1381},[1241,10388,3228],{"class":3227},[1241,10390,10391,10394],{"class":1243,"line":2042},[1241,10392,10393],{"class":1590},"      Tags",[1241,10395,1840],{"class":1381},[1241,10397,10398,10401,10404,10406],{"class":1243,"line":2064},[1241,10399,10400],{"class":1381},"        -",[1241,10402,10403],{"class":1590}," Key",[1241,10405,1397],{"class":1381},[1241,10407,10408],{"class":1262}," Name\n",[1241,10410,10411,10414,10416,10419],{"class":1243,"line":2070},[1241,10412,10413],{"class":1590},"          Value",[1241,10415,1397],{"class":1381},[1241,10417,10418],{"class":2222}," !Sub",[1241,10420,10421],{"class":1262}," ${Environment}-django-vpc\n",[1241,10423,10424],{"class":1243,"line":2075},[1241,10425,1303],{"emptyLinePlaceholder":1302},[1241,10427,10428,10431],{"class":1243,"line":2080},[1241,10429,10430],{"class":1590},"  PublicSubnet1",[1241,10432,1840],{"class":1381},[1241,10434,10435,10437,10439],{"class":1243,"line":2085},[1241,10436,3678],{"class":1590},[1241,10438,1397],{"class":1381},[1241,10440,10441],{"class":1262}," AWS::EC2::Subnet\n",[1241,10443,10444,10446],{"class":1243,"line":2091},[1241,10445,3688],{"class":1590},[1241,10447,1840],{"class":1381},[1241,10449,10450,10453,10455,10458],{"class":1243,"line":2120},[1241,10451,10452],{"class":1590},"      VpcId",[1241,10454,1397],{"class":1381},[1241,10456,10457],{"class":2222}," !Ref",[1241,10459,10460],{"class":1262}," VPC\n",[1241,10462,10463,10466,10468,10471,10473,10475,10477,10480,10482],{"class":1243,"line":2148},[1241,10464,10465],{"class":1590},"      AvailabilityZone",[1241,10467,1397],{"class":1381},[1241,10469,10470],{"class":2222}," !Select",[1241,10472,1598],{"class":1381},[1241,10474,2909],{"class":2476},[1241,10476,1608],{"class":1381},[1241,10478,10479],{"class":2222}," !GetAZs",[1241,10481,1798],{"class":1258},[1241,10483,1618],{"class":1381},[1241,10485,10486,10488,10490],{"class":1243,"line":2177},[1241,10487,10365],{"class":1590},[1241,10489,1397],{"class":1381},[1241,10491,10492],{"class":1262}," 10.0.1.0/24\n",[1241,10494,10495,10498,10500],{"class":1243,"line":2214},[1241,10496,10497],{"class":1590},"      MapPublicIpOnLaunch",[1241,10499,1397],{"class":1381},[1241,10501,3228],{"class":3227},[1241,10503,10504,10506],{"class":1243,"line":2240},[1241,10505,10393],{"class":1590},[1241,10507,1840],{"class":1381},[1241,10509,10510,10512,10514,10516],{"class":1243,"line":2245},[1241,10511,10400],{"class":1381},[1241,10513,10403],{"class":1590},[1241,10515,1397],{"class":1381},[1241,10517,10408],{"class":1262},[1241,10519,10520,10522,10524,10526],{"class":1243,"line":2251},[1241,10521,10413],{"class":1590},[1241,10523,1397],{"class":1381},[1241,10525,10418],{"class":2222},[1241,10527,10528],{"class":1262}," ${Environment}-public-subnet-1\n",[1241,10530,10531],{"class":1243,"line":2267},[1241,10532,1303],{"emptyLinePlaceholder":1302},[1241,10534,10535,10538],{"class":1243,"line":2289},[1241,10536,10537],{"class":1590},"  PublicSubnet2",[1241,10539,1840],{"class":1381},[1241,10541,10542,10544,10546],{"class":1243,"line":2294},[1241,10543,3678],{"class":1590},[1241,10545,1397],{"class":1381},[1241,10547,10441],{"class":1262},[1241,10549,10550,10552],{"class":1243,"line":2300},[1241,10551,3688],{"class":1590},[1241,10553,1840],{"class":1381},[1241,10555,10556,10558,10560,10562],{"class":1243,"line":2314},[1241,10557,10452],{"class":1590},[1241,10559,1397],{"class":1381},[1241,10561,10457],{"class":2222},[1241,10563,10460],{"class":1262},[1241,10565,10566,10568,10570,10572,10574,10577,10579,10581,10583],{"class":1243,"line":2335},[1241,10567,10465],{"class":1590},[1241,10569,1397],{"class":1381},[1241,10571,10470],{"class":2222},[1241,10573,1598],{"class":1381},[1241,10575,10576],{"class":2476},"1",[1241,10578,1608],{"class":1381},[1241,10580,10479],{"class":2222},[1241,10582,1798],{"class":1258},[1241,10584,1618],{"class":1381},[1241,10586,10587,10589,10591],{"class":1243,"line":2340},[1241,10588,10365],{"class":1590},[1241,10590,1397],{"class":1381},[1241,10592,10593],{"class":1262}," 10.0.2.0/24\n",[1241,10595,10596,10598,10600],{"class":1243,"line":2346},[1241,10597,10497],{"class":1590},[1241,10599,1397],{"class":1381},[1241,10601,3228],{"class":3227},[1241,10603,10604,10606],{"class":1243,"line":2361},[1241,10605,10393],{"class":1590},[1241,10607,1840],{"class":1381},[1241,10609,10610,10612,10614,10616],{"class":1243,"line":2371},[1241,10611,10400],{"class":1381},[1241,10613,10403],{"class":1590},[1241,10615,1397],{"class":1381},[1241,10617,10408],{"class":1262},[1241,10619,10620,10622,10624,10626],{"class":1243,"line":2392},[1241,10621,10413],{"class":1590},[1241,10623,1397],{"class":1381},[1241,10625,10418],{"class":2222},[1241,10627,10628],{"class":1262}," ${Environment}-public-subnet-2\n",[1241,10630,10631],{"class":1243,"line":2397},[1241,10632,1303],{"emptyLinePlaceholder":1302},[1241,10634,10635,10638],{"class":1243,"line":2407},[1241,10636,10637],{"class":1590},"  PrivateSubnet1",[1241,10639,1840],{"class":1381},[1241,10641,10642,10644,10646],{"class":1243,"line":2417},[1241,10643,3678],{"class":1590},[1241,10645,1397],{"class":1381},[1241,10647,10441],{"class":1262},[1241,10649,10650,10652],{"class":1243,"line":2422},[1241,10651,3688],{"class":1590},[1241,10653,1840],{"class":1381},[1241,10655,10656,10658,10660,10662],{"class":1243,"line":2428},[1241,10657,10452],{"class":1590},[1241,10659,1397],{"class":1381},[1241,10661,10457],{"class":2222},[1241,10663,10460],{"class":1262},[1241,10665,10666,10668,10670,10672,10674,10676,10678,10680,10682],{"class":1243,"line":2439},[1241,10667,10465],{"class":1590},[1241,10669,1397],{"class":1381},[1241,10671,10470],{"class":2222},[1241,10673,1598],{"class":1381},[1241,10675,2909],{"class":2476},[1241,10677,1608],{"class":1381},[1241,10679,10479],{"class":2222},[1241,10681,1798],{"class":1258},[1241,10683,1618],{"class":1381},[1241,10685,10686,10688,10690],{"class":1243,"line":2468},[1241,10687,10365],{"class":1590},[1241,10689,1397],{"class":1381},[1241,10691,10692],{"class":1262}," 10.0.3.0/24\n",[1241,10694,10695,10697],{"class":1243,"line":2480},[1241,10696,10393],{"class":1590},[1241,10698,1840],{"class":1381},[1241,10700,10701,10703,10705,10707],{"class":1243,"line":2490},[1241,10702,10400],{"class":1381},[1241,10704,10403],{"class":1590},[1241,10706,1397],{"class":1381},[1241,10708,10408],{"class":1262},[1241,10710,10711,10713,10715,10717],{"class":1243,"line":2500},[1241,10712,10413],{"class":1590},[1241,10714,1397],{"class":1381},[1241,10716,10418],{"class":2222},[1241,10718,10719],{"class":1262}," ${Environment}-private-subnet-1\n",[1241,10721,10722],{"class":1243,"line":2505},[1241,10723,1303],{"emptyLinePlaceholder":1302},[1241,10725,10726,10729],{"class":1243,"line":2511},[1241,10727,10728],{"class":1590},"  PrivateSubnet2",[1241,10730,1840],{"class":1381},[1241,10732,10733,10735,10737],{"class":1243,"line":2521},[1241,10734,3678],{"class":1590},[1241,10736,1397],{"class":1381},[1241,10738,10441],{"class":1262},[1241,10740,10741,10743],{"class":1243,"line":2531},[1241,10742,3688],{"class":1590},[1241,10744,1840],{"class":1381},[1241,10746,10747,10749,10751,10753],{"class":1243,"line":2536},[1241,10748,10452],{"class":1590},[1241,10750,1397],{"class":1381},[1241,10752,10457],{"class":2222},[1241,10754,10460],{"class":1262},[1241,10756,10757,10759,10761,10763,10765,10767,10769,10771,10773],{"class":1243,"line":2542},[1241,10758,10465],{"class":1590},[1241,10760,1397],{"class":1381},[1241,10762,10470],{"class":2222},[1241,10764,1598],{"class":1381},[1241,10766,10576],{"class":2476},[1241,10768,1608],{"class":1381},[1241,10770,10479],{"class":2222},[1241,10772,1798],{"class":1258},[1241,10774,1618],{"class":1381},[1241,10776,10777,10779,10781],{"class":1243,"line":2552},[1241,10778,10365],{"class":1590},[1241,10780,1397],{"class":1381},[1241,10782,10783],{"class":1262}," 10.0.4.0/24\n",[1241,10785,10786,10788],{"class":1243,"line":2569},[1241,10787,10393],{"class":1590},[1241,10789,1840],{"class":1381},[1241,10791,10792,10794,10796,10798],{"class":1243,"line":2586},[1241,10793,10400],{"class":1381},[1241,10795,10403],{"class":1590},[1241,10797,1397],{"class":1381},[1241,10799,10408],{"class":1262},[1241,10801,10802,10804,10806,10808],{"class":1243,"line":2600},[1241,10803,10413],{"class":1590},[1241,10805,1397],{"class":1381},[1241,10807,10418],{"class":2222},[1241,10809,10810],{"class":1262}," ${Environment}-private-subnet-2\n",[1241,10812,10813],{"class":1243,"line":2614},[1241,10814,1303],{"emptyLinePlaceholder":1302},[1241,10816,10817],{"class":1243,"line":2635},[1241,10818,10819],{"class":1247},"  # Internet Gateway\n",[1241,10821,10822,10825],{"class":1243,"line":2656},[1241,10823,10824],{"class":1590},"  InternetGateway",[1241,10826,1840],{"class":1381},[1241,10828,10829,10831,10833],{"class":1243,"line":2677},[1241,10830,3678],{"class":1590},[1241,10832,1397],{"class":1381},[1241,10834,10835],{"class":1262}," AWS::EC2::InternetGateway\n",[1241,10837,10838,10840],{"class":1243,"line":2683},[1241,10839,3688],{"class":1590},[1241,10841,1840],{"class":1381},[1241,10843,10844,10846],{"class":1243,"line":2697},[1241,10845,10393],{"class":1590},[1241,10847,1840],{"class":1381},[1241,10849,10850,10852,10854,10856],{"class":1243,"line":2716},[1241,10851,10400],{"class":1381},[1241,10853,10403],{"class":1590},[1241,10855,1397],{"class":1381},[1241,10857,10408],{"class":1262},[1241,10859,10860,10862,10864,10866],{"class":1243,"line":2736},[1241,10861,10413],{"class":1590},[1241,10863,1397],{"class":1381},[1241,10865,10418],{"class":2222},[1241,10867,10868],{"class":1262}," ${Environment}-igw\n",[1241,10870,10871],{"class":1243,"line":2741},[1241,10872,1303],{"emptyLinePlaceholder":1302},[1241,10874,10875,10878],{"class":1243,"line":2747},[1241,10876,10877],{"class":1590},"  InternetGatewayAttachment",[1241,10879,1840],{"class":1381},[1241,10881,10882,10884,10886],{"class":1243,"line":2761},[1241,10883,3678],{"class":1590},[1241,10885,1397],{"class":1381},[1241,10887,10888],{"class":1262}," AWS::EC2::VPCGatewayAttachment\n",[1241,10890,10891,10893],{"class":1243,"line":2775},[1241,10892,3688],{"class":1590},[1241,10894,1840],{"class":1381},[1241,10896,10897,10900,10902,10904],{"class":1243,"line":2804},[1241,10898,10899],{"class":1590},"      InternetGatewayId",[1241,10901,1397],{"class":1381},[1241,10903,10457],{"class":2222},[1241,10905,10906],{"class":1262}," InternetGateway\n",[1241,10908,10909,10911,10913,10915],{"class":1243,"line":2823},[1241,10910,10452],{"class":1590},[1241,10912,1397],{"class":1381},[1241,10914,10457],{"class":2222},[1241,10916,10460],{"class":1262},[1241,10918,10919],{"class":1243,"line":2840},[1241,10920,1303],{"emptyLinePlaceholder":1302},[1241,10922,10923],{"class":1243,"line":2845},[1241,10924,10925],{"class":1247},"  # Route Tables\n",[1241,10927,10928,10931],{"class":1243,"line":2850},[1241,10929,10930],{"class":1590},"  PublicRouteTable",[1241,10932,1840],{"class":1381},[1241,10934,10935,10937,10939],{"class":1243,"line":3776},[1241,10936,3678],{"class":1590},[1241,10938,1397],{"class":1381},[1241,10940,10941],{"class":1262}," AWS::EC2::RouteTable\n",[1241,10943,10944,10946],{"class":1243,"line":3782},[1241,10945,3688],{"class":1590},[1241,10947,1840],{"class":1381},[1241,10949,10950,10952,10954,10956],{"class":1243,"line":3789},[1241,10951,10452],{"class":1590},[1241,10953,1397],{"class":1381},[1241,10955,10457],{"class":2222},[1241,10957,10460],{"class":1262},[1241,10959,10960,10962],{"class":1243,"line":3796},[1241,10961,10393],{"class":1590},[1241,10963,1840],{"class":1381},[1241,10965,10966,10968,10970,10972],{"class":1243,"line":3811},[1241,10967,10400],{"class":1381},[1241,10969,10403],{"class":1590},[1241,10971,1397],{"class":1381},[1241,10973,10408],{"class":1262},[1241,10975,10976,10978,10980,10982],{"class":1243,"line":3826},[1241,10977,10413],{"class":1590},[1241,10979,1397],{"class":1381},[1241,10981,10418],{"class":2222},[1241,10983,10984],{"class":1262}," ${Environment}-public-routes\n",[1241,10986,10987],{"class":1243,"line":3841},[1241,10988,1303],{"emptyLinePlaceholder":1302},[1241,10990,10991,10994],{"class":1243,"line":3856},[1241,10992,10993],{"class":1590},"  DefaultPublicRoute",[1241,10995,1840],{"class":1381},[1241,10997,10998,11000,11002],{"class":1243,"line":3871},[1241,10999,3678],{"class":1590},[1241,11001,1397],{"class":1381},[1241,11003,11004],{"class":1262}," AWS::EC2::Route\n",[1241,11006,11007,11010,11012],{"class":1243,"line":3886},[1241,11008,11009],{"class":1590},"    DependsOn",[1241,11011,1397],{"class":1381},[1241,11013,11014],{"class":1262}," InternetGatewayAttachment\n",[1241,11016,11017,11019],{"class":1243,"line":3901},[1241,11018,3688],{"class":1590},[1241,11020,1840],{"class":1381},[1241,11022,11023,11026,11028,11030],{"class":1243,"line":6562},[1241,11024,11025],{"class":1590},"      RouteTableId",[1241,11027,1397],{"class":1381},[1241,11029,10457],{"class":2222},[1241,11031,11032],{"class":1262}," PublicRouteTable\n",[1241,11034,11035,11038,11040],{"class":1243,"line":6581},[1241,11036,11037],{"class":1590},"      DestinationCidrBlock",[1241,11039,1397],{"class":1381},[1241,11041,3769],{"class":1262},[1241,11043,11044,11047,11049,11051],{"class":1243,"line":6594},[1241,11045,11046],{"class":1590},"      GatewayId",[1241,11048,1397],{"class":1381},[1241,11050,10457],{"class":2222},[1241,11052,10906],{"class":1262},[1241,11054,11055],{"class":1243,"line":6613},[1241,11056,1303],{"emptyLinePlaceholder":1302},[1241,11058,11059,11062],{"class":1243,"line":6632},[1241,11060,11061],{"class":1590},"  PublicSubnet1RouteTableAssociation",[1241,11063,1840],{"class":1381},[1241,11065,11066,11068,11070],{"class":1243,"line":6649},[1241,11067,3678],{"class":1590},[1241,11069,1397],{"class":1381},[1241,11071,11072],{"class":1262}," AWS::EC2::SubnetRouteTableAssociation\n",[1241,11074,11075,11077],{"class":1243,"line":6654},[1241,11076,3688],{"class":1590},[1241,11078,1840],{"class":1381},[1241,11080,11081,11083,11085,11087],{"class":1243,"line":6659},[1241,11082,11025],{"class":1590},[1241,11084,1397],{"class":1381},[1241,11086,10457],{"class":2222},[1241,11088,11032],{"class":1262},[1241,11090,11091,11094,11096,11098],{"class":1243,"line":6664},[1241,11092,11093],{"class":1590},"      SubnetId",[1241,11095,1397],{"class":1381},[1241,11097,10457],{"class":2222},[1241,11099,11100],{"class":1262}," PublicSubnet1\n",[1241,11102,11103],{"class":1243,"line":6670},[1241,11104,1303],{"emptyLinePlaceholder":1302},[1241,11106,11107,11110],{"class":1243,"line":6684},[1241,11108,11109],{"class":1590},"  PublicSubnet2RouteTableAssociation",[1241,11111,1840],{"class":1381},[1241,11113,11114,11116,11118],{"class":1243,"line":6689},[1241,11115,3678],{"class":1590},[1241,11117,1397],{"class":1381},[1241,11119,11072],{"class":1262},[1241,11121,11122,11124],{"class":1243,"line":6706},[1241,11123,3688],{"class":1590},[1241,11125,1840],{"class":1381},[1241,11127,11128,11130,11132,11134],{"class":1243,"line":6711},[1241,11129,11025],{"class":1590},[1241,11131,1397],{"class":1381},[1241,11133,10457],{"class":2222},[1241,11135,11032],{"class":1262},[1241,11137,11138,11140,11142,11144],{"class":1243,"line":6716},[1241,11139,11093],{"class":1590},[1241,11141,1397],{"class":1381},[1241,11143,10457],{"class":2222},[1241,11145,11146],{"class":1262}," PublicSubnet2\n",[1241,11148,11149],{"class":1243,"line":6735},[1241,11150,1303],{"emptyLinePlaceholder":1302},[1241,11152,11153],{"class":1243,"line":6749},[1241,11154,11155],{"class":1247},"  # Security Groups\n",[1241,11157,11158,11161],{"class":1243,"line":6768},[1241,11159,11160],{"class":1590},"  LoadBalancerSecurityGroup",[1241,11162,1840],{"class":1381},[1241,11164,11165,11167,11169],{"class":1243,"line":6773},[1241,11166,3678],{"class":1590},[1241,11168,1397],{"class":1381},[1241,11170,11171],{"class":1262}," AWS::EC2::SecurityGroup\n",[1241,11173,11174,11176],{"class":1243,"line":6778},[1241,11175,3688],{"class":1590},[1241,11177,1840],{"class":1381},[1241,11179,11180,11183,11185,11187],{"class":1243,"line":6783},[1241,11181,11182],{"class":1590},"      GroupName",[1241,11184,1397],{"class":1381},[1241,11186,10418],{"class":2222},[1241,11188,11189],{"class":1262}," ${Environment}-alb-sg\n",[1241,11191,11193,11196,11198],{"class":1243,"line":11192},118,[1241,11194,11195],{"class":1590},"      GroupDescription",[1241,11197,1397],{"class":1381},[1241,11199,11200],{"class":1262}," Security group for Application Load Balancer\n",[1241,11202,11204,11206,11208,11210],{"class":1243,"line":11203},119,[1241,11205,10452],{"class":1590},[1241,11207,1397],{"class":1381},[1241,11209,10457],{"class":2222},[1241,11211,10460],{"class":1262},[1241,11213,11215,11218],{"class":1243,"line":11214},120,[1241,11216,11217],{"class":1590},"      SecurityGroupIngress",[1241,11219,1840],{"class":1381},[1241,11221,11223,11225,11228,11230],{"class":1243,"line":11222},121,[1241,11224,10400],{"class":1381},[1241,11226,11227],{"class":1590}," IpProtocol",[1241,11229,1397],{"class":1381},[1241,11231,3740],{"class":1262},[1241,11233,11235,11238,11240],{"class":1243,"line":11234},122,[1241,11236,11237],{"class":1590},"          FromPort",[1241,11239,1397],{"class":1381},[1241,11241,3470],{"class":2476},[1241,11243,11245,11248,11250],{"class":1243,"line":11244},123,[1241,11246,11247],{"class":1590},"          ToPort",[1241,11249,1397],{"class":1381},[1241,11251,3470],{"class":2476},[1241,11253,11255,11258,11260],{"class":1243,"line":11254},124,[1241,11256,11257],{"class":1590},"          CidrIp",[1241,11259,1397],{"class":1381},[1241,11261,3769],{"class":1262},[1241,11263,11265,11267,11269,11271],{"class":1243,"line":11264},125,[1241,11266,10400],{"class":1381},[1241,11268,11227],{"class":1590},[1241,11270,1397],{"class":1381},[1241,11272,3740],{"class":1262},[1241,11274,11276,11278,11280],{"class":1243,"line":11275},126,[1241,11277,11237],{"class":1590},[1241,11279,1397],{"class":1381},[1241,11281,3750],{"class":2476},[1241,11283,11285,11287,11289],{"class":1243,"line":11284},127,[1241,11286,11247],{"class":1590},[1241,11288,1397],{"class":1381},[1241,11290,3750],{"class":2476},[1241,11292,11294,11296,11298],{"class":1243,"line":11293},128,[1241,11295,11257],{"class":1590},[1241,11297,1397],{"class":1381},[1241,11299,3769],{"class":1262},[1241,11301,11303],{"class":1243,"line":11302},129,[1241,11304,1303],{"emptyLinePlaceholder":1302},[1241,11306,11308,11311],{"class":1243,"line":11307},130,[1241,11309,11310],{"class":1590},"  WebServerSecurityGroup",[1241,11312,1840],{"class":1381},[1241,11314,11316,11318,11320],{"class":1243,"line":11315},131,[1241,11317,3678],{"class":1590},[1241,11319,1397],{"class":1381},[1241,11321,11171],{"class":1262},[1241,11323,11325,11327],{"class":1243,"line":11324},132,[1241,11326,3688],{"class":1590},[1241,11328,1840],{"class":1381},[1241,11330,11332,11334,11336,11338],{"class":1243,"line":11331},133,[1241,11333,11182],{"class":1590},[1241,11335,1397],{"class":1381},[1241,11337,10418],{"class":2222},[1241,11339,11340],{"class":1262}," ${Environment}-web-sg\n",[1241,11342,11344,11346,11348],{"class":1243,"line":11343},134,[1241,11345,11195],{"class":1590},[1241,11347,1397],{"class":1381},[1241,11349,11350],{"class":1262}," Security group for web servers\n",[1241,11352,11354,11356,11358,11360],{"class":1243,"line":11353},135,[1241,11355,10452],{"class":1590},[1241,11357,1397],{"class":1381},[1241,11359,10457],{"class":2222},[1241,11361,10460],{"class":1262},[1241,11363,11365,11367],{"class":1243,"line":11364},136,[1241,11366,11217],{"class":1590},[1241,11368,1840],{"class":1381},[1241,11370,11372,11374,11376,11378],{"class":1243,"line":11371},137,[1241,11373,10400],{"class":1381},[1241,11375,11227],{"class":1590},[1241,11377,1397],{"class":1381},[1241,11379,3740],{"class":1262},[1241,11381,11383,11385,11387],{"class":1243,"line":11382},138,[1241,11384,11237],{"class":1590},[1241,11386,1397],{"class":1381},[1241,11388,7151],{"class":2476},[1241,11390,11392,11394,11396],{"class":1243,"line":11391},139,[1241,11393,11247],{"class":1590},[1241,11395,1397],{"class":1381},[1241,11397,7151],{"class":2476},[1241,11399,11401,11404,11406,11408],{"class":1243,"line":11400},140,[1241,11402,11403],{"class":1590},"          SourceSecurityGroupId",[1241,11405,1397],{"class":1381},[1241,11407,10457],{"class":2222},[1241,11409,11410],{"class":1262}," LoadBalancerSecurityGroup\n",[1241,11412,11414,11416,11418,11420],{"class":1243,"line":11413},141,[1241,11415,10400],{"class":1381},[1241,11417,11227],{"class":1590},[1241,11419,1397],{"class":1381},[1241,11421,3740],{"class":1262},[1241,11423,11425,11427,11429],{"class":1243,"line":11424},142,[1241,11426,11237],{"class":1590},[1241,11428,1397],{"class":1381},[1241,11430,11431],{"class":2476}," 22\n",[1241,11433,11435,11437,11439],{"class":1243,"line":11434},143,[1241,11436,11247],{"class":1590},[1241,11438,1397],{"class":1381},[1241,11440,11431],{"class":2476},[1241,11442,11444,11446,11448],{"class":1243,"line":11443},144,[1241,11445,11257],{"class":1590},[1241,11447,1397],{"class":1381},[1241,11449,10370],{"class":1262},[1241,11451,11453],{"class":1243,"line":11452},145,[1241,11454,1303],{"emptyLinePlaceholder":1302},[1241,11456,11458,11461],{"class":1243,"line":11457},146,[1241,11459,11460],{"class":1590},"  DatabaseSecurityGroup",[1241,11462,1840],{"class":1381},[1241,11464,11466,11468,11470],{"class":1243,"line":11465},147,[1241,11467,3678],{"class":1590},[1241,11469,1397],{"class":1381},[1241,11471,11171],{"class":1262},[1241,11473,11475,11477],{"class":1243,"line":11474},148,[1241,11476,3688],{"class":1590},[1241,11478,1840],{"class":1381},[1241,11480,11482,11484,11486,11488],{"class":1243,"line":11481},149,[1241,11483,11182],{"class":1590},[1241,11485,1397],{"class":1381},[1241,11487,10418],{"class":2222},[1241,11489,11490],{"class":1262}," ${Environment}-db-sg\n",[1241,11492,11494,11496,11498],{"class":1243,"line":11493},150,[1241,11495,11195],{"class":1590},[1241,11497,1397],{"class":1381},[1241,11499,11500],{"class":1262}," Security group for database\n",[1241,11502,11504,11506,11508,11510],{"class":1243,"line":11503},151,[1241,11505,10452],{"class":1590},[1241,11507,1397],{"class":1381},[1241,11509,10457],{"class":2222},[1241,11511,10460],{"class":1262},[1241,11513,11515,11517],{"class":1243,"line":11514},152,[1241,11516,11217],{"class":1590},[1241,11518,1840],{"class":1381},[1241,11520,11522,11524,11526,11528],{"class":1243,"line":11521},153,[1241,11523,10400],{"class":1381},[1241,11525,11227],{"class":1590},[1241,11527,1397],{"class":1381},[1241,11529,3740],{"class":1262},[1241,11531,11533,11535,11537],{"class":1243,"line":11532},154,[1241,11534,11237],{"class":1590},[1241,11536,1397],{"class":1381},[1241,11538,11539],{"class":2476}," 5432\n",[1241,11541,11543,11545,11547],{"class":1243,"line":11542},155,[1241,11544,11247],{"class":1590},[1241,11546,1397],{"class":1381},[1241,11548,11539],{"class":2476},[1241,11550,11552,11554,11556,11558],{"class":1243,"line":11551},156,[1241,11553,11403],{"class":1590},[1241,11555,1397],{"class":1381},[1241,11557,10457],{"class":2222},[1241,11559,11560],{"class":1262}," WebServerSecurityGroup\n",[1241,11562,11564],{"class":1243,"line":11563},157,[1241,11565,1303],{"emptyLinePlaceholder":1302},[1241,11567,11569],{"class":1243,"line":11568},158,[1241,11570,11571],{"class":1247},"  # RDS Database\n",[1241,11573,11575,11578],{"class":1243,"line":11574},159,[1241,11576,11577],{"class":1590},"  DBSubnetGroup",[1241,11579,1840],{"class":1381},[1241,11581,11583,11585,11587],{"class":1243,"line":11582},160,[1241,11584,3678],{"class":1590},[1241,11586,1397],{"class":1381},[1241,11588,11589],{"class":1262}," AWS::RDS::DBSubnetGroup\n",[1241,11591,11593,11595],{"class":1243,"line":11592},161,[1241,11594,3688],{"class":1590},[1241,11596,1840],{"class":1381},[1241,11598,11600,11603,11605],{"class":1243,"line":11599},162,[1241,11601,11602],{"class":1590},"      DBSubnetGroupDescription",[1241,11604,1397],{"class":1381},[1241,11606,11607],{"class":1262}," Subnet group for RDS database\n",[1241,11609,11611,11614],{"class":1243,"line":11610},163,[1241,11612,11613],{"class":1590},"      SubnetIds",[1241,11615,1840],{"class":1381},[1241,11617,11619,11621,11623],{"class":1243,"line":11618},164,[1241,11620,10400],{"class":1381},[1241,11622,10457],{"class":2222},[1241,11624,11625],{"class":1262}," PrivateSubnet1\n",[1241,11627,11629,11631,11633],{"class":1243,"line":11628},165,[1241,11630,10400],{"class":1381},[1241,11632,10457],{"class":2222},[1241,11634,11635],{"class":1262}," PrivateSubnet2\n",[1241,11637,11639,11641],{"class":1243,"line":11638},166,[1241,11640,10393],{"class":1590},[1241,11642,1840],{"class":1381},[1241,11644,11646,11648,11650,11652],{"class":1243,"line":11645},167,[1241,11647,10400],{"class":1381},[1241,11649,10403],{"class":1590},[1241,11651,1397],{"class":1381},[1241,11653,10408],{"class":1262},[1241,11655,11657,11659,11661,11663],{"class":1243,"line":11656},168,[1241,11658,10413],{"class":1590},[1241,11660,1397],{"class":1381},[1241,11662,10418],{"class":2222},[1241,11664,11665],{"class":1262}," ${Environment}-db-subnet-group\n",[1241,11667,11669],{"class":1243,"line":11668},169,[1241,11670,1303],{"emptyLinePlaceholder":1302},[1241,11672,11674,11677],{"class":1243,"line":11673},170,[1241,11675,11676],{"class":1590},"  Database",[1241,11678,1840],{"class":1381},[1241,11680,11682,11684,11686],{"class":1243,"line":11681},171,[1241,11683,3678],{"class":1590},[1241,11685,1397],{"class":1381},[1241,11687,11688],{"class":1262}," AWS::RDS::DBInstance\n",[1241,11690,11692,11694],{"class":1243,"line":11691},172,[1241,11693,3688],{"class":1590},[1241,11695,1840],{"class":1381},[1241,11697,11699,11702,11704,11706],{"class":1243,"line":11698},173,[1241,11700,11701],{"class":1590},"      DBInstanceIdentifier",[1241,11703,1397],{"class":1381},[1241,11705,10418],{"class":2222},[1241,11707,11708],{"class":1262}," ${Environment}-django-db\n",[1241,11710,11712,11715,11717],{"class":1243,"line":11711},174,[1241,11713,11714],{"class":1590},"      DBInstanceClass",[1241,11716,1397],{"class":1381},[1241,11718,3982],{"class":1262},[1241,11720,11722,11725,11727],{"class":1243,"line":11721},175,[1241,11723,11724],{"class":1590},"      Engine",[1241,11726,1397],{"class":1381},[1241,11728,11729],{"class":1262}," postgres\n",[1241,11731,11733,11736,11738,11740,11743],{"class":1243,"line":11732},176,[1241,11734,11735],{"class":1590},"      EngineVersion",[1241,11737,1397],{"class":1381},[1241,11739,1822],{"class":1258},[1241,11741,11742],{"class":1262},"13.7",[1241,11744,2264],{"class":1258},[1241,11746,11748,11751,11753],{"class":1243,"line":11747},177,[1241,11749,11750],{"class":1590},"      MasterUsername",[1241,11752,1397],{"class":1381},[1241,11754,11729],{"class":1262},[1241,11756,11758,11761,11763,11765],{"class":1243,"line":11757},178,[1241,11759,11760],{"class":1590},"      MasterUserPassword",[1241,11762,1397],{"class":1381},[1241,11764,10457],{"class":2222},[1241,11766,11767],{"class":1262}," DatabasePassword\n",[1241,11769,11771,11774,11776],{"class":1243,"line":11770},179,[1241,11772,11773],{"class":1590},"      AllocatedStorage",[1241,11775,1397],{"class":1381},[1241,11777,3480],{"class":2476},[1241,11779,11781,11784,11786],{"class":1243,"line":11780},180,[1241,11782,11783],{"class":1590},"      StorageType",[1241,11785,1397],{"class":1381},[1241,11787,11788],{"class":1262}," gp2\n",[1241,11790,11792,11795,11797],{"class":1243,"line":11791},181,[1241,11793,11794],{"class":1590},"      StorageEncrypted",[1241,11796,1397],{"class":1381},[1241,11798,3228],{"class":3227},[1241,11800,11802,11805],{"class":1243,"line":11801},182,[1241,11803,11804],{"class":1590},"      VPCSecurityGroups",[1241,11806,1840],{"class":1381},[1241,11808,11810,11812,11814],{"class":1243,"line":11809},183,[1241,11811,10400],{"class":1381},[1241,11813,10457],{"class":2222},[1241,11815,11816],{"class":1262}," DatabaseSecurityGroup\n",[1241,11818,11820,11823,11825,11827],{"class":1243,"line":11819},184,[1241,11821,11822],{"class":1590},"      DBSubnetGroupName",[1241,11824,1397],{"class":1381},[1241,11826,10457],{"class":2222},[1241,11828,11829],{"class":1262}," DBSubnetGroup\n",[1241,11831,11833,11836,11838],{"class":1243,"line":11832},185,[1241,11834,11835],{"class":1590},"      BackupRetentionPeriod",[1241,11837,1397],{"class":1381},[1241,11839,3650],{"class":2476},[1241,11841,11843,11846,11848,11851,11853,11856,11858,11860,11862,11864],{"class":1243,"line":11842},186,[1241,11844,11845],{"class":1590},"      MultiAZ",[1241,11847,1397],{"class":1381},[1241,11849,11850],{"class":2222}," !If",[1241,11852,1598],{"class":1381},[1241,11854,11855],{"class":1262},"IsProduction",[1241,11857,1608],{"class":1381},[1241,11859,4586],{"class":3227},[1241,11861,1608],{"class":1381},[1241,11863,4570],{"class":3227},[1241,11865,1618],{"class":1381},[1241,11867,11869,11872,11874,11876,11878,11880,11882,11884,11886,11888],{"class":1243,"line":11868},187,[1241,11870,11871],{"class":1590},"      DeletionProtection",[1241,11873,1397],{"class":1381},[1241,11875,11850],{"class":2222},[1241,11877,1598],{"class":1381},[1241,11879,11855],{"class":1262},[1241,11881,1608],{"class":1381},[1241,11883,4586],{"class":3227},[1241,11885,1608],{"class":1381},[1241,11887,4570],{"class":3227},[1241,11889,1618],{"class":1381},[1241,11891,11893],{"class":1243,"line":11892},188,[1241,11894,1303],{"emptyLinePlaceholder":1302},[1241,11896,11898],{"class":1243,"line":11897},189,[1241,11899,11900],{"class":1247},"  # ElastiCache Redis\n",[1241,11902,11904,11907],{"class":1243,"line":11903},190,[1241,11905,11906],{"class":1590},"  CacheSubnetGroup",[1241,11908,1840],{"class":1381},[1241,11910,11912,11914,11916],{"class":1243,"line":11911},191,[1241,11913,3678],{"class":1590},[1241,11915,1397],{"class":1381},[1241,11917,11918],{"class":1262}," AWS::ElastiCache::SubnetGroup\n",[1241,11920,11922,11924],{"class":1243,"line":11921},192,[1241,11923,3688],{"class":1590},[1241,11925,1840],{"class":1381},[1241,11927,11929,11932,11934],{"class":1243,"line":11928},193,[1241,11930,11931],{"class":1590},"      Description",[1241,11933,1397],{"class":1381},[1241,11935,11936],{"class":1262}," Subnet group for ElastiCache\n",[1241,11938,11940,11942],{"class":1243,"line":11939},194,[1241,11941,11613],{"class":1590},[1241,11943,1840],{"class":1381},[1241,11945,11947,11949,11951],{"class":1243,"line":11946},195,[1241,11948,10400],{"class":1381},[1241,11950,10457],{"class":2222},[1241,11952,11625],{"class":1262},[1241,11954,11956,11958,11960],{"class":1243,"line":11955},196,[1241,11957,10400],{"class":1381},[1241,11959,10457],{"class":2222},[1241,11961,11635],{"class":1262},[1241,11963,11965],{"class":1243,"line":11964},197,[1241,11966,1303],{"emptyLinePlaceholder":1302},[1241,11968,11970,11973],{"class":1243,"line":11969},198,[1241,11971,11972],{"class":1590},"  CacheCluster",[1241,11974,1840],{"class":1381},[1241,11976,11978,11980,11982],{"class":1243,"line":11977},199,[1241,11979,3678],{"class":1590},[1241,11981,1397],{"class":1381},[1241,11983,11984],{"class":1262}," AWS::ElastiCache::CacheCluster\n",[1241,11986,11988,11990],{"class":1243,"line":11987},200,[1241,11989,3688],{"class":1590},[1241,11991,1840],{"class":1381},[1241,11993,11995,11998,12000],{"class":1243,"line":11994},201,[1241,11996,11997],{"class":1590},"      CacheNodeType",[1241,11999,1397],{"class":1381},[1241,12001,12002],{"class":1262}," cache.t3.micro\n",[1241,12004,12006,12008,12010],{"class":1243,"line":12005},202,[1241,12007,11724],{"class":1590},[1241,12009,1397],{"class":1381},[1241,12011,12012],{"class":1262}," redis\n",[1241,12014,12016,12019,12021],{"class":1243,"line":12015},203,[1241,12017,12018],{"class":1590},"      NumCacheNodes",[1241,12020,1397],{"class":1381},[1241,12022,12023],{"class":2476}," 1\n",[1241,12025,12027,12030,12032,12034],{"class":1243,"line":12026},204,[1241,12028,12029],{"class":1590},"      CacheSubnetGroupName",[1241,12031,1397],{"class":1381},[1241,12033,10457],{"class":2222},[1241,12035,12036],{"class":1262}," CacheSubnetGroup\n",[1241,12038,12040,12043],{"class":1243,"line":12039},205,[1241,12041,12042],{"class":1590},"      VpcSecurityGroupIds",[1241,12044,1840],{"class":1381},[1241,12046,12048,12050,12052],{"class":1243,"line":12047},206,[1241,12049,10400],{"class":1381},[1241,12051,10457],{"class":2222},[1241,12053,12054],{"class":1262}," CacheSecurityGroup\n",[1241,12056,12058],{"class":1243,"line":12057},207,[1241,12059,1303],{"emptyLinePlaceholder":1302},[1241,12061,12063,12066],{"class":1243,"line":12062},208,[1241,12064,12065],{"class":1590},"  CacheSecurityGroup",[1241,12067,1840],{"class":1381},[1241,12069,12071,12073,12075],{"class":1243,"line":12070},209,[1241,12072,3678],{"class":1590},[1241,12074,1397],{"class":1381},[1241,12076,11171],{"class":1262},[1241,12078,12080,12082],{"class":1243,"line":12079},210,[1241,12081,3688],{"class":1590},[1241,12083,1840],{"class":1381},[1241,12085,12087,12089,12091],{"class":1243,"line":12086},211,[1241,12088,11195],{"class":1590},[1241,12090,1397],{"class":1381},[1241,12092,12093],{"class":1262}," Security group for ElastiCache\n",[1241,12095,12097,12099,12101,12103],{"class":1243,"line":12096},212,[1241,12098,10452],{"class":1590},[1241,12100,1397],{"class":1381},[1241,12102,10457],{"class":2222},[1241,12104,10460],{"class":1262},[1241,12106,12108,12110],{"class":1243,"line":12107},213,[1241,12109,11217],{"class":1590},[1241,12111,1840],{"class":1381},[1241,12113,12115,12117,12119,12121],{"class":1243,"line":12114},214,[1241,12116,10400],{"class":1381},[1241,12118,11227],{"class":1590},[1241,12120,1397],{"class":1381},[1241,12122,3740],{"class":1262},[1241,12124,12126,12128,12130],{"class":1243,"line":12125},215,[1241,12127,11237],{"class":1590},[1241,12129,1397],{"class":1381},[1241,12131,12132],{"class":2476}," 6379\n",[1241,12134,12136,12138,12140],{"class":1243,"line":12135},216,[1241,12137,11247],{"class":1590},[1241,12139,1397],{"class":1381},[1241,12141,12132],{"class":2476},[1241,12143,12145,12147,12149,12151],{"class":1243,"line":12144},217,[1241,12146,11403],{"class":1590},[1241,12148,1397],{"class":1381},[1241,12150,10457],{"class":2222},[1241,12152,11560],{"class":1262},[1241,12154,12156],{"class":1243,"line":12155},218,[1241,12157,1303],{"emptyLinePlaceholder":1302},[1241,12159,12161],{"class":1243,"line":12160},219,[1241,12162,12163],{"class":1247},"  # Application Load Balancer\n",[1241,12165,12167,12170],{"class":1243,"line":12166},220,[1241,12168,12169],{"class":1590},"  LoadBalancer",[1241,12171,1840],{"class":1381},[1241,12173,12175,12177,12179],{"class":1243,"line":12174},221,[1241,12176,3678],{"class":1590},[1241,12178,1397],{"class":1381},[1241,12180,12181],{"class":1262}," AWS::ElasticLoadBalancingV2::LoadBalancer\n",[1241,12183,12185,12187],{"class":1243,"line":12184},222,[1241,12186,3688],{"class":1590},[1241,12188,1840],{"class":1381},[1241,12190,12192,12195,12197,12199],{"class":1243,"line":12191},223,[1241,12193,12194],{"class":1590},"      Name",[1241,12196,1397],{"class":1381},[1241,12198,10418],{"class":2222},[1241,12200,12201],{"class":1262}," ${Environment}-django-alb\n",[1241,12203,12205,12208,12210],{"class":1243,"line":12204},224,[1241,12206,12207],{"class":1590},"      Scheme",[1241,12209,1397],{"class":1381},[1241,12211,12212],{"class":1262}," internet-facing\n",[1241,12214,12216,12219],{"class":1243,"line":12215},225,[1241,12217,12218],{"class":1590},"      SecurityGroups",[1241,12220,1840],{"class":1381},[1241,12222,12224,12226,12228],{"class":1243,"line":12223},226,[1241,12225,10400],{"class":1381},[1241,12227,10457],{"class":2222},[1241,12229,11410],{"class":1262},[1241,12231,12233,12236],{"class":1243,"line":12232},227,[1241,12234,12235],{"class":1590},"      Subnets",[1241,12237,1840],{"class":1381},[1241,12239,12241,12243,12245],{"class":1243,"line":12240},228,[1241,12242,10400],{"class":1381},[1241,12244,10457],{"class":2222},[1241,12246,11100],{"class":1262},[1241,12248,12250,12252,12254],{"class":1243,"line":12249},229,[1241,12251,10400],{"class":1381},[1241,12253,10457],{"class":2222},[1241,12255,11146],{"class":1262},[1241,12257,12259],{"class":1243,"line":12258},230,[1241,12260,1303],{"emptyLinePlaceholder":1302},[1241,12262,12264,12267],{"class":1243,"line":12263},231,[1241,12265,12266],{"class":1590},"  TargetGroup",[1241,12268,1840],{"class":1381},[1241,12270,12272,12274,12276],{"class":1243,"line":12271},232,[1241,12273,3678],{"class":1590},[1241,12275,1397],{"class":1381},[1241,12277,12278],{"class":1262}," AWS::ElasticLoadBalancingV2::TargetGroup\n",[1241,12280,12282,12284],{"class":1243,"line":12281},233,[1241,12283,3688],{"class":1590},[1241,12285,1840],{"class":1381},[1241,12287,12289,12291,12293,12295],{"class":1243,"line":12288},234,[1241,12290,12194],{"class":1590},[1241,12292,1397],{"class":1381},[1241,12294,10418],{"class":2222},[1241,12296,12297],{"class":1262}," ${Environment}-django-tg\n",[1241,12299,12301,12304,12306],{"class":1243,"line":12300},235,[1241,12302,12303],{"class":1590},"      Port",[1241,12305,1397],{"class":1381},[1241,12307,7151],{"class":2476},[1241,12309,12311,12314,12316],{"class":1243,"line":12310},236,[1241,12312,12313],{"class":1590},"      Protocol",[1241,12315,1397],{"class":1381},[1241,12317,12318],{"class":1262}," HTTP\n",[1241,12320,12322,12324,12326,12328],{"class":1243,"line":12321},237,[1241,12323,10452],{"class":1590},[1241,12325,1397],{"class":1381},[1241,12327,10457],{"class":2222},[1241,12329,10460],{"class":1262},[1241,12331,12333,12336,12338],{"class":1243,"line":12332},238,[1241,12334,12335],{"class":1590},"      HealthCheckPath",[1241,12337,1397],{"class":1381},[1241,12339,3614],{"class":1262},[1241,12341,12343,12346,12348],{"class":1243,"line":12342},239,[1241,12344,12345],{"class":1590},"      HealthCheckProtocol",[1241,12347,1397],{"class":1381},[1241,12349,12318],{"class":1262},[1241,12351,12353,12356,12358],{"class":1243,"line":12352},240,[1241,12354,12355],{"class":1590},"      HealthCheckIntervalSeconds",[1241,12357,1397],{"class":1381},[1241,12359,12360],{"class":2476}," 30\n",[1241,12362,12364,12367,12369],{"class":1243,"line":12363},241,[1241,12365,12366],{"class":1590},"      HealthCheckTimeoutSeconds",[1241,12368,1397],{"class":1381},[1241,12370,12371],{"class":2476}," 5\n",[1241,12373,12375,12378,12380],{"class":1243,"line":12374},242,[1241,12376,12377],{"class":1590},"      HealthyThresholdCount",[1241,12379,1397],{"class":1381},[1241,12381,3413],{"class":2476},[1241,12383,12385,12388,12390],{"class":1243,"line":12384},243,[1241,12386,12387],{"class":1590},"      UnhealthyThresholdCount",[1241,12389,1397],{"class":1381},[1241,12391,12392],{"class":2476}," 3\n",[1241,12394,12396],{"class":1243,"line":12395},244,[1241,12397,1303],{"emptyLinePlaceholder":1302},[1241,12399,12401,12404],{"class":1243,"line":12400},245,[1241,12402,12403],{"class":1590},"  LoadBalancerListener",[1241,12405,1840],{"class":1381},[1241,12407,12409,12411,12413],{"class":1243,"line":12408},246,[1241,12410,3678],{"class":1590},[1241,12412,1397],{"class":1381},[1241,12414,12415],{"class":1262}," AWS::ElasticLoadBalancingV2::Listener\n",[1241,12417,12419,12421],{"class":1243,"line":12418},247,[1241,12420,3688],{"class":1590},[1241,12422,1840],{"class":1381},[1241,12424,12426,12429],{"class":1243,"line":12425},248,[1241,12427,12428],{"class":1590},"      DefaultActions",[1241,12430,1840],{"class":1381},[1241,12432,12434,12436,12439,12441],{"class":1243,"line":12433},249,[1241,12435,10400],{"class":1381},[1241,12437,12438],{"class":1590}," Type",[1241,12440,1397],{"class":1381},[1241,12442,12443],{"class":1262}," forward\n",[1241,12445,12447,12450,12452,12454],{"class":1243,"line":12446},250,[1241,12448,12449],{"class":1590},"          TargetGroupArn",[1241,12451,1397],{"class":1381},[1241,12453,10457],{"class":2222},[1241,12455,12456],{"class":1262}," TargetGroup\n",[1241,12458,12460,12463,12465,12467],{"class":1243,"line":12459},251,[1241,12461,12462],{"class":1590},"      LoadBalancerArn",[1241,12464,1397],{"class":1381},[1241,12466,10457],{"class":2222},[1241,12468,12469],{"class":1262}," LoadBalancer\n",[1241,12471,12473,12475,12477],{"class":1243,"line":12472},252,[1241,12474,12303],{"class":1590},[1241,12476,1397],{"class":1381},[1241,12478,3470],{"class":2476},[1241,12480,12482,12484,12486],{"class":1243,"line":12481},253,[1241,12483,12313],{"class":1590},[1241,12485,1397],{"class":1381},[1241,12487,12318],{"class":1262},[1241,12489,12491],{"class":1243,"line":12490},254,[1241,12492,1303],{"emptyLinePlaceholder":1302},[1241,12494,12496],{"class":1243,"line":12495},255,[1241,12497,12498],{"class":1247},"  # Auto Scaling Group\n",[1241,12500,12502,12505],{"class":1243,"line":12501},256,[1241,12503,12504],{"class":1590},"  LaunchTemplate",[1241,12506,1840],{"class":1381},[1241,12508,12510,12512,12514],{"class":1243,"line":12509},257,[1241,12511,3678],{"class":1590},[1241,12513,1397],{"class":1381},[1241,12515,12516],{"class":1262}," AWS::EC2::LaunchTemplate\n",[1241,12518,12520,12522],{"class":1243,"line":12519},258,[1241,12521,3688],{"class":1590},[1241,12523,1840],{"class":1381},[1241,12525,12527,12530,12532,12534],{"class":1243,"line":12526},259,[1241,12528,12529],{"class":1590},"      LaunchTemplateName",[1241,12531,1397],{"class":1381},[1241,12533,10418],{"class":2222},[1241,12535,12536],{"class":1262}," ${Environment}-django-lt\n",[1241,12538,12540,12543],{"class":1243,"line":12539},260,[1241,12541,12542],{"class":1590},"      LaunchTemplateData",[1241,12544,1840],{"class":1381},[1241,12546,12548,12551,12553,12556],{"class":1243,"line":12547},261,[1241,12549,12550],{"class":1590},"        ImageId",[1241,12552,1397],{"class":1381},[1241,12554,12555],{"class":1262}," ami-0c02fb55956c7d316",[1241,12557,12558],{"class":1247},"  # Amazon Linux 2\n",[1241,12560,12562,12565,12567,12569],{"class":1243,"line":12561},262,[1241,12563,12564],{"class":1590},"        InstanceType",[1241,12566,1397],{"class":1381},[1241,12568,10457],{"class":2222},[1241,12570,12571],{"class":1262}," InstanceType\n",[1241,12573,12575,12578],{"class":1243,"line":12574},263,[1241,12576,12577],{"class":1590},"        SecurityGroupIds",[1241,12579,1840],{"class":1381},[1241,12581,12583,12586,12588],{"class":1243,"line":12582},264,[1241,12584,12585],{"class":1381},"          -",[1241,12587,10457],{"class":2222},[1241,12589,11560],{"class":1262},[1241,12591,12593,12596],{"class":1243,"line":12592},265,[1241,12594,12595],{"class":1590},"        IamInstanceProfile",[1241,12597,1840],{"class":1381},[1241,12599,12601,12604,12606,12609],{"class":1243,"line":12600},266,[1241,12602,12603],{"class":1590},"          Arn",[1241,12605,1397],{"class":1381},[1241,12607,12608],{"class":2222}," !GetAtt",[1241,12610,12611],{"class":1262}," InstanceProfile.Arn\n",[1241,12613,12615,12618],{"class":1243,"line":12614},267,[1241,12616,12617],{"class":1590},"        UserData",[1241,12619,1840],{"class":1381},[1241,12621,12623,12626,12628,12630],{"class":1243,"line":12622},268,[1241,12624,12625],{"class":1590},"          Fn::Base64",[1241,12627,1397],{"class":1381},[1241,12629,10418],{"class":2222},[1241,12631,12632],{"class":1688}," |\n",[1241,12634,12636],{"class":1243,"line":12635},269,[1241,12637,12638],{"class":1262},"            #!/bin/bash\n",[1241,12640,12642],{"class":1243,"line":12641},270,[1241,12643,12644],{"class":1262},"            yum update -y\n",[1241,12646,12648],{"class":1243,"line":12647},271,[1241,12649,12650],{"class":1262},"            yum install -y docker\n",[1241,12652,12654],{"class":1243,"line":12653},272,[1241,12655,12656],{"class":1262},"            service docker start\n",[1241,12658,12660],{"class":1243,"line":12659},273,[1241,12661,12662],{"class":1262},"            usermod -a -G docker ec2-user\n",[1241,12664,12666],{"class":1243,"line":12665},274,[1241,12667,12668],{"class":1262},"            \n",[1241,12670,12672],{"class":1243,"line":12671},275,[1241,12673,12674],{"class":1262},"            # Install Docker Compose\n",[1241,12676,12678],{"class":1243,"line":12677},276,[1241,12679,12680],{"class":1262},"            curl -L \"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\n",[1241,12682,12684],{"class":1243,"line":12683},277,[1241,12685,12686],{"class":1262},"            chmod +x /usr/local/bin/docker-compose\n",[1241,12688,12690],{"class":1243,"line":12689},278,[1241,12691,12668],{"class":1262},[1241,12693,12695],{"class":1243,"line":12694},279,[1241,12696,12697],{"class":1262},"            # Deploy application\n",[1241,12699,12701],{"class":1243,"line":12700},280,[1241,12702,12703],{"class":1262},"            mkdir -p /opt/django_app\n",[1241,12705,12707],{"class":1243,"line":12706},281,[1241,12708,12709],{"class":1262},"            cd /opt/django_app\n",[1241,12711,12713],{"class":1243,"line":12712},282,[1241,12714,12668],{"class":1262},[1241,12716,12718],{"class":1243,"line":12717},283,[1241,12719,12720],{"class":1262},"            # Create environment file\n",[1241,12722,12724],{"class":1243,"line":12723},284,[1241,12725,12726],{"class":1262},"            cat > .env \u003C\u003C EOF\n",[1241,12728,12730],{"class":1243,"line":12729},285,[1241,12731,12732],{"class":1262},"            DJANGO_SETTINGS_MODULE=myproject.settings.production\n",[1241,12734,12736],{"class":1243,"line":12735},286,[1241,12737,12738],{"class":1262},"            DATABASE_URL=postgresql://postgres:${DatabasePassword}@${Database.Endpoint.Address}:5432/postgres\n",[1241,12740,12742],{"class":1243,"line":12741},287,[1241,12743,12744],{"class":1262},"            REDIS_URL=redis://${CacheCluster.RedisEndpoint.Address}:6379/1\n",[1241,12746,12748],{"class":1243,"line":12747},288,[1241,12749,12750],{"class":1262},"            EOF\n",[1241,12752,12754],{"class":1243,"line":12753},289,[1241,12755,12668],{"class":1262},[1241,12757,12759],{"class":1243,"line":12758},290,[1241,12760,12761],{"class":1262},"            # Pull and run application\n",[1241,12763,12765],{"class":1243,"line":12764},291,[1241,12766,12767],{"class":1262},"            docker run -d --name django-app \\\n",[1241,12769,12771],{"class":1243,"line":12770},292,[1241,12772,12773],{"class":1262},"              --env-file .env \\\n",[1241,12775,12777],{"class":1243,"line":12776},293,[1241,12778,12779],{"class":1262},"              -p 8000:8000 \\\n",[1241,12781,12783],{"class":1243,"line":12782},294,[1241,12784,12785],{"class":1262},"              123456789012.dkr.ecr.us-east-1.amazonaws.com/django-app:latest\n",[1241,12787,12789],{"class":1243,"line":12788},295,[1241,12790,1303],{"emptyLinePlaceholder":1302},[1241,12792,12794,12797],{"class":1243,"line":12793},296,[1241,12795,12796],{"class":1590},"  AutoScalingGroup",[1241,12798,1840],{"class":1381},[1241,12800,12802,12804,12806],{"class":1243,"line":12801},297,[1241,12803,3678],{"class":1590},[1241,12805,1397],{"class":1381},[1241,12807,12808],{"class":1262}," AWS::AutoScaling::AutoScalingGroup\n",[1241,12810,12812,12814],{"class":1243,"line":12811},298,[1241,12813,3688],{"class":1590},[1241,12815,1840],{"class":1381},[1241,12817,12819,12822,12824,12826],{"class":1243,"line":12818},299,[1241,12820,12821],{"class":1590},"      AutoScalingGroupName",[1241,12823,1397],{"class":1381},[1241,12825,10418],{"class":2222},[1241,12827,12828],{"class":1262}," ${Environment}-django-asg\n",[1241,12830,12832,12835],{"class":1243,"line":12831},300,[1241,12833,12834],{"class":1590},"      VPCZoneIdentifier",[1241,12836,1840],{"class":1381},[1241,12838,12840,12842,12844],{"class":1243,"line":12839},301,[1241,12841,10400],{"class":1381},[1241,12843,10457],{"class":2222},[1241,12845,11625],{"class":1262},[1241,12847,12849,12851,12853],{"class":1243,"line":12848},302,[1241,12850,10400],{"class":1381},[1241,12852,10457],{"class":2222},[1241,12854,11635],{"class":1262},[1241,12856,12858,12861],{"class":1243,"line":12857},303,[1241,12859,12860],{"class":1590},"      LaunchTemplate",[1241,12862,1840],{"class":1381},[1241,12864,12866,12869,12871,12873],{"class":1243,"line":12865},304,[1241,12867,12868],{"class":1590},"        LaunchTemplateId",[1241,12870,1397],{"class":1381},[1241,12872,10457],{"class":2222},[1241,12874,12875],{"class":1262}," LaunchTemplate\n",[1241,12877,12879,12882,12884,12886],{"class":1243,"line":12878},305,[1241,12880,12881],{"class":1590},"        Version",[1241,12883,1397],{"class":1381},[1241,12885,12608],{"class":2222},[1241,12887,12888],{"class":1262}," LaunchTemplate.LatestVersionNumber\n",[1241,12890,12892,12895,12897],{"class":1243,"line":12891},306,[1241,12893,12894],{"class":1590},"      MinSize",[1241,12896,1397],{"class":1381},[1241,12898,12023],{"class":2476},[1241,12900,12902,12905,12907],{"class":1243,"line":12901},307,[1241,12903,12904],{"class":1590},"      MaxSize",[1241,12906,1397],{"class":1381},[1241,12908,12909],{"class":2476}," 4\n",[1241,12911,12913,12916,12918],{"class":1243,"line":12912},308,[1241,12914,12915],{"class":1590},"      DesiredCapacity",[1241,12917,1397],{"class":1381},[1241,12919,3413],{"class":2476},[1241,12921,12923,12926],{"class":1243,"line":12922},309,[1241,12924,12925],{"class":1590},"      TargetGroupARNs",[1241,12927,1840],{"class":1381},[1241,12929,12931,12933,12935],{"class":1243,"line":12930},310,[1241,12932,10400],{"class":1381},[1241,12934,10457],{"class":2222},[1241,12936,12456],{"class":1262},[1241,12938,12940,12943,12945],{"class":1243,"line":12939},311,[1241,12941,12942],{"class":1590},"      HealthCheckType",[1241,12944,1397],{"class":1381},[1241,12946,12947],{"class":1262}," ELB\n",[1241,12949,12951,12954,12956],{"class":1243,"line":12950},312,[1241,12952,12953],{"class":1590},"      HealthCheckGracePeriod",[1241,12955,1397],{"class":1381},[1241,12957,3433],{"class":2476},[1241,12959,12961],{"class":1243,"line":12960},313,[1241,12962,1303],{"emptyLinePlaceholder":1302},[1241,12964,12966],{"class":1243,"line":12965},314,[1241,12967,12968],{"class":1247},"  # IAM Roles\n",[1241,12970,12972,12975],{"class":1243,"line":12971},315,[1241,12973,12974],{"class":1590},"  InstanceRole",[1241,12976,1840],{"class":1381},[1241,12978,12980,12982,12984],{"class":1243,"line":12979},316,[1241,12981,3678],{"class":1590},[1241,12983,1397],{"class":1381},[1241,12985,12986],{"class":1262}," AWS::IAM::Role\n",[1241,12988,12990,12992],{"class":1243,"line":12989},317,[1241,12991,3688],{"class":1590},[1241,12993,1840],{"class":1381},[1241,12995,12997,13000],{"class":1243,"line":12996},318,[1241,12998,12999],{"class":1590},"      AssumeRolePolicyDocument",[1241,13001,1840],{"class":1381},[1241,13003,13005,13007,13009,13011,13013],{"class":1243,"line":13004},319,[1241,13006,12881],{"class":1590},[1241,13008,1397],{"class":1381},[1241,13010,1822],{"class":1258},[1241,13012,1402],{"class":1262},[1241,13014,2264],{"class":1258},[1241,13016,13018,13021],{"class":1243,"line":13017},320,[1241,13019,13020],{"class":1590},"        Statement",[1241,13022,1840],{"class":1381},[1241,13024,13026,13028,13031,13033],{"class":1243,"line":13025},321,[1241,13027,12585],{"class":1381},[1241,13029,13030],{"class":1590}," Effect",[1241,13032,1397],{"class":1381},[1241,13034,13035],{"class":1262}," Allow\n",[1241,13037,13039,13042],{"class":1243,"line":13038},322,[1241,13040,13041],{"class":1590},"            Principal",[1241,13043,1840],{"class":1381},[1241,13045,13047,13050,13052],{"class":1243,"line":13046},323,[1241,13048,13049],{"class":1590},"              Service",[1241,13051,1397],{"class":1381},[1241,13053,13054],{"class":1262}," ec2.amazonaws.com\n",[1241,13056,13058,13061,13063],{"class":1243,"line":13057},324,[1241,13059,13060],{"class":1590},"            Action",[1241,13062,1397],{"class":1381},[1241,13064,13065],{"class":1262}," sts:AssumeRole\n",[1241,13067,13069,13072],{"class":1243,"line":13068},325,[1241,13070,13071],{"class":1590},"      ManagedPolicyArns",[1241,13073,1840],{"class":1381},[1241,13075,13077,13079],{"class":1243,"line":13076},326,[1241,13078,10400],{"class":1381},[1241,13080,13081],{"class":1262}," arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy\n",[1241,13083,13085,13087],{"class":1243,"line":13084},327,[1241,13086,10400],{"class":1381},[1241,13088,13089],{"class":1262}," arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly\n",[1241,13091,13093],{"class":1243,"line":13092},328,[1241,13094,1303],{"emptyLinePlaceholder":1302},[1241,13096,13098,13101],{"class":1243,"line":13097},329,[1241,13099,13100],{"class":1590},"  InstanceProfile",[1241,13102,1840],{"class":1381},[1241,13104,13106,13108,13110],{"class":1243,"line":13105},330,[1241,13107,3678],{"class":1590},[1241,13109,1397],{"class":1381},[1241,13111,13112],{"class":1262}," AWS::IAM::InstanceProfile\n",[1241,13114,13116,13118],{"class":1243,"line":13115},331,[1241,13117,3688],{"class":1590},[1241,13119,1840],{"class":1381},[1241,13121,13123,13126],{"class":1243,"line":13122},332,[1241,13124,13125],{"class":1590},"      Roles",[1241,13127,1840],{"class":1381},[1241,13129,13131,13133,13135],{"class":1243,"line":13130},333,[1241,13132,10400],{"class":1381},[1241,13134,10457],{"class":2222},[1241,13136,13137],{"class":1262}," InstanceRole\n",[1241,13139,13141],{"class":1243,"line":13140},334,[1241,13142,1303],{"emptyLinePlaceholder":1302},[1241,13144,13146,13149],{"class":1243,"line":13145},335,[1241,13147,13148],{"class":1590},"Conditions",[1241,13150,1840],{"class":1381},[1241,13152,13154,13157,13159,13162,13164,13167,13170,13172,13174],{"class":1243,"line":13153},336,[1241,13155,13156],{"class":1590},"  IsProduction",[1241,13158,1397],{"class":1381},[1241,13160,13161],{"class":2222}," !Equals",[1241,13163,1598],{"class":1381},[1241,13165,13166],{"class":2222},"!Ref",[1241,13168,13169],{"class":1262}," Environment",[1241,13171,1608],{"class":1381},[1241,13173,3970],{"class":1262},[1241,13175,1618],{"class":1381},[1241,13177,13179],{"class":1243,"line":13178},337,[1241,13180,1303],{"emptyLinePlaceholder":1302},[1241,13182,13184,13186],{"class":1243,"line":13183},338,[1241,13185,10222],{"class":1590},[1241,13187,1840],{"class":1381},[1241,13189,13191,13194],{"class":1243,"line":13190},339,[1241,13192,13193],{"class":1590},"  DatabasePassword",[1241,13195,1840],{"class":1381},[1241,13197,13199,13201,13203],{"class":1243,"line":13198},340,[1241,13200,3678],{"class":1590},[1241,13202,1397],{"class":1381},[1241,13204,10240],{"class":1262},[1241,13206,13208,13211,13213],{"class":1243,"line":13207},341,[1241,13209,13210],{"class":1590},"    NoEcho",[1241,13212,1397],{"class":1381},[1241,13214,3228],{"class":3227},[1241,13216,13218,13221,13223],{"class":1243,"line":13217},342,[1241,13219,13220],{"class":1590},"    Description",[1241,13222,1397],{"class":1381},[1241,13224,13225],{"class":1262}," Password for the RDS database\n",[1241,13227,13229],{"class":1243,"line":13228},343,[1241,13230,1303],{"emptyLinePlaceholder":1302},[1241,13232,13234,13237],{"class":1243,"line":13233},344,[1241,13235,13236],{"class":1590},"Outputs",[1241,13238,1840],{"class":1381},[1241,13240,13242,13245],{"class":1243,"line":13241},345,[1241,13243,13244],{"class":1590},"  LoadBalancerDNS",[1241,13246,1840],{"class":1381},[1241,13248,13250,13252,13254],{"class":1243,"line":13249},346,[1241,13251,13220],{"class":1590},[1241,13253,1397],{"class":1381},[1241,13255,13256],{"class":1262}," DNS name of the load balancer\n",[1241,13258,13260,13263,13265,13267],{"class":1243,"line":13259},347,[1241,13261,13262],{"class":1590},"    Value",[1241,13264,1397],{"class":1381},[1241,13266,12608],{"class":2222},[1241,13268,13269],{"class":1262}," LoadBalancer.DNSName\n",[1241,13271,13273,13276],{"class":1243,"line":13272},348,[1241,13274,13275],{"class":1590},"    Export",[1241,13277,1840],{"class":1381},[1241,13279,13281,13283,13285,13287],{"class":1243,"line":13280},349,[1241,13282,12194],{"class":1590},[1241,13284,1397],{"class":1381},[1241,13286,10418],{"class":2222},[1241,13288,13289],{"class":1262}," ${Environment}-LoadBalancerDNS\n",[1241,13291,13293],{"class":1243,"line":13292},350,[1241,13294,1303],{"emptyLinePlaceholder":1302},[1241,13296,13298,13301],{"class":1243,"line":13297},351,[1241,13299,13300],{"class":1590},"  DatabaseEndpoint",[1241,13302,1840],{"class":1381},[1241,13304,13306,13308,13310],{"class":1243,"line":13305},352,[1241,13307,13220],{"class":1590},[1241,13309,1397],{"class":1381},[1241,13311,13312],{"class":1262}," RDS database endpoint\n",[1241,13314,13316,13318,13320,13322],{"class":1243,"line":13315},353,[1241,13317,13262],{"class":1590},[1241,13319,1397],{"class":1381},[1241,13321,12608],{"class":2222},[1241,13323,13324],{"class":1262}," Database.Endpoint.Address\n",[1241,13326,13328,13330],{"class":1243,"line":13327},354,[1241,13329,13275],{"class":1590},[1241,13331,1840],{"class":1381},[1241,13333,13335,13337,13339,13341],{"class":1243,"line":13334},355,[1241,13336,12194],{"class":1590},[1241,13338,1397],{"class":1381},[1241,13340,10418],{"class":2222},[1241,13342,13343],{"class":1262}," ${Environment}-DatabaseEndpoint\n",[1030,13345,13347],{"id":13346},"google-cloud-platform-gcp","Google Cloud Platform (GCP)",[1026,13349,13350],{},"Google Cloud Platform offers robust services for Django deployment including App Engine (PaaS), Cloud Run (serverless containers), and Google Kubernetes Engine (GKE). GCP is known for its strong data analytics, machine learning capabilities, and global network infrastructure.",[1035,13352,13354],{"id":13353},"gcp-account-setup-and-authentication","GCP Account Setup and Authentication",[1026,13356,13357],{},[1042,13358,13359],{},"Initial Setup",[1128,13361,13363],{"className":1235,"code":13362,"language":1237,"meta":1137,"style":1137},"# Install Google Cloud SDK\ncurl https://sdk.cloud.google.com | bash\nexec -l $SHELL\n\n# Initialize gcloud\ngcloud init\n\n# Set default project and region\ngcloud config set project your-project-id\ngcloud config set compute/region us-central1\ngcloud config set compute/zone us-central1-a\n\n# Enable required APIs\ngcloud services enable appengine.googleapis.com\ngcloud services enable cloudbuild.googleapis.com\ngcloud services enable cloudrun.googleapis.com\ngcloud services enable container.googleapis.com\ngcloud services enable sqladmin.googleapis.com\ngcloud services enable redis.googleapis.com\n\n# Create service account for deployment\ngcloud iam service-accounts create django-deploy \\\n    --display-name=\"Django Deployment Service Account\"\n\n# Grant necessary permissions\ngcloud projects add-iam-policy-binding your-project-id \\\n    --member=\"serviceAccount:django-deploy@your-project-id.iam.gserviceaccount.com\" \\\n    --role=\"roles/appengine.appAdmin\"\n\ngcloud projects add-iam-policy-binding your-project-id \\\n    --member=\"serviceAccount:django-deploy@your-project-id.iam.gserviceaccount.com\" \\\n    --role=\"roles/cloudsql.client\"\n\n# Create and download service account key\ngcloud iam service-accounts keys create django-deploy-key.json \\\n    --iam-account=django-deploy@your-project-id.iam.gserviceaccount.com\n",[1135,13364,13365,13370,13382,13393,13397,13402,13410,13414,13419,13435,13449,13463,13467,13472,13485,13496,13507,13518,13529,13540,13544,13549,13566,13578,13582,13587,13602,13616,13628,13632,13644,13656,13667,13671,13676,13694],{"__ignoreMap":1137},[1241,13366,13367],{"class":1243,"line":1244},[1241,13368,13369],{"class":1247},"# Install Google Cloud SDK\n",[1241,13371,13372,13374,13377,13379],{"class":1243,"line":1251},[1241,13373,1255],{"class":1254},[1241,13375,13376],{"class":1262}," https://sdk.cloud.google.com",[1241,13378,7629],{"class":1709},[1241,13380,13381],{"class":1254}," bash\n",[1241,13383,13384,13387,13390],{"class":1243,"line":1281},[1241,13385,13386],{"class":7405},"exec",[1241,13388,13389],{"class":1269}," -l",[1241,13391,13392],{"class":7423}," $SHELL\n",[1241,13394,13395],{"class":1243,"line":1290},[1241,13396,1303],{"emptyLinePlaceholder":1302},[1241,13398,13399],{"class":1243,"line":1299},[1241,13400,13401],{"class":1247},"# Initialize gcloud\n",[1241,13403,13404,13407],{"class":1243,"line":1306},[1241,13405,13406],{"class":1254},"gcloud",[1241,13408,13409],{"class":1262}," init\n",[1241,13411,13412],{"class":1243,"line":1312},[1241,13413,1303],{"emptyLinePlaceholder":1302},[1241,13415,13416],{"class":1243,"line":1321},[1241,13417,13418],{"class":1247},"# Set default project and region\n",[1241,13420,13421,13423,13426,13429,13432],{"class":1243,"line":1327},[1241,13422,13406],{"class":1254},[1241,13424,13425],{"class":1262}," config",[1241,13427,13428],{"class":1262}," set",[1241,13430,13431],{"class":1262}," project",[1241,13433,13434],{"class":1262}," your-project-id\n",[1241,13436,13437,13439,13441,13443,13446],{"class":1243,"line":1333},[1241,13438,13406],{"class":1254},[1241,13440,13425],{"class":1262},[1241,13442,13428],{"class":1262},[1241,13444,13445],{"class":1262}," compute/region",[1241,13447,13448],{"class":1262}," us-central1\n",[1241,13450,13451,13453,13455,13457,13460],{"class":1243,"line":1339},[1241,13452,13406],{"class":1254},[1241,13454,13425],{"class":1262},[1241,13456,13428],{"class":1262},[1241,13458,13459],{"class":1262}," compute/zone",[1241,13461,13462],{"class":1262}," us-central1-a\n",[1241,13464,13465],{"class":1243,"line":1345},[1241,13466,1303],{"emptyLinePlaceholder":1302},[1241,13468,13469],{"class":1243,"line":1350},[1241,13470,13471],{"class":1247},"# Enable required APIs\n",[1241,13473,13474,13476,13479,13482],{"class":1243,"line":1356},[1241,13475,13406],{"class":1254},[1241,13477,13478],{"class":1262}," services",[1241,13480,13481],{"class":1262}," enable",[1241,13483,13484],{"class":1262}," appengine.googleapis.com\n",[1241,13486,13487,13489,13491,13493],{"class":1243,"line":1554},[1241,13488,13406],{"class":1254},[1241,13490,13478],{"class":1262},[1241,13492,13481],{"class":1262},[1241,13494,13495],{"class":1262}," cloudbuild.googleapis.com\n",[1241,13497,13498,13500,13502,13504],{"class":1243,"line":1569},[1241,13499,13406],{"class":1254},[1241,13501,13478],{"class":1262},[1241,13503,13481],{"class":1262},[1241,13505,13506],{"class":1262}," cloudrun.googleapis.com\n",[1241,13508,13509,13511,13513,13515],{"class":1243,"line":1584},[1241,13510,13406],{"class":1254},[1241,13512,13478],{"class":1262},[1241,13514,13481],{"class":1262},[1241,13516,13517],{"class":1262}," container.googleapis.com\n",[1241,13519,13520,13522,13524,13526],{"class":1243,"line":1621},[1241,13521,13406],{"class":1254},[1241,13523,13478],{"class":1262},[1241,13525,13481],{"class":1262},[1241,13527,13528],{"class":1262}," sqladmin.googleapis.com\n",[1241,13530,13531,13533,13535,13537],{"class":1243,"line":1627},[1241,13532,13406],{"class":1254},[1241,13534,13478],{"class":1262},[1241,13536,13481],{"class":1262},[1241,13538,13539],{"class":1262}," redis.googleapis.com\n",[1241,13541,13542],{"class":1243,"line":1633},[1241,13543,1303],{"emptyLinePlaceholder":1302},[1241,13545,13546],{"class":1243,"line":1639},[1241,13547,13548],{"class":1247},"# Create service account for deployment\n",[1241,13550,13551,13553,13556,13559,13561,13564],{"class":1243,"line":1645},[1241,13552,13406],{"class":1254},[1241,13554,13555],{"class":1262}," iam",[1241,13557,13558],{"class":1262}," service-accounts",[1241,13560,3967],{"class":1262},[1241,13562,13563],{"class":1262}," django-deploy",[1241,13565,7890],{"class":1724},[1241,13567,13568,13571,13573,13576],{"class":1243,"line":2028},[1241,13569,13570],{"class":1269},"    --display-name=",[1241,13572,1266],{"class":1258},[1241,13574,13575],{"class":1262},"Django Deployment Service Account",[1241,13577,1278],{"class":1258},[1241,13579,13580],{"class":1243,"line":2042},[1241,13581,1303],{"emptyLinePlaceholder":1302},[1241,13583,13584],{"class":1243,"line":2064},[1241,13585,13586],{"class":1247},"# Grant necessary permissions\n",[1241,13588,13589,13591,13594,13597,13600],{"class":1243,"line":2070},[1241,13590,13406],{"class":1254},[1241,13592,13593],{"class":1262}," projects",[1241,13595,13596],{"class":1262}," add-iam-policy-binding",[1241,13598,13599],{"class":1262}," your-project-id",[1241,13601,7890],{"class":1724},[1241,13603,13604,13607,13609,13612,13614],{"class":1243,"line":2075},[1241,13605,13606],{"class":1269},"    --member=",[1241,13608,1266],{"class":1258},[1241,13610,13611],{"class":1262},"serviceAccount:django-deploy@your-project-id.iam.gserviceaccount.com",[1241,13613,1266],{"class":1258},[1241,13615,7890],{"class":1724},[1241,13617,13618,13621,13623,13626],{"class":1243,"line":2080},[1241,13619,13620],{"class":1269},"    --role=",[1241,13622,1266],{"class":1258},[1241,13624,13625],{"class":1262},"roles/appengine.appAdmin",[1241,13627,1278],{"class":1258},[1241,13629,13630],{"class":1243,"line":2085},[1241,13631,1303],{"emptyLinePlaceholder":1302},[1241,13633,13634,13636,13638,13640,13642],{"class":1243,"line":2091},[1241,13635,13406],{"class":1254},[1241,13637,13593],{"class":1262},[1241,13639,13596],{"class":1262},[1241,13641,13599],{"class":1262},[1241,13643,7890],{"class":1724},[1241,13645,13646,13648,13650,13652,13654],{"class":1243,"line":2120},[1241,13647,13606],{"class":1269},[1241,13649,1266],{"class":1258},[1241,13651,13611],{"class":1262},[1241,13653,1266],{"class":1258},[1241,13655,7890],{"class":1724},[1241,13657,13658,13660,13662,13665],{"class":1243,"line":2148},[1241,13659,13620],{"class":1269},[1241,13661,1266],{"class":1258},[1241,13663,13664],{"class":1262},"roles/cloudsql.client",[1241,13666,1278],{"class":1258},[1241,13668,13669],{"class":1243,"line":2177},[1241,13670,1303],{"emptyLinePlaceholder":1302},[1241,13672,13673],{"class":1243,"line":2214},[1241,13674,13675],{"class":1247},"# Create and download service account key\n",[1241,13677,13678,13680,13682,13684,13687,13689,13692],{"class":1243,"line":2240},[1241,13679,13406],{"class":1254},[1241,13681,13555],{"class":1262},[1241,13683,13558],{"class":1262},[1241,13685,13686],{"class":1262}," keys",[1241,13688,3967],{"class":1262},[1241,13690,13691],{"class":1262}," django-deploy-key.json",[1241,13693,7890],{"class":1724},[1241,13695,13696],{"class":1243,"line":2245},[1241,13697,13698],{"class":1269},"    --iam-account=django-deploy@your-project-id.iam.gserviceaccount.com\n",[1035,13700,13702],{"id":13701},"app-engine-deployment","App Engine Deployment",[1026,13704,13705],{},"App Engine is Google's fully managed PaaS that automatically handles scaling, load balancing, and infrastructure management.",[1026,13707,13708],{},[1042,13709,13710],{},"App Engine Configuration",[1128,13712,13714],{"className":3017,"code":13713,"language":3019,"meta":1137,"style":1137},"# app.yaml\nruntime: python39\n\n# Environment variables\nenv_variables:\n  DJANGO_SETTINGS_MODULE: myproject.settings.production\n  SECRET_KEY: your-secret-key-here\n  GCS_BUCKET_NAME: your-gcs-bucket\n  REDIS_URL: redis://10.0.0.1:6379/1\n\n# Automatic scaling configuration\nautomatic_scaling:\n  min_instances: 2\n  max_instances: 20\n  target_cpu_utilization: 0.6\n  target_throughput_utilization: 0.6\n  max_concurrent_requests: 80\n  max_idle_instances: 5\n  min_idle_instances: 1\n\n# Resource allocation\nresources:\n  cpu: 2\n  memory_gb: 4\n  disk_size_gb: 10\n\n# URL handlers\nhandlers:\n# Static files served directly by App Engine\n- url: /static\n  static_dir: staticfiles/\n  secure: always\n  expiration: \"1d\"\n  http_headers:\n    Cache-Control: \"public, max-age=86400\"\n\n# Media files (if not using GCS)\n- url: /media\n  static_dir: media/\n  secure: always\n  expiration: \"1h\"\n\n# Health check endpoint\n- url: /health\n  script: auto\n  secure: always\n  login: admin\n\n# Admin interface (restricted)\n- url: /admin/.*\n  script: auto\n  secure: always\n  login: admin\n\n# All other URLs\n- url: /.*\n  script: auto\n  secure: always\n\n# Cloud SQL connection\nbeta_settings:\n  cloud_sql_instances: your-project:us-central1:django-db\n\n# VPC connector for private resources\nvpc_access_connector:\n  name: projects/your-project/locations/us-central1/connectors/django-connector\n\n# Error handlers\nerror_handlers:\n- file: error.html\n  error_code: over_quota\n- file: error.html\n  error_code: dos_api_denial\n- file: error.html\n  error_code: timeout\n",[1135,13715,13716,13721,13730,13734,13739,13746,13755,13765,13775,13785,13789,13794,13801,13810,13819,13829,13838,13847,13856,13865,13869,13874,13881,13890,13899,13908,13912,13917,13923,13928,13941,13950,13960,13974,13981,13995,13999,14004,14015,14024,14032,14045,14049,14054,14065,14075,14083,14093,14097,14102,14113,14121,14129,14137,14141,14146,14157,14165,14173,14177,14182,14189,14199,14203,14208,14215,14225,14229,14234,14241,14253,14263,14273,14282,14292],{"__ignoreMap":1137},[1241,13717,13718],{"class":1243,"line":1244},[1241,13719,13720],{"class":1247},"# app.yaml\n",[1241,13722,13723,13725,13727],{"class":1243,"line":1251},[1241,13724,4387],{"class":1590},[1241,13726,1397],{"class":1381},[1241,13728,13729],{"class":1262}," python39\n",[1241,13731,13732],{"class":1243,"line":1281},[1241,13733,1303],{"emptyLinePlaceholder":1302},[1241,13735,13736],{"class":1243,"line":1290},[1241,13737,13738],{"class":1247},"# Environment variables\n",[1241,13740,13741,13744],{"class":1243,"line":1299},[1241,13742,13743],{"class":1590},"env_variables",[1241,13745,1840],{"class":1381},[1241,13747,13748,13751,13753],{"class":1243,"line":1306},[1241,13749,13750],{"class":1590},"  DJANGO_SETTINGS_MODULE",[1241,13752,1397],{"class":1381},[1241,13754,3136],{"class":1262},[1241,13756,13757,13760,13762],{"class":1243,"line":1312},[1241,13758,13759],{"class":1590},"  SECRET_KEY",[1241,13761,1397],{"class":1381},[1241,13763,13764],{"class":1262}," your-secret-key-here\n",[1241,13766,13767,13770,13772],{"class":1243,"line":1321},[1241,13768,13769],{"class":1590},"  GCS_BUCKET_NAME",[1241,13771,1397],{"class":1381},[1241,13773,13774],{"class":1262}," your-gcs-bucket\n",[1241,13776,13777,13780,13782],{"class":1243,"line":1327},[1241,13778,13779],{"class":1590},"  REDIS_URL",[1241,13781,1397],{"class":1381},[1241,13783,13784],{"class":1262}," redis://10.0.0.1:6379/1\n",[1241,13786,13787],{"class":1243,"line":1333},[1241,13788,1303],{"emptyLinePlaceholder":1302},[1241,13790,13791],{"class":1243,"line":1339},[1241,13792,13793],{"class":1247},"# Automatic scaling configuration\n",[1241,13795,13796,13799],{"class":1243,"line":1345},[1241,13797,13798],{"class":1590},"automatic_scaling",[1241,13800,1840],{"class":1381},[1241,13802,13803,13806,13808],{"class":1243,"line":1350},[1241,13804,13805],{"class":1590},"  min_instances",[1241,13807,1397],{"class":1381},[1241,13809,3413],{"class":2476},[1241,13811,13812,13815,13817],{"class":1243,"line":1356},[1241,13813,13814],{"class":1590},"  max_instances",[1241,13816,1397],{"class":1381},[1241,13818,3480],{"class":2476},[1241,13820,13821,13824,13826],{"class":1243,"line":1554},[1241,13822,13823],{"class":1590},"  target_cpu_utilization",[1241,13825,1397],{"class":1381},[1241,13827,13828],{"class":2476}," 0.6\n",[1241,13830,13831,13834,13836],{"class":1243,"line":1569},[1241,13832,13833],{"class":1590},"  target_throughput_utilization",[1241,13835,1397],{"class":1381},[1241,13837,13828],{"class":2476},[1241,13839,13840,13843,13845],{"class":1243,"line":1584},[1241,13841,13842],{"class":1590},"  max_concurrent_requests",[1241,13844,1397],{"class":1381},[1241,13846,3470],{"class":2476},[1241,13848,13849,13852,13854],{"class":1243,"line":1621},[1241,13850,13851],{"class":1590},"  max_idle_instances",[1241,13853,1397],{"class":1381},[1241,13855,12371],{"class":2476},[1241,13857,13858,13861,13863],{"class":1243,"line":1627},[1241,13859,13860],{"class":1590},"  min_idle_instances",[1241,13862,1397],{"class":1381},[1241,13864,12023],{"class":2476},[1241,13866,13867],{"class":1243,"line":1633},[1241,13868,1303],{"emptyLinePlaceholder":1302},[1241,13870,13871],{"class":1243,"line":1639},[1241,13872,13873],{"class":1247},"# Resource allocation\n",[1241,13875,13876,13879],{"class":1243,"line":1645},[1241,13877,13878],{"class":1590},"resources",[1241,13880,1840],{"class":1381},[1241,13882,13883,13886,13888],{"class":1243,"line":2028},[1241,13884,13885],{"class":1590},"  cpu",[1241,13887,1397],{"class":1381},[1241,13889,3413],{"class":2476},[1241,13891,13892,13895,13897],{"class":1243,"line":2042},[1241,13893,13894],{"class":1590},"  memory_gb",[1241,13896,1397],{"class":1381},[1241,13898,12909],{"class":2476},[1241,13900,13901,13904,13906],{"class":1243,"line":2064},[1241,13902,13903],{"class":1590},"  disk_size_gb",[1241,13905,1397],{"class":1381},[1241,13907,3423],{"class":2476},[1241,13909,13910],{"class":1243,"line":2070},[1241,13911,1303],{"emptyLinePlaceholder":1302},[1241,13913,13914],{"class":1243,"line":2075},[1241,13915,13916],{"class":1247},"# URL handlers\n",[1241,13918,13919,13921],{"class":1243,"line":2080},[1241,13920,2591],{"class":1590},[1241,13922,1840],{"class":1381},[1241,13924,13925],{"class":1243,"line":2085},[1241,13926,13927],{"class":1247},"# Static files served directly by App Engine\n",[1241,13929,13930,13933,13936,13938],{"class":1243,"line":2091},[1241,13931,13932],{"class":1381},"-",[1241,13934,13935],{"class":1590}," url",[1241,13937,1397],{"class":1381},[1241,13939,13940],{"class":1262}," /static\n",[1241,13942,13943,13946,13948],{"class":1243,"line":2120},[1241,13944,13945],{"class":1590},"  static_dir",[1241,13947,1397],{"class":1381},[1241,13949,3163],{"class":1262},[1241,13951,13952,13955,13957],{"class":1243,"line":2148},[1241,13953,13954],{"class":1590},"  secure",[1241,13956,1397],{"class":1381},[1241,13958,13959],{"class":1262}," always\n",[1241,13961,13962,13965,13967,13969,13972],{"class":1243,"line":2177},[1241,13963,13964],{"class":1590},"  expiration",[1241,13966,1397],{"class":1381},[1241,13968,1259],{"class":1258},[1241,13970,13971],{"class":1262},"1d",[1241,13973,1278],{"class":1258},[1241,13975,13976,13979],{"class":1243,"line":2214},[1241,13977,13978],{"class":1590},"  http_headers",[1241,13980,1840],{"class":1381},[1241,13982,13983,13986,13988,13990,13993],{"class":1243,"line":2240},[1241,13984,13985],{"class":1590},"    Cache-Control",[1241,13987,1397],{"class":1381},[1241,13989,1259],{"class":1258},[1241,13991,13992],{"class":1262},"public, max-age=86400",[1241,13994,1278],{"class":1258},[1241,13996,13997],{"class":1243,"line":2245},[1241,13998,1303],{"emptyLinePlaceholder":1302},[1241,14000,14001],{"class":1243,"line":2251},[1241,14002,14003],{"class":1247},"# Media files (if not using GCS)\n",[1241,14005,14006,14008,14010,14012],{"class":1243,"line":2267},[1241,14007,13932],{"class":1381},[1241,14009,13935],{"class":1590},[1241,14011,1397],{"class":1381},[1241,14013,14014],{"class":1262}," /media\n",[1241,14016,14017,14019,14021],{"class":1243,"line":2289},[1241,14018,13945],{"class":1590},[1241,14020,1397],{"class":1381},[1241,14022,14023],{"class":1262}," media/\n",[1241,14025,14026,14028,14030],{"class":1243,"line":2294},[1241,14027,13954],{"class":1590},[1241,14029,1397],{"class":1381},[1241,14031,13959],{"class":1262},[1241,14033,14034,14036,14038,14040,14043],{"class":1243,"line":2300},[1241,14035,13964],{"class":1590},[1241,14037,1397],{"class":1381},[1241,14039,1259],{"class":1258},[1241,14041,14042],{"class":1262},"1h",[1241,14044,1278],{"class":1258},[1241,14046,14047],{"class":1243,"line":2314},[1241,14048,1303],{"emptyLinePlaceholder":1302},[1241,14050,14051],{"class":1243,"line":2335},[1241,14052,14053],{"class":1247},"# Health check endpoint\n",[1241,14055,14056,14058,14060,14062],{"class":1243,"line":2340},[1241,14057,13932],{"class":1381},[1241,14059,13935],{"class":1590},[1241,14061,1397],{"class":1381},[1241,14063,14064],{"class":1262}," /health\n",[1241,14066,14067,14070,14072],{"class":1243,"line":2346},[1241,14068,14069],{"class":1590},"  script",[1241,14071,1397],{"class":1381},[1241,14073,14074],{"class":1262}," auto\n",[1241,14076,14077,14079,14081],{"class":1243,"line":2361},[1241,14078,13954],{"class":1590},[1241,14080,1397],{"class":1381},[1241,14082,13959],{"class":1262},[1241,14084,14085,14088,14090],{"class":1243,"line":2371},[1241,14086,14087],{"class":1590},"  login",[1241,14089,1397],{"class":1381},[1241,14091,14092],{"class":1262}," admin\n",[1241,14094,14095],{"class":1243,"line":2392},[1241,14096,1303],{"emptyLinePlaceholder":1302},[1241,14098,14099],{"class":1243,"line":2397},[1241,14100,14101],{"class":1247},"# Admin interface (restricted)\n",[1241,14103,14104,14106,14108,14110],{"class":1243,"line":2407},[1241,14105,13932],{"class":1381},[1241,14107,13935],{"class":1590},[1241,14109,1397],{"class":1381},[1241,14111,14112],{"class":1262}," /admin/.*\n",[1241,14114,14115,14117,14119],{"class":1243,"line":2417},[1241,14116,14069],{"class":1590},[1241,14118,1397],{"class":1381},[1241,14120,14074],{"class":1262},[1241,14122,14123,14125,14127],{"class":1243,"line":2422},[1241,14124,13954],{"class":1590},[1241,14126,1397],{"class":1381},[1241,14128,13959],{"class":1262},[1241,14130,14131,14133,14135],{"class":1243,"line":2428},[1241,14132,14087],{"class":1590},[1241,14134,1397],{"class":1381},[1241,14136,14092],{"class":1262},[1241,14138,14139],{"class":1243,"line":2439},[1241,14140,1303],{"emptyLinePlaceholder":1302},[1241,14142,14143],{"class":1243,"line":2468},[1241,14144,14145],{"class":1247},"# All other URLs\n",[1241,14147,14148,14150,14152,14154],{"class":1243,"line":2480},[1241,14149,13932],{"class":1381},[1241,14151,13935],{"class":1590},[1241,14153,1397],{"class":1381},[1241,14155,14156],{"class":1262}," /.*\n",[1241,14158,14159,14161,14163],{"class":1243,"line":2490},[1241,14160,14069],{"class":1590},[1241,14162,1397],{"class":1381},[1241,14164,14074],{"class":1262},[1241,14166,14167,14169,14171],{"class":1243,"line":2500},[1241,14168,13954],{"class":1590},[1241,14170,1397],{"class":1381},[1241,14172,13959],{"class":1262},[1241,14174,14175],{"class":1243,"line":2505},[1241,14176,1303],{"emptyLinePlaceholder":1302},[1241,14178,14179],{"class":1243,"line":2511},[1241,14180,14181],{"class":1247},"# Cloud SQL connection\n",[1241,14183,14184,14187],{"class":1243,"line":2521},[1241,14185,14186],{"class":1590},"beta_settings",[1241,14188,1840],{"class":1381},[1241,14190,14191,14194,14196],{"class":1243,"line":2531},[1241,14192,14193],{"class":1590},"  cloud_sql_instances",[1241,14195,1397],{"class":1381},[1241,14197,14198],{"class":1262}," your-project:us-central1:django-db\n",[1241,14200,14201],{"class":1243,"line":2536},[1241,14202,1303],{"emptyLinePlaceholder":1302},[1241,14204,14205],{"class":1243,"line":2542},[1241,14206,14207],{"class":1247},"# VPC connector for private resources\n",[1241,14209,14210,14213],{"class":1243,"line":2552},[1241,14211,14212],{"class":1590},"vpc_access_connector",[1241,14214,1840],{"class":1381},[1241,14216,14217,14220,14222],{"class":1243,"line":2569},[1241,14218,14219],{"class":1590},"  name",[1241,14221,1397],{"class":1381},[1241,14223,14224],{"class":1262}," projects/your-project/locations/us-central1/connectors/django-connector\n",[1241,14226,14227],{"class":1243,"line":2586},[1241,14228,1303],{"emptyLinePlaceholder":1302},[1241,14230,14231],{"class":1243,"line":2600},[1241,14232,14233],{"class":1247},"# Error handlers\n",[1241,14235,14236,14239],{"class":1243,"line":2614},[1241,14237,14238],{"class":1590},"error_handlers",[1241,14240,1840],{"class":1381},[1241,14242,14243,14245,14248,14250],{"class":1243,"line":2635},[1241,14244,13932],{"class":1381},[1241,14246,14247],{"class":1590}," file",[1241,14249,1397],{"class":1381},[1241,14251,14252],{"class":1262}," error.html\n",[1241,14254,14255,14258,14260],{"class":1243,"line":2656},[1241,14256,14257],{"class":1590},"  error_code",[1241,14259,1397],{"class":1381},[1241,14261,14262],{"class":1262}," over_quota\n",[1241,14264,14265,14267,14269,14271],{"class":1243,"line":2677},[1241,14266,13932],{"class":1381},[1241,14268,14247],{"class":1590},[1241,14270,1397],{"class":1381},[1241,14272,14252],{"class":1262},[1241,14274,14275,14277,14279],{"class":1243,"line":2683},[1241,14276,14257],{"class":1590},[1241,14278,1397],{"class":1381},[1241,14280,14281],{"class":1262}," dos_api_denial\n",[1241,14283,14284,14286,14288,14290],{"class":1243,"line":2697},[1241,14285,13932],{"class":1381},[1241,14287,14247],{"class":1590},[1241,14289,1397],{"class":1381},[1241,14291,14252],{"class":1262},[1241,14293,14294,14296,14298],{"class":1243,"line":2716},[1241,14295,14257],{"class":1590},[1241,14297,1397],{"class":1381},[1241,14299,14300],{"class":1262}," timeout\n",[1026,14302,14303],{},[1042,14304,14305],{},"Django Settings for App Engine",[1128,14307,14309],{"className":1674,"code":14308,"language":1676,"meta":1137,"style":1137},"# settings/appengine.py\nimport os\nfrom .base import *\n\n# App Engine specific settings\nDEBUG = False\nALLOWED_HOSTS = ['*']  # App Engine handles routing\n\n# Database configuration for Cloud SQL\nif os.getenv('GAE_APPLICATION', None):\n    # Running on production App Engine\n    DATABASES = {\n        'default': {\n            'ENGINE': 'django.db.backends.postgresql',\n            'NAME': os.environ['DB_NAME'],\n            'USER': os.environ['DB_USER'],\n            'PASSWORD': os.environ['DB_PASSWORD'],\n            'HOST': f'/cloudsql/{os.environ[\"CLOUD_SQL_CONNECTION_NAME\"]}',\n            'PORT': '',\n            'OPTIONS': {\n                'init_command': \"SET sql_mode='STRICT_TRANS_TABLES'\",\n            },\n        }\n    }\nelse:\n    # Running locally\n    DATABASES = {\n        'default': {\n            'ENGINE': 'django.db.backends.postgresql',\n            'NAME': os.environ.get('DB_NAME', 'django_local'),\n            'USER': os.environ.get('DB_USER', 'postgres'),\n            'PASSWORD': os.environ.get('DB_PASSWORD', ''),\n            'HOST': os.environ.get('DB_HOST', 'localhost'),\n            'PORT': os.environ.get('DB_PORT', '5432'),\n        }\n    }\n\n# Google Cloud Storage for static and media files\nDEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'\nSTATICFILES_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'\nGS_BUCKET_NAME = os.environ.get('GCS_BUCKET_NAME')\nGS_PROJECT_ID = os.environ.get('GOOGLE_CLOUD_PROJECT')\nGS_DEFAULT_ACL = 'publicRead'\nGS_AUTO_CREATE_BUCKET = True\nGS_FILE_OVERWRITE = False\n\n# Static and media URLs\nSTATIC_URL = f'https://storage.googleapis.com/{GS_BUCKET_NAME}/static/'\nMEDIA_URL = f'https://storage.googleapis.com/{GS_BUCKET_NAME}/media/'\n\n# Cache configuration using Memorystore Redis\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': os.environ.get('REDIS_URL', 'redis://localhost:6379/1'),\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n        },\n        'KEY_PREFIX': 'django',\n    }\n}\n\n# Session configuration\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'default'\n\n# Security settings\nSECURE_SSL_REDIRECT = True\nSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')\nSECURE_HSTS_SECONDS = 31536000\nSECURE_HSTS_INCLUDE_SUBDOMAINS = True\nSECURE_HSTS_PRELOAD = True\n\n# Logging configuration for Cloud Logging\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'console': {\n            'class': 'logging.StreamHandler',\n        },\n    },\n    'root': {\n        'handlers': ['console'],\n        'level': 'INFO',\n    },\n    'loggers': {\n        'django': {\n            'handlers': ['console'],\n            'level': 'INFO',\n            'propagate': False,\n        },\n    },\n}\n",[1135,14310,14311,14316,14322,14334,14338,14343,14351,14370,14374,14379,14405,14410,14418,14430,14448,14474,14500,14526,14566,14580,14592,14612,14616,14620,14624,14631,14636,14644,14656,14674,14713,14751,14785,14825,14864,14868,14872,14876,14881,14894,14906,14934,14962,14976,14985,14994,14998,15003,15022,15040,15044,15049,15057,15069,15087,15126,15138,15156,15160,15178,15182,15186,15190,15195,15207,15219,15223,15227,15235,15259,15267,15275,15283,15287,15292,15300,15314,15328,15340,15352,15370,15374,15378,15390,15410,15428,15432,15444,15456,15476,15494,15508,15512,15516],{"__ignoreMap":1137},[1241,14312,14313],{"class":1243,"line":1244},[1241,14314,14315],{"class":1247},"# settings/appengine.py\n",[1241,14317,14318,14320],{"class":1243,"line":1251},[1241,14319,1689],{"class":1688},[1241,14321,1693],{"class":1692},[1241,14323,14324,14326,14328,14330,14332],{"class":1243,"line":1281},[1241,14325,1698],{"class":1688},[1241,14327,1701],{"class":1381},[1241,14329,1704],{"class":1692},[1241,14331,1689],{"class":1688},[1241,14333,1710],{"class":1709},[1241,14335,14336],{"class":1243,"line":1290},[1241,14337,1303],{"emptyLinePlaceholder":1302},[1241,14339,14340],{"class":1243,"line":1299},[1241,14341,14342],{"class":1247},"# App Engine specific settings\n",[1241,14344,14345,14347,14349],{"class":1243,"line":1306},[1241,14346,1725],{"class":1724},[1241,14348,1728],{"class":1381},[1241,14350,1732],{"class":1731},[1241,14352,14353,14355,14357,14359,14361,14363,14365,14367],{"class":1243,"line":1312},[1241,14354,1737],{"class":1724},[1241,14356,1728],{"class":1381},[1241,14358,1598],{"class":1381},[1241,14360,1752],{"class":1258},[1241,14362,1547],{"class":1262},[1241,14364,1752],{"class":1258},[1241,14366,4768],{"class":1381},[1241,14368,14369],{"class":1247},"  # App Engine handles routing\n",[1241,14371,14372],{"class":1243,"line":1321},[1241,14373,1303],{"emptyLinePlaceholder":1302},[1241,14375,14376],{"class":1243,"line":1327},[1241,14377,14378],{"class":1247},"# Database configuration for Cloud SQL\n",[1241,14380,14381,14383,14385,14387,14390,14392,14394,14397,14399,14401,14403],{"class":1243,"line":1333},[1241,14382,1819],{"class":1688},[1241,14384,1833],{"class":1692},[1241,14386,1773],{"class":1381},[1241,14388,14389],{"class":1782},"getenv",[1241,14391,1786],{"class":1381},[1241,14393,1752],{"class":1258},[1241,14395,14396],{"class":1262},"GAE_APPLICATION",[1241,14398,1752],{"class":1258},[1241,14400,1608],{"class":1381},[1241,14402,10061],{"class":1731},[1241,14404,8583],{"class":1381},[1241,14406,14407],{"class":1243,"line":1339},[1241,14408,14409],{"class":1247},"    # Running on production App Engine\n",[1241,14411,14412,14414,14416],{"class":1243,"line":1345},[1241,14413,1845],{"class":1724},[1241,14415,1728],{"class":1381},[1241,14417,1566],{"class":1381},[1241,14419,14420,14422,14424,14426,14428],{"class":1243,"line":1350},[1241,14421,1854],{"class":1258},[1241,14423,1857],{"class":1262},[1241,14425,1752],{"class":1258},[1241,14427,1397],{"class":1381},[1241,14429,1566],{"class":1381},[1241,14431,14432,14434,14436,14438,14440,14442,14444,14446],{"class":1243,"line":1356},[1241,14433,1868],{"class":1258},[1241,14435,1871],{"class":1262},[1241,14437,1752],{"class":1258},[1241,14439,1397],{"class":1381},[1241,14441,1822],{"class":1258},[1241,14443,1880],{"class":1262},[1241,14445,1752],{"class":1258},[1241,14447,1407],{"class":1381},[1241,14449,14450,14452,14454,14456,14458,14460,14462,14464,14466,14468,14470,14472],{"class":1243,"line":1554},[1241,14451,1868],{"class":1258},[1241,14453,1891],{"class":1262},[1241,14455,1752],{"class":1258},[1241,14457,1397],{"class":1381},[1241,14459,1833],{"class":1692},[1241,14461,1773],{"class":1381},[1241,14463,1777],{"class":1776},[1241,14465,1904],{"class":1381},[1241,14467,1752],{"class":1258},[1241,14469,4842],{"class":1262},[1241,14471,1752],{"class":1258},[1241,14473,1914],{"class":1381},[1241,14475,14476,14478,14480,14482,14484,14486,14488,14490,14492,14494,14496,14498],{"class":1243,"line":1569},[1241,14477,1868],{"class":1258},[1241,14479,1921],{"class":1262},[1241,14481,1752],{"class":1258},[1241,14483,1397],{"class":1381},[1241,14485,1833],{"class":1692},[1241,14487,1773],{"class":1381},[1241,14489,1777],{"class":1776},[1241,14491,1904],{"class":1381},[1241,14493,1752],{"class":1258},[1241,14495,4869],{"class":1262},[1241,14497,1752],{"class":1258},[1241,14499,1914],{"class":1381},[1241,14501,14502,14504,14506,14508,14510,14512,14514,14516,14518,14520,14522,14524],{"class":1243,"line":1584},[1241,14503,1868],{"class":1258},[1241,14505,1949],{"class":1262},[1241,14507,1752],{"class":1258},[1241,14509,1397],{"class":1381},[1241,14511,1833],{"class":1692},[1241,14513,1773],{"class":1381},[1241,14515,1777],{"class":1776},[1241,14517,1904],{"class":1381},[1241,14519,1752],{"class":1258},[1241,14521,4896],{"class":1262},[1241,14523,1752],{"class":1258},[1241,14525,1914],{"class":1381},[1241,14527,14528,14530,14532,14534,14536,14538,14541,14543,14545,14547,14549,14551,14553,14556,14558,14560,14562,14564],{"class":1243,"line":1621},[1241,14529,1868],{"class":1258},[1241,14531,1977],{"class":1262},[1241,14533,1752],{"class":1258},[1241,14535,1397],{"class":1381},[1241,14537,2223],{"class":2222},[1241,14539,14540],{"class":1262},"'/cloudsql/",[1241,14542,2229],{"class":2228},[1241,14544,2940],{"class":1692},[1241,14546,1773],{"class":1381},[1241,14548,1777],{"class":1776},[1241,14550,1904],{"class":1381},[1241,14552,1266],{"class":1258},[1241,14554,14555],{"class":1262},"CLOUD_SQL_CONNECTION_NAME",[1241,14557,1266],{"class":1258},[1241,14559,4768],{"class":1381},[1241,14561,2234],{"class":2228},[1241,14563,1752],{"class":1262},[1241,14565,1407],{"class":1381},[1241,14567,14568,14570,14572,14574,14576,14578],{"class":1243,"line":1627},[1241,14569,1868],{"class":1258},[1241,14571,2004],{"class":1262},[1241,14573,1752],{"class":1258},[1241,14575,1397],{"class":1381},[1241,14577,1798],{"class":1258},[1241,14579,1407],{"class":1381},[1241,14581,14582,14584,14586,14588,14590],{"class":1243,"line":1633},[1241,14583,1868],{"class":1258},[1241,14585,2033],{"class":1262},[1241,14587,1752],{"class":1258},[1241,14589,1397],{"class":1381},[1241,14591,1566],{"class":1381},[1241,14593,14594,14596,14599,14601,14603,14605,14608,14610],{"class":1243,"line":1639},[1241,14595,2045],{"class":1258},[1241,14597,14598],{"class":1262},"init_command",[1241,14600,1752],{"class":1258},[1241,14602,1397],{"class":1381},[1241,14604,1259],{"class":1258},[1241,14606,14607],{"class":1262},"SET sql_mode='STRICT_TRANS_TABLES'",[1241,14609,1266],{"class":1258},[1241,14611,1407],{"class":1381},[1241,14613,14614],{"class":1243,"line":1645},[1241,14615,2067],{"class":1381},[1241,14617,14618],{"class":1243,"line":2028},[1241,14619,1624],{"class":1381},[1241,14621,14622],{"class":1243,"line":2042},[1241,14623,1636],{"class":1381},[1241,14625,14626,14629],{"class":1243,"line":2064},[1241,14627,14628],{"class":1688},"else",[1241,14630,1840],{"class":1381},[1241,14632,14633],{"class":1243,"line":2070},[1241,14634,14635],{"class":1247},"    # Running locally\n",[1241,14637,14638,14640,14642],{"class":1243,"line":2075},[1241,14639,1845],{"class":1724},[1241,14641,1728],{"class":1381},[1241,14643,1566],{"class":1381},[1241,14645,14646,14648,14650,14652,14654],{"class":1243,"line":2080},[1241,14647,1854],{"class":1258},[1241,14649,1857],{"class":1262},[1241,14651,1752],{"class":1258},[1241,14653,1397],{"class":1381},[1241,14655,1566],{"class":1381},[1241,14657,14658,14660,14662,14664,14666,14668,14670,14672],{"class":1243,"line":2085},[1241,14659,1868],{"class":1258},[1241,14661,1871],{"class":1262},[1241,14663,1752],{"class":1258},[1241,14665,1397],{"class":1381},[1241,14667,1822],{"class":1258},[1241,14669,1880],{"class":1262},[1241,14671,1752],{"class":1258},[1241,14673,1407],{"class":1381},[1241,14675,14676,14678,14680,14682,14684,14686,14688,14690,14692,14694,14696,14698,14700,14702,14704,14706,14709,14711],{"class":1243,"line":2091},[1241,14677,1868],{"class":1258},[1241,14679,1891],{"class":1262},[1241,14681,1752],{"class":1258},[1241,14683,1397],{"class":1381},[1241,14685,1833],{"class":1692},[1241,14687,1773],{"class":1381},[1241,14689,1777],{"class":1776},[1241,14691,1773],{"class":1381},[1241,14693,1783],{"class":1782},[1241,14695,1786],{"class":1381},[1241,14697,1752],{"class":1258},[1241,14699,4842],{"class":1262},[1241,14701,1752],{"class":1258},[1241,14703,1608],{"class":1381},[1241,14705,1822],{"class":1258},[1241,14707,14708],{"class":1262},"django_local",[1241,14710,1752],{"class":1258},[1241,14712,1801],{"class":1381},[1241,14714,14715,14717,14719,14721,14723,14725,14727,14729,14731,14733,14735,14737,14739,14741,14743,14745,14747,14749],{"class":1243,"line":2120},[1241,14716,1868],{"class":1258},[1241,14718,1921],{"class":1262},[1241,14720,1752],{"class":1258},[1241,14722,1397],{"class":1381},[1241,14724,1833],{"class":1692},[1241,14726,1773],{"class":1381},[1241,14728,1777],{"class":1776},[1241,14730,1773],{"class":1381},[1241,14732,1783],{"class":1782},[1241,14734,1786],{"class":1381},[1241,14736,1752],{"class":1258},[1241,14738,4869],{"class":1262},[1241,14740,1752],{"class":1258},[1241,14742,1608],{"class":1381},[1241,14744,1822],{"class":1258},[1241,14746,8342],{"class":1262},[1241,14748,1752],{"class":1258},[1241,14750,1801],{"class":1381},[1241,14752,14753,14755,14757,14759,14761,14763,14765,14767,14769,14771,14773,14775,14777,14779,14781,14783],{"class":1243,"line":2148},[1241,14754,1868],{"class":1258},[1241,14756,1949],{"class":1262},[1241,14758,1752],{"class":1258},[1241,14760,1397],{"class":1381},[1241,14762,1833],{"class":1692},[1241,14764,1773],{"class":1381},[1241,14766,1777],{"class":1776},[1241,14768,1773],{"class":1381},[1241,14770,1783],{"class":1782},[1241,14772,1786],{"class":1381},[1241,14774,1752],{"class":1258},[1241,14776,4896],{"class":1262},[1241,14778,1752],{"class":1258},[1241,14780,1608],{"class":1381},[1241,14782,1798],{"class":1258},[1241,14784,1801],{"class":1381},[1241,14786,14787,14789,14791,14793,14795,14797,14799,14801,14803,14805,14807,14809,14812,14814,14816,14818,14821,14823],{"class":1243,"line":2177},[1241,14788,1868],{"class":1258},[1241,14790,1977],{"class":1262},[1241,14792,1752],{"class":1258},[1241,14794,1397],{"class":1381},[1241,14796,1833],{"class":1692},[1241,14798,1773],{"class":1381},[1241,14800,1777],{"class":1776},[1241,14802,1773],{"class":1381},[1241,14804,1783],{"class":1782},[1241,14806,1786],{"class":1381},[1241,14808,1752],{"class":1258},[1241,14810,14811],{"class":1262},"DB_HOST",[1241,14813,1752],{"class":1258},[1241,14815,1608],{"class":1381},[1241,14817,1822],{"class":1258},[1241,14819,14820],{"class":1262},"localhost",[1241,14822,1752],{"class":1258},[1241,14824,1801],{"class":1381},[1241,14826,14827,14829,14831,14833,14835,14837,14839,14841,14843,14845,14847,14849,14852,14854,14856,14858,14860,14862],{"class":1243,"line":2214},[1241,14828,1868],{"class":1258},[1241,14830,2004],{"class":1262},[1241,14832,1752],{"class":1258},[1241,14834,1397],{"class":1381},[1241,14836,1833],{"class":1692},[1241,14838,1773],{"class":1381},[1241,14840,1777],{"class":1776},[1241,14842,1773],{"class":1381},[1241,14844,1783],{"class":1782},[1241,14846,1786],{"class":1381},[1241,14848,1752],{"class":1258},[1241,14850,14851],{"class":1262},"DB_PORT",[1241,14853,1752],{"class":1258},[1241,14855,1608],{"class":1381},[1241,14857,1822],{"class":1258},[1241,14859,4946],{"class":1262},[1241,14861,1752],{"class":1258},[1241,14863,1801],{"class":1381},[1241,14865,14866],{"class":1243,"line":2240},[1241,14867,1624],{"class":1381},[1241,14869,14870],{"class":1243,"line":2245},[1241,14871,1636],{"class":1381},[1241,14873,14874],{"class":1243,"line":2251},[1241,14875,1303],{"emptyLinePlaceholder":1302},[1241,14877,14878],{"class":1243,"line":2267},[1241,14879,14880],{"class":1247},"# Google Cloud Storage for static and media files\n",[1241,14882,14883,14885,14887,14889,14892],{"class":1243,"line":2289},[1241,14884,2303],{"class":1724},[1241,14886,1728],{"class":1381},[1241,14888,1822],{"class":1258},[1241,14890,14891],{"class":1262},"storages.backends.gcloud.GoogleCloudStorage",[1241,14893,2264],{"class":1258},[1241,14895,14896,14898,14900,14902,14904],{"class":1243,"line":2294},[1241,14897,2254],{"class":1724},[1241,14899,1728],{"class":1381},[1241,14901,1822],{"class":1258},[1241,14903,14891],{"class":1262},[1241,14905,2264],{"class":1258},[1241,14907,14908,14911,14913,14915,14917,14919,14921,14923,14925,14927,14930,14932],{"class":1243,"line":2300},[1241,14909,14910],{"class":1724},"GS_BUCKET_NAME",[1241,14912,1728],{"class":1381},[1241,14914,1833],{"class":1692},[1241,14916,1773],{"class":1381},[1241,14918,1777],{"class":1776},[1241,14920,1773],{"class":1381},[1241,14922,1783],{"class":1782},[1241,14924,1786],{"class":1381},[1241,14926,1752],{"class":1258},[1241,14928,14929],{"class":1262},"GCS_BUCKET_NAME",[1241,14931,1752],{"class":1258},[1241,14933,2117],{"class":1381},[1241,14935,14936,14939,14941,14943,14945,14947,14949,14951,14953,14955,14958,14960],{"class":1243,"line":2314},[1241,14937,14938],{"class":1724},"GS_PROJECT_ID",[1241,14940,1728],{"class":1381},[1241,14942,1833],{"class":1692},[1241,14944,1773],{"class":1381},[1241,14946,1777],{"class":1776},[1241,14948,1773],{"class":1381},[1241,14950,1783],{"class":1782},[1241,14952,1786],{"class":1381},[1241,14954,1752],{"class":1258},[1241,14956,14957],{"class":1262},"GOOGLE_CLOUD_PROJECT",[1241,14959,1752],{"class":1258},[1241,14961,2117],{"class":1381},[1241,14963,14964,14967,14969,14971,14974],{"class":1243,"line":2335},[1241,14965,14966],{"class":1724},"GS_DEFAULT_ACL",[1241,14968,1728],{"class":1381},[1241,14970,1822],{"class":1258},[1241,14972,14973],{"class":1262},"publicRead",[1241,14975,2264],{"class":1258},[1241,14977,14978,14981,14983],{"class":1243,"line":2340},[1241,14979,14980],{"class":1724},"GS_AUTO_CREATE_BUCKET",[1241,14982,1728],{"class":1381},[1241,14984,2436],{"class":1731},[1241,14986,14987,14990,14992],{"class":1243,"line":2346},[1241,14988,14989],{"class":1724},"GS_FILE_OVERWRITE",[1241,14991,1728],{"class":1381},[1241,14993,1732],{"class":1731},[1241,14995,14996],{"class":1243,"line":2361},[1241,14997,1303],{"emptyLinePlaceholder":1302},[1241,14999,15000],{"class":1243,"line":2371},[1241,15001,15002],{"class":1247},"# Static and media URLs\n",[1241,15004,15005,15007,15009,15011,15014,15016,15018,15020],{"class":1243,"line":2392},[1241,15006,2270],{"class":1724},[1241,15008,1728],{"class":1381},[1241,15010,2223],{"class":2222},[1241,15012,15013],{"class":1262},"'https://storage.googleapis.com/",[1241,15015,2229],{"class":2228},[1241,15017,14910],{"class":1724},[1241,15019,2234],{"class":2228},[1241,15021,2286],{"class":1262},[1241,15023,15024,15026,15028,15030,15032,15034,15036,15038],{"class":1243,"line":2397},[1241,15025,2317],{"class":1724},[1241,15027,1728],{"class":1381},[1241,15029,2223],{"class":2222},[1241,15031,15013],{"class":1262},[1241,15033,2229],{"class":2228},[1241,15035,14910],{"class":1724},[1241,15037,2234],{"class":2228},[1241,15039,2332],{"class":1262},[1241,15041,15042],{"class":1243,"line":2407},[1241,15043,1303],{"emptyLinePlaceholder":1302},[1241,15045,15046],{"class":1243,"line":2417},[1241,15047,15048],{"class":1247},"# Cache configuration using Memorystore Redis\n",[1241,15050,15051,15053,15055],{"class":1243,"line":2422},[1241,15052,5058],{"class":1724},[1241,15054,1728],{"class":1381},[1241,15056,1566],{"class":1381},[1241,15058,15059,15061,15063,15065,15067],{"class":1243,"line":2428},[1241,15060,1746],{"class":1258},[1241,15062,1857],{"class":1262},[1241,15064,1752],{"class":1258},[1241,15066,1397],{"class":1381},[1241,15068,1566],{"class":1381},[1241,15070,15071,15073,15075,15077,15079,15081,15083,15085],{"class":1243,"line":2439},[1241,15072,1854],{"class":1258},[1241,15074,5081],{"class":1262},[1241,15076,1752],{"class":1258},[1241,15078,1397],{"class":1381},[1241,15080,1822],{"class":1258},[1241,15082,5090],{"class":1262},[1241,15084,1752],{"class":1258},[1241,15086,1407],{"class":1381},[1241,15088,15089,15091,15093,15095,15097,15099,15101,15103,15105,15107,15109,15111,15113,15115,15117,15119,15122,15124],{"class":1243,"line":2468},[1241,15090,1854],{"class":1258},[1241,15092,5101],{"class":1262},[1241,15094,1752],{"class":1258},[1241,15096,1397],{"class":1381},[1241,15098,1833],{"class":1692},[1241,15100,1773],{"class":1381},[1241,15102,1777],{"class":1776},[1241,15104,1773],{"class":1381},[1241,15106,1783],{"class":1782},[1241,15108,1786],{"class":1381},[1241,15110,1752],{"class":1258},[1241,15112,5118],{"class":1262},[1241,15114,1752],{"class":1258},[1241,15116,1608],{"class":1381},[1241,15118,1822],{"class":1258},[1241,15120,15121],{"class":1262},"redis://localhost:6379/1",[1241,15123,1752],{"class":1258},[1241,15125,1801],{"class":1381},[1241,15127,15128,15130,15132,15134,15136],{"class":1243,"line":2480},[1241,15129,1854],{"class":1258},[1241,15131,2033],{"class":1262},[1241,15133,1752],{"class":1258},[1241,15135,1397],{"class":1381},[1241,15137,1566],{"class":1381},[1241,15139,15140,15142,15144,15146,15148,15150,15152,15154],{"class":1243,"line":2490},[1241,15141,1868],{"class":1258},[1241,15143,5141],{"class":1262},[1241,15145,1752],{"class":1258},[1241,15147,1397],{"class":1381},[1241,15149,1822],{"class":1258},[1241,15151,5150],{"class":1262},[1241,15153,1752],{"class":1258},[1241,15155,1407],{"class":1381},[1241,15157,15158],{"class":1243,"line":2500},[1241,15159,2680],{"class":1381},[1241,15161,15162,15164,15166,15168,15170,15172,15174,15176],{"class":1243,"line":2505},[1241,15163,1854],{"class":1258},[1241,15165,10078],{"class":1262},[1241,15167,1752],{"class":1258},[1241,15169,1397],{"class":1381},[1241,15171,1822],{"class":1258},[1241,15173,2766],{"class":1262},[1241,15175,1752],{"class":1258},[1241,15177,1407],{"class":1381},[1241,15179,15180],{"class":1243,"line":2511},[1241,15181,1636],{"class":1381},[1241,15183,15184],{"class":1243,"line":2521},[1241,15185,1648],{"class":1381},[1241,15187,15188],{"class":1243,"line":2531},[1241,15189,1303],{"emptyLinePlaceholder":1302},[1241,15191,15192],{"class":1243,"line":2536},[1241,15193,15194],{"class":1247},"# Session configuration\n",[1241,15196,15197,15199,15201,15203,15205],{"class":1243,"line":2542},[1241,15198,5215],{"class":1724},[1241,15200,1728],{"class":1381},[1241,15202,1822],{"class":1258},[1241,15204,5222],{"class":1262},[1241,15206,2264],{"class":1258},[1241,15208,15209,15211,15213,15215,15217],{"class":1243,"line":2552},[1241,15210,5229],{"class":1724},[1241,15212,1728],{"class":1381},[1241,15214,1822],{"class":1258},[1241,15216,1857],{"class":1262},[1241,15218,2264],{"class":1258},[1241,15220,15221],{"class":1243,"line":2569},[1241,15222,1303],{"emptyLinePlaceholder":1302},[1241,15224,15225],{"class":1243,"line":2586},[1241,15226,2425],{"class":1247},[1241,15228,15229,15231,15233],{"class":1243,"line":2600},[1241,15230,2431],{"class":1724},[1241,15232,1728],{"class":1381},[1241,15234,2436],{"class":1731},[1241,15236,15237,15239,15241,15243,15245,15247,15249,15251,15253,15255,15257],{"class":1243,"line":2614},[1241,15238,2442],{"class":1724},[1241,15240,1728],{"class":1381},[1241,15242,2447],{"class":1381},[1241,15244,1752],{"class":1258},[1241,15246,2452],{"class":1262},[1241,15248,1752],{"class":1258},[1241,15250,1608],{"class":1381},[1241,15252,1822],{"class":1258},[1241,15254,2461],{"class":1262},[1241,15256,1752],{"class":1258},[1241,15258,2117],{"class":1381},[1241,15260,15261,15263,15265],{"class":1243,"line":2635},[1241,15262,2471],{"class":1724},[1241,15264,1728],{"class":1381},[1241,15266,2477],{"class":2476},[1241,15268,15269,15271,15273],{"class":1243,"line":2656},[1241,15270,2483],{"class":1724},[1241,15272,1728],{"class":1381},[1241,15274,2436],{"class":1731},[1241,15276,15277,15279,15281],{"class":1243,"line":2677},[1241,15278,2493],{"class":1724},[1241,15280,1728],{"class":1381},[1241,15282,2436],{"class":1731},[1241,15284,15285],{"class":1243,"line":2683},[1241,15286,1303],{"emptyLinePlaceholder":1302},[1241,15288,15289],{"class":1243,"line":2697},[1241,15290,15291],{"class":1247},"# Logging configuration for Cloud Logging\n",[1241,15293,15294,15296,15298],{"class":1243,"line":2716},[1241,15295,2545],{"class":1724},[1241,15297,1728],{"class":1381},[1241,15299,1566],{"class":1381},[1241,15301,15302,15304,15306,15308,15310,15312],{"class":1243,"line":2736},[1241,15303,1746],{"class":1258},[1241,15305,2557],{"class":1262},[1241,15307,1752],{"class":1258},[1241,15309,1397],{"class":1381},[1241,15311,2564],{"class":2476},[1241,15313,1407],{"class":1381},[1241,15315,15316,15318,15320,15322,15324,15326],{"class":1243,"line":2741},[1241,15317,1746],{"class":1258},[1241,15319,2574],{"class":1262},[1241,15321,1752],{"class":1258},[1241,15323,1397],{"class":1381},[1241,15325,2581],{"class":1731},[1241,15327,1407],{"class":1381},[1241,15329,15330,15332,15334,15336,15338],{"class":1243,"line":2747},[1241,15331,1746],{"class":1258},[1241,15333,2591],{"class":1262},[1241,15335,1752],{"class":1258},[1241,15337,1397],{"class":1381},[1241,15339,1566],{"class":1381},[1241,15341,15342,15344,15346,15348,15350],{"class":1243,"line":2761},[1241,15343,1854],{"class":1258},[1241,15345,2688],{"class":1262},[1241,15347,1752],{"class":1258},[1241,15349,1397],{"class":1381},[1241,15351,1566],{"class":1381},[1241,15353,15354,15356,15358,15360,15362,15364,15366,15368],{"class":1243,"line":2775},[1241,15355,1868],{"class":1258},[1241,15357,2640],{"class":1262},[1241,15359,1752],{"class":1258},[1241,15361,1397],{"class":1381},[1241,15363,1822],{"class":1258},[1241,15365,2729],{"class":1262},[1241,15367,1752],{"class":1258},[1241,15369,1407],{"class":1381},[1241,15371,15372],{"class":1243,"line":2804},[1241,15373,2680],{"class":1381},[1241,15375,15376],{"class":1243,"line":2823},[1241,15377,2744],{"class":1381},[1241,15379,15380,15382,15384,15386,15388],{"class":1243,"line":2840},[1241,15381,1746],{"class":1258},[1241,15383,5339],{"class":1262},[1241,15385,1752],{"class":1258},[1241,15387,1397],{"class":1381},[1241,15389,1566],{"class":1381},[1241,15391,15392,15394,15396,15398,15400,15402,15404,15406,15408],{"class":1243,"line":2845},[1241,15393,1854],{"class":1258},[1241,15395,2591],{"class":1262},[1241,15397,1752],{"class":1258},[1241,15399,1397],{"class":1381},[1241,15401,1598],{"class":1381},[1241,15403,1752],{"class":1258},[1241,15405,2688],{"class":1262},[1241,15407,1752],{"class":1258},[1241,15409,1914],{"class":1381},[1241,15411,15412,15414,15416,15418,15420,15422,15424,15426],{"class":1243,"line":2850},[1241,15413,1854],{"class":1258},[1241,15415,2619],{"class":1262},[1241,15417,1752],{"class":1258},[1241,15419,1397],{"class":1381},[1241,15421,1822],{"class":1258},[1241,15423,2628],{"class":1262},[1241,15425,1752],{"class":1258},[1241,15427,1407],{"class":1381},[1241,15429,15430],{"class":1243,"line":3776},[1241,15431,2744],{"class":1381},[1241,15433,15434,15436,15438,15440,15442],{"class":1243,"line":3782},[1241,15435,1746],{"class":1258},[1241,15437,2752],{"class":1262},[1241,15439,1752],{"class":1258},[1241,15441,1397],{"class":1381},[1241,15443,1566],{"class":1381},[1241,15445,15446,15448,15450,15452,15454],{"class":1243,"line":3789},[1241,15447,1854],{"class":1258},[1241,15449,2766],{"class":1262},[1241,15451,1752],{"class":1258},[1241,15453,1397],{"class":1381},[1241,15455,1566],{"class":1381},[1241,15457,15458,15460,15462,15464,15466,15468,15470,15472,15474],{"class":1243,"line":3796},[1241,15459,1868],{"class":1258},[1241,15461,2591],{"class":1262},[1241,15463,1752],{"class":1258},[1241,15465,1397],{"class":1381},[1241,15467,1598],{"class":1381},[1241,15469,1752],{"class":1258},[1241,15471,2688],{"class":1262},[1241,15473,1752],{"class":1258},[1241,15475,1914],{"class":1381},[1241,15477,15478,15480,15482,15484,15486,15488,15490,15492],{"class":1243,"line":3811},[1241,15479,1868],{"class":1258},[1241,15481,2619],{"class":1262},[1241,15483,1752],{"class":1258},[1241,15485,1397],{"class":1381},[1241,15487,1822],{"class":1258},[1241,15489,2628],{"class":1262},[1241,15491,1752],{"class":1258},[1241,15493,1407],{"class":1381},[1241,15495,15496,15498,15500,15502,15504,15506],{"class":1243,"line":3826},[1241,15497,1868],{"class":1258},[1241,15499,2828],{"class":1262},[1241,15501,1752],{"class":1258},[1241,15503,1397],{"class":1381},[1241,15505,2581],{"class":1731},[1241,15507,1407],{"class":1381},[1241,15509,15510],{"class":1243,"line":3841},[1241,15511,2680],{"class":1381},[1241,15513,15514],{"class":1243,"line":3856},[1241,15515,2744],{"class":1381},[1241,15517,15518],{"class":1243,"line":3871},[1241,15519,1648],{"class":1381},[1026,15521,15522],{},[1042,15523,15524],{},"Requirements for App Engine",[1128,15526,15530],{"className":15527,"code":15528,"language":15529,"meta":1137,"style":1137},"language-txt shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# requirements.txt\nDjango==4.2.7\ngunicorn==21.2.0\npsycopg2-binary==2.9.7\ndjango-storages[google]==1.14.2\ndjango-redis==5.4.0\ngoogle-cloud-storage==2.10.0\ngoogle-cloud-secret-manager==2.16.4\nPillow==10.0.1\n","txt",[1135,15531,15532,15537,15542,15547,15552,15557,15562,15567,15572],{"__ignoreMap":1137},[1241,15533,15534],{"class":1243,"line":1244},[1241,15535,15536],{},"# requirements.txt\n",[1241,15538,15539],{"class":1243,"line":1251},[1241,15540,15541],{},"Django==4.2.7\n",[1241,15543,15544],{"class":1243,"line":1281},[1241,15545,15546],{},"gunicorn==21.2.0\n",[1241,15548,15549],{"class":1243,"line":1290},[1241,15550,15551],{},"psycopg2-binary==2.9.7\n",[1241,15553,15554],{"class":1243,"line":1299},[1241,15555,15556],{},"django-storages[google]==1.14.2\n",[1241,15558,15559],{"class":1243,"line":1306},[1241,15560,15561],{},"django-redis==5.4.0\n",[1241,15563,15564],{"class":1243,"line":1312},[1241,15565,15566],{},"google-cloud-storage==2.10.0\n",[1241,15568,15569],{"class":1243,"line":1321},[1241,15570,15571],{},"google-cloud-secret-manager==2.16.4\n",[1241,15573,15574],{"class":1243,"line":1327},[1241,15575,15576],{},"Pillow==10.0.1\n",[1026,15578,15579],{},[1042,15580,15581],{},"App Engine Deployment Commands",[1128,15583,15585],{"className":1235,"code":15584,"language":1237,"meta":1137,"style":1137},"# Deploy to App Engine\ngcloud app deploy\n\n# Deploy with specific version\ngcloud app deploy --version=v1 --no-promote\n\n# Deploy and set traffic\ngcloud app deploy --version=v2\ngcloud app services set-traffic default --splits=v2=100\n\n# View logs\ngcloud app logs tail -s default\n\n# Open application\ngcloud app browse\n\n# Manage versions\ngcloud app versions list\ngcloud app versions delete v1\n",[1135,15586,15587,15592,15601,15605,15610,15625,15629,15634,15645,15662,15666,15670,15688,15692,15697,15706,15710,15715,15727],{"__ignoreMap":1137},[1241,15588,15589],{"class":1243,"line":1244},[1241,15590,15591],{"class":1247},"# Deploy to App Engine\n",[1241,15593,15594,15596,15599],{"class":1243,"line":1251},[1241,15595,13406],{"class":1254},[1241,15597,15598],{"class":1262}," app",[1241,15600,3998],{"class":1262},[1241,15602,15603],{"class":1243,"line":1281},[1241,15604,1303],{"emptyLinePlaceholder":1302},[1241,15606,15607],{"class":1243,"line":1290},[1241,15608,15609],{"class":1247},"# Deploy with specific version\n",[1241,15611,15612,15614,15616,15619,15622],{"class":1243,"line":1299},[1241,15613,13406],{"class":1254},[1241,15615,15598],{"class":1262},[1241,15617,15618],{"class":1262}," deploy",[1241,15620,15621],{"class":1269}," --version=v1",[1241,15623,15624],{"class":1269}," --no-promote\n",[1241,15626,15627],{"class":1243,"line":1306},[1241,15628,1303],{"emptyLinePlaceholder":1302},[1241,15630,15631],{"class":1243,"line":1312},[1241,15632,15633],{"class":1247},"# Deploy and set traffic\n",[1241,15635,15636,15638,15640,15642],{"class":1243,"line":1321},[1241,15637,13406],{"class":1254},[1241,15639,15598],{"class":1262},[1241,15641,15618],{"class":1262},[1241,15643,15644],{"class":1269}," --version=v2\n",[1241,15646,15647,15649,15651,15653,15656,15659],{"class":1243,"line":1327},[1241,15648,13406],{"class":1254},[1241,15650,15598],{"class":1262},[1241,15652,13478],{"class":1262},[1241,15654,15655],{"class":1262}," set-traffic",[1241,15657,15658],{"class":1262}," default",[1241,15660,15661],{"class":1269}," --splits=v2=100\n",[1241,15663,15664],{"class":1243,"line":1333},[1241,15665,1303],{"emptyLinePlaceholder":1302},[1241,15667,15668],{"class":1243,"line":1339},[1241,15669,4045],{"class":1247},[1241,15671,15672,15674,15676,15679,15682,15685],{"class":1243,"line":1345},[1241,15673,13406],{"class":1254},[1241,15675,15598],{"class":1262},[1241,15677,15678],{"class":1262}," logs",[1241,15680,15681],{"class":1262}," tail",[1241,15683,15684],{"class":1269}," -s",[1241,15686,15687],{"class":1262}," default\n",[1241,15689,15690],{"class":1243,"line":1350},[1241,15691,1303],{"emptyLinePlaceholder":1302},[1241,15693,15694],{"class":1243,"line":1356},[1241,15695,15696],{"class":1247},"# Open application\n",[1241,15698,15699,15701,15703],{"class":1243,"line":1554},[1241,15700,13406],{"class":1254},[1241,15702,15598],{"class":1262},[1241,15704,15705],{"class":1262}," browse\n",[1241,15707,15708],{"class":1243,"line":1569},[1241,15709,1303],{"emptyLinePlaceholder":1302},[1241,15711,15712],{"class":1243,"line":1584},[1241,15713,15714],{"class":1247},"# Manage versions\n",[1241,15716,15717,15719,15721,15724],{"class":1243,"line":1621},[1241,15718,13406],{"class":1254},[1241,15720,15598],{"class":1262},[1241,15722,15723],{"class":1262}," versions",[1241,15725,15726],{"class":1262}," list\n",[1241,15728,15729,15731,15733,15735,15738],{"class":1243,"line":1627},[1241,15730,13406],{"class":1254},[1241,15732,15598],{"class":1262},[1241,15734,15723],{"class":1262},[1241,15736,15737],{"class":1262}," delete",[1241,15739,15740],{"class":1262}," v1\n",[1035,15742,15744],{"id":15743},"cloud-sql-database-setup","Cloud SQL Database Setup",[1026,15746,15747],{},[1042,15748,15749],{},"Create Cloud SQL Instance",[1128,15751,15753],{"className":1235,"code":15752,"language":1237,"meta":1137,"style":1137},"# Create PostgreSQL instance\ngcloud sql instances create django-db \\\n    --database-version=POSTGRES_13 \\\n    --tier=db-f1-micro \\\n    --region=us-central1 \\\n    --root-password=SecurePassword123! \\\n    --backup \\\n    --backup-start-time=03:00 \\\n    --maintenance-window-day=SUN \\\n    --maintenance-window-hour=04 \\\n    --enable-bin-log \\\n    --retained-backups-count=7\n\n# Create database\ngcloud sql databases create django_app --instance=django-db\n\n# Create user\ngcloud sql users create django_user \\\n    --instance=django-db \\\n    --password=UserPassword123!\n\n# Get connection name\ngcloud sql instances describe django-db --format=\"value(connectionName)\"\n",[1135,15754,15755,15760,15777,15784,15791,15798,15805,15812,15819,15826,15833,15840,15845,15849,15854,15871,15875,15880,15896,15903,15908,15912,15917],{"__ignoreMap":1137},[1241,15756,15757],{"class":1243,"line":1244},[1241,15758,15759],{"class":1247},"# Create PostgreSQL instance\n",[1241,15761,15762,15764,15767,15770,15772,15775],{"class":1243,"line":1251},[1241,15763,13406],{"class":1254},[1241,15765,15766],{"class":1262}," sql",[1241,15768,15769],{"class":1262}," instances",[1241,15771,3967],{"class":1262},[1241,15773,15774],{"class":1262}," django-db",[1241,15776,7890],{"class":1724},[1241,15778,15779,15782],{"class":1243,"line":1281},[1241,15780,15781],{"class":1269},"    --database-version=POSTGRES_13",[1241,15783,7890],{"class":1724},[1241,15785,15786,15789],{"class":1243,"line":1290},[1241,15787,15788],{"class":1269},"    --tier=db-f1-micro",[1241,15790,7890],{"class":1724},[1241,15792,15793,15796],{"class":1243,"line":1299},[1241,15794,15795],{"class":1269},"    --region=us-central1",[1241,15797,7890],{"class":1724},[1241,15799,15800,15803],{"class":1243,"line":1306},[1241,15801,15802],{"class":1269},"    --root-password=SecurePassword123!",[1241,15804,7890],{"class":1724},[1241,15806,15807,15810],{"class":1243,"line":1312},[1241,15808,15809],{"class":1269},"    --backup",[1241,15811,7890],{"class":1724},[1241,15813,15814,15817],{"class":1243,"line":1321},[1241,15815,15816],{"class":1269},"    --backup-start-time=03:00",[1241,15818,7890],{"class":1724},[1241,15820,15821,15824],{"class":1243,"line":1327},[1241,15822,15823],{"class":1269},"    --maintenance-window-day=SUN",[1241,15825,7890],{"class":1724},[1241,15827,15828,15831],{"class":1243,"line":1333},[1241,15829,15830],{"class":1269},"    --maintenance-window-hour=04",[1241,15832,7890],{"class":1724},[1241,15834,15835,15838],{"class":1243,"line":1339},[1241,15836,15837],{"class":1269},"    --enable-bin-log",[1241,15839,7890],{"class":1724},[1241,15841,15842],{"class":1243,"line":1345},[1241,15843,15844],{"class":1269},"    --retained-backups-count=7\n",[1241,15846,15847],{"class":1243,"line":1350},[1241,15848,1303],{"emptyLinePlaceholder":1302},[1241,15850,15851],{"class":1243,"line":1356},[1241,15852,15853],{"class":1247},"# Create database\n",[1241,15855,15856,15858,15860,15863,15865,15868],{"class":1243,"line":1554},[1241,15857,13406],{"class":1254},[1241,15859,15766],{"class":1262},[1241,15861,15862],{"class":1262}," databases",[1241,15864,3967],{"class":1262},[1241,15866,15867],{"class":1262}," django_app",[1241,15869,15870],{"class":1269}," --instance=django-db\n",[1241,15872,15873],{"class":1243,"line":1569},[1241,15874,1303],{"emptyLinePlaceholder":1302},[1241,15876,15877],{"class":1243,"line":1584},[1241,15878,15879],{"class":1247},"# Create user\n",[1241,15881,15882,15884,15886,15889,15891,15894],{"class":1243,"line":1621},[1241,15883,13406],{"class":1254},[1241,15885,15766],{"class":1262},[1241,15887,15888],{"class":1262}," users",[1241,15890,3967],{"class":1262},[1241,15892,15893],{"class":1262}," django_user",[1241,15895,7890],{"class":1724},[1241,15897,15898,15901],{"class":1243,"line":1627},[1241,15899,15900],{"class":1269},"    --instance=django-db",[1241,15902,7890],{"class":1724},[1241,15904,15905],{"class":1243,"line":1633},[1241,15906,15907],{"class":1269},"    --password=UserPassword123!\n",[1241,15909,15910],{"class":1243,"line":1639},[1241,15911,1303],{"emptyLinePlaceholder":1302},[1241,15913,15914],{"class":1243,"line":1645},[1241,15915,15916],{"class":1247},"# Get connection name\n",[1241,15918,15919,15921,15923,15925,15928,15930,15933,15935,15938],{"class":1243,"line":2028},[1241,15920,13406],{"class":1254},[1241,15922,15766],{"class":1262},[1241,15924,15769],{"class":1262},[1241,15926,15927],{"class":1262}," describe",[1241,15929,15774],{"class":1262},[1241,15931,15932],{"class":1269}," --format=",[1241,15934,1266],{"class":1258},[1241,15936,15937],{"class":1262},"value(connectionName)",[1241,15939,1278],{"class":1258},[1026,15941,15942],{},[1042,15943,15944],{},"Cloud SQL Proxy for Local Development",[1128,15946,15948],{"className":1235,"code":15947,"language":1237,"meta":1137,"style":1137},"# Download Cloud SQL Proxy\nwget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy\nchmod +x cloud_sql_proxy\n\n# Run proxy\n./cloud_sql_proxy -instances=your-project:us-central1:django-db=tcp:5432\n",[1135,15949,15950,15955,15969,15979,15983,15988],{"__ignoreMap":1137},[1241,15951,15952],{"class":1243,"line":1244},[1241,15953,15954],{"class":1247},"# Download Cloud SQL Proxy\n",[1241,15956,15957,15960,15963,15966],{"class":1243,"line":1251},[1241,15958,15959],{"class":1254},"wget",[1241,15961,15962],{"class":1262}," https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64",[1241,15964,15965],{"class":1269}," -O",[1241,15967,15968],{"class":1262}," cloud_sql_proxy\n",[1241,15970,15971,15974,15977],{"class":1243,"line":1281},[1241,15972,15973],{"class":1254},"chmod",[1241,15975,15976],{"class":1262}," +x",[1241,15978,15968],{"class":1262},[1241,15980,15981],{"class":1243,"line":1290},[1241,15982,1303],{"emptyLinePlaceholder":1302},[1241,15984,15985],{"class":1243,"line":1299},[1241,15986,15987],{"class":1247},"# Run proxy\n",[1241,15989,15990,15993],{"class":1243,"line":1306},[1241,15991,15992],{"class":1254},"./cloud_sql_proxy",[1241,15994,15995],{"class":1269}," -instances=your-project:us-central1:django-db=tcp:5432\n",[1035,15997,15999],{"id":15998},"memorystore-redis-setup","Memorystore Redis Setup",[1026,16001,16002],{},[1042,16003,16004],{},"Create Redis Instance",[1128,16006,16008],{"className":1235,"code":16007,"language":1237,"meta":1137,"style":1137},"# Create Redis instance\ngcloud redis instances create django-redis \\\n    --size=1 \\\n    --region=us-central1 \\\n    --redis-version=redis_6_x \\\n    --tier=basic\n\n# Get Redis host\ngcloud redis instances describe django-redis \\\n    --region=us-central1 \\\n    --format=\"value(host)\"\n",[1135,16009,16010,16015,16030,16037,16043,16050,16055,16059,16064,16078,16084],{"__ignoreMap":1137},[1241,16011,16012],{"class":1243,"line":1244},[1241,16013,16014],{"class":1247},"# Create Redis instance\n",[1241,16016,16017,16019,16021,16023,16025,16028],{"class":1243,"line":1251},[1241,16018,13406],{"class":1254},[1241,16020,9784],{"class":1262},[1241,16022,15769],{"class":1262},[1241,16024,3967],{"class":1262},[1241,16026,16027],{"class":1262}," django-redis",[1241,16029,7890],{"class":1724},[1241,16031,16032,16035],{"class":1243,"line":1281},[1241,16033,16034],{"class":1269},"    --size=1",[1241,16036,7890],{"class":1724},[1241,16038,16039,16041],{"class":1243,"line":1290},[1241,16040,15795],{"class":1269},[1241,16042,7890],{"class":1724},[1241,16044,16045,16048],{"class":1243,"line":1299},[1241,16046,16047],{"class":1269},"    --redis-version=redis_6_x",[1241,16049,7890],{"class":1724},[1241,16051,16052],{"class":1243,"line":1306},[1241,16053,16054],{"class":1269},"    --tier=basic\n",[1241,16056,16057],{"class":1243,"line":1312},[1241,16058,1303],{"emptyLinePlaceholder":1302},[1241,16060,16061],{"class":1243,"line":1321},[1241,16062,16063],{"class":1247},"# Get Redis host\n",[1241,16065,16066,16068,16070,16072,16074,16076],{"class":1243,"line":1327},[1241,16067,13406],{"class":1254},[1241,16069,9784],{"class":1262},[1241,16071,15769],{"class":1262},[1241,16073,15927],{"class":1262},[1241,16075,16027],{"class":1262},[1241,16077,7890],{"class":1724},[1241,16079,16080,16082],{"class":1243,"line":1333},[1241,16081,15795],{"class":1269},[1241,16083,7890],{"class":1724},[1241,16085,16086,16089,16091,16094],{"class":1243,"line":1339},[1241,16087,16088],{"class":1269},"    --format=",[1241,16090,1266],{"class":1258},[1241,16092,16093],{"class":1262},"value(host)",[1241,16095,1278],{"class":1258},[1035,16097,16099],{"id":16098},"cloud-run-deployment","Cloud Run Deployment",[1026,16101,16102],{},"Cloud Run provides serverless container deployment with automatic scaling and pay-per-use pricing.",[1026,16104,16105],{},[1042,16106,16107],{},"Dockerfile for Cloud Run",[1128,16109,16113],{"className":16110,"code":16111,"language":16112,"meta":1137,"style":1137},"language-dockerfile shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Dockerfile for Cloud Run\nFROM python:3.11-slim\n\n# Set environment variables\nENV PYTHONDONTWRITEBYTECODE=1\nENV PYTHONUNBUFFERED=1\nENV PORT=8080\n\n# Install system dependencies\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends \\\n        postgresql-client \\\n        build-essential \\\n        libpq-dev \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Set work directory\nWORKDIR /app\n\n# Install Python dependencies\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Copy project\nCOPY . .\n\n# Collect static files\nRUN python manage.py collectstatic --noinput\n\n# Create non-root user\nRUN adduser --disabled-password --gecos '' appuser\nRUN chown -R appuser:appuser /app\nUSER appuser\n\n# Expose port\nEXPOSE 8080\n\n# Run the application\nCMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 myproject.wsgi:application\n","dockerfile",[1135,16114,16115,16120,16129,16133,16137,16145,16152,16159,16163,16168,16176,16181,16186,16191,16196,16201,16205,16210,16218,16222,16227,16235,16242,16246,16251,16258,16262,16267,16274,16278,16283,16296,16303,16309,16313,16318,16326,16330,16335],{"__ignoreMap":1137},[1241,16116,16117],{"class":1243,"line":1244},[1241,16118,16119],{"class":1247},"# Dockerfile for Cloud Run\n",[1241,16121,16122,16126],{"class":1243,"line":1251},[1241,16123,16125],{"class":16124},"scgAs","FROM",[1241,16127,16128],{"class":1692}," python:3.11-slim\n",[1241,16130,16131],{"class":1243,"line":1281},[1241,16132,1303],{"emptyLinePlaceholder":1302},[1241,16134,16135],{"class":1243,"line":1290},[1241,16136,4007],{"class":1247},[1241,16138,16139,16142],{"class":1243,"line":1299},[1241,16140,16141],{"class":16124},"ENV",[1241,16143,16144],{"class":1692}," PYTHONDONTWRITEBYTECODE=1\n",[1241,16146,16147,16149],{"class":1243,"line":1306},[1241,16148,16141],{"class":16124},[1241,16150,16151],{"class":1692}," PYTHONUNBUFFERED=1\n",[1241,16153,16154,16156],{"class":1243,"line":1312},[1241,16155,16141],{"class":16124},[1241,16157,16158],{"class":1692}," PORT=8080\n",[1241,16160,16161],{"class":1243,"line":1321},[1241,16162,1303],{"emptyLinePlaceholder":1302},[1241,16164,16165],{"class":1243,"line":1327},[1241,16166,16167],{"class":1247},"# Install system dependencies\n",[1241,16169,16170,16173],{"class":1243,"line":1333},[1241,16171,16172],{"class":16124},"RUN",[1241,16174,16175],{"class":1692}," apt-get update \\\n",[1241,16177,16178],{"class":1243,"line":1339},[1241,16179,16180],{"class":1692},"    && apt-get install -y --no-install-recommends \\\n",[1241,16182,16183],{"class":1243,"line":1345},[1241,16184,16185],{"class":1692},"        postgresql-client \\\n",[1241,16187,16188],{"class":1243,"line":1350},[1241,16189,16190],{"class":1692},"        build-essential \\\n",[1241,16192,16193],{"class":1243,"line":1356},[1241,16194,16195],{"class":1692},"        libpq-dev \\\n",[1241,16197,16198],{"class":1243,"line":1554},[1241,16199,16200],{"class":1692},"    && rm -rf /var/lib/apt/lists/*\n",[1241,16202,16203],{"class":1243,"line":1569},[1241,16204,1303],{"emptyLinePlaceholder":1302},[1241,16206,16207],{"class":1243,"line":1584},[1241,16208,16209],{"class":1247},"# Set work directory\n",[1241,16211,16212,16215],{"class":1243,"line":1621},[1241,16213,16214],{"class":16124},"WORKDIR",[1241,16216,16217],{"class":1692}," /app\n",[1241,16219,16220],{"class":1243,"line":1627},[1241,16221,1303],{"emptyLinePlaceholder":1302},[1241,16223,16224],{"class":1243,"line":1633},[1241,16225,16226],{"class":1247},"# Install Python dependencies\n",[1241,16228,16229,16232],{"class":1243,"line":1639},[1241,16230,16231],{"class":16124},"COPY",[1241,16233,16234],{"class":1692}," requirements.txt .\n",[1241,16236,16237,16239],{"class":1243,"line":1645},[1241,16238,16172],{"class":16124},[1241,16240,16241],{"class":1692}," pip install --no-cache-dir -r requirements.txt\n",[1241,16243,16244],{"class":1243,"line":2028},[1241,16245,1303],{"emptyLinePlaceholder":1302},[1241,16247,16248],{"class":1243,"line":2042},[1241,16249,16250],{"class":1247},"# Copy project\n",[1241,16252,16253,16255],{"class":1243,"line":2064},[1241,16254,16231],{"class":16124},[1241,16256,16257],{"class":1692}," . .\n",[1241,16259,16260],{"class":1243,"line":2070},[1241,16261,1303],{"emptyLinePlaceholder":1302},[1241,16263,16264],{"class":1243,"line":2075},[1241,16265,16266],{"class":1247},"# Collect static files\n",[1241,16268,16269,16271],{"class":1243,"line":2080},[1241,16270,16172],{"class":16124},[1241,16272,16273],{"class":1692}," python manage.py collectstatic --noinput\n",[1241,16275,16276],{"class":1243,"line":2085},[1241,16277,1303],{"emptyLinePlaceholder":1302},[1241,16279,16280],{"class":1243,"line":2091},[1241,16281,16282],{"class":1247},"# Create non-root user\n",[1241,16284,16285,16287,16290,16293],{"class":1243,"line":2120},[1241,16286,16172],{"class":16124},[1241,16288,16289],{"class":1692}," adduser --disabled-password --gecos ",[1241,16291,16292],{"class":1262},"''",[1241,16294,16295],{"class":1692}," appuser\n",[1241,16297,16298,16300],{"class":1243,"line":2148},[1241,16299,16172],{"class":16124},[1241,16301,16302],{"class":1692}," chown -R appuser:appuser /app\n",[1241,16304,16305,16307],{"class":1243,"line":2177},[1241,16306,1921],{"class":16124},[1241,16308,16295],{"class":1692},[1241,16310,16311],{"class":1243,"line":2214},[1241,16312,1303],{"emptyLinePlaceholder":1302},[1241,16314,16315],{"class":1243,"line":2240},[1241,16316,16317],{"class":1247},"# Expose port\n",[1241,16319,16320,16323],{"class":1243,"line":2245},[1241,16321,16322],{"class":16124},"EXPOSE",[1241,16324,16325],{"class":1692}," 8080\n",[1241,16327,16328],{"class":1243,"line":2251},[1241,16329,1303],{"emptyLinePlaceholder":1302},[1241,16331,16332],{"class":1243,"line":2267},[1241,16333,16334],{"class":1247},"# Run the application\n",[1241,16336,16337,16340],{"class":1243,"line":2289},[1241,16338,16339],{"class":16124},"CMD",[1241,16341,16342],{"class":1692}," exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 myproject.wsgi:application\n",[1026,16344,16345],{},[1042,16346,16347],{},"Cloud Build Configuration",[1128,16349,16351],{"className":3017,"code":16350,"language":3019,"meta":1137,"style":1137},"# cloudbuild.yaml\nsteps:\n  # Build the container image\n  - name: 'gcr.io/cloud-builders/docker'\n    args: ['build', '-t', 'gcr.io/$PROJECT_ID/django-app:$COMMIT_SHA', '.']\n  \n  # Push the container image to Container Registry\n  - name: 'gcr.io/cloud-builders/docker'\n    args: ['push', 'gcr.io/$PROJECT_ID/django-app:$COMMIT_SHA']\n  \n  # Deploy container image to Cloud Run\n  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'\n    entrypoint: gcloud\n    args:\n    - 'run'\n    - 'deploy'\n    - 'django-app'\n    - '--image'\n    - 'gcr.io/$PROJECT_ID/django-app:$COMMIT_SHA'\n    - '--region'\n    - 'us-central1'\n    - '--platform'\n    - 'managed'\n    - '--allow-unauthenticated'\n    - '--set-env-vars'\n    - 'DJANGO_SETTINGS_MODULE=myproject.settings.production,GCS_BUCKET_NAME=$_GCS_BUCKET'\n    - '--set-cloudsql-instances'\n    - '$PROJECT_ID:us-central1:django-db'\n    - '--memory'\n    - '2Gi'\n    - '--cpu'\n    - '2'\n    - '--concurrency'\n    - '80'\n    - '--max-instances'\n    - '100'\n    - '--min-instances'\n    - '1'\n    - '--timeout'\n    - '300'\n    - '--port'\n    - '8080'\n    - '--vpc-connector'\n    - 'django-connector'\n    - '--vpc-egress'\n    - 'private-ranges-only'\n\n# Substitutions for environment-specific values\nsubstitutions:\n  _GCS_BUCKET: 'django-app-static-files'\n\n# Build options\noptions:\n  logging: CLOUD_LOGGING_ONLY\n  machineType: 'E2_HIGHCPU_8'\n\nimages:\n  - 'gcr.io/$PROJECT_ID/django-app:$COMMIT_SHA'\n",[1135,16352,16353,16358,16365,16370,16387,16431,16435,16440,16454,16479,16483,16488,16503,16513,16519,16531,16542,16552,16563,16573,16584,16595,16606,16617,16628,16639,16650,16661,16672,16683,16694,16705,16716,16727,16738,16749,16760,16771,16781,16792,16803,16814,16825,16836,16847,16858,16869,16873,16878,16885,16899,16903,16908,16914,16924,16938,16942,16949],{"__ignoreMap":1137},[1241,16354,16355],{"class":1243,"line":1244},[1241,16356,16357],{"class":1247},"# cloudbuild.yaml\n",[1241,16359,16360,16363],{"class":1243,"line":1251},[1241,16361,16362],{"class":1590},"steps",[1241,16364,1840],{"class":1381},[1241,16366,16367],{"class":1243,"line":1281},[1241,16368,16369],{"class":1247},"  # Build the container image\n",[1241,16371,16372,16375,16378,16380,16382,16385],{"class":1243,"line":1290},[1241,16373,16374],{"class":1381},"  -",[1241,16376,16377],{"class":1590}," name",[1241,16379,1397],{"class":1381},[1241,16381,1822],{"class":1258},[1241,16383,16384],{"class":1262},"gcr.io/cloud-builders/docker",[1241,16386,2264],{"class":1258},[1241,16388,16389,16392,16394,16396,16398,16401,16403,16405,16407,16410,16412,16414,16416,16419,16421,16423,16425,16427,16429],{"class":1243,"line":1299},[1241,16390,16391],{"class":1590},"    args",[1241,16393,1397],{"class":1381},[1241,16395,1598],{"class":1381},[1241,16397,1752],{"class":1258},[1241,16399,16400],{"class":1262},"build",[1241,16402,1752],{"class":1258},[1241,16404,1608],{"class":1381},[1241,16406,1822],{"class":1258},[1241,16408,16409],{"class":1262},"-t",[1241,16411,1752],{"class":1258},[1241,16413,1608],{"class":1381},[1241,16415,1822],{"class":1258},[1241,16417,16418],{"class":1262},"gcr.io/$PROJECT_ID/django-app:$COMMIT_SHA",[1241,16420,1752],{"class":1258},[1241,16422,1608],{"class":1381},[1241,16424,1822],{"class":1258},[1241,16426,1773],{"class":1262},[1241,16428,1752],{"class":1258},[1241,16430,1618],{"class":1381},[1241,16432,16433],{"class":1243,"line":1306},[1241,16434,10277],{"class":1692},[1241,16436,16437],{"class":1243,"line":1312},[1241,16438,16439],{"class":1247},"  # Push the container image to Container Registry\n",[1241,16441,16442,16444,16446,16448,16450,16452],{"class":1243,"line":1321},[1241,16443,16374],{"class":1381},[1241,16445,16377],{"class":1590},[1241,16447,1397],{"class":1381},[1241,16449,1822],{"class":1258},[1241,16451,16384],{"class":1262},[1241,16453,2264],{"class":1258},[1241,16455,16456,16458,16460,16462,16464,16467,16469,16471,16473,16475,16477],{"class":1243,"line":1327},[1241,16457,16391],{"class":1590},[1241,16459,1397],{"class":1381},[1241,16461,1598],{"class":1381},[1241,16463,1752],{"class":1258},[1241,16465,16466],{"class":1262},"push",[1241,16468,1752],{"class":1258},[1241,16470,1608],{"class":1381},[1241,16472,1822],{"class":1258},[1241,16474,16418],{"class":1262},[1241,16476,1752],{"class":1258},[1241,16478,1618],{"class":1381},[1241,16480,16481],{"class":1243,"line":1333},[1241,16482,10277],{"class":1692},[1241,16484,16485],{"class":1243,"line":1339},[1241,16486,16487],{"class":1247},"  # Deploy container image to Cloud Run\n",[1241,16489,16490,16492,16494,16496,16498,16501],{"class":1243,"line":1345},[1241,16491,16374],{"class":1381},[1241,16493,16377],{"class":1590},[1241,16495,1397],{"class":1381},[1241,16497,1822],{"class":1258},[1241,16499,16500],{"class":1262},"gcr.io/google.com/cloudsdktool/cloud-sdk",[1241,16502,2264],{"class":1258},[1241,16504,16505,16508,16510],{"class":1243,"line":1350},[1241,16506,16507],{"class":1590},"    entrypoint",[1241,16509,1397],{"class":1381},[1241,16511,16512],{"class":1262}," gcloud\n",[1241,16514,16515,16517],{"class":1243,"line":1356},[1241,16516,16391],{"class":1590},[1241,16518,1840],{"class":1381},[1241,16520,16521,16524,16526,16529],{"class":1243,"line":1554},[1241,16522,16523],{"class":1381},"    -",[1241,16525,1822],{"class":1258},[1241,16527,16528],{"class":1262},"run",[1241,16530,2264],{"class":1258},[1241,16532,16533,16535,16537,16540],{"class":1243,"line":1569},[1241,16534,16523],{"class":1381},[1241,16536,1822],{"class":1258},[1241,16538,16539],{"class":1262},"deploy",[1241,16541,2264],{"class":1258},[1241,16543,16544,16546,16548,16550],{"class":1243,"line":1584},[1241,16545,16523],{"class":1381},[1241,16547,1822],{"class":1258},[1241,16549,5410],{"class":1262},[1241,16551,2264],{"class":1258},[1241,16553,16554,16556,16558,16561],{"class":1243,"line":1621},[1241,16555,16523],{"class":1381},[1241,16557,1822],{"class":1258},[1241,16559,16560],{"class":1262},"--image",[1241,16562,2264],{"class":1258},[1241,16564,16565,16567,16569,16571],{"class":1243,"line":1627},[1241,16566,16523],{"class":1381},[1241,16568,1822],{"class":1258},[1241,16570,16418],{"class":1262},[1241,16572,2264],{"class":1258},[1241,16574,16575,16577,16579,16582],{"class":1243,"line":1633},[1241,16576,16523],{"class":1381},[1241,16578,1822],{"class":1258},[1241,16580,16581],{"class":1262},"--region",[1241,16583,2264],{"class":1258},[1241,16585,16586,16588,16590,16593],{"class":1243,"line":1639},[1241,16587,16523],{"class":1381},[1241,16589,1822],{"class":1258},[1241,16591,16592],{"class":1262},"us-central1",[1241,16594,2264],{"class":1258},[1241,16596,16597,16599,16601,16604],{"class":1243,"line":1645},[1241,16598,16523],{"class":1381},[1241,16600,1822],{"class":1258},[1241,16602,16603],{"class":1262},"--platform",[1241,16605,2264],{"class":1258},[1241,16607,16608,16610,16612,16615],{"class":1243,"line":2028},[1241,16609,16523],{"class":1381},[1241,16611,1822],{"class":1258},[1241,16613,16614],{"class":1262},"managed",[1241,16616,2264],{"class":1258},[1241,16618,16619,16621,16623,16626],{"class":1243,"line":2042},[1241,16620,16523],{"class":1381},[1241,16622,1822],{"class":1258},[1241,16624,16625],{"class":1262},"--allow-unauthenticated",[1241,16627,2264],{"class":1258},[1241,16629,16630,16632,16634,16637],{"class":1243,"line":2064},[1241,16631,16523],{"class":1381},[1241,16633,1822],{"class":1258},[1241,16635,16636],{"class":1262},"--set-env-vars",[1241,16638,2264],{"class":1258},[1241,16640,16641,16643,16645,16648],{"class":1243,"line":2070},[1241,16642,16523],{"class":1381},[1241,16644,1822],{"class":1258},[1241,16646,16647],{"class":1262},"DJANGO_SETTINGS_MODULE=myproject.settings.production,GCS_BUCKET_NAME=$_GCS_BUCKET",[1241,16649,2264],{"class":1258},[1241,16651,16652,16654,16656,16659],{"class":1243,"line":2075},[1241,16653,16523],{"class":1381},[1241,16655,1822],{"class":1258},[1241,16657,16658],{"class":1262},"--set-cloudsql-instances",[1241,16660,2264],{"class":1258},[1241,16662,16663,16665,16667,16670],{"class":1243,"line":2080},[1241,16664,16523],{"class":1381},[1241,16666,1822],{"class":1258},[1241,16668,16669],{"class":1262},"$PROJECT_ID:us-central1:django-db",[1241,16671,2264],{"class":1258},[1241,16673,16674,16676,16678,16681],{"class":1243,"line":2085},[1241,16675,16523],{"class":1381},[1241,16677,1822],{"class":1258},[1241,16679,16680],{"class":1262},"--memory",[1241,16682,2264],{"class":1258},[1241,16684,16685,16687,16689,16692],{"class":1243,"line":2091},[1241,16686,16523],{"class":1381},[1241,16688,1822],{"class":1258},[1241,16690,16691],{"class":1262},"2Gi",[1241,16693,2264],{"class":1258},[1241,16695,16696,16698,16700,16703],{"class":1243,"line":2120},[1241,16697,16523],{"class":1381},[1241,16699,1822],{"class":1258},[1241,16701,16702],{"class":1262},"--cpu",[1241,16704,2264],{"class":1258},[1241,16706,16707,16709,16711,16714],{"class":1243,"line":2148},[1241,16708,16523],{"class":1381},[1241,16710,1822],{"class":1258},[1241,16712,16713],{"class":1262},"2",[1241,16715,2264],{"class":1258},[1241,16717,16718,16720,16722,16725],{"class":1243,"line":2177},[1241,16719,16523],{"class":1381},[1241,16721,1822],{"class":1258},[1241,16723,16724],{"class":1262},"--concurrency",[1241,16726,2264],{"class":1258},[1241,16728,16729,16731,16733,16736],{"class":1243,"line":2214},[1241,16730,16523],{"class":1381},[1241,16732,1822],{"class":1258},[1241,16734,16735],{"class":1262},"80",[1241,16737,2264],{"class":1258},[1241,16739,16740,16742,16744,16747],{"class":1243,"line":2240},[1241,16741,16523],{"class":1381},[1241,16743,1822],{"class":1258},[1241,16745,16746],{"class":1262},"--max-instances",[1241,16748,2264],{"class":1258},[1241,16750,16751,16753,16755,16758],{"class":1243,"line":2245},[1241,16752,16523],{"class":1381},[1241,16754,1822],{"class":1258},[1241,16756,16757],{"class":1262},"100",[1241,16759,2264],{"class":1258},[1241,16761,16762,16764,16766,16769],{"class":1243,"line":2251},[1241,16763,16523],{"class":1381},[1241,16765,1822],{"class":1258},[1241,16767,16768],{"class":1262},"--min-instances",[1241,16770,2264],{"class":1258},[1241,16772,16773,16775,16777,16779],{"class":1243,"line":2267},[1241,16774,16523],{"class":1381},[1241,16776,1822],{"class":1258},[1241,16778,10576],{"class":1262},[1241,16780,2264],{"class":1258},[1241,16782,16783,16785,16787,16790],{"class":1243,"line":2289},[1241,16784,16523],{"class":1381},[1241,16786,1822],{"class":1258},[1241,16788,16789],{"class":1262},"--timeout",[1241,16791,2264],{"class":1258},[1241,16793,16794,16796,16798,16801],{"class":1243,"line":2294},[1241,16795,16523],{"class":1381},[1241,16797,1822],{"class":1258},[1241,16799,16800],{"class":1262},"300",[1241,16802,2264],{"class":1258},[1241,16804,16805,16807,16809,16812],{"class":1243,"line":2300},[1241,16806,16523],{"class":1381},[1241,16808,1822],{"class":1258},[1241,16810,16811],{"class":1262},"--port",[1241,16813,2264],{"class":1258},[1241,16815,16816,16818,16820,16823],{"class":1243,"line":2314},[1241,16817,16523],{"class":1381},[1241,16819,1822],{"class":1258},[1241,16821,16822],{"class":1262},"8080",[1241,16824,2264],{"class":1258},[1241,16826,16827,16829,16831,16834],{"class":1243,"line":2335},[1241,16828,16523],{"class":1381},[1241,16830,1822],{"class":1258},[1241,16832,16833],{"class":1262},"--vpc-connector",[1241,16835,2264],{"class":1258},[1241,16837,16838,16840,16842,16845],{"class":1243,"line":2340},[1241,16839,16523],{"class":1381},[1241,16841,1822],{"class":1258},[1241,16843,16844],{"class":1262},"django-connector",[1241,16846,2264],{"class":1258},[1241,16848,16849,16851,16853,16856],{"class":1243,"line":2346},[1241,16850,16523],{"class":1381},[1241,16852,1822],{"class":1258},[1241,16854,16855],{"class":1262},"--vpc-egress",[1241,16857,2264],{"class":1258},[1241,16859,16860,16862,16864,16867],{"class":1243,"line":2361},[1241,16861,16523],{"class":1381},[1241,16863,1822],{"class":1258},[1241,16865,16866],{"class":1262},"private-ranges-only",[1241,16868,2264],{"class":1258},[1241,16870,16871],{"class":1243,"line":2371},[1241,16872,1303],{"emptyLinePlaceholder":1302},[1241,16874,16875],{"class":1243,"line":2392},[1241,16876,16877],{"class":1247},"# Substitutions for environment-specific values\n",[1241,16879,16880,16883],{"class":1243,"line":2397},[1241,16881,16882],{"class":1590},"substitutions",[1241,16884,1840],{"class":1381},[1241,16886,16887,16890,16892,16894,16897],{"class":1243,"line":2407},[1241,16888,16889],{"class":1590},"  _GCS_BUCKET",[1241,16891,1397],{"class":1381},[1241,16893,1822],{"class":1258},[1241,16895,16896],{"class":1262},"django-app-static-files",[1241,16898,2264],{"class":1258},[1241,16900,16901],{"class":1243,"line":2417},[1241,16902,1303],{"emptyLinePlaceholder":1302},[1241,16904,16905],{"class":1243,"line":2422},[1241,16906,16907],{"class":1247},"# Build options\n",[1241,16909,16910,16912],{"class":1243,"line":2428},[1241,16911,5959],{"class":1590},[1241,16913,1840],{"class":1381},[1241,16915,16916,16919,16921],{"class":1243,"line":2439},[1241,16917,16918],{"class":1590},"  logging",[1241,16920,1397],{"class":1381},[1241,16922,16923],{"class":1262}," CLOUD_LOGGING_ONLY\n",[1241,16925,16926,16929,16931,16933,16936],{"class":1243,"line":2468},[1241,16927,16928],{"class":1590},"  machineType",[1241,16930,1397],{"class":1381},[1241,16932,1822],{"class":1258},[1241,16934,16935],{"class":1262},"E2_HIGHCPU_8",[1241,16937,2264],{"class":1258},[1241,16939,16940],{"class":1243,"line":2480},[1241,16941,1303],{"emptyLinePlaceholder":1302},[1241,16943,16944,16947],{"class":1243,"line":2490},[1241,16945,16946],{"class":1590},"images",[1241,16948,1840],{"class":1381},[1241,16950,16951,16953,16955,16957],{"class":1243,"line":2500},[1241,16952,16374],{"class":1381},[1241,16954,1822],{"class":1258},[1241,16956,16418],{"class":1262},[1241,16958,2264],{"class":1258},[1026,16960,16961],{},[1042,16962,16963],{},"Cloud Run Service Configuration",[1128,16965,16967],{"className":3017,"code":16966,"language":3019,"meta":1137,"style":1137},"# service.yaml\napiVersion: serving.knative.dev/v1\nkind: Service\nmetadata:\n  name: django-app\n  annotations:\n    run.googleapis.com/ingress: all\n    run.googleapis.com/ingress-status: all\nspec:\n  template:\n    metadata:\n      annotations:\n        run.googleapis.com/cloudsql-instances: your-project:us-central1:django-db\n        run.googleapis.com/vpc-access-connector: django-connector\n        run.googleapis.com/vpc-access-egress: private-ranges-only\n        autoscaling.knative.dev/maxScale: \"100\"\n        autoscaling.knative.dev/minScale: \"1\"\n        run.googleapis.com/cpu-throttling: \"false\"\n    spec:\n      containerConcurrency: 80\n      timeoutSeconds: 300\n      containers:\n      - image: gcr.io/your-project/django-app:latest\n        ports:\n        - containerPort: 8080\n        env:\n        - name: DJANGO_SETTINGS_MODULE\n          value: myproject.settings.production\n        - name: DATABASE_URL\n          valueFrom:\n            secretKeyRef:\n              name: django-secrets\n              key: database-url\n        - name: SECRET_KEY\n          valueFrom:\n            secretKeyRef:\n              name: django-secrets\n              key: secret-key\n        resources:\n          limits:\n            cpu: \"2\"\n            memory: \"2Gi\"\n        livenessProbe:\n          httpGet:\n            path: /health/\n            port: 8080\n          initialDelaySeconds: 30\n          periodSeconds: 10\n        readinessProbe:\n          httpGet:\n            path: /ready/\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n",[1135,16968,16969,16974,16984,16994,17001,17009,17016,17026,17035,17042,17049,17056,17063,17072,17082,17092,17105,17118,17132,17139,17148,17157,17164,17177,17184,17195,17202,17213,17222,17233,17240,17247,17257,17267,17278,17284,17290,17298,17307,17314,17321,17334,17347,17354,17361,17370,17379,17388,17397,17404,17410,17419,17427,17435],{"__ignoreMap":1137},[1241,16970,16971],{"class":1243,"line":1244},[1241,16972,16973],{"class":1247},"# service.yaml\n",[1241,16975,16976,16979,16981],{"class":1243,"line":1251},[1241,16977,16978],{"class":1590},"apiVersion",[1241,16980,1397],{"class":1381},[1241,16982,16983],{"class":1262}," serving.knative.dev/v1\n",[1241,16985,16986,16989,16991],{"class":1243,"line":1281},[1241,16987,16988],{"class":1590},"kind",[1241,16990,1397],{"class":1381},[1241,16992,16993],{"class":1262}," Service\n",[1241,16995,16996,16999],{"class":1243,"line":1290},[1241,16997,16998],{"class":1590},"metadata",[1241,17000,1840],{"class":1381},[1241,17002,17003,17005,17007],{"class":1243,"line":1299},[1241,17004,14219],{"class":1590},[1241,17006,1397],{"class":1381},[1241,17008,4152],{"class":1262},[1241,17010,17011,17014],{"class":1243,"line":1306},[1241,17012,17013],{"class":1590},"  annotations",[1241,17015,1840],{"class":1381},[1241,17017,17018,17021,17023],{"class":1243,"line":1312},[1241,17019,17020],{"class":1590},"    run.googleapis.com/ingress",[1241,17022,1397],{"class":1381},[1241,17024,17025],{"class":1262}," all\n",[1241,17027,17028,17031,17033],{"class":1243,"line":1321},[1241,17029,17030],{"class":1590},"    run.googleapis.com/ingress-status",[1241,17032,1397],{"class":1381},[1241,17034,17025],{"class":1262},[1241,17036,17037,17040],{"class":1243,"line":1327},[1241,17038,17039],{"class":1590},"spec",[1241,17041,1840],{"class":1381},[1241,17043,17044,17047],{"class":1243,"line":1333},[1241,17045,17046],{"class":1590},"  template",[1241,17048,1840],{"class":1381},[1241,17050,17051,17054],{"class":1243,"line":1339},[1241,17052,17053],{"class":1590},"    metadata",[1241,17055,1840],{"class":1381},[1241,17057,17058,17061],{"class":1243,"line":1345},[1241,17059,17060],{"class":1590},"      annotations",[1241,17062,1840],{"class":1381},[1241,17064,17065,17068,17070],{"class":1243,"line":1350},[1241,17066,17067],{"class":1590},"        run.googleapis.com/cloudsql-instances",[1241,17069,1397],{"class":1381},[1241,17071,14198],{"class":1262},[1241,17073,17074,17077,17079],{"class":1243,"line":1356},[1241,17075,17076],{"class":1590},"        run.googleapis.com/vpc-access-connector",[1241,17078,1397],{"class":1381},[1241,17080,17081],{"class":1262}," django-connector\n",[1241,17083,17084,17087,17089],{"class":1243,"line":1554},[1241,17085,17086],{"class":1590},"        run.googleapis.com/vpc-access-egress",[1241,17088,1397],{"class":1381},[1241,17090,17091],{"class":1262}," private-ranges-only\n",[1241,17093,17094,17097,17099,17101,17103],{"class":1243,"line":1569},[1241,17095,17096],{"class":1590},"        autoscaling.knative.dev/maxScale",[1241,17098,1397],{"class":1381},[1241,17100,1259],{"class":1258},[1241,17102,16757],{"class":1262},[1241,17104,1278],{"class":1258},[1241,17106,17107,17110,17112,17114,17116],{"class":1243,"line":1584},[1241,17108,17109],{"class":1590},"        autoscaling.knative.dev/minScale",[1241,17111,1397],{"class":1381},[1241,17113,1259],{"class":1258},[1241,17115,10576],{"class":1262},[1241,17117,1278],{"class":1258},[1241,17119,17120,17123,17125,17127,17130],{"class":1243,"line":1621},[1241,17121,17122],{"class":1590},"        run.googleapis.com/cpu-throttling",[1241,17124,1397],{"class":1381},[1241,17126,1259],{"class":1258},[1241,17128,17129],{"class":1262},"false",[1241,17131,1278],{"class":1258},[1241,17133,17134,17137],{"class":1243,"line":1627},[1241,17135,17136],{"class":1590},"    spec",[1241,17138,1840],{"class":1381},[1241,17140,17141,17144,17146],{"class":1243,"line":1633},[1241,17142,17143],{"class":1590},"      containerConcurrency",[1241,17145,1397],{"class":1381},[1241,17147,3470],{"class":2476},[1241,17149,17150,17153,17155],{"class":1243,"line":1639},[1241,17151,17152],{"class":1590},"      timeoutSeconds",[1241,17154,1397],{"class":1381},[1241,17156,3433],{"class":2476},[1241,17158,17159,17162],{"class":1243,"line":1645},[1241,17160,17161],{"class":1590},"      containers",[1241,17163,1840],{"class":1381},[1241,17165,17166,17169,17172,17174],{"class":1243,"line":2028},[1241,17167,17168],{"class":1381},"      -",[1241,17170,17171],{"class":1590}," image",[1241,17173,1397],{"class":1381},[1241,17175,17176],{"class":1262}," gcr.io/your-project/django-app:latest\n",[1241,17178,17179,17182],{"class":1243,"line":2042},[1241,17180,17181],{"class":1590},"        ports",[1241,17183,1840],{"class":1381},[1241,17185,17186,17188,17191,17193],{"class":1243,"line":2064},[1241,17187,10400],{"class":1381},[1241,17189,17190],{"class":1590}," containerPort",[1241,17192,1397],{"class":1381},[1241,17194,16325],{"class":2476},[1241,17196,17197,17200],{"class":1243,"line":2070},[1241,17198,17199],{"class":1590},"        env",[1241,17201,1840],{"class":1381},[1241,17203,17204,17206,17208,17210],{"class":1243,"line":2075},[1241,17205,10400],{"class":1381},[1241,17207,16377],{"class":1590},[1241,17209,1397],{"class":1381},[1241,17211,17212],{"class":1262}," DJANGO_SETTINGS_MODULE\n",[1241,17214,17215,17218,17220],{"class":1243,"line":2080},[1241,17216,17217],{"class":1590},"          value",[1241,17219,1397],{"class":1381},[1241,17221,3136],{"class":1262},[1241,17223,17224,17226,17228,17230],{"class":1243,"line":2085},[1241,17225,10400],{"class":1381},[1241,17227,16377],{"class":1590},[1241,17229,1397],{"class":1381},[1241,17231,17232],{"class":1262}," DATABASE_URL\n",[1241,17234,17235,17238],{"class":1243,"line":2091},[1241,17236,17237],{"class":1590},"          valueFrom",[1241,17239,1840],{"class":1381},[1241,17241,17242,17245],{"class":1243,"line":2120},[1241,17243,17244],{"class":1590},"            secretKeyRef",[1241,17246,1840],{"class":1381},[1241,17248,17249,17252,17254],{"class":1243,"line":2148},[1241,17250,17251],{"class":1590},"              name",[1241,17253,1397],{"class":1381},[1241,17255,17256],{"class":1262}," django-secrets\n",[1241,17258,17259,17262,17264],{"class":1243,"line":2177},[1241,17260,17261],{"class":1590},"              key",[1241,17263,1397],{"class":1381},[1241,17265,17266],{"class":1262}," database-url\n",[1241,17268,17269,17271,17273,17275],{"class":1243,"line":2214},[1241,17270,10400],{"class":1381},[1241,17272,16377],{"class":1590},[1241,17274,1397],{"class":1381},[1241,17276,17277],{"class":1262}," SECRET_KEY\n",[1241,17279,17280,17282],{"class":1243,"line":2240},[1241,17281,17237],{"class":1590},[1241,17283,1840],{"class":1381},[1241,17285,17286,17288],{"class":1243,"line":2245},[1241,17287,17244],{"class":1590},[1241,17289,1840],{"class":1381},[1241,17291,17292,17294,17296],{"class":1243,"line":2251},[1241,17293,17251],{"class":1590},[1241,17295,1397],{"class":1381},[1241,17297,17256],{"class":1262},[1241,17299,17300,17302,17304],{"class":1243,"line":2267},[1241,17301,17261],{"class":1590},[1241,17303,1397],{"class":1381},[1241,17305,17306],{"class":1262}," secret-key\n",[1241,17308,17309,17312],{"class":1243,"line":2289},[1241,17310,17311],{"class":1590},"        resources",[1241,17313,1840],{"class":1381},[1241,17315,17316,17319],{"class":1243,"line":2294},[1241,17317,17318],{"class":1590},"          limits",[1241,17320,1840],{"class":1381},[1241,17322,17323,17326,17328,17330,17332],{"class":1243,"line":2300},[1241,17324,17325],{"class":1590},"            cpu",[1241,17327,1397],{"class":1381},[1241,17329,1259],{"class":1258},[1241,17331,16713],{"class":1262},[1241,17333,1278],{"class":1258},[1241,17335,17336,17339,17341,17343,17345],{"class":1243,"line":2314},[1241,17337,17338],{"class":1590},"            memory",[1241,17340,1397],{"class":1381},[1241,17342,1259],{"class":1258},[1241,17344,16691],{"class":1262},[1241,17346,1278],{"class":1258},[1241,17348,17349,17352],{"class":1243,"line":2335},[1241,17350,17351],{"class":1590},"        livenessProbe",[1241,17353,1840],{"class":1381},[1241,17355,17356,17359],{"class":1243,"line":2340},[1241,17357,17358],{"class":1590},"          httpGet",[1241,17360,1840],{"class":1381},[1241,17362,17363,17366,17368],{"class":1243,"line":2346},[1241,17364,17365],{"class":1590},"            path",[1241,17367,1397],{"class":1381},[1241,17369,3614],{"class":1262},[1241,17371,17372,17375,17377],{"class":1243,"line":2361},[1241,17373,17374],{"class":1590},"            port",[1241,17376,1397],{"class":1381},[1241,17378,16325],{"class":2476},[1241,17380,17381,17384,17386],{"class":1243,"line":2371},[1241,17382,17383],{"class":1590},"          initialDelaySeconds",[1241,17385,1397],{"class":1381},[1241,17387,12360],{"class":2476},[1241,17389,17390,17393,17395],{"class":1243,"line":2392},[1241,17391,17392],{"class":1590},"          periodSeconds",[1241,17394,1397],{"class":1381},[1241,17396,3423],{"class":2476},[1241,17398,17399,17402],{"class":1243,"line":2397},[1241,17400,17401],{"class":1590},"        readinessProbe",[1241,17403,1840],{"class":1381},[1241,17405,17406,17408],{"class":1243,"line":2407},[1241,17407,17358],{"class":1590},[1241,17409,1840],{"class":1381},[1241,17411,17412,17414,17416],{"class":1243,"line":2417},[1241,17413,17365],{"class":1590},[1241,17415,1397],{"class":1381},[1241,17417,17418],{"class":1262}," /ready/\n",[1241,17420,17421,17423,17425],{"class":1243,"line":2422},[1241,17422,17374],{"class":1590},[1241,17424,1397],{"class":1381},[1241,17426,16325],{"class":2476},[1241,17428,17429,17431,17433],{"class":1243,"line":2428},[1241,17430,17383],{"class":1590},[1241,17432,1397],{"class":1381},[1241,17434,12371],{"class":2476},[1241,17436,17437,17439,17441],{"class":1243,"line":2439},[1241,17438,17392],{"class":1590},[1241,17440,1397],{"class":1381},[1241,17442,12371],{"class":2476},[1026,17444,17445],{},[1042,17446,17447],{},"Deploy to Cloud Run",[1128,17449,17451],{"className":1235,"code":17450,"language":1237,"meta":1137,"style":1137},"# Build and deploy using Cloud Build\ngcloud builds submit --config cloudbuild.yaml\n\n# Direct deployment\ngcloud run deploy django-app \\\n    --image gcr.io/your-project/django-app:latest \\\n    --platform managed \\\n    --region us-central1 \\\n    --allow-unauthenticated \\\n    --memory 2Gi \\\n    --cpu 2 \\\n    --concurrency 80 \\\n    --max-instances 100 \\\n    --min-instances 1 \\\n    --set-cloudsql-instances your-project:us-central1:django-db \\\n    --set-env-vars DJANGO_SETTINGS_MODULE=myproject.settings.production\n\n# Update traffic allocation\ngcloud run services update-traffic django-app \\\n    --to-latest \\\n    --region us-central1\n\n# View service details\ngcloud run services describe django-app --region us-central1\n",[1135,17452,17453,17458,17474,17478,17483,17496,17506,17516,17526,17533,17543,17552,17561,17570,17579,17589,17597,17601,17606,17621,17628,17634,17638,17643],{"__ignoreMap":1137},[1241,17454,17455],{"class":1243,"line":1244},[1241,17456,17457],{"class":1247},"# Build and deploy using Cloud Build\n",[1241,17459,17460,17462,17465,17468,17471],{"class":1243,"line":1251},[1241,17461,13406],{"class":1254},[1241,17463,17464],{"class":1262}," builds",[1241,17466,17467],{"class":1262}," submit",[1241,17469,17470],{"class":1269}," --config",[1241,17472,17473],{"class":1262}," cloudbuild.yaml\n",[1241,17475,17476],{"class":1243,"line":1281},[1241,17477,1303],{"emptyLinePlaceholder":1302},[1241,17479,17480],{"class":1243,"line":1290},[1241,17481,17482],{"class":1247},"# Direct deployment\n",[1241,17484,17485,17487,17490,17492,17494],{"class":1243,"line":1299},[1241,17486,13406],{"class":1254},[1241,17488,17489],{"class":1262}," run",[1241,17491,15618],{"class":1262},[1241,17493,3945],{"class":1262},[1241,17495,7890],{"class":1724},[1241,17497,17498,17501,17504],{"class":1243,"line":1306},[1241,17499,17500],{"class":1269},"    --image",[1241,17502,17503],{"class":1262}," gcr.io/your-project/django-app:latest",[1241,17505,7890],{"class":1724},[1241,17507,17508,17511,17514],{"class":1243,"line":1312},[1241,17509,17510],{"class":1269},"    --platform",[1241,17512,17513],{"class":1262}," managed",[1241,17515,7890],{"class":1724},[1241,17517,17518,17521,17524],{"class":1243,"line":1321},[1241,17519,17520],{"class":1269},"    --region",[1241,17522,17523],{"class":1262}," us-central1",[1241,17525,7890],{"class":1724},[1241,17527,17528,17531],{"class":1243,"line":1327},[1241,17529,17530],{"class":1269},"    --allow-unauthenticated",[1241,17532,7890],{"class":1724},[1241,17534,17535,17538,17541],{"class":1243,"line":1333},[1241,17536,17537],{"class":1269},"    --memory",[1241,17539,17540],{"class":1262}," 2Gi",[1241,17542,7890],{"class":1724},[1241,17544,17545,17548,17550],{"class":1243,"line":1339},[1241,17546,17547],{"class":1269},"    --cpu",[1241,17549,9765],{"class":2476},[1241,17551,7890],{"class":1724},[1241,17553,17554,17557,17559],{"class":1243,"line":1345},[1241,17555,17556],{"class":1269},"    --concurrency",[1241,17558,6314],{"class":2476},[1241,17560,7890],{"class":1724},[1241,17562,17563,17566,17568],{"class":1243,"line":1350},[1241,17564,17565],{"class":1269},"    --max-instances",[1241,17567,8135],{"class":2476},[1241,17569,7890],{"class":1724},[1241,17571,17572,17575,17577],{"class":1243,"line":1356},[1241,17573,17574],{"class":1269},"    --min-instances",[1241,17576,2564],{"class":2476},[1241,17578,7890],{"class":1724},[1241,17580,17581,17584,17587],{"class":1243,"line":1554},[1241,17582,17583],{"class":1269},"    --set-cloudsql-instances",[1241,17585,17586],{"class":1262}," your-project:us-central1:django-db",[1241,17588,7890],{"class":1724},[1241,17590,17591,17594],{"class":1243,"line":1569},[1241,17592,17593],{"class":1269},"    --set-env-vars",[1241,17595,17596],{"class":1262}," DJANGO_SETTINGS_MODULE=myproject.settings.production\n",[1241,17598,17599],{"class":1243,"line":1584},[1241,17600,1303],{"emptyLinePlaceholder":1302},[1241,17602,17603],{"class":1243,"line":1621},[1241,17604,17605],{"class":1247},"# Update traffic allocation\n",[1241,17607,17608,17610,17612,17614,17617,17619],{"class":1243,"line":1627},[1241,17609,13406],{"class":1254},[1241,17611,17489],{"class":1262},[1241,17613,13478],{"class":1262},[1241,17615,17616],{"class":1262}," update-traffic",[1241,17618,3945],{"class":1262},[1241,17620,7890],{"class":1724},[1241,17622,17623,17626],{"class":1243,"line":1633},[1241,17624,17625],{"class":1269},"    --to-latest",[1241,17627,7890],{"class":1724},[1241,17629,17630,17632],{"class":1243,"line":1639},[1241,17631,17520],{"class":1269},[1241,17633,13448],{"class":1262},[1241,17635,17636],{"class":1243,"line":1645},[1241,17637,1303],{"emptyLinePlaceholder":1302},[1241,17639,17640],{"class":1243,"line":2028},[1241,17641,17642],{"class":1247},"# View service details\n",[1241,17644,17645,17647,17649,17651,17653,17655,17657],{"class":1243,"line":2042},[1241,17646,13406],{"class":1254},[1241,17648,17489],{"class":1262},[1241,17650,13478],{"class":1262},[1241,17652,15927],{"class":1262},[1241,17654,3945],{"class":1262},[1241,17656,3948],{"class":1269},[1241,17658,13448],{"class":1262},[1026,17660,17661],{},[1042,17662,17663],{},"Django Settings for Cloud Run",[1128,17665,17667],{"className":1674,"code":17666,"language":1676,"meta":1137,"style":1137},"# settings/cloudrun.py\nimport os\nfrom .base import *\n\n# Cloud Run specific settings\nDEBUG = False\nALLOWED_HOSTS = ['*']  # Cloud Run handles routing\n\n# Use Cloud SQL via Unix socket\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': os.environ['DB_NAME'],\n        'USER': os.environ['DB_USER'],\n        'PASSWORD': os.environ['DB_PASSWORD'],\n        'HOST': f'/cloudsql/{os.environ[\"CLOUD_SQL_CONNECTION_NAME\"]}',\n        'PORT': '',\n        'CONN_MAX_AGE': 0,  # Cloud Run is stateless\n    }\n}\n\n# Google Cloud Storage\nDEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'\nSTATICFILES_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'\nGS_BUCKET_NAME = os.environ.get('GCS_BUCKET_NAME')\nGS_DEFAULT_ACL = 'publicRead'\n\n# Redis cache via Memorystore\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': f\"redis://{os.environ.get('REDIS_HOST')}:6379/1\",\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n            'CONNECTION_POOL_KWARGS': {\n                'max_connections': 10,  # Limit for Cloud Run\n            },\n        },\n    }\n}\n\n# Session storage\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'default'\n\n# Security\nSECURE_SSL_REDIRECT = True\nSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')\n",[1135,17668,17669,17674,17680,17692,17696,17701,17709,17728,17732,17737,17745,17757,17775,17801,17827,17853,17891,17905,17922,17926,17930,17934,17939,17951,17963,17989,18001,18005,18010,18018,18030,18048,18092,18104,18122,18134,18151,18155,18159,18163,18167,18171,18175,18187,18199,18203,18208,18216],{"__ignoreMap":1137},[1241,17670,17671],{"class":1243,"line":1244},[1241,17672,17673],{"class":1247},"# settings/cloudrun.py\n",[1241,17675,17676,17678],{"class":1243,"line":1251},[1241,17677,1689],{"class":1688},[1241,17679,1693],{"class":1692},[1241,17681,17682,17684,17686,17688,17690],{"class":1243,"line":1281},[1241,17683,1698],{"class":1688},[1241,17685,1701],{"class":1381},[1241,17687,1704],{"class":1692},[1241,17689,1689],{"class":1688},[1241,17691,1710],{"class":1709},[1241,17693,17694],{"class":1243,"line":1290},[1241,17695,1303],{"emptyLinePlaceholder":1302},[1241,17697,17698],{"class":1243,"line":1299},[1241,17699,17700],{"class":1247},"# Cloud Run specific settings\n",[1241,17702,17703,17705,17707],{"class":1243,"line":1306},[1241,17704,1725],{"class":1724},[1241,17706,1728],{"class":1381},[1241,17708,1732],{"class":1731},[1241,17710,17711,17713,17715,17717,17719,17721,17723,17725],{"class":1243,"line":1312},[1241,17712,1737],{"class":1724},[1241,17714,1728],{"class":1381},[1241,17716,1598],{"class":1381},[1241,17718,1752],{"class":1258},[1241,17720,1547],{"class":1262},[1241,17722,1752],{"class":1258},[1241,17724,4768],{"class":1381},[1241,17726,17727],{"class":1247},"  # Cloud Run handles routing\n",[1241,17729,17730],{"class":1243,"line":1321},[1241,17731,1303],{"emptyLinePlaceholder":1302},[1241,17733,17734],{"class":1243,"line":1327},[1241,17735,17736],{"class":1247},"# Use Cloud SQL via Unix socket\n",[1241,17738,17739,17741,17743],{"class":1243,"line":1333},[1241,17740,4785],{"class":1724},[1241,17742,1728],{"class":1381},[1241,17744,1566],{"class":1381},[1241,17746,17747,17749,17751,17753,17755],{"class":1243,"line":1339},[1241,17748,1746],{"class":1258},[1241,17750,1857],{"class":1262},[1241,17752,1752],{"class":1258},[1241,17754,1397],{"class":1381},[1241,17756,1566],{"class":1381},[1241,17758,17759,17761,17763,17765,17767,17769,17771,17773],{"class":1243,"line":1345},[1241,17760,1854],{"class":1258},[1241,17762,1871],{"class":1262},[1241,17764,1752],{"class":1258},[1241,17766,1397],{"class":1381},[1241,17768,1822],{"class":1258},[1241,17770,1880],{"class":1262},[1241,17772,1752],{"class":1258},[1241,17774,1407],{"class":1381},[1241,17776,17777,17779,17781,17783,17785,17787,17789,17791,17793,17795,17797,17799],{"class":1243,"line":1350},[1241,17778,1854],{"class":1258},[1241,17780,1891],{"class":1262},[1241,17782,1752],{"class":1258},[1241,17784,1397],{"class":1381},[1241,17786,1833],{"class":1692},[1241,17788,1773],{"class":1381},[1241,17790,1777],{"class":1776},[1241,17792,1904],{"class":1381},[1241,17794,1752],{"class":1258},[1241,17796,4842],{"class":1262},[1241,17798,1752],{"class":1258},[1241,17800,1914],{"class":1381},[1241,17802,17803,17805,17807,17809,17811,17813,17815,17817,17819,17821,17823,17825],{"class":1243,"line":1356},[1241,17804,1854],{"class":1258},[1241,17806,1921],{"class":1262},[1241,17808,1752],{"class":1258},[1241,17810,1397],{"class":1381},[1241,17812,1833],{"class":1692},[1241,17814,1773],{"class":1381},[1241,17816,1777],{"class":1776},[1241,17818,1904],{"class":1381},[1241,17820,1752],{"class":1258},[1241,17822,4869],{"class":1262},[1241,17824,1752],{"class":1258},[1241,17826,1914],{"class":1381},[1241,17828,17829,17831,17833,17835,17837,17839,17841,17843,17845,17847,17849,17851],{"class":1243,"line":1554},[1241,17830,1854],{"class":1258},[1241,17832,1949],{"class":1262},[1241,17834,1752],{"class":1258},[1241,17836,1397],{"class":1381},[1241,17838,1833],{"class":1692},[1241,17840,1773],{"class":1381},[1241,17842,1777],{"class":1776},[1241,17844,1904],{"class":1381},[1241,17846,1752],{"class":1258},[1241,17848,4896],{"class":1262},[1241,17850,1752],{"class":1258},[1241,17852,1914],{"class":1381},[1241,17854,17855,17857,17859,17861,17863,17865,17867,17869,17871,17873,17875,17877,17879,17881,17883,17885,17887,17889],{"class":1243,"line":1569},[1241,17856,1854],{"class":1258},[1241,17858,1977],{"class":1262},[1241,17860,1752],{"class":1258},[1241,17862,1397],{"class":1381},[1241,17864,2223],{"class":2222},[1241,17866,14540],{"class":1262},[1241,17868,2229],{"class":2228},[1241,17870,2940],{"class":1692},[1241,17872,1773],{"class":1381},[1241,17874,1777],{"class":1776},[1241,17876,1904],{"class":1381},[1241,17878,1266],{"class":1258},[1241,17880,14555],{"class":1262},[1241,17882,1266],{"class":1258},[1241,17884,4768],{"class":1381},[1241,17886,2234],{"class":2228},[1241,17888,1752],{"class":1262},[1241,17890,1407],{"class":1381},[1241,17892,17893,17895,17897,17899,17901,17903],{"class":1243,"line":1584},[1241,17894,1854],{"class":1258},[1241,17896,2004],{"class":1262},[1241,17898,1752],{"class":1258},[1241,17900,1397],{"class":1381},[1241,17902,1798],{"class":1258},[1241,17904,1407],{"class":1381},[1241,17906,17907,17909,17911,17913,17915,17917,17919],{"class":1243,"line":1621},[1241,17908,1854],{"class":1258},[1241,17910,4991],{"class":1262},[1241,17912,1752],{"class":1258},[1241,17914,1397],{"class":1381},[1241,17916,4998],{"class":2476},[1241,17918,1608],{"class":1381},[1241,17920,17921],{"class":1247},"  # Cloud Run is stateless\n",[1241,17923,17924],{"class":1243,"line":1627},[1241,17925,1636],{"class":1381},[1241,17927,17928],{"class":1243,"line":1633},[1241,17929,1648],{"class":1381},[1241,17931,17932],{"class":1243,"line":1639},[1241,17933,1303],{"emptyLinePlaceholder":1302},[1241,17935,17936],{"class":1243,"line":1645},[1241,17937,17938],{"class":1247},"# Google Cloud Storage\n",[1241,17940,17941,17943,17945,17947,17949],{"class":1243,"line":2028},[1241,17942,2303],{"class":1724},[1241,17944,1728],{"class":1381},[1241,17946,1822],{"class":1258},[1241,17948,14891],{"class":1262},[1241,17950,2264],{"class":1258},[1241,17952,17953,17955,17957,17959,17961],{"class":1243,"line":2042},[1241,17954,2254],{"class":1724},[1241,17956,1728],{"class":1381},[1241,17958,1822],{"class":1258},[1241,17960,14891],{"class":1262},[1241,17962,2264],{"class":1258},[1241,17964,17965,17967,17969,17971,17973,17975,17977,17979,17981,17983,17985,17987],{"class":1243,"line":2064},[1241,17966,14910],{"class":1724},[1241,17968,1728],{"class":1381},[1241,17970,1833],{"class":1692},[1241,17972,1773],{"class":1381},[1241,17974,1777],{"class":1776},[1241,17976,1773],{"class":1381},[1241,17978,1783],{"class":1782},[1241,17980,1786],{"class":1381},[1241,17982,1752],{"class":1258},[1241,17984,14929],{"class":1262},[1241,17986,1752],{"class":1258},[1241,17988,2117],{"class":1381},[1241,17990,17991,17993,17995,17997,17999],{"class":1243,"line":2070},[1241,17992,14966],{"class":1724},[1241,17994,1728],{"class":1381},[1241,17996,1822],{"class":1258},[1241,17998,14973],{"class":1262},[1241,18000,2264],{"class":1258},[1241,18002,18003],{"class":1243,"line":2075},[1241,18004,1303],{"emptyLinePlaceholder":1302},[1241,18006,18007],{"class":1243,"line":2080},[1241,18008,18009],{"class":1247},"# Redis cache via Memorystore\n",[1241,18011,18012,18014,18016],{"class":1243,"line":2085},[1241,18013,5058],{"class":1724},[1241,18015,1728],{"class":1381},[1241,18017,1566],{"class":1381},[1241,18019,18020,18022,18024,18026,18028],{"class":1243,"line":2091},[1241,18021,1746],{"class":1258},[1241,18023,1857],{"class":1262},[1241,18025,1752],{"class":1258},[1241,18027,1397],{"class":1381},[1241,18029,1566],{"class":1381},[1241,18031,18032,18034,18036,18038,18040,18042,18044,18046],{"class":1243,"line":2120},[1241,18033,1854],{"class":1258},[1241,18035,5081],{"class":1262},[1241,18037,1752],{"class":1258},[1241,18039,1397],{"class":1381},[1241,18041,1822],{"class":1258},[1241,18043,5090],{"class":1262},[1241,18045,1752],{"class":1258},[1241,18047,1407],{"class":1381},[1241,18049,18050,18052,18054,18056,18058,18060,18063,18065,18067,18069,18071,18073,18075,18077,18079,18082,18084,18086,18088,18090],{"class":1243,"line":2148},[1241,18051,1854],{"class":1258},[1241,18053,5101],{"class":1262},[1241,18055,1752],{"class":1258},[1241,18057,1397],{"class":1381},[1241,18059,2223],{"class":2222},[1241,18061,18062],{"class":1262},"\"redis://",[1241,18064,2229],{"class":2228},[1241,18066,2940],{"class":1692},[1241,18068,1773],{"class":1381},[1241,18070,1777],{"class":1776},[1241,18072,1773],{"class":1381},[1241,18074,1783],{"class":1782},[1241,18076,1786],{"class":1381},[1241,18078,1752],{"class":1258},[1241,18080,18081],{"class":1262},"REDIS_HOST",[1241,18083,1752],{"class":1258},[1241,18085,7808],{"class":1381},[1241,18087,2234],{"class":2228},[1241,18089,9974],{"class":1262},[1241,18091,1407],{"class":1381},[1241,18093,18094,18096,18098,18100,18102],{"class":1243,"line":2177},[1241,18095,1854],{"class":1258},[1241,18097,2033],{"class":1262},[1241,18099,1752],{"class":1258},[1241,18101,1397],{"class":1381},[1241,18103,1566],{"class":1381},[1241,18105,18106,18108,18110,18112,18114,18116,18118,18120],{"class":1243,"line":2214},[1241,18107,1868],{"class":1258},[1241,18109,5141],{"class":1262},[1241,18111,1752],{"class":1258},[1241,18113,1397],{"class":1381},[1241,18115,1822],{"class":1258},[1241,18117,5150],{"class":1262},[1241,18119,1752],{"class":1258},[1241,18121,1407],{"class":1381},[1241,18123,18124,18126,18128,18130,18132],{"class":1243,"line":2240},[1241,18125,1868],{"class":1258},[1241,18127,5161],{"class":1262},[1241,18129,1752],{"class":1258},[1241,18131,1397],{"class":1381},[1241,18133,1566],{"class":1381},[1241,18135,18136,18138,18140,18142,18144,18146,18148],{"class":1243,"line":2245},[1241,18137,2045],{"class":1258},[1241,18139,5174],{"class":1262},[1241,18141,1752],{"class":1258},[1241,18143,1397],{"class":1381},[1241,18145,6124],{"class":2476},[1241,18147,1608],{"class":1381},[1241,18149,18150],{"class":1247},"  # Limit for Cloud Run\n",[1241,18152,18153],{"class":1243,"line":2251},[1241,18154,2067],{"class":1381},[1241,18156,18157],{"class":1243,"line":2267},[1241,18158,2680],{"class":1381},[1241,18160,18161],{"class":1243,"line":2289},[1241,18162,1636],{"class":1381},[1241,18164,18165],{"class":1243,"line":2294},[1241,18166,1648],{"class":1381},[1241,18168,18169],{"class":1243,"line":2300},[1241,18170,1303],{"emptyLinePlaceholder":1302},[1241,18172,18173],{"class":1243,"line":2314},[1241,18174,5210],{"class":1247},[1241,18176,18177,18179,18181,18183,18185],{"class":1243,"line":2335},[1241,18178,5215],{"class":1724},[1241,18180,1728],{"class":1381},[1241,18182,1822],{"class":1258},[1241,18184,5222],{"class":1262},[1241,18186,2264],{"class":1258},[1241,18188,18189,18191,18193,18195,18197],{"class":1243,"line":2340},[1241,18190,5229],{"class":1724},[1241,18192,1728],{"class":1381},[1241,18194,1822],{"class":1258},[1241,18196,1857],{"class":1262},[1241,18198,2264],{"class":1258},[1241,18200,18201],{"class":1243,"line":2346},[1241,18202,1303],{"emptyLinePlaceholder":1302},[1241,18204,18205],{"class":1243,"line":2361},[1241,18206,18207],{"class":1247},"# Security\n",[1241,18209,18210,18212,18214],{"class":1243,"line":2371},[1241,18211,2431],{"class":1724},[1241,18213,1728],{"class":1381},[1241,18215,2436],{"class":1731},[1241,18217,18218,18220,18222,18224,18226,18228,18230,18232,18234,18236,18238],{"class":1243,"line":2392},[1241,18219,2442],{"class":1724},[1241,18221,1728],{"class":1381},[1241,18223,2447],{"class":1381},[1241,18225,1752],{"class":1258},[1241,18227,2452],{"class":1262},[1241,18229,1752],{"class":1258},[1241,18231,1608],{"class":1381},[1241,18233,1822],{"class":1258},[1241,18235,2461],{"class":1262},[1241,18237,1752],{"class":1258},[1241,18239,2117],{"class":1381},[1035,18241,18243],{"id":18242},"gke-deployment","GKE Deployment",[1128,18245,18247],{"className":3017,"code":18246,"language":3019,"meta":1137,"style":1137},"# gke/deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: django-app\n  labels:\n    app: django-app\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: django-app\n  template:\n    metadata:\n      labels:\n        app: django-app\n    spec:\n      containers:\n      - name: django\n        image: gcr.io/PROJECT_ID/django-app:latest\n        ports:\n        - containerPort: 8000\n        env:\n        - name: DJANGO_SETTINGS_MODULE\n          value: \"myproject.settings.production\"\n        - name: DATABASE_URL\n          valueFrom:\n            secretKeyRef:\n              name: django-secrets\n              key: database-url\n        - name: SECRET_KEY\n          valueFrom:\n            secretKeyRef:\n              name: django-secrets\n              key: secret-key\n        resources:\n          requests:\n            memory: \"256Mi\"\n            cpu: \"250m\"\n          limits:\n            memory: \"512Mi\"\n            cpu: \"500m\"\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\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: django-service\nspec:\n  selector:\n    app: django-app\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 8000\n  type: LoadBalancer\n\n---\napiVersion: networking.gke.io/v1\nkind: ManagedCertificate\nmetadata:\n  name: django-ssl-cert\nspec:\n  domains:\n    - yourdomain.com\n    - www.yourdomain.com\n\n---\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: django-ingress\n  annotations:\n    kubernetes.io/ingress.global-static-ip-name: django-ip\n    networking.gke.io/managed-certificates: django-ssl-cert\n    kubernetes.io/ingress.class: \"gce\"\nspec:\n  rules:\n  - host: yourdomain.com\n    http:\n      paths:\n      - path: /*\n        pathType: ImplementationSpecific\n        backend:\n          service:\n            name: django-service\n            port:\n              number: 80\n",[1135,18248,18249,18254,18263,18272,18278,18286,18293,18302,18308,18317,18324,18331,18340,18346,18352,18359,18368,18374,18380,18391,18401,18407,18417,18423,18433,18445,18455,18461,18467,18475,18483,18493,18499,18505,18513,18521,18527,18534,18547,18560,18566,18579,18592,18598,18604,18612,18620,18628,18636,18642,18648,18656,18664,18672,18680,18684,18689,18697,18705,18711,18720,18726,18732,18740,18747,18759,18768,18777,18786,18790,18794,18803,18812,18818,18827,18833,18840,18847,18854,18858,18862,18871,18880,18886,18895,18901,18911,18920,18934,18940,18947,18958,18965,18972,18984,18994,19001,19008,19017,19023],{"__ignoreMap":1137},[1241,18250,18251],{"class":1243,"line":1244},[1241,18252,18253],{"class":1247},"# gke/deployment.yaml\n",[1241,18255,18256,18258,18260],{"class":1243,"line":1251},[1241,18257,16978],{"class":1590},[1241,18259,1397],{"class":1381},[1241,18261,18262],{"class":1262}," apps/v1\n",[1241,18264,18265,18267,18269],{"class":1243,"line":1281},[1241,18266,16988],{"class":1590},[1241,18268,1397],{"class":1381},[1241,18270,18271],{"class":1262}," Deployment\n",[1241,18273,18274,18276],{"class":1243,"line":1290},[1241,18275,16998],{"class":1590},[1241,18277,1840],{"class":1381},[1241,18279,18280,18282,18284],{"class":1243,"line":1299},[1241,18281,14219],{"class":1590},[1241,18283,1397],{"class":1381},[1241,18285,4152],{"class":1262},[1241,18287,18288,18291],{"class":1243,"line":1306},[1241,18289,18290],{"class":1590},"  labels",[1241,18292,1840],{"class":1381},[1241,18294,18295,18298,18300],{"class":1243,"line":1312},[1241,18296,18297],{"class":1590},"    app",[1241,18299,1397],{"class":1381},[1241,18301,4152],{"class":1262},[1241,18303,18304,18306],{"class":1243,"line":1321},[1241,18305,17039],{"class":1590},[1241,18307,1840],{"class":1381},[1241,18309,18310,18313,18315],{"class":1243,"line":1327},[1241,18311,18312],{"class":1590},"  replicas",[1241,18314,1397],{"class":1381},[1241,18316,12392],{"class":2476},[1241,18318,18319,18322],{"class":1243,"line":1333},[1241,18320,18321],{"class":1590},"  selector",[1241,18323,1840],{"class":1381},[1241,18325,18326,18329],{"class":1243,"line":1339},[1241,18327,18328],{"class":1590},"    matchLabels",[1241,18330,1840],{"class":1381},[1241,18332,18333,18336,18338],{"class":1243,"line":1345},[1241,18334,18335],{"class":1590},"      app",[1241,18337,1397],{"class":1381},[1241,18339,4152],{"class":1262},[1241,18341,18342,18344],{"class":1243,"line":1350},[1241,18343,17046],{"class":1590},[1241,18345,1840],{"class":1381},[1241,18347,18348,18350],{"class":1243,"line":1356},[1241,18349,17053],{"class":1590},[1241,18351,1840],{"class":1381},[1241,18353,18354,18357],{"class":1243,"line":1554},[1241,18355,18356],{"class":1590},"      labels",[1241,18358,1840],{"class":1381},[1241,18360,18361,18364,18366],{"class":1243,"line":1569},[1241,18362,18363],{"class":1590},"        app",[1241,18365,1397],{"class":1381},[1241,18367,4152],{"class":1262},[1241,18369,18370,18372],{"class":1243,"line":1584},[1241,18371,17136],{"class":1590},[1241,18373,1840],{"class":1381},[1241,18375,18376,18378],{"class":1243,"line":1621},[1241,18377,17161],{"class":1590},[1241,18379,1840],{"class":1381},[1241,18381,18382,18384,18386,18388],{"class":1243,"line":1627},[1241,18383,17168],{"class":1381},[1241,18385,16377],{"class":1590},[1241,18387,1397],{"class":1381},[1241,18389,18390],{"class":1262}," django\n",[1241,18392,18393,18396,18398],{"class":1243,"line":1633},[1241,18394,18395],{"class":1590},"        image",[1241,18397,1397],{"class":1381},[1241,18399,18400],{"class":1262}," gcr.io/PROJECT_ID/django-app:latest\n",[1241,18402,18403,18405],{"class":1243,"line":1639},[1241,18404,17181],{"class":1590},[1241,18406,1840],{"class":1381},[1241,18408,18409,18411,18413,18415],{"class":1243,"line":1645},[1241,18410,10400],{"class":1381},[1241,18412,17190],{"class":1590},[1241,18414,1397],{"class":1381},[1241,18416,7151],{"class":2476},[1241,18418,18419,18421],{"class":1243,"line":2028},[1241,18420,17199],{"class":1590},[1241,18422,1840],{"class":1381},[1241,18424,18425,18427,18429,18431],{"class":1243,"line":2042},[1241,18426,10400],{"class":1381},[1241,18428,16377],{"class":1590},[1241,18430,1397],{"class":1381},[1241,18432,17212],{"class":1262},[1241,18434,18435,18437,18439,18441,18443],{"class":1243,"line":2064},[1241,18436,17217],{"class":1590},[1241,18438,1397],{"class":1381},[1241,18440,1259],{"class":1258},[1241,18442,2965],{"class":1262},[1241,18444,1278],{"class":1258},[1241,18446,18447,18449,18451,18453],{"class":1243,"line":2070},[1241,18448,10400],{"class":1381},[1241,18450,16377],{"class":1590},[1241,18452,1397],{"class":1381},[1241,18454,17232],{"class":1262},[1241,18456,18457,18459],{"class":1243,"line":2075},[1241,18458,17237],{"class":1590},[1241,18460,1840],{"class":1381},[1241,18462,18463,18465],{"class":1243,"line":2080},[1241,18464,17244],{"class":1590},[1241,18466,1840],{"class":1381},[1241,18468,18469,18471,18473],{"class":1243,"line":2085},[1241,18470,17251],{"class":1590},[1241,18472,1397],{"class":1381},[1241,18474,17256],{"class":1262},[1241,18476,18477,18479,18481],{"class":1243,"line":2091},[1241,18478,17261],{"class":1590},[1241,18480,1397],{"class":1381},[1241,18482,17266],{"class":1262},[1241,18484,18485,18487,18489,18491],{"class":1243,"line":2120},[1241,18486,10400],{"class":1381},[1241,18488,16377],{"class":1590},[1241,18490,1397],{"class":1381},[1241,18492,17277],{"class":1262},[1241,18494,18495,18497],{"class":1243,"line":2148},[1241,18496,17237],{"class":1590},[1241,18498,1840],{"class":1381},[1241,18500,18501,18503],{"class":1243,"line":2177},[1241,18502,17244],{"class":1590},[1241,18504,1840],{"class":1381},[1241,18506,18507,18509,18511],{"class":1243,"line":2214},[1241,18508,17251],{"class":1590},[1241,18510,1397],{"class":1381},[1241,18512,17256],{"class":1262},[1241,18514,18515,18517,18519],{"class":1243,"line":2240},[1241,18516,17261],{"class":1590},[1241,18518,1397],{"class":1381},[1241,18520,17306],{"class":1262},[1241,18522,18523,18525],{"class":1243,"line":2245},[1241,18524,17311],{"class":1590},[1241,18526,1840],{"class":1381},[1241,18528,18529,18532],{"class":1243,"line":2251},[1241,18530,18531],{"class":1590},"          requests",[1241,18533,1840],{"class":1381},[1241,18535,18536,18538,18540,18542,18545],{"class":1243,"line":2267},[1241,18537,17338],{"class":1590},[1241,18539,1397],{"class":1381},[1241,18541,1259],{"class":1258},[1241,18543,18544],{"class":1262},"256Mi",[1241,18546,1278],{"class":1258},[1241,18548,18549,18551,18553,18555,18558],{"class":1243,"line":2289},[1241,18550,17325],{"class":1590},[1241,18552,1397],{"class":1381},[1241,18554,1259],{"class":1258},[1241,18556,18557],{"class":1262},"250m",[1241,18559,1278],{"class":1258},[1241,18561,18562,18564],{"class":1243,"line":2294},[1241,18563,17318],{"class":1590},[1241,18565,1840],{"class":1381},[1241,18567,18568,18570,18572,18574,18577],{"class":1243,"line":2300},[1241,18569,17338],{"class":1590},[1241,18571,1397],{"class":1381},[1241,18573,1259],{"class":1258},[1241,18575,18576],{"class":1262},"512Mi",[1241,18578,1278],{"class":1258},[1241,18580,18581,18583,18585,18587,18590],{"class":1243,"line":2314},[1241,18582,17325],{"class":1590},[1241,18584,1397],{"class":1381},[1241,18586,1259],{"class":1258},[1241,18588,18589],{"class":1262},"500m",[1241,18591,1278],{"class":1258},[1241,18593,18594,18596],{"class":1243,"line":2335},[1241,18595,17351],{"class":1590},[1241,18597,1840],{"class":1381},[1241,18599,18600,18602],{"class":1243,"line":2340},[1241,18601,17358],{"class":1590},[1241,18603,1840],{"class":1381},[1241,18605,18606,18608,18610],{"class":1243,"line":2346},[1241,18607,17365],{"class":1590},[1241,18609,1397],{"class":1381},[1241,18611,3614],{"class":1262},[1241,18613,18614,18616,18618],{"class":1243,"line":2361},[1241,18615,17374],{"class":1590},[1241,18617,1397],{"class":1381},[1241,18619,7151],{"class":2476},[1241,18621,18622,18624,18626],{"class":1243,"line":2371},[1241,18623,17383],{"class":1590},[1241,18625,1397],{"class":1381},[1241,18627,12360],{"class":2476},[1241,18629,18630,18632,18634],{"class":1243,"line":2392},[1241,18631,17392],{"class":1590},[1241,18633,1397],{"class":1381},[1241,18635,3423],{"class":2476},[1241,18637,18638,18640],{"class":1243,"line":2397},[1241,18639,17401],{"class":1590},[1241,18641,1840],{"class":1381},[1241,18643,18644,18646],{"class":1243,"line":2407},[1241,18645,17358],{"class":1590},[1241,18647,1840],{"class":1381},[1241,18649,18650,18652,18654],{"class":1243,"line":2417},[1241,18651,17365],{"class":1590},[1241,18653,1397],{"class":1381},[1241,18655,17418],{"class":1262},[1241,18657,18658,18660,18662],{"class":1243,"line":2422},[1241,18659,17374],{"class":1590},[1241,18661,1397],{"class":1381},[1241,18663,7151],{"class":2476},[1241,18665,18666,18668,18670],{"class":1243,"line":2428},[1241,18667,17383],{"class":1590},[1241,18669,1397],{"class":1381},[1241,18671,12371],{"class":2476},[1241,18673,18674,18676,18678],{"class":1243,"line":2439},[1241,18675,17392],{"class":1590},[1241,18677,1397],{"class":1381},[1241,18679,12371],{"class":2476},[1241,18681,18682],{"class":1243,"line":2468},[1241,18683,1303],{"emptyLinePlaceholder":1302},[1241,18685,18686],{"class":1243,"line":2480},[1241,18687,18688],{"class":1254},"---\n",[1241,18690,18691,18693,18695],{"class":1243,"line":2490},[1241,18692,16978],{"class":1590},[1241,18694,1397],{"class":1381},[1241,18696,15740],{"class":1262},[1241,18698,18699,18701,18703],{"class":1243,"line":2500},[1241,18700,16988],{"class":1590},[1241,18702,1397],{"class":1381},[1241,18704,16993],{"class":1262},[1241,18706,18707,18709],{"class":1243,"line":2505},[1241,18708,16998],{"class":1590},[1241,18710,1840],{"class":1381},[1241,18712,18713,18715,18717],{"class":1243,"line":2511},[1241,18714,14219],{"class":1590},[1241,18716,1397],{"class":1381},[1241,18718,18719],{"class":1262}," django-service\n",[1241,18721,18722,18724],{"class":1243,"line":2521},[1241,18723,17039],{"class":1590},[1241,18725,1840],{"class":1381},[1241,18727,18728,18730],{"class":1243,"line":2531},[1241,18729,18321],{"class":1590},[1241,18731,1840],{"class":1381},[1241,18733,18734,18736,18738],{"class":1243,"line":2536},[1241,18735,18297],{"class":1590},[1241,18737,1397],{"class":1381},[1241,18739,4152],{"class":1262},[1241,18741,18742,18745],{"class":1243,"line":2542},[1241,18743,18744],{"class":1590},"  ports",[1241,18746,1840],{"class":1381},[1241,18748,18749,18751,18754,18756],{"class":1243,"line":2552},[1241,18750,16374],{"class":1381},[1241,18752,18753],{"class":1590}," protocol",[1241,18755,1397],{"class":1381},[1241,18757,18758],{"class":1262}," TCP\n",[1241,18760,18761,18764,18766],{"class":1243,"line":2569},[1241,18762,18763],{"class":1590},"    port",[1241,18765,1397],{"class":1381},[1241,18767,3470],{"class":2476},[1241,18769,18770,18773,18775],{"class":1243,"line":2586},[1241,18771,18772],{"class":1590},"    targetPort",[1241,18774,1397],{"class":1381},[1241,18776,7151],{"class":2476},[1241,18778,18779,18782,18784],{"class":1243,"line":2600},[1241,18780,18781],{"class":1590},"  type",[1241,18783,1397],{"class":1381},[1241,18785,12469],{"class":1262},[1241,18787,18788],{"class":1243,"line":2614},[1241,18789,1303],{"emptyLinePlaceholder":1302},[1241,18791,18792],{"class":1243,"line":2635},[1241,18793,18688],{"class":1254},[1241,18795,18796,18798,18800],{"class":1243,"line":2656},[1241,18797,16978],{"class":1590},[1241,18799,1397],{"class":1381},[1241,18801,18802],{"class":1262}," networking.gke.io/v1\n",[1241,18804,18805,18807,18809],{"class":1243,"line":2677},[1241,18806,16988],{"class":1590},[1241,18808,1397],{"class":1381},[1241,18810,18811],{"class":1262}," ManagedCertificate\n",[1241,18813,18814,18816],{"class":1243,"line":2683},[1241,18815,16998],{"class":1590},[1241,18817,1840],{"class":1381},[1241,18819,18820,18822,18824],{"class":1243,"line":2697},[1241,18821,14219],{"class":1590},[1241,18823,1397],{"class":1381},[1241,18825,18826],{"class":1262}," django-ssl-cert\n",[1241,18828,18829,18831],{"class":1243,"line":2716},[1241,18830,17039],{"class":1590},[1241,18832,1840],{"class":1381},[1241,18834,18835,18838],{"class":1243,"line":2736},[1241,18836,18837],{"class":1590},"  domains",[1241,18839,1840],{"class":1381},[1241,18841,18842,18844],{"class":1243,"line":2741},[1241,18843,16523],{"class":1381},[1241,18845,18846],{"class":1262}," yourdomain.com\n",[1241,18848,18849,18851],{"class":1243,"line":2747},[1241,18850,16523],{"class":1381},[1241,18852,18853],{"class":1262}," www.yourdomain.com\n",[1241,18855,18856],{"class":1243,"line":2761},[1241,18857,1303],{"emptyLinePlaceholder":1302},[1241,18859,18860],{"class":1243,"line":2775},[1241,18861,18688],{"class":1254},[1241,18863,18864,18866,18868],{"class":1243,"line":2804},[1241,18865,16978],{"class":1590},[1241,18867,1397],{"class":1381},[1241,18869,18870],{"class":1262}," networking.k8s.io/v1\n",[1241,18872,18873,18875,18877],{"class":1243,"line":2823},[1241,18874,16988],{"class":1590},[1241,18876,1397],{"class":1381},[1241,18878,18879],{"class":1262}," Ingress\n",[1241,18881,18882,18884],{"class":1243,"line":2840},[1241,18883,16998],{"class":1590},[1241,18885,1840],{"class":1381},[1241,18887,18888,18890,18892],{"class":1243,"line":2845},[1241,18889,14219],{"class":1590},[1241,18891,1397],{"class":1381},[1241,18893,18894],{"class":1262}," django-ingress\n",[1241,18896,18897,18899],{"class":1243,"line":2850},[1241,18898,17013],{"class":1590},[1241,18900,1840],{"class":1381},[1241,18902,18903,18906,18908],{"class":1243,"line":3776},[1241,18904,18905],{"class":1590},"    kubernetes.io/ingress.global-static-ip-name",[1241,18907,1397],{"class":1381},[1241,18909,18910],{"class":1262}," django-ip\n",[1241,18912,18913,18916,18918],{"class":1243,"line":3782},[1241,18914,18915],{"class":1590},"    networking.gke.io/managed-certificates",[1241,18917,1397],{"class":1381},[1241,18919,18826],{"class":1262},[1241,18921,18922,18925,18927,18929,18932],{"class":1243,"line":3789},[1241,18923,18924],{"class":1590},"    kubernetes.io/ingress.class",[1241,18926,1397],{"class":1381},[1241,18928,1259],{"class":1258},[1241,18930,18931],{"class":1262},"gce",[1241,18933,1278],{"class":1258},[1241,18935,18936,18938],{"class":1243,"line":3796},[1241,18937,17039],{"class":1590},[1241,18939,1840],{"class":1381},[1241,18941,18942,18945],{"class":1243,"line":3811},[1241,18943,18944],{"class":1590},"  rules",[1241,18946,1840],{"class":1381},[1241,18948,18949,18951,18954,18956],{"class":1243,"line":3826},[1241,18950,16374],{"class":1381},[1241,18952,18953],{"class":1590}," host",[1241,18955,1397],{"class":1381},[1241,18957,18846],{"class":1262},[1241,18959,18960,18963],{"class":1243,"line":3841},[1241,18961,18962],{"class":1590},"    http",[1241,18964,1840],{"class":1381},[1241,18966,18967,18970],{"class":1243,"line":3856},[1241,18968,18969],{"class":1590},"      paths",[1241,18971,1840],{"class":1381},[1241,18973,18974,18976,18979,18981],{"class":1243,"line":3871},[1241,18975,17168],{"class":1381},[1241,18977,18978],{"class":1590}," path",[1241,18980,1397],{"class":1381},[1241,18982,18983],{"class":1262}," /*\n",[1241,18985,18986,18989,18991],{"class":1243,"line":3886},[1241,18987,18988],{"class":1590},"        pathType",[1241,18990,1397],{"class":1381},[1241,18992,18993],{"class":1262}," ImplementationSpecific\n",[1241,18995,18996,18999],{"class":1243,"line":3901},[1241,18997,18998],{"class":1590},"        backend",[1241,19000,1840],{"class":1381},[1241,19002,19003,19006],{"class":1243,"line":6562},[1241,19004,19005],{"class":1590},"          service",[1241,19007,1840],{"class":1381},[1241,19009,19010,19013,19015],{"class":1243,"line":6581},[1241,19011,19012],{"class":1590},"            name",[1241,19014,1397],{"class":1381},[1241,19016,18719],{"class":1262},[1241,19018,19019,19021],{"class":1243,"line":6594},[1241,19020,17374],{"class":1590},[1241,19022,1840],{"class":1381},[1241,19024,19025,19028,19030],{"class":1243,"line":6613},[1241,19026,19027],{"class":1590},"              number",[1241,19029,1397],{"class":1381},[1241,19031,3470],{"class":2476},[1035,19033,19035],{"id":19034},"terraform-for-gcp","Terraform for GCP",[1128,19037,19041],{"className":19038,"code":19039,"language":19040,"meta":1137,"style":1137},"language-tf shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# terraform/gcp/main.tf\nprovider \"google\" {\n  project = var.project_id\n  region  = var.region\n}\n\n# Enable required APIs\nresource \"google_project_service\" \"required_apis\" {\n  for_each = toset([\n    \"compute.googleapis.com\",\n    \"container.googleapis.com\",\n    \"sql-component.googleapis.com\",\n    \"redis.googleapis.com\",\n    \"run.googleapis.com\"\n  ])\n  \n  service = each.value\n  disable_on_destroy = false\n}\n\n# VPC Network\nresource \"google_compute_network\" \"vpc\" {\n  name                    = \"${var.environment}-vpc\"\n  auto_create_subnetworks = false\n}\n\nresource \"google_compute_subnetwork\" \"subnet\" {\n  name          = \"${var.environment}-subnet\"\n  ip_cidr_range = \"10.0.0.0/24\"\n  region        = var.region\n  network       = google_compute_network.vpc.id\n}\n\n# Cloud SQL Database\nresource \"google_sql_database_instance\" \"postgres\" {\n  name             = \"${var.environment}-django-db\"\n  database_version = \"POSTGRES_13\"\n  region           = var.region\n  \n  settings {\n    tier = \"db-f1-micro\"\n    \n    backup_configuration {\n      enabled    = true\n      start_time = \"03:00\"\n    }\n    \n    ip_configuration {\n      ipv4_enabled    = false\n      private_network = google_compute_network.vpc.id\n    }\n    \n    database_flags {\n      name  = \"log_statement\"\n      value = \"all\"\n    }\n  }\n  \n  depends_on = [google_service_networking_connection.private_vpc_connection]\n}\n\nresource \"google_sql_database\" \"database\" {\n  name     = \"django_app\"\n  instance = google_sql_database_instance.postgres.name\n}\n\nresource \"google_sql_user\" \"user\" {\n  name     = \"django_user\"\n  instance = google_sql_database_instance.postgres.name\n  password = var.db_password\n}\n\n# Redis Instance\nresource \"google_redis_instance\" \"cache\" {\n  name           = \"${var.environment}-redis\"\n  tier           = \"BASIC\"\n  memory_size_gb = 1\n  region         = var.region\n  \n  authorized_network = google_compute_network.vpc.id\n}\n\n# GKE Cluster\nresource \"google_container_cluster\" \"primary\" {\n  name     = \"${var.environment}-gke\"\n  location = var.region\n  \n  remove_default_node_pool = true\n  initial_node_count       = 1\n  \n  network    = google_compute_network.vpc.name\n  subnetwork = google_compute_subnetwork.subnet.name\n  \n  workload_identity_config {\n    workload_pool = \"${var.project_id}.svc.id.goog\"\n  }\n}\n\nresource \"google_container_node_pool\" \"primary_nodes\" {\n  name       = \"${var.environment}-node-pool\"\n  location   = var.region\n  cluster    = google_container_cluster.primary.name\n  node_count = 1\n  \n  node_config {\n    preemptible  = true\n    machine_type = \"e2-medium\"\n    \n    service_account = google_service_account.gke_service_account.email\n    oauth_scopes = [\n      \"https://www.googleapis.com/auth/cloud-platform\"\n    ]\n  }\n}\n\n# Service Account\nresource \"google_service_account\" \"gke_service_account\" {\n  account_id   = \"${var.environment}-gke-sa\"\n  display_name = \"GKE Service Account\"\n}\n\n# Private Service Connection\nresource \"google_compute_global_address\" \"private_ip_address\" {\n  name          = \"${var.environment}-private-ip\"\n  purpose       = \"VPC_PEERING\"\n  address_type  = \"INTERNAL\"\n  prefix_length = 16\n  network       = google_compute_network.vpc.id\n}\n\nresource \"google_service_networking_connection\" \"private_vpc_connection\" {\n  network                 = google_compute_network.vpc.id\n  service                 = \"servicenetworking.googleapis.com\"\n  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]\n}\n\n# Variables\nvariable \"project_id\" {\n  description = \"GCP Project ID\"\n  type        = string\n}\n\nvariable \"region\" {\n  description = \"GCP Region\"\n  type        = string\n  default     = \"us-central1\"\n}\n\nvariable \"environment\" {\n  description = \"Environment name\"\n  type        = string\n  default     = \"production\"\n}\n\nvariable \"db_password\" {\n  description = \"Database password\"\n  type        = string\n  sensitive   = true\n}\n\n# Outputs\noutput \"cluster_endpoint\" {\n  value = google_container_cluster.primary.endpoint\n}\n\noutput \"database_connection_name\" {\n  value = google_sql_database_instance.postgres.connection_name\n}\n\noutput \"redis_host\" {\n  value = google_redis_instance.cache.host\n}\n","tf",[1135,19042,19043,19048,19058,19073,19087,19091,19095,19099,19112,19125,19136,19147,19158,19169,19178,19183,19187,19202,19211,19215,19219,19224,19236,19262,19271,19275,19279,19291,19315,19329,19342,19362,19366,19370,19375,19387,19411,19425,19438,19442,19449,19463,19467,19474,19483,19497,19501,19505,19512,19521,19538,19542,19546,19556,19570,19584,19588,19593,19597,19616,19620,19624,19636,19649,19668,19672,19676,19688,19701,19717,19731,19735,19739,19744,19756,19780,19794,19803,19816,19820,19837,19841,19845,19850,19862,19885,19898,19902,19911,19920,19924,19941,19960,19964,19971,19996,20000,20004,20008,20020,20044,20057,20076,20085,20089,20096,20105,20119,20123,20143,20152,20161,20165,20169,20173,20177,20182,20194,20218,20232,20236,20240,20245,20257,20280,20294,20308,20318,20334,20338,20342,20354,20371,20385,20408,20412,20416,20421,20431,20445,20455,20459,20463,20472,20485,20493,20506,20510,20514,20523,20536,20544,20556,20560,20564,20573,20586,20594,20603,20607,20611,20616,20626,20644,20648,20652,20661,20678,20682,20686,20695,20714],{"__ignoreMap":1137},[1241,19044,19045],{"class":1243,"line":1244},[1241,19046,19047],{"class":1247},"# terraform/gcp/main.tf\n",[1241,19049,19050,19053,19056],{"class":1243,"line":1251},[1241,19051,19052],{"class":9162},"provider",[1241,19054,19055],{"class":7423}," \"google\"",[1241,19057,1566],{"class":1381},[1241,19059,19060,19063,19065,19068,19070],{"class":1243,"line":1281},[1241,19061,19062],{"class":7423},"  project ",[1241,19064,3003],{"class":1381},[1241,19066,19067],{"class":7423}," var",[1241,19069,1773],{"class":1709},[1241,19071,19072],{"class":7423},"project_id\n",[1241,19074,19075,19078,19080,19082,19084],{"class":1243,"line":1290},[1241,19076,19077],{"class":7423},"  region  ",[1241,19079,3003],{"class":1381},[1241,19081,19067],{"class":7423},[1241,19083,1773],{"class":1709},[1241,19085,19086],{"class":7423},"region\n",[1241,19088,19089],{"class":1243,"line":1299},[1241,19090,1648],{"class":1381},[1241,19092,19093],{"class":1243,"line":1306},[1241,19094,1303],{"emptyLinePlaceholder":1302},[1241,19096,19097],{"class":1243,"line":1312},[1241,19098,13471],{"class":1247},[1241,19100,19101,19104,19107,19110],{"class":1243,"line":1321},[1241,19102,19103],{"class":9162},"resource",[1241,19105,19106],{"class":7423}," \"google_project_service\"",[1241,19108,19109],{"class":7423}," \"required_apis\"",[1241,19111,1566],{"class":1381},[1241,19113,19114,19117,19119,19122],{"class":1243,"line":1327},[1241,19115,19116],{"class":7423},"  for_each ",[1241,19118,3003],{"class":1381},[1241,19120,19121],{"class":7405}," toset",[1241,19123,19124],{"class":1381},"([\n",[1241,19126,19127,19129,19132,19134],{"class":1243,"line":1333},[1241,19128,4293],{"class":1258},[1241,19130,19131],{"class":1262},"compute.googleapis.com",[1241,19133,1266],{"class":1258},[1241,19135,1407],{"class":1381},[1241,19137,19138,19140,19143,19145],{"class":1243,"line":1339},[1241,19139,4293],{"class":1258},[1241,19141,19142],{"class":1262},"container.googleapis.com",[1241,19144,1266],{"class":1258},[1241,19146,1407],{"class":1381},[1241,19148,19149,19151,19154,19156],{"class":1243,"line":1345},[1241,19150,4293],{"class":1258},[1241,19152,19153],{"class":1262},"sql-component.googleapis.com",[1241,19155,1266],{"class":1258},[1241,19157,1407],{"class":1381},[1241,19159,19160,19162,19165,19167],{"class":1243,"line":1350},[1241,19161,4293],{"class":1258},[1241,19163,19164],{"class":1262},"redis.googleapis.com",[1241,19166,1266],{"class":1258},[1241,19168,1407],{"class":1381},[1241,19170,19171,19173,19176],{"class":1243,"line":1356},[1241,19172,4293],{"class":1258},[1241,19174,19175],{"class":1262},"run.googleapis.com",[1241,19177,1278],{"class":1258},[1241,19179,19180],{"class":1243,"line":1554},[1241,19181,19182],{"class":1381},"  ])\n",[1241,19184,19185],{"class":1243,"line":1569},[1241,19186,10277],{"class":1776},[1241,19188,19189,19192,19194,19197,19199],{"class":1243,"line":1584},[1241,19190,19191],{"class":7423},"  service ",[1241,19193,3003],{"class":1381},[1241,19195,19196],{"class":1776}," each",[1241,19198,1773],{"class":1709},[1241,19200,19201],{"class":7423},"value\n",[1241,19203,19204,19207,19209],{"class":1243,"line":1621},[1241,19205,19206],{"class":7423},"  disable_on_destroy ",[1241,19208,3003],{"class":1381},[1241,19210,3640],{"class":1731},[1241,19212,19213],{"class":1243,"line":1627},[1241,19214,1648],{"class":1381},[1241,19216,19217],{"class":1243,"line":1633},[1241,19218,1303],{"emptyLinePlaceholder":1302},[1241,19220,19221],{"class":1243,"line":1639},[1241,19222,19223],{"class":1247},"# VPC Network\n",[1241,19225,19226,19228,19231,19234],{"class":1243,"line":1645},[1241,19227,19103],{"class":9162},[1241,19229,19230],{"class":7423}," \"google_compute_network\"",[1241,19232,19233],{"class":7423}," \"vpc\"",[1241,19235,1566],{"class":1381},[1241,19237,19238,19241,19243,19245,19248,19251,19253,19255,19257,19260],{"class":1243,"line":2028},[1241,19239,19240],{"class":7423},"  name                    ",[1241,19242,3003],{"class":1381},[1241,19244,1259],{"class":1258},[1241,19246,19247],{"class":16124},"${",[1241,19249,19250],{"class":7790},"var",[1241,19252,1773],{"class":1709},[1241,19254,5675],{"class":7790},[1241,19256,2234],{"class":16124},[1241,19258,19259],{"class":1262},"-vpc",[1241,19261,1278],{"class":1258},[1241,19263,19264,19267,19269],{"class":1243,"line":2042},[1241,19265,19266],{"class":7423},"  auto_create_subnetworks ",[1241,19268,3003],{"class":1381},[1241,19270,3640],{"class":1731},[1241,19272,19273],{"class":1243,"line":2064},[1241,19274,1648],{"class":1381},[1241,19276,19277],{"class":1243,"line":2070},[1241,19278,1303],{"emptyLinePlaceholder":1302},[1241,19280,19281,19283,19286,19289],{"class":1243,"line":2075},[1241,19282,19103],{"class":9162},[1241,19284,19285],{"class":7423}," \"google_compute_subnetwork\"",[1241,19287,19288],{"class":7423}," \"subnet\"",[1241,19290,1566],{"class":1381},[1241,19292,19293,19296,19298,19300,19302,19304,19306,19308,19310,19313],{"class":1243,"line":2080},[1241,19294,19295],{"class":7423},"  name          ",[1241,19297,3003],{"class":1381},[1241,19299,1259],{"class":1258},[1241,19301,19247],{"class":16124},[1241,19303,19250],{"class":7790},[1241,19305,1773],{"class":1709},[1241,19307,5675],{"class":7790},[1241,19309,2234],{"class":16124},[1241,19311,19312],{"class":1262},"-subnet",[1241,19314,1278],{"class":1258},[1241,19316,19317,19320,19322,19324,19327],{"class":1243,"line":2085},[1241,19318,19319],{"class":7423},"  ip_cidr_range ",[1241,19321,3003],{"class":1381},[1241,19323,1259],{"class":1258},[1241,19325,19326],{"class":1262},"10.0.0.0/24",[1241,19328,1278],{"class":1258},[1241,19330,19331,19334,19336,19338,19340],{"class":1243,"line":2091},[1241,19332,19333],{"class":7423},"  region        ",[1241,19335,3003],{"class":1381},[1241,19337,19067],{"class":7423},[1241,19339,1773],{"class":1709},[1241,19341,19086],{"class":7423},[1241,19343,19344,19347,19349,19352,19354,19357,19359],{"class":1243,"line":2120},[1241,19345,19346],{"class":7423},"  network       ",[1241,19348,3003],{"class":1381},[1241,19350,19351],{"class":1776}," google_compute_network",[1241,19353,1773],{"class":1709},[1241,19355,19356],{"class":7423},"vpc",[1241,19358,1773],{"class":1709},[1241,19360,19361],{"class":7423},"id\n",[1241,19363,19364],{"class":1243,"line":2148},[1241,19365,1648],{"class":1381},[1241,19367,19368],{"class":1243,"line":2177},[1241,19369,1303],{"emptyLinePlaceholder":1302},[1241,19371,19372],{"class":1243,"line":2214},[1241,19373,19374],{"class":1247},"# Cloud SQL Database\n",[1241,19376,19377,19379,19382,19385],{"class":1243,"line":2240},[1241,19378,19103],{"class":9162},[1241,19380,19381],{"class":7423}," \"google_sql_database_instance\"",[1241,19383,19384],{"class":7423}," \"postgres\"",[1241,19386,1566],{"class":1381},[1241,19388,19389,19392,19394,19396,19398,19400,19402,19404,19406,19409],{"class":1243,"line":2245},[1241,19390,19391],{"class":7423},"  name             ",[1241,19393,3003],{"class":1381},[1241,19395,1259],{"class":1258},[1241,19397,19247],{"class":16124},[1241,19399,19250],{"class":7790},[1241,19401,1773],{"class":1709},[1241,19403,5675],{"class":7790},[1241,19405,2234],{"class":16124},[1241,19407,19408],{"class":1262},"-django-db",[1241,19410,1278],{"class":1258},[1241,19412,19413,19416,19418,19420,19423],{"class":1243,"line":2251},[1241,19414,19415],{"class":7423},"  database_version ",[1241,19417,3003],{"class":1381},[1241,19419,1259],{"class":1258},[1241,19421,19422],{"class":1262},"POSTGRES_13",[1241,19424,1278],{"class":1258},[1241,19426,19427,19430,19432,19434,19436],{"class":1243,"line":2267},[1241,19428,19429],{"class":7423},"  region           ",[1241,19431,3003],{"class":1381},[1241,19433,19067],{"class":7423},[1241,19435,1773],{"class":1709},[1241,19437,19086],{"class":7423},[1241,19439,19440],{"class":1243,"line":2289},[1241,19441,10277],{"class":1776},[1241,19443,19444,19447],{"class":1243,"line":2294},[1241,19445,19446],{"class":9162},"  settings",[1241,19448,1566],{"class":1381},[1241,19450,19451,19454,19456,19458,19461],{"class":1243,"line":2300},[1241,19452,19453],{"class":7423},"    tier ",[1241,19455,3003],{"class":1381},[1241,19457,1259],{"class":1258},[1241,19459,19460],{"class":1262},"db-f1-micro",[1241,19462,1278],{"class":1258},[1241,19464,19465],{"class":1243,"line":2314},[1241,19466,8853],{"class":1776},[1241,19468,19469,19472],{"class":1243,"line":2335},[1241,19470,19471],{"class":9162},"    backup_configuration",[1241,19473,1566],{"class":1381},[1241,19475,19476,19479,19481],{"class":1243,"line":2340},[1241,19477,19478],{"class":7423},"      enabled    ",[1241,19480,3003],{"class":1381},[1241,19482,3228],{"class":1731},[1241,19484,19485,19488,19490,19492,19495],{"class":1243,"line":2346},[1241,19486,19487],{"class":7423},"      start_time ",[1241,19489,3003],{"class":1381},[1241,19491,1259],{"class":1258},[1241,19493,19494],{"class":1262},"03:00",[1241,19496,1278],{"class":1258},[1241,19498,19499],{"class":1243,"line":2361},[1241,19500,1636],{"class":1381},[1241,19502,19503],{"class":1243,"line":2371},[1241,19504,8853],{"class":1776},[1241,19506,19507,19510],{"class":1243,"line":2392},[1241,19508,19509],{"class":9162},"    ip_configuration",[1241,19511,1566],{"class":1381},[1241,19513,19514,19517,19519],{"class":1243,"line":2397},[1241,19515,19516],{"class":7423},"      ipv4_enabled    ",[1241,19518,3003],{"class":1381},[1241,19520,3640],{"class":1731},[1241,19522,19523,19526,19528,19530,19532,19534,19536],{"class":1243,"line":2407},[1241,19524,19525],{"class":7423},"      private_network ",[1241,19527,3003],{"class":1381},[1241,19529,19351],{"class":1776},[1241,19531,1773],{"class":1709},[1241,19533,19356],{"class":7423},[1241,19535,1773],{"class":1709},[1241,19537,19361],{"class":7423},[1241,19539,19540],{"class":1243,"line":2417},[1241,19541,1636],{"class":1381},[1241,19543,19544],{"class":1243,"line":2422},[1241,19545,8853],{"class":1776},[1241,19547,19548,19551,19554],{"class":1243,"line":2428},[1241,19549,19550],{"class":9162},"    data",[1241,19552,19553],{"class":1776},"base_flags ",[1241,19555,1382],{"class":1381},[1241,19557,19558,19561,19563,19565,19568],{"class":1243,"line":2439},[1241,19559,19560],{"class":7423},"      name  ",[1241,19562,3003],{"class":1381},[1241,19564,1259],{"class":1258},[1241,19566,19567],{"class":1262},"log_statement",[1241,19569,1278],{"class":1258},[1241,19571,19572,19575,19577,19579,19582],{"class":1243,"line":2468},[1241,19573,19574],{"class":7423},"      value ",[1241,19576,3003],{"class":1381},[1241,19578,1259],{"class":1258},[1241,19580,19581],{"class":1262},"all",[1241,19583,1278],{"class":1258},[1241,19585,19586],{"class":1243,"line":2480},[1241,19587,1636],{"class":1381},[1241,19589,19590],{"class":1243,"line":2490},[1241,19591,19592],{"class":1381},"  }\n",[1241,19594,19595],{"class":1243,"line":2500},[1241,19596,10277],{"class":1776},[1241,19598,19599,19602,19604,19606,19609,19611,19614],{"class":1243,"line":2505},[1241,19600,19601],{"class":7423},"  depends_on ",[1241,19603,3003],{"class":1381},[1241,19605,1598],{"class":1381},[1241,19607,19608],{"class":7423},"google_service_networking_connection",[1241,19610,1773],{"class":1709},[1241,19612,19613],{"class":7423},"private_vpc_connection",[1241,19615,1618],{"class":1381},[1241,19617,19618],{"class":1243,"line":2511},[1241,19619,1648],{"class":1381},[1241,19621,19622],{"class":1243,"line":2521},[1241,19623,1303],{"emptyLinePlaceholder":1302},[1241,19625,19626,19628,19631,19634],{"class":1243,"line":2531},[1241,19627,19103],{"class":9162},[1241,19629,19630],{"class":7423}," \"google_sql_database\"",[1241,19632,19633],{"class":7423}," \"database\"",[1241,19635,1566],{"class":1381},[1241,19637,19638,19641,19643,19645,19647],{"class":1243,"line":2536},[1241,19639,19640],{"class":7423},"  name     ",[1241,19642,3003],{"class":1381},[1241,19644,1259],{"class":1258},[1241,19646,8303],{"class":1262},[1241,19648,1278],{"class":1258},[1241,19650,19651,19654,19656,19659,19661,19663,19665],{"class":1243,"line":2542},[1241,19652,19653],{"class":7423},"  instance ",[1241,19655,3003],{"class":1381},[1241,19657,19658],{"class":1776}," google_sql_database_instance",[1241,19660,1773],{"class":1709},[1241,19662,8342],{"class":7423},[1241,19664,1773],{"class":1709},[1241,19666,19667],{"class":7423},"name\n",[1241,19669,19670],{"class":1243,"line":2552},[1241,19671,1648],{"class":1381},[1241,19673,19674],{"class":1243,"line":2569},[1241,19675,1303],{"emptyLinePlaceholder":1302},[1241,19677,19678,19680,19683,19686],{"class":1243,"line":2586},[1241,19679,19103],{"class":9162},[1241,19681,19682],{"class":7423}," \"google_sql_user\"",[1241,19684,19685],{"class":7423}," \"user\"",[1241,19687,1566],{"class":1381},[1241,19689,19690,19692,19694,19696,19699],{"class":1243,"line":2600},[1241,19691,19640],{"class":7423},[1241,19693,3003],{"class":1381},[1241,19695,1259],{"class":1258},[1241,19697,19698],{"class":1262},"django_user",[1241,19700,1278],{"class":1258},[1241,19702,19703,19705,19707,19709,19711,19713,19715],{"class":1243,"line":2614},[1241,19704,19653],{"class":7423},[1241,19706,3003],{"class":1381},[1241,19708,19658],{"class":1776},[1241,19710,1773],{"class":1709},[1241,19712,8342],{"class":7423},[1241,19714,1773],{"class":1709},[1241,19716,19667],{"class":7423},[1241,19718,19719,19722,19724,19726,19728],{"class":1243,"line":2635},[1241,19720,19721],{"class":7423},"  password ",[1241,19723,3003],{"class":1381},[1241,19725,19067],{"class":7423},[1241,19727,1773],{"class":1709},[1241,19729,19730],{"class":7423},"db_password\n",[1241,19732,19733],{"class":1243,"line":2656},[1241,19734,1648],{"class":1381},[1241,19736,19737],{"class":1243,"line":2677},[1241,19738,1303],{"emptyLinePlaceholder":1302},[1241,19740,19741],{"class":1243,"line":2683},[1241,19742,19743],{"class":1247},"# Redis Instance\n",[1241,19745,19746,19748,19751,19754],{"class":1243,"line":2697},[1241,19747,19103],{"class":9162},[1241,19749,19750],{"class":7423}," \"google_redis_instance\"",[1241,19752,19753],{"class":7423}," \"cache\"",[1241,19755,1566],{"class":1381},[1241,19757,19758,19761,19763,19765,19767,19769,19771,19773,19775,19778],{"class":1243,"line":2716},[1241,19759,19760],{"class":7423},"  name           ",[1241,19762,3003],{"class":1381},[1241,19764,1259],{"class":1258},[1241,19766,19247],{"class":16124},[1241,19768,19250],{"class":7790},[1241,19770,1773],{"class":1709},[1241,19772,5675],{"class":7790},[1241,19774,2234],{"class":16124},[1241,19776,19777],{"class":1262},"-redis",[1241,19779,1278],{"class":1258},[1241,19781,19782,19785,19787,19789,19792],{"class":1243,"line":2736},[1241,19783,19784],{"class":7423},"  tier           ",[1241,19786,3003],{"class":1381},[1241,19788,1259],{"class":1258},[1241,19790,19791],{"class":1262},"BASIC",[1241,19793,1278],{"class":1258},[1241,19795,19796,19799,19801],{"class":1243,"line":2741},[1241,19797,19798],{"class":7423},"  memory_size_gb ",[1241,19800,3003],{"class":1381},[1241,19802,12023],{"class":2476},[1241,19804,19805,19808,19810,19812,19814],{"class":1243,"line":2747},[1241,19806,19807],{"class":7423},"  region         ",[1241,19809,3003],{"class":1381},[1241,19811,19067],{"class":7423},[1241,19813,1773],{"class":1709},[1241,19815,19086],{"class":7423},[1241,19817,19818],{"class":1243,"line":2761},[1241,19819,10277],{"class":1776},[1241,19821,19822,19825,19827,19829,19831,19833,19835],{"class":1243,"line":2775},[1241,19823,19824],{"class":7423},"  authorized_network ",[1241,19826,3003],{"class":1381},[1241,19828,19351],{"class":1776},[1241,19830,1773],{"class":1709},[1241,19832,19356],{"class":7423},[1241,19834,1773],{"class":1709},[1241,19836,19361],{"class":7423},[1241,19838,19839],{"class":1243,"line":2804},[1241,19840,1648],{"class":1381},[1241,19842,19843],{"class":1243,"line":2823},[1241,19844,1303],{"emptyLinePlaceholder":1302},[1241,19846,19847],{"class":1243,"line":2840},[1241,19848,19849],{"class":1247},"# GKE Cluster\n",[1241,19851,19852,19854,19857,19860],{"class":1243,"line":2845},[1241,19853,19103],{"class":9162},[1241,19855,19856],{"class":7423}," \"google_container_cluster\"",[1241,19858,19859],{"class":7423}," \"primary\"",[1241,19861,1566],{"class":1381},[1241,19863,19864,19866,19868,19870,19872,19874,19876,19878,19880,19883],{"class":1243,"line":2850},[1241,19865,19640],{"class":7423},[1241,19867,3003],{"class":1381},[1241,19869,1259],{"class":1258},[1241,19871,19247],{"class":16124},[1241,19873,19250],{"class":7790},[1241,19875,1773],{"class":1709},[1241,19877,5675],{"class":7790},[1241,19879,2234],{"class":16124},[1241,19881,19882],{"class":1262},"-gke",[1241,19884,1278],{"class":1258},[1241,19886,19887,19890,19892,19894,19896],{"class":1243,"line":3776},[1241,19888,19889],{"class":7423},"  location ",[1241,19891,3003],{"class":1381},[1241,19893,19067],{"class":7423},[1241,19895,1773],{"class":1709},[1241,19897,19086],{"class":7423},[1241,19899,19900],{"class":1243,"line":3782},[1241,19901,10277],{"class":1776},[1241,19903,19904,19907,19909],{"class":1243,"line":3789},[1241,19905,19906],{"class":7423},"  remove_default_node_pool ",[1241,19908,3003],{"class":1381},[1241,19910,3228],{"class":1731},[1241,19912,19913,19916,19918],{"class":1243,"line":3796},[1241,19914,19915],{"class":7423},"  initial_node_count       ",[1241,19917,3003],{"class":1381},[1241,19919,12023],{"class":2476},[1241,19921,19922],{"class":1243,"line":3811},[1241,19923,10277],{"class":1776},[1241,19925,19926,19929,19931,19933,19935,19937,19939],{"class":1243,"line":3826},[1241,19927,19928],{"class":7423},"  network    ",[1241,19930,3003],{"class":1381},[1241,19932,19351],{"class":1776},[1241,19934,1773],{"class":1709},[1241,19936,19356],{"class":7423},[1241,19938,1773],{"class":1709},[1241,19940,19667],{"class":7423},[1241,19942,19943,19946,19948,19951,19953,19956,19958],{"class":1243,"line":3841},[1241,19944,19945],{"class":7423},"  subnetwork ",[1241,19947,3003],{"class":1381},[1241,19949,19950],{"class":1776}," google_compute_subnetwork",[1241,19952,1773],{"class":1709},[1241,19954,19955],{"class":7423},"subnet",[1241,19957,1773],{"class":1709},[1241,19959,19667],{"class":7423},[1241,19961,19962],{"class":1243,"line":3856},[1241,19963,10277],{"class":1776},[1241,19965,19966,19969],{"class":1243,"line":3871},[1241,19967,19968],{"class":9162},"  workload_identity_config",[1241,19970,1566],{"class":1381},[1241,19972,19973,19976,19978,19980,19982,19984,19986,19989,19991,19994],{"class":1243,"line":3886},[1241,19974,19975],{"class":7423},"    workload_pool ",[1241,19977,3003],{"class":1381},[1241,19979,1259],{"class":1258},[1241,19981,19247],{"class":16124},[1241,19983,19250],{"class":7790},[1241,19985,1773],{"class":1709},[1241,19987,19988],{"class":7790},"project_id",[1241,19990,2234],{"class":16124},[1241,19992,19993],{"class":1262},".svc.id.goog",[1241,19995,1278],{"class":1258},[1241,19997,19998],{"class":1243,"line":3901},[1241,19999,19592],{"class":1381},[1241,20001,20002],{"class":1243,"line":6562},[1241,20003,1648],{"class":1381},[1241,20005,20006],{"class":1243,"line":6581},[1241,20007,1303],{"emptyLinePlaceholder":1302},[1241,20009,20010,20012,20015,20018],{"class":1243,"line":6594},[1241,20011,19103],{"class":9162},[1241,20013,20014],{"class":7423}," \"google_container_node_pool\"",[1241,20016,20017],{"class":7423}," \"primary_nodes\"",[1241,20019,1566],{"class":1381},[1241,20021,20022,20025,20027,20029,20031,20033,20035,20037,20039,20042],{"class":1243,"line":6613},[1241,20023,20024],{"class":7423},"  name       ",[1241,20026,3003],{"class":1381},[1241,20028,1259],{"class":1258},[1241,20030,19247],{"class":16124},[1241,20032,19250],{"class":7790},[1241,20034,1773],{"class":1709},[1241,20036,5675],{"class":7790},[1241,20038,2234],{"class":16124},[1241,20040,20041],{"class":1262},"-node-pool",[1241,20043,1278],{"class":1258},[1241,20045,20046,20049,20051,20053,20055],{"class":1243,"line":6632},[1241,20047,20048],{"class":7423},"  location   ",[1241,20050,3003],{"class":1381},[1241,20052,19067],{"class":7423},[1241,20054,1773],{"class":1709},[1241,20056,19086],{"class":7423},[1241,20058,20059,20062,20064,20067,20069,20072,20074],{"class":1243,"line":6649},[1241,20060,20061],{"class":7423},"  cluster    ",[1241,20063,3003],{"class":1381},[1241,20065,20066],{"class":1776}," google_container_cluster",[1241,20068,1773],{"class":1709},[1241,20070,20071],{"class":7423},"primary",[1241,20073,1773],{"class":1709},[1241,20075,19667],{"class":7423},[1241,20077,20078,20081,20083],{"class":1243,"line":6654},[1241,20079,20080],{"class":7423},"  node_count ",[1241,20082,3003],{"class":1381},[1241,20084,12023],{"class":2476},[1241,20086,20087],{"class":1243,"line":6659},[1241,20088,10277],{"class":1776},[1241,20090,20091,20094],{"class":1243,"line":6664},[1241,20092,20093],{"class":9162},"  node_config",[1241,20095,1566],{"class":1381},[1241,20097,20098,20101,20103],{"class":1243,"line":6670},[1241,20099,20100],{"class":7423},"    preemptible  ",[1241,20102,3003],{"class":1381},[1241,20104,3228],{"class":1731},[1241,20106,20107,20110,20112,20114,20117],{"class":1243,"line":6684},[1241,20108,20109],{"class":7423},"    machine_type ",[1241,20111,3003],{"class":1381},[1241,20113,1259],{"class":1258},[1241,20115,20116],{"class":1262},"e2-medium",[1241,20118,1278],{"class":1258},[1241,20120,20121],{"class":1243,"line":6689},[1241,20122,8853],{"class":1776},[1241,20124,20125,20128,20130,20133,20135,20138,20140],{"class":1243,"line":6706},[1241,20126,20127],{"class":7423},"    service_account ",[1241,20129,3003],{"class":1381},[1241,20131,20132],{"class":1776}," google_service_account",[1241,20134,1773],{"class":1709},[1241,20136,20137],{"class":7423},"gke_service_account",[1241,20139,1773],{"class":1709},[1241,20141,20142],{"class":7423},"email\n",[1241,20144,20145,20148,20150],{"class":1243,"line":6711},[1241,20146,20147],{"class":7423},"    oauth_scopes ",[1241,20149,3003],{"class":1381},[1241,20151,1421],{"class":1381},[1241,20153,20154,20156,20159],{"class":1243,"line":6716},[1241,20155,1431],{"class":1258},[1241,20157,20158],{"class":1262},"https://www.googleapis.com/auth/cloud-platform",[1241,20160,1278],{"class":1258},[1241,20162,20163],{"class":1243,"line":6735},[1241,20164,8985],{"class":1381},[1241,20166,20167],{"class":1243,"line":6749},[1241,20168,19592],{"class":1381},[1241,20170,20171],{"class":1243,"line":6768},[1241,20172,1648],{"class":1381},[1241,20174,20175],{"class":1243,"line":6773},[1241,20176,1303],{"emptyLinePlaceholder":1302},[1241,20178,20179],{"class":1243,"line":6778},[1241,20180,20181],{"class":1247},"# Service Account\n",[1241,20183,20184,20186,20189,20192],{"class":1243,"line":6783},[1241,20185,19103],{"class":9162},[1241,20187,20188],{"class":7423}," \"google_service_account\"",[1241,20190,20191],{"class":7423}," \"gke_service_account\"",[1241,20193,1566],{"class":1381},[1241,20195,20196,20199,20201,20203,20205,20207,20209,20211,20213,20216],{"class":1243,"line":11192},[1241,20197,20198],{"class":7423},"  account_id   ",[1241,20200,3003],{"class":1381},[1241,20202,1259],{"class":1258},[1241,20204,19247],{"class":16124},[1241,20206,19250],{"class":7790},[1241,20208,1773],{"class":1709},[1241,20210,5675],{"class":7790},[1241,20212,2234],{"class":16124},[1241,20214,20215],{"class":1262},"-gke-sa",[1241,20217,1278],{"class":1258},[1241,20219,20220,20223,20225,20227,20230],{"class":1243,"line":11203},[1241,20221,20222],{"class":7423},"  display_name ",[1241,20224,3003],{"class":1381},[1241,20226,1259],{"class":1258},[1241,20228,20229],{"class":1262},"GKE Service Account",[1241,20231,1278],{"class":1258},[1241,20233,20234],{"class":1243,"line":11214},[1241,20235,1648],{"class":1381},[1241,20237,20238],{"class":1243,"line":11222},[1241,20239,1303],{"emptyLinePlaceholder":1302},[1241,20241,20242],{"class":1243,"line":11234},[1241,20243,20244],{"class":1247},"# Private Service Connection\n",[1241,20246,20247,20249,20252,20255],{"class":1243,"line":11244},[1241,20248,19103],{"class":9162},[1241,20250,20251],{"class":7423}," \"google_compute_global_address\"",[1241,20253,20254],{"class":7423}," \"private_ip_address\"",[1241,20256,1566],{"class":1381},[1241,20258,20259,20261,20263,20265,20267,20269,20271,20273,20275,20278],{"class":1243,"line":11254},[1241,20260,19295],{"class":7423},[1241,20262,3003],{"class":1381},[1241,20264,1259],{"class":1258},[1241,20266,19247],{"class":16124},[1241,20268,19250],{"class":7790},[1241,20270,1773],{"class":1709},[1241,20272,5675],{"class":7790},[1241,20274,2234],{"class":16124},[1241,20276,20277],{"class":1262},"-private-ip",[1241,20279,1278],{"class":1258},[1241,20281,20282,20285,20287,20289,20292],{"class":1243,"line":11264},[1241,20283,20284],{"class":7423},"  purpose       ",[1241,20286,3003],{"class":1381},[1241,20288,1259],{"class":1258},[1241,20290,20291],{"class":1262},"VPC_PEERING",[1241,20293,1278],{"class":1258},[1241,20295,20296,20299,20301,20303,20306],{"class":1243,"line":11275},[1241,20297,20298],{"class":7423},"  address_type  ",[1241,20300,3003],{"class":1381},[1241,20302,1259],{"class":1258},[1241,20304,20305],{"class":1262},"INTERNAL",[1241,20307,1278],{"class":1258},[1241,20309,20310,20313,20315],{"class":1243,"line":11284},[1241,20311,20312],{"class":7423},"  prefix_length ",[1241,20314,3003],{"class":1381},[1241,20316,20317],{"class":2476}," 16\n",[1241,20319,20320,20322,20324,20326,20328,20330,20332],{"class":1243,"line":11293},[1241,20321,19346],{"class":7423},[1241,20323,3003],{"class":1381},[1241,20325,19351],{"class":1776},[1241,20327,1773],{"class":1709},[1241,20329,19356],{"class":7423},[1241,20331,1773],{"class":1709},[1241,20333,19361],{"class":7423},[1241,20335,20336],{"class":1243,"line":11302},[1241,20337,1648],{"class":1381},[1241,20339,20340],{"class":1243,"line":11307},[1241,20341,1303],{"emptyLinePlaceholder":1302},[1241,20343,20344,20346,20349,20352],{"class":1243,"line":11315},[1241,20345,19103],{"class":9162},[1241,20347,20348],{"class":7423}," \"google_service_networking_connection\"",[1241,20350,20351],{"class":7423}," \"private_vpc_connection\"",[1241,20353,1566],{"class":1381},[1241,20355,20356,20359,20361,20363,20365,20367,20369],{"class":1243,"line":11324},[1241,20357,20358],{"class":7423},"  network                 ",[1241,20360,3003],{"class":1381},[1241,20362,19351],{"class":1776},[1241,20364,1773],{"class":1709},[1241,20366,19356],{"class":7423},[1241,20368,1773],{"class":1709},[1241,20370,19361],{"class":7423},[1241,20372,20373,20376,20378,20380,20383],{"class":1243,"line":11331},[1241,20374,20375],{"class":7423},"  service                 ",[1241,20377,3003],{"class":1381},[1241,20379,1259],{"class":1258},[1241,20381,20382],{"class":1262},"servicenetworking.googleapis.com",[1241,20384,1278],{"class":1258},[1241,20386,20387,20390,20392,20394,20397,20399,20402,20404,20406],{"class":1243,"line":11343},[1241,20388,20389],{"class":7423},"  reserved_peering_ranges ",[1241,20391,3003],{"class":1381},[1241,20393,1598],{"class":1381},[1241,20395,20396],{"class":7423},"google_compute_global_address",[1241,20398,1773],{"class":1709},[1241,20400,20401],{"class":7423},"private_ip_address",[1241,20403,1773],{"class":1709},[1241,20405,5560],{"class":7423},[1241,20407,1618],{"class":1381},[1241,20409,20410],{"class":1243,"line":11353},[1241,20411,1648],{"class":1381},[1241,20413,20414],{"class":1243,"line":11364},[1241,20415,1303],{"emptyLinePlaceholder":1302},[1241,20417,20418],{"class":1243,"line":11371},[1241,20419,20420],{"class":1247},"# Variables\n",[1241,20422,20423,20426,20429],{"class":1243,"line":11382},[1241,20424,20425],{"class":9162},"variable",[1241,20427,20428],{"class":7423}," \"project_id\"",[1241,20430,1566],{"class":1381},[1241,20432,20433,20436,20438,20440,20443],{"class":1243,"line":11391},[1241,20434,20435],{"class":7423},"  description ",[1241,20437,3003],{"class":1381},[1241,20439,1259],{"class":1258},[1241,20441,20442],{"class":1262},"GCP Project ID",[1241,20444,1278],{"class":1258},[1241,20446,20447,20450,20452],{"class":1243,"line":11400},[1241,20448,20449],{"class":7423},"  type        ",[1241,20451,3003],{"class":1381},[1241,20453,20454],{"class":2222}," string\n",[1241,20456,20457],{"class":1243,"line":11413},[1241,20458,1648],{"class":1381},[1241,20460,20461],{"class":1243,"line":11424},[1241,20462,1303],{"emptyLinePlaceholder":1302},[1241,20464,20465,20467,20470],{"class":1243,"line":11434},[1241,20466,20425],{"class":9162},[1241,20468,20469],{"class":7423}," \"region\"",[1241,20471,1566],{"class":1381},[1241,20473,20474,20476,20478,20480,20483],{"class":1243,"line":11443},[1241,20475,20435],{"class":7423},[1241,20477,3003],{"class":1381},[1241,20479,1259],{"class":1258},[1241,20481,20482],{"class":1262},"GCP Region",[1241,20484,1278],{"class":1258},[1241,20486,20487,20489,20491],{"class":1243,"line":11452},[1241,20488,20449],{"class":7423},[1241,20490,3003],{"class":1381},[1241,20492,20454],{"class":2222},[1241,20494,20495,20498,20500,20502,20504],{"class":1243,"line":11457},[1241,20496,20497],{"class":7423},"  default     ",[1241,20499,3003],{"class":1381},[1241,20501,1259],{"class":1258},[1241,20503,16592],{"class":1262},[1241,20505,1278],{"class":1258},[1241,20507,20508],{"class":1243,"line":11465},[1241,20509,1648],{"class":1381},[1241,20511,20512],{"class":1243,"line":11474},[1241,20513,1303],{"emptyLinePlaceholder":1302},[1241,20515,20516,20518,20521],{"class":1243,"line":11481},[1241,20517,20425],{"class":9162},[1241,20519,20520],{"class":7423}," \"environment\"",[1241,20522,1566],{"class":1381},[1241,20524,20525,20527,20529,20531,20534],{"class":1243,"line":11493},[1241,20526,20435],{"class":7423},[1241,20528,3003],{"class":1381},[1241,20530,1259],{"class":1258},[1241,20532,20533],{"class":1262},"Environment name",[1241,20535,1278],{"class":1258},[1241,20537,20538,20540,20542],{"class":1243,"line":11503},[1241,20539,20449],{"class":7423},[1241,20541,3003],{"class":1381},[1241,20543,20454],{"class":2222},[1241,20545,20546,20548,20550,20552,20554],{"class":1243,"line":11514},[1241,20547,20497],{"class":7423},[1241,20549,3003],{"class":1381},[1241,20551,1259],{"class":1258},[1241,20553,4296],{"class":1262},[1241,20555,1278],{"class":1258},[1241,20557,20558],{"class":1243,"line":11521},[1241,20559,1648],{"class":1381},[1241,20561,20562],{"class":1243,"line":11532},[1241,20563,1303],{"emptyLinePlaceholder":1302},[1241,20565,20566,20568,20571],{"class":1243,"line":11542},[1241,20567,20425],{"class":9162},[1241,20569,20570],{"class":7423}," \"db_password\"",[1241,20572,1566],{"class":1381},[1241,20574,20575,20577,20579,20581,20584],{"class":1243,"line":11551},[1241,20576,20435],{"class":7423},[1241,20578,3003],{"class":1381},[1241,20580,1259],{"class":1258},[1241,20582,20583],{"class":1262},"Database password",[1241,20585,1278],{"class":1258},[1241,20587,20588,20590,20592],{"class":1243,"line":11563},[1241,20589,20449],{"class":7423},[1241,20591,3003],{"class":1381},[1241,20593,20454],{"class":2222},[1241,20595,20596,20599,20601],{"class":1243,"line":11568},[1241,20597,20598],{"class":7423},"  sensitive   ",[1241,20600,3003],{"class":1381},[1241,20602,3228],{"class":1731},[1241,20604,20605],{"class":1243,"line":11574},[1241,20606,1648],{"class":1381},[1241,20608,20609],{"class":1243,"line":11582},[1241,20610,1303],{"emptyLinePlaceholder":1302},[1241,20612,20613],{"class":1243,"line":11592},[1241,20614,20615],{"class":1247},"# Outputs\n",[1241,20617,20618,20621,20624],{"class":1243,"line":11599},[1241,20619,20620],{"class":9162},"output",[1241,20622,20623],{"class":7423}," \"cluster_endpoint\"",[1241,20625,1566],{"class":1381},[1241,20627,20628,20631,20633,20635,20637,20639,20641],{"class":1243,"line":11610},[1241,20629,20630],{"class":7423},"  value ",[1241,20632,3003],{"class":1381},[1241,20634,20066],{"class":1776},[1241,20636,1773],{"class":1709},[1241,20638,20071],{"class":7423},[1241,20640,1773],{"class":1709},[1241,20642,20643],{"class":7423},"endpoint\n",[1241,20645,20646],{"class":1243,"line":11618},[1241,20647,1648],{"class":1381},[1241,20649,20650],{"class":1243,"line":11628},[1241,20651,1303],{"emptyLinePlaceholder":1302},[1241,20653,20654,20656,20659],{"class":1243,"line":11638},[1241,20655,20620],{"class":9162},[1241,20657,20658],{"class":7423}," \"database_connection_name\"",[1241,20660,1566],{"class":1381},[1241,20662,20663,20665,20667,20669,20671,20673,20675],{"class":1243,"line":11645},[1241,20664,20630],{"class":7423},[1241,20666,3003],{"class":1381},[1241,20668,19658],{"class":1776},[1241,20670,1773],{"class":1709},[1241,20672,8342],{"class":7423},[1241,20674,1773],{"class":1709},[1241,20676,20677],{"class":7423},"connection_name\n",[1241,20679,20680],{"class":1243,"line":11656},[1241,20681,1648],{"class":1381},[1241,20683,20684],{"class":1243,"line":11668},[1241,20685,1303],{"emptyLinePlaceholder":1302},[1241,20687,20688,20690,20693],{"class":1243,"line":11673},[1241,20689,20620],{"class":9162},[1241,20691,20692],{"class":7423}," \"redis_host\"",[1241,20694,1566],{"class":1381},[1241,20696,20697,20699,20701,20704,20706,20709,20711],{"class":1243,"line":11681},[1241,20698,20630],{"class":7423},[1241,20700,3003],{"class":1381},[1241,20702,20703],{"class":1776}," google_redis_instance",[1241,20705,1773],{"class":1709},[1241,20707,20708],{"class":7423},"cache",[1241,20710,1773],{"class":1709},[1241,20712,20713],{"class":7423},"host\n",[1241,20715,20716],{"class":1243,"line":11691},[1241,20717,1648],{"class":1381},[1030,20719,20721],{"id":20720},"microsoft-azure","Microsoft Azure",[1026,20723,20724],{},"Microsoft Azure provides comprehensive cloud services for Django deployment including App Service (PaaS), Container Instances, Azure Kubernetes Service (AKS), and Azure Functions. Azure integrates well with Microsoft's enterprise ecosystem and offers strong hybrid cloud capabilities.",[1035,20726,20728],{"id":20727},"azure-account-setup-and-cli","Azure Account Setup and CLI",[1026,20730,20731],{},[1042,20732,20733],{},"Install Azure CLI",[1128,20735,20737],{"className":1235,"code":20736,"language":1237,"meta":1137,"style":1137},"# Install Azure CLI (Linux)\ncurl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash\n\n# Install Azure CLI (macOS)\nbrew update && brew install azure-cli\n\n# Login to Azure\naz login\n\n# Set default subscription\naz account set --subscription \"Your Subscription Name\"\n\n# Create resource group\naz group create --name django-app-rg --location eastus\n\n# List available locations\naz account list-locations --output table\n",[1135,20738,20739,20744,20761,20765,20770,20790,20794,20799,20807,20811,20816,20835,20839,20844,20865,20869,20874],{"__ignoreMap":1137},[1241,20740,20741],{"class":1243,"line":1244},[1241,20742,20743],{"class":1247},"# Install Azure CLI (Linux)\n",[1241,20745,20746,20748,20751,20754,20756,20759],{"class":1243,"line":1251},[1241,20747,1255],{"class":1254},[1241,20749,20750],{"class":1269}," -sL",[1241,20752,20753],{"class":1262}," https://aka.ms/InstallAzureCLIDeb",[1241,20755,7629],{"class":1709},[1241,20757,20758],{"class":1254}," sudo",[1241,20760,13381],{"class":1262},[1241,20762,20763],{"class":1243,"line":1281},[1241,20764,1303],{"emptyLinePlaceholder":1302},[1241,20766,20767],{"class":1243,"line":1290},[1241,20768,20769],{"class":1247},"# Install Azure CLI (macOS)\n",[1241,20771,20772,20775,20778,20781,20784,20787],{"class":1243,"line":1299},[1241,20773,20774],{"class":1254},"brew",[1241,20776,20777],{"class":1262}," update",[1241,20779,20780],{"class":1381}," &&",[1241,20782,20783],{"class":1254}," brew",[1241,20785,20786],{"class":1262}," install",[1241,20788,20789],{"class":1262}," azure-cli\n",[1241,20791,20792],{"class":1243,"line":1306},[1241,20793,1303],{"emptyLinePlaceholder":1302},[1241,20795,20796],{"class":1243,"line":1312},[1241,20797,20798],{"class":1247},"# Login to Azure\n",[1241,20800,20801,20804],{"class":1243,"line":1321},[1241,20802,20803],{"class":1254},"az",[1241,20805,20806],{"class":1262}," login\n",[1241,20808,20809],{"class":1243,"line":1327},[1241,20810,1303],{"emptyLinePlaceholder":1302},[1241,20812,20813],{"class":1243,"line":1333},[1241,20814,20815],{"class":1247},"# Set default subscription\n",[1241,20817,20818,20820,20823,20825,20828,20830,20833],{"class":1243,"line":1339},[1241,20819,20803],{"class":1254},[1241,20821,20822],{"class":1262}," account",[1241,20824,13428],{"class":1262},[1241,20826,20827],{"class":1269}," --subscription",[1241,20829,1259],{"class":1258},[1241,20831,20832],{"class":1262},"Your Subscription Name",[1241,20834,1278],{"class":1258},[1241,20836,20837],{"class":1243,"line":1345},[1241,20838,1303],{"emptyLinePlaceholder":1302},[1241,20840,20841],{"class":1243,"line":1350},[1241,20842,20843],{"class":1247},"# Create resource group\n",[1241,20845,20846,20848,20851,20853,20856,20859,20862],{"class":1243,"line":1356},[1241,20847,20803],{"class":1254},[1241,20849,20850],{"class":1262}," group",[1241,20852,3967],{"class":1262},[1241,20854,20855],{"class":1269}," --name",[1241,20857,20858],{"class":1262}," django-app-rg",[1241,20860,20861],{"class":1269}," --location",[1241,20863,20864],{"class":1262}," eastus\n",[1241,20866,20867],{"class":1243,"line":1554},[1241,20868,1303],{"emptyLinePlaceholder":1302},[1241,20870,20871],{"class":1243,"line":1569},[1241,20872,20873],{"class":1247},"# List available locations\n",[1241,20875,20876,20878,20880,20883,20886],{"class":1243,"line":1584},[1241,20877,20803],{"class":1254},[1241,20879,20822],{"class":1262},[1241,20881,20882],{"class":1262}," list-locations",[1241,20884,20885],{"class":1269}," --output",[1241,20887,20888],{"class":1262}," table\n",[1035,20890,20892],{"id":20891},"azure-app-service","Azure App Service",[1026,20894,20895],{},"Azure App Service is a fully managed PaaS for building, deploying, and scaling web apps.",[1026,20897,20898],{},[1042,20899,20900],{},"Create App Service Plan and Web App",[1128,20902,20904],{"className":1235,"code":20903,"language":1237,"meta":1137,"style":1137},"# Create App Service Plan\naz appservice plan create \\\n    --name django-app-plan \\\n    --resource-group django-app-rg \\\n    --sku B1 \\\n    --is-linux\n\n# Create Web App\naz webapp create \\\n    --resource-group django-app-rg \\\n    --plan django-app-plan \\\n    --name django-app-unique-name \\\n    --runtime \"PYTHON|3.11\" \\\n    --deployment-local-git\n\n# Configure app settings\naz webapp config appsettings set \\\n    --resource-group django-app-rg \\\n    --name django-app-unique-name \\\n    --settings \\\n        DJANGO_SETTINGS_MODULE=myproject.settings.production \\\n        SECRET_KEY=\"your-secret-key\" \\\n        DEBUG=False \\\n        WEBSITES_PORT=8000\n\n# Configure startup command\naz webapp config set \\\n    --resource-group django-app-rg \\\n    --name django-app-unique-name \\\n    --startup-file \"gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application\"\n",[1135,20905,20906,20911,20925,20935,20944,20954,20959,20963,20968,20979,20987,20996,21005,21019,21024,21028,21033,21048,21056,21064,21071,21078,21092,21099,21107,21111,21116,21128,21136,21144],{"__ignoreMap":1137},[1241,20907,20908],{"class":1243,"line":1244},[1241,20909,20910],{"class":1247},"# Create App Service Plan\n",[1241,20912,20913,20915,20918,20921,20923],{"class":1243,"line":1251},[1241,20914,20803],{"class":1254},[1241,20916,20917],{"class":1262}," appservice",[1241,20919,20920],{"class":1262}," plan",[1241,20922,3967],{"class":1262},[1241,20924,7890],{"class":1724},[1241,20926,20927,20930,20933],{"class":1243,"line":1281},[1241,20928,20929],{"class":1269},"    --name",[1241,20931,20932],{"class":1262}," django-app-plan",[1241,20934,7890],{"class":1724},[1241,20936,20937,20940,20942],{"class":1243,"line":1290},[1241,20938,20939],{"class":1269},"    --resource-group",[1241,20941,20858],{"class":1262},[1241,20943,7890],{"class":1724},[1241,20945,20946,20949,20952],{"class":1243,"line":1299},[1241,20947,20948],{"class":1269},"    --sku",[1241,20950,20951],{"class":1262}," B1",[1241,20953,7890],{"class":1724},[1241,20955,20956],{"class":1243,"line":1306},[1241,20957,20958],{"class":1269},"    --is-linux\n",[1241,20960,20961],{"class":1243,"line":1312},[1241,20962,1303],{"emptyLinePlaceholder":1302},[1241,20964,20965],{"class":1243,"line":1321},[1241,20966,20967],{"class":1247},"# Create Web App\n",[1241,20969,20970,20972,20975,20977],{"class":1243,"line":1327},[1241,20971,20803],{"class":1254},[1241,20973,20974],{"class":1262}," webapp",[1241,20976,3967],{"class":1262},[1241,20978,7890],{"class":1724},[1241,20980,20981,20983,20985],{"class":1243,"line":1333},[1241,20982,20939],{"class":1269},[1241,20984,20858],{"class":1262},[1241,20986,7890],{"class":1724},[1241,20988,20989,20992,20994],{"class":1243,"line":1339},[1241,20990,20991],{"class":1269},"    --plan",[1241,20993,20932],{"class":1262},[1241,20995,7890],{"class":1724},[1241,20997,20998,21000,21003],{"class":1243,"line":1345},[1241,20999,20929],{"class":1269},[1241,21001,21002],{"class":1262}," django-app-unique-name",[1241,21004,7890],{"class":1724},[1241,21006,21007,21010,21012,21015,21017],{"class":1243,"line":1350},[1241,21008,21009],{"class":1269},"    --runtime",[1241,21011,1259],{"class":1258},[1241,21013,21014],{"class":1262},"PYTHON|3.11",[1241,21016,1266],{"class":1258},[1241,21018,7890],{"class":1724},[1241,21020,21021],{"class":1243,"line":1356},[1241,21022,21023],{"class":1269},"    --deployment-local-git\n",[1241,21025,21026],{"class":1243,"line":1554},[1241,21027,1303],{"emptyLinePlaceholder":1302},[1241,21029,21030],{"class":1243,"line":1569},[1241,21031,21032],{"class":1247},"# Configure app settings\n",[1241,21034,21035,21037,21039,21041,21044,21046],{"class":1243,"line":1584},[1241,21036,20803],{"class":1254},[1241,21038,20974],{"class":1262},[1241,21040,13425],{"class":1262},[1241,21042,21043],{"class":1262}," appsettings",[1241,21045,13428],{"class":1262},[1241,21047,7890],{"class":1724},[1241,21049,21050,21052,21054],{"class":1243,"line":1621},[1241,21051,20939],{"class":1269},[1241,21053,20858],{"class":1262},[1241,21055,7890],{"class":1724},[1241,21057,21058,21060,21062],{"class":1243,"line":1627},[1241,21059,20929],{"class":1269},[1241,21061,21002],{"class":1262},[1241,21063,7890],{"class":1724},[1241,21065,21066,21069],{"class":1243,"line":1633},[1241,21067,21068],{"class":1269},"    --settings",[1241,21070,7890],{"class":1724},[1241,21072,21073,21076],{"class":1243,"line":1639},[1241,21074,21075],{"class":1262},"        DJANGO_SETTINGS_MODULE=myproject.settings.production",[1241,21077,7890],{"class":1724},[1241,21079,21080,21083,21085,21088,21090],{"class":1243,"line":1645},[1241,21081,21082],{"class":1262},"        SECRET_KEY=",[1241,21084,1266],{"class":1258},[1241,21086,21087],{"class":1262},"your-secret-key",[1241,21089,1266],{"class":1258},[1241,21091,7890],{"class":1724},[1241,21093,21094,21097],{"class":1243,"line":2028},[1241,21095,21096],{"class":1262},"        DEBUG=False",[1241,21098,7890],{"class":1724},[1241,21100,21101,21104],{"class":1243,"line":2042},[1241,21102,21103],{"class":1262},"        WEBSITES_PORT=",[1241,21105,21106],{"class":2476},"8000\n",[1241,21108,21109],{"class":1243,"line":2064},[1241,21110,1303],{"emptyLinePlaceholder":1302},[1241,21112,21113],{"class":1243,"line":2070},[1241,21114,21115],{"class":1247},"# Configure startup command\n",[1241,21117,21118,21120,21122,21124,21126],{"class":1243,"line":2075},[1241,21119,20803],{"class":1254},[1241,21121,20974],{"class":1262},[1241,21123,13425],{"class":1262},[1241,21125,13428],{"class":1262},[1241,21127,7890],{"class":1724},[1241,21129,21130,21132,21134],{"class":1243,"line":2080},[1241,21131,20939],{"class":1269},[1241,21133,20858],{"class":1262},[1241,21135,7890],{"class":1724},[1241,21137,21138,21140,21142],{"class":1243,"line":2085},[1241,21139,20929],{"class":1269},[1241,21141,21002],{"class":1262},[1241,21143,7890],{"class":1724},[1241,21145,21146,21149,21151,21154],{"class":1243,"line":2091},[1241,21147,21148],{"class":1269},"    --startup-file",[1241,21150,1259],{"class":1258},[1241,21152,21153],{"class":1262},"gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application",[1241,21155,1278],{"class":1258},[1026,21157,21158],{},[1042,21159,21160],{},"Django Settings for Azure App Service",[1128,21162,21164],{"className":1674,"code":21163,"language":1676,"meta":1137,"style":1137},"# settings/azure.py\nimport os\nfrom .base import *\n\n# Azure App Service specific settings\nDEBUG = False\nALLOWED_HOSTS = [\n    '.azurewebsites.net',\n    os.environ.get('WEBSITE_HOSTNAME', ''),\n]\n\n# Database configuration for Azure Database for PostgreSQL\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': os.environ.get('AZURE_POSTGRESQL_NAME'),\n        'USER': os.environ.get('AZURE_POSTGRESQL_USER'),\n        'PASSWORD': os.environ.get('AZURE_POSTGRESQL_PASSWORD'),\n        'HOST': os.environ.get('AZURE_POSTGRESQL_HOST'),\n        'PORT': '5432',\n        'OPTIONS': {\n            'sslmode': 'require',\n        },\n    }\n}\n\n# Azure Blob Storage for static and media files\nAZURE_ACCOUNT_NAME = os.environ.get('AZURE_STORAGE_ACCOUNT_NAME')\nAZURE_ACCOUNT_KEY = os.environ.get('AZURE_STORAGE_ACCOUNT_KEY')\nAZURE_CONTAINER = os.environ.get('AZURE_STORAGE_CONTAINER_NAME', 'static')\n\nif AZURE_ACCOUNT_NAME:\n    STATICFILES_STORAGE = 'storages.backends.azure_storage.AzureStorage'\n    DEFAULT_FILE_STORAGE = 'storages.backends.azure_storage.AzureStorage'\n    \n    AZURE_CUSTOM_DOMAIN = f'{AZURE_ACCOUNT_NAME}.blob.core.windows.net'\n    STATIC_URL = f'https://{AZURE_CUSTOM_DOMAIN}/{AZURE_CONTAINER}/static/'\n    MEDIA_URL = f'https://{AZURE_CUSTOM_DOMAIN}/{AZURE_CONTAINER}/media/'\n\n# Azure Cache for Redis\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': os.environ.get('AZURE_REDIS_URL'),\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n            'CONNECTION_POOL_KWARGS': {\n                'ssl_cert_reqs': None,\n            },\n        },\n    }\n}\n\n# Security settings\nSECURE_SSL_REDIRECT = True\nSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')\nSECURE_HSTS_SECONDS = 31536000\nSECURE_HSTS_INCLUDE_SUBDOMAINS = True\nSECURE_HSTS_PRELOAD = True\n\n# Session configuration\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'default'\n\n# Logging to Azure Application Insights\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'azure': {\n            'level': 'INFO',\n            'class': 'opencensus.ext.azure.log_exporter.AzureLogHandler',\n            'connection_string': os.environ.get('APPLICATIONINSIGHTS_CONNECTION_STRING'),\n        },\n        'console': {\n            'level': 'INFO',\n            'class': 'logging.StreamHandler',\n        },\n    },\n    'loggers': {\n        'django': {\n            'handlers': ['azure', 'console'],\n            'level': 'INFO',\n            'propagate': True,\n        },\n    },\n}\n",[1135,21165,21166,21171,21177,21189,21193,21198,21206,21214,21225,21252,21256,21260,21265,21273,21285,21303,21334,21365,21396,21427,21445,21457,21475,21479,21483,21487,21491,21496,21524,21552,21588,21592,21601,21615,21628,21632,21652,21680,21706,21710,21715,21723,21735,21753,21784,21796,21814,21826,21840,21844,21848,21852,21856,21860,21864,21872,21896,21904,21912,21920,21924,21928,21940,21952,21956,21961,21969,21983,21997,22009,22022,22040,22059,22091,22095,22107,22125,22143,22147,22151,22163,22175,22203,22221,22235,22239,22243],{"__ignoreMap":1137},[1241,21167,21168],{"class":1243,"line":1244},[1241,21169,21170],{"class":1247},"# settings/azure.py\n",[1241,21172,21173,21175],{"class":1243,"line":1251},[1241,21174,1689],{"class":1688},[1241,21176,1693],{"class":1692},[1241,21178,21179,21181,21183,21185,21187],{"class":1243,"line":1281},[1241,21180,1698],{"class":1688},[1241,21182,1701],{"class":1381},[1241,21184,1704],{"class":1692},[1241,21186,1689],{"class":1688},[1241,21188,1710],{"class":1709},[1241,21190,21191],{"class":1243,"line":1290},[1241,21192,1303],{"emptyLinePlaceholder":1302},[1241,21194,21195],{"class":1243,"line":1299},[1241,21196,21197],{"class":1247},"# Azure App Service specific settings\n",[1241,21199,21200,21202,21204],{"class":1243,"line":1306},[1241,21201,1725],{"class":1724},[1241,21203,1728],{"class":1381},[1241,21205,1732],{"class":1731},[1241,21207,21208,21210,21212],{"class":1243,"line":1312},[1241,21209,1737],{"class":1724},[1241,21211,1728],{"class":1381},[1241,21213,1421],{"class":1381},[1241,21215,21216,21218,21221,21223],{"class":1243,"line":1321},[1241,21217,1746],{"class":1258},[1241,21219,21220],{"class":1262},".azurewebsites.net",[1241,21222,1752],{"class":1258},[1241,21224,1407],{"class":1381},[1241,21226,21227,21229,21231,21233,21235,21237,21239,21241,21244,21246,21248,21250],{"class":1243,"line":1327},[1241,21228,1770],{"class":1692},[1241,21230,1773],{"class":1381},[1241,21232,1777],{"class":1776},[1241,21234,1773],{"class":1381},[1241,21236,1783],{"class":1782},[1241,21238,1786],{"class":1381},[1241,21240,1752],{"class":1258},[1241,21242,21243],{"class":1262},"WEBSITE_HOSTNAME",[1241,21245,1752],{"class":1258},[1241,21247,1608],{"class":1381},[1241,21249,1798],{"class":1258},[1241,21251,1801],{"class":1381},[1241,21253,21254],{"class":1243,"line":1333},[1241,21255,1618],{"class":1381},[1241,21257,21258],{"class":1243,"line":1339},[1241,21259,1303],{"emptyLinePlaceholder":1302},[1241,21261,21262],{"class":1243,"line":1345},[1241,21263,21264],{"class":1247},"# Database configuration for Azure Database for PostgreSQL\n",[1241,21266,21267,21269,21271],{"class":1243,"line":1350},[1241,21268,4785],{"class":1724},[1241,21270,1728],{"class":1381},[1241,21272,1566],{"class":1381},[1241,21274,21275,21277,21279,21281,21283],{"class":1243,"line":1356},[1241,21276,1746],{"class":1258},[1241,21278,1857],{"class":1262},[1241,21280,1752],{"class":1258},[1241,21282,1397],{"class":1381},[1241,21284,1566],{"class":1381},[1241,21286,21287,21289,21291,21293,21295,21297,21299,21301],{"class":1243,"line":1554},[1241,21288,1854],{"class":1258},[1241,21290,1871],{"class":1262},[1241,21292,1752],{"class":1258},[1241,21294,1397],{"class":1381},[1241,21296,1822],{"class":1258},[1241,21298,1880],{"class":1262},[1241,21300,1752],{"class":1258},[1241,21302,1407],{"class":1381},[1241,21304,21305,21307,21309,21311,21313,21315,21317,21319,21321,21323,21325,21327,21330,21332],{"class":1243,"line":1569},[1241,21306,1854],{"class":1258},[1241,21308,1891],{"class":1262},[1241,21310,1752],{"class":1258},[1241,21312,1397],{"class":1381},[1241,21314,1833],{"class":1692},[1241,21316,1773],{"class":1381},[1241,21318,1777],{"class":1776},[1241,21320,1773],{"class":1381},[1241,21322,1783],{"class":1782},[1241,21324,1786],{"class":1381},[1241,21326,1752],{"class":1258},[1241,21328,21329],{"class":1262},"AZURE_POSTGRESQL_NAME",[1241,21331,1752],{"class":1258},[1241,21333,1801],{"class":1381},[1241,21335,21336,21338,21340,21342,21344,21346,21348,21350,21352,21354,21356,21358,21361,21363],{"class":1243,"line":1584},[1241,21337,1854],{"class":1258},[1241,21339,1921],{"class":1262},[1241,21341,1752],{"class":1258},[1241,21343,1397],{"class":1381},[1241,21345,1833],{"class":1692},[1241,21347,1773],{"class":1381},[1241,21349,1777],{"class":1776},[1241,21351,1773],{"class":1381},[1241,21353,1783],{"class":1782},[1241,21355,1786],{"class":1381},[1241,21357,1752],{"class":1258},[1241,21359,21360],{"class":1262},"AZURE_POSTGRESQL_USER",[1241,21362,1752],{"class":1258},[1241,21364,1801],{"class":1381},[1241,21366,21367,21369,21371,21373,21375,21377,21379,21381,21383,21385,21387,21389,21392,21394],{"class":1243,"line":1621},[1241,21368,1854],{"class":1258},[1241,21370,1949],{"class":1262},[1241,21372,1752],{"class":1258},[1241,21374,1397],{"class":1381},[1241,21376,1833],{"class":1692},[1241,21378,1773],{"class":1381},[1241,21380,1777],{"class":1776},[1241,21382,1773],{"class":1381},[1241,21384,1783],{"class":1782},[1241,21386,1786],{"class":1381},[1241,21388,1752],{"class":1258},[1241,21390,21391],{"class":1262},"AZURE_POSTGRESQL_PASSWORD",[1241,21393,1752],{"class":1258},[1241,21395,1801],{"class":1381},[1241,21397,21398,21400,21402,21404,21406,21408,21410,21412,21414,21416,21418,21420,21423,21425],{"class":1243,"line":1627},[1241,21399,1854],{"class":1258},[1241,21401,1977],{"class":1262},[1241,21403,1752],{"class":1258},[1241,21405,1397],{"class":1381},[1241,21407,1833],{"class":1692},[1241,21409,1773],{"class":1381},[1241,21411,1777],{"class":1776},[1241,21413,1773],{"class":1381},[1241,21415,1783],{"class":1782},[1241,21417,1786],{"class":1381},[1241,21419,1752],{"class":1258},[1241,21421,21422],{"class":1262},"AZURE_POSTGRESQL_HOST",[1241,21424,1752],{"class":1258},[1241,21426,1801],{"class":1381},[1241,21428,21429,21431,21433,21435,21437,21439,21441,21443],{"class":1243,"line":1633},[1241,21430,1854],{"class":1258},[1241,21432,2004],{"class":1262},[1241,21434,1752],{"class":1258},[1241,21436,1397],{"class":1381},[1241,21438,1822],{"class":1258},[1241,21440,4946],{"class":1262},[1241,21442,1752],{"class":1258},[1241,21444,1407],{"class":1381},[1241,21446,21447,21449,21451,21453,21455],{"class":1243,"line":1639},[1241,21448,1854],{"class":1258},[1241,21450,2033],{"class":1262},[1241,21452,1752],{"class":1258},[1241,21454,1397],{"class":1381},[1241,21456,1566],{"class":1381},[1241,21458,21459,21461,21463,21465,21467,21469,21471,21473],{"class":1243,"line":1645},[1241,21460,1868],{"class":1258},[1241,21462,2048],{"class":1262},[1241,21464,1752],{"class":1258},[1241,21466,1397],{"class":1381},[1241,21468,1822],{"class":1258},[1241,21470,2057],{"class":1262},[1241,21472,1752],{"class":1258},[1241,21474,1407],{"class":1381},[1241,21476,21477],{"class":1243,"line":2028},[1241,21478,2680],{"class":1381},[1241,21480,21481],{"class":1243,"line":2042},[1241,21482,1636],{"class":1381},[1241,21484,21485],{"class":1243,"line":2064},[1241,21486,1648],{"class":1381},[1241,21488,21489],{"class":1243,"line":2070},[1241,21490,1303],{"emptyLinePlaceholder":1302},[1241,21492,21493],{"class":1243,"line":2075},[1241,21494,21495],{"class":1247},"# Azure Blob Storage for static and media files\n",[1241,21497,21498,21501,21503,21505,21507,21509,21511,21513,21515,21517,21520,21522],{"class":1243,"line":2080},[1241,21499,21500],{"class":1724},"AZURE_ACCOUNT_NAME",[1241,21502,1728],{"class":1381},[1241,21504,1833],{"class":1692},[1241,21506,1773],{"class":1381},[1241,21508,1777],{"class":1776},[1241,21510,1773],{"class":1381},[1241,21512,1783],{"class":1782},[1241,21514,1786],{"class":1381},[1241,21516,1752],{"class":1258},[1241,21518,21519],{"class":1262},"AZURE_STORAGE_ACCOUNT_NAME",[1241,21521,1752],{"class":1258},[1241,21523,2117],{"class":1381},[1241,21525,21526,21529,21531,21533,21535,21537,21539,21541,21543,21545,21548,21550],{"class":1243,"line":2085},[1241,21527,21528],{"class":1724},"AZURE_ACCOUNT_KEY",[1241,21530,1728],{"class":1381},[1241,21532,1833],{"class":1692},[1241,21534,1773],{"class":1381},[1241,21536,1777],{"class":1776},[1241,21538,1773],{"class":1381},[1241,21540,1783],{"class":1782},[1241,21542,1786],{"class":1381},[1241,21544,1752],{"class":1258},[1241,21546,21547],{"class":1262},"AZURE_STORAGE_ACCOUNT_KEY",[1241,21549,1752],{"class":1258},[1241,21551,2117],{"class":1381},[1241,21553,21554,21557,21559,21561,21563,21565,21567,21569,21571,21573,21576,21578,21580,21582,21584,21586],{"class":1243,"line":2091},[1241,21555,21556],{"class":1724},"AZURE_CONTAINER",[1241,21558,1728],{"class":1381},[1241,21560,1833],{"class":1692},[1241,21562,1773],{"class":1381},[1241,21564,1777],{"class":1776},[1241,21566,1773],{"class":1381},[1241,21568,1783],{"class":1782},[1241,21570,1786],{"class":1381},[1241,21572,1752],{"class":1258},[1241,21574,21575],{"class":1262},"AZURE_STORAGE_CONTAINER_NAME",[1241,21577,1752],{"class":1258},[1241,21579,1608],{"class":1381},[1241,21581,1822],{"class":1258},[1241,21583,9182],{"class":1262},[1241,21585,1752],{"class":1258},[1241,21587,2117],{"class":1381},[1241,21589,21590],{"class":1243,"line":2120},[1241,21591,1303],{"emptyLinePlaceholder":1302},[1241,21593,21594,21596,21599],{"class":1243,"line":2148},[1241,21595,1819],{"class":1688},[1241,21597,21598],{"class":1724}," AZURE_ACCOUNT_NAME",[1241,21600,1840],{"class":1381},[1241,21602,21603,21606,21608,21610,21613],{"class":1243,"line":2177},[1241,21604,21605],{"class":1724},"    STATICFILES_STORAGE",[1241,21607,1728],{"class":1381},[1241,21609,1822],{"class":1258},[1241,21611,21612],{"class":1262},"storages.backends.azure_storage.AzureStorage",[1241,21614,2264],{"class":1258},[1241,21616,21617,21620,21622,21624,21626],{"class":1243,"line":2214},[1241,21618,21619],{"class":1724},"    DEFAULT_FILE_STORAGE",[1241,21621,1728],{"class":1381},[1241,21623,1822],{"class":1258},[1241,21625,21612],{"class":1262},[1241,21627,2264],{"class":1258},[1241,21629,21630],{"class":1243,"line":2240},[1241,21631,8853],{"class":1692},[1241,21633,21634,21637,21639,21641,21643,21645,21647,21649],{"class":1243,"line":2245},[1241,21635,21636],{"class":1724},"    AZURE_CUSTOM_DOMAIN",[1241,21638,1728],{"class":1381},[1241,21640,2223],{"class":2222},[1241,21642,1752],{"class":1262},[1241,21644,2229],{"class":2228},[1241,21646,21500],{"class":1724},[1241,21648,2234],{"class":2228},[1241,21650,21651],{"class":1262},".blob.core.windows.net'\n",[1241,21653,21654,21656,21658,21660,21662,21664,21667,21669,21672,21674,21676,21678],{"class":1243,"line":2251},[1241,21655,9617],{"class":1724},[1241,21657,1728],{"class":1381},[1241,21659,2223],{"class":2222},[1241,21661,2277],{"class":1262},[1241,21663,2229],{"class":2228},[1241,21665,21666],{"class":1724},"AZURE_CUSTOM_DOMAIN",[1241,21668,2234],{"class":2228},[1241,21670,21671],{"class":1262},"/",[1241,21673,2229],{"class":2228},[1241,21675,21556],{"class":1724},[1241,21677,2234],{"class":2228},[1241,21679,2286],{"class":1262},[1241,21681,21682,21684,21686,21688,21690,21692,21694,21696,21698,21700,21702,21704],{"class":1243,"line":2267},[1241,21683,9636],{"class":1724},[1241,21685,1728],{"class":1381},[1241,21687,2223],{"class":2222},[1241,21689,2277],{"class":1262},[1241,21691,2229],{"class":2228},[1241,21693,21666],{"class":1724},[1241,21695,2234],{"class":2228},[1241,21697,21671],{"class":1262},[1241,21699,2229],{"class":2228},[1241,21701,21556],{"class":1724},[1241,21703,2234],{"class":2228},[1241,21705,2332],{"class":1262},[1241,21707,21708],{"class":1243,"line":2289},[1241,21709,1303],{"emptyLinePlaceholder":1302},[1241,21711,21712],{"class":1243,"line":2294},[1241,21713,21714],{"class":1247},"# Azure Cache for Redis\n",[1241,21716,21717,21719,21721],{"class":1243,"line":2300},[1241,21718,5058],{"class":1724},[1241,21720,1728],{"class":1381},[1241,21722,1566],{"class":1381},[1241,21724,21725,21727,21729,21731,21733],{"class":1243,"line":2314},[1241,21726,1746],{"class":1258},[1241,21728,1857],{"class":1262},[1241,21730,1752],{"class":1258},[1241,21732,1397],{"class":1381},[1241,21734,1566],{"class":1381},[1241,21736,21737,21739,21741,21743,21745,21747,21749,21751],{"class":1243,"line":2335},[1241,21738,1854],{"class":1258},[1241,21740,5081],{"class":1262},[1241,21742,1752],{"class":1258},[1241,21744,1397],{"class":1381},[1241,21746,1822],{"class":1258},[1241,21748,5090],{"class":1262},[1241,21750,1752],{"class":1258},[1241,21752,1407],{"class":1381},[1241,21754,21755,21757,21759,21761,21763,21765,21767,21769,21771,21773,21775,21777,21780,21782],{"class":1243,"line":2340},[1241,21756,1854],{"class":1258},[1241,21758,5101],{"class":1262},[1241,21760,1752],{"class":1258},[1241,21762,1397],{"class":1381},[1241,21764,1833],{"class":1692},[1241,21766,1773],{"class":1381},[1241,21768,1777],{"class":1776},[1241,21770,1773],{"class":1381},[1241,21772,1783],{"class":1782},[1241,21774,1786],{"class":1381},[1241,21776,1752],{"class":1258},[1241,21778,21779],{"class":1262},"AZURE_REDIS_URL",[1241,21781,1752],{"class":1258},[1241,21783,1801],{"class":1381},[1241,21785,21786,21788,21790,21792,21794],{"class":1243,"line":2346},[1241,21787,1854],{"class":1258},[1241,21789,2033],{"class":1262},[1241,21791,1752],{"class":1258},[1241,21793,1397],{"class":1381},[1241,21795,1566],{"class":1381},[1241,21797,21798,21800,21802,21804,21806,21808,21810,21812],{"class":1243,"line":2361},[1241,21799,1868],{"class":1258},[1241,21801,5141],{"class":1262},[1241,21803,1752],{"class":1258},[1241,21805,1397],{"class":1381},[1241,21807,1822],{"class":1258},[1241,21809,5150],{"class":1262},[1241,21811,1752],{"class":1258},[1241,21813,1407],{"class":1381},[1241,21815,21816,21818,21820,21822,21824],{"class":1243,"line":2371},[1241,21817,1868],{"class":1258},[1241,21819,5161],{"class":1262},[1241,21821,1752],{"class":1258},[1241,21823,1397],{"class":1381},[1241,21825,1566],{"class":1381},[1241,21827,21828,21830,21832,21834,21836,21838],{"class":1243,"line":2392},[1241,21829,2045],{"class":1258},[1241,21831,10054],{"class":1262},[1241,21833,1752],{"class":1258},[1241,21835,1397],{"class":1381},[1241,21837,10061],{"class":1731},[1241,21839,1407],{"class":1381},[1241,21841,21842],{"class":1243,"line":2397},[1241,21843,2067],{"class":1381},[1241,21845,21846],{"class":1243,"line":2407},[1241,21847,2680],{"class":1381},[1241,21849,21850],{"class":1243,"line":2417},[1241,21851,1636],{"class":1381},[1241,21853,21854],{"class":1243,"line":2422},[1241,21855,1648],{"class":1381},[1241,21857,21858],{"class":1243,"line":2428},[1241,21859,1303],{"emptyLinePlaceholder":1302},[1241,21861,21862],{"class":1243,"line":2439},[1241,21863,2425],{"class":1247},[1241,21865,21866,21868,21870],{"class":1243,"line":2468},[1241,21867,2431],{"class":1724},[1241,21869,1728],{"class":1381},[1241,21871,2436],{"class":1731},[1241,21873,21874,21876,21878,21880,21882,21884,21886,21888,21890,21892,21894],{"class":1243,"line":2480},[1241,21875,2442],{"class":1724},[1241,21877,1728],{"class":1381},[1241,21879,2447],{"class":1381},[1241,21881,1752],{"class":1258},[1241,21883,2452],{"class":1262},[1241,21885,1752],{"class":1258},[1241,21887,1608],{"class":1381},[1241,21889,1822],{"class":1258},[1241,21891,2461],{"class":1262},[1241,21893,1752],{"class":1258},[1241,21895,2117],{"class":1381},[1241,21897,21898,21900,21902],{"class":1243,"line":2490},[1241,21899,2471],{"class":1724},[1241,21901,1728],{"class":1381},[1241,21903,2477],{"class":2476},[1241,21905,21906,21908,21910],{"class":1243,"line":2500},[1241,21907,2483],{"class":1724},[1241,21909,1728],{"class":1381},[1241,21911,2436],{"class":1731},[1241,21913,21914,21916,21918],{"class":1243,"line":2505},[1241,21915,2493],{"class":1724},[1241,21917,1728],{"class":1381},[1241,21919,2436],{"class":1731},[1241,21921,21922],{"class":1243,"line":2511},[1241,21923,1303],{"emptyLinePlaceholder":1302},[1241,21925,21926],{"class":1243,"line":2521},[1241,21927,15194],{"class":1247},[1241,21929,21930,21932,21934,21936,21938],{"class":1243,"line":2531},[1241,21931,5215],{"class":1724},[1241,21933,1728],{"class":1381},[1241,21935,1822],{"class":1258},[1241,21937,5222],{"class":1262},[1241,21939,2264],{"class":1258},[1241,21941,21942,21944,21946,21948,21950],{"class":1243,"line":2536},[1241,21943,5229],{"class":1724},[1241,21945,1728],{"class":1381},[1241,21947,1822],{"class":1258},[1241,21949,1857],{"class":1262},[1241,21951,2264],{"class":1258},[1241,21953,21954],{"class":1243,"line":2542},[1241,21955,1303],{"emptyLinePlaceholder":1302},[1241,21957,21958],{"class":1243,"line":2552},[1241,21959,21960],{"class":1247},"# Logging to Azure Application Insights\n",[1241,21962,21963,21965,21967],{"class":1243,"line":2569},[1241,21964,2545],{"class":1724},[1241,21966,1728],{"class":1381},[1241,21968,1566],{"class":1381},[1241,21970,21971,21973,21975,21977,21979,21981],{"class":1243,"line":2586},[1241,21972,1746],{"class":1258},[1241,21974,2557],{"class":1262},[1241,21976,1752],{"class":1258},[1241,21978,1397],{"class":1381},[1241,21980,2564],{"class":2476},[1241,21982,1407],{"class":1381},[1241,21984,21985,21987,21989,21991,21993,21995],{"class":1243,"line":2600},[1241,21986,1746],{"class":1258},[1241,21988,2574],{"class":1262},[1241,21990,1752],{"class":1258},[1241,21992,1397],{"class":1381},[1241,21994,2581],{"class":1731},[1241,21996,1407],{"class":1381},[1241,21998,21999,22001,22003,22005,22007],{"class":1243,"line":2614},[1241,22000,1746],{"class":1258},[1241,22002,2591],{"class":1262},[1241,22004,1752],{"class":1258},[1241,22006,1397],{"class":1381},[1241,22008,1566],{"class":1381},[1241,22010,22011,22013,22016,22018,22020],{"class":1243,"line":2635},[1241,22012,1854],{"class":1258},[1241,22014,22015],{"class":1262},"azure",[1241,22017,1752],{"class":1258},[1241,22019,1397],{"class":1381},[1241,22021,1566],{"class":1381},[1241,22023,22024,22026,22028,22030,22032,22034,22036,22038],{"class":1243,"line":2656},[1241,22025,1868],{"class":1258},[1241,22027,2619],{"class":1262},[1241,22029,1752],{"class":1258},[1241,22031,1397],{"class":1381},[1241,22033,1822],{"class":1258},[1241,22035,2628],{"class":1262},[1241,22037,1752],{"class":1258},[1241,22039,1407],{"class":1381},[1241,22041,22042,22044,22046,22048,22050,22052,22055,22057],{"class":1243,"line":2677},[1241,22043,1868],{"class":1258},[1241,22045,2640],{"class":1262},[1241,22047,1752],{"class":1258},[1241,22049,1397],{"class":1381},[1241,22051,1822],{"class":1258},[1241,22053,22054],{"class":1262},"opencensus.ext.azure.log_exporter.AzureLogHandler",[1241,22056,1752],{"class":1258},[1241,22058,1407],{"class":1381},[1241,22060,22061,22063,22066,22068,22070,22072,22074,22076,22078,22080,22082,22084,22087,22089],{"class":1243,"line":2683},[1241,22062,1868],{"class":1258},[1241,22064,22065],{"class":1262},"connection_string",[1241,22067,1752],{"class":1258},[1241,22069,1397],{"class":1381},[1241,22071,1833],{"class":1692},[1241,22073,1773],{"class":1381},[1241,22075,1777],{"class":1776},[1241,22077,1773],{"class":1381},[1241,22079,1783],{"class":1782},[1241,22081,1786],{"class":1381},[1241,22083,1752],{"class":1258},[1241,22085,22086],{"class":1262},"APPLICATIONINSIGHTS_CONNECTION_STRING",[1241,22088,1752],{"class":1258},[1241,22090,1801],{"class":1381},[1241,22092,22093],{"class":1243,"line":2697},[1241,22094,2680],{"class":1381},[1241,22096,22097,22099,22101,22103,22105],{"class":1243,"line":2716},[1241,22098,1854],{"class":1258},[1241,22100,2688],{"class":1262},[1241,22102,1752],{"class":1258},[1241,22104,1397],{"class":1381},[1241,22106,1566],{"class":1381},[1241,22108,22109,22111,22113,22115,22117,22119,22121,22123],{"class":1243,"line":2736},[1241,22110,1868],{"class":1258},[1241,22112,2619],{"class":1262},[1241,22114,1752],{"class":1258},[1241,22116,1397],{"class":1381},[1241,22118,1822],{"class":1258},[1241,22120,2628],{"class":1262},[1241,22122,1752],{"class":1258},[1241,22124,1407],{"class":1381},[1241,22126,22127,22129,22131,22133,22135,22137,22139,22141],{"class":1243,"line":2741},[1241,22128,1868],{"class":1258},[1241,22130,2640],{"class":1262},[1241,22132,1752],{"class":1258},[1241,22134,1397],{"class":1381},[1241,22136,1822],{"class":1258},[1241,22138,2729],{"class":1262},[1241,22140,1752],{"class":1258},[1241,22142,1407],{"class":1381},[1241,22144,22145],{"class":1243,"line":2747},[1241,22146,2680],{"class":1381},[1241,22148,22149],{"class":1243,"line":2761},[1241,22150,2744],{"class":1381},[1241,22152,22153,22155,22157,22159,22161],{"class":1243,"line":2775},[1241,22154,1746],{"class":1258},[1241,22156,2752],{"class":1262},[1241,22158,1752],{"class":1258},[1241,22160,1397],{"class":1381},[1241,22162,1566],{"class":1381},[1241,22164,22165,22167,22169,22171,22173],{"class":1243,"line":2804},[1241,22166,1854],{"class":1258},[1241,22168,2766],{"class":1262},[1241,22170,1752],{"class":1258},[1241,22172,1397],{"class":1381},[1241,22174,1566],{"class":1381},[1241,22176,22177,22179,22181,22183,22185,22187,22189,22191,22193,22195,22197,22199,22201],{"class":1243,"line":2823},[1241,22178,1868],{"class":1258},[1241,22180,2591],{"class":1262},[1241,22182,1752],{"class":1258},[1241,22184,1397],{"class":1381},[1241,22186,1598],{"class":1381},[1241,22188,1752],{"class":1258},[1241,22190,22015],{"class":1262},[1241,22192,1752],{"class":1258},[1241,22194,1608],{"class":1381},[1241,22196,1822],{"class":1258},[1241,22198,2688],{"class":1262},[1241,22200,1752],{"class":1258},[1241,22202,1914],{"class":1381},[1241,22204,22205,22207,22209,22211,22213,22215,22217,22219],{"class":1243,"line":2840},[1241,22206,1868],{"class":1258},[1241,22208,2619],{"class":1262},[1241,22210,1752],{"class":1258},[1241,22212,1397],{"class":1381},[1241,22214,1822],{"class":1258},[1241,22216,2628],{"class":1262},[1241,22218,1752],{"class":1258},[1241,22220,1407],{"class":1381},[1241,22222,22223,22225,22227,22229,22231,22233],{"class":1243,"line":2845},[1241,22224,1868],{"class":1258},[1241,22226,2828],{"class":1262},[1241,22228,1752],{"class":1258},[1241,22230,1397],{"class":1381},[1241,22232,2835],{"class":1731},[1241,22234,1407],{"class":1381},[1241,22236,22237],{"class":1243,"line":2850},[1241,22238,2680],{"class":1381},[1241,22240,22241],{"class":1243,"line":3776},[1241,22242,2744],{"class":1381},[1241,22244,22245],{"class":1243,"line":3782},[1241,22246,1648],{"class":1381},[1026,22248,22249],{},[1042,22250,22251],{},"Azure DevOps Pipeline",[1128,22253,22255],{"className":3017,"code":22254,"language":3019,"meta":1137,"style":1137},"# azure-pipelines.yml\ntrigger:\n- main\n\nvariables:\n  azureServiceConnectionId: 'your-service-connection'\n  webAppName: 'django-app-unique-name'\n  environmentName: 'production'\n  projectRoot: $(System.DefaultWorkingDirectory)\n  pythonVersion: '3.11'\n\nstages:\n- stage: Build\n  displayName: Build stage\n  jobs:\n  - job: BuildJob\n    pool:\n      vmImage: 'ubuntu-latest'\n    steps:\n    - task: UsePythonVersion@0\n      inputs:\n        versionSpec: '$(pythonVersion)'\n      displayName: 'Use Python $(pythonVersion)'\n    \n    - script: |\n        python -m venv antenv\n        source antenv/bin/activate\n        python -m pip install --upgrade pip\n        pip install -r requirements.txt\n      workingDirectory: $(projectRoot)\n      displayName: \"Install requirements\"\n\n    - script: |\n        source antenv/bin/activate\n        python manage.py collectstatic --noinput\n      workingDirectory: $(projectRoot)\n      displayName: 'Collect static files'\n\n    - script: |\n        source antenv/bin/activate\n        python manage.py test\n      workingDirectory: $(projectRoot)\n      displayName: 'Run tests'\n\n    - task: ArchiveFiles@2\n      displayName: 'Archive files'\n      inputs:\n        rootFolderOrFile: '$(projectRoot)'\n        includeRootFolder: false\n        archiveType: zip\n        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip\n        replaceExistingArchive: true\n\n    - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip\n      displayName: 'Upload package'\n      artifact: drop\n\n- stage: Deploy\n  displayName: 'Deploy Web App'\n  dependsOn: Build\n  condition: succeeded()\n  jobs:\n  - deployment: DeploymentJob\n    pool:\n      vmImage: 'ubuntu-latest'\n    environment: $(environmentName)\n    strategy:\n      runOnce:\n        deploy:\n          steps:\n          - task: AzureWebApp@1\n            displayName: 'Deploy Azure Web App'\n            inputs:\n              azureSubscription: $(azureServiceConnectionId)\n              appType: 'webAppLinux'\n              appName: $(webAppName)\n              package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip\n              startUpCommand: 'gunicorn --bind 0.0.0.0:8000 --timeout 600 myproject.wsgi:application'\n              \n          - task: AzureCLI@2\n            displayName: 'Run Django migrations'\n            inputs:\n              azureSubscription: $(azureServiceConnectionId)\n              scriptType: 'bash'\n              scriptLocation: 'inlineScript'\n              inlineScript: |\n                az webapp ssh --resource-group django-app-rg --name $(webAppName) --command \"cd /home/site/wwwroot && python manage.py migrate\"\n",[1135,22256,22257,22262,22269,22276,22280,22287,22301,22315,22328,22338,22352,22356,22363,22375,22385,22392,22404,22411,22425,22432,22444,22451,22465,22479,22483,22494,22499,22504,22509,22514,22524,22537,22541,22551,22555,22560,22568,22581,22585,22595,22599,22604,22612,22625,22629,22640,22653,22659,22673,22682,22692,22702,22711,22715,22726,22739,22749,22753,22764,22777,22786,22796,22802,22814,22820,22832,22841,22848,22855,22862,22869,22880,22894,22901,22911,22925,22935,22945,22959,22964,22975,22988,22994,23002,23015,23029,23038],{"__ignoreMap":1137},[1241,22258,22259],{"class":1243,"line":1244},[1241,22260,22261],{"class":1247},"# azure-pipelines.yml\n",[1241,22263,22264,22267],{"class":1243,"line":1251},[1241,22265,22266],{"class":1590},"trigger",[1241,22268,1840],{"class":1381},[1241,22270,22271,22273],{"class":1243,"line":1281},[1241,22272,13932],{"class":1381},[1241,22274,22275],{"class":1262}," main\n",[1241,22277,22278],{"class":1243,"line":1290},[1241,22279,1303],{"emptyLinePlaceholder":1302},[1241,22281,22282,22285],{"class":1243,"line":1299},[1241,22283,22284],{"class":1590},"variables",[1241,22286,1840],{"class":1381},[1241,22288,22289,22292,22294,22296,22299],{"class":1243,"line":1306},[1241,22290,22291],{"class":1590},"  azureServiceConnectionId",[1241,22293,1397],{"class":1381},[1241,22295,1822],{"class":1258},[1241,22297,22298],{"class":1262},"your-service-connection",[1241,22300,2264],{"class":1258},[1241,22302,22303,22306,22308,22310,22313],{"class":1243,"line":1312},[1241,22304,22305],{"class":1590},"  webAppName",[1241,22307,1397],{"class":1381},[1241,22309,1822],{"class":1258},[1241,22311,22312],{"class":1262},"django-app-unique-name",[1241,22314,2264],{"class":1258},[1241,22316,22317,22320,22322,22324,22326],{"class":1243,"line":1321},[1241,22318,22319],{"class":1590},"  environmentName",[1241,22321,1397],{"class":1381},[1241,22323,1822],{"class":1258},[1241,22325,4296],{"class":1262},[1241,22327,2264],{"class":1258},[1241,22329,22330,22333,22335],{"class":1243,"line":1327},[1241,22331,22332],{"class":1590},"  projectRoot",[1241,22334,1397],{"class":1381},[1241,22336,22337],{"class":1262}," $(System.DefaultWorkingDirectory)\n",[1241,22339,22340,22343,22345,22347,22350],{"class":1243,"line":1333},[1241,22341,22342],{"class":1590},"  pythonVersion",[1241,22344,1397],{"class":1381},[1241,22346,1822],{"class":1258},[1241,22348,22349],{"class":1262},"3.11",[1241,22351,2264],{"class":1258},[1241,22353,22354],{"class":1243,"line":1339},[1241,22355,1303],{"emptyLinePlaceholder":1302},[1241,22357,22358,22361],{"class":1243,"line":1345},[1241,22359,22360],{"class":1590},"stages",[1241,22362,1840],{"class":1381},[1241,22364,22365,22367,22370,22372],{"class":1243,"line":1350},[1241,22366,13932],{"class":1381},[1241,22368,22369],{"class":1590}," stage",[1241,22371,1397],{"class":1381},[1241,22373,22374],{"class":1262}," Build\n",[1241,22376,22377,22380,22382],{"class":1243,"line":1356},[1241,22378,22379],{"class":1590},"  displayName",[1241,22381,1397],{"class":1381},[1241,22383,22384],{"class":1262}," Build stage\n",[1241,22386,22387,22390],{"class":1243,"line":1554},[1241,22388,22389],{"class":1590},"  jobs",[1241,22391,1840],{"class":1381},[1241,22393,22394,22396,22399,22401],{"class":1243,"line":1569},[1241,22395,16374],{"class":1381},[1241,22397,22398],{"class":1590}," job",[1241,22400,1397],{"class":1381},[1241,22402,22403],{"class":1262}," BuildJob\n",[1241,22405,22406,22409],{"class":1243,"line":1584},[1241,22407,22408],{"class":1590},"    pool",[1241,22410,1840],{"class":1381},[1241,22412,22413,22416,22418,22420,22423],{"class":1243,"line":1621},[1241,22414,22415],{"class":1590},"      vmImage",[1241,22417,1397],{"class":1381},[1241,22419,1822],{"class":1258},[1241,22421,22422],{"class":1262},"ubuntu-latest",[1241,22424,2264],{"class":1258},[1241,22426,22427,22430],{"class":1243,"line":1627},[1241,22428,22429],{"class":1590},"    steps",[1241,22431,1840],{"class":1381},[1241,22433,22434,22436,22439,22441],{"class":1243,"line":1633},[1241,22435,16523],{"class":1381},[1241,22437,22438],{"class":1590}," task",[1241,22440,1397],{"class":1381},[1241,22442,22443],{"class":1262}," UsePythonVersion@0\n",[1241,22445,22446,22449],{"class":1243,"line":1639},[1241,22447,22448],{"class":1590},"      inputs",[1241,22450,1840],{"class":1381},[1241,22452,22453,22456,22458,22460,22463],{"class":1243,"line":1645},[1241,22454,22455],{"class":1590},"        versionSpec",[1241,22457,1397],{"class":1381},[1241,22459,1822],{"class":1258},[1241,22461,22462],{"class":1262},"$(pythonVersion)",[1241,22464,2264],{"class":1258},[1241,22466,22467,22470,22472,22474,22477],{"class":1243,"line":2028},[1241,22468,22469],{"class":1590},"      displayName",[1241,22471,1397],{"class":1381},[1241,22473,1822],{"class":1258},[1241,22475,22476],{"class":1262},"Use Python $(pythonVersion)",[1241,22478,2264],{"class":1258},[1241,22480,22481],{"class":1243,"line":2042},[1241,22482,8853],{"class":1692},[1241,22484,22485,22487,22490,22492],{"class":1243,"line":2064},[1241,22486,16523],{"class":1381},[1241,22488,22489],{"class":1590}," script",[1241,22491,1397],{"class":1381},[1241,22493,12632],{"class":1688},[1241,22495,22496],{"class":1243,"line":2070},[1241,22497,22498],{"class":1262},"        python -m venv antenv\n",[1241,22500,22501],{"class":1243,"line":2075},[1241,22502,22503],{"class":1262},"        source antenv/bin/activate\n",[1241,22505,22506],{"class":1243,"line":2080},[1241,22507,22508],{"class":1262},"        python -m pip install --upgrade pip\n",[1241,22510,22511],{"class":1243,"line":2085},[1241,22512,22513],{"class":1262},"        pip install -r requirements.txt\n",[1241,22515,22516,22519,22521],{"class":1243,"line":2091},[1241,22517,22518],{"class":1590},"      workingDirectory",[1241,22520,1397],{"class":1381},[1241,22522,22523],{"class":1262}," $(projectRoot)\n",[1241,22525,22526,22528,22530,22532,22535],{"class":1243,"line":2120},[1241,22527,22469],{"class":1590},[1241,22529,1397],{"class":1381},[1241,22531,1259],{"class":1258},[1241,22533,22534],{"class":1262},"Install requirements",[1241,22536,1278],{"class":1258},[1241,22538,22539],{"class":1243,"line":2148},[1241,22540,1303],{"emptyLinePlaceholder":1302},[1241,22542,22543,22545,22547,22549],{"class":1243,"line":2177},[1241,22544,16523],{"class":1381},[1241,22546,22489],{"class":1590},[1241,22548,1397],{"class":1381},[1241,22550,12632],{"class":1688},[1241,22552,22553],{"class":1243,"line":2214},[1241,22554,22503],{"class":1262},[1241,22556,22557],{"class":1243,"line":2240},[1241,22558,22559],{"class":1262},"        python manage.py collectstatic --noinput\n",[1241,22561,22562,22564,22566],{"class":1243,"line":2245},[1241,22563,22518],{"class":1590},[1241,22565,1397],{"class":1381},[1241,22567,22523],{"class":1262},[1241,22569,22570,22572,22574,22576,22579],{"class":1243,"line":2251},[1241,22571,22469],{"class":1590},[1241,22573,1397],{"class":1381},[1241,22575,1822],{"class":1258},[1241,22577,22578],{"class":1262},"Collect static files",[1241,22580,2264],{"class":1258},[1241,22582,22583],{"class":1243,"line":2267},[1241,22584,1303],{"emptyLinePlaceholder":1302},[1241,22586,22587,22589,22591,22593],{"class":1243,"line":2289},[1241,22588,16523],{"class":1381},[1241,22590,22489],{"class":1590},[1241,22592,1397],{"class":1381},[1241,22594,12632],{"class":1688},[1241,22596,22597],{"class":1243,"line":2294},[1241,22598,22503],{"class":1262},[1241,22600,22601],{"class":1243,"line":2300},[1241,22602,22603],{"class":1262},"        python manage.py test\n",[1241,22605,22606,22608,22610],{"class":1243,"line":2314},[1241,22607,22518],{"class":1590},[1241,22609,1397],{"class":1381},[1241,22611,22523],{"class":1262},[1241,22613,22614,22616,22618,22620,22623],{"class":1243,"line":2335},[1241,22615,22469],{"class":1590},[1241,22617,1397],{"class":1381},[1241,22619,1822],{"class":1258},[1241,22621,22622],{"class":1262},"Run tests",[1241,22624,2264],{"class":1258},[1241,22626,22627],{"class":1243,"line":2340},[1241,22628,1303],{"emptyLinePlaceholder":1302},[1241,22630,22631,22633,22635,22637],{"class":1243,"line":2346},[1241,22632,16523],{"class":1381},[1241,22634,22438],{"class":1590},[1241,22636,1397],{"class":1381},[1241,22638,22639],{"class":1262}," ArchiveFiles@2\n",[1241,22641,22642,22644,22646,22648,22651],{"class":1243,"line":2361},[1241,22643,22469],{"class":1590},[1241,22645,1397],{"class":1381},[1241,22647,1822],{"class":1258},[1241,22649,22650],{"class":1262},"Archive files",[1241,22652,2264],{"class":1258},[1241,22654,22655,22657],{"class":1243,"line":2371},[1241,22656,22448],{"class":1590},[1241,22658,1840],{"class":1381},[1241,22660,22661,22664,22666,22668,22671],{"class":1243,"line":2392},[1241,22662,22663],{"class":1590},"        rootFolderOrFile",[1241,22665,1397],{"class":1381},[1241,22667,1822],{"class":1258},[1241,22669,22670],{"class":1262},"$(projectRoot)",[1241,22672,2264],{"class":1258},[1241,22674,22675,22678,22680],{"class":1243,"line":2397},[1241,22676,22677],{"class":1590},"        includeRootFolder",[1241,22679,1397],{"class":1381},[1241,22681,3640],{"class":3227},[1241,22683,22684,22687,22689],{"class":1243,"line":2407},[1241,22685,22686],{"class":1590},"        archiveType",[1241,22688,1397],{"class":1381},[1241,22690,22691],{"class":1262}," zip\n",[1241,22693,22694,22697,22699],{"class":1243,"line":2417},[1241,22695,22696],{"class":1590},"        archiveFile",[1241,22698,1397],{"class":1381},[1241,22700,22701],{"class":1262}," $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip\n",[1241,22703,22704,22707,22709],{"class":1243,"line":2422},[1241,22705,22706],{"class":1590},"        replaceExistingArchive",[1241,22708,1397],{"class":1381},[1241,22710,3228],{"class":3227},[1241,22712,22713],{"class":1243,"line":2428},[1241,22714,1303],{"emptyLinePlaceholder":1302},[1241,22716,22717,22719,22722,22724],{"class":1243,"line":2439},[1241,22718,16523],{"class":1381},[1241,22720,22721],{"class":1590}," upload",[1241,22723,1397],{"class":1381},[1241,22725,22701],{"class":1262},[1241,22727,22728,22730,22732,22734,22737],{"class":1243,"line":2468},[1241,22729,22469],{"class":1590},[1241,22731,1397],{"class":1381},[1241,22733,1822],{"class":1258},[1241,22735,22736],{"class":1262},"Upload package",[1241,22738,2264],{"class":1258},[1241,22740,22741,22744,22746],{"class":1243,"line":2480},[1241,22742,22743],{"class":1590},"      artifact",[1241,22745,1397],{"class":1381},[1241,22747,22748],{"class":1262}," drop\n",[1241,22750,22751],{"class":1243,"line":2490},[1241,22752,1303],{"emptyLinePlaceholder":1302},[1241,22754,22755,22757,22759,22761],{"class":1243,"line":2500},[1241,22756,13932],{"class":1381},[1241,22758,22369],{"class":1590},[1241,22760,1397],{"class":1381},[1241,22762,22763],{"class":1262}," Deploy\n",[1241,22765,22766,22768,22770,22772,22775],{"class":1243,"line":2505},[1241,22767,22379],{"class":1590},[1241,22769,1397],{"class":1381},[1241,22771,1822],{"class":1258},[1241,22773,22774],{"class":1262},"Deploy Web App",[1241,22776,2264],{"class":1258},[1241,22778,22779,22782,22784],{"class":1243,"line":2511},[1241,22780,22781],{"class":1590},"  dependsOn",[1241,22783,1397],{"class":1381},[1241,22785,22374],{"class":1262},[1241,22787,22788,22791,22793],{"class":1243,"line":2521},[1241,22789,22790],{"class":1590},"  condition",[1241,22792,1397],{"class":1381},[1241,22794,22795],{"class":1262}," succeeded()\n",[1241,22797,22798,22800],{"class":1243,"line":2531},[1241,22799,22389],{"class":1590},[1241,22801,1840],{"class":1381},[1241,22803,22804,22806,22809,22811],{"class":1243,"line":2536},[1241,22805,16374],{"class":1381},[1241,22807,22808],{"class":1590}," deployment",[1241,22810,1397],{"class":1381},[1241,22812,22813],{"class":1262}," DeploymentJob\n",[1241,22815,22816,22818],{"class":1243,"line":2542},[1241,22817,22408],{"class":1590},[1241,22819,1840],{"class":1381},[1241,22821,22822,22824,22826,22828,22830],{"class":1243,"line":2552},[1241,22823,22415],{"class":1590},[1241,22825,1397],{"class":1381},[1241,22827,1822],{"class":1258},[1241,22829,22422],{"class":1262},[1241,22831,2264],{"class":1258},[1241,22833,22834,22836,22838],{"class":1243,"line":2569},[1241,22835,4121],{"class":1590},[1241,22837,1397],{"class":1381},[1241,22839,22840],{"class":1262}," $(environmentName)\n",[1241,22842,22843,22846],{"class":1243,"line":2586},[1241,22844,22845],{"class":1590},"    strategy",[1241,22847,1840],{"class":1381},[1241,22849,22850,22853],{"class":1243,"line":2600},[1241,22851,22852],{"class":1590},"      runOnce",[1241,22854,1840],{"class":1381},[1241,22856,22857,22860],{"class":1243,"line":2614},[1241,22858,22859],{"class":1590},"        deploy",[1241,22861,1840],{"class":1381},[1241,22863,22864,22867],{"class":1243,"line":2635},[1241,22865,22866],{"class":1590},"          steps",[1241,22868,1840],{"class":1381},[1241,22870,22871,22873,22875,22877],{"class":1243,"line":2656},[1241,22872,12585],{"class":1381},[1241,22874,22438],{"class":1590},[1241,22876,1397],{"class":1381},[1241,22878,22879],{"class":1262}," AzureWebApp@1\n",[1241,22881,22882,22885,22887,22889,22892],{"class":1243,"line":2677},[1241,22883,22884],{"class":1590},"            displayName",[1241,22886,1397],{"class":1381},[1241,22888,1822],{"class":1258},[1241,22890,22891],{"class":1262},"Deploy Azure Web App",[1241,22893,2264],{"class":1258},[1241,22895,22896,22899],{"class":1243,"line":2683},[1241,22897,22898],{"class":1590},"            inputs",[1241,22900,1840],{"class":1381},[1241,22902,22903,22906,22908],{"class":1243,"line":2697},[1241,22904,22905],{"class":1590},"              azureSubscription",[1241,22907,1397],{"class":1381},[1241,22909,22910],{"class":1262}," $(azureServiceConnectionId)\n",[1241,22912,22913,22916,22918,22920,22923],{"class":1243,"line":2716},[1241,22914,22915],{"class":1590},"              appType",[1241,22917,1397],{"class":1381},[1241,22919,1822],{"class":1258},[1241,22921,22922],{"class":1262},"webAppLinux",[1241,22924,2264],{"class":1258},[1241,22926,22927,22930,22932],{"class":1243,"line":2736},[1241,22928,22929],{"class":1590},"              appName",[1241,22931,1397],{"class":1381},[1241,22933,22934],{"class":1262}," $(webAppName)\n",[1241,22936,22937,22940,22942],{"class":1243,"line":2741},[1241,22938,22939],{"class":1590},"              package",[1241,22941,1397],{"class":1381},[1241,22943,22944],{"class":1262}," $(Pipeline.Workspace)/drop/$(Build.BuildId).zip\n",[1241,22946,22947,22950,22952,22954,22957],{"class":1243,"line":2747},[1241,22948,22949],{"class":1590},"              startUpCommand",[1241,22951,1397],{"class":1381},[1241,22953,1822],{"class":1258},[1241,22955,22956],{"class":1262},"gunicorn --bind 0.0.0.0:8000 --timeout 600 myproject.wsgi:application",[1241,22958,2264],{"class":1258},[1241,22960,22961],{"class":1243,"line":2761},[1241,22962,22963],{"class":1692},"              \n",[1241,22965,22966,22968,22970,22972],{"class":1243,"line":2775},[1241,22967,12585],{"class":1381},[1241,22969,22438],{"class":1590},[1241,22971,1397],{"class":1381},[1241,22973,22974],{"class":1262}," AzureCLI@2\n",[1241,22976,22977,22979,22981,22983,22986],{"class":1243,"line":2804},[1241,22978,22884],{"class":1590},[1241,22980,1397],{"class":1381},[1241,22982,1822],{"class":1258},[1241,22984,22985],{"class":1262},"Run Django migrations",[1241,22987,2264],{"class":1258},[1241,22989,22990,22992],{"class":1243,"line":2823},[1241,22991,22898],{"class":1590},[1241,22993,1840],{"class":1381},[1241,22995,22996,22998,23000],{"class":1243,"line":2840},[1241,22997,22905],{"class":1590},[1241,22999,1397],{"class":1381},[1241,23001,22910],{"class":1262},[1241,23003,23004,23007,23009,23011,23013],{"class":1243,"line":2845},[1241,23005,23006],{"class":1590},"              scriptType",[1241,23008,1397],{"class":1381},[1241,23010,1822],{"class":1258},[1241,23012,1237],{"class":1262},[1241,23014,2264],{"class":1258},[1241,23016,23017,23020,23022,23024,23027],{"class":1243,"line":2850},[1241,23018,23019],{"class":1590},"              scriptLocation",[1241,23021,1397],{"class":1381},[1241,23023,1822],{"class":1258},[1241,23025,23026],{"class":1262},"inlineScript",[1241,23028,2264],{"class":1258},[1241,23030,23031,23034,23036],{"class":1243,"line":3776},[1241,23032,23033],{"class":1590},"              inlineScript",[1241,23035,1397],{"class":1381},[1241,23037,12632],{"class":1688},[1241,23039,23040],{"class":1243,"line":3782},[1241,23041,23042],{"class":1262},"                az webapp ssh --resource-group django-app-rg --name $(webAppName) --command \"cd /home/site/wwwroot && python manage.py migrate\"\n",[1035,23044,23046],{"id":23045},"azure-database-for-postgresql","Azure Database for PostgreSQL",[1026,23048,23049],{},[1042,23050,23051],{},"Create PostgreSQL Database",[1128,23053,23055],{"className":1235,"code":23054,"language":1237,"meta":1137,"style":1137},"# Create PostgreSQL server\naz postgres server create \\\n    --resource-group django-app-rg \\\n    --name django-postgres-server \\\n    --location eastus \\\n    --admin-user djangoadmin \\\n    --admin-password SecurePassword123! \\\n    --sku-name GP_Gen5_2 \\\n    --version 13\n\n# Create database\naz postgres db create \\\n    --resource-group django-app-rg \\\n    --server-name django-postgres-server \\\n    --name django_app\n\n# Configure firewall rule for Azure services\naz postgres server firewall-rule create \\\n    --resource-group django-app-rg \\\n    --server django-postgres-server \\\n    --name AllowAzureServices \\\n    --start-ip-address 0.0.0.0 \\\n    --end-ip-address 0.0.0.0\n\n# Get connection string\naz postgres server show-connection-string \\\n    --server-name django-postgres-server \\\n    --database-name django_app \\\n    --admin-user djangoadmin \\\n    --admin-password SecurePassword123!\n",[1135,23056,23057,23062,23075,23083,23092,23102,23112,23121,23131,23139,23143,23147,23160,23168,23177,23184,23188,23193,23208,23216,23225,23234,23244,23252,23256,23261,23274,23282,23291,23299],{"__ignoreMap":1137},[1241,23058,23059],{"class":1243,"line":1244},[1241,23060,23061],{"class":1247},"# Create PostgreSQL server\n",[1241,23063,23064,23066,23068,23071,23073],{"class":1243,"line":1251},[1241,23065,20803],{"class":1254},[1241,23067,3976],{"class":1262},[1241,23069,23070],{"class":1262}," server",[1241,23072,3967],{"class":1262},[1241,23074,7890],{"class":1724},[1241,23076,23077,23079,23081],{"class":1243,"line":1281},[1241,23078,20939],{"class":1269},[1241,23080,20858],{"class":1262},[1241,23082,7890],{"class":1724},[1241,23084,23085,23087,23090],{"class":1243,"line":1290},[1241,23086,20929],{"class":1269},[1241,23088,23089],{"class":1262}," django-postgres-server",[1241,23091,7890],{"class":1724},[1241,23093,23094,23097,23100],{"class":1243,"line":1299},[1241,23095,23096],{"class":1269},"    --location",[1241,23098,23099],{"class":1262}," eastus",[1241,23101,7890],{"class":1724},[1241,23103,23104,23107,23110],{"class":1243,"line":1306},[1241,23105,23106],{"class":1269},"    --admin-user",[1241,23108,23109],{"class":1262}," djangoadmin",[1241,23111,7890],{"class":1724},[1241,23113,23114,23117,23119],{"class":1243,"line":1312},[1241,23115,23116],{"class":1269},"    --admin-password",[1241,23118,8125],{"class":1262},[1241,23120,7890],{"class":1724},[1241,23122,23123,23126,23129],{"class":1243,"line":1321},[1241,23124,23125],{"class":1269},"    --sku-name",[1241,23127,23128],{"class":1262}," GP_Gen5_2",[1241,23130,7890],{"class":1724},[1241,23132,23133,23136],{"class":1243,"line":1327},[1241,23134,23135],{"class":1269},"    --version",[1241,23137,23138],{"class":2476}," 13\n",[1241,23140,23141],{"class":1243,"line":1333},[1241,23142,1303],{"emptyLinePlaceholder":1302},[1241,23144,23145],{"class":1243,"line":1339},[1241,23146,15853],{"class":1247},[1241,23148,23149,23151,23153,23156,23158],{"class":1243,"line":1345},[1241,23150,20803],{"class":1254},[1241,23152,3976],{"class":1262},[1241,23154,23155],{"class":1262}," db",[1241,23157,3967],{"class":1262},[1241,23159,7890],{"class":1724},[1241,23161,23162,23164,23166],{"class":1243,"line":1350},[1241,23163,20939],{"class":1269},[1241,23165,20858],{"class":1262},[1241,23167,7890],{"class":1724},[1241,23169,23170,23173,23175],{"class":1243,"line":1356},[1241,23171,23172],{"class":1269},"    --server-name",[1241,23174,23089],{"class":1262},[1241,23176,7890],{"class":1724},[1241,23178,23179,23181],{"class":1243,"line":1554},[1241,23180,20929],{"class":1269},[1241,23182,23183],{"class":1262}," django_app\n",[1241,23185,23186],{"class":1243,"line":1569},[1241,23187,1303],{"emptyLinePlaceholder":1302},[1241,23189,23190],{"class":1243,"line":1584},[1241,23191,23192],{"class":1247},"# Configure firewall rule for Azure services\n",[1241,23194,23195,23197,23199,23201,23204,23206],{"class":1243,"line":1621},[1241,23196,20803],{"class":1254},[1241,23198,3976],{"class":1262},[1241,23200,23070],{"class":1262},[1241,23202,23203],{"class":1262}," firewall-rule",[1241,23205,3967],{"class":1262},[1241,23207,7890],{"class":1724},[1241,23209,23210,23212,23214],{"class":1243,"line":1627},[1241,23211,20939],{"class":1269},[1241,23213,20858],{"class":1262},[1241,23215,7890],{"class":1724},[1241,23217,23218,23221,23223],{"class":1243,"line":1633},[1241,23219,23220],{"class":1269},"    --server",[1241,23222,23089],{"class":1262},[1241,23224,7890],{"class":1724},[1241,23226,23227,23229,23232],{"class":1243,"line":1639},[1241,23228,20929],{"class":1269},[1241,23230,23231],{"class":1262}," AllowAzureServices",[1241,23233,7890],{"class":1724},[1241,23235,23236,23239,23242],{"class":1243,"line":1645},[1241,23237,23238],{"class":1269},"    --start-ip-address",[1241,23240,23241],{"class":2476}," 0.0.0.0",[1241,23243,7890],{"class":1724},[1241,23245,23246,23249],{"class":1243,"line":2028},[1241,23247,23248],{"class":1269},"    --end-ip-address",[1241,23250,23251],{"class":2476}," 0.0.0.0\n",[1241,23253,23254],{"class":1243,"line":2042},[1241,23255,1303],{"emptyLinePlaceholder":1302},[1241,23257,23258],{"class":1243,"line":2064},[1241,23259,23260],{"class":1247},"# Get connection string\n",[1241,23262,23263,23265,23267,23269,23272],{"class":1243,"line":2070},[1241,23264,20803],{"class":1254},[1241,23266,3976],{"class":1262},[1241,23268,23070],{"class":1262},[1241,23270,23271],{"class":1262}," show-connection-string",[1241,23273,7890],{"class":1724},[1241,23275,23276,23278,23280],{"class":1243,"line":2075},[1241,23277,23172],{"class":1269},[1241,23279,23089],{"class":1262},[1241,23281,7890],{"class":1724},[1241,23283,23284,23287,23289],{"class":1243,"line":2080},[1241,23285,23286],{"class":1269},"    --database-name",[1241,23288,15867],{"class":1262},[1241,23290,7890],{"class":1724},[1241,23292,23293,23295,23297],{"class":1243,"line":2085},[1241,23294,23106],{"class":1269},[1241,23296,23109],{"class":1262},[1241,23298,7890],{"class":1724},[1241,23300,23301,23303],{"class":1243,"line":2091},[1241,23302,23116],{"class":1269},[1241,23304,23305],{"class":1262}," SecurePassword123!\n",[1035,23307,23309],{"id":23308},"azure-blob-storage","Azure Blob Storage",[1026,23311,23312],{},[1042,23313,23314],{},"Create Storage Account",[1128,23316,23318],{"className":1235,"code":23317,"language":1237,"meta":1137,"style":1137},"# Create storage account\naz storage account create \\\n    --name djangoappstorageaccount \\\n    --resource-group django-app-rg \\\n    --location eastus \\\n    --sku Standard_LRS\n\n# Create container for static files\naz storage container create \\\n    --name static \\\n    --account-name djangoappstorageaccount \\\n    --public-access blob\n\n# Get storage account key\naz storage account keys list \\\n    --resource-group django-app-rg \\\n    --account-name djangoappstorageaccount\n",[1135,23319,23320,23325,23338,23347,23355,23363,23370,23374,23379,23392,23401,23410,23418,23422,23427,23442,23450],{"__ignoreMap":1137},[1241,23321,23322],{"class":1243,"line":1244},[1241,23323,23324],{"class":1247},"# Create storage account\n",[1241,23326,23327,23329,23332,23334,23336],{"class":1243,"line":1251},[1241,23328,20803],{"class":1254},[1241,23330,23331],{"class":1262}," storage",[1241,23333,20822],{"class":1262},[1241,23335,3967],{"class":1262},[1241,23337,7890],{"class":1724},[1241,23339,23340,23342,23345],{"class":1243,"line":1281},[1241,23341,20929],{"class":1269},[1241,23343,23344],{"class":1262}," djangoappstorageaccount",[1241,23346,7890],{"class":1724},[1241,23348,23349,23351,23353],{"class":1243,"line":1290},[1241,23350,20939],{"class":1269},[1241,23352,20858],{"class":1262},[1241,23354,7890],{"class":1724},[1241,23356,23357,23359,23361],{"class":1243,"line":1299},[1241,23358,23096],{"class":1269},[1241,23360,23099],{"class":1262},[1241,23362,7890],{"class":1724},[1241,23364,23365,23367],{"class":1243,"line":1306},[1241,23366,20948],{"class":1269},[1241,23368,23369],{"class":1262}," Standard_LRS\n",[1241,23371,23372],{"class":1243,"line":1312},[1241,23373,1303],{"emptyLinePlaceholder":1302},[1241,23375,23376],{"class":1243,"line":1321},[1241,23377,23378],{"class":1247},"# Create container for static files\n",[1241,23380,23381,23383,23385,23388,23390],{"class":1243,"line":1327},[1241,23382,20803],{"class":1254},[1241,23384,23331],{"class":1262},[1241,23386,23387],{"class":1262}," container",[1241,23389,3967],{"class":1262},[1241,23391,7890],{"class":1724},[1241,23393,23394,23396,23399],{"class":1243,"line":1333},[1241,23395,20929],{"class":1269},[1241,23397,23398],{"class":1262}," static",[1241,23400,7890],{"class":1724},[1241,23402,23403,23406,23408],{"class":1243,"line":1339},[1241,23404,23405],{"class":1269},"    --account-name",[1241,23407,23344],{"class":1262},[1241,23409,7890],{"class":1724},[1241,23411,23412,23415],{"class":1243,"line":1345},[1241,23413,23414],{"class":1269},"    --public-access",[1241,23416,23417],{"class":1262}," blob\n",[1241,23419,23420],{"class":1243,"line":1350},[1241,23421,1303],{"emptyLinePlaceholder":1302},[1241,23423,23424],{"class":1243,"line":1356},[1241,23425,23426],{"class":1247},"# Get storage account key\n",[1241,23428,23429,23431,23433,23435,23437,23440],{"class":1243,"line":1554},[1241,23430,20803],{"class":1254},[1241,23432,23331],{"class":1262},[1241,23434,20822],{"class":1262},[1241,23436,13686],{"class":1262},[1241,23438,23439],{"class":1262}," list",[1241,23441,7890],{"class":1724},[1241,23443,23444,23446,23448],{"class":1243,"line":1569},[1241,23445,20939],{"class":1269},[1241,23447,20858],{"class":1262},[1241,23449,7890],{"class":1724},[1241,23451,23452,23454],{"class":1243,"line":1584},[1241,23453,23405],{"class":1269},[1241,23455,23456],{"class":1262}," djangoappstorageaccount\n",[1035,23458,23460],{"id":23459},"azure-cache-for-redis","Azure Cache for Redis",[1026,23462,23463],{},[1042,23464,23465],{},"Create Redis Cache",[1128,23467,23469],{"className":1235,"code":23468,"language":1237,"meta":1137,"style":1137},"# Create Redis cache\naz redis create \\\n    --location eastus \\\n    --name django-redis-cache \\\n    --resource-group django-app-rg \\\n    --sku Basic \\\n    --vm-size c0\n\n# Get Redis connection string\naz redis list-keys \\\n    --resource-group django-app-rg \\\n    --name django-redis-cache\n",[1135,23470,23471,23476,23486,23494,23503,23511,23520,23528,23532,23537,23548,23556],{"__ignoreMap":1137},[1241,23472,23473],{"class":1243,"line":1244},[1241,23474,23475],{"class":1247},"# Create Redis cache\n",[1241,23477,23478,23480,23482,23484],{"class":1243,"line":1251},[1241,23479,20803],{"class":1254},[1241,23481,9784],{"class":1262},[1241,23483,3967],{"class":1262},[1241,23485,7890],{"class":1724},[1241,23487,23488,23490,23492],{"class":1243,"line":1281},[1241,23489,23096],{"class":1269},[1241,23491,23099],{"class":1262},[1241,23493,7890],{"class":1724},[1241,23495,23496,23498,23501],{"class":1243,"line":1290},[1241,23497,20929],{"class":1269},[1241,23499,23500],{"class":1262}," django-redis-cache",[1241,23502,7890],{"class":1724},[1241,23504,23505,23507,23509],{"class":1243,"line":1299},[1241,23506,20939],{"class":1269},[1241,23508,20858],{"class":1262},[1241,23510,7890],{"class":1724},[1241,23512,23513,23515,23518],{"class":1243,"line":1306},[1241,23514,20948],{"class":1269},[1241,23516,23517],{"class":1262}," Basic",[1241,23519,7890],{"class":1724},[1241,23521,23522,23525],{"class":1243,"line":1312},[1241,23523,23524],{"class":1269},"    --vm-size",[1241,23526,23527],{"class":1262}," c0\n",[1241,23529,23530],{"class":1243,"line":1321},[1241,23531,1303],{"emptyLinePlaceholder":1302},[1241,23533,23534],{"class":1243,"line":1327},[1241,23535,23536],{"class":1247},"# Get Redis connection string\n",[1241,23538,23539,23541,23543,23546],{"class":1243,"line":1333},[1241,23540,20803],{"class":1254},[1241,23542,9784],{"class":1262},[1241,23544,23545],{"class":1262}," list-keys",[1241,23547,7890],{"class":1724},[1241,23549,23550,23552,23554],{"class":1243,"line":1339},[1241,23551,20939],{"class":1269},[1241,23553,20858],{"class":1262},[1241,23555,7890],{"class":1724},[1241,23557,23558,23560],{"class":1243,"line":1345},[1241,23559,20929],{"class":1269},[1241,23561,23562],{"class":1262}," django-redis-cache\n",[1035,23564,23566],{"id":23565},"azure-container-instances","Azure Container Instances",[1128,23568,23570],{"className":1372,"code":23569,"language":1374,"meta":1137,"style":1137},"{\n  \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n  \"contentVersion\": \"1.0.0.0\",\n  \"parameters\": {\n    \"containerGroupName\": {\n      \"type\": \"string\",\n      \"defaultValue\": \"django-app-group\"\n    },\n    \"containerName\": {\n      \"type\": \"string\",\n      \"defaultValue\": \"django-app\"\n    },\n    \"image\": {\n      \"type\": \"string\",\n      \"defaultValue\": \"your-registry.azurecr.io/django-app:latest\"\n    },\n    \"databaseUrl\": {\n      \"type\": \"securestring\"\n    },\n    \"secretKey\": {\n      \"type\": \"securestring\"\n    }\n  },\n  \"resources\": [\n    {\n      \"type\": \"Microsoft.ContainerInstance/containerGroups\",\n      \"apiVersion\": \"2021-03-01\",\n      \"name\": \"[parameters('containerGroupName')]\",\n      \"location\": \"[resourceGroup().location]\",\n      \"properties\": {\n        \"containers\": [\n          {\n            \"name\": \"[parameters('containerName')]\",\n            \"properties\": {\n              \"image\": \"[parameters('image')]\",\n              \"ports\": [\n                {\n                  \"port\": 8000,\n                  \"protocol\": \"TCP\"\n                }\n              ],\n              \"environmentVariables\": [\n                {\n                  \"name\": \"DJANGO_SETTINGS_MODULE\",\n                  \"value\": \"myproject.settings.production\"\n                },\n                {\n                  \"name\": \"DATABASE_URL\",\n                  \"secureValue\": \"[parameters('databaseUrl')]\"\n                },\n                {\n                  \"name\": \"SECRET_KEY\",\n                  \"secureValue\": \"[parameters('secretKey')]\"\n                }\n              ],\n              \"resources\": {\n                \"requests\": {\n                  \"cpu\": 1,\n                  \"memoryInGB\": 2\n                }\n              }\n            }\n          }\n        ],\n        \"osType\": \"Linux\",\n        \"ipAddress\": {\n          \"type\": \"Public\",\n          \"ports\": [\n            {\n              \"port\": 8000,\n              \"protocol\": \"TCP\"\n            }\n          ]\n        },\n        \"restartPolicy\": \"Always\"\n      }\n    }\n  ],\n  \"outputs\": {\n    \"containerIPv4Address\": {\n      \"type\": \"string\",\n      \"value\": \"[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]\"\n    }\n  }\n}\n",[1135,23571,23572,23576,23596,23616,23629,23642,23662,23680,23684,23696,23714,23730,23734,23746,23764,23781,23785,23798,23815,23819,23832,23848,23852,23856,23868,23872,23891,23910,23929,23949,23962,23975,23980,23999,24011,24032,24045,24050,24066,24083,24088,24093,24106,24110,24128,24144,24149,24153,24171,24189,24193,24197,24215,24232,24236,24240,24252,24266,24281,24294,24298,24303,24308,24313,24318,24338,24351,24370,24382,24387,24401,24417,24421,24426,24430,24448,24452,24456,24460,24473,24486,24504,24521,24525,24529],{"__ignoreMap":1137},[1241,23573,23574],{"class":1243,"line":1244},[1241,23575,1382],{"class":1381},[1241,23577,23578,23580,23583,23585,23587,23589,23592,23594],{"class":1243,"line":1251},[1241,23579,1388],{"class":1387},[1241,23581,23582],{"class":1391},"$schema",[1241,23584,1266],{"class":1387},[1241,23586,1397],{"class":1381},[1241,23588,1259],{"class":1258},[1241,23590,23591],{"class":1262},"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",[1241,23593,1266],{"class":1258},[1241,23595,1407],{"class":1381},[1241,23597,23598,23600,23603,23605,23607,23609,23612,23614],{"class":1243,"line":1281},[1241,23599,1388],{"class":1387},[1241,23601,23602],{"class":1391},"contentVersion",[1241,23604,1266],{"class":1387},[1241,23606,1397],{"class":1381},[1241,23608,1259],{"class":1258},[1241,23610,23611],{"class":1262},"1.0.0.0",[1241,23613,1266],{"class":1258},[1241,23615,1407],{"class":1381},[1241,23617,23618,23620,23623,23625,23627],{"class":1243,"line":1290},[1241,23619,1388],{"class":1387},[1241,23621,23622],{"class":1391},"parameters",[1241,23624,1266],{"class":1387},[1241,23626,1397],{"class":1381},[1241,23628,1566],{"class":1381},[1241,23630,23631,23633,23636,23638,23640],{"class":1243,"line":1299},[1241,23632,4293],{"class":1387},[1241,23634,23635],{"class":1434},"containerGroupName",[1241,23637,1266],{"class":1387},[1241,23639,1397],{"class":1381},[1241,23641,1566],{"class":1381},[1241,23643,23644,23646,23649,23651,23653,23655,23658,23660],{"class":1243,"line":1306},[1241,23645,1431],{"class":1387},[1241,23647,23648],{"class":1574},"type",[1241,23650,1266],{"class":1387},[1241,23652,1397],{"class":1381},[1241,23654,1259],{"class":1258},[1241,23656,23657],{"class":1262},"string",[1241,23659,1266],{"class":1258},[1241,23661,1407],{"class":1381},[1241,23663,23664,23666,23669,23671,23673,23675,23678],{"class":1243,"line":1312},[1241,23665,1431],{"class":1387},[1241,23667,23668],{"class":1574},"defaultValue",[1241,23670,1266],{"class":1387},[1241,23672,1397],{"class":1381},[1241,23674,1259],{"class":1258},[1241,23676,23677],{"class":1262},"django-app-group",[1241,23679,1278],{"class":1258},[1241,23681,23682],{"class":1243,"line":1321},[1241,23683,2744],{"class":1381},[1241,23685,23686,23688,23690,23692,23694],{"class":1243,"line":1327},[1241,23687,4293],{"class":1387},[1241,23689,6378],{"class":1434},[1241,23691,1266],{"class":1387},[1241,23693,1397],{"class":1381},[1241,23695,1566],{"class":1381},[1241,23697,23698,23700,23702,23704,23706,23708,23710,23712],{"class":1243,"line":1333},[1241,23699,1431],{"class":1387},[1241,23701,23648],{"class":1574},[1241,23703,1266],{"class":1387},[1241,23705,1397],{"class":1381},[1241,23707,1259],{"class":1258},[1241,23709,23657],{"class":1262},[1241,23711,1266],{"class":1258},[1241,23713,1407],{"class":1381},[1241,23715,23716,23718,23720,23722,23724,23726,23728],{"class":1243,"line":1339},[1241,23717,1431],{"class":1387},[1241,23719,23668],{"class":1574},[1241,23721,1266],{"class":1387},[1241,23723,1397],{"class":1381},[1241,23725,1259],{"class":1258},[1241,23727,5410],{"class":1262},[1241,23729,1278],{"class":1258},[1241,23731,23732],{"class":1243,"line":1345},[1241,23733,2744],{"class":1381},[1241,23735,23736,23738,23740,23742,23744],{"class":1243,"line":1350},[1241,23737,4293],{"class":1387},[1241,23739,5580],{"class":1434},[1241,23741,1266],{"class":1387},[1241,23743,1397],{"class":1381},[1241,23745,1566],{"class":1381},[1241,23747,23748,23750,23752,23754,23756,23758,23760,23762],{"class":1243,"line":1356},[1241,23749,1431],{"class":1387},[1241,23751,23648],{"class":1574},[1241,23753,1266],{"class":1387},[1241,23755,1397],{"class":1381},[1241,23757,1259],{"class":1258},[1241,23759,23657],{"class":1262},[1241,23761,1266],{"class":1258},[1241,23763,1407],{"class":1381},[1241,23765,23766,23768,23770,23772,23774,23776,23779],{"class":1243,"line":1554},[1241,23767,1431],{"class":1387},[1241,23769,23668],{"class":1574},[1241,23771,1266],{"class":1387},[1241,23773,1397],{"class":1381},[1241,23775,1259],{"class":1258},[1241,23777,23778],{"class":1262},"your-registry.azurecr.io/django-app:latest",[1241,23780,1278],{"class":1258},[1241,23782,23783],{"class":1243,"line":1569},[1241,23784,2744],{"class":1381},[1241,23786,23787,23789,23792,23794,23796],{"class":1243,"line":1584},[1241,23788,4293],{"class":1387},[1241,23790,23791],{"class":1434},"databaseUrl",[1241,23793,1266],{"class":1387},[1241,23795,1397],{"class":1381},[1241,23797,1566],{"class":1381},[1241,23799,23800,23802,23804,23806,23808,23810,23813],{"class":1243,"line":1621},[1241,23801,1431],{"class":1387},[1241,23803,23648],{"class":1574},[1241,23805,1266],{"class":1387},[1241,23807,1397],{"class":1381},[1241,23809,1259],{"class":1258},[1241,23811,23812],{"class":1262},"securestring",[1241,23814,1278],{"class":1258},[1241,23816,23817],{"class":1243,"line":1627},[1241,23818,2744],{"class":1381},[1241,23820,23821,23823,23826,23828,23830],{"class":1243,"line":1633},[1241,23822,4293],{"class":1387},[1241,23824,23825],{"class":1434},"secretKey",[1241,23827,1266],{"class":1387},[1241,23829,1397],{"class":1381},[1241,23831,1566],{"class":1381},[1241,23833,23834,23836,23838,23840,23842,23844,23846],{"class":1243,"line":1639},[1241,23835,1431],{"class":1387},[1241,23837,23648],{"class":1574},[1241,23839,1266],{"class":1387},[1241,23841,1397],{"class":1381},[1241,23843,1259],{"class":1258},[1241,23845,23812],{"class":1262},[1241,23847,1278],{"class":1258},[1241,23849,23850],{"class":1243,"line":1645},[1241,23851,1636],{"class":1381},[1241,23853,23854],{"class":1243,"line":2028},[1241,23855,7008],{"class":1381},[1241,23857,23858,23860,23862,23864,23866],{"class":1243,"line":2042},[1241,23859,1388],{"class":1387},[1241,23861,13878],{"class":1391},[1241,23863,1266],{"class":1387},[1241,23865,1397],{"class":1381},[1241,23867,1421],{"class":1381},[1241,23869,23870],{"class":1243,"line":2064},[1241,23871,1426],{"class":1381},[1241,23873,23874,23876,23878,23880,23882,23884,23887,23889],{"class":1243,"line":2070},[1241,23875,1431],{"class":1387},[1241,23877,23648],{"class":1434},[1241,23879,1266],{"class":1387},[1241,23881,1397],{"class":1381},[1241,23883,1259],{"class":1258},[1241,23885,23886],{"class":1262},"Microsoft.ContainerInstance/containerGroups",[1241,23888,1266],{"class":1258},[1241,23890,1407],{"class":1381},[1241,23892,23893,23895,23897,23899,23901,23903,23906,23908],{"class":1243,"line":2075},[1241,23894,1431],{"class":1387},[1241,23896,16978],{"class":1434},[1241,23898,1266],{"class":1387},[1241,23900,1397],{"class":1381},[1241,23902,1259],{"class":1258},[1241,23904,23905],{"class":1262},"2021-03-01",[1241,23907,1266],{"class":1258},[1241,23909,1407],{"class":1381},[1241,23911,23912,23914,23916,23918,23920,23922,23925,23927],{"class":1243,"line":2080},[1241,23913,1431],{"class":1387},[1241,23915,5560],{"class":1434},[1241,23917,1266],{"class":1387},[1241,23919,1397],{"class":1381},[1241,23921,1259],{"class":1258},[1241,23923,23924],{"class":1262},"[parameters('containerGroupName')]",[1241,23926,1266],{"class":1258},[1241,23928,1407],{"class":1381},[1241,23930,23931,23933,23936,23938,23940,23942,23945,23947],{"class":1243,"line":2085},[1241,23932,1431],{"class":1387},[1241,23934,23935],{"class":1434},"location",[1241,23937,1266],{"class":1387},[1241,23939,1397],{"class":1381},[1241,23941,1259],{"class":1258},[1241,23943,23944],{"class":1262},"[resourceGroup().location]",[1241,23946,1266],{"class":1258},[1241,23948,1407],{"class":1381},[1241,23950,23951,23953,23956,23958,23960],{"class":1243,"line":2091},[1241,23952,1431],{"class":1387},[1241,23954,23955],{"class":1434},"properties",[1241,23957,1266],{"class":1387},[1241,23959,1397],{"class":1381},[1241,23961,1566],{"class":1381},[1241,23963,23964,23966,23969,23971,23973],{"class":1243,"line":2120},[1241,23965,1466],{"class":1387},[1241,23967,23968],{"class":1574},"containers",[1241,23970,1266],{"class":1387},[1241,23972,1397],{"class":1381},[1241,23974,1421],{"class":1381},[1241,23976,23977],{"class":1243,"line":2148},[1241,23978,23979],{"class":1381},"          {\n",[1241,23981,23982,23984,23986,23988,23990,23992,23995,23997],{"class":1243,"line":2177},[1241,23983,4470],{"class":1387},[1241,23985,5560],{"class":1590},[1241,23987,1266],{"class":1387},[1241,23989,1397],{"class":1381},[1241,23991,1259],{"class":1258},[1241,23993,23994],{"class":1262},"[parameters('containerName')]",[1241,23996,1266],{"class":1258},[1241,23998,1407],{"class":1381},[1241,24000,24001,24003,24005,24007,24009],{"class":1243,"line":2214},[1241,24002,4470],{"class":1387},[1241,24004,23955],{"class":1590},[1241,24006,1266],{"class":1387},[1241,24008,1397],{"class":1381},[1241,24010,1566],{"class":1381},[1241,24012,24013,24016,24019,24021,24023,24025,24028,24030],{"class":1243,"line":2240},[1241,24014,24015],{"class":1387},"              \"",[1241,24017,5580],{"class":24018},"sifU2",[1241,24020,1266],{"class":1387},[1241,24022,1397],{"class":1381},[1241,24024,1259],{"class":1258},[1241,24026,24027],{"class":1262},"[parameters('image')]",[1241,24029,1266],{"class":1258},[1241,24031,1407],{"class":1381},[1241,24033,24034,24036,24039,24041,24043],{"class":1243,"line":2245},[1241,24035,24015],{"class":1387},[1241,24037,24038],{"class":24018},"ports",[1241,24040,1266],{"class":1387},[1241,24042,1397],{"class":1381},[1241,24044,1421],{"class":1381},[1241,24046,24047],{"class":1243,"line":2251},[1241,24048,24049],{"class":1381},"                {\n",[1241,24051,24052,24055,24058,24060,24062,24064],{"class":1243,"line":2267},[1241,24053,24054],{"class":1387},"                  \"",[1241,24056,24057],{"class":7405},"port",[1241,24059,1266],{"class":1387},[1241,24061,1397],{"class":1381},[1241,24063,5625],{"class":2476},[1241,24065,1407],{"class":1381},[1241,24067,24068,24070,24072,24074,24076,24078,24081],{"class":1243,"line":2289},[1241,24069,24054],{"class":1387},[1241,24071,5634],{"class":7405},[1241,24073,1266],{"class":1387},[1241,24075,1397],{"class":1381},[1241,24077,1259],{"class":1258},[1241,24079,24080],{"class":1262},"TCP",[1241,24082,1278],{"class":1258},[1241,24084,24085],{"class":1243,"line":2294},[1241,24086,24087],{"class":1381},"                }\n",[1241,24089,24090],{"class":1243,"line":2300},[1241,24091,24092],{"class":1381},"              ],\n",[1241,24094,24095,24097,24100,24102,24104],{"class":1243,"line":2314},[1241,24096,24015],{"class":1387},[1241,24098,24099],{"class":24018},"environmentVariables",[1241,24101,1266],{"class":1387},[1241,24103,1397],{"class":1381},[1241,24105,1421],{"class":1381},[1241,24107,24108],{"class":1243,"line":2335},[1241,24109,24049],{"class":1381},[1241,24111,24112,24114,24116,24118,24120,24122,24124,24126],{"class":1243,"line":2340},[1241,24113,24054],{"class":1387},[1241,24115,5560],{"class":7405},[1241,24117,1266],{"class":1387},[1241,24119,1397],{"class":1381},[1241,24121,1259],{"class":1258},[1241,24123,2956],{"class":1262},[1241,24125,1266],{"class":1258},[1241,24127,1407],{"class":1381},[1241,24129,24130,24132,24134,24136,24138,24140,24142],{"class":1243,"line":2346},[1241,24131,24054],{"class":1387},[1241,24133,5710],{"class":7405},[1241,24135,1266],{"class":1387},[1241,24137,1397],{"class":1381},[1241,24139,1259],{"class":1258},[1241,24141,2965],{"class":1262},[1241,24143,1278],{"class":1258},[1241,24145,24146],{"class":1243,"line":2361},[1241,24147,24148],{"class":1381},"                },\n",[1241,24150,24151],{"class":1243,"line":2371},[1241,24152,24049],{"class":1381},[1241,24154,24155,24157,24159,24161,24163,24165,24167,24169],{"class":1243,"line":2392},[1241,24156,24054],{"class":1387},[1241,24158,5560],{"class":7405},[1241,24160,1266],{"class":1387},[1241,24162,1397],{"class":1381},[1241,24164,1259],{"class":1258},[1241,24166,5847],{"class":1262},[1241,24168,1266],{"class":1258},[1241,24170,1407],{"class":1381},[1241,24172,24173,24175,24178,24180,24182,24184,24187],{"class":1243,"line":2397},[1241,24174,24054],{"class":1387},[1241,24176,24177],{"class":7405},"secureValue",[1241,24179,1266],{"class":1387},[1241,24181,1397],{"class":1381},[1241,24183,1259],{"class":1258},[1241,24185,24186],{"class":1262},"[parameters('databaseUrl')]",[1241,24188,1278],{"class":1258},[1241,24190,24191],{"class":1243,"line":2407},[1241,24192,24148],{"class":1381},[1241,24194,24195],{"class":1243,"line":2417},[1241,24196,24049],{"class":1381},[1241,24198,24199,24201,24203,24205,24207,24209,24211,24213],{"class":1243,"line":2422},[1241,24200,24054],{"class":1387},[1241,24202,5560],{"class":7405},[1241,24204,1266],{"class":1387},[1241,24206,1397],{"class":1381},[1241,24208,1259],{"class":1258},[1241,24210,5802],{"class":1262},[1241,24212,1266],{"class":1258},[1241,24214,1407],{"class":1381},[1241,24216,24217,24219,24221,24223,24225,24227,24230],{"class":1243,"line":2428},[1241,24218,24054],{"class":1387},[1241,24220,24177],{"class":7405},[1241,24222,1266],{"class":1387},[1241,24224,1397],{"class":1381},[1241,24226,1259],{"class":1258},[1241,24228,24229],{"class":1262},"[parameters('secretKey')]",[1241,24231,1278],{"class":1258},[1241,24233,24234],{"class":1243,"line":2439},[1241,24235,24087],{"class":1381},[1241,24237,24238],{"class":1243,"line":2468},[1241,24239,24092],{"class":1381},[1241,24241,24242,24244,24246,24248,24250],{"class":1243,"line":2480},[1241,24243,24015],{"class":1387},[1241,24245,13878],{"class":24018},[1241,24247,1266],{"class":1387},[1241,24249,1397],{"class":1381},[1241,24251,1566],{"class":1381},[1241,24253,24254,24257,24260,24262,24264],{"class":1243,"line":2490},[1241,24255,24256],{"class":1387},"                \"",[1241,24258,24259],{"class":7405},"requests",[1241,24261,1266],{"class":1387},[1241,24263,1397],{"class":1381},[1241,24265,1566],{"class":1381},[1241,24267,24268,24270,24273,24275,24277,24279],{"class":1243,"line":2500},[1241,24269,24054],{"class":1387},[1241,24271,5463],{"class":24272},"s6vMv",[1241,24274,1266],{"class":1387},[1241,24276,1397],{"class":1381},[1241,24278,2564],{"class":2476},[1241,24280,1407],{"class":1381},[1241,24282,24283,24285,24288,24290,24292],{"class":1243,"line":2505},[1241,24284,24054],{"class":1387},[1241,24286,24287],{"class":24272},"memoryInGB",[1241,24289,1266],{"class":1387},[1241,24291,1397],{"class":1381},[1241,24293,3413],{"class":2476},[1241,24295,24296],{"class":1243,"line":2511},[1241,24297,24087],{"class":1381},[1241,24299,24300],{"class":1243,"line":2521},[1241,24301,24302],{"class":1381},"              }\n",[1241,24304,24305],{"class":1243,"line":2531},[1241,24306,24307],{"class":1381},"            }\n",[1241,24309,24310],{"class":1243,"line":2536},[1241,24311,24312],{"class":1381},"          }\n",[1241,24314,24315],{"class":1243,"line":2542},[1241,24316,24317],{"class":1381},"        ],\n",[1241,24319,24320,24322,24325,24327,24329,24331,24334,24336],{"class":1243,"line":2552},[1241,24321,1466],{"class":1387},[1241,24323,24324],{"class":1574},"osType",[1241,24326,1266],{"class":1387},[1241,24328,1397],{"class":1381},[1241,24330,1259],{"class":1258},[1241,24332,24333],{"class":1262},"Linux",[1241,24335,1266],{"class":1258},[1241,24337,1407],{"class":1381},[1241,24339,24340,24342,24345,24347,24349],{"class":1243,"line":2569},[1241,24341,1466],{"class":1387},[1241,24343,24344],{"class":1574},"ipAddress",[1241,24346,1266],{"class":1387},[1241,24348,1397],{"class":1381},[1241,24350,1566],{"class":1381},[1241,24352,24353,24355,24357,24359,24361,24363,24366,24368],{"class":1243,"line":2586},[1241,24354,1587],{"class":1387},[1241,24356,23648],{"class":1590},[1241,24358,1266],{"class":1387},[1241,24360,1397],{"class":1381},[1241,24362,1259],{"class":1258},[1241,24364,24365],{"class":1262},"Public",[1241,24367,1266],{"class":1258},[1241,24369,1407],{"class":1381},[1241,24371,24372,24374,24376,24378,24380],{"class":1243,"line":2600},[1241,24373,1587],{"class":1387},[1241,24375,24038],{"class":1590},[1241,24377,1266],{"class":1387},[1241,24379,1397],{"class":1381},[1241,24381,1421],{"class":1381},[1241,24383,24384],{"class":1243,"line":2614},[1241,24385,24386],{"class":1381},"            {\n",[1241,24388,24389,24391,24393,24395,24397,24399],{"class":1243,"line":2635},[1241,24390,24015],{"class":1387},[1241,24392,24057],{"class":24018},[1241,24394,1266],{"class":1387},[1241,24396,1397],{"class":1381},[1241,24398,5625],{"class":2476},[1241,24400,1407],{"class":1381},[1241,24402,24403,24405,24407,24409,24411,24413,24415],{"class":1243,"line":2656},[1241,24404,24015],{"class":1387},[1241,24406,5634],{"class":24018},[1241,24408,1266],{"class":1387},[1241,24410,1397],{"class":1381},[1241,24412,1259],{"class":1258},[1241,24414,24080],{"class":1262},[1241,24416,1278],{"class":1258},[1241,24418,24419],{"class":1243,"line":2677},[1241,24420,24307],{"class":1381},[1241,24422,24423],{"class":1243,"line":2683},[1241,24424,24425],{"class":1381},"          ]\n",[1241,24427,24428],{"class":1243,"line":2697},[1241,24429,2680],{"class":1381},[1241,24431,24432,24434,24437,24439,24441,24443,24446],{"class":1243,"line":2716},[1241,24433,1466],{"class":1387},[1241,24435,24436],{"class":1574},"restartPolicy",[1241,24438,1266],{"class":1387},[1241,24440,1397],{"class":1381},[1241,24442,1259],{"class":1258},[1241,24444,24445],{"class":1262},"Always",[1241,24447,1278],{"class":1258},[1241,24449,24450],{"class":1243,"line":2736},[1241,24451,1630],{"class":1381},[1241,24453,24454],{"class":1243,"line":2741},[1241,24455,1636],{"class":1381},[1241,24457,24458],{"class":1243,"line":2747},[1241,24459,6667],{"class":1381},[1241,24461,24462,24464,24467,24469,24471],{"class":1243,"line":2761},[1241,24463,1388],{"class":1387},[1241,24465,24466],{"class":1391},"outputs",[1241,24468,1266],{"class":1387},[1241,24470,1397],{"class":1381},[1241,24472,1566],{"class":1381},[1241,24474,24475,24477,24480,24482,24484],{"class":1243,"line":2775},[1241,24476,4293],{"class":1387},[1241,24478,24479],{"class":1434},"containerIPv4Address",[1241,24481,1266],{"class":1387},[1241,24483,1397],{"class":1381},[1241,24485,1566],{"class":1381},[1241,24487,24488,24490,24492,24494,24496,24498,24500,24502],{"class":1243,"line":2804},[1241,24489,1431],{"class":1387},[1241,24491,23648],{"class":1574},[1241,24493,1266],{"class":1387},[1241,24495,1397],{"class":1381},[1241,24497,1259],{"class":1258},[1241,24499,23657],{"class":1262},[1241,24501,1266],{"class":1258},[1241,24503,1407],{"class":1381},[1241,24505,24506,24508,24510,24512,24514,24516,24519],{"class":1243,"line":2823},[1241,24507,1431],{"class":1387},[1241,24509,5710],{"class":1574},[1241,24511,1266],{"class":1387},[1241,24513,1397],{"class":1381},[1241,24515,1259],{"class":1258},[1241,24517,24518],{"class":1262},"[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]",[1241,24520,1278],{"class":1258},[1241,24522,24523],{"class":1243,"line":2840},[1241,24524,1636],{"class":1381},[1241,24526,24527],{"class":1243,"line":2845},[1241,24528,19592],{"class":1381},[1241,24530,24531],{"class":1243,"line":2850},[1241,24532,1648],{"class":1381},[1030,24534,24536],{"id":24535},"platform-as-a-service-solutions","Platform-as-a-Service Solutions",[1026,24538,24539],{},"PaaS platforms abstract away infrastructure management, allowing developers to focus on application code. These platforms handle scaling, load balancing, and maintenance automatically.",[1035,24541,24543],{"id":24542},"heroku-deployment","Heroku Deployment",[1026,24545,24546],{},"Heroku is one of the most popular PaaS platforms, known for its simplicity and developer-friendly approach.",[1026,24548,24549],{},[1042,24550,24551],{},"Heroku Configuration Files",[1128,24553,24555],{"className":1674,"code":24554,"language":1676,"meta":1137,"style":1137},"# Procfile\nweb: gunicorn myproject.wsgi:application --log-file - --log-level info\nworker: celery -A myproject worker -l info --concurrency=4\nbeat: celery -A myproject beat -l info\nrelease: python manage.py migrate\n\n# runtime.txt\npython-3.11.6\n\n# requirements.txt additions for Heroku\ngunicorn==21.2.0\ndj-database-url==2.1.0\nwhitenoise[brotli]==6.6.0\npsycopg2-binary==2.9.7\ndjango-heroku==0.3.1\ndjango-storages[boto3]==1.14.2\ncelery[redis]==5.3.4\n",[1135,24556,24557,24562,24605,24635,24654,24672,24676,24681,24694,24698,24703,24719,24743,24764,24784,24803,24829],{"__ignoreMap":1137},[1241,24558,24559],{"class":1243,"line":1244},[1241,24560,24561],{"class":1247},"# Procfile\n",[1241,24563,24564,24567,24569,24572,24574,24577,24579,24581,24585,24588,24590,24592,24595,24598,24600,24602],{"class":1243,"line":1251},[1241,24565,24566],{"class":1692},"web",[1241,24568,1397],{"class":1381},[1241,24570,24571],{"class":1692}," gunicorn myproject",[1241,24573,1773],{"class":1381},[1241,24575,24576],{"class":1776},"wsgi",[1241,24578,1397],{"class":1381},[1241,24580,3000],{"class":1692},[1241,24582,24584],{"class":24583},"srjyR","--",[1241,24586,24587],{"class":1692},"log",[1241,24589,13932],{"class":1709},[1241,24591,2605],{"class":7423},[1241,24593,24594],{"class":1709}," -",[1241,24596,24597],{"class":24583}," --",[1241,24599,24587],{"class":1692},[1241,24601,13932],{"class":1709},[1241,24603,24604],{"class":1692},"level info\n",[1241,24606,24607,24610,24612,24615,24617,24620,24622,24625,24627,24630,24632],{"class":1243,"line":1281},[1241,24608,24609],{"class":1692},"worker",[1241,24611,1397],{"class":1381},[1241,24613,24614],{"class":1692}," celery ",[1241,24616,13932],{"class":1709},[1241,24618,24619],{"class":1692},"A myproject worker ",[1241,24621,13932],{"class":1709},[1241,24623,24624],{"class":1692},"l info ",[1241,24626,24584],{"class":24583},[1241,24628,24629],{"class":1692},"concurrency",[1241,24631,3003],{"class":1381},[1241,24633,24634],{"class":2476},"4\n",[1241,24636,24637,24640,24642,24644,24646,24649,24651],{"class":1243,"line":1290},[1241,24638,24639],{"class":1692},"beat",[1241,24641,1397],{"class":1381},[1241,24643,24614],{"class":1692},[1241,24645,13932],{"class":1709},[1241,24647,24648],{"class":1692},"A myproject beat ",[1241,24650,13932],{"class":1709},[1241,24652,24653],{"class":1692},"l info\n",[1241,24655,24656,24659,24661,24664,24666,24669],{"class":1243,"line":1299},[1241,24657,24658],{"class":1692},"release",[1241,24660,1397],{"class":1381},[1241,24662,24663],{"class":1692}," python manage",[1241,24665,1773],{"class":1381},[1241,24667,24668],{"class":1776},"py",[1241,24670,24671],{"class":1692}," migrate\n",[1241,24673,24674],{"class":1243,"line":1306},[1241,24675,1303],{"emptyLinePlaceholder":1302},[1241,24677,24678],{"class":1243,"line":1312},[1241,24679,24680],{"class":1247},"# runtime.txt\n",[1241,24682,24683,24685,24687,24689,24691],{"class":1243,"line":1321},[1241,24684,1676],{"class":1692},[1241,24686,13932],{"class":1709},[1241,24688,22349],{"class":2476},[1241,24690,1773],{"class":1381},[1241,24692,24693],{"class":1776},"6\n",[1241,24695,24696],{"class":1243,"line":1327},[1241,24697,1303],{"emptyLinePlaceholder":1302},[1241,24699,24700],{"class":1243,"line":1333},[1241,24701,24702],{"class":1247},"# requirements.txt additions for Heroku\n",[1241,24704,24705,24708,24711,24714,24716],{"class":1243,"line":1339},[1241,24706,24707],{"class":1692},"gunicorn",[1241,24709,24710],{"class":1709},"==",[1241,24712,24713],{"class":2476},"21.2",[1241,24715,1773],{"class":1381},[1241,24717,24718],{"class":1776},"0\n",[1241,24720,24721,24724,24726,24729,24731,24734,24736,24739,24741],{"class":1243,"line":1345},[1241,24722,24723],{"class":1692},"dj",[1241,24725,13932],{"class":1709},[1241,24727,24728],{"class":1692},"database",[1241,24730,13932],{"class":1709},[1241,24732,24733],{"class":1692},"url",[1241,24735,24710],{"class":1709},[1241,24737,24738],{"class":2476},"2.1",[1241,24740,1773],{"class":1381},[1241,24742,24718],{"class":1776},[1241,24744,24745,24748,24750,24753,24755,24757,24760,24762],{"class":1243,"line":1350},[1241,24746,24747],{"class":1692},"whitenoise",[1241,24749,1904],{"class":1381},[1241,24751,24752],{"class":1692},"brotli",[1241,24754,4768],{"class":1381},[1241,24756,24710],{"class":1709},[1241,24758,24759],{"class":2476},"6.6",[1241,24761,1773],{"class":1381},[1241,24763,24718],{"class":1776},[1241,24765,24766,24769,24771,24774,24776,24779,24781],{"class":1243,"line":1356},[1241,24767,24768],{"class":1692},"psycopg2",[1241,24770,13932],{"class":1709},[1241,24772,24773],{"class":1692},"binary",[1241,24775,24710],{"class":1709},[1241,24777,24778],{"class":2476},"2.9",[1241,24780,1773],{"class":1381},[1241,24782,24783],{"class":1776},"7\n",[1241,24785,24786,24788,24790,24793,24795,24798,24800],{"class":1243,"line":1554},[1241,24787,2766],{"class":1692},[1241,24789,13932],{"class":1709},[1241,24791,24792],{"class":1692},"heroku",[1241,24794,24710],{"class":1709},[1241,24796,24797],{"class":2476},"0.3",[1241,24799,1773],{"class":1381},[1241,24801,24802],{"class":1776},"1\n",[1241,24804,24805,24807,24809,24812,24814,24817,24819,24821,24824,24826],{"class":1243,"line":1569},[1241,24806,2766],{"class":1692},[1241,24808,13932],{"class":1709},[1241,24810,24811],{"class":1692},"storages",[1241,24813,1904],{"class":1381},[1241,24815,24816],{"class":1692},"boto3",[1241,24818,4768],{"class":1381},[1241,24820,24710],{"class":1709},[1241,24822,24823],{"class":2476},"1.14",[1241,24825,1773],{"class":1381},[1241,24827,24828],{"class":1776},"2\n",[1241,24830,24831,24834,24836,24839,24841,24843,24846,24848],{"class":1243,"line":1584},[1241,24832,24833],{"class":1692},"celery",[1241,24835,1904],{"class":1381},[1241,24837,24838],{"class":1692},"redis",[1241,24840,4768],{"class":1381},[1241,24842,24710],{"class":1709},[1241,24844,24845],{"class":2476},"5.3",[1241,24847,1773],{"class":1381},[1241,24849,24634],{"class":1776},[1026,24851,24852],{},[1042,24853,24854],{},"Heroku-Specific Settings",[1128,24856,24858],{"className":1674,"code":24857,"language":1676,"meta":1137,"style":1137},"# settings/heroku.py\nimport os\nimport dj_database_url\nimport django_heroku\nfrom .base import *\n\n# Heroku-specific settings\nDEBUG = False\nALLOWED_HOSTS = ['.herokuapp.com']\n\n# Database configuration from DATABASE_URL\nDATABASES = {\n    'default': dj_database_url.config(\n        default=os.environ.get('DATABASE_URL'),\n        conn_max_age=600,\n        conn_health_checks=True,\n        ssl_require=True,\n    )\n}\n\n# Static files with WhiteNoise\nMIDDLEWARE.insert(1, 'whitenoise.middleware.WhiteNoiseMiddleware')\nSTATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'\nSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')\nWHITENOISE_USE_FINDERS = True\n\n# Media files on S3 (Heroku filesystem is ephemeral)\nif os.environ.get('AWS_ACCESS_KEY_ID'):\n    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'\n    AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')\n    AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')\n    AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')\n    AWS_S3_REGION_NAME = os.environ.get('AWS_S3_REGION_NAME', 'us-east-1')\n    AWS_DEFAULT_ACL = 'public-read'\n    AWS_S3_FILE_OVERWRITE = False\n\n# Redis cache configuration\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': os.environ.get('REDIS_URL'),\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n            'CONNECTION_POOL_KWARGS': {\n                'ssl_cert_reqs': None,\n            },\n        },\n    }\n}\n\n# Session configuration\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'default'\n\n# Security settings\nSECURE_SSL_REDIRECT = True\nSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')\nSECURE_HSTS_SECONDS = 31536000\nSECURE_HSTS_INCLUDE_SUBDOMAINS = True\nSECURE_HSTS_PRELOAD = True\n\n# Email configuration\nEMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'\nEMAIL_HOST = 'smtp.mailgun.org'\nEMAIL_PORT = 587\nEMAIL_USE_TLS = True\nEMAIL_HOST_USER = os.environ.get('MAILGUN_SMTP_LOGIN')\nEMAIL_HOST_PASSWORD = os.environ.get('MAILGUN_SMTP_PASSWORD')\n\n# Logging configuration\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'console': {\n            'class': 'logging.StreamHandler',\n        },\n    },\n    'root': {\n        'handlers': ['console'],\n        'level': 'INFO',\n    },\n    'loggers': {\n        'django': {\n            'handlers': ['console'],\n            'level': 'INFO',\n            'propagate': False,\n        },\n    },\n}\n\n# Apply Heroku-specific configurations\ndjango_heroku.settings(locals(), staticfiles=False)\n",[1135,24859,24860,24865,24871,24878,24885,24897,24901,24906,24914,24931,24935,24940,24948,24969,24997,25009,25020,25031,25036,25040,25044,25049,25073,25086,25121,25130,25134,25139,25163,25175,25202,25229,25256,25291,25304,25313,25317,25322,25330,25342,25360,25390,25402,25420,25432,25446,25450,25454,25458,25462,25466,25470,25482,25494,25498,25502,25510,25534,25542,25550,25558,25562,25567,25581,25595,25605,25614,25642,25670,25674,25679,25687,25701,25715,25727,25739,25757,25761,25765,25777,25797,25815,25819,25831,25843,25863,25881,25895,25899,25903,25907,25911,25916],{"__ignoreMap":1137},[1241,24861,24862],{"class":1243,"line":1244},[1241,24863,24864],{"class":1247},"# settings/heroku.py\n",[1241,24866,24867,24869],{"class":1243,"line":1251},[1241,24868,1689],{"class":1688},[1241,24870,1693],{"class":1692},[1241,24872,24873,24875],{"class":1243,"line":1281},[1241,24874,1689],{"class":1688},[1241,24876,24877],{"class":1692}," dj_database_url\n",[1241,24879,24880,24882],{"class":1243,"line":1290},[1241,24881,1689],{"class":1688},[1241,24883,24884],{"class":1692}," django_heroku\n",[1241,24886,24887,24889,24891,24893,24895],{"class":1243,"line":1299},[1241,24888,1698],{"class":1688},[1241,24890,1701],{"class":1381},[1241,24892,1704],{"class":1692},[1241,24894,1689],{"class":1688},[1241,24896,1710],{"class":1709},[1241,24898,24899],{"class":1243,"line":1306},[1241,24900,1303],{"emptyLinePlaceholder":1302},[1241,24902,24903],{"class":1243,"line":1312},[1241,24904,24905],{"class":1247},"# Heroku-specific settings\n",[1241,24907,24908,24910,24912],{"class":1243,"line":1321},[1241,24909,1725],{"class":1724},[1241,24911,1728],{"class":1381},[1241,24913,1732],{"class":1731},[1241,24915,24916,24918,24920,24922,24924,24927,24929],{"class":1243,"line":1327},[1241,24917,1737],{"class":1724},[1241,24919,1728],{"class":1381},[1241,24921,1598],{"class":1381},[1241,24923,1752],{"class":1258},[1241,24925,24926],{"class":1262},".herokuapp.com",[1241,24928,1752],{"class":1258},[1241,24930,1618],{"class":1381},[1241,24932,24933],{"class":1243,"line":1333},[1241,24934,1303],{"emptyLinePlaceholder":1302},[1241,24936,24937],{"class":1243,"line":1339},[1241,24938,24939],{"class":1247},"# Database configuration from DATABASE_URL\n",[1241,24941,24942,24944,24946],{"class":1243,"line":1345},[1241,24943,4785],{"class":1724},[1241,24945,1728],{"class":1381},[1241,24947,1566],{"class":1381},[1241,24949,24950,24952,24954,24956,24958,24961,24963,24966],{"class":1243,"line":1350},[1241,24951,1746],{"class":1258},[1241,24953,1857],{"class":1262},[1241,24955,1752],{"class":1258},[1241,24957,1397],{"class":1381},[1241,24959,24960],{"class":1692}," dj_database_url",[1241,24962,1773],{"class":1381},[1241,24964,24965],{"class":1782},"config",[1241,24967,24968],{"class":1381},"(\n",[1241,24970,24971,24975,24977,24979,24981,24983,24985,24987,24989,24991,24993,24995],{"class":1243,"line":1356},[1241,24972,24974],{"class":24973},"sqOPj","        default",[1241,24976,3003],{"class":1381},[1241,24978,2940],{"class":1782},[1241,24980,1773],{"class":1381},[1241,24982,1777],{"class":1776},[1241,24984,1773],{"class":1381},[1241,24986,1783],{"class":1782},[1241,24988,1786],{"class":1381},[1241,24990,1752],{"class":1258},[1241,24992,5847],{"class":1262},[1241,24994,1752],{"class":1258},[1241,24996,1801],{"class":1381},[1241,24998,24999,25002,25004,25007],{"class":1243,"line":1554},[1241,25000,25001],{"class":24973},"        conn_max_age",[1241,25003,3003],{"class":1381},[1241,25005,25006],{"class":2476},"600",[1241,25008,1407],{"class":1381},[1241,25010,25011,25014,25016,25018],{"class":1243,"line":1569},[1241,25012,25013],{"class":24973},"        conn_health_checks",[1241,25015,3003],{"class":1381},[1241,25017,3911],{"class":1731},[1241,25019,1407],{"class":1381},[1241,25021,25022,25025,25027,25029],{"class":1243,"line":1584},[1241,25023,25024],{"class":24973},"        ssl_require",[1241,25026,3003],{"class":1381},[1241,25028,3911],{"class":1731},[1241,25030,1407],{"class":1381},[1241,25032,25033],{"class":1243,"line":1621},[1241,25034,25035],{"class":1381},"    )\n",[1241,25037,25038],{"class":1243,"line":1627},[1241,25039,1648],{"class":1381},[1241,25041,25042],{"class":1243,"line":1633},[1241,25043,1303],{"emptyLinePlaceholder":1302},[1241,25045,25046],{"class":1243,"line":1639},[1241,25047,25048],{"class":1247},"# Static files with WhiteNoise\n",[1241,25050,25051,25054,25056,25058,25060,25062,25064,25066,25069,25071],{"class":1243,"line":1645},[1241,25052,25053],{"class":1724},"MIDDLEWARE",[1241,25055,1773],{"class":1381},[1241,25057,2904],{"class":1782},[1241,25059,1786],{"class":1381},[1241,25061,10576],{"class":2476},[1241,25063,1608],{"class":1381},[1241,25065,1822],{"class":1258},[1241,25067,25068],{"class":1262},"whitenoise.middleware.WhiteNoiseMiddleware",[1241,25070,1752],{"class":1258},[1241,25072,2117],{"class":1381},[1241,25074,25075,25077,25079,25081,25084],{"class":1243,"line":2028},[1241,25076,2254],{"class":1724},[1241,25078,1728],{"class":1381},[1241,25080,1822],{"class":1258},[1241,25082,25083],{"class":1262},"whitenoise.storage.CompressedManifestStaticFilesStorage",[1241,25085,2264],{"class":1258},[1241,25087,25088,25091,25093,25095,25097,25099,25101,25104,25106,25110,25112,25114,25117,25119],{"class":1243,"line":2042},[1241,25089,25090],{"class":1724},"STATIC_ROOT",[1241,25092,1728],{"class":1381},[1241,25094,1833],{"class":1692},[1241,25096,1773],{"class":1381},[1241,25098,2899],{"class":1776},[1241,25100,1773],{"class":1381},[1241,25102,25103],{"class":1782},"join",[1241,25105,1786],{"class":1381},[1241,25107,25109],{"class":25108},"s6DHA","BASE_DIR",[1241,25111,1608],{"class":1381},[1241,25113,1822],{"class":1258},[1241,25115,25116],{"class":1262},"staticfiles",[1241,25118,1752],{"class":1258},[1241,25120,2117],{"class":1381},[1241,25122,25123,25126,25128],{"class":1243,"line":2064},[1241,25124,25125],{"class":1724},"WHITENOISE_USE_FINDERS",[1241,25127,1728],{"class":1381},[1241,25129,2436],{"class":1731},[1241,25131,25132],{"class":1243,"line":2070},[1241,25133,1303],{"emptyLinePlaceholder":1302},[1241,25135,25136],{"class":1243,"line":2075},[1241,25137,25138],{"class":1247},"# Media files on S3 (Heroku filesystem is ephemeral)\n",[1241,25140,25141,25143,25145,25147,25149,25151,25153,25155,25157,25159,25161],{"class":1243,"line":2080},[1241,25142,1819],{"class":1688},[1241,25144,1833],{"class":1692},[1241,25146,1773],{"class":1381},[1241,25148,1777],{"class":1776},[1241,25150,1773],{"class":1381},[1241,25152,1783],{"class":1782},[1241,25154,1786],{"class":1381},[1241,25156,1752],{"class":1258},[1241,25158,2094],{"class":1262},[1241,25160,1752],{"class":1258},[1241,25162,8583],{"class":1381},[1241,25164,25165,25167,25169,25171,25173],{"class":1243,"line":2085},[1241,25166,21619],{"class":1724},[1241,25168,1728],{"class":1381},[1241,25170,1822],{"class":1258},[1241,25172,2261],{"class":1262},[1241,25174,2264],{"class":1258},[1241,25176,25177,25180,25182,25184,25186,25188,25190,25192,25194,25196,25198,25200],{"class":1243,"line":2091},[1241,25178,25179],{"class":1724},"    AWS_ACCESS_KEY_ID",[1241,25181,1728],{"class":1381},[1241,25183,1833],{"class":1692},[1241,25185,1773],{"class":1381},[1241,25187,1777],{"class":1776},[1241,25189,1773],{"class":1381},[1241,25191,1783],{"class":1782},[1241,25193,1786],{"class":1381},[1241,25195,1752],{"class":1258},[1241,25197,2094],{"class":1262},[1241,25199,1752],{"class":1258},[1241,25201,2117],{"class":1381},[1241,25203,25204,25207,25209,25211,25213,25215,25217,25219,25221,25223,25225,25227],{"class":1243,"line":2120},[1241,25205,25206],{"class":1724},"    AWS_SECRET_ACCESS_KEY",[1241,25208,1728],{"class":1381},[1241,25210,1833],{"class":1692},[1241,25212,1773],{"class":1381},[1241,25214,1777],{"class":1776},[1241,25216,1773],{"class":1381},[1241,25218,1783],{"class":1782},[1241,25220,1786],{"class":1381},[1241,25222,1752],{"class":1258},[1241,25224,2123],{"class":1262},[1241,25226,1752],{"class":1258},[1241,25228,2117],{"class":1381},[1241,25230,25231,25234,25236,25238,25240,25242,25244,25246,25248,25250,25252,25254],{"class":1243,"line":2148},[1241,25232,25233],{"class":1724},"    AWS_STORAGE_BUCKET_NAME",[1241,25235,1728],{"class":1381},[1241,25237,1833],{"class":1692},[1241,25239,1773],{"class":1381},[1241,25241,1777],{"class":1776},[1241,25243,1773],{"class":1381},[1241,25245,1783],{"class":1782},[1241,25247,1786],{"class":1381},[1241,25249,1752],{"class":1258},[1241,25251,2151],{"class":1262},[1241,25253,1752],{"class":1258},[1241,25255,2117],{"class":1381},[1241,25257,25258,25261,25263,25265,25267,25269,25271,25273,25275,25277,25279,25281,25283,25285,25287,25289],{"class":1243,"line":2177},[1241,25259,25260],{"class":1724},"    AWS_S3_REGION_NAME",[1241,25262,1728],{"class":1381},[1241,25264,1833],{"class":1692},[1241,25266,1773],{"class":1381},[1241,25268,1777],{"class":1776},[1241,25270,1773],{"class":1381},[1241,25272,1783],{"class":1782},[1241,25274,1786],{"class":1381},[1241,25276,1752],{"class":1258},[1241,25278,2180],{"class":1262},[1241,25280,1752],{"class":1258},[1241,25282,1608],{"class":1381},[1241,25284,1822],{"class":1258},[1241,25286,1603],{"class":1262},[1241,25288,1752],{"class":1258},[1241,25290,2117],{"class":1381},[1241,25292,25293,25296,25298,25300,25302],{"class":1243,"line":2214},[1241,25294,25295],{"class":1724},"    AWS_DEFAULT_ACL",[1241,25297,1728],{"class":1381},[1241,25299,1822],{"class":1258},[1241,25301,2356],{"class":1262},[1241,25303,2264],{"class":1258},[1241,25305,25306,25309,25311],{"class":1243,"line":2240},[1241,25307,25308],{"class":1724},"    AWS_S3_FILE_OVERWRITE",[1241,25310,1728],{"class":1381},[1241,25312,1732],{"class":1731},[1241,25314,25315],{"class":1243,"line":2245},[1241,25316,1303],{"emptyLinePlaceholder":1302},[1241,25318,25319],{"class":1243,"line":2251},[1241,25320,25321],{"class":1247},"# Redis cache configuration\n",[1241,25323,25324,25326,25328],{"class":1243,"line":2267},[1241,25325,5058],{"class":1724},[1241,25327,1728],{"class":1381},[1241,25329,1566],{"class":1381},[1241,25331,25332,25334,25336,25338,25340],{"class":1243,"line":2289},[1241,25333,1746],{"class":1258},[1241,25335,1857],{"class":1262},[1241,25337,1752],{"class":1258},[1241,25339,1397],{"class":1381},[1241,25341,1566],{"class":1381},[1241,25343,25344,25346,25348,25350,25352,25354,25356,25358],{"class":1243,"line":2294},[1241,25345,1854],{"class":1258},[1241,25347,5081],{"class":1262},[1241,25349,1752],{"class":1258},[1241,25351,1397],{"class":1381},[1241,25353,1822],{"class":1258},[1241,25355,5090],{"class":1262},[1241,25357,1752],{"class":1258},[1241,25359,1407],{"class":1381},[1241,25361,25362,25364,25366,25368,25370,25372,25374,25376,25378,25380,25382,25384,25386,25388],{"class":1243,"line":2300},[1241,25363,1854],{"class":1258},[1241,25365,5101],{"class":1262},[1241,25367,1752],{"class":1258},[1241,25369,1397],{"class":1381},[1241,25371,1833],{"class":1692},[1241,25373,1773],{"class":1381},[1241,25375,1777],{"class":1776},[1241,25377,1773],{"class":1381},[1241,25379,1783],{"class":1782},[1241,25381,1786],{"class":1381},[1241,25383,1752],{"class":1258},[1241,25385,5118],{"class":1262},[1241,25387,1752],{"class":1258},[1241,25389,1801],{"class":1381},[1241,25391,25392,25394,25396,25398,25400],{"class":1243,"line":2314},[1241,25393,1854],{"class":1258},[1241,25395,2033],{"class":1262},[1241,25397,1752],{"class":1258},[1241,25399,1397],{"class":1381},[1241,25401,1566],{"class":1381},[1241,25403,25404,25406,25408,25410,25412,25414,25416,25418],{"class":1243,"line":2335},[1241,25405,1868],{"class":1258},[1241,25407,5141],{"class":1262},[1241,25409,1752],{"class":1258},[1241,25411,1397],{"class":1381},[1241,25413,1822],{"class":1258},[1241,25415,5150],{"class":1262},[1241,25417,1752],{"class":1258},[1241,25419,1407],{"class":1381},[1241,25421,25422,25424,25426,25428,25430],{"class":1243,"line":2340},[1241,25423,1868],{"class":1258},[1241,25425,5161],{"class":1262},[1241,25427,1752],{"class":1258},[1241,25429,1397],{"class":1381},[1241,25431,1566],{"class":1381},[1241,25433,25434,25436,25438,25440,25442,25444],{"class":1243,"line":2346},[1241,25435,2045],{"class":1258},[1241,25437,10054],{"class":1262},[1241,25439,1752],{"class":1258},[1241,25441,1397],{"class":1381},[1241,25443,10061],{"class":1731},[1241,25445,1407],{"class":1381},[1241,25447,25448],{"class":1243,"line":2361},[1241,25449,2067],{"class":1381},[1241,25451,25452],{"class":1243,"line":2371},[1241,25453,2680],{"class":1381},[1241,25455,25456],{"class":1243,"line":2392},[1241,25457,1636],{"class":1381},[1241,25459,25460],{"class":1243,"line":2397},[1241,25461,1648],{"class":1381},[1241,25463,25464],{"class":1243,"line":2407},[1241,25465,1303],{"emptyLinePlaceholder":1302},[1241,25467,25468],{"class":1243,"line":2417},[1241,25469,15194],{"class":1247},[1241,25471,25472,25474,25476,25478,25480],{"class":1243,"line":2422},[1241,25473,5215],{"class":1724},[1241,25475,1728],{"class":1381},[1241,25477,1822],{"class":1258},[1241,25479,5222],{"class":1262},[1241,25481,2264],{"class":1258},[1241,25483,25484,25486,25488,25490,25492],{"class":1243,"line":2428},[1241,25485,5229],{"class":1724},[1241,25487,1728],{"class":1381},[1241,25489,1822],{"class":1258},[1241,25491,1857],{"class":1262},[1241,25493,2264],{"class":1258},[1241,25495,25496],{"class":1243,"line":2439},[1241,25497,1303],{"emptyLinePlaceholder":1302},[1241,25499,25500],{"class":1243,"line":2468},[1241,25501,2425],{"class":1247},[1241,25503,25504,25506,25508],{"class":1243,"line":2480},[1241,25505,2431],{"class":1724},[1241,25507,1728],{"class":1381},[1241,25509,2436],{"class":1731},[1241,25511,25512,25514,25516,25518,25520,25522,25524,25526,25528,25530,25532],{"class":1243,"line":2490},[1241,25513,2442],{"class":1724},[1241,25515,1728],{"class":1381},[1241,25517,2447],{"class":1381},[1241,25519,1752],{"class":1258},[1241,25521,2452],{"class":1262},[1241,25523,1752],{"class":1258},[1241,25525,1608],{"class":1381},[1241,25527,1822],{"class":1258},[1241,25529,2461],{"class":1262},[1241,25531,1752],{"class":1258},[1241,25533,2117],{"class":1381},[1241,25535,25536,25538,25540],{"class":1243,"line":2500},[1241,25537,2471],{"class":1724},[1241,25539,1728],{"class":1381},[1241,25541,2477],{"class":2476},[1241,25543,25544,25546,25548],{"class":1243,"line":2505},[1241,25545,2483],{"class":1724},[1241,25547,1728],{"class":1381},[1241,25549,2436],{"class":1731},[1241,25551,25552,25554,25556],{"class":1243,"line":2511},[1241,25553,2493],{"class":1724},[1241,25555,1728],{"class":1381},[1241,25557,2436],{"class":1731},[1241,25559,25560],{"class":1243,"line":2521},[1241,25561,1303],{"emptyLinePlaceholder":1302},[1241,25563,25564],{"class":1243,"line":2531},[1241,25565,25566],{"class":1247},"# Email configuration\n",[1241,25568,25569,25572,25574,25576,25579],{"class":1243,"line":2536},[1241,25570,25571],{"class":1724},"EMAIL_BACKEND",[1241,25573,1728],{"class":1381},[1241,25575,1822],{"class":1258},[1241,25577,25578],{"class":1262},"django.core.mail.backends.smtp.EmailBackend",[1241,25580,2264],{"class":1258},[1241,25582,25583,25586,25588,25590,25593],{"class":1243,"line":2542},[1241,25584,25585],{"class":1724},"EMAIL_HOST",[1241,25587,1728],{"class":1381},[1241,25589,1822],{"class":1258},[1241,25591,25592],{"class":1262},"smtp.mailgun.org",[1241,25594,2264],{"class":1258},[1241,25596,25597,25600,25602],{"class":1243,"line":2552},[1241,25598,25599],{"class":1724},"EMAIL_PORT",[1241,25601,1728],{"class":1381},[1241,25603,25604],{"class":2476}," 587\n",[1241,25606,25607,25610,25612],{"class":1243,"line":2569},[1241,25608,25609],{"class":1724},"EMAIL_USE_TLS",[1241,25611,1728],{"class":1381},[1241,25613,2436],{"class":1731},[1241,25615,25616,25619,25621,25623,25625,25627,25629,25631,25633,25635,25638,25640],{"class":1243,"line":2586},[1241,25617,25618],{"class":1724},"EMAIL_HOST_USER",[1241,25620,1728],{"class":1381},[1241,25622,1833],{"class":1692},[1241,25624,1773],{"class":1381},[1241,25626,1777],{"class":1776},[1241,25628,1773],{"class":1381},[1241,25630,1783],{"class":1782},[1241,25632,1786],{"class":1381},[1241,25634,1752],{"class":1258},[1241,25636,25637],{"class":1262},"MAILGUN_SMTP_LOGIN",[1241,25639,1752],{"class":1258},[1241,25641,2117],{"class":1381},[1241,25643,25644,25647,25649,25651,25653,25655,25657,25659,25661,25663,25666,25668],{"class":1243,"line":2600},[1241,25645,25646],{"class":1724},"EMAIL_HOST_PASSWORD",[1241,25648,1728],{"class":1381},[1241,25650,1833],{"class":1692},[1241,25652,1773],{"class":1381},[1241,25654,1777],{"class":1776},[1241,25656,1773],{"class":1381},[1241,25658,1783],{"class":1782},[1241,25660,1786],{"class":1381},[1241,25662,1752],{"class":1258},[1241,25664,25665],{"class":1262},"MAILGUN_SMTP_PASSWORD",[1241,25667,1752],{"class":1258},[1241,25669,2117],{"class":1381},[1241,25671,25672],{"class":1243,"line":2614},[1241,25673,1303],{"emptyLinePlaceholder":1302},[1241,25675,25676],{"class":1243,"line":2635},[1241,25677,25678],{"class":1247},"# Logging configuration\n",[1241,25680,25681,25683,25685],{"class":1243,"line":2656},[1241,25682,2545],{"class":1724},[1241,25684,1728],{"class":1381},[1241,25686,1566],{"class":1381},[1241,25688,25689,25691,25693,25695,25697,25699],{"class":1243,"line":2677},[1241,25690,1746],{"class":1258},[1241,25692,2557],{"class":1262},[1241,25694,1752],{"class":1258},[1241,25696,1397],{"class":1381},[1241,25698,2564],{"class":2476},[1241,25700,1407],{"class":1381},[1241,25702,25703,25705,25707,25709,25711,25713],{"class":1243,"line":2683},[1241,25704,1746],{"class":1258},[1241,25706,2574],{"class":1262},[1241,25708,1752],{"class":1258},[1241,25710,1397],{"class":1381},[1241,25712,2581],{"class":1731},[1241,25714,1407],{"class":1381},[1241,25716,25717,25719,25721,25723,25725],{"class":1243,"line":2697},[1241,25718,1746],{"class":1258},[1241,25720,2591],{"class":1262},[1241,25722,1752],{"class":1258},[1241,25724,1397],{"class":1381},[1241,25726,1566],{"class":1381},[1241,25728,25729,25731,25733,25735,25737],{"class":1243,"line":2716},[1241,25730,1854],{"class":1258},[1241,25732,2688],{"class":1262},[1241,25734,1752],{"class":1258},[1241,25736,1397],{"class":1381},[1241,25738,1566],{"class":1381},[1241,25740,25741,25743,25745,25747,25749,25751,25753,25755],{"class":1243,"line":2736},[1241,25742,1868],{"class":1258},[1241,25744,2640],{"class":1262},[1241,25746,1752],{"class":1258},[1241,25748,1397],{"class":1381},[1241,25750,1822],{"class":1258},[1241,25752,2729],{"class":1262},[1241,25754,1752],{"class":1258},[1241,25756,1407],{"class":1381},[1241,25758,25759],{"class":1243,"line":2741},[1241,25760,2680],{"class":1381},[1241,25762,25763],{"class":1243,"line":2747},[1241,25764,2744],{"class":1381},[1241,25766,25767,25769,25771,25773,25775],{"class":1243,"line":2761},[1241,25768,1746],{"class":1258},[1241,25770,5339],{"class":1262},[1241,25772,1752],{"class":1258},[1241,25774,1397],{"class":1381},[1241,25776,1566],{"class":1381},[1241,25778,25779,25781,25783,25785,25787,25789,25791,25793,25795],{"class":1243,"line":2775},[1241,25780,1854],{"class":1258},[1241,25782,2591],{"class":1262},[1241,25784,1752],{"class":1258},[1241,25786,1397],{"class":1381},[1241,25788,1598],{"class":1381},[1241,25790,1752],{"class":1258},[1241,25792,2688],{"class":1262},[1241,25794,1752],{"class":1258},[1241,25796,1914],{"class":1381},[1241,25798,25799,25801,25803,25805,25807,25809,25811,25813],{"class":1243,"line":2804},[1241,25800,1854],{"class":1258},[1241,25802,2619],{"class":1262},[1241,25804,1752],{"class":1258},[1241,25806,1397],{"class":1381},[1241,25808,1822],{"class":1258},[1241,25810,2628],{"class":1262},[1241,25812,1752],{"class":1258},[1241,25814,1407],{"class":1381},[1241,25816,25817],{"class":1243,"line":2823},[1241,25818,2744],{"class":1381},[1241,25820,25821,25823,25825,25827,25829],{"class":1243,"line":2840},[1241,25822,1746],{"class":1258},[1241,25824,2752],{"class":1262},[1241,25826,1752],{"class":1258},[1241,25828,1397],{"class":1381},[1241,25830,1566],{"class":1381},[1241,25832,25833,25835,25837,25839,25841],{"class":1243,"line":2845},[1241,25834,1854],{"class":1258},[1241,25836,2766],{"class":1262},[1241,25838,1752],{"class":1258},[1241,25840,1397],{"class":1381},[1241,25842,1566],{"class":1381},[1241,25844,25845,25847,25849,25851,25853,25855,25857,25859,25861],{"class":1243,"line":2850},[1241,25846,1868],{"class":1258},[1241,25848,2591],{"class":1262},[1241,25850,1752],{"class":1258},[1241,25852,1397],{"class":1381},[1241,25854,1598],{"class":1381},[1241,25856,1752],{"class":1258},[1241,25858,2688],{"class":1262},[1241,25860,1752],{"class":1258},[1241,25862,1914],{"class":1381},[1241,25864,25865,25867,25869,25871,25873,25875,25877,25879],{"class":1243,"line":3776},[1241,25866,1868],{"class":1258},[1241,25868,2619],{"class":1262},[1241,25870,1752],{"class":1258},[1241,25872,1397],{"class":1381},[1241,25874,1822],{"class":1258},[1241,25876,2628],{"class":1262},[1241,25878,1752],{"class":1258},[1241,25880,1407],{"class":1381},[1241,25882,25883,25885,25887,25889,25891,25893],{"class":1243,"line":3782},[1241,25884,1868],{"class":1258},[1241,25886,2828],{"class":1262},[1241,25888,1752],{"class":1258},[1241,25890,1397],{"class":1381},[1241,25892,2581],{"class":1731},[1241,25894,1407],{"class":1381},[1241,25896,25897],{"class":1243,"line":3789},[1241,25898,2680],{"class":1381},[1241,25900,25901],{"class":1243,"line":3796},[1241,25902,2744],{"class":1381},[1241,25904,25905],{"class":1243,"line":3811},[1241,25906,1648],{"class":1381},[1241,25908,25909],{"class":1243,"line":3826},[1241,25910,1303],{"emptyLinePlaceholder":1302},[1241,25912,25913],{"class":1243,"line":3841},[1241,25914,25915],{"class":1247},"# Apply Heroku-specific configurations\n",[1241,25917,25918,25921,25923,25926,25928,25931,25934,25937,25939,25941],{"class":1243,"line":3856},[1241,25919,25920],{"class":1692},"django_heroku",[1241,25922,1773],{"class":1381},[1241,25924,25925],{"class":1782},"settings",[1241,25927,1786],{"class":1381},[1241,25929,25930],{"class":7405},"locals",[1241,25932,25933],{"class":1381},"(),",[1241,25935,25936],{"class":24973}," staticfiles",[1241,25938,3003],{"class":1381},[1241,25940,3806],{"class":1731},[1241,25942,2117],{"class":1381},[1026,25944,25945],{},[1042,25946,25947],{},"Heroku Deployment Commands",[1128,25949,25951],{"className":1235,"code":25950,"language":1237,"meta":1137,"style":1137},"# Install Heroku CLI\ncurl https://cli-assets.heroku.com/install.sh | sh\n\n# Login to Heroku\nheroku login\n\n# Create Heroku app\nheroku create django-app-unique-name\n\n# Add buildpack\nheroku buildpacks:set heroku/python\n\n# Set environment variables\nheroku config:set DJANGO_SETTINGS_MODULE=myproject.settings.heroku\nheroku config:set SECRET_KEY=your-secret-key-here\nheroku config:set DEBUG=False\n\n# Add PostgreSQL addon\nheroku addons:create heroku-postgresql:mini\n\n# Add Redis addon\nheroku addons:create heroku-redis:mini\n\n# Add Mailgun addon\nheroku addons:create mailgun:starter\n\n# Deploy application\ngit push heroku main\n\n# Run migrations\nheroku run python manage.py migrate\n\n# Create superuser\nheroku run python manage.py createsuperuser\n\n# Scale dynos\nheroku ps:scale web=2 worker=1\n\n# View logs\nheroku logs --tail\n\n# Open application\nheroku open\n",[1135,25952,25953,25958,25970,25974,25979,25985,25989,25994,26003,26007,26012,26022,26026,26030,26040,26049,26058,26062,26067,26077,26081,26086,26095,26099,26104,26113,26117,26121,26132,26136,26141,26155,26159,26164,26177,26181,26186,26203,26207,26211,26220,26224,26228],{"__ignoreMap":1137},[1241,25954,25955],{"class":1243,"line":1244},[1241,25956,25957],{"class":1247},"# Install Heroku CLI\n",[1241,25959,25960,25962,25965,25967],{"class":1243,"line":1251},[1241,25961,1255],{"class":1254},[1241,25963,25964],{"class":1262}," https://cli-assets.heroku.com/install.sh",[1241,25966,7629],{"class":1709},[1241,25968,25969],{"class":1254}," sh\n",[1241,25971,25972],{"class":1243,"line":1281},[1241,25973,1303],{"emptyLinePlaceholder":1302},[1241,25975,25976],{"class":1243,"line":1290},[1241,25977,25978],{"class":1247},"# Login to Heroku\n",[1241,25980,25981,25983],{"class":1243,"line":1299},[1241,25982,24792],{"class":1254},[1241,25984,20806],{"class":1262},[1241,25986,25987],{"class":1243,"line":1306},[1241,25988,1303],{"emptyLinePlaceholder":1302},[1241,25990,25991],{"class":1243,"line":1312},[1241,25992,25993],{"class":1247},"# Create Heroku app\n",[1241,25995,25996,25998,26000],{"class":1243,"line":1321},[1241,25997,24792],{"class":1254},[1241,25999,3967],{"class":1262},[1241,26001,26002],{"class":1262}," django-app-unique-name\n",[1241,26004,26005],{"class":1243,"line":1327},[1241,26006,1303],{"emptyLinePlaceholder":1302},[1241,26008,26009],{"class":1243,"line":1333},[1241,26010,26011],{"class":1247},"# Add buildpack\n",[1241,26013,26014,26016,26019],{"class":1243,"line":1339},[1241,26015,24792],{"class":1254},[1241,26017,26018],{"class":1262}," buildpacks:set",[1241,26020,26021],{"class":1262}," heroku/python\n",[1241,26023,26024],{"class":1243,"line":1345},[1241,26025,1303],{"emptyLinePlaceholder":1302},[1241,26027,26028],{"class":1243,"line":1350},[1241,26029,4007],{"class":1247},[1241,26031,26032,26034,26037],{"class":1243,"line":1356},[1241,26033,24792],{"class":1254},[1241,26035,26036],{"class":1262}," config:set",[1241,26038,26039],{"class":1262}," DJANGO_SETTINGS_MODULE=myproject.settings.heroku\n",[1241,26041,26042,26044,26046],{"class":1243,"line":1554},[1241,26043,24792],{"class":1254},[1241,26045,26036],{"class":1262},[1241,26047,26048],{"class":1262}," SECRET_KEY=your-secret-key-here\n",[1241,26050,26051,26053,26055],{"class":1243,"line":1569},[1241,26052,24792],{"class":1254},[1241,26054,26036],{"class":1262},[1241,26056,26057],{"class":1262}," DEBUG=False\n",[1241,26059,26060],{"class":1243,"line":1584},[1241,26061,1303],{"emptyLinePlaceholder":1302},[1241,26063,26064],{"class":1243,"line":1621},[1241,26065,26066],{"class":1247},"# Add PostgreSQL addon\n",[1241,26068,26069,26071,26074],{"class":1243,"line":1627},[1241,26070,24792],{"class":1254},[1241,26072,26073],{"class":1262}," addons:create",[1241,26075,26076],{"class":1262}," heroku-postgresql:mini\n",[1241,26078,26079],{"class":1243,"line":1633},[1241,26080,1303],{"emptyLinePlaceholder":1302},[1241,26082,26083],{"class":1243,"line":1639},[1241,26084,26085],{"class":1247},"# Add Redis addon\n",[1241,26087,26088,26090,26092],{"class":1243,"line":1645},[1241,26089,24792],{"class":1254},[1241,26091,26073],{"class":1262},[1241,26093,26094],{"class":1262}," heroku-redis:mini\n",[1241,26096,26097],{"class":1243,"line":2028},[1241,26098,1303],{"emptyLinePlaceholder":1302},[1241,26100,26101],{"class":1243,"line":2042},[1241,26102,26103],{"class":1247},"# Add Mailgun addon\n",[1241,26105,26106,26108,26110],{"class":1243,"line":2064},[1241,26107,24792],{"class":1254},[1241,26109,26073],{"class":1262},[1241,26111,26112],{"class":1262}," mailgun:starter\n",[1241,26114,26115],{"class":1243,"line":2070},[1241,26116,1303],{"emptyLinePlaceholder":1302},[1241,26118,26119],{"class":1243,"line":2075},[1241,26120,3991],{"class":1247},[1241,26122,26123,26125,26127,26130],{"class":1243,"line":2080},[1241,26124,7580],{"class":1254},[1241,26126,7674],{"class":1262},[1241,26128,26129],{"class":1262}," heroku",[1241,26131,22275],{"class":1262},[1241,26133,26134],{"class":1243,"line":2085},[1241,26135,1303],{"emptyLinePlaceholder":1302},[1241,26137,26138],{"class":1243,"line":2091},[1241,26139,26140],{"class":1247},"# Run migrations\n",[1241,26142,26143,26145,26147,26150,26153],{"class":1243,"line":2120},[1241,26144,24792],{"class":1254},[1241,26146,17489],{"class":1262},[1241,26148,26149],{"class":1262}," python",[1241,26151,26152],{"class":1262}," manage.py",[1241,26154,24671],{"class":1262},[1241,26156,26157],{"class":1243,"line":2148},[1241,26158,1303],{"emptyLinePlaceholder":1302},[1241,26160,26161],{"class":1243,"line":2177},[1241,26162,26163],{"class":1247},"# Create superuser\n",[1241,26165,26166,26168,26170,26172,26174],{"class":1243,"line":2214},[1241,26167,24792],{"class":1254},[1241,26169,17489],{"class":1262},[1241,26171,26149],{"class":1262},[1241,26173,26152],{"class":1262},[1241,26175,26176],{"class":1262}," createsuperuser\n",[1241,26178,26179],{"class":1243,"line":2240},[1241,26180,1303],{"emptyLinePlaceholder":1302},[1241,26182,26183],{"class":1243,"line":2245},[1241,26184,26185],{"class":1247},"# Scale dynos\n",[1241,26187,26188,26190,26193,26196,26198,26201],{"class":1243,"line":2251},[1241,26189,24792],{"class":1254},[1241,26191,26192],{"class":1262}," ps:scale",[1241,26194,26195],{"class":1262}," web=",[1241,26197,16713],{"class":2476},[1241,26199,26200],{"class":1262}," worker=",[1241,26202,24802],{"class":2476},[1241,26204,26205],{"class":1243,"line":2267},[1241,26206,1303],{"emptyLinePlaceholder":1302},[1241,26208,26209],{"class":1243,"line":2289},[1241,26210,4045],{"class":1247},[1241,26212,26213,26215,26217],{"class":1243,"line":2294},[1241,26214,24792],{"class":1254},[1241,26216,15678],{"class":1262},[1241,26218,26219],{"class":1269}," --tail\n",[1241,26221,26222],{"class":1243,"line":2300},[1241,26223,1303],{"emptyLinePlaceholder":1302},[1241,26225,26226],{"class":1243,"line":2314},[1241,26227,15696],{"class":1247},[1241,26229,26230,26232],{"class":1243,"line":2335},[1241,26231,24792],{"class":1254},[1241,26233,4036],{"class":1262},[1026,26235,26236],{},[1042,26237,26238],{},"Heroku Review Apps Configuration",[1128,26240,26242],{"className":1372,"code":26241,"language":1374,"meta":1137,"style":1137},"{\n  \"environments\": {\n    \"review\": {\n      \"addons\": [\n        \"heroku-postgresql:mini\",\n        \"heroku-redis:mini\"\n      ],\n      \"buildpacks\": [\n        {\n          \"url\": \"heroku/python\"\n        }\n      ],\n      \"env\": {\n        \"DJANGO_SETTINGS_MODULE\": \"myproject.settings.heroku\",\n        \"DEBUG\": \"False\"\n      },\n      \"formation\": {\n        \"web\": {\n          \"quantity\": 1,\n          \"size\": \"basic\"\n        }\n      },\n      \"scripts\": {\n        \"postdeploy\": \"python manage.py migrate && python manage.py loaddata fixtures/sample_data.json\"\n      }\n    }\n  }\n}\n",[1135,26243,26244,26248,26261,26274,26287,26298,26307,26311,26324,26328,26345,26349,26353,26366,26385,26401,26405,26418,26430,26445,26463,26467,26471,26484,26502,26506,26510,26514],{"__ignoreMap":1137},[1241,26245,26246],{"class":1243,"line":1244},[1241,26247,1382],{"class":1381},[1241,26249,26250,26252,26255,26257,26259],{"class":1243,"line":1251},[1241,26251,1388],{"class":1387},[1241,26253,26254],{"class":1391},"environments",[1241,26256,1266],{"class":1387},[1241,26258,1397],{"class":1381},[1241,26260,1566],{"class":1381},[1241,26262,26263,26265,26268,26270,26272],{"class":1243,"line":1281},[1241,26264,4293],{"class":1387},[1241,26266,26267],{"class":1434},"review",[1241,26269,1266],{"class":1387},[1241,26271,1397],{"class":1381},[1241,26273,1566],{"class":1381},[1241,26275,26276,26278,26281,26283,26285],{"class":1243,"line":1290},[1241,26277,1431],{"class":1387},[1241,26279,26280],{"class":1574},"addons",[1241,26282,1266],{"class":1387},[1241,26284,1397],{"class":1381},[1241,26286,1421],{"class":1381},[1241,26288,26289,26291,26294,26296],{"class":1243,"line":1299},[1241,26290,1466],{"class":1258},[1241,26292,26293],{"class":1262},"heroku-postgresql:mini",[1241,26295,1266],{"class":1258},[1241,26297,1407],{"class":1381},[1241,26299,26300,26302,26305],{"class":1243,"line":1306},[1241,26301,1466],{"class":1258},[1241,26303,26304],{"class":1262},"heroku-redis:mini",[1241,26306,1278],{"class":1258},[1241,26308,26309],{"class":1243,"line":1312},[1241,26310,1531],{"class":1381},[1241,26312,26313,26315,26318,26320,26322],{"class":1243,"line":1321},[1241,26314,1431],{"class":1387},[1241,26316,26317],{"class":1574},"buildpacks",[1241,26319,1266],{"class":1387},[1241,26321,1397],{"class":1381},[1241,26323,1421],{"class":1381},[1241,26325,26326],{"class":1243,"line":1327},[1241,26327,5611],{"class":1381},[1241,26329,26330,26332,26334,26336,26338,26340,26343],{"class":1243,"line":1333},[1241,26331,1587],{"class":1387},[1241,26333,24733],{"class":1590},[1241,26335,1266],{"class":1387},[1241,26337,1397],{"class":1381},[1241,26339,1259],{"class":1258},[1241,26341,26342],{"class":1262},"heroku/python",[1241,26344,1278],{"class":1258},[1241,26346,26347],{"class":1243,"line":1339},[1241,26348,1624],{"class":1381},[1241,26350,26351],{"class":1243,"line":1345},[1241,26352,1531],{"class":1381},[1241,26354,26355,26357,26360,26362,26364],{"class":1243,"line":1350},[1241,26356,1431],{"class":1387},[1241,26358,26359],{"class":1574},"env",[1241,26361,1266],{"class":1387},[1241,26363,1397],{"class":1381},[1241,26365,1566],{"class":1381},[1241,26367,26368,26370,26372,26374,26376,26378,26381,26383],{"class":1243,"line":1356},[1241,26369,1466],{"class":1387},[1241,26371,2956],{"class":1590},[1241,26373,1266],{"class":1387},[1241,26375,1397],{"class":1381},[1241,26377,1259],{"class":1258},[1241,26379,26380],{"class":1262},"myproject.settings.heroku",[1241,26382,1266],{"class":1258},[1241,26384,1407],{"class":1381},[1241,26386,26387,26389,26391,26393,26395,26397,26399],{"class":1243,"line":1554},[1241,26388,1466],{"class":1387},[1241,26390,1725],{"class":1590},[1241,26392,1266],{"class":1387},[1241,26394,1397],{"class":1381},[1241,26396,1259],{"class":1258},[1241,26398,3806],{"class":1262},[1241,26400,1278],{"class":1258},[1241,26402,26403],{"class":1243,"line":1569},[1241,26404,6051],{"class":1381},[1241,26406,26407,26409,26412,26414,26416],{"class":1243,"line":1584},[1241,26408,1431],{"class":1387},[1241,26410,26411],{"class":1574},"formation",[1241,26413,1266],{"class":1387},[1241,26415,1397],{"class":1381},[1241,26417,1566],{"class":1381},[1241,26419,26420,26422,26424,26426,26428],{"class":1243,"line":1621},[1241,26421,1466],{"class":1387},[1241,26423,24566],{"class":1590},[1241,26425,1266],{"class":1387},[1241,26427,1397],{"class":1381},[1241,26429,1566],{"class":1381},[1241,26431,26432,26434,26437,26439,26441,26443],{"class":1243,"line":1627},[1241,26433,1587],{"class":1387},[1241,26435,26436],{"class":24018},"quantity",[1241,26438,1266],{"class":1387},[1241,26440,1397],{"class":1381},[1241,26442,2564],{"class":2476},[1241,26444,1407],{"class":1381},[1241,26446,26447,26449,26452,26454,26456,26458,26461],{"class":1243,"line":1633},[1241,26448,1587],{"class":1387},[1241,26450,26451],{"class":24018},"size",[1241,26453,1266],{"class":1387},[1241,26455,1397],{"class":1381},[1241,26457,1259],{"class":1258},[1241,26459,26460],{"class":1262},"basic",[1241,26462,1278],{"class":1258},[1241,26464,26465],{"class":1243,"line":1639},[1241,26466,1624],{"class":1381},[1241,26468,26469],{"class":1243,"line":1645},[1241,26470,6051],{"class":1381},[1241,26472,26473,26475,26478,26480,26482],{"class":1243,"line":2028},[1241,26474,1431],{"class":1387},[1241,26476,26477],{"class":1574},"scripts",[1241,26479,1266],{"class":1387},[1241,26481,1397],{"class":1381},[1241,26483,1566],{"class":1381},[1241,26485,26486,26488,26491,26493,26495,26497,26500],{"class":1243,"line":2042},[1241,26487,1466],{"class":1387},[1241,26489,26490],{"class":1590},"postdeploy",[1241,26492,1266],{"class":1387},[1241,26494,1397],{"class":1381},[1241,26496,1259],{"class":1258},[1241,26498,26499],{"class":1262},"python manage.py migrate && python manage.py loaddata fixtures/sample_data.json",[1241,26501,1278],{"class":1258},[1241,26503,26504],{"class":1243,"line":2064},[1241,26505,1630],{"class":1381},[1241,26507,26508],{"class":1243,"line":2070},[1241,26509,1636],{"class":1381},[1241,26511,26512],{"class":1243,"line":2075},[1241,26513,19592],{"class":1381},[1241,26515,26516],{"class":1243,"line":2080},[1241,26517,1648],{"class":1381},[1128,26519,26521],{"className":1674,"code":26520,"language":1676,"meta":1137,"style":1137},"# settings/heroku.py\nimport os\nimport dj_database_url\nfrom .base import *\n\n# Heroku-specific settings\nDEBUG = False\nALLOWED_HOSTS = ['.herokuapp.com', 'yourdomain.com']\n\n# Database\nDATABASES = {\n    'default': dj_database_url.config(\n        default=os.environ.get('DATABASE_URL'),\n        conn_max_age=600,\n        conn_health_checks=True,\n    )\n}\n\n# Static files\nSTATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'\nSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')\n\n# Security\nSECURE_SSL_REDIRECT = True\nSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')\n\n# Logging\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'console': {\n            'class': 'logging.StreamHandler',\n        },\n    },\n    'root': {\n        'handlers': ['console'],\n    },\n}\n",[1135,26522,26523,26527,26533,26539,26551,26555,26559,26567,26592,26596,26601,26609,26627,26653,26663,26673,26677,26681,26685,26689,26701,26731,26735,26739,26747,26771,26775,26780,26788,26802,26816,26828,26840,26858,26862,26866,26878,26898,26902],{"__ignoreMap":1137},[1241,26524,26525],{"class":1243,"line":1244},[1241,26526,24864],{"class":1247},[1241,26528,26529,26531],{"class":1243,"line":1251},[1241,26530,1689],{"class":1688},[1241,26532,1693],{"class":1692},[1241,26534,26535,26537],{"class":1243,"line":1281},[1241,26536,1689],{"class":1688},[1241,26538,24877],{"class":1692},[1241,26540,26541,26543,26545,26547,26549],{"class":1243,"line":1290},[1241,26542,1698],{"class":1688},[1241,26544,1701],{"class":1381},[1241,26546,1704],{"class":1692},[1241,26548,1689],{"class":1688},[1241,26550,1710],{"class":1709},[1241,26552,26553],{"class":1243,"line":1299},[1241,26554,1303],{"emptyLinePlaceholder":1302},[1241,26556,26557],{"class":1243,"line":1306},[1241,26558,24905],{"class":1247},[1241,26560,26561,26563,26565],{"class":1243,"line":1312},[1241,26562,1725],{"class":1724},[1241,26564,1728],{"class":1381},[1241,26566,1732],{"class":1731},[1241,26568,26569,26571,26573,26575,26577,26579,26581,26583,26585,26588,26590],{"class":1243,"line":1321},[1241,26570,1737],{"class":1724},[1241,26572,1728],{"class":1381},[1241,26574,1598],{"class":1381},[1241,26576,1752],{"class":1258},[1241,26578,24926],{"class":1262},[1241,26580,1752],{"class":1258},[1241,26582,1608],{"class":1381},[1241,26584,1822],{"class":1258},[1241,26586,26587],{"class":1262},"yourdomain.com",[1241,26589,1752],{"class":1258},[1241,26591,1618],{"class":1381},[1241,26593,26594],{"class":1243,"line":1327},[1241,26595,1303],{"emptyLinePlaceholder":1302},[1241,26597,26598],{"class":1243,"line":1333},[1241,26599,26600],{"class":1247},"# Database\n",[1241,26602,26603,26605,26607],{"class":1243,"line":1339},[1241,26604,4785],{"class":1724},[1241,26606,1728],{"class":1381},[1241,26608,1566],{"class":1381},[1241,26610,26611,26613,26615,26617,26619,26621,26623,26625],{"class":1243,"line":1345},[1241,26612,1746],{"class":1258},[1241,26614,1857],{"class":1262},[1241,26616,1752],{"class":1258},[1241,26618,1397],{"class":1381},[1241,26620,24960],{"class":1692},[1241,26622,1773],{"class":1381},[1241,26624,24965],{"class":1782},[1241,26626,24968],{"class":1381},[1241,26628,26629,26631,26633,26635,26637,26639,26641,26643,26645,26647,26649,26651],{"class":1243,"line":1350},[1241,26630,24974],{"class":24973},[1241,26632,3003],{"class":1381},[1241,26634,2940],{"class":1782},[1241,26636,1773],{"class":1381},[1241,26638,1777],{"class":1776},[1241,26640,1773],{"class":1381},[1241,26642,1783],{"class":1782},[1241,26644,1786],{"class":1381},[1241,26646,1752],{"class":1258},[1241,26648,5847],{"class":1262},[1241,26650,1752],{"class":1258},[1241,26652,1801],{"class":1381},[1241,26654,26655,26657,26659,26661],{"class":1243,"line":1356},[1241,26656,25001],{"class":24973},[1241,26658,3003],{"class":1381},[1241,26660,25006],{"class":2476},[1241,26662,1407],{"class":1381},[1241,26664,26665,26667,26669,26671],{"class":1243,"line":1554},[1241,26666,25013],{"class":24973},[1241,26668,3003],{"class":1381},[1241,26670,3911],{"class":1731},[1241,26672,1407],{"class":1381},[1241,26674,26675],{"class":1243,"line":1569},[1241,26676,25035],{"class":1381},[1241,26678,26679],{"class":1243,"line":1584},[1241,26680,1648],{"class":1381},[1241,26682,26683],{"class":1243,"line":1621},[1241,26684,1303],{"emptyLinePlaceholder":1302},[1241,26686,26687],{"class":1243,"line":1627},[1241,26688,9403],{"class":1247},[1241,26690,26691,26693,26695,26697,26699],{"class":1243,"line":1633},[1241,26692,2254],{"class":1724},[1241,26694,1728],{"class":1381},[1241,26696,1822],{"class":1258},[1241,26698,25083],{"class":1262},[1241,26700,2264],{"class":1258},[1241,26702,26703,26705,26707,26709,26711,26713,26715,26717,26719,26721,26723,26725,26727,26729],{"class":1243,"line":1639},[1241,26704,25090],{"class":1724},[1241,26706,1728],{"class":1381},[1241,26708,1833],{"class":1692},[1241,26710,1773],{"class":1381},[1241,26712,2899],{"class":1776},[1241,26714,1773],{"class":1381},[1241,26716,25103],{"class":1782},[1241,26718,1786],{"class":1381},[1241,26720,25109],{"class":25108},[1241,26722,1608],{"class":1381},[1241,26724,1822],{"class":1258},[1241,26726,25116],{"class":1262},[1241,26728,1752],{"class":1258},[1241,26730,2117],{"class":1381},[1241,26732,26733],{"class":1243,"line":1645},[1241,26734,1303],{"emptyLinePlaceholder":1302},[1241,26736,26737],{"class":1243,"line":2028},[1241,26738,18207],{"class":1247},[1241,26740,26741,26743,26745],{"class":1243,"line":2042},[1241,26742,2431],{"class":1724},[1241,26744,1728],{"class":1381},[1241,26746,2436],{"class":1731},[1241,26748,26749,26751,26753,26755,26757,26759,26761,26763,26765,26767,26769],{"class":1243,"line":2064},[1241,26750,2442],{"class":1724},[1241,26752,1728],{"class":1381},[1241,26754,2447],{"class":1381},[1241,26756,1752],{"class":1258},[1241,26758,2452],{"class":1262},[1241,26760,1752],{"class":1258},[1241,26762,1608],{"class":1381},[1241,26764,1822],{"class":1258},[1241,26766,2461],{"class":1262},[1241,26768,1752],{"class":1258},[1241,26770,2117],{"class":1381},[1241,26772,26773],{"class":1243,"line":2070},[1241,26774,1303],{"emptyLinePlaceholder":1302},[1241,26776,26777],{"class":1243,"line":2075},[1241,26778,26779],{"class":1247},"# Logging\n",[1241,26781,26782,26784,26786],{"class":1243,"line":2080},[1241,26783,2545],{"class":1724},[1241,26785,1728],{"class":1381},[1241,26787,1566],{"class":1381},[1241,26789,26790,26792,26794,26796,26798,26800],{"class":1243,"line":2085},[1241,26791,1746],{"class":1258},[1241,26793,2557],{"class":1262},[1241,26795,1752],{"class":1258},[1241,26797,1397],{"class":1381},[1241,26799,2564],{"class":2476},[1241,26801,1407],{"class":1381},[1241,26803,26804,26806,26808,26810,26812,26814],{"class":1243,"line":2091},[1241,26805,1746],{"class":1258},[1241,26807,2574],{"class":1262},[1241,26809,1752],{"class":1258},[1241,26811,1397],{"class":1381},[1241,26813,2581],{"class":1731},[1241,26815,1407],{"class":1381},[1241,26817,26818,26820,26822,26824,26826],{"class":1243,"line":2120},[1241,26819,1746],{"class":1258},[1241,26821,2591],{"class":1262},[1241,26823,1752],{"class":1258},[1241,26825,1397],{"class":1381},[1241,26827,1566],{"class":1381},[1241,26829,26830,26832,26834,26836,26838],{"class":1243,"line":2148},[1241,26831,1854],{"class":1258},[1241,26833,2688],{"class":1262},[1241,26835,1752],{"class":1258},[1241,26837,1397],{"class":1381},[1241,26839,1566],{"class":1381},[1241,26841,26842,26844,26846,26848,26850,26852,26854,26856],{"class":1243,"line":2177},[1241,26843,1868],{"class":1258},[1241,26845,2640],{"class":1262},[1241,26847,1752],{"class":1258},[1241,26849,1397],{"class":1381},[1241,26851,1822],{"class":1258},[1241,26853,2729],{"class":1262},[1241,26855,1752],{"class":1258},[1241,26857,1407],{"class":1381},[1241,26859,26860],{"class":1243,"line":2214},[1241,26861,2680],{"class":1381},[1241,26863,26864],{"class":1243,"line":2240},[1241,26865,2744],{"class":1381},[1241,26867,26868,26870,26872,26874,26876],{"class":1243,"line":2245},[1241,26869,1746],{"class":1258},[1241,26871,5339],{"class":1262},[1241,26873,1752],{"class":1258},[1241,26875,1397],{"class":1381},[1241,26877,1566],{"class":1381},[1241,26879,26880,26882,26884,26886,26888,26890,26892,26894,26896],{"class":1243,"line":2251},[1241,26881,1854],{"class":1258},[1241,26883,2591],{"class":1262},[1241,26885,1752],{"class":1258},[1241,26887,1397],{"class":1381},[1241,26889,1598],{"class":1381},[1241,26891,1752],{"class":1258},[1241,26893,2688],{"class":1262},[1241,26895,1752],{"class":1258},[1241,26897,1914],{"class":1381},[1241,26899,26900],{"class":1243,"line":2267},[1241,26901,2744],{"class":1381},[1241,26903,26904],{"class":1243,"line":2289},[1241,26905,1648],{"class":1381},[1035,26907,26909],{"id":26908},"render-deployment","Render Deployment",[1026,26911,26912],{},"Render is a modern cloud platform that offers simple deployment with automatic SSL, global CDN, and built-in CI/CD.",[1026,26914,26915],{},[1042,26916,26917],{},"Render Configuration",[1128,26919,26921],{"className":3017,"code":26920,"language":3019,"meta":1137,"style":1137},"# render.yaml\nservices:\n  - type: web\n    name: django-app\n    env: python\n    plan: starter\n    buildCommand: \"./build.sh\"\n    startCommand: \"gunicorn myproject.wsgi:application\"\n    envVars:\n      - key: DJANGO_SETTINGS_MODULE\n        value: myproject.settings.production\n      - key: SECRET_KEY\n        generateValue: true\n      - key: DATABASE_URL\n        fromDatabase:\n          name: django-db\n          property: connectionString\n      - key: REDIS_URL\n        fromService:\n          type: redis\n          name: django-redis\n          property: connectionString\n\ndatabases:\n  - name: django-db\n    plan: starter\n\nservices:\n  - type: redis\n    name: django-redis\n    plan: starter\n",[1135,26922,26923,26928,26935,26947,26956,26966,26976,26990,27004,27011,27022,27031,27041,27050,27060,27067,27077,27087,27098,27105,27114,27123,27131,27135,27142,27152,27160,27164,27170,27180,27188],{"__ignoreMap":1137},[1241,26924,26925],{"class":1243,"line":1244},[1241,26926,26927],{"class":1247},"# render.yaml\n",[1241,26929,26930,26933],{"class":1243,"line":1251},[1241,26931,26932],{"class":1590},"services",[1241,26934,1840],{"class":1381},[1241,26936,26937,26939,26942,26944],{"class":1243,"line":1281},[1241,26938,16374],{"class":1381},[1241,26940,26941],{"class":1590}," type",[1241,26943,1397],{"class":1381},[1241,26945,26946],{"class":1262}," web\n",[1241,26948,26949,26952,26954],{"class":1243,"line":1290},[1241,26950,26951],{"class":1590},"    name",[1241,26953,1397],{"class":1381},[1241,26955,4152],{"class":1262},[1241,26957,26958,26961,26963],{"class":1243,"line":1299},[1241,26959,26960],{"class":1590},"    env",[1241,26962,1397],{"class":1381},[1241,26964,26965],{"class":1262}," python\n",[1241,26967,26968,26971,26973],{"class":1243,"line":1306},[1241,26969,26970],{"class":1590},"    plan",[1241,26972,1397],{"class":1381},[1241,26974,26975],{"class":1262}," starter\n",[1241,26977,26978,26981,26983,26985,26988],{"class":1243,"line":1312},[1241,26979,26980],{"class":1590},"    buildCommand",[1241,26982,1397],{"class":1381},[1241,26984,1259],{"class":1258},[1241,26986,26987],{"class":1262},"./build.sh",[1241,26989,1278],{"class":1258},[1241,26991,26992,26995,26997,26999,27002],{"class":1243,"line":1321},[1241,26993,26994],{"class":1590},"    startCommand",[1241,26996,1397],{"class":1381},[1241,26998,1259],{"class":1258},[1241,27000,27001],{"class":1262},"gunicorn myproject.wsgi:application",[1241,27003,1278],{"class":1258},[1241,27005,27006,27009],{"class":1243,"line":1327},[1241,27007,27008],{"class":1590},"    envVars",[1241,27010,1840],{"class":1381},[1241,27012,27013,27015,27018,27020],{"class":1243,"line":1333},[1241,27014,17168],{"class":1381},[1241,27016,27017],{"class":1590}," key",[1241,27019,1397],{"class":1381},[1241,27021,17212],{"class":1262},[1241,27023,27024,27027,27029],{"class":1243,"line":1339},[1241,27025,27026],{"class":1590},"        value",[1241,27028,1397],{"class":1381},[1241,27030,3136],{"class":1262},[1241,27032,27033,27035,27037,27039],{"class":1243,"line":1345},[1241,27034,17168],{"class":1381},[1241,27036,27017],{"class":1590},[1241,27038,1397],{"class":1381},[1241,27040,17277],{"class":1262},[1241,27042,27043,27046,27048],{"class":1243,"line":1350},[1241,27044,27045],{"class":1590},"        generateValue",[1241,27047,1397],{"class":1381},[1241,27049,3228],{"class":3227},[1241,27051,27052,27054,27056,27058],{"class":1243,"line":1356},[1241,27053,17168],{"class":1381},[1241,27055,27017],{"class":1590},[1241,27057,1397],{"class":1381},[1241,27059,17232],{"class":1262},[1241,27061,27062,27065],{"class":1243,"line":1554},[1241,27063,27064],{"class":1590},"        fromDatabase",[1241,27066,1840],{"class":1381},[1241,27068,27069,27072,27074],{"class":1243,"line":1569},[1241,27070,27071],{"class":1590},"          name",[1241,27073,1397],{"class":1381},[1241,27075,27076],{"class":1262}," django-db\n",[1241,27078,27079,27082,27084],{"class":1243,"line":1584},[1241,27080,27081],{"class":1590},"          property",[1241,27083,1397],{"class":1381},[1241,27085,27086],{"class":1262}," connectionString\n",[1241,27088,27089,27091,27093,27095],{"class":1243,"line":1621},[1241,27090,17168],{"class":1381},[1241,27092,27017],{"class":1590},[1241,27094,1397],{"class":1381},[1241,27096,27097],{"class":1262}," REDIS_URL\n",[1241,27099,27100,27103],{"class":1243,"line":1627},[1241,27101,27102],{"class":1590},"        fromService",[1241,27104,1840],{"class":1381},[1241,27106,27107,27110,27112],{"class":1243,"line":1633},[1241,27108,27109],{"class":1590},"          type",[1241,27111,1397],{"class":1381},[1241,27113,12012],{"class":1262},[1241,27115,27116,27118,27120],{"class":1243,"line":1639},[1241,27117,27071],{"class":1590},[1241,27119,1397],{"class":1381},[1241,27121,27122],{"class":1262}," django-redis\n",[1241,27124,27125,27127,27129],{"class":1243,"line":1645},[1241,27126,27081],{"class":1590},[1241,27128,1397],{"class":1381},[1241,27130,27086],{"class":1262},[1241,27132,27133],{"class":1243,"line":2028},[1241,27134,1303],{"emptyLinePlaceholder":1302},[1241,27136,27137,27140],{"class":1243,"line":2042},[1241,27138,27139],{"class":1590},"databases",[1241,27141,1840],{"class":1381},[1241,27143,27144,27146,27148,27150],{"class":1243,"line":2064},[1241,27145,16374],{"class":1381},[1241,27147,16377],{"class":1590},[1241,27149,1397],{"class":1381},[1241,27151,27076],{"class":1262},[1241,27153,27154,27156,27158],{"class":1243,"line":2070},[1241,27155,26970],{"class":1590},[1241,27157,1397],{"class":1381},[1241,27159,26975],{"class":1262},[1241,27161,27162],{"class":1243,"line":2075},[1241,27163,1303],{"emptyLinePlaceholder":1302},[1241,27165,27166,27168],{"class":1243,"line":2080},[1241,27167,26932],{"class":1590},[1241,27169,1840],{"class":1381},[1241,27171,27172,27174,27176,27178],{"class":1243,"line":2085},[1241,27173,16374],{"class":1381},[1241,27175,26941],{"class":1590},[1241,27177,1397],{"class":1381},[1241,27179,12012],{"class":1262},[1241,27181,27182,27184,27186],{"class":1243,"line":2091},[1241,27183,26951],{"class":1590},[1241,27185,1397],{"class":1381},[1241,27187,27122],{"class":1262},[1241,27189,27190,27192,27194],{"class":1243,"line":2120},[1241,27191,26970],{"class":1590},[1241,27193,1397],{"class":1381},[1241,27195,26975],{"class":1262},[1026,27197,27198],{},[1042,27199,27200],{},"Build Script for Render",[1128,27202,27204],{"className":1235,"code":27203,"language":1237,"meta":1137,"style":1137},"#!/usr/bin/env bash\n# build.sh\n\nset -o errexit\n\npip install -r requirements.txt\n\npython manage.py collectstatic --clear --no-input\npython manage.py migrate\n",[1135,27205,27206,27211,27216,27220,27229,27233,27246,27250,27265],{"__ignoreMap":1137},[1241,27207,27208],{"class":1243,"line":1244},[1241,27209,27210],{"class":1247},"#!/usr/bin/env bash\n",[1241,27212,27213],{"class":1243,"line":1251},[1241,27214,27215],{"class":1247},"# build.sh\n",[1241,27217,27218],{"class":1243,"line":1281},[1241,27219,1303],{"emptyLinePlaceholder":1302},[1241,27221,27222,27224,27226],{"class":1243,"line":1290},[1241,27223,7406],{"class":7405},[1241,27225,1270],{"class":1269},[1241,27227,27228],{"class":1262}," errexit\n",[1241,27230,27231],{"class":1243,"line":1299},[1241,27232,1303],{"emptyLinePlaceholder":1302},[1241,27234,27235,27238,27240,27243],{"class":1243,"line":1306},[1241,27236,27237],{"class":1254},"pip",[1241,27239,20786],{"class":1262},[1241,27241,27242],{"class":1269}," -r",[1241,27244,27245],{"class":1262}," requirements.txt\n",[1241,27247,27248],{"class":1243,"line":1312},[1241,27249,1303],{"emptyLinePlaceholder":1302},[1241,27251,27252,27254,27256,27259,27262],{"class":1243,"line":1321},[1241,27253,1676],{"class":1254},[1241,27255,26152],{"class":1262},[1241,27257,27258],{"class":1262}," collectstatic",[1241,27260,27261],{"class":1269}," --clear",[1241,27263,27264],{"class":1269}," --no-input\n",[1241,27266,27267,27269,27271],{"class":1243,"line":1327},[1241,27268,1676],{"class":1254},[1241,27270,26152],{"class":1262},[1241,27272,24671],{"class":1262},[1035,27274,27276],{"id":27275},"railway-deployment","Railway Deployment",[1026,27278,27279],{},"Railway provides a developer-focused platform with automatic deployments from Git repositories.",[1026,27281,27282],{},[1042,27283,27284],{},"Railway Configuration",[1128,27286,27290],{"className":27287,"code":27288,"language":27289,"meta":1137,"style":1137},"language-toml shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# railway.toml\n[build]\nbuilder = \"NIXPACKS\"\nbuildCommand = \"python -m pip install -r requirements.txt && python manage.py collectstatic --noinput\"\n\n[deploy]\nhealthcheckPath = \"/health/\"\nhealthcheckTimeout = 300\nrestartPolicyType = \"ON_FAILURE\"\nrestartPolicyMaxRetries = 10\nstartCommand = \"gunicorn myproject.wsgi:application --bind 0.0.0.0:$PORT\"\n\n[environments.production]\nvariables = { \n  DJANGO_SETTINGS_MODULE = \"myproject.settings.production\",\n  DEBUG = \"False\"\n}\n","toml",[1135,27291,27292,27297,27305,27319,27333,27337,27345,27359,27368,27382,27391,27405,27409,27421,27432,27446,27459],{"__ignoreMap":1137},[1241,27293,27294],{"class":1243,"line":1244},[1241,27295,27296],{"class":1247},"# railway.toml\n",[1241,27298,27299,27301,27303],{"class":1243,"line":1251},[1241,27300,1904],{"class":1381},[1241,27302,16400],{"class":1254},[1241,27304,1618],{"class":1381},[1241,27306,27307,27310,27312,27314,27317],{"class":1243,"line":1281},[1241,27308,27309],{"class":7423},"builder",[1241,27311,1728],{"class":1381},[1241,27313,1259],{"class":1258},[1241,27315,27316],{"class":1262},"NIXPACKS",[1241,27318,1278],{"class":1258},[1241,27320,27321,27324,27326,27328,27331],{"class":1243,"line":1290},[1241,27322,27323],{"class":7423},"buildCommand",[1241,27325,1728],{"class":1381},[1241,27327,1259],{"class":1258},[1241,27329,27330],{"class":1262},"python -m pip install -r requirements.txt && python manage.py collectstatic --noinput",[1241,27332,1278],{"class":1258},[1241,27334,27335],{"class":1243,"line":1299},[1241,27336,1303],{"emptyLinePlaceholder":1302},[1241,27338,27339,27341,27343],{"class":1243,"line":1306},[1241,27340,1904],{"class":1381},[1241,27342,16539],{"class":1254},[1241,27344,1618],{"class":1381},[1241,27346,27347,27350,27352,27354,27357],{"class":1243,"line":1312},[1241,27348,27349],{"class":7423},"healthcheckPath",[1241,27351,1728],{"class":1381},[1241,27353,1259],{"class":1258},[1241,27355,27356],{"class":1262},"/health/",[1241,27358,1278],{"class":1258},[1241,27360,27361,27364,27366],{"class":1243,"line":1321},[1241,27362,27363],{"class":7423},"healthcheckTimeout",[1241,27365,1728],{"class":1381},[1241,27367,3433],{"class":2476},[1241,27369,27370,27373,27375,27377,27380],{"class":1243,"line":1327},[1241,27371,27372],{"class":7423},"restartPolicyType",[1241,27374,1728],{"class":1381},[1241,27376,1259],{"class":1258},[1241,27378,27379],{"class":1262},"ON_FAILURE",[1241,27381,1278],{"class":1258},[1241,27383,27384,27387,27389],{"class":1243,"line":1333},[1241,27385,27386],{"class":7423},"restartPolicyMaxRetries",[1241,27388,1728],{"class":1381},[1241,27390,3423],{"class":2476},[1241,27392,27393,27396,27398,27400,27403],{"class":1243,"line":1339},[1241,27394,27395],{"class":7423},"startCommand",[1241,27397,1728],{"class":1381},[1241,27399,1259],{"class":1258},[1241,27401,27402],{"class":1262},"gunicorn myproject.wsgi:application --bind 0.0.0.0:$PORT",[1241,27404,1278],{"class":1258},[1241,27406,27407],{"class":1243,"line":1345},[1241,27408,1303],{"emptyLinePlaceholder":1302},[1241,27410,27411,27413,27415,27417,27419],{"class":1243,"line":1350},[1241,27412,1904],{"class":1381},[1241,27414,26254],{"class":1254},[1241,27416,1773],{"class":1692},[1241,27418,4296],{"class":1254},[1241,27420,1618],{"class":1381},[1241,27422,27423,27425,27427,27429],{"class":1243,"line":1356},[1241,27424,22284],{"class":7423},[1241,27426,1728],{"class":1381},[1241,27428,3700],{"class":1381},[1241,27430,27431],{"class":1692}," \n",[1241,27433,27434,27436,27438,27440,27442,27444],{"class":1243,"line":1554},[1241,27435,13750],{"class":7423},[1241,27437,1728],{"class":1381},[1241,27439,1259],{"class":1258},[1241,27441,2965],{"class":1262},[1241,27443,1266],{"class":1258},[1241,27445,1407],{"class":1381},[1241,27447,27448,27451,27453,27455,27457],{"class":1243,"line":1569},[1241,27449,27450],{"class":7423},"  DEBUG",[1241,27452,1728],{"class":1381},[1241,27454,1259],{"class":1258},[1241,27456,3806],{"class":1262},[1241,27458,1278],{"class":1258},[1241,27460,27461],{"class":1243,"line":1584},[1241,27462,1648],{"class":1381},[1026,27464,27465],{},[1042,27466,27467],{},"Railway Deployment Process",[1128,27469,27471],{"className":1235,"code":27470,"language":1237,"meta":1137,"style":1137},"# Install Railway CLI\nnpm install -g @railway/cli\n\n# Login to Railway\nrailway login\n\n# Initialize project\nrailway init\n\n# Link to existing project\nrailway link\n\n# Deploy\nrailway up\n\n# Add environment variables\nrailway variables set DJANGO_SETTINGS_MODULE=myproject.settings.production\nrailway variables set SECRET_KEY=your-secret-key\n\n# Add PostgreSQL database\nrailway add postgresql\n\n# Add Redis\nrailway add redis\n\n# View logs\nrailway logs\n\n# Open application\nrailway open\n",[1135,27472,27473,27478,27491,27495,27500,27507,27511,27516,27522,27526,27531,27538,27542,27547,27554,27558,27563,27574,27584,27588,27593,27603,27607,27612,27620,27624,27628,27634,27638,27642],{"__ignoreMap":1137},[1241,27474,27475],{"class":1243,"line":1244},[1241,27476,27477],{"class":1247},"# Install Railway CLI\n",[1241,27479,27480,27483,27485,27488],{"class":1243,"line":1251},[1241,27481,27482],{"class":1254},"npm",[1241,27484,20786],{"class":1262},[1241,27486,27487],{"class":1269}," -g",[1241,27489,27490],{"class":1262}," @railway/cli\n",[1241,27492,27493],{"class":1243,"line":1281},[1241,27494,1303],{"emptyLinePlaceholder":1302},[1241,27496,27497],{"class":1243,"line":1290},[1241,27498,27499],{"class":1247},"# Login to Railway\n",[1241,27501,27502,27505],{"class":1243,"line":1299},[1241,27503,27504],{"class":1254},"railway",[1241,27506,20806],{"class":1262},[1241,27508,27509],{"class":1243,"line":1306},[1241,27510,1303],{"emptyLinePlaceholder":1302},[1241,27512,27513],{"class":1243,"line":1312},[1241,27514,27515],{"class":1247},"# Initialize project\n",[1241,27517,27518,27520],{"class":1243,"line":1321},[1241,27519,27504],{"class":1254},[1241,27521,13409],{"class":1262},[1241,27523,27524],{"class":1243,"line":1327},[1241,27525,1303],{"emptyLinePlaceholder":1302},[1241,27527,27528],{"class":1243,"line":1333},[1241,27529,27530],{"class":1247},"# Link to existing project\n",[1241,27532,27533,27535],{"class":1243,"line":1339},[1241,27534,27504],{"class":1254},[1241,27536,27537],{"class":1262}," link\n",[1241,27539,27540],{"class":1243,"line":1345},[1241,27541,1303],{"emptyLinePlaceholder":1302},[1241,27543,27544],{"class":1243,"line":1350},[1241,27545,27546],{"class":1247},"# Deploy\n",[1241,27548,27549,27551],{"class":1243,"line":1356},[1241,27550,27504],{"class":1254},[1241,27552,27553],{"class":1262}," up\n",[1241,27555,27556],{"class":1243,"line":1554},[1241,27557,1303],{"emptyLinePlaceholder":1302},[1241,27559,27560],{"class":1243,"line":1569},[1241,27561,27562],{"class":1247},"# Add environment variables\n",[1241,27564,27565,27567,27570,27572],{"class":1243,"line":1584},[1241,27566,27504],{"class":1254},[1241,27568,27569],{"class":1262}," variables",[1241,27571,13428],{"class":1262},[1241,27573,17596],{"class":1262},[1241,27575,27576,27578,27580,27582],{"class":1243,"line":1621},[1241,27577,27504],{"class":1254},[1241,27579,27569],{"class":1262},[1241,27581,13428],{"class":1262},[1241,27583,4020],{"class":1262},[1241,27585,27586],{"class":1243,"line":1627},[1241,27587,1303],{"emptyLinePlaceholder":1302},[1241,27589,27590],{"class":1243,"line":1633},[1241,27591,27592],{"class":1247},"# Add PostgreSQL database\n",[1241,27594,27595,27597,27600],{"class":1243,"line":1639},[1241,27596,27504],{"class":1254},[1241,27598,27599],{"class":1262}," add",[1241,27601,27602],{"class":1262}," postgresql\n",[1241,27604,27605],{"class":1243,"line":1645},[1241,27606,1303],{"emptyLinePlaceholder":1302},[1241,27608,27609],{"class":1243,"line":2028},[1241,27610,27611],{"class":1247},"# Add Redis\n",[1241,27613,27614,27616,27618],{"class":1243,"line":2042},[1241,27615,27504],{"class":1254},[1241,27617,27599],{"class":1262},[1241,27619,12012],{"class":1262},[1241,27621,27622],{"class":1243,"line":2064},[1241,27623,1303],{"emptyLinePlaceholder":1302},[1241,27625,27626],{"class":1243,"line":2070},[1241,27627,4045],{"class":1247},[1241,27629,27630,27632],{"class":1243,"line":2075},[1241,27631,27504],{"class":1254},[1241,27633,4052],{"class":1262},[1241,27635,27636],{"class":1243,"line":2080},[1241,27637,1303],{"emptyLinePlaceholder":1302},[1241,27639,27640],{"class":1243,"line":2085},[1241,27641,15696],{"class":1247},[1241,27643,27644,27646],{"class":1243,"line":2091},[1241,27645,27504],{"class":1254},[1241,27647,4036],{"class":1262},[1128,27649,27651],{"className":16110,"code":27650,"language":16112,"meta":1137,"style":1137},"# Dockerfile for Railway\nFROM python:3.11-slim\n\nWORKDIR /app\n\n# Install system dependencies\nRUN apt-get update && apt-get install -y \\\n    postgresql-client \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Install Python dependencies\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Copy application\nCOPY . .\n\n# Collect static files\nRUN python manage.py collectstatic --noinput\n\n# Create non-root user\nRUN adduser --disabled-password --gecos '' appuser\nRUN chown -R appuser:appuser /app\nUSER appuser\n\nEXPOSE 8000\n\nCMD [\"gunicorn\", \"--bind\", \"0.0.0.0:8000\", \"myproject.wsgi:application\"]\n",[1135,27652,27653,27658,27664,27668,27674,27678,27682,27689,27694,27698,27702,27706,27712,27718,27722,27727,27733,27737,27741,27747,27751,27755,27765,27771,27777,27781,27787,27791],{"__ignoreMap":1137},[1241,27654,27655],{"class":1243,"line":1244},[1241,27656,27657],{"class":1247},"# Dockerfile for Railway\n",[1241,27659,27660,27662],{"class":1243,"line":1251},[1241,27661,16125],{"class":16124},[1241,27663,16128],{"class":1692},[1241,27665,27666],{"class":1243,"line":1281},[1241,27667,1303],{"emptyLinePlaceholder":1302},[1241,27669,27670,27672],{"class":1243,"line":1290},[1241,27671,16214],{"class":16124},[1241,27673,16217],{"class":1692},[1241,27675,27676],{"class":1243,"line":1299},[1241,27677,1303],{"emptyLinePlaceholder":1302},[1241,27679,27680],{"class":1243,"line":1306},[1241,27681,16167],{"class":1247},[1241,27683,27684,27686],{"class":1243,"line":1312},[1241,27685,16172],{"class":16124},[1241,27687,27688],{"class":1692}," apt-get update && apt-get install -y \\\n",[1241,27690,27691],{"class":1243,"line":1321},[1241,27692,27693],{"class":1692},"    postgresql-client \\\n",[1241,27695,27696],{"class":1243,"line":1327},[1241,27697,16200],{"class":1692},[1241,27699,27700],{"class":1243,"line":1333},[1241,27701,1303],{"emptyLinePlaceholder":1302},[1241,27703,27704],{"class":1243,"line":1339},[1241,27705,16226],{"class":1247},[1241,27707,27708,27710],{"class":1243,"line":1345},[1241,27709,16231],{"class":16124},[1241,27711,16234],{"class":1692},[1241,27713,27714,27716],{"class":1243,"line":1350},[1241,27715,16172],{"class":16124},[1241,27717,16241],{"class":1692},[1241,27719,27720],{"class":1243,"line":1356},[1241,27721,1303],{"emptyLinePlaceholder":1302},[1241,27723,27724],{"class":1243,"line":1554},[1241,27725,27726],{"class":1247},"# Copy application\n",[1241,27728,27729,27731],{"class":1243,"line":1569},[1241,27730,16231],{"class":16124},[1241,27732,16257],{"class":1692},[1241,27734,27735],{"class":1243,"line":1584},[1241,27736,1303],{"emptyLinePlaceholder":1302},[1241,27738,27739],{"class":1243,"line":1621},[1241,27740,16266],{"class":1247},[1241,27742,27743,27745],{"class":1243,"line":1627},[1241,27744,16172],{"class":16124},[1241,27746,16273],{"class":1692},[1241,27748,27749],{"class":1243,"line":1633},[1241,27750,1303],{"emptyLinePlaceholder":1302},[1241,27752,27753],{"class":1243,"line":1639},[1241,27754,16282],{"class":1247},[1241,27756,27757,27759,27761,27763],{"class":1243,"line":1645},[1241,27758,16172],{"class":16124},[1241,27760,16289],{"class":1692},[1241,27762,16292],{"class":1262},[1241,27764,16295],{"class":1692},[1241,27766,27767,27769],{"class":1243,"line":2028},[1241,27768,16172],{"class":16124},[1241,27770,16302],{"class":1692},[1241,27772,27773,27775],{"class":1243,"line":2042},[1241,27774,1921],{"class":16124},[1241,27776,16295],{"class":1692},[1241,27778,27779],{"class":1243,"line":2064},[1241,27780,1303],{"emptyLinePlaceholder":1302},[1241,27782,27783,27785],{"class":1243,"line":2070},[1241,27784,16322],{"class":16124},[1241,27786,7151],{"class":1692},[1241,27788,27789],{"class":1243,"line":2075},[1241,27790,1303],{"emptyLinePlaceholder":1302},[1241,27792,27793,27795,27797,27800,27803,27806,27808,27811,27813,27816],{"class":1243,"line":2080},[1241,27794,16339],{"class":16124},[1241,27796,1598],{"class":1692},[1241,27798,27799],{"class":1262},"\"gunicorn\"",[1241,27801,27802],{"class":1692},", ",[1241,27804,27805],{"class":1262},"\"--bind\"",[1241,27807,27802],{"class":1692},[1241,27809,27810],{"class":1262},"\"0.0.0.0:8000\"",[1241,27812,27802],{"class":1692},[1241,27814,27815],{"class":1262},"\"myproject.wsgi:application\"",[1241,27817,1618],{"class":1692},[1035,27819,27821],{"id":27820},"flyio-deployment","Fly.io Deployment",[1026,27823,27824],{},"Fly.io runs applications close to users worldwide with automatic scaling and edge deployment.",[1026,27826,27827],{},[1042,27828,27829],{},"Fly.io Configuration",[1128,27831,27833],{"className":27287,"code":27832,"language":27289,"meta":1137,"style":1137},"# fly.toml\napp = \"django-app\"\nprimary_region = \"ord\"\n\n[build]\n  builder = \"paketobuildpacks/builder:base\"\n\n[env]\n  DJANGO_SETTINGS_MODULE = \"myproject.settings.production\"\n  PORT = \"8000\"\n\n[http_service]\n  internal_port = 8000\n  force_https = true\n  auto_stop_machines = true\n  auto_start_machines = true\n  min_machines_running = 1\n\n[[services]]\n  http_checks = []\n  internal_port = 8000\n  processes = [\"app\"]\n  protocol = \"tcp\"\n  script_checks = []\n\n  [services.concurrency]\n    hard_limit = 25\n    soft_limit = 20\n    type = \"connections\"\n\n  [[services.ports]]\n    force_https = true\n    handlers = [\"http\"]\n    port = 80\n\n  [[services.ports]]\n    handlers = [\"tls\", \"http\"]\n    port = 443\n\n  [[services.tcp_checks]]\n    grace_period = \"1s\"\n    interval = \"15s\"\n    restart_limit = 0\n    timeout = \"2s\"\n\n[[statics]]\n  guest_path = \"/app/staticfiles\"\n  url_prefix = \"/static/\"\n",[1135,27834,27835,27840,27853,27867,27871,27879,27893,27897,27905,27917,27931,27935,27944,27953,27962,27971,27980,27989,27993,28003,28012,28020,28037,28050,28059,28063,28076,28086,28095,28109,28113,28126,28135,28153,28161,28165,28177,28202,28210,28214,28227,28241,28255,28265,28279,28283,28292,28305],{"__ignoreMap":1137},[1241,27836,27837],{"class":1243,"line":1244},[1241,27838,27839],{"class":1247},"# fly.toml\n",[1241,27841,27842,27845,27847,27849,27851],{"class":1243,"line":1251},[1241,27843,27844],{"class":7423},"app",[1241,27846,1728],{"class":1381},[1241,27848,1259],{"class":1258},[1241,27850,5410],{"class":1262},[1241,27852,1278],{"class":1258},[1241,27854,27855,27858,27860,27862,27865],{"class":1243,"line":1281},[1241,27856,27857],{"class":7423},"primary_region",[1241,27859,1728],{"class":1381},[1241,27861,1259],{"class":1258},[1241,27863,27864],{"class":1262},"ord",[1241,27866,1278],{"class":1258},[1241,27868,27869],{"class":1243,"line":1290},[1241,27870,1303],{"emptyLinePlaceholder":1302},[1241,27872,27873,27875,27877],{"class":1243,"line":1299},[1241,27874,1904],{"class":1381},[1241,27876,16400],{"class":1254},[1241,27878,1618],{"class":1381},[1241,27880,27881,27884,27886,27888,27891],{"class":1243,"line":1306},[1241,27882,27883],{"class":7423},"  builder",[1241,27885,1728],{"class":1381},[1241,27887,1259],{"class":1258},[1241,27889,27890],{"class":1262},"paketobuildpacks/builder:base",[1241,27892,1278],{"class":1258},[1241,27894,27895],{"class":1243,"line":1312},[1241,27896,1303],{"emptyLinePlaceholder":1302},[1241,27898,27899,27901,27903],{"class":1243,"line":1321},[1241,27900,1904],{"class":1381},[1241,27902,26359],{"class":1254},[1241,27904,1618],{"class":1381},[1241,27906,27907,27909,27911,27913,27915],{"class":1243,"line":1327},[1241,27908,13750],{"class":7423},[1241,27910,1728],{"class":1381},[1241,27912,1259],{"class":1258},[1241,27914,2965],{"class":1262},[1241,27916,1278],{"class":1258},[1241,27918,27919,27922,27924,27926,27929],{"class":1243,"line":1333},[1241,27920,27921],{"class":7423},"  PORT",[1241,27923,1728],{"class":1381},[1241,27925,1259],{"class":1258},[1241,27927,27928],{"class":1262},"8000",[1241,27930,1278],{"class":1258},[1241,27932,27933],{"class":1243,"line":1339},[1241,27934,1303],{"emptyLinePlaceholder":1302},[1241,27936,27937,27939,27942],{"class":1243,"line":1345},[1241,27938,1904],{"class":1381},[1241,27940,27941],{"class":1254},"http_service",[1241,27943,1618],{"class":1381},[1241,27945,27946,27949,27951],{"class":1243,"line":1350},[1241,27947,27948],{"class":7423},"  internal_port",[1241,27950,1728],{"class":1381},[1241,27952,7151],{"class":2476},[1241,27954,27955,27958,27960],{"class":1243,"line":1356},[1241,27956,27957],{"class":7423},"  force_https",[1241,27959,1728],{"class":1381},[1241,27961,3228],{"class":3227},[1241,27963,27964,27967,27969],{"class":1243,"line":1554},[1241,27965,27966],{"class":7423},"  auto_stop_machines",[1241,27968,1728],{"class":1381},[1241,27970,3228],{"class":3227},[1241,27972,27973,27976,27978],{"class":1243,"line":1569},[1241,27974,27975],{"class":7423},"  auto_start_machines",[1241,27977,1728],{"class":1381},[1241,27979,3228],{"class":3227},[1241,27981,27982,27985,27987],{"class":1243,"line":1584},[1241,27983,27984],{"class":7423},"  min_machines_running",[1241,27986,1728],{"class":1381},[1241,27988,12023],{"class":2476},[1241,27990,27991],{"class":1243,"line":1621},[1241,27992,1303],{"emptyLinePlaceholder":1302},[1241,27994,27995,27998,28000],{"class":1243,"line":1627},[1241,27996,27997],{"class":1381},"[[",[1241,27999,26932],{"class":1254},[1241,28001,28002],{"class":1381},"]]\n",[1241,28004,28005,28008,28010],{"class":1243,"line":1633},[1241,28006,28007],{"class":7423},"  http_checks",[1241,28009,1728],{"class":1381},[1241,28011,3050],{"class":1381},[1241,28013,28014,28016,28018],{"class":1243,"line":1639},[1241,28015,27948],{"class":7423},[1241,28017,1728],{"class":1381},[1241,28019,7151],{"class":2476},[1241,28021,28022,28025,28027,28029,28031,28033,28035],{"class":1243,"line":1645},[1241,28023,28024],{"class":7423},"  processes",[1241,28026,1728],{"class":1381},[1241,28028,1598],{"class":1381},[1241,28030,1266],{"class":1258},[1241,28032,27844],{"class":1262},[1241,28034,1266],{"class":1258},[1241,28036,1618],{"class":1381},[1241,28038,28039,28042,28044,28046,28048],{"class":1243,"line":2028},[1241,28040,28041],{"class":7423},"  protocol",[1241,28043,1728],{"class":1381},[1241,28045,1259],{"class":1258},[1241,28047,5643],{"class":1262},[1241,28049,1278],{"class":1258},[1241,28051,28052,28055,28057],{"class":1243,"line":2042},[1241,28053,28054],{"class":7423},"  script_checks",[1241,28056,1728],{"class":1381},[1241,28058,3050],{"class":1381},[1241,28060,28061],{"class":1243,"line":2064},[1241,28062,1303],{"emptyLinePlaceholder":1302},[1241,28064,28065,28068,28070,28072,28074],{"class":1243,"line":2070},[1241,28066,28067],{"class":1381},"  [",[1241,28069,26932],{"class":1254},[1241,28071,1773],{"class":1692},[1241,28073,24629],{"class":1254},[1241,28075,1618],{"class":1381},[1241,28077,28078,28081,28083],{"class":1243,"line":2075},[1241,28079,28080],{"class":7423},"    hard_limit",[1241,28082,1728],{"class":1381},[1241,28084,28085],{"class":2476}," 25\n",[1241,28087,28088,28091,28093],{"class":1243,"line":2080},[1241,28089,28090],{"class":7423},"    soft_limit",[1241,28092,1728],{"class":1381},[1241,28094,3480],{"class":2476},[1241,28096,28097,28100,28102,28104,28107],{"class":1243,"line":2085},[1241,28098,28099],{"class":7423},"    type",[1241,28101,1728],{"class":1381},[1241,28103,1259],{"class":1258},[1241,28105,28106],{"class":1262},"connections",[1241,28108,1278],{"class":1258},[1241,28110,28111],{"class":1243,"line":2091},[1241,28112,1303],{"emptyLinePlaceholder":1302},[1241,28114,28115,28118,28120,28122,28124],{"class":1243,"line":2120},[1241,28116,28117],{"class":1381},"  [[",[1241,28119,26932],{"class":1254},[1241,28121,1773],{"class":1692},[1241,28123,24038],{"class":1254},[1241,28125,28002],{"class":1381},[1241,28127,28128,28131,28133],{"class":1243,"line":2148},[1241,28129,28130],{"class":7423},"    force_https",[1241,28132,1728],{"class":1381},[1241,28134,3228],{"class":3227},[1241,28136,28137,28140,28142,28144,28146,28149,28151],{"class":1243,"line":2177},[1241,28138,28139],{"class":7423},"    handlers",[1241,28141,1728],{"class":1381},[1241,28143,1598],{"class":1381},[1241,28145,1266],{"class":1258},[1241,28147,28148],{"class":1262},"http",[1241,28150,1266],{"class":1258},[1241,28152,1618],{"class":1381},[1241,28154,28155,28157,28159],{"class":1243,"line":2214},[1241,28156,18763],{"class":7423},[1241,28158,1728],{"class":1381},[1241,28160,3470],{"class":2476},[1241,28162,28163],{"class":1243,"line":2240},[1241,28164,1303],{"emptyLinePlaceholder":1302},[1241,28166,28167,28169,28171,28173,28175],{"class":1243,"line":2245},[1241,28168,28117],{"class":1381},[1241,28170,26932],{"class":1254},[1241,28172,1773],{"class":1692},[1241,28174,24038],{"class":1254},[1241,28176,28002],{"class":1381},[1241,28178,28179,28181,28183,28185,28187,28190,28192,28194,28196,28198,28200],{"class":1243,"line":2251},[1241,28180,28139],{"class":7423},[1241,28182,1728],{"class":1381},[1241,28184,1598],{"class":1381},[1241,28186,1266],{"class":1258},[1241,28188,28189],{"class":1262},"tls",[1241,28191,1266],{"class":1258},[1241,28193,1608],{"class":1381},[1241,28195,1259],{"class":1258},[1241,28197,28148],{"class":1262},[1241,28199,1266],{"class":1258},[1241,28201,1618],{"class":1381},[1241,28203,28204,28206,28208],{"class":1243,"line":2267},[1241,28205,18763],{"class":7423},[1241,28207,1728],{"class":1381},[1241,28209,3750],{"class":2476},[1241,28211,28212],{"class":1243,"line":2289},[1241,28213,1303],{"emptyLinePlaceholder":1302},[1241,28215,28216,28218,28220,28222,28225],{"class":1243,"line":2294},[1241,28217,28117],{"class":1381},[1241,28219,26932],{"class":1254},[1241,28221,1773],{"class":1692},[1241,28223,28224],{"class":1254},"tcp_checks",[1241,28226,28002],{"class":1381},[1241,28228,28229,28232,28234,28236,28239],{"class":1243,"line":2300},[1241,28230,28231],{"class":7423},"    grace_period",[1241,28233,1728],{"class":1381},[1241,28235,1259],{"class":1258},[1241,28237,28238],{"class":1262},"1s",[1241,28240,1278],{"class":1258},[1241,28242,28243,28246,28248,28250,28253],{"class":1243,"line":2314},[1241,28244,28245],{"class":7423},"    interval",[1241,28247,1728],{"class":1381},[1241,28249,1259],{"class":1258},[1241,28251,28252],{"class":1262},"15s",[1241,28254,1278],{"class":1258},[1241,28256,28257,28260,28262],{"class":1243,"line":2335},[1241,28258,28259],{"class":7423},"    restart_limit",[1241,28261,1728],{"class":1381},[1241,28263,28264],{"class":2476}," 0\n",[1241,28266,28267,28270,28272,28274,28277],{"class":1243,"line":2340},[1241,28268,28269],{"class":7423},"    timeout",[1241,28271,1728],{"class":1381},[1241,28273,1259],{"class":1258},[1241,28275,28276],{"class":1262},"2s",[1241,28278,1278],{"class":1258},[1241,28280,28281],{"class":1243,"line":2346},[1241,28282,1303],{"emptyLinePlaceholder":1302},[1241,28284,28285,28287,28290],{"class":1243,"line":2361},[1241,28286,27997],{"class":1381},[1241,28288,28289],{"class":1254},"statics",[1241,28291,28002],{"class":1381},[1241,28293,28294,28297,28299,28301,28303],{"class":1243,"line":2371},[1241,28295,28296],{"class":7423},"  guest_path",[1241,28298,1728],{"class":1381},[1241,28300,1259],{"class":1258},[1241,28302,6213],{"class":1262},[1241,28304,1278],{"class":1258},[1241,28306,28307,28310,28312,28314,28317],{"class":1243,"line":2392},[1241,28308,28309],{"class":7423},"  url_prefix",[1241,28311,1728],{"class":1381},[1241,28313,1259],{"class":1258},[1241,28315,28316],{"class":1262},"/static/",[1241,28318,1278],{"class":1258},[1026,28320,28321],{},[1042,28322,28323],{},"Deploy to Fly.io",[1128,28325,28327],{"className":1235,"code":28326,"language":1237,"meta":1137,"style":1137},"# Install flyctl\ncurl -L https://fly.io/install.sh | sh\n\n# Login to Fly.io\nflyctl auth login\n\n# Launch application\nflyctl launch\n\n# Set secrets\nflyctl secrets set SECRET_KEY=your-secret-key\nflyctl secrets set DATABASE_URL=postgresql://...\n\n# Deploy\nflyctl deploy\n\n# Scale application\nflyctl scale count 2\n\n# View logs\nflyctl logs\n\n# SSH into machine\nflyctl ssh console\n",[1135,28328,28329,28334,28348,28352,28357,28367,28371,28376,28383,28387,28392,28403,28414,28418,28422,28428,28432,28437,28449,28453,28457,28463,28467,28472],{"__ignoreMap":1137},[1241,28330,28331],{"class":1243,"line":1244},[1241,28332,28333],{"class":1247},"# Install flyctl\n",[1241,28335,28336,28338,28341,28344,28346],{"class":1243,"line":1251},[1241,28337,1255],{"class":1254},[1241,28339,28340],{"class":1269}," -L",[1241,28342,28343],{"class":1262}," https://fly.io/install.sh",[1241,28345,7629],{"class":1709},[1241,28347,25969],{"class":1254},[1241,28349,28350],{"class":1243,"line":1281},[1241,28351,1303],{"emptyLinePlaceholder":1302},[1241,28353,28354],{"class":1243,"line":1290},[1241,28355,28356],{"class":1247},"# Login to Fly.io\n",[1241,28358,28359,28362,28365],{"class":1243,"line":1299},[1241,28360,28361],{"class":1254},"flyctl",[1241,28363,28364],{"class":1262}," auth",[1241,28366,20806],{"class":1262},[1241,28368,28369],{"class":1243,"line":1306},[1241,28370,1303],{"emptyLinePlaceholder":1302},[1241,28372,28373],{"class":1243,"line":1312},[1241,28374,28375],{"class":1247},"# Launch application\n",[1241,28377,28378,28380],{"class":1243,"line":1321},[1241,28379,28361],{"class":1254},[1241,28381,28382],{"class":1262}," launch\n",[1241,28384,28385],{"class":1243,"line":1327},[1241,28386,1303],{"emptyLinePlaceholder":1302},[1241,28388,28389],{"class":1243,"line":1333},[1241,28390,28391],{"class":1247},"# Set secrets\n",[1241,28393,28394,28396,28399,28401],{"class":1243,"line":1339},[1241,28395,28361],{"class":1254},[1241,28397,28398],{"class":1262}," secrets",[1241,28400,13428],{"class":1262},[1241,28402,4020],{"class":1262},[1241,28404,28405,28407,28409,28411],{"class":1243,"line":1345},[1241,28406,28361],{"class":1254},[1241,28408,28398],{"class":1262},[1241,28410,13428],{"class":1262},[1241,28412,28413],{"class":1262}," DATABASE_URL=postgresql://...\n",[1241,28415,28416],{"class":1243,"line":1350},[1241,28417,1303],{"emptyLinePlaceholder":1302},[1241,28419,28420],{"class":1243,"line":1356},[1241,28421,27546],{"class":1247},[1241,28423,28424,28426],{"class":1243,"line":1554},[1241,28425,28361],{"class":1254},[1241,28427,3998],{"class":1262},[1241,28429,28430],{"class":1243,"line":1569},[1241,28431,1303],{"emptyLinePlaceholder":1302},[1241,28433,28434],{"class":1243,"line":1584},[1241,28435,28436],{"class":1247},"# Scale application\n",[1241,28438,28439,28441,28444,28447],{"class":1243,"line":1621},[1241,28440,28361],{"class":1254},[1241,28442,28443],{"class":1262}," scale",[1241,28445,28446],{"class":1262}," count",[1241,28448,3413],{"class":2476},[1241,28450,28451],{"class":1243,"line":1627},[1241,28452,1303],{"emptyLinePlaceholder":1302},[1241,28454,28455],{"class":1243,"line":1633},[1241,28456,4045],{"class":1247},[1241,28458,28459,28461],{"class":1243,"line":1639},[1241,28460,28361],{"class":1254},[1241,28462,4052],{"class":1262},[1241,28464,28465],{"class":1243,"line":1645},[1241,28466,1303],{"emptyLinePlaceholder":1302},[1241,28468,28469],{"class":1243,"line":2028},[1241,28470,28471],{"class":1247},"# SSH into machine\n",[1241,28473,28474,28476,28479],{"class":1243,"line":2042},[1241,28475,28361],{"class":1254},[1241,28477,28478],{"class":1262}," ssh",[1241,28480,28481],{"class":1262}," console\n",[1035,28483,28485],{"id":28484},"digitalocean-app-platform","DigitalOcean App Platform",[1026,28487,28488],{},"DigitalOcean App Platform provides a simple PaaS solution with predictable pricing.",[1128,28490,28492],{"className":3017,"code":28491,"language":3019,"meta":1137,"style":1137},"# .do/app.yaml\nname: django-app\nregion: nyc1\n\nservices:\n- name: web\n  source_dir: /\n  github:\n    repo: your-username/your-repo\n    branch: main\n    deploy_on_push: true\n  build_command: pip install -r requirements.txt && python manage.py collectstatic --noinput\n  run_command: gunicorn --worker-tmp-dir /dev/shm --workers 2 --bind 0.0.0.0:8080 myproject.wsgi:application\n  environment_slug: python\n  instance_count: 2\n  instance_size_slug: basic-xxs\n  http_port: 8080\n  health_check:\n    http_path: /health/\n    initial_delay_seconds: 30\n    period_seconds: 10\n    timeout_seconds: 5\n    success_threshold: 1\n    failure_threshold: 3\n  env:\n  - key: DJANGO_SETTINGS_MODULE\n    value: myproject.settings.production\n  - key: SECRET_KEY\n    value: ${SECRET_KEY}\n    type: SECRET\n  - key: DATABASE_URL\n    value: ${django-db.DATABASE_URL}\n  - key: REDIS_URL\n    value: ${redis.DATABASE_URL}\n  - key: DEBUG\n    value: \"False\"\n  - key: ALLOWED_HOSTS\n    value: \"${APP_DOMAIN}\"\n\n- name: worker\n  source_dir: /\n  github:\n    repo: your-username/your-repo\n    branch: main\n    deploy_on_push: true\n  build_command: pip install -r requirements.txt\n  run_command: celery -A myproject worker -l info --concurrency=2\n  environment_slug: python\n  instance_count: 1\n  instance_size_slug: basic-xxs\n  env:\n  - key: DJANGO_SETTINGS_MODULE\n    value: myproject.settings.production\n  - key: SECRET_KEY\n    value: ${SECRET_KEY}\n    type: SECRET\n  - key: DATABASE_URL\n    value: ${django-db.DATABASE_URL}\n  - key: REDIS_URL\n    value: ${redis.DATABASE_URL}\n\n- name: scheduler\n  source_dir: /\n  github:\n    repo: your-username/your-repo\n    branch: main\n    deploy_on_push: true\n  build_command: pip install -r requirements.txt\n  run_command: celery -A myproject beat -l info\n  environment_slug: python\n  instance_count: 1\n  instance_size_slug: basic-xxs\n  env:\n  - key: DJANGO_SETTINGS_MODULE\n    value: myproject.settings.production\n  - key: SECRET_KEY\n    value: ${SECRET_KEY}\n    type: SECRET\n  - key: DATABASE_URL\n    value: ${django-db.DATABASE_URL}\n  - key: REDIS_URL\n    value: ${redis.DATABASE_URL}\n\ndatabases:\n- name: django-db\n  engine: PG\n  version: \"13\"\n  size: db-s-dev-database\n  num_nodes: 1\n\n- name: redis\n  engine: REDIS\n  version: \"6\"\n  size: db-s-dev-database\n\nstatic_sites:\n- name: static-files\n  source_dir: /staticfiles\n  github:\n    repo: your-username/your-repo\n    branch: main\n  build_command: python manage.py collectstatic --noinput\n  output_dir: /staticfiles\n",[1135,28493,28494,28499,28507,28517,28521,28527,28537,28547,28554,28564,28573,28582,28592,28602,28611,28620,28630,28639,28646,28655,28664,28673,28682,28691,28700,28707,28717,28726,28736,28745,28754,28764,28773,28783,28792,28803,28815,28826,28839,28843,28854,28862,28868,28876,28884,28892,28901,28910,28918,28926,28934,28940,28950,28958,28968,28976,28984,28994,29002,29012,29020,29024,29035,29043,29049,29057,29065,29073,29081,29090,29098,29106,29114,29120,29130,29138,29148,29156,29164,29174,29182,29192,29200,29204,29210,29220,29230,29244,29254,29263,29267,29277,29286,29299,29307,29311,29318,29329,29338,29344,29352,29360,29368],{"__ignoreMap":1137},[1241,28495,28496],{"class":1243,"line":1244},[1241,28497,28498],{"class":1247},"# .do/app.yaml\n",[1241,28500,28501,28503,28505],{"class":1243,"line":1251},[1241,28502,5560],{"class":1590},[1241,28504,1397],{"class":1381},[1241,28506,4152],{"class":1262},[1241,28508,28509,28512,28514],{"class":1243,"line":1281},[1241,28510,28511],{"class":1590},"region",[1241,28513,1397],{"class":1381},[1241,28515,28516],{"class":1262}," nyc1\n",[1241,28518,28519],{"class":1243,"line":1290},[1241,28520,1303],{"emptyLinePlaceholder":1302},[1241,28522,28523,28525],{"class":1243,"line":1299},[1241,28524,26932],{"class":1590},[1241,28526,1840],{"class":1381},[1241,28528,28529,28531,28533,28535],{"class":1243,"line":1306},[1241,28530,13932],{"class":1381},[1241,28532,16377],{"class":1590},[1241,28534,1397],{"class":1381},[1241,28536,26946],{"class":1262},[1241,28538,28539,28542,28544],{"class":1243,"line":1312},[1241,28540,28541],{"class":1590},"  source_dir",[1241,28543,1397],{"class":1381},[1241,28545,28546],{"class":1262}," /\n",[1241,28548,28549,28552],{"class":1243,"line":1321},[1241,28550,28551],{"class":1590},"  github",[1241,28553,1840],{"class":1381},[1241,28555,28556,28559,28561],{"class":1243,"line":1327},[1241,28557,28558],{"class":1590},"    repo",[1241,28560,1397],{"class":1381},[1241,28562,28563],{"class":1262}," your-username/your-repo\n",[1241,28565,28566,28569,28571],{"class":1243,"line":1333},[1241,28567,28568],{"class":1590},"    branch",[1241,28570,1397],{"class":1381},[1241,28572,22275],{"class":1262},[1241,28574,28575,28578,28580],{"class":1243,"line":1339},[1241,28576,28577],{"class":1590},"    deploy_on_push",[1241,28579,1397],{"class":1381},[1241,28581,3228],{"class":3227},[1241,28583,28584,28587,28589],{"class":1243,"line":1345},[1241,28585,28586],{"class":1590},"  build_command",[1241,28588,1397],{"class":1381},[1241,28590,28591],{"class":1262}," pip install -r requirements.txt && python manage.py collectstatic --noinput\n",[1241,28593,28594,28597,28599],{"class":1243,"line":1350},[1241,28595,28596],{"class":1590},"  run_command",[1241,28598,1397],{"class":1381},[1241,28600,28601],{"class":1262}," gunicorn --worker-tmp-dir /dev/shm --workers 2 --bind 0.0.0.0:8080 myproject.wsgi:application\n",[1241,28603,28604,28607,28609],{"class":1243,"line":1356},[1241,28605,28606],{"class":1590},"  environment_slug",[1241,28608,1397],{"class":1381},[1241,28610,26965],{"class":1262},[1241,28612,28613,28616,28618],{"class":1243,"line":1554},[1241,28614,28615],{"class":1590},"  instance_count",[1241,28617,1397],{"class":1381},[1241,28619,3413],{"class":2476},[1241,28621,28622,28625,28627],{"class":1243,"line":1569},[1241,28623,28624],{"class":1590},"  instance_size_slug",[1241,28626,1397],{"class":1381},[1241,28628,28629],{"class":1262}," basic-xxs\n",[1241,28631,28632,28635,28637],{"class":1243,"line":1584},[1241,28633,28634],{"class":1590},"  http_port",[1241,28636,1397],{"class":1381},[1241,28638,16325],{"class":2476},[1241,28640,28641,28644],{"class":1243,"line":1621},[1241,28642,28643],{"class":1590},"  health_check",[1241,28645,1840],{"class":1381},[1241,28647,28648,28651,28653],{"class":1243,"line":1627},[1241,28649,28650],{"class":1590},"    http_path",[1241,28652,1397],{"class":1381},[1241,28654,3614],{"class":1262},[1241,28656,28657,28660,28662],{"class":1243,"line":1633},[1241,28658,28659],{"class":1590},"    initial_delay_seconds",[1241,28661,1397],{"class":1381},[1241,28663,12360],{"class":2476},[1241,28665,28666,28669,28671],{"class":1243,"line":1639},[1241,28667,28668],{"class":1590},"    period_seconds",[1241,28670,1397],{"class":1381},[1241,28672,3423],{"class":2476},[1241,28674,28675,28678,28680],{"class":1243,"line":1645},[1241,28676,28677],{"class":1590},"    timeout_seconds",[1241,28679,1397],{"class":1381},[1241,28681,12371],{"class":2476},[1241,28683,28684,28687,28689],{"class":1243,"line":2028},[1241,28685,28686],{"class":1590},"    success_threshold",[1241,28688,1397],{"class":1381},[1241,28690,12023],{"class":2476},[1241,28692,28693,28696,28698],{"class":1243,"line":2042},[1241,28694,28695],{"class":1590},"    failure_threshold",[1241,28697,1397],{"class":1381},[1241,28699,12392],{"class":2476},[1241,28701,28702,28705],{"class":1243,"line":2064},[1241,28703,28704],{"class":1590},"  env",[1241,28706,1840],{"class":1381},[1241,28708,28709,28711,28713,28715],{"class":1243,"line":2070},[1241,28710,16374],{"class":1381},[1241,28712,27017],{"class":1590},[1241,28714,1397],{"class":1381},[1241,28716,17212],{"class":1262},[1241,28718,28719,28722,28724],{"class":1243,"line":2075},[1241,28720,28721],{"class":1590},"    value",[1241,28723,1397],{"class":1381},[1241,28725,3136],{"class":1262},[1241,28727,28728,28730,28732,28734],{"class":1243,"line":2080},[1241,28729,16374],{"class":1381},[1241,28731,27017],{"class":1590},[1241,28733,1397],{"class":1381},[1241,28735,17277],{"class":1262},[1241,28737,28738,28740,28742],{"class":1243,"line":2085},[1241,28739,28721],{"class":1590},[1241,28741,1397],{"class":1381},[1241,28743,28744],{"class":1262}," ${SECRET_KEY}\n",[1241,28746,28747,28749,28751],{"class":1243,"line":2091},[1241,28748,28099],{"class":1590},[1241,28750,1397],{"class":1381},[1241,28752,28753],{"class":1262}," SECRET\n",[1241,28755,28756,28758,28760,28762],{"class":1243,"line":2120},[1241,28757,16374],{"class":1381},[1241,28759,27017],{"class":1590},[1241,28761,1397],{"class":1381},[1241,28763,17232],{"class":1262},[1241,28765,28766,28768,28770],{"class":1243,"line":2148},[1241,28767,28721],{"class":1590},[1241,28769,1397],{"class":1381},[1241,28771,28772],{"class":1262}," ${django-db.DATABASE_URL}\n",[1241,28774,28775,28777,28779,28781],{"class":1243,"line":2177},[1241,28776,16374],{"class":1381},[1241,28778,27017],{"class":1590},[1241,28780,1397],{"class":1381},[1241,28782,27097],{"class":1262},[1241,28784,28785,28787,28789],{"class":1243,"line":2214},[1241,28786,28721],{"class":1590},[1241,28788,1397],{"class":1381},[1241,28790,28791],{"class":1262}," ${redis.DATABASE_URL}\n",[1241,28793,28794,28796,28798,28800],{"class":1243,"line":2240},[1241,28795,16374],{"class":1381},[1241,28797,27017],{"class":1590},[1241,28799,1397],{"class":1381},[1241,28801,28802],{"class":1262}," DEBUG\n",[1241,28804,28805,28807,28809,28811,28813],{"class":1243,"line":2245},[1241,28806,28721],{"class":1590},[1241,28808,1397],{"class":1381},[1241,28810,1259],{"class":1258},[1241,28812,3806],{"class":1262},[1241,28814,1278],{"class":1258},[1241,28816,28817,28819,28821,28823],{"class":1243,"line":2251},[1241,28818,16374],{"class":1381},[1241,28820,27017],{"class":1590},[1241,28822,1397],{"class":1381},[1241,28824,28825],{"class":1262}," ALLOWED_HOSTS\n",[1241,28827,28828,28830,28832,28834,28837],{"class":1243,"line":2267},[1241,28829,28721],{"class":1590},[1241,28831,1397],{"class":1381},[1241,28833,1259],{"class":1258},[1241,28835,28836],{"class":1262},"${APP_DOMAIN}",[1241,28838,1278],{"class":1258},[1241,28840,28841],{"class":1243,"line":2289},[1241,28842,1303],{"emptyLinePlaceholder":1302},[1241,28844,28845,28847,28849,28851],{"class":1243,"line":2294},[1241,28846,13932],{"class":1381},[1241,28848,16377],{"class":1590},[1241,28850,1397],{"class":1381},[1241,28852,28853],{"class":1262}," worker\n",[1241,28855,28856,28858,28860],{"class":1243,"line":2300},[1241,28857,28541],{"class":1590},[1241,28859,1397],{"class":1381},[1241,28861,28546],{"class":1262},[1241,28863,28864,28866],{"class":1243,"line":2314},[1241,28865,28551],{"class":1590},[1241,28867,1840],{"class":1381},[1241,28869,28870,28872,28874],{"class":1243,"line":2335},[1241,28871,28558],{"class":1590},[1241,28873,1397],{"class":1381},[1241,28875,28563],{"class":1262},[1241,28877,28878,28880,28882],{"class":1243,"line":2340},[1241,28879,28568],{"class":1590},[1241,28881,1397],{"class":1381},[1241,28883,22275],{"class":1262},[1241,28885,28886,28888,28890],{"class":1243,"line":2346},[1241,28887,28577],{"class":1590},[1241,28889,1397],{"class":1381},[1241,28891,3228],{"class":3227},[1241,28893,28894,28896,28898],{"class":1243,"line":2361},[1241,28895,28586],{"class":1590},[1241,28897,1397],{"class":1381},[1241,28899,28900],{"class":1262}," pip install -r requirements.txt\n",[1241,28902,28903,28905,28907],{"class":1243,"line":2371},[1241,28904,28596],{"class":1590},[1241,28906,1397],{"class":1381},[1241,28908,28909],{"class":1262}," celery -A myproject worker -l info --concurrency=2\n",[1241,28911,28912,28914,28916],{"class":1243,"line":2392},[1241,28913,28606],{"class":1590},[1241,28915,1397],{"class":1381},[1241,28917,26965],{"class":1262},[1241,28919,28920,28922,28924],{"class":1243,"line":2397},[1241,28921,28615],{"class":1590},[1241,28923,1397],{"class":1381},[1241,28925,12023],{"class":2476},[1241,28927,28928,28930,28932],{"class":1243,"line":2407},[1241,28929,28624],{"class":1590},[1241,28931,1397],{"class":1381},[1241,28933,28629],{"class":1262},[1241,28935,28936,28938],{"class":1243,"line":2417},[1241,28937,28704],{"class":1590},[1241,28939,1840],{"class":1381},[1241,28941,28942,28944,28946,28948],{"class":1243,"line":2422},[1241,28943,16374],{"class":1381},[1241,28945,27017],{"class":1590},[1241,28947,1397],{"class":1381},[1241,28949,17212],{"class":1262},[1241,28951,28952,28954,28956],{"class":1243,"line":2428},[1241,28953,28721],{"class":1590},[1241,28955,1397],{"class":1381},[1241,28957,3136],{"class":1262},[1241,28959,28960,28962,28964,28966],{"class":1243,"line":2439},[1241,28961,16374],{"class":1381},[1241,28963,27017],{"class":1590},[1241,28965,1397],{"class":1381},[1241,28967,17277],{"class":1262},[1241,28969,28970,28972,28974],{"class":1243,"line":2468},[1241,28971,28721],{"class":1590},[1241,28973,1397],{"class":1381},[1241,28975,28744],{"class":1262},[1241,28977,28978,28980,28982],{"class":1243,"line":2480},[1241,28979,28099],{"class":1590},[1241,28981,1397],{"class":1381},[1241,28983,28753],{"class":1262},[1241,28985,28986,28988,28990,28992],{"class":1243,"line":2490},[1241,28987,16374],{"class":1381},[1241,28989,27017],{"class":1590},[1241,28991,1397],{"class":1381},[1241,28993,17232],{"class":1262},[1241,28995,28996,28998,29000],{"class":1243,"line":2500},[1241,28997,28721],{"class":1590},[1241,28999,1397],{"class":1381},[1241,29001,28772],{"class":1262},[1241,29003,29004,29006,29008,29010],{"class":1243,"line":2505},[1241,29005,16374],{"class":1381},[1241,29007,27017],{"class":1590},[1241,29009,1397],{"class":1381},[1241,29011,27097],{"class":1262},[1241,29013,29014,29016,29018],{"class":1243,"line":2511},[1241,29015,28721],{"class":1590},[1241,29017,1397],{"class":1381},[1241,29019,28791],{"class":1262},[1241,29021,29022],{"class":1243,"line":2521},[1241,29023,1303],{"emptyLinePlaceholder":1302},[1241,29025,29026,29028,29030,29032],{"class":1243,"line":2531},[1241,29027,13932],{"class":1381},[1241,29029,16377],{"class":1590},[1241,29031,1397],{"class":1381},[1241,29033,29034],{"class":1262}," scheduler\n",[1241,29036,29037,29039,29041],{"class":1243,"line":2536},[1241,29038,28541],{"class":1590},[1241,29040,1397],{"class":1381},[1241,29042,28546],{"class":1262},[1241,29044,29045,29047],{"class":1243,"line":2542},[1241,29046,28551],{"class":1590},[1241,29048,1840],{"class":1381},[1241,29050,29051,29053,29055],{"class":1243,"line":2552},[1241,29052,28558],{"class":1590},[1241,29054,1397],{"class":1381},[1241,29056,28563],{"class":1262},[1241,29058,29059,29061,29063],{"class":1243,"line":2569},[1241,29060,28568],{"class":1590},[1241,29062,1397],{"class":1381},[1241,29064,22275],{"class":1262},[1241,29066,29067,29069,29071],{"class":1243,"line":2586},[1241,29068,28577],{"class":1590},[1241,29070,1397],{"class":1381},[1241,29072,3228],{"class":3227},[1241,29074,29075,29077,29079],{"class":1243,"line":2600},[1241,29076,28586],{"class":1590},[1241,29078,1397],{"class":1381},[1241,29080,28900],{"class":1262},[1241,29082,29083,29085,29087],{"class":1243,"line":2614},[1241,29084,28596],{"class":1590},[1241,29086,1397],{"class":1381},[1241,29088,29089],{"class":1262}," celery -A myproject beat -l info\n",[1241,29091,29092,29094,29096],{"class":1243,"line":2635},[1241,29093,28606],{"class":1590},[1241,29095,1397],{"class":1381},[1241,29097,26965],{"class":1262},[1241,29099,29100,29102,29104],{"class":1243,"line":2656},[1241,29101,28615],{"class":1590},[1241,29103,1397],{"class":1381},[1241,29105,12023],{"class":2476},[1241,29107,29108,29110,29112],{"class":1243,"line":2677},[1241,29109,28624],{"class":1590},[1241,29111,1397],{"class":1381},[1241,29113,28629],{"class":1262},[1241,29115,29116,29118],{"class":1243,"line":2683},[1241,29117,28704],{"class":1590},[1241,29119,1840],{"class":1381},[1241,29121,29122,29124,29126,29128],{"class":1243,"line":2697},[1241,29123,16374],{"class":1381},[1241,29125,27017],{"class":1590},[1241,29127,1397],{"class":1381},[1241,29129,17212],{"class":1262},[1241,29131,29132,29134,29136],{"class":1243,"line":2716},[1241,29133,28721],{"class":1590},[1241,29135,1397],{"class":1381},[1241,29137,3136],{"class":1262},[1241,29139,29140,29142,29144,29146],{"class":1243,"line":2736},[1241,29141,16374],{"class":1381},[1241,29143,27017],{"class":1590},[1241,29145,1397],{"class":1381},[1241,29147,17277],{"class":1262},[1241,29149,29150,29152,29154],{"class":1243,"line":2741},[1241,29151,28721],{"class":1590},[1241,29153,1397],{"class":1381},[1241,29155,28744],{"class":1262},[1241,29157,29158,29160,29162],{"class":1243,"line":2747},[1241,29159,28099],{"class":1590},[1241,29161,1397],{"class":1381},[1241,29163,28753],{"class":1262},[1241,29165,29166,29168,29170,29172],{"class":1243,"line":2761},[1241,29167,16374],{"class":1381},[1241,29169,27017],{"class":1590},[1241,29171,1397],{"class":1381},[1241,29173,17232],{"class":1262},[1241,29175,29176,29178,29180],{"class":1243,"line":2775},[1241,29177,28721],{"class":1590},[1241,29179,1397],{"class":1381},[1241,29181,28772],{"class":1262},[1241,29183,29184,29186,29188,29190],{"class":1243,"line":2804},[1241,29185,16374],{"class":1381},[1241,29187,27017],{"class":1590},[1241,29189,1397],{"class":1381},[1241,29191,27097],{"class":1262},[1241,29193,29194,29196,29198],{"class":1243,"line":2823},[1241,29195,28721],{"class":1590},[1241,29197,1397],{"class":1381},[1241,29199,28791],{"class":1262},[1241,29201,29202],{"class":1243,"line":2840},[1241,29203,1303],{"emptyLinePlaceholder":1302},[1241,29205,29206,29208],{"class":1243,"line":2845},[1241,29207,27139],{"class":1590},[1241,29209,1840],{"class":1381},[1241,29211,29212,29214,29216,29218],{"class":1243,"line":2850},[1241,29213,13932],{"class":1381},[1241,29215,16377],{"class":1590},[1241,29217,1397],{"class":1381},[1241,29219,27076],{"class":1262},[1241,29221,29222,29225,29227],{"class":1243,"line":3776},[1241,29223,29224],{"class":1590},"  engine",[1241,29226,1397],{"class":1381},[1241,29228,29229],{"class":1262}," PG\n",[1241,29231,29232,29235,29237,29239,29242],{"class":1243,"line":3782},[1241,29233,29234],{"class":1590},"  version",[1241,29236,1397],{"class":1381},[1241,29238,1259],{"class":1258},[1241,29240,29241],{"class":1262},"13",[1241,29243,1278],{"class":1258},[1241,29245,29246,29249,29251],{"class":1243,"line":3789},[1241,29247,29248],{"class":1590},"  size",[1241,29250,1397],{"class":1381},[1241,29252,29253],{"class":1262}," db-s-dev-database\n",[1241,29255,29256,29259,29261],{"class":1243,"line":3796},[1241,29257,29258],{"class":1590},"  num_nodes",[1241,29260,1397],{"class":1381},[1241,29262,12023],{"class":2476},[1241,29264,29265],{"class":1243,"line":3811},[1241,29266,1303],{"emptyLinePlaceholder":1302},[1241,29268,29269,29271,29273,29275],{"class":1243,"line":3826},[1241,29270,13932],{"class":1381},[1241,29272,16377],{"class":1590},[1241,29274,1397],{"class":1381},[1241,29276,12012],{"class":1262},[1241,29278,29279,29281,29283],{"class":1243,"line":3841},[1241,29280,29224],{"class":1590},[1241,29282,1397],{"class":1381},[1241,29284,29285],{"class":1262}," REDIS\n",[1241,29287,29288,29290,29292,29294,29297],{"class":1243,"line":3856},[1241,29289,29234],{"class":1590},[1241,29291,1397],{"class":1381},[1241,29293,1259],{"class":1258},[1241,29295,29296],{"class":1262},"6",[1241,29298,1278],{"class":1258},[1241,29300,29301,29303,29305],{"class":1243,"line":3871},[1241,29302,29248],{"class":1590},[1241,29304,1397],{"class":1381},[1241,29306,29253],{"class":1262},[1241,29308,29309],{"class":1243,"line":3886},[1241,29310,1303],{"emptyLinePlaceholder":1302},[1241,29312,29313,29316],{"class":1243,"line":3901},[1241,29314,29315],{"class":1590},"static_sites",[1241,29317,1840],{"class":1381},[1241,29319,29320,29322,29324,29326],{"class":1243,"line":6562},[1241,29321,13932],{"class":1381},[1241,29323,16377],{"class":1590},[1241,29325,1397],{"class":1381},[1241,29327,29328],{"class":1262}," static-files\n",[1241,29330,29331,29333,29335],{"class":1243,"line":6581},[1241,29332,28541],{"class":1590},[1241,29334,1397],{"class":1381},[1241,29336,29337],{"class":1262}," /staticfiles\n",[1241,29339,29340,29342],{"class":1243,"line":6594},[1241,29341,28551],{"class":1590},[1241,29343,1840],{"class":1381},[1241,29345,29346,29348,29350],{"class":1243,"line":6613},[1241,29347,28558],{"class":1590},[1241,29349,1397],{"class":1381},[1241,29351,28563],{"class":1262},[1241,29353,29354,29356,29358],{"class":1243,"line":6632},[1241,29355,28568],{"class":1590},[1241,29357,1397],{"class":1381},[1241,29359,22275],{"class":1262},[1241,29361,29362,29364,29366],{"class":1243,"line":6649},[1241,29363,28586],{"class":1590},[1241,29365,1397],{"class":1381},[1241,29367,16273],{"class":1262},[1241,29369,29370,29373,29375],{"class":1243,"line":6654},[1241,29371,29372],{"class":1590},"  output_dir",[1241,29374,1397],{"class":1381},[1241,29376,29337],{"class":1262},[1030,29378,29380],{"id":29379},"cloud-deployment-best-practices","Cloud Deployment Best Practices",[1035,29382,29384],{"id":29383},"environment-management","Environment Management",[1026,29386,29387],{},[1042,29388,29389],{},"Environment Variables Strategy",[1128,29391,29393],{"className":1674,"code":29392,"language":1676,"meta":1137,"style":1137},"# settings/environment.py\nimport os\nfrom typing import Any, Dict, List\n\nclass EnvironmentConfig:\n    \"\"\"Centralized environment configuration management\"\"\"\n    \n    def __init__(self):\n        self.required_vars = [\n            'SECRET_KEY',\n            'DATABASE_URL',\n            'DJANGO_SETTINGS_MODULE',\n        ]\n        self.optional_vars = {\n            'DEBUG': 'False',\n            'ALLOWED_HOSTS': '',\n            'REDIS_URL': '',\n            'EMAIL_HOST': '',\n            'SENTRY_DSN': '',\n        }\n    \n    def validate_environment(self) -> List[str]:\n        \"\"\"Validate required environment variables\"\"\"\n        missing_vars = []\n        for var in self.required_vars:\n            if not os.environ.get(var):\n                missing_vars.append(var)\n        return missing_vars\n    \n    def get_config(self) -> Dict[str, Any]:\n        \"\"\"Get configuration from environment\"\"\"\n        config = {}\n        \n        # Required variables\n        for var in self.required_vars:\n            config[var] = os.environ.get(var)\n        \n        # Optional variables with defaults\n        for var, default in self.optional_vars.items():\n            config[var] = os.environ.get(var, default)\n        \n        return config\n    \n    def get_boolean(self, key: str, default: bool = False) -> bool:\n        \"\"\"Get boolean value from environment\"\"\"\n        value = os.environ.get(key, str(default)).lower()\n        return value in ('true', '1', 'yes', 'on')\n    \n    def get_list(self, key: str, separator: str = ',') -> List[str]:\n        \"\"\"Get list value from environment\"\"\"\n        value = os.environ.get(key, '')\n        return [item.strip() for item in value.split(separator) if item.strip()]\n\n# Usage in settings\nenv_config = EnvironmentConfig()\nmissing_vars = env_config.validate_environment()\nif missing_vars:\n    raise ValueError(f\"Missing required environment variables: {missing_vars}\")\n\nconfig = env_config.get_config()\n",[1135,29394,29395,29400,29406,29428,29432,29441,29454,29458,29474,29488,29498,29508,29518,29522,29535,29553,29567,29581,29595,29610,29614,29618,29646,29656,29665,29685,29709,29725,29733,29737,29764,29773,29783,29788,29793,29809,29838,29842,29847,29874,29906,29910,29917,29921,29963,29972,30009,30054,30058,30106,30115,30141,30194,30198,30203,30214,30231,30240,30267,30271],{"__ignoreMap":1137},[1241,29396,29397],{"class":1243,"line":1244},[1241,29398,29399],{"class":1247},"# settings/environment.py\n",[1241,29401,29402,29404],{"class":1243,"line":1251},[1241,29403,1689],{"class":1688},[1241,29405,1693],{"class":1692},[1241,29407,29408,29410,29413,29415,29418,29420,29423,29425],{"class":1243,"line":1281},[1241,29409,1698],{"class":1688},[1241,29411,29412],{"class":1692}," typing ",[1241,29414,1689],{"class":1688},[1241,29416,29417],{"class":1692}," Any",[1241,29419,1608],{"class":1381},[1241,29421,29422],{"class":1692}," Dict",[1241,29424,1608],{"class":1381},[1241,29426,29427],{"class":1692}," List\n",[1241,29429,29430],{"class":1243,"line":1290},[1241,29431,1303],{"emptyLinePlaceholder":1302},[1241,29433,29434,29436,29439],{"class":1243,"line":1299},[1241,29435,2640],{"class":2222},[1241,29437,29438],{"class":9162}," EnvironmentConfig",[1241,29440,1840],{"class":1381},[1241,29442,29443,29447,29451],{"class":1243,"line":1306},[1241,29444,29446],{"class":29445},"sm7ve","    \"\"\"",[1241,29448,29450],{"class":29449},"sVyVU","Centralized environment configuration management",[1241,29452,29453],{"class":29445},"\"\"\"\n",[1241,29455,29456],{"class":1243,"line":1312},[1241,29457,8853],{"class":1692},[1241,29459,29460,29463,29466,29468,29472],{"class":1243,"line":1321},[1241,29461,29462],{"class":2222},"    def",[1241,29464,29465],{"class":7405}," __init__",[1241,29467,1786],{"class":1381},[1241,29469,29471],{"class":29470},"sRjD_","self",[1241,29473,8583],{"class":1381},[1241,29475,29476,29479,29481,29484,29486],{"class":1243,"line":1327},[1241,29477,29478],{"class":1724},"        self",[1241,29480,1773],{"class":1381},[1241,29482,29483],{"class":1776},"required_vars",[1241,29485,1728],{"class":1381},[1241,29487,1421],{"class":1381},[1241,29489,29490,29492,29494,29496],{"class":1243,"line":1333},[1241,29491,1868],{"class":1258},[1241,29493,5802],{"class":1262},[1241,29495,1752],{"class":1258},[1241,29497,1407],{"class":1381},[1241,29499,29500,29502,29504,29506],{"class":1243,"line":1339},[1241,29501,1868],{"class":1258},[1241,29503,5847],{"class":1262},[1241,29505,1752],{"class":1258},[1241,29507,1407],{"class":1381},[1241,29509,29510,29512,29514,29516],{"class":1243,"line":1345},[1241,29511,1868],{"class":1258},[1241,29513,2956],{"class":1262},[1241,29515,1752],{"class":1258},[1241,29517,1407],{"class":1381},[1241,29519,29520],{"class":1243,"line":1350},[1241,29521,4659],{"class":1381},[1241,29523,29524,29526,29528,29531,29533],{"class":1243,"line":1356},[1241,29525,29478],{"class":1724},[1241,29527,1773],{"class":1381},[1241,29529,29530],{"class":1776},"optional_vars",[1241,29532,1728],{"class":1381},[1241,29534,1566],{"class":1381},[1241,29536,29537,29539,29541,29543,29545,29547,29549,29551],{"class":1243,"line":1554},[1241,29538,1868],{"class":1258},[1241,29540,1725],{"class":1262},[1241,29542,1752],{"class":1258},[1241,29544,1397],{"class":1381},[1241,29546,1822],{"class":1258},[1241,29548,3806],{"class":1262},[1241,29550,1752],{"class":1258},[1241,29552,1407],{"class":1381},[1241,29554,29555,29557,29559,29561,29563,29565],{"class":1243,"line":1569},[1241,29556,1868],{"class":1258},[1241,29558,1737],{"class":1262},[1241,29560,1752],{"class":1258},[1241,29562,1397],{"class":1381},[1241,29564,1798],{"class":1258},[1241,29566,1407],{"class":1381},[1241,29568,29569,29571,29573,29575,29577,29579],{"class":1243,"line":1584},[1241,29570,1868],{"class":1258},[1241,29572,5118],{"class":1262},[1241,29574,1752],{"class":1258},[1241,29576,1397],{"class":1381},[1241,29578,1798],{"class":1258},[1241,29580,1407],{"class":1381},[1241,29582,29583,29585,29587,29589,29591,29593],{"class":1243,"line":1621},[1241,29584,1868],{"class":1258},[1241,29586,25585],{"class":1262},[1241,29588,1752],{"class":1258},[1241,29590,1397],{"class":1381},[1241,29592,1798],{"class":1258},[1241,29594,1407],{"class":1381},[1241,29596,29597,29599,29602,29604,29606,29608],{"class":1243,"line":1627},[1241,29598,1868],{"class":1258},[1241,29600,29601],{"class":1262},"SENTRY_DSN",[1241,29603,1752],{"class":1258},[1241,29605,1397],{"class":1381},[1241,29607,1798],{"class":1258},[1241,29609,1407],{"class":1381},[1241,29611,29612],{"class":1243,"line":1633},[1241,29613,1624],{"class":1381},[1241,29615,29616],{"class":1243,"line":1639},[1241,29617,8853],{"class":1692},[1241,29619,29620,29622,29626,29628,29630,29632,29635,29638,29640,29643],{"class":1243,"line":1645},[1241,29621,29462],{"class":2222},[1241,29623,29625],{"class":29624},"sljsM"," validate_environment",[1241,29627,1786],{"class":1381},[1241,29629,29471],{"class":29470},[1241,29631,7808],{"class":1381},[1241,29633,29634],{"class":1381}," ->",[1241,29636,29637],{"class":1692}," List",[1241,29639,1904],{"class":1381},[1241,29641,29642],{"class":1434},"str",[1241,29644,29645],{"class":1381},"]:\n",[1241,29647,29648,29651,29654],{"class":1243,"line":2028},[1241,29649,29650],{"class":29445},"        \"\"\"",[1241,29652,29653],{"class":29449},"Validate required environment variables",[1241,29655,29453],{"class":29445},[1241,29657,29658,29661,29663],{"class":1243,"line":2042},[1241,29659,29660],{"class":1692},"        missing_vars ",[1241,29662,3003],{"class":1381},[1241,29664,3050],{"class":1381},[1241,29666,29667,29670,29673,29676,29679,29681,29683],{"class":1243,"line":2064},[1241,29668,29669],{"class":1688},"        for",[1241,29671,29672],{"class":1692}," var ",[1241,29674,29675],{"class":1688},"in",[1241,29677,29678],{"class":1724}," self",[1241,29680,1773],{"class":1381},[1241,29682,29483],{"class":1776},[1241,29684,1840],{"class":1381},[1241,29686,29687,29690,29693,29695,29697,29699,29701,29703,29705,29707],{"class":1243,"line":2070},[1241,29688,29689],{"class":1688},"            if",[1241,29691,29692],{"class":1709}," not",[1241,29694,1833],{"class":1692},[1241,29696,1773],{"class":1381},[1241,29698,1777],{"class":1776},[1241,29700,1773],{"class":1381},[1241,29702,1783],{"class":1782},[1241,29704,1786],{"class":1381},[1241,29706,19250],{"class":1782},[1241,29708,8583],{"class":1381},[1241,29710,29711,29714,29716,29719,29721,29723],{"class":1243,"line":2075},[1241,29712,29713],{"class":1692},"                missing_vars",[1241,29715,1773],{"class":1381},[1241,29717,29718],{"class":1782},"append",[1241,29720,1786],{"class":1381},[1241,29722,19250],{"class":1782},[1241,29724,2117],{"class":1381},[1241,29726,29727,29730],{"class":1243,"line":2080},[1241,29728,29729],{"class":1688},"        return",[1241,29731,29732],{"class":1692}," missing_vars\n",[1241,29734,29735],{"class":1243,"line":2085},[1241,29736,8853],{"class":1692},[1241,29738,29739,29741,29744,29746,29748,29750,29752,29754,29756,29758,29760,29762],{"class":1243,"line":2091},[1241,29740,29462],{"class":2222},[1241,29742,29743],{"class":29624}," get_config",[1241,29745,1786],{"class":1381},[1241,29747,29471],{"class":29470},[1241,29749,7808],{"class":1381},[1241,29751,29634],{"class":1381},[1241,29753,29422],{"class":1692},[1241,29755,1904],{"class":1381},[1241,29757,29642],{"class":1434},[1241,29759,1608],{"class":1381},[1241,29761,29417],{"class":1692},[1241,29763,29645],{"class":1381},[1241,29765,29766,29768,29771],{"class":1243,"line":2120},[1241,29767,29650],{"class":29445},[1241,29769,29770],{"class":29449},"Get configuration from environment",[1241,29772,29453],{"class":29445},[1241,29774,29775,29778,29780],{"class":1243,"line":2148},[1241,29776,29777],{"class":1692},"        config ",[1241,29779,3003],{"class":1381},[1241,29781,29782],{"class":1381}," {}\n",[1241,29784,29785],{"class":1243,"line":2177},[1241,29786,29787],{"class":1692},"        \n",[1241,29789,29790],{"class":1243,"line":2214},[1241,29791,29792],{"class":1247},"        # Required variables\n",[1241,29794,29795,29797,29799,29801,29803,29805,29807],{"class":1243,"line":2240},[1241,29796,29669],{"class":1688},[1241,29798,29672],{"class":1692},[1241,29800,29675],{"class":1688},[1241,29802,29678],{"class":1724},[1241,29804,1773],{"class":1381},[1241,29806,29483],{"class":1776},[1241,29808,1840],{"class":1381},[1241,29810,29811,29814,29816,29818,29820,29822,29824,29826,29828,29830,29832,29834,29836],{"class":1243,"line":2245},[1241,29812,29813],{"class":1692},"            config",[1241,29815,1904],{"class":1381},[1241,29817,19250],{"class":1692},[1241,29819,4768],{"class":1381},[1241,29821,1728],{"class":1381},[1241,29823,1833],{"class":1692},[1241,29825,1773],{"class":1381},[1241,29827,1777],{"class":1776},[1241,29829,1773],{"class":1381},[1241,29831,1783],{"class":1782},[1241,29833,1786],{"class":1381},[1241,29835,19250],{"class":1782},[1241,29837,2117],{"class":1381},[1241,29839,29840],{"class":1243,"line":2251},[1241,29841,29787],{"class":1692},[1241,29843,29844],{"class":1243,"line":2267},[1241,29845,29846],{"class":1247},"        # Optional variables with defaults\n",[1241,29848,29849,29851,29853,29855,29858,29860,29862,29864,29866,29868,29871],{"class":1243,"line":2289},[1241,29850,29669],{"class":1688},[1241,29852,19067],{"class":1692},[1241,29854,1608],{"class":1381},[1241,29856,29857],{"class":1692}," default ",[1241,29859,29675],{"class":1688},[1241,29861,29678],{"class":1724},[1241,29863,1773],{"class":1381},[1241,29865,29530],{"class":1776},[1241,29867,1773],{"class":1381},[1241,29869,29870],{"class":1782},"items",[1241,29872,29873],{"class":1381},"():\n",[1241,29875,29876,29878,29880,29882,29884,29886,29888,29890,29892,29894,29896,29898,29900,29902,29904],{"class":1243,"line":2294},[1241,29877,29813],{"class":1692},[1241,29879,1904],{"class":1381},[1241,29881,19250],{"class":1692},[1241,29883,4768],{"class":1381},[1241,29885,1728],{"class":1381},[1241,29887,1833],{"class":1692},[1241,29889,1773],{"class":1381},[1241,29891,1777],{"class":1776},[1241,29893,1773],{"class":1381},[1241,29895,1783],{"class":1782},[1241,29897,1786],{"class":1381},[1241,29899,19250],{"class":1782},[1241,29901,1608],{"class":1381},[1241,29903,15658],{"class":1782},[1241,29905,2117],{"class":1381},[1241,29907,29908],{"class":1243,"line":2300},[1241,29909,29787],{"class":1692},[1241,29911,29912,29914],{"class":1243,"line":2314},[1241,29913,29729],{"class":1688},[1241,29915,29916],{"class":1692}," config\n",[1241,29918,29919],{"class":1243,"line":2335},[1241,29920,8853],{"class":1692},[1241,29922,29923,29925,29928,29930,29932,29934,29937,29939,29942,29944,29946,29948,29951,29953,29955,29957,29959,29961],{"class":1243,"line":2340},[1241,29924,29462],{"class":2222},[1241,29926,29927],{"class":29624}," get_boolean",[1241,29929,1786],{"class":1381},[1241,29931,29471],{"class":29470},[1241,29933,1608],{"class":1381},[1241,29935,27017],{"class":29936},"sCyAa",[1241,29938,1397],{"class":1381},[1241,29940,29941],{"class":1434}," str",[1241,29943,1608],{"class":1381},[1241,29945,15658],{"class":29936},[1241,29947,1397],{"class":1381},[1241,29949,29950],{"class":1434}," bool",[1241,29952,1728],{"class":1381},[1241,29954,2581],{"class":1731},[1241,29956,7808],{"class":1381},[1241,29958,29634],{"class":1381},[1241,29960,29950],{"class":1434},[1241,29962,1840],{"class":1381},[1241,29964,29965,29967,29970],{"class":1243,"line":2346},[1241,29966,29650],{"class":29445},[1241,29968,29969],{"class":29449},"Get boolean value from environment",[1241,29971,29453],{"class":29445},[1241,29973,29974,29977,29979,29981,29983,29985,29987,29989,29991,29993,29995,29997,29999,30001,30004,30007],{"class":1243,"line":2361},[1241,29975,29976],{"class":1692},"        value ",[1241,29978,3003],{"class":1381},[1241,29980,1833],{"class":1692},[1241,29982,1773],{"class":1381},[1241,29984,1777],{"class":1776},[1241,29986,1773],{"class":1381},[1241,29988,1783],{"class":1782},[1241,29990,1786],{"class":1381},[1241,29992,7292],{"class":1782},[1241,29994,1608],{"class":1381},[1241,29996,29941],{"class":1434},[1241,29998,1786],{"class":1381},[1241,30000,1857],{"class":1782},[1241,30002,30003],{"class":1381},")).",[1241,30005,30006],{"class":1782},"lower",[1241,30008,3009],{"class":1381},[1241,30010,30011,30013,30016,30018,30020,30022,30024,30026,30028,30030,30032,30034,30036,30038,30041,30043,30045,30047,30050,30052],{"class":1243,"line":2371},[1241,30012,29729],{"class":1688},[1241,30014,30015],{"class":1692}," value ",[1241,30017,29675],{"class":1709},[1241,30019,2447],{"class":1381},[1241,30021,1752],{"class":1258},[1241,30023,6040],{"class":1262},[1241,30025,1752],{"class":1258},[1241,30027,1608],{"class":1381},[1241,30029,1822],{"class":1258},[1241,30031,10576],{"class":1262},[1241,30033,1752],{"class":1258},[1241,30035,1608],{"class":1381},[1241,30037,1822],{"class":1258},[1241,30039,30040],{"class":1262},"yes",[1241,30042,1752],{"class":1258},[1241,30044,1608],{"class":1381},[1241,30046,1822],{"class":1258},[1241,30048,30049],{"class":1262},"on",[1241,30051,1752],{"class":1258},[1241,30053,2117],{"class":1381},[1241,30055,30056],{"class":1243,"line":2392},[1241,30057,8853],{"class":1692},[1241,30059,30060,30062,30065,30067,30069,30071,30073,30075,30077,30079,30082,30084,30086,30088,30090,30092,30094,30096,30098,30100,30102,30104],{"class":1243,"line":2397},[1241,30061,29462],{"class":2222},[1241,30063,30064],{"class":29624}," get_list",[1241,30066,1786],{"class":1381},[1241,30068,29471],{"class":29470},[1241,30070,1608],{"class":1381},[1241,30072,27017],{"class":29936},[1241,30074,1397],{"class":1381},[1241,30076,29941],{"class":1434},[1241,30078,1608],{"class":1381},[1241,30080,30081],{"class":29936}," separator",[1241,30083,1397],{"class":1381},[1241,30085,29941],{"class":1434},[1241,30087,1728],{"class":1381},[1241,30089,1822],{"class":1258},[1241,30091,1608],{"class":1262},[1241,30093,1752],{"class":1258},[1241,30095,7808],{"class":1381},[1241,30097,29634],{"class":1381},[1241,30099,29637],{"class":1692},[1241,30101,1904],{"class":1381},[1241,30103,29642],{"class":1434},[1241,30105,29645],{"class":1381},[1241,30107,30108,30110,30113],{"class":1243,"line":2407},[1241,30109,29650],{"class":29445},[1241,30111,30112],{"class":29449},"Get list value from environment",[1241,30114,29453],{"class":29445},[1241,30116,30117,30119,30121,30123,30125,30127,30129,30131,30133,30135,30137,30139],{"class":1243,"line":2417},[1241,30118,29976],{"class":1692},[1241,30120,3003],{"class":1381},[1241,30122,1833],{"class":1692},[1241,30124,1773],{"class":1381},[1241,30126,1777],{"class":1776},[1241,30128,1773],{"class":1381},[1241,30130,1783],{"class":1782},[1241,30132,1786],{"class":1381},[1241,30134,7292],{"class":1782},[1241,30136,1608],{"class":1381},[1241,30138,1798],{"class":1258},[1241,30140,2117],{"class":1381},[1241,30142,30143,30145,30147,30150,30152,30155,30158,30161,30164,30166,30169,30171,30174,30176,30179,30181,30184,30187,30189,30191],{"class":1243,"line":2422},[1241,30144,29729],{"class":1688},[1241,30146,1598],{"class":1381},[1241,30148,30149],{"class":1692},"item",[1241,30151,1773],{"class":1381},[1241,30153,30154],{"class":1782},"strip",[1241,30156,30157],{"class":1381},"()",[1241,30159,30160],{"class":1688}," for",[1241,30162,30163],{"class":1692}," item ",[1241,30165,29675],{"class":1688},[1241,30167,30168],{"class":1692}," value",[1241,30170,1773],{"class":1381},[1241,30172,30173],{"class":1782},"split",[1241,30175,1786],{"class":1381},[1241,30177,30178],{"class":1782},"separator",[1241,30180,7808],{"class":1381},[1241,30182,30183],{"class":1688}," if",[1241,30185,30186],{"class":1692}," item",[1241,30188,1773],{"class":1381},[1241,30190,30154],{"class":1782},[1241,30192,30193],{"class":1381},"()]\n",[1241,30195,30196],{"class":1243,"line":2428},[1241,30197,1303],{"emptyLinePlaceholder":1302},[1241,30199,30200],{"class":1243,"line":2439},[1241,30201,30202],{"class":1247},"# Usage in settings\n",[1241,30204,30205,30208,30210,30212],{"class":1243,"line":2468},[1241,30206,30207],{"class":1692},"env_config ",[1241,30209,3003],{"class":1381},[1241,30211,29438],{"class":1782},[1241,30213,3009],{"class":1381},[1241,30215,30216,30219,30221,30224,30226,30229],{"class":1243,"line":2480},[1241,30217,30218],{"class":1692},"missing_vars ",[1241,30220,3003],{"class":1381},[1241,30222,30223],{"class":1692}," env_config",[1241,30225,1773],{"class":1381},[1241,30227,30228],{"class":1782},"validate_environment",[1241,30230,3009],{"class":1381},[1241,30232,30233,30235,30238],{"class":1243,"line":2490},[1241,30234,1819],{"class":1688},[1241,30236,30237],{"class":1692}," missing_vars",[1241,30239,1840],{"class":1381},[1241,30241,30242,30245,30248,30250,30253,30256,30258,30261,30263,30265],{"class":1243,"line":2500},[1241,30243,30244],{"class":1688},"    raise",[1241,30246,30247],{"class":1434}," ValueError",[1241,30249,1786],{"class":1381},[1241,30251,30252],{"class":2222},"f",[1241,30254,30255],{"class":1262},"\"Missing required environment variables: ",[1241,30257,2229],{"class":2228},[1241,30259,30260],{"class":1782},"missing_vars",[1241,30262,2234],{"class":2228},[1241,30264,1266],{"class":1262},[1241,30266,2117],{"class":1381},[1241,30268,30269],{"class":1243,"line":2505},[1241,30270,1303],{"emptyLinePlaceholder":1302},[1241,30272,30273,30276,30278,30280,30282,30285],{"class":1243,"line":2511},[1241,30274,30275],{"class":1692},"config ",[1241,30277,3003],{"class":1381},[1241,30279,30223],{"class":1692},[1241,30281,1773],{"class":1381},[1241,30283,30284],{"class":1782},"get_config",[1241,30286,3009],{"class":1381},[1035,30288,436],{"id":30289},"security-best-practices",[1026,30291,30292],{},[1042,30293,30294],{},"Secrets Management",[1128,30296,30298],{"className":1674,"code":30297,"language":1676,"meta":1137,"style":1137},"# utils/secrets.py\nimport os\nimport json\nimport boto3\nfrom google.cloud import secretmanager\nfrom azure.keyvault.secrets import SecretClient\nfrom azure.identity import DefaultAzureCredential\n\nclass SecretsManager:\n    \"\"\"Unified secrets management across cloud providers\"\"\"\n    \n    def __init__(self, provider: str = 'env'):\n        self.provider = provider\n        self._client = None\n    \n    def get_secret(self, secret_name: str) -> str:\n        \"\"\"Get secret value based on provider\"\"\"\n        if self.provider == 'aws':\n            return self._get_aws_secret(secret_name)\n        elif self.provider == 'gcp':\n            return self._get_gcp_secret(secret_name)\n        elif self.provider == 'azure':\n            return self._get_azure_secret(secret_name)\n        else:\n            return os.environ.get(secret_name)\n    \n    def _get_aws_secret(self, secret_name: str) -> str:\n        \"\"\"Get secret from AWS Secrets Manager\"\"\"\n        if not self._client:\n            self._client = boto3.client('secretsmanager')\n        \n        try:\n            response = self._client.get_secret_value(SecretId=secret_name)\n            return response['SecretString']\n        except Exception as e:\n            raise ValueError(f\"Failed to get AWS secret {secret_name}: {e}\")\n    \n    def _get_gcp_secret(self, secret_name: str) -> str:\n        \"\"\"Get secret from Google Secret Manager\"\"\"\n        if not self._client:\n            self._client = secretmanager.SecretManagerServiceClient()\n        \n        try:\n            project_id = os.environ.get('GOOGLE_CLOUD_PROJECT')\n            name = f\"projects/{project_id}/secrets/{secret_name}/versions/latest\"\n            response = self._client.access_secret_version(request={\"name\": name})\n            return response.payload.data.decode(\"UTF-8\")\n        except Exception as e:\n            raise ValueError(f\"Failed to get GCP secret {secret_name}: {e}\")\n    \n    def _get_azure_secret(self, secret_name: str) -> str:\n        \"\"\"Get secret from Azure Key Vault\"\"\"\n        if not self._client:\n            vault_url = os.environ.get('AZURE_KEY_VAULT_URL')\n            credential = DefaultAzureCredential()\n            self._client = SecretClient(vault_url=vault_url, credential=credential)\n        \n        try:\n            secret = self._client.get_secret(secret_name)\n            return secret.value\n        except Exception as e:\n            raise ValueError(f\"Failed to get Azure secret {secret_name}: {e}\")\n\n# Usage in settings\nsecrets_manager = SecretsManager(provider=os.environ.get('SECRETS_PROVIDER', 'env'))\nSECRET_KEY = secrets_manager.get_secret('SECRET_KEY')\nDATABASE_PASSWORD = secrets_manager.get_secret('DATABASE_PASSWORD')\n",[1135,30299,30300,30305,30311,30318,30325,30342,30364,30380,30384,30393,30402,30406,30435,30448,30461,30465,30493,30502,30524,30543,30565,30582,30602,30619,30626,30646,30650,30677,30686,30700,30730,30734,30741,30770,30788,30804,30838,30842,30869,30878,30892,30912,30916,30922,30949,30979,31017,31049,31061,31092,31096,31123,31132,31146,31174,31186,31220,31224,31230,31254,31265,31277,31308,31312,31316,31360,31383],{"__ignoreMap":1137},[1241,30301,30302],{"class":1243,"line":1244},[1241,30303,30304],{"class":1247},"# utils/secrets.py\n",[1241,30306,30307,30309],{"class":1243,"line":1251},[1241,30308,1689],{"class":1688},[1241,30310,1693],{"class":1692},[1241,30312,30313,30315],{"class":1243,"line":1281},[1241,30314,1689],{"class":1688},[1241,30316,30317],{"class":1692}," json\n",[1241,30319,30320,30322],{"class":1243,"line":1290},[1241,30321,1689],{"class":1688},[1241,30323,30324],{"class":1692}," boto3\n",[1241,30326,30327,30329,30332,30334,30337,30339],{"class":1243,"line":1299},[1241,30328,1698],{"class":1688},[1241,30330,30331],{"class":1692}," google",[1241,30333,1773],{"class":1381},[1241,30335,30336],{"class":1692},"cloud ",[1241,30338,1689],{"class":1688},[1241,30340,30341],{"class":1692}," secretmanager\n",[1241,30343,30344,30346,30349,30351,30354,30356,30359,30361],{"class":1243,"line":1306},[1241,30345,1698],{"class":1688},[1241,30347,30348],{"class":1692}," azure",[1241,30350,1773],{"class":1381},[1241,30352,30353],{"class":1692},"keyvault",[1241,30355,1773],{"class":1381},[1241,30357,30358],{"class":1692},"secrets ",[1241,30360,1689],{"class":1688},[1241,30362,30363],{"class":1692}," SecretClient\n",[1241,30365,30366,30368,30370,30372,30375,30377],{"class":1243,"line":1312},[1241,30367,1698],{"class":1688},[1241,30369,30348],{"class":1692},[1241,30371,1773],{"class":1381},[1241,30373,30374],{"class":1692},"identity ",[1241,30376,1689],{"class":1688},[1241,30378,30379],{"class":1692}," DefaultAzureCredential\n",[1241,30381,30382],{"class":1243,"line":1321},[1241,30383,1303],{"emptyLinePlaceholder":1302},[1241,30385,30386,30388,30391],{"class":1243,"line":1327},[1241,30387,2640],{"class":2222},[1241,30389,30390],{"class":9162}," SecretsManager",[1241,30392,1840],{"class":1381},[1241,30394,30395,30397,30400],{"class":1243,"line":1333},[1241,30396,29446],{"class":29445},[1241,30398,30399],{"class":29449},"Unified secrets management across cloud providers",[1241,30401,29453],{"class":29445},[1241,30403,30404],{"class":1243,"line":1339},[1241,30405,8853],{"class":1692},[1241,30407,30408,30410,30412,30414,30416,30418,30421,30423,30425,30427,30429,30431,30433],{"class":1243,"line":1345},[1241,30409,29462],{"class":2222},[1241,30411,29465],{"class":7405},[1241,30413,1786],{"class":1381},[1241,30415,29471],{"class":29470},[1241,30417,1608],{"class":1381},[1241,30419,30420],{"class":29936}," provider",[1241,30422,1397],{"class":1381},[1241,30424,29941],{"class":1434},[1241,30426,1728],{"class":1381},[1241,30428,1822],{"class":1258},[1241,30430,26359],{"class":1262},[1241,30432,1752],{"class":1258},[1241,30434,8583],{"class":1381},[1241,30436,30437,30439,30441,30443,30445],{"class":1243,"line":1350},[1241,30438,29478],{"class":1724},[1241,30440,1773],{"class":1381},[1241,30442,19052],{"class":1776},[1241,30444,1728],{"class":1381},[1241,30446,30447],{"class":1692}," provider\n",[1241,30449,30450,30452,30454,30457,30459],{"class":1243,"line":1356},[1241,30451,29478],{"class":1724},[1241,30453,1773],{"class":1381},[1241,30455,30456],{"class":1776},"_client",[1241,30458,1728],{"class":1381},[1241,30460,9491],{"class":1731},[1241,30462,30463],{"class":1243,"line":1554},[1241,30464,8853],{"class":1692},[1241,30466,30467,30469,30472,30474,30476,30478,30481,30483,30485,30487,30489,30491],{"class":1243,"line":1569},[1241,30468,29462],{"class":2222},[1241,30470,30471],{"class":29624}," get_secret",[1241,30473,1786],{"class":1381},[1241,30475,29471],{"class":29470},[1241,30477,1608],{"class":1381},[1241,30479,30480],{"class":29936}," secret_name",[1241,30482,1397],{"class":1381},[1241,30484,29941],{"class":1434},[1241,30486,7808],{"class":1381},[1241,30488,29634],{"class":1381},[1241,30490,29941],{"class":1434},[1241,30492,1840],{"class":1381},[1241,30494,30495,30497,30500],{"class":1243,"line":1584},[1241,30496,29650],{"class":29445},[1241,30498,30499],{"class":29449},"Get secret value based on provider",[1241,30501,29453],{"class":29445},[1241,30503,30504,30507,30509,30511,30513,30516,30518,30520,30522],{"class":1243,"line":1621},[1241,30505,30506],{"class":1688},"        if",[1241,30508,29678],{"class":1724},[1241,30510,1773],{"class":1381},[1241,30512,19052],{"class":1776},[1241,30514,30515],{"class":1709}," ==",[1241,30517,1822],{"class":1258},[1241,30519,1315],{"class":1262},[1241,30521,1752],{"class":1258},[1241,30523,1840],{"class":1381},[1241,30525,30526,30529,30531,30533,30536,30538,30541],{"class":1243,"line":1627},[1241,30527,30528],{"class":1688},"            return",[1241,30530,29678],{"class":1724},[1241,30532,1773],{"class":1381},[1241,30534,30535],{"class":1782},"_get_aws_secret",[1241,30537,1786],{"class":1381},[1241,30539,30540],{"class":1782},"secret_name",[1241,30542,2117],{"class":1381},[1241,30544,30545,30548,30550,30552,30554,30556,30558,30561,30563],{"class":1243,"line":1633},[1241,30546,30547],{"class":1688},"        elif",[1241,30549,29678],{"class":1724},[1241,30551,1773],{"class":1381},[1241,30553,19052],{"class":1776},[1241,30555,30515],{"class":1709},[1241,30557,1822],{"class":1258},[1241,30559,30560],{"class":1262},"gcp",[1241,30562,1752],{"class":1258},[1241,30564,1840],{"class":1381},[1241,30566,30567,30569,30571,30573,30576,30578,30580],{"class":1243,"line":1639},[1241,30568,30528],{"class":1688},[1241,30570,29678],{"class":1724},[1241,30572,1773],{"class":1381},[1241,30574,30575],{"class":1782},"_get_gcp_secret",[1241,30577,1786],{"class":1381},[1241,30579,30540],{"class":1782},[1241,30581,2117],{"class":1381},[1241,30583,30584,30586,30588,30590,30592,30594,30596,30598,30600],{"class":1243,"line":1645},[1241,30585,30547],{"class":1688},[1241,30587,29678],{"class":1724},[1241,30589,1773],{"class":1381},[1241,30591,19052],{"class":1776},[1241,30593,30515],{"class":1709},[1241,30595,1822],{"class":1258},[1241,30597,22015],{"class":1262},[1241,30599,1752],{"class":1258},[1241,30601,1840],{"class":1381},[1241,30603,30604,30606,30608,30610,30613,30615,30617],{"class":1243,"line":2028},[1241,30605,30528],{"class":1688},[1241,30607,29678],{"class":1724},[1241,30609,1773],{"class":1381},[1241,30611,30612],{"class":1782},"_get_azure_secret",[1241,30614,1786],{"class":1381},[1241,30616,30540],{"class":1782},[1241,30618,2117],{"class":1381},[1241,30620,30621,30624],{"class":1243,"line":2042},[1241,30622,30623],{"class":1688},"        else",[1241,30625,1840],{"class":1381},[1241,30627,30628,30630,30632,30634,30636,30638,30640,30642,30644],{"class":1243,"line":2064},[1241,30629,30528],{"class":1688},[1241,30631,1833],{"class":1692},[1241,30633,1773],{"class":1381},[1241,30635,1777],{"class":1776},[1241,30637,1773],{"class":1381},[1241,30639,1783],{"class":1782},[1241,30641,1786],{"class":1381},[1241,30643,30540],{"class":1782},[1241,30645,2117],{"class":1381},[1241,30647,30648],{"class":1243,"line":2070},[1241,30649,8853],{"class":1692},[1241,30651,30652,30654,30657,30659,30661,30663,30665,30667,30669,30671,30673,30675],{"class":1243,"line":2075},[1241,30653,29462],{"class":2222},[1241,30655,30656],{"class":29624}," _get_aws_secret",[1241,30658,1786],{"class":1381},[1241,30660,29471],{"class":29470},[1241,30662,1608],{"class":1381},[1241,30664,30480],{"class":29936},[1241,30666,1397],{"class":1381},[1241,30668,29941],{"class":1434},[1241,30670,7808],{"class":1381},[1241,30672,29634],{"class":1381},[1241,30674,29941],{"class":1434},[1241,30676,1840],{"class":1381},[1241,30678,30679,30681,30684],{"class":1243,"line":2080},[1241,30680,29650],{"class":29445},[1241,30682,30683],{"class":29449},"Get secret from AWS Secrets Manager",[1241,30685,29453],{"class":29445},[1241,30687,30688,30690,30692,30694,30696,30698],{"class":1243,"line":2085},[1241,30689,30506],{"class":1688},[1241,30691,29692],{"class":1709},[1241,30693,29678],{"class":1724},[1241,30695,1773],{"class":1381},[1241,30697,30456],{"class":1776},[1241,30699,1840],{"class":1381},[1241,30701,30702,30705,30707,30709,30711,30714,30716,30719,30721,30723,30726,30728],{"class":1243,"line":2091},[1241,30703,30704],{"class":1724},"            self",[1241,30706,1773],{"class":1381},[1241,30708,30456],{"class":1776},[1241,30710,1728],{"class":1381},[1241,30712,30713],{"class":1692}," boto3",[1241,30715,1773],{"class":1381},[1241,30717,30718],{"class":1782},"client",[1241,30720,1786],{"class":1381},[1241,30722,1752],{"class":1258},[1241,30724,30725],{"class":1262},"secretsmanager",[1241,30727,1752],{"class":1258},[1241,30729,2117],{"class":1381},[1241,30731,30732],{"class":1243,"line":2120},[1241,30733,29787],{"class":1692},[1241,30735,30736,30739],{"class":1243,"line":2148},[1241,30737,30738],{"class":1688},"        try",[1241,30740,1840],{"class":1381},[1241,30742,30743,30746,30748,30750,30752,30754,30756,30759,30761,30764,30766,30768],{"class":1243,"line":2177},[1241,30744,30745],{"class":1692},"            response ",[1241,30747,3003],{"class":1381},[1241,30749,29678],{"class":1724},[1241,30751,1773],{"class":1381},[1241,30753,30456],{"class":1776},[1241,30755,1773],{"class":1381},[1241,30757,30758],{"class":1782},"get_secret_value",[1241,30760,1786],{"class":1381},[1241,30762,30763],{"class":24973},"SecretId",[1241,30765,3003],{"class":1381},[1241,30767,30540],{"class":1782},[1241,30769,2117],{"class":1381},[1241,30771,30772,30774,30777,30779,30781,30784,30786],{"class":1243,"line":2214},[1241,30773,30528],{"class":1688},[1241,30775,30776],{"class":1692}," response",[1241,30778,1904],{"class":1381},[1241,30780,1752],{"class":1258},[1241,30782,30783],{"class":1262},"SecretString",[1241,30785,1752],{"class":1258},[1241,30787,1618],{"class":1381},[1241,30789,30790,30793,30796,30799,30802],{"class":1243,"line":2240},[1241,30791,30792],{"class":1688},"        except",[1241,30794,30795],{"class":1434}," Exception",[1241,30797,30798],{"class":1688}," as",[1241,30800,30801],{"class":1692}," e",[1241,30803,1840],{"class":1381},[1241,30805,30806,30809,30811,30813,30815,30818,30820,30822,30824,30827,30829,30832,30834,30836],{"class":1243,"line":2245},[1241,30807,30808],{"class":1688},"            raise",[1241,30810,30247],{"class":1434},[1241,30812,1786],{"class":1381},[1241,30814,30252],{"class":2222},[1241,30816,30817],{"class":1262},"\"Failed to get AWS secret ",[1241,30819,2229],{"class":2228},[1241,30821,30540],{"class":1782},[1241,30823,2234],{"class":2228},[1241,30825,30826],{"class":1262},": ",[1241,30828,2229],{"class":2228},[1241,30830,30831],{"class":1782},"e",[1241,30833,2234],{"class":2228},[1241,30835,1266],{"class":1262},[1241,30837,2117],{"class":1381},[1241,30839,30840],{"class":1243,"line":2251},[1241,30841,8853],{"class":1692},[1241,30843,30844,30846,30849,30851,30853,30855,30857,30859,30861,30863,30865,30867],{"class":1243,"line":2267},[1241,30845,29462],{"class":2222},[1241,30847,30848],{"class":29624}," _get_gcp_secret",[1241,30850,1786],{"class":1381},[1241,30852,29471],{"class":29470},[1241,30854,1608],{"class":1381},[1241,30856,30480],{"class":29936},[1241,30858,1397],{"class":1381},[1241,30860,29941],{"class":1434},[1241,30862,7808],{"class":1381},[1241,30864,29634],{"class":1381},[1241,30866,29941],{"class":1434},[1241,30868,1840],{"class":1381},[1241,30870,30871,30873,30876],{"class":1243,"line":2289},[1241,30872,29650],{"class":29445},[1241,30874,30875],{"class":29449},"Get secret from Google Secret Manager",[1241,30877,29453],{"class":29445},[1241,30879,30880,30882,30884,30886,30888,30890],{"class":1243,"line":2294},[1241,30881,30506],{"class":1688},[1241,30883,29692],{"class":1709},[1241,30885,29678],{"class":1724},[1241,30887,1773],{"class":1381},[1241,30889,30456],{"class":1776},[1241,30891,1840],{"class":1381},[1241,30893,30894,30896,30898,30900,30902,30905,30907,30910],{"class":1243,"line":2300},[1241,30895,30704],{"class":1724},[1241,30897,1773],{"class":1381},[1241,30899,30456],{"class":1776},[1241,30901,1728],{"class":1381},[1241,30903,30904],{"class":1692}," secretmanager",[1241,30906,1773],{"class":1381},[1241,30908,30909],{"class":1782},"SecretManagerServiceClient",[1241,30911,3009],{"class":1381},[1241,30913,30914],{"class":1243,"line":2314},[1241,30915,29787],{"class":1692},[1241,30917,30918,30920],{"class":1243,"line":2335},[1241,30919,30738],{"class":1688},[1241,30921,1840],{"class":1381},[1241,30923,30924,30927,30929,30931,30933,30935,30937,30939,30941,30943,30945,30947],{"class":1243,"line":2340},[1241,30925,30926],{"class":1692},"            project_id ",[1241,30928,3003],{"class":1381},[1241,30930,1833],{"class":1692},[1241,30932,1773],{"class":1381},[1241,30934,1777],{"class":1776},[1241,30936,1773],{"class":1381},[1241,30938,1783],{"class":1782},[1241,30940,1786],{"class":1381},[1241,30942,1752],{"class":1258},[1241,30944,14957],{"class":1262},[1241,30946,1752],{"class":1258},[1241,30948,2117],{"class":1381},[1241,30950,30951,30954,30956,30958,30961,30963,30965,30967,30970,30972,30974,30976],{"class":1243,"line":2346},[1241,30952,30953],{"class":1692},"            name ",[1241,30955,3003],{"class":1381},[1241,30957,2223],{"class":2222},[1241,30959,30960],{"class":1262},"\"projects/",[1241,30962,2229],{"class":2228},[1241,30964,19988],{"class":1692},[1241,30966,2234],{"class":2228},[1241,30968,30969],{"class":1262},"/secrets/",[1241,30971,2229],{"class":2228},[1241,30973,30540],{"class":1692},[1241,30975,2234],{"class":2228},[1241,30977,30978],{"class":1262},"/versions/latest\"\n",[1241,30980,30981,30983,30985,30987,30989,30991,30993,30996,30998,31001,31004,31006,31008,31010,31012,31014],{"class":1243,"line":2361},[1241,30982,30745],{"class":1692},[1241,30984,3003],{"class":1381},[1241,30986,29678],{"class":1724},[1241,30988,1773],{"class":1381},[1241,30990,30456],{"class":1776},[1241,30992,1773],{"class":1381},[1241,30994,30995],{"class":1782},"access_secret_version",[1241,30997,1786],{"class":1381},[1241,30999,31000],{"class":24973},"request",[1241,31002,31003],{"class":1381},"={",[1241,31005,1266],{"class":1258},[1241,31007,5560],{"class":1262},[1241,31009,1266],{"class":1258},[1241,31011,1397],{"class":1381},[1241,31013,16377],{"class":1782},[1241,31015,31016],{"class":1381},"})\n",[1241,31018,31019,31021,31023,31025,31028,31030,31033,31035,31038,31040,31042,31045,31047],{"class":1243,"line":2371},[1241,31020,30528],{"class":1688},[1241,31022,30776],{"class":1692},[1241,31024,1773],{"class":1381},[1241,31026,31027],{"class":1776},"payload",[1241,31029,1773],{"class":1381},[1241,31031,31032],{"class":1776},"data",[1241,31034,1773],{"class":1381},[1241,31036,31037],{"class":1782},"decode",[1241,31039,1786],{"class":1381},[1241,31041,1266],{"class":1258},[1241,31043,31044],{"class":1262},"UTF-8",[1241,31046,1266],{"class":1258},[1241,31048,2117],{"class":1381},[1241,31050,31051,31053,31055,31057,31059],{"class":1243,"line":2392},[1241,31052,30792],{"class":1688},[1241,31054,30795],{"class":1434},[1241,31056,30798],{"class":1688},[1241,31058,30801],{"class":1692},[1241,31060,1840],{"class":1381},[1241,31062,31063,31065,31067,31069,31071,31074,31076,31078,31080,31082,31084,31086,31088,31090],{"class":1243,"line":2397},[1241,31064,30808],{"class":1688},[1241,31066,30247],{"class":1434},[1241,31068,1786],{"class":1381},[1241,31070,30252],{"class":2222},[1241,31072,31073],{"class":1262},"\"Failed to get GCP secret ",[1241,31075,2229],{"class":2228},[1241,31077,30540],{"class":1782},[1241,31079,2234],{"class":2228},[1241,31081,30826],{"class":1262},[1241,31083,2229],{"class":2228},[1241,31085,30831],{"class":1782},[1241,31087,2234],{"class":2228},[1241,31089,1266],{"class":1262},[1241,31091,2117],{"class":1381},[1241,31093,31094],{"class":1243,"line":2407},[1241,31095,8853],{"class":1692},[1241,31097,31098,31100,31103,31105,31107,31109,31111,31113,31115,31117,31119,31121],{"class":1243,"line":2417},[1241,31099,29462],{"class":2222},[1241,31101,31102],{"class":29624}," _get_azure_secret",[1241,31104,1786],{"class":1381},[1241,31106,29471],{"class":29470},[1241,31108,1608],{"class":1381},[1241,31110,30480],{"class":29936},[1241,31112,1397],{"class":1381},[1241,31114,29941],{"class":1434},[1241,31116,7808],{"class":1381},[1241,31118,29634],{"class":1381},[1241,31120,29941],{"class":1434},[1241,31122,1840],{"class":1381},[1241,31124,31125,31127,31130],{"class":1243,"line":2422},[1241,31126,29650],{"class":29445},[1241,31128,31129],{"class":29449},"Get secret from Azure Key Vault",[1241,31131,29453],{"class":29445},[1241,31133,31134,31136,31138,31140,31142,31144],{"class":1243,"line":2428},[1241,31135,30506],{"class":1688},[1241,31137,29692],{"class":1709},[1241,31139,29678],{"class":1724},[1241,31141,1773],{"class":1381},[1241,31143,30456],{"class":1776},[1241,31145,1840],{"class":1381},[1241,31147,31148,31151,31153,31155,31157,31159,31161,31163,31165,31167,31170,31172],{"class":1243,"line":2439},[1241,31149,31150],{"class":1692},"            vault_url ",[1241,31152,3003],{"class":1381},[1241,31154,1833],{"class":1692},[1241,31156,1773],{"class":1381},[1241,31158,1777],{"class":1776},[1241,31160,1773],{"class":1381},[1241,31162,1783],{"class":1782},[1241,31164,1786],{"class":1381},[1241,31166,1752],{"class":1258},[1241,31168,31169],{"class":1262},"AZURE_KEY_VAULT_URL",[1241,31171,1752],{"class":1258},[1241,31173,2117],{"class":1381},[1241,31175,31176,31179,31181,31184],{"class":1243,"line":2468},[1241,31177,31178],{"class":1692},"            credential ",[1241,31180,3003],{"class":1381},[1241,31182,31183],{"class":1782}," DefaultAzureCredential",[1241,31185,3009],{"class":1381},[1241,31187,31188,31190,31192,31194,31196,31199,31201,31204,31206,31208,31210,31213,31215,31218],{"class":1243,"line":2480},[1241,31189,30704],{"class":1724},[1241,31191,1773],{"class":1381},[1241,31193,30456],{"class":1776},[1241,31195,1728],{"class":1381},[1241,31197,31198],{"class":1782}," SecretClient",[1241,31200,1786],{"class":1381},[1241,31202,31203],{"class":24973},"vault_url",[1241,31205,3003],{"class":1381},[1241,31207,31203],{"class":1782},[1241,31209,1608],{"class":1381},[1241,31211,31212],{"class":24973}," credential",[1241,31214,3003],{"class":1381},[1241,31216,31217],{"class":1782},"credential",[1241,31219,2117],{"class":1381},[1241,31221,31222],{"class":1243,"line":2490},[1241,31223,29787],{"class":1692},[1241,31225,31226,31228],{"class":1243,"line":2500},[1241,31227,30738],{"class":1688},[1241,31229,1840],{"class":1381},[1241,31231,31232,31235,31237,31239,31241,31243,31245,31248,31250,31252],{"class":1243,"line":2505},[1241,31233,31234],{"class":1692},"            secret ",[1241,31236,3003],{"class":1381},[1241,31238,29678],{"class":1724},[1241,31240,1773],{"class":1381},[1241,31242,30456],{"class":1776},[1241,31244,1773],{"class":1381},[1241,31246,31247],{"class":1782},"get_secret",[1241,31249,1786],{"class":1381},[1241,31251,30540],{"class":1782},[1241,31253,2117],{"class":1381},[1241,31255,31256,31258,31261,31263],{"class":1243,"line":2511},[1241,31257,30528],{"class":1688},[1241,31259,31260],{"class":1692}," secret",[1241,31262,1773],{"class":1381},[1241,31264,19201],{"class":1776},[1241,31266,31267,31269,31271,31273,31275],{"class":1243,"line":2521},[1241,31268,30792],{"class":1688},[1241,31270,30795],{"class":1434},[1241,31272,30798],{"class":1688},[1241,31274,30801],{"class":1692},[1241,31276,1840],{"class":1381},[1241,31278,31279,31281,31283,31285,31287,31290,31292,31294,31296,31298,31300,31302,31304,31306],{"class":1243,"line":2531},[1241,31280,30808],{"class":1688},[1241,31282,30247],{"class":1434},[1241,31284,1786],{"class":1381},[1241,31286,30252],{"class":2222},[1241,31288,31289],{"class":1262},"\"Failed to get Azure secret ",[1241,31291,2229],{"class":2228},[1241,31293,30540],{"class":1782},[1241,31295,2234],{"class":2228},[1241,31297,30826],{"class":1262},[1241,31299,2229],{"class":2228},[1241,31301,30831],{"class":1782},[1241,31303,2234],{"class":2228},[1241,31305,1266],{"class":1262},[1241,31307,2117],{"class":1381},[1241,31309,31310],{"class":1243,"line":2536},[1241,31311,1303],{"emptyLinePlaceholder":1302},[1241,31313,31314],{"class":1243,"line":2542},[1241,31315,30202],{"class":1247},[1241,31317,31318,31321,31323,31325,31327,31329,31331,31333,31335,31337,31339,31341,31343,31345,31348,31350,31352,31354,31356,31358],{"class":1243,"line":2552},[1241,31319,31320],{"class":1692},"secrets_manager ",[1241,31322,3003],{"class":1381},[1241,31324,30390],{"class":1782},[1241,31326,1786],{"class":1381},[1241,31328,19052],{"class":24973},[1241,31330,3003],{"class":1381},[1241,31332,2940],{"class":1782},[1241,31334,1773],{"class":1381},[1241,31336,1777],{"class":1776},[1241,31338,1773],{"class":1381},[1241,31340,1783],{"class":1782},[1241,31342,1786],{"class":1381},[1241,31344,1752],{"class":1258},[1241,31346,31347],{"class":1262},"SECRETS_PROVIDER",[1241,31349,1752],{"class":1258},[1241,31351,1608],{"class":1381},[1241,31353,1822],{"class":1258},[1241,31355,26359],{"class":1262},[1241,31357,1752],{"class":1258},[1241,31359,2931],{"class":1381},[1241,31361,31362,31364,31366,31369,31371,31373,31375,31377,31379,31381],{"class":1243,"line":2569},[1241,31363,5802],{"class":1724},[1241,31365,1728],{"class":1381},[1241,31367,31368],{"class":1692}," secrets_manager",[1241,31370,1773],{"class":1381},[1241,31372,31247],{"class":1782},[1241,31374,1786],{"class":1381},[1241,31376,1752],{"class":1258},[1241,31378,5802],{"class":1262},[1241,31380,1752],{"class":1258},[1241,31382,2117],{"class":1381},[1241,31384,31385,31388,31390,31392,31394,31396,31398,31400,31402,31404],{"class":1243,"line":2586},[1241,31386,31387],{"class":1724},"DATABASE_PASSWORD",[1241,31389,1728],{"class":1381},[1241,31391,31368],{"class":1692},[1241,31393,1773],{"class":1381},[1241,31395,31247],{"class":1782},[1241,31397,1786],{"class":1381},[1241,31399,1752],{"class":1258},[1241,31401,31387],{"class":1262},[1241,31403,1752],{"class":1258},[1241,31405,2117],{"class":1381},[1035,31407,31409],{"id":31408},"performance-optimization","Performance Optimization",[1026,31411,31412],{},[1042,31413,31414],{},"Database Connection Optimization",[1128,31416,31418],{"className":1674,"code":31417,"language":1676,"meta":1137,"style":1137},"# settings/database_optimization.py\nimport os\n\n# Connection pooling configuration\nDATABASE_POOL_CONFIG = {\n    'MAX_CONNS': int(os.environ.get('DB_MAX_CONNECTIONS', '20')),\n    'MIN_CONNS': int(os.environ.get('DB_MIN_CONNECTIONS', '5')),\n    'CONN_MAX_AGE': int(os.environ.get('DB_CONN_MAX_AGE', '600')),\n    'CONN_HEALTH_CHECKS': True,\n}\n\n# Read replica configuration\nif os.environ.get('DATABASE_READ_URL'):\n    DATABASES['read'] = {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': os.environ.get('DB_READ_NAME'),\n        'USER': os.environ.get('DB_READ_USER'),\n        'PASSWORD': os.environ.get('DB_READ_PASSWORD'),\n        'HOST': os.environ.get('DB_READ_HOST'),\n        'PORT': os.environ.get('DB_READ_PORT', '5432'),\n        'OPTIONS': {\n            'sslmode': 'require',\n            'connect_timeout': 10,\n        },\n        **DATABASE_POOL_CONFIG,\n    }\n    \n    DATABASE_ROUTERS = ['myproject.routers.DatabaseRouter']\n\n# Query optimization settings\nDATABASES['default']['OPTIONS'].update({\n    'options': '-c default_transaction_isolation=read_committed -c statement_timeout=30000'\n})\n",[1135,31419,31420,31425,31431,31435,31440,31449,31496,31541,31584,31598,31602,31606,31610,31635,31653,31671,31702,31733,31764,31795,31834,31846,31864,31878,31882,31891,31895,31899,31915,31919,31924,31954,31971],{"__ignoreMap":1137},[1241,31421,31422],{"class":1243,"line":1244},[1241,31423,31424],{"class":1247},"# settings/database_optimization.py\n",[1241,31426,31427,31429],{"class":1243,"line":1251},[1241,31428,1689],{"class":1688},[1241,31430,1693],{"class":1692},[1241,31432,31433],{"class":1243,"line":1281},[1241,31434,1303],{"emptyLinePlaceholder":1302},[1241,31436,31437],{"class":1243,"line":1290},[1241,31438,31439],{"class":1247},"# Connection pooling configuration\n",[1241,31441,31442,31445,31447],{"class":1243,"line":1299},[1241,31443,31444],{"class":1724},"DATABASE_POOL_CONFIG",[1241,31446,1728],{"class":1381},[1241,31448,1566],{"class":1381},[1241,31450,31451,31453,31456,31458,31460,31463,31465,31467,31469,31471,31473,31475,31477,31479,31482,31484,31486,31488,31491,31493],{"class":1243,"line":1306},[1241,31452,1746],{"class":1258},[1241,31454,31455],{"class":1262},"MAX_CONNS",[1241,31457,1752],{"class":1258},[1241,31459,1397],{"class":1381},[1241,31461,31462],{"class":1434}," int",[1241,31464,1786],{"class":1381},[1241,31466,2940],{"class":1782},[1241,31468,1773],{"class":1381},[1241,31470,1777],{"class":1776},[1241,31472,1773],{"class":1381},[1241,31474,1783],{"class":1782},[1241,31476,1786],{"class":1381},[1241,31478,1752],{"class":1258},[1241,31480,31481],{"class":1262},"DB_MAX_CONNECTIONS",[1241,31483,1752],{"class":1258},[1241,31485,1608],{"class":1381},[1241,31487,1822],{"class":1258},[1241,31489,31490],{"class":1262},"20",[1241,31492,1752],{"class":1258},[1241,31494,31495],{"class":1381},")),\n",[1241,31497,31498,31500,31503,31505,31507,31509,31511,31513,31515,31517,31519,31521,31523,31525,31528,31530,31532,31534,31537,31539],{"class":1243,"line":1312},[1241,31499,1746],{"class":1258},[1241,31501,31502],{"class":1262},"MIN_CONNS",[1241,31504,1752],{"class":1258},[1241,31506,1397],{"class":1381},[1241,31508,31462],{"class":1434},[1241,31510,1786],{"class":1381},[1241,31512,2940],{"class":1782},[1241,31514,1773],{"class":1381},[1241,31516,1777],{"class":1776},[1241,31518,1773],{"class":1381},[1241,31520,1783],{"class":1782},[1241,31522,1786],{"class":1381},[1241,31524,1752],{"class":1258},[1241,31526,31527],{"class":1262},"DB_MIN_CONNECTIONS",[1241,31529,1752],{"class":1258},[1241,31531,1608],{"class":1381},[1241,31533,1822],{"class":1258},[1241,31535,31536],{"class":1262},"5",[1241,31538,1752],{"class":1258},[1241,31540,31495],{"class":1381},[1241,31542,31543,31545,31547,31549,31551,31553,31555,31557,31559,31561,31563,31565,31567,31569,31572,31574,31576,31578,31580,31582],{"class":1243,"line":1321},[1241,31544,1746],{"class":1258},[1241,31546,4991],{"class":1262},[1241,31548,1752],{"class":1258},[1241,31550,1397],{"class":1381},[1241,31552,31462],{"class":1434},[1241,31554,1786],{"class":1381},[1241,31556,2940],{"class":1782},[1241,31558,1773],{"class":1381},[1241,31560,1777],{"class":1776},[1241,31562,1773],{"class":1381},[1241,31564,1783],{"class":1782},[1241,31566,1786],{"class":1381},[1241,31568,1752],{"class":1258},[1241,31570,31571],{"class":1262},"DB_CONN_MAX_AGE",[1241,31573,1752],{"class":1258},[1241,31575,1608],{"class":1381},[1241,31577,1822],{"class":1258},[1241,31579,25006],{"class":1262},[1241,31581,1752],{"class":1258},[1241,31583,31495],{"class":1381},[1241,31585,31586,31588,31590,31592,31594,31596],{"class":1243,"line":1327},[1241,31587,1746],{"class":1258},[1241,31589,8532],{"class":1262},[1241,31591,1752],{"class":1258},[1241,31593,1397],{"class":1381},[1241,31595,2835],{"class":1731},[1241,31597,1407],{"class":1381},[1241,31599,31600],{"class":1243,"line":1333},[1241,31601,1648],{"class":1381},[1241,31603,31604],{"class":1243,"line":1339},[1241,31605,1303],{"emptyLinePlaceholder":1302},[1241,31607,31608],{"class":1243,"line":1345},[1241,31609,8557],{"class":1247},[1241,31611,31612,31614,31616,31618,31620,31622,31624,31626,31628,31631,31633],{"class":1243,"line":1350},[1241,31613,1819],{"class":1688},[1241,31615,1833],{"class":1692},[1241,31617,1773],{"class":1381},[1241,31619,1777],{"class":1776},[1241,31621,1773],{"class":1381},[1241,31623,1783],{"class":1782},[1241,31625,1786],{"class":1381},[1241,31627,1752],{"class":1258},[1241,31629,31630],{"class":1262},"DATABASE_READ_URL",[1241,31632,1752],{"class":1258},[1241,31634,8583],{"class":1381},[1241,31636,31637,31639,31641,31643,31645,31647,31649,31651],{"class":1243,"line":1356},[1241,31638,1845],{"class":1724},[1241,31640,1904],{"class":1381},[1241,31642,1752],{"class":1258},[1241,31644,8594],{"class":1262},[1241,31646,1752],{"class":1258},[1241,31648,4768],{"class":1381},[1241,31650,1728],{"class":1381},[1241,31652,1566],{"class":1381},[1241,31654,31655,31657,31659,31661,31663,31665,31667,31669],{"class":1243,"line":1554},[1241,31656,1854],{"class":1258},[1241,31658,1871],{"class":1262},[1241,31660,1752],{"class":1258},[1241,31662,1397],{"class":1381},[1241,31664,1822],{"class":1258},[1241,31666,1880],{"class":1262},[1241,31668,1752],{"class":1258},[1241,31670,1407],{"class":1381},[1241,31672,31673,31675,31677,31679,31681,31683,31685,31687,31689,31691,31693,31695,31698,31700],{"class":1243,"line":1569},[1241,31674,1854],{"class":1258},[1241,31676,1891],{"class":1262},[1241,31678,1752],{"class":1258},[1241,31680,1397],{"class":1381},[1241,31682,1833],{"class":1692},[1241,31684,1773],{"class":1381},[1241,31686,1777],{"class":1776},[1241,31688,1773],{"class":1381},[1241,31690,1783],{"class":1782},[1241,31692,1786],{"class":1381},[1241,31694,1752],{"class":1258},[1241,31696,31697],{"class":1262},"DB_READ_NAME",[1241,31699,1752],{"class":1258},[1241,31701,1801],{"class":1381},[1241,31703,31704,31706,31708,31710,31712,31714,31716,31718,31720,31722,31724,31726,31729,31731],{"class":1243,"line":1584},[1241,31705,1854],{"class":1258},[1241,31707,1921],{"class":1262},[1241,31709,1752],{"class":1258},[1241,31711,1397],{"class":1381},[1241,31713,1833],{"class":1692},[1241,31715,1773],{"class":1381},[1241,31717,1777],{"class":1776},[1241,31719,1773],{"class":1381},[1241,31721,1783],{"class":1782},[1241,31723,1786],{"class":1381},[1241,31725,1752],{"class":1258},[1241,31727,31728],{"class":1262},"DB_READ_USER",[1241,31730,1752],{"class":1258},[1241,31732,1801],{"class":1381},[1241,31734,31735,31737,31739,31741,31743,31745,31747,31749,31751,31753,31755,31757,31760,31762],{"class":1243,"line":1621},[1241,31736,1854],{"class":1258},[1241,31738,1949],{"class":1262},[1241,31740,1752],{"class":1258},[1241,31742,1397],{"class":1381},[1241,31744,1833],{"class":1692},[1241,31746,1773],{"class":1381},[1241,31748,1777],{"class":1776},[1241,31750,1773],{"class":1381},[1241,31752,1783],{"class":1782},[1241,31754,1786],{"class":1381},[1241,31756,1752],{"class":1258},[1241,31758,31759],{"class":1262},"DB_READ_PASSWORD",[1241,31761,1752],{"class":1258},[1241,31763,1801],{"class":1381},[1241,31765,31766,31768,31770,31772,31774,31776,31778,31780,31782,31784,31786,31788,31791,31793],{"class":1243,"line":1627},[1241,31767,1854],{"class":1258},[1241,31769,1977],{"class":1262},[1241,31771,1752],{"class":1258},[1241,31773,1397],{"class":1381},[1241,31775,1833],{"class":1692},[1241,31777,1773],{"class":1381},[1241,31779,1777],{"class":1776},[1241,31781,1773],{"class":1381},[1241,31783,1783],{"class":1782},[1241,31785,1786],{"class":1381},[1241,31787,1752],{"class":1258},[1241,31789,31790],{"class":1262},"DB_READ_HOST",[1241,31792,1752],{"class":1258},[1241,31794,1801],{"class":1381},[1241,31796,31797,31799,31801,31803,31805,31807,31809,31811,31813,31815,31817,31819,31822,31824,31826,31828,31830,31832],{"class":1243,"line":1633},[1241,31798,1854],{"class":1258},[1241,31800,2004],{"class":1262},[1241,31802,1752],{"class":1258},[1241,31804,1397],{"class":1381},[1241,31806,1833],{"class":1692},[1241,31808,1773],{"class":1381},[1241,31810,1777],{"class":1776},[1241,31812,1773],{"class":1381},[1241,31814,1783],{"class":1782},[1241,31816,1786],{"class":1381},[1241,31818,1752],{"class":1258},[1241,31820,31821],{"class":1262},"DB_READ_PORT",[1241,31823,1752],{"class":1258},[1241,31825,1608],{"class":1381},[1241,31827,1822],{"class":1258},[1241,31829,4946],{"class":1262},[1241,31831,1752],{"class":1258},[1241,31833,1801],{"class":1381},[1241,31835,31836,31838,31840,31842,31844],{"class":1243,"line":1639},[1241,31837,1854],{"class":1258},[1241,31839,2033],{"class":1262},[1241,31841,1752],{"class":1258},[1241,31843,1397],{"class":1381},[1241,31845,1566],{"class":1381},[1241,31847,31848,31850,31852,31854,31856,31858,31860,31862],{"class":1243,"line":1645},[1241,31849,1868],{"class":1258},[1241,31851,2048],{"class":1262},[1241,31853,1752],{"class":1258},[1241,31855,1397],{"class":1381},[1241,31857,1822],{"class":1258},[1241,31859,2057],{"class":1262},[1241,31861,1752],{"class":1258},[1241,31863,1407],{"class":1381},[1241,31865,31866,31868,31870,31872,31874,31876],{"class":1243,"line":2028},[1241,31867,1868],{"class":1258},[1241,31869,8481],{"class":1262},[1241,31871,1752],{"class":1258},[1241,31873,1397],{"class":1381},[1241,31875,6124],{"class":2476},[1241,31877,1407],{"class":1381},[1241,31879,31880],{"class":1243,"line":2042},[1241,31881,2680],{"class":1381},[1241,31883,31884,31887,31889],{"class":1243,"line":2064},[1241,31885,31886],{"class":1709},"        **",[1241,31888,31444],{"class":1724},[1241,31890,1407],{"class":1381},[1241,31892,31893],{"class":1243,"line":2070},[1241,31894,1636],{"class":1381},[1241,31896,31897],{"class":1243,"line":2075},[1241,31898,8853],{"class":1692},[1241,31900,31901,31903,31905,31907,31909,31911,31913],{"class":1243,"line":2080},[1241,31902,8858],{"class":1724},[1241,31904,1728],{"class":1381},[1241,31906,1598],{"class":1381},[1241,31908,1752],{"class":1258},[1241,31910,8867],{"class":1262},[1241,31912,1752],{"class":1258},[1241,31914,1618],{"class":1381},[1241,31916,31917],{"class":1243,"line":2085},[1241,31918,1303],{"emptyLinePlaceholder":1302},[1241,31920,31921],{"class":1243,"line":2091},[1241,31922,31923],{"class":1247},"# Query optimization settings\n",[1241,31925,31926,31928,31930,31932,31934,31936,31939,31941,31943,31945,31948,31951],{"class":1243,"line":2120},[1241,31927,4785],{"class":1724},[1241,31929,1904],{"class":1381},[1241,31931,1752],{"class":1258},[1241,31933,1857],{"class":1262},[1241,31935,1752],{"class":1258},[1241,31937,31938],{"class":1381},"][",[1241,31940,1752],{"class":1258},[1241,31942,2033],{"class":1262},[1241,31944,1752],{"class":1258},[1241,31946,31947],{"class":1381},"].",[1241,31949,31950],{"class":1782},"update",[1241,31952,31953],{"class":1381},"({\n",[1241,31955,31956,31958,31960,31962,31964,31966,31969],{"class":1243,"line":2148},[1241,31957,1746],{"class":1258},[1241,31959,5959],{"class":1262},[1241,31961,1752],{"class":1258},[1241,31963,1397],{"class":1381},[1241,31965,1822],{"class":1258},[1241,31967,31968],{"class":1262},"-c default_transaction_isolation=read_committed -c statement_timeout=30000",[1241,31970,2264],{"class":1258},[1241,31972,31973],{"class":1243,"line":2177},[1241,31974,31016],{"class":1381},[1035,31976,31978],{"id":31977},"monitoring-and-observability","Monitoring and Observability",[1026,31980,31981],{},[1042,31982,31983],{},"Health Check Implementation",[1128,31985,31987],{"className":1674,"code":31986,"language":1676,"meta":1137,"style":1137},"# health/views.py\nimport time\nimport psutil\nfrom django.http import JsonResponse\nfrom django.db import connection\nfrom django.core.cache import cache\nfrom django.conf import settings\n\ndef comprehensive_health_check(request):\n    \"\"\"Comprehensive health check for cloud deployments\"\"\"\n    start_time = time.time()\n    health_data = {\n        'status': 'healthy',\n        'timestamp': time.time(),\n        'checks': {},\n        'metadata': {\n            'version': getattr(settings, 'VERSION', 'unknown'),\n            'environment': os.environ.get('DJANGO_SETTINGS_MODULE', 'unknown'),\n            'region': os.environ.get('AWS_REGION') or os.environ.get('GOOGLE_CLOUD_REGION') or 'unknown',\n        }\n    }\n    \n    # Database check\n    try:\n        with connection.cursor() as cursor:\n            cursor.execute(\"SELECT 1\")\n        health_data['checks']['database'] = {'status': 'healthy', 'response_time': time.time() - start_time}\n    except Exception as e:\n        health_data['checks']['database'] = {'status': 'unhealthy', 'error': str(e)}\n        health_data['status'] = 'unhealthy'\n    \n    # Cache check\n    try:\n        cache_start = time.time()\n        cache.set('health_check', 'ok', 30)\n        cache_result = cache.get('health_check')\n        cache_time = time.time() - cache_start\n        \n        if cache_result == 'ok':\n            health_data['checks']['cache'] = {'status': 'healthy', 'response_time': cache_time}\n        else:\n            health_data['checks']['cache'] = {'status': 'unhealthy', 'error': 'Cache test failed'}\n            health_data['status'] = 'unhealthy'\n    except Exception as e:\n        health_data['checks']['cache'] = {'status': 'unhealthy', 'error': str(e)}\n        health_data['status'] = 'unhealthy'\n    \n    # System resources check\n    try:\n        cpu_percent = psutil.cpu_percent(interval=1)\n        memory = psutil.virtual_memory()\n        disk = psutil.disk_usage('/')\n        \n        health_data['checks']['system'] = {\n            'status': 'healthy',\n            'cpu_percent': cpu_percent,\n            'memory_percent': memory.percent,\n            'disk_percent': (disk.used / disk.total) * 100,\n        }\n        \n        # Mark as unhealthy if resources are critically low\n        if cpu_percent > 95 or memory.percent > 95:\n            health_data['checks']['system']['status'] = 'unhealthy'\n            health_data['status'] = 'unhealthy'\n            \n    except Exception as e:\n        health_data['checks']['system'] = {'status': 'unhealthy', 'error': str(e)}\n    \n    # External dependencies check\n    health_data['checks']['external'] = check_external_dependencies()\n    \n    total_time = time.time() - start_time\n    health_data['response_time'] = total_time\n    \n    status_code = 200 if health_data['status'] == 'healthy' else 503\n    return JsonResponse(health_data, status=status_code)\n\ndef check_external_dependencies():\n    \"\"\"Check external service dependencies\"\"\"\n    dependencies = {}\n    \n    # Check email service\n    if hasattr(settings, 'EMAIL_HOST'):\n        try:\n            from django.core.mail import get_connection\n            connection = get_connection()\n            connection.open()\n            connection.close()\n            dependencies['email'] = {'status': 'healthy'}\n        except Exception as e:\n            dependencies['email'] = {'status': 'unhealthy', 'error': str(e)}\n    \n    # Check S3/storage service\n    if hasattr(settings, 'AWS_STORAGE_BUCKET_NAME'):\n        try:\n            from django.core.files.storage import default_storage\n            default_storage.exists('health_check.txt')\n            dependencies['storage'] = {'status': 'healthy'}\n        except Exception as e:\n            dependencies['storage'] = {'status': 'unhealthy', 'error': str(e)}\n    \n    return dependencies\n",[1135,31988,31989,31994,32001,32008,32024,32040,32060,32076,32080,32094,32103,32120,32129,32149,32169,32183,32195,32231,32269,32333,32337,32341,32345,32350,32357,32379,32400,32467,32480,32541,32563,32567,32572,32578,32593,32626,32650,32670,32674,32691,32747,32753,32812,32834,32846,32904,32926,32930,32935,32941,32966,32982,33006,33010,33037,33055,33070,33091,33132,33136,33140,33145,33172,33210,33232,33236,33248,33306,33310,33315,33346,33350,33370,33389,33393,33431,33456,33460,33468,33477,33486,33490,33495,33517,33523,33544,33556,33568,33579,33615,33627,33677,33681,33686,33706,33712,33737,33758,33793,33805,33855,33859],{"__ignoreMap":1137},[1241,31990,31991],{"class":1243,"line":1244},[1241,31992,31993],{"class":1247},"# health/views.py\n",[1241,31995,31996,31998],{"class":1243,"line":1251},[1241,31997,1689],{"class":1688},[1241,31999,32000],{"class":1692}," time\n",[1241,32002,32003,32005],{"class":1243,"line":1281},[1241,32004,1689],{"class":1688},[1241,32006,32007],{"class":1692}," psutil\n",[1241,32009,32010,32012,32014,32016,32019,32021],{"class":1243,"line":1290},[1241,32011,1698],{"class":1688},[1241,32013,2980],{"class":1692},[1241,32015,1773],{"class":1381},[1241,32017,32018],{"class":1692},"http ",[1241,32020,1689],{"class":1688},[1241,32022,32023],{"class":1692}," JsonResponse\n",[1241,32025,32026,32028,32030,32032,32035,32037],{"class":1243,"line":1299},[1241,32027,1698],{"class":1688},[1241,32029,2980],{"class":1692},[1241,32031,1773],{"class":1381},[1241,32033,32034],{"class":1692},"db ",[1241,32036,1689],{"class":1688},[1241,32038,32039],{"class":1692}," connection\n",[1241,32041,32042,32044,32046,32048,32050,32052,32055,32057],{"class":1243,"line":1306},[1241,32043,1698],{"class":1688},[1241,32045,2980],{"class":1692},[1241,32047,1773],{"class":1381},[1241,32049,2985],{"class":1692},[1241,32051,1773],{"class":1381},[1241,32053,32054],{"class":1692},"cache ",[1241,32056,1689],{"class":1688},[1241,32058,32059],{"class":1692}," cache\n",[1241,32061,32062,32064,32066,32068,32071,32073],{"class":1243,"line":1312},[1241,32063,1698],{"class":1688},[1241,32065,2980],{"class":1692},[1241,32067,1773],{"class":1381},[1241,32069,32070],{"class":1692},"conf ",[1241,32072,1689],{"class":1688},[1241,32074,32075],{"class":1692}," settings\n",[1241,32077,32078],{"class":1243,"line":1321},[1241,32079,1303],{"emptyLinePlaceholder":1302},[1241,32081,32082,32085,32088,32090,32092],{"class":1243,"line":1327},[1241,32083,32084],{"class":2222},"def",[1241,32086,32087],{"class":29624}," comprehensive_health_check",[1241,32089,1786],{"class":1381},[1241,32091,31000],{"class":29936},[1241,32093,8583],{"class":1381},[1241,32095,32096,32098,32101],{"class":1243,"line":1333},[1241,32097,29446],{"class":29445},[1241,32099,32100],{"class":29449},"Comprehensive health check for cloud deployments",[1241,32102,29453],{"class":29445},[1241,32104,32105,32108,32110,32113,32115,32118],{"class":1243,"line":1339},[1241,32106,32107],{"class":1692},"    start_time ",[1241,32109,3003],{"class":1381},[1241,32111,32112],{"class":1692}," time",[1241,32114,1773],{"class":1381},[1241,32116,32117],{"class":1782},"time",[1241,32119,3009],{"class":1381},[1241,32121,32122,32125,32127],{"class":1243,"line":1345},[1241,32123,32124],{"class":1692},"    health_data ",[1241,32126,3003],{"class":1381},[1241,32128,1566],{"class":1381},[1241,32130,32131,32133,32136,32138,32140,32142,32145,32147],{"class":1243,"line":1350},[1241,32132,1854],{"class":1258},[1241,32134,32135],{"class":1262},"status",[1241,32137,1752],{"class":1258},[1241,32139,1397],{"class":1381},[1241,32141,1822],{"class":1258},[1241,32143,32144],{"class":1262},"healthy",[1241,32146,1752],{"class":1258},[1241,32148,1407],{"class":1381},[1241,32150,32151,32153,32156,32158,32160,32162,32164,32166],{"class":1243,"line":1356},[1241,32152,1854],{"class":1258},[1241,32154,32155],{"class":1262},"timestamp",[1241,32157,1752],{"class":1258},[1241,32159,1397],{"class":1381},[1241,32161,32112],{"class":1692},[1241,32163,1773],{"class":1381},[1241,32165,32117],{"class":1782},[1241,32167,32168],{"class":1381},"(),\n",[1241,32170,32171,32173,32176,32178,32180],{"class":1243,"line":1554},[1241,32172,1854],{"class":1258},[1241,32174,32175],{"class":1262},"checks",[1241,32177,1752],{"class":1258},[1241,32179,1397],{"class":1381},[1241,32181,32182],{"class":1381}," {},\n",[1241,32184,32185,32187,32189,32191,32193],{"class":1243,"line":1569},[1241,32186,1854],{"class":1258},[1241,32188,16998],{"class":1262},[1241,32190,1752],{"class":1258},[1241,32192,1397],{"class":1381},[1241,32194,1566],{"class":1381},[1241,32196,32197,32199,32201,32203,32205,32208,32210,32212,32214,32216,32218,32220,32222,32224,32227,32229],{"class":1243,"line":1584},[1241,32198,1868],{"class":1258},[1241,32200,2557],{"class":1262},[1241,32202,1752],{"class":1258},[1241,32204,1397],{"class":1381},[1241,32206,32207],{"class":7405}," getattr",[1241,32209,1786],{"class":1381},[1241,32211,25925],{"class":1782},[1241,32213,1608],{"class":1381},[1241,32215,1822],{"class":1258},[1241,32217,10097],{"class":1262},[1241,32219,1752],{"class":1258},[1241,32221,1608],{"class":1381},[1241,32223,1822],{"class":1258},[1241,32225,32226],{"class":1262},"unknown",[1241,32228,1752],{"class":1258},[1241,32230,1801],{"class":1381},[1241,32232,32233,32235,32237,32239,32241,32243,32245,32247,32249,32251,32253,32255,32257,32259,32261,32263,32265,32267],{"class":1243,"line":1621},[1241,32234,1868],{"class":1258},[1241,32236,5675],{"class":1262},[1241,32238,1752],{"class":1258},[1241,32240,1397],{"class":1381},[1241,32242,1833],{"class":1692},[1241,32244,1773],{"class":1381},[1241,32246,1777],{"class":1776},[1241,32248,1773],{"class":1381},[1241,32250,1783],{"class":1782},[1241,32252,1786],{"class":1381},[1241,32254,1752],{"class":1258},[1241,32256,2956],{"class":1262},[1241,32258,1752],{"class":1258},[1241,32260,1608],{"class":1381},[1241,32262,1822],{"class":1258},[1241,32264,32226],{"class":1262},[1241,32266,1752],{"class":1258},[1241,32268,1801],{"class":1381},[1241,32270,32271,32273,32275,32277,32279,32281,32283,32285,32287,32289,32291,32293,32295,32297,32299,32302,32304,32306,32308,32310,32312,32314,32316,32319,32321,32323,32325,32327,32329,32331],{"class":1243,"line":1627},[1241,32272,1868],{"class":1258},[1241,32274,28511],{"class":1262},[1241,32276,1752],{"class":1258},[1241,32278,1397],{"class":1381},[1241,32280,1833],{"class":1692},[1241,32282,1773],{"class":1381},[1241,32284,1777],{"class":1776},[1241,32286,1773],{"class":1381},[1241,32288,1783],{"class":1782},[1241,32290,1786],{"class":1381},[1241,32292,1752],{"class":1258},[1241,32294,7424],{"class":1262},[1241,32296,1752],{"class":1258},[1241,32298,7808],{"class":1381},[1241,32300,32301],{"class":1709}," or",[1241,32303,1833],{"class":1692},[1241,32305,1773],{"class":1381},[1241,32307,1777],{"class":1776},[1241,32309,1773],{"class":1381},[1241,32311,1783],{"class":1782},[1241,32313,1786],{"class":1381},[1241,32315,1752],{"class":1258},[1241,32317,32318],{"class":1262},"GOOGLE_CLOUD_REGION",[1241,32320,1752],{"class":1258},[1241,32322,7808],{"class":1381},[1241,32324,32301],{"class":1709},[1241,32326,1822],{"class":1258},[1241,32328,32226],{"class":1262},[1241,32330,1752],{"class":1258},[1241,32332,1407],{"class":1381},[1241,32334,32335],{"class":1243,"line":1633},[1241,32336,1624],{"class":1381},[1241,32338,32339],{"class":1243,"line":1639},[1241,32340,1636],{"class":1381},[1241,32342,32343],{"class":1243,"line":1645},[1241,32344,8853],{"class":1692},[1241,32346,32347],{"class":1243,"line":2028},[1241,32348,32349],{"class":1247},"    # Database check\n",[1241,32351,32352,32355],{"class":1243,"line":2042},[1241,32353,32354],{"class":1688},"    try",[1241,32356,1840],{"class":1381},[1241,32358,32359,32362,32365,32367,32370,32372,32374,32377],{"class":1243,"line":2064},[1241,32360,32361],{"class":1688},"        with",[1241,32363,32364],{"class":1692}," connection",[1241,32366,1773],{"class":1381},[1241,32368,32369],{"class":1782},"cursor",[1241,32371,30157],{"class":1381},[1241,32373,30798],{"class":1688},[1241,32375,32376],{"class":1692}," cursor",[1241,32378,1840],{"class":1381},[1241,32380,32381,32384,32386,32389,32391,32393,32396,32398],{"class":1243,"line":2070},[1241,32382,32383],{"class":1692},"            cursor",[1241,32385,1773],{"class":1381},[1241,32387,32388],{"class":1782},"execute",[1241,32390,1786],{"class":1381},[1241,32392,1266],{"class":1258},[1241,32394,32395],{"class":1262},"SELECT 1",[1241,32397,1266],{"class":1258},[1241,32399,2117],{"class":1381},[1241,32401,32402,32405,32407,32409,32411,32413,32415,32417,32419,32421,32423,32425,32427,32429,32431,32433,32435,32437,32439,32441,32443,32445,32448,32450,32452,32454,32456,32458,32460,32462,32465],{"class":1243,"line":2075},[1241,32403,32404],{"class":1692},"        health_data",[1241,32406,1904],{"class":1381},[1241,32408,1752],{"class":1258},[1241,32410,32175],{"class":1262},[1241,32412,1752],{"class":1258},[1241,32414,31938],{"class":1381},[1241,32416,1752],{"class":1258},[1241,32418,24728],{"class":1262},[1241,32420,1752],{"class":1258},[1241,32422,4768],{"class":1381},[1241,32424,1728],{"class":1381},[1241,32426,3700],{"class":1381},[1241,32428,1752],{"class":1258},[1241,32430,32135],{"class":1262},[1241,32432,1752],{"class":1258},[1241,32434,1397],{"class":1381},[1241,32436,1822],{"class":1258},[1241,32438,32144],{"class":1262},[1241,32440,1752],{"class":1258},[1241,32442,1608],{"class":1381},[1241,32444,1822],{"class":1258},[1241,32446,32447],{"class":1262},"response_time",[1241,32449,1752],{"class":1258},[1241,32451,1397],{"class":1381},[1241,32453,32112],{"class":1692},[1241,32455,1773],{"class":1381},[1241,32457,32117],{"class":1782},[1241,32459,30157],{"class":1381},[1241,32461,24594],{"class":1709},[1241,32463,32464],{"class":1692}," start_time",[1241,32466,1648],{"class":1381},[1241,32468,32469,32472,32474,32476,32478],{"class":1243,"line":2080},[1241,32470,32471],{"class":1688},"    except",[1241,32473,30795],{"class":1434},[1241,32475,30798],{"class":1688},[1241,32477,30801],{"class":1692},[1241,32479,1840],{"class":1381},[1241,32481,32482,32484,32486,32488,32490,32492,32494,32496,32498,32500,32502,32504,32506,32508,32510,32512,32514,32516,32519,32521,32523,32525,32528,32530,32532,32534,32536,32538],{"class":1243,"line":2085},[1241,32483,32404],{"class":1692},[1241,32485,1904],{"class":1381},[1241,32487,1752],{"class":1258},[1241,32489,32175],{"class":1262},[1241,32491,1752],{"class":1258},[1241,32493,31938],{"class":1381},[1241,32495,1752],{"class":1258},[1241,32497,24728],{"class":1262},[1241,32499,1752],{"class":1258},[1241,32501,4768],{"class":1381},[1241,32503,1728],{"class":1381},[1241,32505,3700],{"class":1381},[1241,32507,1752],{"class":1258},[1241,32509,32135],{"class":1262},[1241,32511,1752],{"class":1258},[1241,32513,1397],{"class":1381},[1241,32515,1822],{"class":1258},[1241,32517,32518],{"class":1262},"unhealthy",[1241,32520,1752],{"class":1258},[1241,32522,1608],{"class":1381},[1241,32524,1822],{"class":1258},[1241,32526,32527],{"class":1262},"error",[1241,32529,1752],{"class":1258},[1241,32531,1397],{"class":1381},[1241,32533,29941],{"class":1434},[1241,32535,1786],{"class":1381},[1241,32537,30831],{"class":1782},[1241,32539,32540],{"class":1381},")}\n",[1241,32542,32543,32545,32547,32549,32551,32553,32555,32557,32559,32561],{"class":1243,"line":2091},[1241,32544,32404],{"class":1692},[1241,32546,1904],{"class":1381},[1241,32548,1752],{"class":1258},[1241,32550,32135],{"class":1262},[1241,32552,1752],{"class":1258},[1241,32554,4768],{"class":1381},[1241,32556,1728],{"class":1381},[1241,32558,1822],{"class":1258},[1241,32560,32518],{"class":1262},[1241,32562,2264],{"class":1258},[1241,32564,32565],{"class":1243,"line":2120},[1241,32566,8853],{"class":1692},[1241,32568,32569],{"class":1243,"line":2148},[1241,32570,32571],{"class":1247},"    # Cache check\n",[1241,32573,32574,32576],{"class":1243,"line":2177},[1241,32575,32354],{"class":1688},[1241,32577,1840],{"class":1381},[1241,32579,32580,32583,32585,32587,32589,32591],{"class":1243,"line":2214},[1241,32581,32582],{"class":1692},"        cache_start ",[1241,32584,3003],{"class":1381},[1241,32586,32112],{"class":1692},[1241,32588,1773],{"class":1381},[1241,32590,32117],{"class":1782},[1241,32592,3009],{"class":1381},[1241,32594,32595,32598,32600,32602,32604,32606,32609,32611,32613,32615,32618,32620,32622,32624],{"class":1243,"line":2240},[1241,32596,32597],{"class":1692},"        cache",[1241,32599,1773],{"class":1381},[1241,32601,7406],{"class":1782},[1241,32603,1786],{"class":1381},[1241,32605,1752],{"class":1258},[1241,32607,32608],{"class":1262},"health_check",[1241,32610,1752],{"class":1258},[1241,32612,1608],{"class":1381},[1241,32614,1822],{"class":1258},[1241,32616,32617],{"class":1262},"ok",[1241,32619,1752],{"class":1258},[1241,32621,1608],{"class":1381},[1241,32623,4450],{"class":2476},[1241,32625,2117],{"class":1381},[1241,32627,32628,32631,32633,32636,32638,32640,32642,32644,32646,32648],{"class":1243,"line":2245},[1241,32629,32630],{"class":1692},"        cache_result ",[1241,32632,3003],{"class":1381},[1241,32634,32635],{"class":1692}," cache",[1241,32637,1773],{"class":1381},[1241,32639,1783],{"class":1782},[1241,32641,1786],{"class":1381},[1241,32643,1752],{"class":1258},[1241,32645,32608],{"class":1262},[1241,32647,1752],{"class":1258},[1241,32649,2117],{"class":1381},[1241,32651,32652,32655,32657,32659,32661,32663,32665,32667],{"class":1243,"line":2251},[1241,32653,32654],{"class":1692},"        cache_time ",[1241,32656,3003],{"class":1381},[1241,32658,32112],{"class":1692},[1241,32660,1773],{"class":1381},[1241,32662,32117],{"class":1782},[1241,32664,30157],{"class":1381},[1241,32666,24594],{"class":1709},[1241,32668,32669],{"class":1692}," cache_start\n",[1241,32671,32672],{"class":1243,"line":2267},[1241,32673,29787],{"class":1692},[1241,32675,32676,32678,32681,32683,32685,32687,32689],{"class":1243,"line":2289},[1241,32677,30506],{"class":1688},[1241,32679,32680],{"class":1692}," cache_result ",[1241,32682,24710],{"class":1709},[1241,32684,1822],{"class":1258},[1241,32686,32617],{"class":1262},[1241,32688,1752],{"class":1258},[1241,32690,1840],{"class":1381},[1241,32692,32693,32696,32698,32700,32702,32704,32706,32708,32710,32712,32714,32716,32718,32720,32722,32724,32726,32728,32730,32732,32734,32736,32738,32740,32742,32745],{"class":1243,"line":2294},[1241,32694,32695],{"class":1692},"            health_data",[1241,32697,1904],{"class":1381},[1241,32699,1752],{"class":1258},[1241,32701,32175],{"class":1262},[1241,32703,1752],{"class":1258},[1241,32705,31938],{"class":1381},[1241,32707,1752],{"class":1258},[1241,32709,20708],{"class":1262},[1241,32711,1752],{"class":1258},[1241,32713,4768],{"class":1381},[1241,32715,1728],{"class":1381},[1241,32717,3700],{"class":1381},[1241,32719,1752],{"class":1258},[1241,32721,32135],{"class":1262},[1241,32723,1752],{"class":1258},[1241,32725,1397],{"class":1381},[1241,32727,1822],{"class":1258},[1241,32729,32144],{"class":1262},[1241,32731,1752],{"class":1258},[1241,32733,1608],{"class":1381},[1241,32735,1822],{"class":1258},[1241,32737,32447],{"class":1262},[1241,32739,1752],{"class":1258},[1241,32741,1397],{"class":1381},[1241,32743,32744],{"class":1692}," cache_time",[1241,32746,1648],{"class":1381},[1241,32748,32749,32751],{"class":1243,"line":2300},[1241,32750,30623],{"class":1688},[1241,32752,1840],{"class":1381},[1241,32754,32755,32757,32759,32761,32763,32765,32767,32769,32771,32773,32775,32777,32779,32781,32783,32785,32787,32789,32791,32793,32795,32797,32799,32801,32803,32805,32808,32810],{"class":1243,"line":2314},[1241,32756,32695],{"class":1692},[1241,32758,1904],{"class":1381},[1241,32760,1752],{"class":1258},[1241,32762,32175],{"class":1262},[1241,32764,1752],{"class":1258},[1241,32766,31938],{"class":1381},[1241,32768,1752],{"class":1258},[1241,32770,20708],{"class":1262},[1241,32772,1752],{"class":1258},[1241,32774,4768],{"class":1381},[1241,32776,1728],{"class":1381},[1241,32778,3700],{"class":1381},[1241,32780,1752],{"class":1258},[1241,32782,32135],{"class":1262},[1241,32784,1752],{"class":1258},[1241,32786,1397],{"class":1381},[1241,32788,1822],{"class":1258},[1241,32790,32518],{"class":1262},[1241,32792,1752],{"class":1258},[1241,32794,1608],{"class":1381},[1241,32796,1822],{"class":1258},[1241,32798,32527],{"class":1262},[1241,32800,1752],{"class":1258},[1241,32802,1397],{"class":1381},[1241,32804,1822],{"class":1258},[1241,32806,32807],{"class":1262},"Cache test failed",[1241,32809,1752],{"class":1258},[1241,32811,1648],{"class":1381},[1241,32813,32814,32816,32818,32820,32822,32824,32826,32828,32830,32832],{"class":1243,"line":2335},[1241,32815,32695],{"class":1692},[1241,32817,1904],{"class":1381},[1241,32819,1752],{"class":1258},[1241,32821,32135],{"class":1262},[1241,32823,1752],{"class":1258},[1241,32825,4768],{"class":1381},[1241,32827,1728],{"class":1381},[1241,32829,1822],{"class":1258},[1241,32831,32518],{"class":1262},[1241,32833,2264],{"class":1258},[1241,32835,32836,32838,32840,32842,32844],{"class":1243,"line":2340},[1241,32837,32471],{"class":1688},[1241,32839,30795],{"class":1434},[1241,32841,30798],{"class":1688},[1241,32843,30801],{"class":1692},[1241,32845,1840],{"class":1381},[1241,32847,32848,32850,32852,32854,32856,32858,32860,32862,32864,32866,32868,32870,32872,32874,32876,32878,32880,32882,32884,32886,32888,32890,32892,32894,32896,32898,32900,32902],{"class":1243,"line":2346},[1241,32849,32404],{"class":1692},[1241,32851,1904],{"class":1381},[1241,32853,1752],{"class":1258},[1241,32855,32175],{"class":1262},[1241,32857,1752],{"class":1258},[1241,32859,31938],{"class":1381},[1241,32861,1752],{"class":1258},[1241,32863,20708],{"class":1262},[1241,32865,1752],{"class":1258},[1241,32867,4768],{"class":1381},[1241,32869,1728],{"class":1381},[1241,32871,3700],{"class":1381},[1241,32873,1752],{"class":1258},[1241,32875,32135],{"class":1262},[1241,32877,1752],{"class":1258},[1241,32879,1397],{"class":1381},[1241,32881,1822],{"class":1258},[1241,32883,32518],{"class":1262},[1241,32885,1752],{"class":1258},[1241,32887,1608],{"class":1381},[1241,32889,1822],{"class":1258},[1241,32891,32527],{"class":1262},[1241,32893,1752],{"class":1258},[1241,32895,1397],{"class":1381},[1241,32897,29941],{"class":1434},[1241,32899,1786],{"class":1381},[1241,32901,30831],{"class":1782},[1241,32903,32540],{"class":1381},[1241,32905,32906,32908,32910,32912,32914,32916,32918,32920,32922,32924],{"class":1243,"line":2361},[1241,32907,32404],{"class":1692},[1241,32909,1904],{"class":1381},[1241,32911,1752],{"class":1258},[1241,32913,32135],{"class":1262},[1241,32915,1752],{"class":1258},[1241,32917,4768],{"class":1381},[1241,32919,1728],{"class":1381},[1241,32921,1822],{"class":1258},[1241,32923,32518],{"class":1262},[1241,32925,2264],{"class":1258},[1241,32927,32928],{"class":1243,"line":2371},[1241,32929,8853],{"class":1692},[1241,32931,32932],{"class":1243,"line":2392},[1241,32933,32934],{"class":1247},"    # System resources check\n",[1241,32936,32937,32939],{"class":1243,"line":2397},[1241,32938,32354],{"class":1688},[1241,32940,1840],{"class":1381},[1241,32942,32943,32946,32948,32951,32953,32956,32958,32960,32962,32964],{"class":1243,"line":2407},[1241,32944,32945],{"class":1692},"        cpu_percent ",[1241,32947,3003],{"class":1381},[1241,32949,32950],{"class":1692}," psutil",[1241,32952,1773],{"class":1381},[1241,32954,32955],{"class":1782},"cpu_percent",[1241,32957,1786],{"class":1381},[1241,32959,6102],{"class":24973},[1241,32961,3003],{"class":1381},[1241,32963,10576],{"class":2476},[1241,32965,2117],{"class":1381},[1241,32967,32968,32971,32973,32975,32977,32980],{"class":1243,"line":2417},[1241,32969,32970],{"class":1692},"        memory ",[1241,32972,3003],{"class":1381},[1241,32974,32950],{"class":1692},[1241,32976,1773],{"class":1381},[1241,32978,32979],{"class":1782},"virtual_memory",[1241,32981,3009],{"class":1381},[1241,32983,32984,32987,32989,32991,32993,32996,32998,33000,33002,33004],{"class":1243,"line":2422},[1241,32985,32986],{"class":1692},"        disk ",[1241,32988,3003],{"class":1381},[1241,32990,32950],{"class":1692},[1241,32992,1773],{"class":1381},[1241,32994,32995],{"class":1782},"disk_usage",[1241,32997,1786],{"class":1381},[1241,32999,1752],{"class":1258},[1241,33001,21671],{"class":1262},[1241,33003,1752],{"class":1258},[1241,33005,2117],{"class":1381},[1241,33007,33008],{"class":1243,"line":2428},[1241,33009,29787],{"class":1692},[1241,33011,33012,33014,33016,33018,33020,33022,33024,33026,33029,33031,33033,33035],{"class":1243,"line":2439},[1241,33013,32404],{"class":1692},[1241,33015,1904],{"class":1381},[1241,33017,1752],{"class":1258},[1241,33019,32175],{"class":1262},[1241,33021,1752],{"class":1258},[1241,33023,31938],{"class":1381},[1241,33025,1752],{"class":1258},[1241,33027,33028],{"class":1262},"system",[1241,33030,1752],{"class":1258},[1241,33032,4768],{"class":1381},[1241,33034,1728],{"class":1381},[1241,33036,1566],{"class":1381},[1241,33038,33039,33041,33043,33045,33047,33049,33051,33053],{"class":1243,"line":2468},[1241,33040,1868],{"class":1258},[1241,33042,32135],{"class":1262},[1241,33044,1752],{"class":1258},[1241,33046,1397],{"class":1381},[1241,33048,1822],{"class":1258},[1241,33050,32144],{"class":1262},[1241,33052,1752],{"class":1258},[1241,33054,1407],{"class":1381},[1241,33056,33057,33059,33061,33063,33065,33068],{"class":1243,"line":2480},[1241,33058,1868],{"class":1258},[1241,33060,32955],{"class":1262},[1241,33062,1752],{"class":1258},[1241,33064,1397],{"class":1381},[1241,33066,33067],{"class":1692}," cpu_percent",[1241,33069,1407],{"class":1381},[1241,33071,33072,33074,33077,33079,33081,33084,33086,33089],{"class":1243,"line":2490},[1241,33073,1868],{"class":1258},[1241,33075,33076],{"class":1262},"memory_percent",[1241,33078,1752],{"class":1258},[1241,33080,1397],{"class":1381},[1241,33082,33083],{"class":1692}," memory",[1241,33085,1773],{"class":1381},[1241,33087,33088],{"class":1776},"percent",[1241,33090,1407],{"class":1381},[1241,33092,33093,33095,33098,33100,33102,33104,33107,33109,33112,33115,33118,33120,33123,33125,33128,33130],{"class":1243,"line":2500},[1241,33094,1868],{"class":1258},[1241,33096,33097],{"class":1262},"disk_percent",[1241,33099,1752],{"class":1258},[1241,33101,1397],{"class":1381},[1241,33103,2447],{"class":1381},[1241,33105,33106],{"class":1692},"disk",[1241,33108,1773],{"class":1381},[1241,33110,33111],{"class":1776},"used",[1241,33113,33114],{"class":1709}," /",[1241,33116,33117],{"class":1692}," disk",[1241,33119,1773],{"class":1381},[1241,33121,33122],{"class":1776},"total",[1241,33124,7808],{"class":1381},[1241,33126,33127],{"class":1709}," *",[1241,33129,8135],{"class":2476},[1241,33131,1407],{"class":1381},[1241,33133,33134],{"class":1243,"line":2505},[1241,33135,1624],{"class":1381},[1241,33137,33138],{"class":1243,"line":2511},[1241,33139,29787],{"class":1692},[1241,33141,33142],{"class":1243,"line":2521},[1241,33143,33144],{"class":1247},"        # Mark as unhealthy if resources are critically low\n",[1241,33146,33147,33149,33152,33155,33158,33160,33162,33164,33166,33168,33170],{"class":1243,"line":2531},[1241,33148,30506],{"class":1688},[1241,33150,33151],{"class":1692}," cpu_percent ",[1241,33153,33154],{"class":1709},">",[1241,33156,33157],{"class":2476}," 95",[1241,33159,32301],{"class":1709},[1241,33161,33083],{"class":1692},[1241,33163,1773],{"class":1381},[1241,33165,33088],{"class":1776},[1241,33167,8924],{"class":1709},[1241,33169,33157],{"class":2476},[1241,33171,1840],{"class":1381},[1241,33173,33174,33176,33178,33180,33182,33184,33186,33188,33190,33192,33194,33196,33198,33200,33202,33204,33206,33208],{"class":1243,"line":2536},[1241,33175,32695],{"class":1692},[1241,33177,1904],{"class":1381},[1241,33179,1752],{"class":1258},[1241,33181,32175],{"class":1262},[1241,33183,1752],{"class":1258},[1241,33185,31938],{"class":1381},[1241,33187,1752],{"class":1258},[1241,33189,33028],{"class":1262},[1241,33191,1752],{"class":1258},[1241,33193,31938],{"class":1381},[1241,33195,1752],{"class":1258},[1241,33197,32135],{"class":1262},[1241,33199,1752],{"class":1258},[1241,33201,4768],{"class":1381},[1241,33203,1728],{"class":1381},[1241,33205,1822],{"class":1258},[1241,33207,32518],{"class":1262},[1241,33209,2264],{"class":1258},[1241,33211,33212,33214,33216,33218,33220,33222,33224,33226,33228,33230],{"class":1243,"line":2542},[1241,33213,32695],{"class":1692},[1241,33215,1904],{"class":1381},[1241,33217,1752],{"class":1258},[1241,33219,32135],{"class":1262},[1241,33221,1752],{"class":1258},[1241,33223,4768],{"class":1381},[1241,33225,1728],{"class":1381},[1241,33227,1822],{"class":1258},[1241,33229,32518],{"class":1262},[1241,33231,2264],{"class":1258},[1241,33233,33234],{"class":1243,"line":2552},[1241,33235,12668],{"class":1692},[1241,33237,33238,33240,33242,33244,33246],{"class":1243,"line":2569},[1241,33239,32471],{"class":1688},[1241,33241,30795],{"class":1434},[1241,33243,30798],{"class":1688},[1241,33245,30801],{"class":1692},[1241,33247,1840],{"class":1381},[1241,33249,33250,33252,33254,33256,33258,33260,33262,33264,33266,33268,33270,33272,33274,33276,33278,33280,33282,33284,33286,33288,33290,33292,33294,33296,33298,33300,33302,33304],{"class":1243,"line":2586},[1241,33251,32404],{"class":1692},[1241,33253,1904],{"class":1381},[1241,33255,1752],{"class":1258},[1241,33257,32175],{"class":1262},[1241,33259,1752],{"class":1258},[1241,33261,31938],{"class":1381},[1241,33263,1752],{"class":1258},[1241,33265,33028],{"class":1262},[1241,33267,1752],{"class":1258},[1241,33269,4768],{"class":1381},[1241,33271,1728],{"class":1381},[1241,33273,3700],{"class":1381},[1241,33275,1752],{"class":1258},[1241,33277,32135],{"class":1262},[1241,33279,1752],{"class":1258},[1241,33281,1397],{"class":1381},[1241,33283,1822],{"class":1258},[1241,33285,32518],{"class":1262},[1241,33287,1752],{"class":1258},[1241,33289,1608],{"class":1381},[1241,33291,1822],{"class":1258},[1241,33293,32527],{"class":1262},[1241,33295,1752],{"class":1258},[1241,33297,1397],{"class":1381},[1241,33299,29941],{"class":1434},[1241,33301,1786],{"class":1381},[1241,33303,30831],{"class":1782},[1241,33305,32540],{"class":1381},[1241,33307,33308],{"class":1243,"line":2600},[1241,33309,8853],{"class":1692},[1241,33311,33312],{"class":1243,"line":2614},[1241,33313,33314],{"class":1247},"    # External dependencies check\n",[1241,33316,33317,33320,33322,33324,33326,33328,33330,33332,33335,33337,33339,33341,33344],{"class":1243,"line":2635},[1241,33318,33319],{"class":1692},"    health_data",[1241,33321,1904],{"class":1381},[1241,33323,1752],{"class":1258},[1241,33325,32175],{"class":1262},[1241,33327,1752],{"class":1258},[1241,33329,31938],{"class":1381},[1241,33331,1752],{"class":1258},[1241,33333,33334],{"class":1262},"external",[1241,33336,1752],{"class":1258},[1241,33338,4768],{"class":1381},[1241,33340,1728],{"class":1381},[1241,33342,33343],{"class":1782}," check_external_dependencies",[1241,33345,3009],{"class":1381},[1241,33347,33348],{"class":1243,"line":2656},[1241,33349,8853],{"class":1692},[1241,33351,33352,33355,33357,33359,33361,33363,33365,33367],{"class":1243,"line":2677},[1241,33353,33354],{"class":1692},"    total_time ",[1241,33356,3003],{"class":1381},[1241,33358,32112],{"class":1692},[1241,33360,1773],{"class":1381},[1241,33362,32117],{"class":1782},[1241,33364,30157],{"class":1381},[1241,33366,24594],{"class":1709},[1241,33368,33369],{"class":1692}," start_time\n",[1241,33371,33372,33374,33376,33378,33380,33382,33384,33386],{"class":1243,"line":2683},[1241,33373,33319],{"class":1692},[1241,33375,1904],{"class":1381},[1241,33377,1752],{"class":1258},[1241,33379,32447],{"class":1262},[1241,33381,1752],{"class":1258},[1241,33383,4768],{"class":1381},[1241,33385,1728],{"class":1381},[1241,33387,33388],{"class":1692}," total_time\n",[1241,33390,33391],{"class":1243,"line":2697},[1241,33392,8853],{"class":1692},[1241,33394,33395,33398,33400,33402,33404,33407,33409,33411,33413,33415,33417,33419,33421,33423,33425,33428],{"class":1243,"line":2716},[1241,33396,33397],{"class":1692},"    status_code ",[1241,33399,3003],{"class":1381},[1241,33401,7186],{"class":2476},[1241,33403,30183],{"class":1688},[1241,33405,33406],{"class":1692}," health_data",[1241,33408,1904],{"class":1381},[1241,33410,1752],{"class":1258},[1241,33412,32135],{"class":1262},[1241,33414,1752],{"class":1258},[1241,33416,4768],{"class":1381},[1241,33418,30515],{"class":1709},[1241,33420,1822],{"class":1258},[1241,33422,32144],{"class":1262},[1241,33424,1752],{"class":1258},[1241,33426,33427],{"class":1688}," else",[1241,33429,33430],{"class":2476}," 503\n",[1241,33432,33433,33436,33439,33441,33444,33446,33449,33451,33454],{"class":1243,"line":2736},[1241,33434,33435],{"class":1688},"    return",[1241,33437,33438],{"class":1782}," JsonResponse",[1241,33440,1786],{"class":1381},[1241,33442,33443],{"class":1782},"health_data",[1241,33445,1608],{"class":1381},[1241,33447,33448],{"class":24973}," status",[1241,33450,3003],{"class":1381},[1241,33452,33453],{"class":1782},"status_code",[1241,33455,2117],{"class":1381},[1241,33457,33458],{"class":1243,"line":2741},[1241,33459,1303],{"emptyLinePlaceholder":1302},[1241,33461,33462,33464,33466],{"class":1243,"line":2747},[1241,33463,32084],{"class":2222},[1241,33465,33343],{"class":29624},[1241,33467,29873],{"class":1381},[1241,33469,33470,33472,33475],{"class":1243,"line":2761},[1241,33471,29446],{"class":29445},[1241,33473,33474],{"class":29449},"Check external service dependencies",[1241,33476,29453],{"class":29445},[1241,33478,33479,33482,33484],{"class":1243,"line":2775},[1241,33480,33481],{"class":1692},"    dependencies ",[1241,33483,3003],{"class":1381},[1241,33485,29782],{"class":1381},[1241,33487,33488],{"class":1243,"line":2804},[1241,33489,8853],{"class":1692},[1241,33491,33492],{"class":1243,"line":2823},[1241,33493,33494],{"class":1247},"    # Check email service\n",[1241,33496,33497,33500,33503,33505,33507,33509,33511,33513,33515],{"class":1243,"line":2840},[1241,33498,33499],{"class":1688},"    if",[1241,33501,33502],{"class":7405}," hasattr",[1241,33504,1786],{"class":1381},[1241,33506,25925],{"class":1782},[1241,33508,1608],{"class":1381},[1241,33510,1822],{"class":1258},[1241,33512,25585],{"class":1262},[1241,33514,1752],{"class":1258},[1241,33516,8583],{"class":1381},[1241,33518,33519,33521],{"class":1243,"line":2845},[1241,33520,30738],{"class":1688},[1241,33522,1840],{"class":1381},[1241,33524,33525,33528,33530,33532,33534,33536,33539,33541],{"class":1243,"line":2850},[1241,33526,33527],{"class":1688},"            from",[1241,33529,2980],{"class":1692},[1241,33531,1773],{"class":1381},[1241,33533,2985],{"class":1692},[1241,33535,1773],{"class":1381},[1241,33537,33538],{"class":1692},"mail ",[1241,33540,1689],{"class":1688},[1241,33542,33543],{"class":1692}," get_connection\n",[1241,33545,33546,33549,33551,33554],{"class":1243,"line":3776},[1241,33547,33548],{"class":1692},"            connection ",[1241,33550,3003],{"class":1381},[1241,33552,33553],{"class":1782}," get_connection",[1241,33555,3009],{"class":1381},[1241,33557,33558,33561,33563,33566],{"class":1243,"line":3782},[1241,33559,33560],{"class":1692},"            connection",[1241,33562,1773],{"class":1381},[1241,33564,33565],{"class":1782},"open",[1241,33567,3009],{"class":1381},[1241,33569,33570,33572,33574,33577],{"class":1243,"line":3789},[1241,33571,33560],{"class":1692},[1241,33573,1773],{"class":1381},[1241,33575,33576],{"class":1782},"close",[1241,33578,3009],{"class":1381},[1241,33580,33581,33584,33586,33588,33591,33593,33595,33597,33599,33601,33603,33605,33607,33609,33611,33613],{"class":1243,"line":3796},[1241,33582,33583],{"class":1692},"            dependencies",[1241,33585,1904],{"class":1381},[1241,33587,1752],{"class":1258},[1241,33589,33590],{"class":1262},"email",[1241,33592,1752],{"class":1258},[1241,33594,4768],{"class":1381},[1241,33596,1728],{"class":1381},[1241,33598,3700],{"class":1381},[1241,33600,1752],{"class":1258},[1241,33602,32135],{"class":1262},[1241,33604,1752],{"class":1258},[1241,33606,1397],{"class":1381},[1241,33608,1822],{"class":1258},[1241,33610,32144],{"class":1262},[1241,33612,1752],{"class":1258},[1241,33614,1648],{"class":1381},[1241,33616,33617,33619,33621,33623,33625],{"class":1243,"line":3811},[1241,33618,30792],{"class":1688},[1241,33620,30795],{"class":1434},[1241,33622,30798],{"class":1688},[1241,33624,30801],{"class":1692},[1241,33626,1840],{"class":1381},[1241,33628,33629,33631,33633,33635,33637,33639,33641,33643,33645,33647,33649,33651,33653,33655,33657,33659,33661,33663,33665,33667,33669,33671,33673,33675],{"class":1243,"line":3826},[1241,33630,33583],{"class":1692},[1241,33632,1904],{"class":1381},[1241,33634,1752],{"class":1258},[1241,33636,33590],{"class":1262},[1241,33638,1752],{"class":1258},[1241,33640,4768],{"class":1381},[1241,33642,1728],{"class":1381},[1241,33644,3700],{"class":1381},[1241,33646,1752],{"class":1258},[1241,33648,32135],{"class":1262},[1241,33650,1752],{"class":1258},[1241,33652,1397],{"class":1381},[1241,33654,1822],{"class":1258},[1241,33656,32518],{"class":1262},[1241,33658,1752],{"class":1258},[1241,33660,1608],{"class":1381},[1241,33662,1822],{"class":1258},[1241,33664,32527],{"class":1262},[1241,33666,1752],{"class":1258},[1241,33668,1397],{"class":1381},[1241,33670,29941],{"class":1434},[1241,33672,1786],{"class":1381},[1241,33674,30831],{"class":1782},[1241,33676,32540],{"class":1381},[1241,33678,33679],{"class":1243,"line":3841},[1241,33680,8853],{"class":1692},[1241,33682,33683],{"class":1243,"line":3856},[1241,33684,33685],{"class":1247},"    # Check S3/storage service\n",[1241,33687,33688,33690,33692,33694,33696,33698,33700,33702,33704],{"class":1243,"line":3871},[1241,33689,33499],{"class":1688},[1241,33691,33502],{"class":7405},[1241,33693,1786],{"class":1381},[1241,33695,25925],{"class":1782},[1241,33697,1608],{"class":1381},[1241,33699,1822],{"class":1258},[1241,33701,2151],{"class":1262},[1241,33703,1752],{"class":1258},[1241,33705,8583],{"class":1381},[1241,33707,33708,33710],{"class":1243,"line":3886},[1241,33709,30738],{"class":1688},[1241,33711,1840],{"class":1381},[1241,33713,33714,33716,33718,33720,33722,33724,33727,33729,33732,33734],{"class":1243,"line":3901},[1241,33715,33527],{"class":1688},[1241,33717,2980],{"class":1692},[1241,33719,1773],{"class":1381},[1241,33721,2985],{"class":1692},[1241,33723,1773],{"class":1381},[1241,33725,33726],{"class":1692},"files",[1241,33728,1773],{"class":1381},[1241,33730,33731],{"class":1692},"storage ",[1241,33733,1689],{"class":1688},[1241,33735,33736],{"class":1692}," default_storage\n",[1241,33738,33739,33742,33744,33747,33749,33751,33754,33756],{"class":1243,"line":6562},[1241,33740,33741],{"class":1692},"            default_storage",[1241,33743,1773],{"class":1381},[1241,33745,33746],{"class":1782},"exists",[1241,33748,1786],{"class":1381},[1241,33750,1752],{"class":1258},[1241,33752,33753],{"class":1262},"health_check.txt",[1241,33755,1752],{"class":1258},[1241,33757,2117],{"class":1381},[1241,33759,33760,33762,33764,33766,33769,33771,33773,33775,33777,33779,33781,33783,33785,33787,33789,33791],{"class":1243,"line":6581},[1241,33761,33583],{"class":1692},[1241,33763,1904],{"class":1381},[1241,33765,1752],{"class":1258},[1241,33767,33768],{"class":1262},"storage",[1241,33770,1752],{"class":1258},[1241,33772,4768],{"class":1381},[1241,33774,1728],{"class":1381},[1241,33776,3700],{"class":1381},[1241,33778,1752],{"class":1258},[1241,33780,32135],{"class":1262},[1241,33782,1752],{"class":1258},[1241,33784,1397],{"class":1381},[1241,33786,1822],{"class":1258},[1241,33788,32144],{"class":1262},[1241,33790,1752],{"class":1258},[1241,33792,1648],{"class":1381},[1241,33794,33795,33797,33799,33801,33803],{"class":1243,"line":6594},[1241,33796,30792],{"class":1688},[1241,33798,30795],{"class":1434},[1241,33800,30798],{"class":1688},[1241,33802,30801],{"class":1692},[1241,33804,1840],{"class":1381},[1241,33806,33807,33809,33811,33813,33815,33817,33819,33821,33823,33825,33827,33829,33831,33833,33835,33837,33839,33841,33843,33845,33847,33849,33851,33853],{"class":1243,"line":6613},[1241,33808,33583],{"class":1692},[1241,33810,1904],{"class":1381},[1241,33812,1752],{"class":1258},[1241,33814,33768],{"class":1262},[1241,33816,1752],{"class":1258},[1241,33818,4768],{"class":1381},[1241,33820,1728],{"class":1381},[1241,33822,3700],{"class":1381},[1241,33824,1752],{"class":1258},[1241,33826,32135],{"class":1262},[1241,33828,1752],{"class":1258},[1241,33830,1397],{"class":1381},[1241,33832,1822],{"class":1258},[1241,33834,32518],{"class":1262},[1241,33836,1752],{"class":1258},[1241,33838,1608],{"class":1381},[1241,33840,1822],{"class":1258},[1241,33842,32527],{"class":1262},[1241,33844,1752],{"class":1258},[1241,33846,1397],{"class":1381},[1241,33848,29941],{"class":1434},[1241,33850,1786],{"class":1381},[1241,33852,30831],{"class":1782},[1241,33854,32540],{"class":1381},[1241,33856,33857],{"class":1243,"line":6632},[1241,33858,8853],{"class":1692},[1241,33860,33861,33863],{"class":1243,"line":6649},[1241,33862,33435],{"class":1688},[1241,33864,33865],{"class":1692}," dependencies\n",[1035,33867,33869],{"id":33868},"troubleshooting-common-issues","Troubleshooting Common Issues",[1026,33871,33872],{},[1042,33873,33874],{},"Common Cloud Deployment Problems and Solutions",[33876,33877,33878],"ol",{},[1049,33879,33880],{},[1042,33881,33882],{},"Static Files Not Loading",[1128,33884,33886],{"className":1674,"code":33885,"language":1676,"meta":1137,"style":1137},"# Problem: Static files return 404 errors\n# Solution: Ensure proper static file configuration\n\n# Check these settings:\nSTATIC_URL = '/static/'\nSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')\nSTATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'\n\n# Ensure collectstatic runs during deployment\n# Add to build command: python manage.py collectstatic --noinput\n",[1135,33887,33888,33893,33898,33902,33907,33919,33949,33961,33965,33970],{"__ignoreMap":1137},[1241,33889,33890],{"class":1243,"line":1244},[1241,33891,33892],{"class":1247},"# Problem: Static files return 404 errors\n",[1241,33894,33895],{"class":1243,"line":1251},[1241,33896,33897],{"class":1247},"# Solution: Ensure proper static file configuration\n",[1241,33899,33900],{"class":1243,"line":1281},[1241,33901,1303],{"emptyLinePlaceholder":1302},[1241,33903,33904],{"class":1243,"line":1290},[1241,33905,33906],{"class":1247},"# Check these settings:\n",[1241,33908,33909,33911,33913,33915,33917],{"class":1243,"line":1299},[1241,33910,2270],{"class":1724},[1241,33912,1728],{"class":1381},[1241,33914,1822],{"class":1258},[1241,33916,28316],{"class":1262},[1241,33918,2264],{"class":1258},[1241,33920,33921,33923,33925,33927,33929,33931,33933,33935,33937,33939,33941,33943,33945,33947],{"class":1243,"line":1306},[1241,33922,25090],{"class":1724},[1241,33924,1728],{"class":1381},[1241,33926,1833],{"class":1692},[1241,33928,1773],{"class":1381},[1241,33930,2899],{"class":1776},[1241,33932,1773],{"class":1381},[1241,33934,25103],{"class":1782},[1241,33936,1786],{"class":1381},[1241,33938,25109],{"class":25108},[1241,33940,1608],{"class":1381},[1241,33942,1822],{"class":1258},[1241,33944,25116],{"class":1262},[1241,33946,1752],{"class":1258},[1241,33948,2117],{"class":1381},[1241,33950,33951,33953,33955,33957,33959],{"class":1243,"line":1312},[1241,33952,2254],{"class":1724},[1241,33954,1728],{"class":1381},[1241,33956,1822],{"class":1258},[1241,33958,25083],{"class":1262},[1241,33960,2264],{"class":1258},[1241,33962,33963],{"class":1243,"line":1321},[1241,33964,1303],{"emptyLinePlaceholder":1302},[1241,33966,33967],{"class":1243,"line":1327},[1241,33968,33969],{"class":1247},"# Ensure collectstatic runs during deployment\n",[1241,33971,33972],{"class":1243,"line":1333},[1241,33973,33974],{"class":1247},"# Add to build command: python manage.py collectstatic --noinput\n",[33876,33976,33977],{"start":1251},[1049,33978,33979],{},[1042,33980,33981],{},"Database Connection Issues",[1128,33983,33985],{"className":1674,"code":33984,"language":1676,"meta":1137,"style":1137},"# Problem: Database connection timeouts or SSL errors\n# Solution: Proper database configuration\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'OPTIONS': {\n            'sslmode': 'require',\n            'connect_timeout': 10,\n            'options': '-c statement_timeout=30000'\n        },\n        'CONN_MAX_AGE': 600,\n        'CONN_HEALTH_CHECKS': True,\n    }\n}\n",[1135,33986,33987,33992,33997,34001,34009,34021,34039,34051,34069,34083,34100,34104,34118,34132,34136],{"__ignoreMap":1137},[1241,33988,33989],{"class":1243,"line":1244},[1241,33990,33991],{"class":1247},"# Problem: Database connection timeouts or SSL errors\n",[1241,33993,33994],{"class":1243,"line":1251},[1241,33995,33996],{"class":1247},"# Solution: Proper database configuration\n",[1241,33998,33999],{"class":1243,"line":1281},[1241,34000,1303],{"emptyLinePlaceholder":1302},[1241,34002,34003,34005,34007],{"class":1243,"line":1290},[1241,34004,4785],{"class":1724},[1241,34006,1728],{"class":1381},[1241,34008,1566],{"class":1381},[1241,34010,34011,34013,34015,34017,34019],{"class":1243,"line":1299},[1241,34012,1746],{"class":1258},[1241,34014,1857],{"class":1262},[1241,34016,1752],{"class":1258},[1241,34018,1397],{"class":1381},[1241,34020,1566],{"class":1381},[1241,34022,34023,34025,34027,34029,34031,34033,34035,34037],{"class":1243,"line":1306},[1241,34024,1854],{"class":1258},[1241,34026,1871],{"class":1262},[1241,34028,1752],{"class":1258},[1241,34030,1397],{"class":1381},[1241,34032,1822],{"class":1258},[1241,34034,1880],{"class":1262},[1241,34036,1752],{"class":1258},[1241,34038,1407],{"class":1381},[1241,34040,34041,34043,34045,34047,34049],{"class":1243,"line":1312},[1241,34042,1854],{"class":1258},[1241,34044,2033],{"class":1262},[1241,34046,1752],{"class":1258},[1241,34048,1397],{"class":1381},[1241,34050,1566],{"class":1381},[1241,34052,34053,34055,34057,34059,34061,34063,34065,34067],{"class":1243,"line":1321},[1241,34054,1868],{"class":1258},[1241,34056,2048],{"class":1262},[1241,34058,1752],{"class":1258},[1241,34060,1397],{"class":1381},[1241,34062,1822],{"class":1258},[1241,34064,2057],{"class":1262},[1241,34066,1752],{"class":1258},[1241,34068,1407],{"class":1381},[1241,34070,34071,34073,34075,34077,34079,34081],{"class":1243,"line":1327},[1241,34072,1868],{"class":1258},[1241,34074,8481],{"class":1262},[1241,34076,1752],{"class":1258},[1241,34078,1397],{"class":1381},[1241,34080,6124],{"class":2476},[1241,34082,1407],{"class":1381},[1241,34084,34085,34087,34089,34091,34093,34095,34098],{"class":1243,"line":1333},[1241,34086,1868],{"class":1258},[1241,34088,5959],{"class":1262},[1241,34090,1752],{"class":1258},[1241,34092,1397],{"class":1381},[1241,34094,1822],{"class":1258},[1241,34096,34097],{"class":1262},"-c statement_timeout=30000",[1241,34099,2264],{"class":1258},[1241,34101,34102],{"class":1243,"line":1339},[1241,34103,2680],{"class":1381},[1241,34105,34106,34108,34110,34112,34114,34116],{"class":1243,"line":1345},[1241,34107,1854],{"class":1258},[1241,34109,4991],{"class":1262},[1241,34111,1752],{"class":1258},[1241,34113,1397],{"class":1381},[1241,34115,8523],{"class":2476},[1241,34117,1407],{"class":1381},[1241,34119,34120,34122,34124,34126,34128,34130],{"class":1243,"line":1350},[1241,34121,1854],{"class":1258},[1241,34123,8532],{"class":1262},[1241,34125,1752],{"class":1258},[1241,34127,1397],{"class":1381},[1241,34129,2835],{"class":1731},[1241,34131,1407],{"class":1381},[1241,34133,34134],{"class":1243,"line":1356},[1241,34135,1636],{"class":1381},[1241,34137,34138],{"class":1243,"line":1554},[1241,34139,1648],{"class":1381},[33876,34141,34142],{"start":1281},[1049,34143,34144],{},[1042,34145,34146],{},"Memory Issues",[1128,34148,34150],{"className":1674,"code":34149,"language":1676,"meta":1137,"style":1137},"# Problem: Application running out of memory\n# Solutions:\n# 1. Optimize queries to reduce memory usage\n# 2. Use pagination for large datasets\n# 3. Implement proper caching\n# 4. Scale up instance size or add more instances\n\n# Monitor memory usage\nimport psutil\nmemory = psutil.virtual_memory()\nif memory.percent > 90:\n    # Log warning or trigger scaling\n    pass\n",[1135,34151,34152,34157,34162,34167,34172,34177,34182,34186,34191,34197,34212,34229,34234],{"__ignoreMap":1137},[1241,34153,34154],{"class":1243,"line":1244},[1241,34155,34156],{"class":1247},"# Problem: Application running out of memory\n",[1241,34158,34159],{"class":1243,"line":1251},[1241,34160,34161],{"class":1247},"# Solutions:\n",[1241,34163,34164],{"class":1243,"line":1281},[1241,34165,34166],{"class":1247},"# 1. Optimize queries to reduce memory usage\n",[1241,34168,34169],{"class":1243,"line":1290},[1241,34170,34171],{"class":1247},"# 2. Use pagination for large datasets\n",[1241,34173,34174],{"class":1243,"line":1299},[1241,34175,34176],{"class":1247},"# 3. Implement proper caching\n",[1241,34178,34179],{"class":1243,"line":1306},[1241,34180,34181],{"class":1247},"# 4. Scale up instance size or add more instances\n",[1241,34183,34184],{"class":1243,"line":1312},[1241,34185,1303],{"emptyLinePlaceholder":1302},[1241,34187,34188],{"class":1243,"line":1321},[1241,34189,34190],{"class":1247},"# Monitor memory usage\n",[1241,34192,34193,34195],{"class":1243,"line":1327},[1241,34194,1689],{"class":1688},[1241,34196,32007],{"class":1692},[1241,34198,34199,34202,34204,34206,34208,34210],{"class":1243,"line":1333},[1241,34200,34201],{"class":1692},"memory ",[1241,34203,3003],{"class":1381},[1241,34205,32950],{"class":1692},[1241,34207,1773],{"class":1381},[1241,34209,32979],{"class":1782},[1241,34211,3009],{"class":1381},[1241,34213,34214,34216,34218,34220,34222,34224,34227],{"class":1243,"line":1339},[1241,34215,1819],{"class":1688},[1241,34217,33083],{"class":1692},[1241,34219,1773],{"class":1381},[1241,34221,33088],{"class":1776},[1241,34223,8924],{"class":1709},[1241,34225,34226],{"class":2476}," 90",[1241,34228,1840],{"class":1381},[1241,34230,34231],{"class":1243,"line":1345},[1241,34232,34233],{"class":1247},"    # Log warning or trigger scaling\n",[1241,34235,34236],{"class":1243,"line":1350},[1241,34237,34238],{"class":1688},"    pass\n",[33876,34240,34241],{"start":1290},[1049,34242,34243],{},[1042,34244,34245],{},"Slow Response Times",[1128,34247,34249],{"className":1674,"code":34248,"language":1676,"meta":1137,"style":1137},"# Problem: High response times\n# Solutions:\n# 1. Add database indexes\n# 2. Implement caching\n# 3. Optimize database queries\n# 4. Use CDN for static files\n# 5. Enable compression\n\n# Add performance monitoring\nimport time\nfrom django.utils.deprecation import MiddlewareMixin\n\nclass PerformanceMiddleware(MiddlewareMixin):\n    def process_request(self, request):\n        request.start_time = time.time()\n    \n    def process_response(self, request, response):\n        if hasattr(request, 'start_time'):\n            duration = time.time() - request.start_time\n            response['X-Response-Time'] = f'{duration:.3f}s'\n            \n            # Log slow requests\n            if duration > 2.0:\n                logger.warning(f'Slow request: {request.path} took {duration:.3f}s')\n        \n        return response\n",[1135,34250,34251,34256,34260,34265,34270,34275,34280,34285,34289,34294,34300,34321,34325,34339,34357,34377,34381,34402,34422,34446,34481,34485,34490,34504,34547,34551],{"__ignoreMap":1137},[1241,34252,34253],{"class":1243,"line":1244},[1241,34254,34255],{"class":1247},"# Problem: High response times\n",[1241,34257,34258],{"class":1243,"line":1251},[1241,34259,34161],{"class":1247},[1241,34261,34262],{"class":1243,"line":1281},[1241,34263,34264],{"class":1247},"# 1. Add database indexes\n",[1241,34266,34267],{"class":1243,"line":1290},[1241,34268,34269],{"class":1247},"# 2. Implement caching\n",[1241,34271,34272],{"class":1243,"line":1299},[1241,34273,34274],{"class":1247},"# 3. Optimize database queries\n",[1241,34276,34277],{"class":1243,"line":1306},[1241,34278,34279],{"class":1247},"# 4. Use CDN for static files\n",[1241,34281,34282],{"class":1243,"line":1312},[1241,34283,34284],{"class":1247},"# 5. Enable compression\n",[1241,34286,34287],{"class":1243,"line":1321},[1241,34288,1303],{"emptyLinePlaceholder":1302},[1241,34290,34291],{"class":1243,"line":1327},[1241,34292,34293],{"class":1247},"# Add performance monitoring\n",[1241,34295,34296,34298],{"class":1243,"line":1333},[1241,34297,1689],{"class":1688},[1241,34299,32000],{"class":1692},[1241,34301,34302,34304,34306,34308,34311,34313,34316,34318],{"class":1243,"line":1339},[1241,34303,1698],{"class":1688},[1241,34305,2980],{"class":1692},[1241,34307,1773],{"class":1381},[1241,34309,34310],{"class":1692},"utils",[1241,34312,1773],{"class":1381},[1241,34314,34315],{"class":1692},"deprecation ",[1241,34317,1689],{"class":1688},[1241,34319,34320],{"class":1692}," MiddlewareMixin\n",[1241,34322,34323],{"class":1243,"line":1345},[1241,34324,1303],{"emptyLinePlaceholder":1302},[1241,34326,34327,34329,34332,34334,34337],{"class":1243,"line":1350},[1241,34328,2640],{"class":2222},[1241,34330,34331],{"class":9162}," PerformanceMiddleware",[1241,34333,1786],{"class":1381},[1241,34335,34336],{"class":1254},"MiddlewareMixin",[1241,34338,8583],{"class":1381},[1241,34340,34341,34343,34346,34348,34350,34352,34355],{"class":1243,"line":1356},[1241,34342,29462],{"class":2222},[1241,34344,34345],{"class":29624}," process_request",[1241,34347,1786],{"class":1381},[1241,34349,29471],{"class":29470},[1241,34351,1608],{"class":1381},[1241,34353,34354],{"class":29936}," request",[1241,34356,8583],{"class":1381},[1241,34358,34359,34362,34364,34367,34369,34371,34373,34375],{"class":1243,"line":1554},[1241,34360,34361],{"class":1692},"        request",[1241,34363,1773],{"class":1381},[1241,34365,34366],{"class":1776},"start_time",[1241,34368,1728],{"class":1381},[1241,34370,32112],{"class":1692},[1241,34372,1773],{"class":1381},[1241,34374,32117],{"class":1782},[1241,34376,3009],{"class":1381},[1241,34378,34379],{"class":1243,"line":1569},[1241,34380,8853],{"class":1692},[1241,34382,34383,34385,34388,34390,34392,34394,34396,34398,34400],{"class":1243,"line":1584},[1241,34384,29462],{"class":2222},[1241,34386,34387],{"class":29624}," process_response",[1241,34389,1786],{"class":1381},[1241,34391,29471],{"class":29470},[1241,34393,1608],{"class":1381},[1241,34395,34354],{"class":29936},[1241,34397,1608],{"class":1381},[1241,34399,30776],{"class":29936},[1241,34401,8583],{"class":1381},[1241,34403,34404,34406,34408,34410,34412,34414,34416,34418,34420],{"class":1243,"line":1621},[1241,34405,30506],{"class":1688},[1241,34407,33502],{"class":7405},[1241,34409,1786],{"class":1381},[1241,34411,31000],{"class":1782},[1241,34413,1608],{"class":1381},[1241,34415,1822],{"class":1258},[1241,34417,34366],{"class":1262},[1241,34419,1752],{"class":1258},[1241,34421,8583],{"class":1381},[1241,34423,34424,34427,34429,34431,34433,34435,34437,34439,34441,34443],{"class":1243,"line":1627},[1241,34425,34426],{"class":1692},"            duration ",[1241,34428,3003],{"class":1381},[1241,34430,32112],{"class":1692},[1241,34432,1773],{"class":1381},[1241,34434,32117],{"class":1782},[1241,34436,30157],{"class":1381},[1241,34438,24594],{"class":1709},[1241,34440,34354],{"class":1692},[1241,34442,1773],{"class":1381},[1241,34444,34445],{"class":1776},"start_time\n",[1241,34447,34448,34451,34453,34455,34458,34460,34462,34464,34466,34468,34470,34473,34476,34478],{"class":1243,"line":1633},[1241,34449,34450],{"class":1692},"            response",[1241,34452,1904],{"class":1381},[1241,34454,1752],{"class":1258},[1241,34456,34457],{"class":1262},"X-Response-Time",[1241,34459,1752],{"class":1258},[1241,34461,4768],{"class":1381},[1241,34463,1728],{"class":1381},[1241,34465,2223],{"class":2222},[1241,34467,1752],{"class":1262},[1241,34469,2229],{"class":2228},[1241,34471,34472],{"class":1692},"duration",[1241,34474,34475],{"class":2222},":.3f",[1241,34477,2234],{"class":2228},[1241,34479,34480],{"class":1262},"s'\n",[1241,34482,34483],{"class":1243,"line":1639},[1241,34484,12668],{"class":1692},[1241,34486,34487],{"class":1243,"line":1645},[1241,34488,34489],{"class":1247},"            # Log slow requests\n",[1241,34491,34492,34494,34497,34499,34502],{"class":1243,"line":2028},[1241,34493,29689],{"class":1688},[1241,34495,34496],{"class":1692}," duration ",[1241,34498,33154],{"class":1709},[1241,34500,34501],{"class":2476}," 2.0",[1241,34503,1840],{"class":1381},[1241,34505,34506,34509,34511,34514,34516,34518,34521,34523,34525,34527,34529,34531,34534,34536,34538,34540,34542,34545],{"class":1243,"line":2042},[1241,34507,34508],{"class":1692},"                logger",[1241,34510,1773],{"class":1381},[1241,34512,34513],{"class":1782},"warning",[1241,34515,1786],{"class":1381},[1241,34517,30252],{"class":2222},[1241,34519,34520],{"class":1262},"'Slow request: ",[1241,34522,2229],{"class":2228},[1241,34524,31000],{"class":1782},[1241,34526,1773],{"class":1381},[1241,34528,2899],{"class":1776},[1241,34530,2234],{"class":2228},[1241,34532,34533],{"class":1262}," took ",[1241,34535,2229],{"class":2228},[1241,34537,34472],{"class":1782},[1241,34539,34475],{"class":2222},[1241,34541,2234],{"class":2228},[1241,34543,34544],{"class":1262},"s'",[1241,34546,2117],{"class":1381},[1241,34548,34549],{"class":1243,"line":2064},[1241,34550,29787],{"class":1692},[1241,34552,34553,34555],{"class":1243,"line":2070},[1241,34554,29729],{"class":1688},[1241,34556,34557],{"class":1692}," response\n",[1026,34559,34560],{},"This comprehensive cloud deployment guide provides Django developers with everything needed to successfully deploy applications to major cloud platforms, from basic setup to advanced production configurations and troubleshooting.",[1026,34562,34563],{},"This comprehensive cloud deployment guide covers all major cloud platforms and PaaS solutions, providing production-ready configurations for deploying Django applications at scale.",[34565,34566,34567],"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 .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}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 .suXOh, html code.shiki .suXOh{--shiki-light:#E53935;--shiki-default:#998418;--shiki-dark:#B8A965}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 .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sq3J1, html code.shiki .sq3J1{--shiki-light:#FF5370;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .su_V2, html code.shiki .su_V2{--shiki-light:#90A4AE;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .scgAs, html code.shiki .scgAs{--shiki-light:#F76D47;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sifU2, html code.shiki .sifU2{--shiki-light:#916B53;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s6vMv, html code.shiki .s6vMv{--shiki-light:#FF5370;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .srjyR, html code.shiki .srjyR{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}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 .s6DHA, html code.shiki .s6DHA{--shiki-light:#6182B8;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--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 .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}",{"title":1137,"searchDepth":1244,"depth":1251,"links":34569},[34570,34575,34585,34594,34602,34609],{"id":1032,"depth":1251,"text":1033,"children":34571},[34572,34573,34574],{"id":1037,"depth":1281,"text":1038},{"id":1120,"depth":1281,"text":1121},{"id":1151,"depth":1281,"text":1152},{"id":1219,"depth":1251,"text":1220,"children":34576},[34577,34578,34579,34580,34581,34582,34583,34584],{"id":1226,"depth":1281,"text":1227},{"id":1651,"depth":1281,"text":1652},{"id":4268,"depth":1281,"text":4269},{"id":5376,"depth":1281,"text":5377},{"id":7986,"depth":1281,"text":7987},{"id":8874,"depth":1281,"text":8875},{"id":9653,"depth":1281,"text":9654},{"id":10174,"depth":1281,"text":10175},{"id":13346,"depth":1251,"text":13347,"children":34586},[34587,34588,34589,34590,34591,34592,34593],{"id":13353,"depth":1281,"text":13354},{"id":13701,"depth":1281,"text":13702},{"id":15743,"depth":1281,"text":15744},{"id":15998,"depth":1281,"text":15999},{"id":16098,"depth":1281,"text":16099},{"id":18242,"depth":1281,"text":18243},{"id":19034,"depth":1281,"text":19035},{"id":20720,"depth":1251,"text":20721,"children":34595},[34596,34597,34598,34599,34600,34601],{"id":20727,"depth":1281,"text":20728},{"id":20891,"depth":1281,"text":20892},{"id":23045,"depth":1281,"text":23046},{"id":23308,"depth":1281,"text":23309},{"id":23459,"depth":1281,"text":23460},{"id":23565,"depth":1281,"text":23566},{"id":24535,"depth":1251,"text":24536,"children":34603},[34604,34605,34606,34607,34608],{"id":24542,"depth":1281,"text":24543},{"id":26908,"depth":1281,"text":26909},{"id":27275,"depth":1281,"text":27276},{"id":27820,"depth":1281,"text":27821},{"id":28484,"depth":1281,"text":28485},{"id":29379,"depth":1251,"text":29380,"children":34610},[34611,34612,34613,34614,34615],{"id":29383,"depth":1281,"text":29384},{"id":30289,"depth":1281,"text":436},{"id":31408,"depth":1281,"text":31409},{"id":31977,"depth":1281,"text":31978},{"id":33868,"depth":1281,"text":33869},"md",null,{},{"title":759,"description":1028},"E-Wf6SO5GkbYLlz8euJAxLzceGeJKNEddT3rCYpKXlY",[34622,34624],{"title":755,"path":756,"stem":757,"description":34623,"children":-1},"Docker containerization provides consistent, portable, and scalable deployment environments for Django applications. This chapter covers Docker fundamentals, multi-stage builds, container orchestration, and production-ready Docker configurations for Django applications.",{"title":763,"path":764,"stem":765,"description":34625,"children":-1},"Scaling Django applications requires strategic planning for handling increased traffic, data growth, and user demands. This chapter covers horizontal and vertical scaling strategies, load balancing configurations, auto-scaling implementations, and performance optimization techniques for high-traffic Django applications.",1772474953718]