[{"data":1,"prerenderedAt":8331},["ShallowReactive",2],{"navigation":3,"/deployment/using-docker":1016,"/deployment/using-docker-surround":8326},[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":755,"body":1018,"description":1028,"extension":8321,"links":8322,"meta":8323,"navigation":1074,"path":756,"seo":8324,"stem":757,"__hash__":8325},"docs/20.deployment/05.using-docker.md",{"type":1019,"value":1020,"toc":8296},"minimark",[1021,1025,1029,1034,1039,1347,1351,1762,1766,2268,2272,3340,3344,3348,3755,3759,4020,4024,4028,4324,4328,4458,4462,4686,4690,4694,5650,5654,7036,7040,7044,7893,7897,8289,8292],[1022,1023,755],"h1",{"id":1024},"using-docker",[1026,1027,1028],"p",{},"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.",[1030,1031,1033],"h2",{"id":1032},"docker-fundamentals-for-django","Docker Fundamentals for Django",[1035,1036,1038],"h3",{"id":1037},"basic-dockerfile","Basic Dockerfile",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-dockerfile shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Dockerfile\nFROM python:3.11-slim\n\n# Set environment variables\nENV PYTHONDONTWRITEBYTECODE=1\nENV PYTHONUNBUFFERED=1\nENV DJANGO_SETTINGS_MODULE=myproject.settings.production\n\n# Set work directory\nWORKDIR /app\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# Install Python dependencies\nCOPY requirements.txt /app/\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Copy project\nCOPY . /app/\n\n# Create non-root user\nRUN adduser --disabled-password --gecos '' appuser\nRUN chown -R appuser:appuser /app\nUSER appuser\n\n# Collect static files\nRUN python manage.py collectstatic --noinput\n\n# Expose port\nEXPOSE 8000\n\n# Run the application\nCMD [\"gunicorn\", \"--bind\", \"0.0.0.0:8000\", \"myproject.wsgi:application\"]\n","dockerfile","",[1047,1048,1049,1058,1069,1076,1082,1091,1099,1107,1112,1118,1127,1132,1138,1147,1153,1159,1165,1171,1177,1182,1188,1197,1205,1210,1216,1224,1229,1235,1250,1258,1266,1271,1277,1285,1290,1296,1305,1310,1316],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# Dockerfile\n",[1050,1059,1061,1065],{"class":1052,"line":1060},2,[1050,1062,1064],{"class":1063},"scgAs","FROM",[1050,1066,1068],{"class":1067},"sftqT"," python:3.11-slim\n",[1050,1070,1072],{"class":1052,"line":1071},3,[1050,1073,1075],{"emptyLinePlaceholder":1074},true,"\n",[1050,1077,1079],{"class":1052,"line":1078},4,[1050,1080,1081],{"class":1056},"# Set environment variables\n",[1050,1083,1085,1088],{"class":1052,"line":1084},5,[1050,1086,1087],{"class":1063},"ENV",[1050,1089,1090],{"class":1067}," PYTHONDONTWRITEBYTECODE=1\n",[1050,1092,1094,1096],{"class":1052,"line":1093},6,[1050,1095,1087],{"class":1063},[1050,1097,1098],{"class":1067}," PYTHONUNBUFFERED=1\n",[1050,1100,1102,1104],{"class":1052,"line":1101},7,[1050,1103,1087],{"class":1063},[1050,1105,1106],{"class":1067}," DJANGO_SETTINGS_MODULE=myproject.settings.production\n",[1050,1108,1110],{"class":1052,"line":1109},8,[1050,1111,1075],{"emptyLinePlaceholder":1074},[1050,1113,1115],{"class":1052,"line":1114},9,[1050,1116,1117],{"class":1056},"# Set work directory\n",[1050,1119,1121,1124],{"class":1052,"line":1120},10,[1050,1122,1123],{"class":1063},"WORKDIR",[1050,1125,1126],{"class":1067}," /app\n",[1050,1128,1130],{"class":1052,"line":1129},11,[1050,1131,1075],{"emptyLinePlaceholder":1074},[1050,1133,1135],{"class":1052,"line":1134},12,[1050,1136,1137],{"class":1056},"# Install system dependencies\n",[1050,1139,1141,1144],{"class":1052,"line":1140},13,[1050,1142,1143],{"class":1063},"RUN",[1050,1145,1146],{"class":1067}," apt-get update \\\n",[1050,1148,1150],{"class":1052,"line":1149},14,[1050,1151,1152],{"class":1067},"    && apt-get install -y --no-install-recommends \\\n",[1050,1154,1156],{"class":1052,"line":1155},15,[1050,1157,1158],{"class":1067},"        postgresql-client \\\n",[1050,1160,1162],{"class":1052,"line":1161},16,[1050,1163,1164],{"class":1067},"        build-essential \\\n",[1050,1166,1168],{"class":1052,"line":1167},17,[1050,1169,1170],{"class":1067},"        libpq-dev \\\n",[1050,1172,1174],{"class":1052,"line":1173},18,[1050,1175,1176],{"class":1067},"    && rm -rf /var/lib/apt/lists/*\n",[1050,1178,1180],{"class":1052,"line":1179},19,[1050,1181,1075],{"emptyLinePlaceholder":1074},[1050,1183,1185],{"class":1052,"line":1184},20,[1050,1186,1187],{"class":1056},"# Install Python dependencies\n",[1050,1189,1191,1194],{"class":1052,"line":1190},21,[1050,1192,1193],{"class":1063},"COPY",[1050,1195,1196],{"class":1067}," requirements.txt /app/\n",[1050,1198,1200,1202],{"class":1052,"line":1199},22,[1050,1201,1143],{"class":1063},[1050,1203,1204],{"class":1067}," pip install --no-cache-dir -r requirements.txt\n",[1050,1206,1208],{"class":1052,"line":1207},23,[1050,1209,1075],{"emptyLinePlaceholder":1074},[1050,1211,1213],{"class":1052,"line":1212},24,[1050,1214,1215],{"class":1056},"# Copy project\n",[1050,1217,1219,1221],{"class":1052,"line":1218},25,[1050,1220,1193],{"class":1063},[1050,1222,1223],{"class":1067}," . /app/\n",[1050,1225,1227],{"class":1052,"line":1226},26,[1050,1228,1075],{"emptyLinePlaceholder":1074},[1050,1230,1232],{"class":1052,"line":1231},27,[1050,1233,1234],{"class":1056},"# Create non-root user\n",[1050,1236,1238,1240,1243,1247],{"class":1052,"line":1237},28,[1050,1239,1143],{"class":1063},[1050,1241,1242],{"class":1067}," adduser --disabled-password --gecos ",[1050,1244,1246],{"class":1245},"sTbE_","''",[1050,1248,1249],{"class":1067}," appuser\n",[1050,1251,1253,1255],{"class":1052,"line":1252},29,[1050,1254,1143],{"class":1063},[1050,1256,1257],{"class":1067}," chown -R appuser:appuser /app\n",[1050,1259,1261,1264],{"class":1052,"line":1260},30,[1050,1262,1263],{"class":1063},"USER",[1050,1265,1249],{"class":1067},[1050,1267,1269],{"class":1052,"line":1268},31,[1050,1270,1075],{"emptyLinePlaceholder":1074},[1050,1272,1274],{"class":1052,"line":1273},32,[1050,1275,1276],{"class":1056},"# Collect static files\n",[1050,1278,1280,1282],{"class":1052,"line":1279},33,[1050,1281,1143],{"class":1063},[1050,1283,1284],{"class":1067}," python manage.py collectstatic --noinput\n",[1050,1286,1288],{"class":1052,"line":1287},34,[1050,1289,1075],{"emptyLinePlaceholder":1074},[1050,1291,1293],{"class":1052,"line":1292},35,[1050,1294,1295],{"class":1056},"# Expose port\n",[1050,1297,1299,1302],{"class":1052,"line":1298},36,[1050,1300,1301],{"class":1063},"EXPOSE",[1050,1303,1304],{"class":1067}," 8000\n",[1050,1306,1308],{"class":1052,"line":1307},37,[1050,1309,1075],{"emptyLinePlaceholder":1074},[1050,1311,1313],{"class":1052,"line":1312},38,[1050,1314,1315],{"class":1056},"# Run the application\n",[1050,1317,1319,1322,1325,1328,1331,1334,1336,1339,1341,1344],{"class":1052,"line":1318},39,[1050,1320,1321],{"class":1063},"CMD",[1050,1323,1324],{"class":1067}," [",[1050,1326,1327],{"class":1245},"\"gunicorn\"",[1050,1329,1330],{"class":1067},", ",[1050,1332,1333],{"class":1245},"\"--bind\"",[1050,1335,1330],{"class":1067},[1050,1337,1338],{"class":1245},"\"0.0.0.0:8000\"",[1050,1340,1330],{"class":1067},[1050,1342,1343],{"class":1245},"\"myproject.wsgi:application\"",[1050,1345,1346],{"class":1067},"]\n",[1035,1348,1350],{"id":1349},"multi-stage-production-dockerfile","Multi-Stage Production Dockerfile",[1040,1352,1354],{"className":1042,"code":1353,"language":1044,"meta":1045,"style":1045},"# Dockerfile.production\n# Build stage\nFROM python:3.11-slim as builder\n\nENV PYTHONDONTWRITEBYTECODE=1\nENV PYTHONUNBUFFERED=1\n\nWORKDIR /app\n\n# Install build dependencies\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends \\\n        build-essential \\\n        libpq-dev \\\n        git \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Install Python dependencies\nCOPY requirements.txt .\nRUN pip install --user --no-cache-dir -r requirements.txt\n\n# Production stage\nFROM python:3.11-slim\n\nENV PYTHONDONTWRITEBYTECODE=1\nENV PYTHONUNBUFFERED=1\nENV DJANGO_SETTINGS_MODULE=myproject.settings.production\nENV PATH=/home/appuser/.local/bin:$PATH\n\nWORKDIR /app\n\n# Install runtime dependencies\nRUN apt-get update \\\n    && apt-get install -y --no-install-recommends \\\n        postgresql-client \\\n        nginx \\\n        supervisor \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Create non-root user\nRUN adduser --disabled-password --gecos '' appuser\n\n# Copy Python dependencies from builder stage\nCOPY --from=builder /root/.local /home/appuser/.local\n\n# Copy application code\nCOPY --chown=appuser:appuser . /app/\n\n# Create necessary directories\nRUN mkdir -p /app/staticfiles /app/media /var/log/django \\\n    && chown -R appuser:appuser /app /var/log/django\n\n# Switch to non-root user\nUSER appuser\n\n# Collect static files\nRUN python manage.py collectstatic --noinput\n\n# Health check\nHEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \\\n    CMD curl -f http://localhost:8000/health/ || exit 1\n\nEXPOSE 8000\n\n# Use supervisor to manage multiple processes\nUSER root\nCOPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf\nCMD [\"/usr/bin/supervisord\", \"-c\", \"/etc/supervisor/conf.d/supervisord.conf\"]\n",[1047,1355,1356,1361,1366,1379,1383,1389,1395,1399,1405,1409,1414,1420,1424,1428,1432,1437,1441,1445,1449,1456,1463,1467,1472,1478,1482,1488,1494,1500,1507,1511,1517,1521,1526,1532,1536,1540,1545,1550,1554,1558,1563,1574,1579,1585,1593,1598,1604,1612,1617,1623,1631,1637,1642,1648,1655,1660,1665,1672,1677,1683,1692,1701,1706,1713,1718,1724,1732,1740],{"__ignoreMap":1045},[1050,1357,1358],{"class":1052,"line":1053},[1050,1359,1360],{"class":1056},"# Dockerfile.production\n",[1050,1362,1363],{"class":1052,"line":1060},[1050,1364,1365],{"class":1056},"# Build stage\n",[1050,1367,1368,1370,1373,1376],{"class":1052,"line":1071},[1050,1369,1064],{"class":1063},[1050,1371,1372],{"class":1067}," python:3.11-slim ",[1050,1374,1375],{"class":1063},"as",[1050,1377,1378],{"class":1067}," builder\n",[1050,1380,1381],{"class":1052,"line":1078},[1050,1382,1075],{"emptyLinePlaceholder":1074},[1050,1384,1385,1387],{"class":1052,"line":1084},[1050,1386,1087],{"class":1063},[1050,1388,1090],{"class":1067},[1050,1390,1391,1393],{"class":1052,"line":1093},[1050,1392,1087],{"class":1063},[1050,1394,1098],{"class":1067},[1050,1396,1397],{"class":1052,"line":1101},[1050,1398,1075],{"emptyLinePlaceholder":1074},[1050,1400,1401,1403],{"class":1052,"line":1109},[1050,1402,1123],{"class":1063},[1050,1404,1126],{"class":1067},[1050,1406,1407],{"class":1052,"line":1114},[1050,1408,1075],{"emptyLinePlaceholder":1074},[1050,1410,1411],{"class":1052,"line":1120},[1050,1412,1413],{"class":1056},"# Install build dependencies\n",[1050,1415,1416,1418],{"class":1052,"line":1129},[1050,1417,1143],{"class":1063},[1050,1419,1146],{"class":1067},[1050,1421,1422],{"class":1052,"line":1134},[1050,1423,1152],{"class":1067},[1050,1425,1426],{"class":1052,"line":1140},[1050,1427,1164],{"class":1067},[1050,1429,1430],{"class":1052,"line":1149},[1050,1431,1170],{"class":1067},[1050,1433,1434],{"class":1052,"line":1155},[1050,1435,1436],{"class":1067},"        git \\\n",[1050,1438,1439],{"class":1052,"line":1161},[1050,1440,1176],{"class":1067},[1050,1442,1443],{"class":1052,"line":1167},[1050,1444,1075],{"emptyLinePlaceholder":1074},[1050,1446,1447],{"class":1052,"line":1173},[1050,1448,1187],{"class":1056},[1050,1450,1451,1453],{"class":1052,"line":1179},[1050,1452,1193],{"class":1063},[1050,1454,1455],{"class":1067}," requirements.txt .\n",[1050,1457,1458,1460],{"class":1052,"line":1184},[1050,1459,1143],{"class":1063},[1050,1461,1462],{"class":1067}," pip install --user --no-cache-dir -r requirements.txt\n",[1050,1464,1465],{"class":1052,"line":1190},[1050,1466,1075],{"emptyLinePlaceholder":1074},[1050,1468,1469],{"class":1052,"line":1199},[1050,1470,1471],{"class":1056},"# Production stage\n",[1050,1473,1474,1476],{"class":1052,"line":1207},[1050,1475,1064],{"class":1063},[1050,1477,1068],{"class":1067},[1050,1479,1480],{"class":1052,"line":1212},[1050,1481,1075],{"emptyLinePlaceholder":1074},[1050,1483,1484,1486],{"class":1052,"line":1218},[1050,1485,1087],{"class":1063},[1050,1487,1090],{"class":1067},[1050,1489,1490,1492],{"class":1052,"line":1226},[1050,1491,1087],{"class":1063},[1050,1493,1098],{"class":1067},[1050,1495,1496,1498],{"class":1052,"line":1231},[1050,1497,1087],{"class":1063},[1050,1499,1106],{"class":1067},[1050,1501,1502,1504],{"class":1052,"line":1237},[1050,1503,1087],{"class":1063},[1050,1505,1506],{"class":1067}," PATH=/home/appuser/.local/bin:$PATH\n",[1050,1508,1509],{"class":1052,"line":1252},[1050,1510,1075],{"emptyLinePlaceholder":1074},[1050,1512,1513,1515],{"class":1052,"line":1260},[1050,1514,1123],{"class":1063},[1050,1516,1126],{"class":1067},[1050,1518,1519],{"class":1052,"line":1268},[1050,1520,1075],{"emptyLinePlaceholder":1074},[1050,1522,1523],{"class":1052,"line":1273},[1050,1524,1525],{"class":1056},"# Install runtime dependencies\n",[1050,1527,1528,1530],{"class":1052,"line":1279},[1050,1529,1143],{"class":1063},[1050,1531,1146],{"class":1067},[1050,1533,1534],{"class":1052,"line":1287},[1050,1535,1152],{"class":1067},[1050,1537,1538],{"class":1052,"line":1292},[1050,1539,1158],{"class":1067},[1050,1541,1542],{"class":1052,"line":1298},[1050,1543,1544],{"class":1067},"        nginx \\\n",[1050,1546,1547],{"class":1052,"line":1307},[1050,1548,1549],{"class":1067},"        supervisor \\\n",[1050,1551,1552],{"class":1052,"line":1312},[1050,1553,1176],{"class":1067},[1050,1555,1556],{"class":1052,"line":1318},[1050,1557,1075],{"emptyLinePlaceholder":1074},[1050,1559,1561],{"class":1052,"line":1560},40,[1050,1562,1234],{"class":1056},[1050,1564,1566,1568,1570,1572],{"class":1052,"line":1565},41,[1050,1567,1143],{"class":1063},[1050,1569,1242],{"class":1067},[1050,1571,1246],{"class":1245},[1050,1573,1249],{"class":1067},[1050,1575,1577],{"class":1052,"line":1576},42,[1050,1578,1075],{"emptyLinePlaceholder":1074},[1050,1580,1582],{"class":1052,"line":1581},43,[1050,1583,1584],{"class":1056},"# Copy Python dependencies from builder stage\n",[1050,1586,1588,1590],{"class":1052,"line":1587},44,[1050,1589,1193],{"class":1063},[1050,1591,1592],{"class":1067}," --from=builder /root/.local /home/appuser/.local\n",[1050,1594,1596],{"class":1052,"line":1595},45,[1050,1597,1075],{"emptyLinePlaceholder":1074},[1050,1599,1601],{"class":1052,"line":1600},46,[1050,1602,1603],{"class":1056},"# Copy application code\n",[1050,1605,1607,1609],{"class":1052,"line":1606},47,[1050,1608,1193],{"class":1063},[1050,1610,1611],{"class":1067}," --chown=appuser:appuser . /app/\n",[1050,1613,1615],{"class":1052,"line":1614},48,[1050,1616,1075],{"emptyLinePlaceholder":1074},[1050,1618,1620],{"class":1052,"line":1619},49,[1050,1621,1622],{"class":1056},"# Create necessary directories\n",[1050,1624,1626,1628],{"class":1052,"line":1625},50,[1050,1627,1143],{"class":1063},[1050,1629,1630],{"class":1067}," mkdir -p /app/staticfiles /app/media /var/log/django \\\n",[1050,1632,1634],{"class":1052,"line":1633},51,[1050,1635,1636],{"class":1067},"    && chown -R appuser:appuser /app /var/log/django\n",[1050,1638,1640],{"class":1052,"line":1639},52,[1050,1641,1075],{"emptyLinePlaceholder":1074},[1050,1643,1645],{"class":1052,"line":1644},53,[1050,1646,1647],{"class":1056},"# Switch to non-root user\n",[1050,1649,1651,1653],{"class":1052,"line":1650},54,[1050,1652,1263],{"class":1063},[1050,1654,1249],{"class":1067},[1050,1656,1658],{"class":1052,"line":1657},55,[1050,1659,1075],{"emptyLinePlaceholder":1074},[1050,1661,1663],{"class":1052,"line":1662},56,[1050,1664,1276],{"class":1056},[1050,1666,1668,1670],{"class":1052,"line":1667},57,[1050,1669,1143],{"class":1063},[1050,1671,1284],{"class":1067},[1050,1673,1675],{"class":1052,"line":1674},58,[1050,1676,1075],{"emptyLinePlaceholder":1074},[1050,1678,1680],{"class":1052,"line":1679},59,[1050,1681,1682],{"class":1056},"# Health check\n",[1050,1684,1686,1689],{"class":1052,"line":1685},60,[1050,1687,1688],{"class":1063},"HEALTHCHECK",[1050,1690,1691],{"class":1067}," --interval=30s --timeout=30s --start-period=5s --retries=3 \\\n",[1050,1693,1695,1698],{"class":1052,"line":1694},61,[1050,1696,1697],{"class":1063},"    CMD",[1050,1699,1700],{"class":1067}," curl -f http://localhost:8000/health/ || exit 1\n",[1050,1702,1704],{"class":1052,"line":1703},62,[1050,1705,1075],{"emptyLinePlaceholder":1074},[1050,1707,1709,1711],{"class":1052,"line":1708},63,[1050,1710,1301],{"class":1063},[1050,1712,1304],{"class":1067},[1050,1714,1716],{"class":1052,"line":1715},64,[1050,1717,1075],{"emptyLinePlaceholder":1074},[1050,1719,1721],{"class":1052,"line":1720},65,[1050,1722,1723],{"class":1056},"# Use supervisor to manage multiple processes\n",[1050,1725,1727,1729],{"class":1052,"line":1726},66,[1050,1728,1263],{"class":1063},[1050,1730,1731],{"class":1067}," root\n",[1050,1733,1735,1737],{"class":1052,"line":1734},67,[1050,1736,1193],{"class":1063},[1050,1738,1739],{"class":1067}," docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf\n",[1050,1741,1743,1745,1747,1750,1752,1755,1757,1760],{"class":1052,"line":1742},68,[1050,1744,1321],{"class":1063},[1050,1746,1324],{"class":1067},[1050,1748,1749],{"class":1245},"\"/usr/bin/supervisord\"",[1050,1751,1330],{"class":1067},[1050,1753,1754],{"class":1245},"\"-c\"",[1050,1756,1330],{"class":1067},[1050,1758,1759],{"class":1245},"\"/etc/supervisor/conf.d/supervisord.conf\"",[1050,1761,1346],{"class":1067},[1035,1763,1765],{"id":1764},"docker-compose-for-development","Docker Compose for Development",[1040,1767,1771],{"className":1768,"code":1769,"language":1770,"meta":1045,"style":1045},"language-yaml shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# docker-compose.yml\nversion: '3.8'\n\nservices:\n  web:\n    build: .\n    ports:\n      - \"8000:8000\"\n    volumes:\n      - .:/app\n      - static_volume:/app/staticfiles\n      - media_volume:/app/media\n    environment:\n      - DEBUG=1\n      - DJANGO_SETTINGS_MODULE=myproject.settings.development\n      - DATABASE_URL=postgresql://postgres:postgres@db:5432/django_app\n      - REDIS_URL=redis://redis:6379/1\n    depends_on:\n      - db\n      - redis\n    command: python manage.py runserver 0.0.0.0:8000\n\n  db:\n    image: postgres:13\n    volumes:\n      - postgres_data:/var/lib/postgresql/data/\n    environment:\n      - POSTGRES_DB=django_app\n      - POSTGRES_USER=postgres\n      - POSTGRES_PASSWORD=postgres\n    ports:\n      - \"5432:5432\"\n\n  redis:\n    image: redis:7-alpine\n    ports:\n      - \"6379:6379\"\n\n  celery:\n    build: .\n    command: celery -A myproject worker -l info\n    volumes:\n      - .:/app\n    environment:\n      - DEBUG=1\n      - DJANGO_SETTINGS_MODULE=myproject.settings.development\n      - DATABASE_URL=postgresql://postgres:postgres@db:5432/django_app\n      - REDIS_URL=redis://redis:6379/1\n    depends_on:\n      - db\n      - redis\n\n  celery-beat:\n    build: .\n    command: celery -A myproject beat -l info\n    volumes:\n      - .:/app\n    environment:\n      - DEBUG=1\n      - DJANGO_SETTINGS_MODULE=myproject.settings.development\n      - DATABASE_URL=postgresql://postgres:postgres@db:5432/django_app\n      - REDIS_URL=redis://redis:6379/1\n    depends_on:\n      - db\n      - redis\n\nvolumes:\n  postgres_data:\n  static_volume:\n  media_volume:\n","yaml",[1047,1772,1773,1778,1798,1802,1810,1817,1828,1835,1849,1856,1863,1870,1877,1884,1891,1898,1905,1912,1919,1926,1933,1943,1947,1954,1964,1970,1977,1983,1990,1997,2004,2010,2021,2025,2032,2041,2047,2058,2062,2069,2077,2086,2092,2098,2104,2110,2116,2122,2128,2134,2140,2146,2150,2157,2165,2174,2180,2186,2192,2198,2204,2210,2216,2222,2228,2234,2238,2245,2252,2260],{"__ignoreMap":1045},[1050,1774,1775],{"class":1052,"line":1053},[1050,1776,1777],{"class":1056},"# docker-compose.yml\n",[1050,1779,1780,1784,1788,1792,1795],{"class":1052,"line":1060},[1050,1781,1783],{"class":1782},"suXOh","version",[1050,1785,1787],{"class":1786},"soVBu",":",[1050,1789,1791],{"class":1790},"sbYkP"," '",[1050,1793,1794],{"class":1245},"3.8",[1050,1796,1797],{"class":1790},"'\n",[1050,1799,1800],{"class":1052,"line":1071},[1050,1801,1075],{"emptyLinePlaceholder":1074},[1050,1803,1804,1807],{"class":1052,"line":1078},[1050,1805,1806],{"class":1782},"services",[1050,1808,1809],{"class":1786},":\n",[1050,1811,1812,1815],{"class":1052,"line":1084},[1050,1813,1814],{"class":1782},"  web",[1050,1816,1809],{"class":1786},[1050,1818,1819,1822,1824],{"class":1052,"line":1093},[1050,1820,1821],{"class":1782},"    build",[1050,1823,1787],{"class":1786},[1050,1825,1827],{"class":1826},"s7CZa"," .\n",[1050,1829,1830,1833],{"class":1052,"line":1101},[1050,1831,1832],{"class":1782},"    ports",[1050,1834,1809],{"class":1786},[1050,1836,1837,1840,1843,1846],{"class":1052,"line":1109},[1050,1838,1839],{"class":1786},"      -",[1050,1841,1842],{"class":1790}," \"",[1050,1844,1845],{"class":1245},"8000:8000",[1050,1847,1848],{"class":1790},"\"\n",[1050,1850,1851,1854],{"class":1052,"line":1114},[1050,1852,1853],{"class":1782},"    volumes",[1050,1855,1809],{"class":1786},[1050,1857,1858,1860],{"class":1052,"line":1120},[1050,1859,1839],{"class":1786},[1050,1861,1862],{"class":1245}," .:/app\n",[1050,1864,1865,1867],{"class":1052,"line":1129},[1050,1866,1839],{"class":1786},[1050,1868,1869],{"class":1245}," static_volume:/app/staticfiles\n",[1050,1871,1872,1874],{"class":1052,"line":1134},[1050,1873,1839],{"class":1786},[1050,1875,1876],{"class":1245}," media_volume:/app/media\n",[1050,1878,1879,1882],{"class":1052,"line":1140},[1050,1880,1881],{"class":1782},"    environment",[1050,1883,1809],{"class":1786},[1050,1885,1886,1888],{"class":1052,"line":1149},[1050,1887,1839],{"class":1786},[1050,1889,1890],{"class":1245}," DEBUG=1\n",[1050,1892,1893,1895],{"class":1052,"line":1155},[1050,1894,1839],{"class":1786},[1050,1896,1897],{"class":1245}," DJANGO_SETTINGS_MODULE=myproject.settings.development\n",[1050,1899,1900,1902],{"class":1052,"line":1161},[1050,1901,1839],{"class":1786},[1050,1903,1904],{"class":1245}," DATABASE_URL=postgresql://postgres:postgres@db:5432/django_app\n",[1050,1906,1907,1909],{"class":1052,"line":1167},[1050,1908,1839],{"class":1786},[1050,1910,1911],{"class":1245}," REDIS_URL=redis://redis:6379/1\n",[1050,1913,1914,1917],{"class":1052,"line":1173},[1050,1915,1916],{"class":1782},"    depends_on",[1050,1918,1809],{"class":1786},[1050,1920,1921,1923],{"class":1052,"line":1179},[1050,1922,1839],{"class":1786},[1050,1924,1925],{"class":1245}," db\n",[1050,1927,1928,1930],{"class":1052,"line":1184},[1050,1929,1839],{"class":1786},[1050,1931,1932],{"class":1245}," redis\n",[1050,1934,1935,1938,1940],{"class":1052,"line":1190},[1050,1936,1937],{"class":1782},"    command",[1050,1939,1787],{"class":1786},[1050,1941,1942],{"class":1245}," python manage.py runserver 0.0.0.0:8000\n",[1050,1944,1945],{"class":1052,"line":1199},[1050,1946,1075],{"emptyLinePlaceholder":1074},[1050,1948,1949,1952],{"class":1052,"line":1207},[1050,1950,1951],{"class":1782},"  db",[1050,1953,1809],{"class":1786},[1050,1955,1956,1959,1961],{"class":1052,"line":1212},[1050,1957,1958],{"class":1782},"    image",[1050,1960,1787],{"class":1786},[1050,1962,1963],{"class":1245}," postgres:13\n",[1050,1965,1966,1968],{"class":1052,"line":1218},[1050,1967,1853],{"class":1782},[1050,1969,1809],{"class":1786},[1050,1971,1972,1974],{"class":1052,"line":1226},[1050,1973,1839],{"class":1786},[1050,1975,1976],{"class":1245}," postgres_data:/var/lib/postgresql/data/\n",[1050,1978,1979,1981],{"class":1052,"line":1231},[1050,1980,1881],{"class":1782},[1050,1982,1809],{"class":1786},[1050,1984,1985,1987],{"class":1052,"line":1237},[1050,1986,1839],{"class":1786},[1050,1988,1989],{"class":1245}," POSTGRES_DB=django_app\n",[1050,1991,1992,1994],{"class":1052,"line":1252},[1050,1993,1839],{"class":1786},[1050,1995,1996],{"class":1245}," POSTGRES_USER=postgres\n",[1050,1998,1999,2001],{"class":1052,"line":1260},[1050,2000,1839],{"class":1786},[1050,2002,2003],{"class":1245}," POSTGRES_PASSWORD=postgres\n",[1050,2005,2006,2008],{"class":1052,"line":1268},[1050,2007,1832],{"class":1782},[1050,2009,1809],{"class":1786},[1050,2011,2012,2014,2016,2019],{"class":1052,"line":1273},[1050,2013,1839],{"class":1786},[1050,2015,1842],{"class":1790},[1050,2017,2018],{"class":1245},"5432:5432",[1050,2020,1848],{"class":1790},[1050,2022,2023],{"class":1052,"line":1279},[1050,2024,1075],{"emptyLinePlaceholder":1074},[1050,2026,2027,2030],{"class":1052,"line":1287},[1050,2028,2029],{"class":1782},"  redis",[1050,2031,1809],{"class":1786},[1050,2033,2034,2036,2038],{"class":1052,"line":1292},[1050,2035,1958],{"class":1782},[1050,2037,1787],{"class":1786},[1050,2039,2040],{"class":1245}," redis:7-alpine\n",[1050,2042,2043,2045],{"class":1052,"line":1298},[1050,2044,1832],{"class":1782},[1050,2046,1809],{"class":1786},[1050,2048,2049,2051,2053,2056],{"class":1052,"line":1307},[1050,2050,1839],{"class":1786},[1050,2052,1842],{"class":1790},[1050,2054,2055],{"class":1245},"6379:6379",[1050,2057,1848],{"class":1790},[1050,2059,2060],{"class":1052,"line":1312},[1050,2061,1075],{"emptyLinePlaceholder":1074},[1050,2063,2064,2067],{"class":1052,"line":1318},[1050,2065,2066],{"class":1782},"  celery",[1050,2068,1809],{"class":1786},[1050,2070,2071,2073,2075],{"class":1052,"line":1560},[1050,2072,1821],{"class":1782},[1050,2074,1787],{"class":1786},[1050,2076,1827],{"class":1826},[1050,2078,2079,2081,2083],{"class":1052,"line":1565},[1050,2080,1937],{"class":1782},[1050,2082,1787],{"class":1786},[1050,2084,2085],{"class":1245}," celery -A myproject worker -l info\n",[1050,2087,2088,2090],{"class":1052,"line":1576},[1050,2089,1853],{"class":1782},[1050,2091,1809],{"class":1786},[1050,2093,2094,2096],{"class":1052,"line":1581},[1050,2095,1839],{"class":1786},[1050,2097,1862],{"class":1245},[1050,2099,2100,2102],{"class":1052,"line":1587},[1050,2101,1881],{"class":1782},[1050,2103,1809],{"class":1786},[1050,2105,2106,2108],{"class":1052,"line":1595},[1050,2107,1839],{"class":1786},[1050,2109,1890],{"class":1245},[1050,2111,2112,2114],{"class":1052,"line":1600},[1050,2113,1839],{"class":1786},[1050,2115,1897],{"class":1245},[1050,2117,2118,2120],{"class":1052,"line":1606},[1050,2119,1839],{"class":1786},[1050,2121,1904],{"class":1245},[1050,2123,2124,2126],{"class":1052,"line":1614},[1050,2125,1839],{"class":1786},[1050,2127,1911],{"class":1245},[1050,2129,2130,2132],{"class":1052,"line":1619},[1050,2131,1916],{"class":1782},[1050,2133,1809],{"class":1786},[1050,2135,2136,2138],{"class":1052,"line":1625},[1050,2137,1839],{"class":1786},[1050,2139,1925],{"class":1245},[1050,2141,2142,2144],{"class":1052,"line":1633},[1050,2143,1839],{"class":1786},[1050,2145,1932],{"class":1245},[1050,2147,2148],{"class":1052,"line":1639},[1050,2149,1075],{"emptyLinePlaceholder":1074},[1050,2151,2152,2155],{"class":1052,"line":1644},[1050,2153,2154],{"class":1782},"  celery-beat",[1050,2156,1809],{"class":1786},[1050,2158,2159,2161,2163],{"class":1052,"line":1650},[1050,2160,1821],{"class":1782},[1050,2162,1787],{"class":1786},[1050,2164,1827],{"class":1826},[1050,2166,2167,2169,2171],{"class":1052,"line":1657},[1050,2168,1937],{"class":1782},[1050,2170,1787],{"class":1786},[1050,2172,2173],{"class":1245}," celery -A myproject beat -l info\n",[1050,2175,2176,2178],{"class":1052,"line":1662},[1050,2177,1853],{"class":1782},[1050,2179,1809],{"class":1786},[1050,2181,2182,2184],{"class":1052,"line":1667},[1050,2183,1839],{"class":1786},[1050,2185,1862],{"class":1245},[1050,2187,2188,2190],{"class":1052,"line":1674},[1050,2189,1881],{"class":1782},[1050,2191,1809],{"class":1786},[1050,2193,2194,2196],{"class":1052,"line":1679},[1050,2195,1839],{"class":1786},[1050,2197,1890],{"class":1245},[1050,2199,2200,2202],{"class":1052,"line":1685},[1050,2201,1839],{"class":1786},[1050,2203,1897],{"class":1245},[1050,2205,2206,2208],{"class":1052,"line":1694},[1050,2207,1839],{"class":1786},[1050,2209,1904],{"class":1245},[1050,2211,2212,2214],{"class":1052,"line":1703},[1050,2213,1839],{"class":1786},[1050,2215,1911],{"class":1245},[1050,2217,2218,2220],{"class":1052,"line":1708},[1050,2219,1916],{"class":1782},[1050,2221,1809],{"class":1786},[1050,2223,2224,2226],{"class":1052,"line":1715},[1050,2225,1839],{"class":1786},[1050,2227,1925],{"class":1245},[1050,2229,2230,2232],{"class":1052,"line":1720},[1050,2231,1839],{"class":1786},[1050,2233,1932],{"class":1245},[1050,2235,2236],{"class":1052,"line":1726},[1050,2237,1075],{"emptyLinePlaceholder":1074},[1050,2239,2240,2243],{"class":1052,"line":1734},[1050,2241,2242],{"class":1782},"volumes",[1050,2244,1809],{"class":1786},[1050,2246,2247,2250],{"class":1052,"line":1742},[1050,2248,2249],{"class":1782},"  postgres_data",[1050,2251,1809],{"class":1786},[1050,2253,2255,2258],{"class":1052,"line":2254},69,[1050,2256,2257],{"class":1782},"  static_volume",[1050,2259,1809],{"class":1786},[1050,2261,2263,2266],{"class":1052,"line":2262},70,[1050,2264,2265],{"class":1782},"  media_volume",[1050,2267,1809],{"class":1786},[1035,2269,2271],{"id":2270},"production-docker-compose","Production Docker Compose",[1040,2273,2275],{"className":1768,"code":2274,"language":1770,"meta":1045,"style":1045},"# docker-compose.prod.yml\nversion: '3.8'\n\nservices:\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - static_volume:/app/staticfiles:ro\n      - media_volume:/app/media:ro\n      - ./docker/nginx:/etc/nginx/conf.d:ro\n      - ./docker/ssl:/etc/ssl:ro\n    depends_on:\n      - web\n    restart: unless-stopped\n\n  web:\n    build:\n      context: .\n      dockerfile: Dockerfile.production\n    volumes:\n      - static_volume:/app/staticfiles\n      - media_volume:/app/media\n    environment:\n      - DJANGO_SETTINGS_MODULE=myproject.settings.production\n      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}\n      - REDIS_URL=redis://redis:6379/1\n      - SECRET_KEY=${SECRET_KEY}\n    depends_on:\n      - db\n      - redis\n    restart: unless-stopped\n    deploy:\n      replicas: 3\n      resources:\n        limits:\n          memory: 512M\n        reservations:\n          memory: 256M\n\n  db:\n    image: postgres:13\n    volumes:\n      - postgres_data:/var/lib/postgresql/data/\n      - ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro\n    environment:\n      - POSTGRES_DB=${POSTGRES_DB}\n      - POSTGRES_USER=${POSTGRES_USER}\n      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\n    restart: unless-stopped\n    deploy:\n      resources:\n        limits:\n          memory: 1G\n        reservations:\n          memory: 512M\n\n  redis:\n    image: redis:7-alpine\n    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}\n    volumes:\n      - redis_data:/data\n    restart: unless-stopped\n    deploy:\n      resources:\n        limits:\n          memory: 256M\n        reservations:\n          memory: 128M\n\n  celery:\n    build:\n      context: .\n      dockerfile: Dockerfile.production\n    command: celery -A myproject worker -l info --concurrency=4\n    volumes:\n      - media_volume:/app/media\n    environment:\n      - DJANGO_SETTINGS_MODULE=myproject.settings.production\n      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}\n      - REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379/1\n      - SECRET_KEY=${SECRET_KEY}\n    depends_on:\n      - db\n      - redis\n    restart: unless-stopped\n    deploy:\n      replicas: 2\n      resources:\n        limits:\n          memory: 512M\n        reservations:\n          memory: 256M\n\n  celery-beat:\n    build:\n      context: .\n      dockerfile: Dockerfile.production\n    command: celery -A myproject beat -l info\n    volumes:\n      - media_volume:/app/media\n    environment:\n      - DJANGO_SETTINGS_MODULE=myproject.settings.production\n      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}\n      - REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379/1\n      - SECRET_KEY=${SECRET_KEY}\n    depends_on:\n      - db\n      - redis\n    restart: unless-stopped\n    deploy:\n      resources:\n        limits:\n          memory: 256M\n        reservations:\n          memory: 128M\n\n  monitoring:\n    image: prom/prometheus:latest\n    ports:\n      - \"9090:9090\"\n    volumes:\n      - ./docker/prometheus:/etc/prometheus:ro\n      - prometheus_data:/prometheus\n    command:\n      - '--config.file=/etc/prometheus/prometheus.yml'\n      - '--storage.tsdb.path=/prometheus'\n      - '--web.console.libraries=/etc/prometheus/console_libraries'\n      - '--web.console.templates=/etc/prometheus/consoles'\n    restart: unless-stopped\n\nvolumes:\n  postgres_data:\n  redis_data:\n  static_volume:\n  media_volume:\n  prometheus_data:\n\nnetworks:\n  default:\n    driver: bridge\n",[1047,2276,2277,2282,2294,2298,2304,2311,2320,2326,2337,2348,2354,2361,2368,2375,2382,2388,2395,2405,2409,2415,2421,2430,2440,2446,2452,2458,2464,2470,2477,2483,2490,2496,2502,2508,2516,2523,2533,2540,2547,2557,2564,2573,2577,2583,2591,2597,2603,2610,2616,2623,2630,2637,2645,2651,2657,2663,2672,2678,2686,2690,2696,2704,2713,2719,2726,2734,2740,2746,2752,2760,2766,2776,2781,2788,2795,2804,2813,2823,2830,2837,2844,2851,2858,2866,2873,2880,2887,2894,2903,2910,2920,2927,2934,2943,2950,2959,2964,2971,2978,2987,2996,3005,3012,3019,3026,3033,3040,3047,3054,3061,3068,3075,3084,3091,3098,3105,3114,3121,3130,3135,3143,3153,3160,3172,3179,3187,3195,3202,3214,3226,3238,3250,3259,3264,3271,3278,3286,3293,3300,3308,3313,3321,3329],{"__ignoreMap":1045},[1050,2278,2279],{"class":1052,"line":1053},[1050,2280,2281],{"class":1056},"# docker-compose.prod.yml\n",[1050,2283,2284,2286,2288,2290,2292],{"class":1052,"line":1060},[1050,2285,1783],{"class":1782},[1050,2287,1787],{"class":1786},[1050,2289,1791],{"class":1790},[1050,2291,1794],{"class":1245},[1050,2293,1797],{"class":1790},[1050,2295,2296],{"class":1052,"line":1071},[1050,2297,1075],{"emptyLinePlaceholder":1074},[1050,2299,2300,2302],{"class":1052,"line":1078},[1050,2301,1806],{"class":1782},[1050,2303,1809],{"class":1786},[1050,2305,2306,2309],{"class":1052,"line":1084},[1050,2307,2308],{"class":1782},"  nginx",[1050,2310,1809],{"class":1786},[1050,2312,2313,2315,2317],{"class":1052,"line":1093},[1050,2314,1958],{"class":1782},[1050,2316,1787],{"class":1786},[1050,2318,2319],{"class":1245}," nginx:alpine\n",[1050,2321,2322,2324],{"class":1052,"line":1101},[1050,2323,1832],{"class":1782},[1050,2325,1809],{"class":1786},[1050,2327,2328,2330,2332,2335],{"class":1052,"line":1109},[1050,2329,1839],{"class":1786},[1050,2331,1842],{"class":1790},[1050,2333,2334],{"class":1245},"80:80",[1050,2336,1848],{"class":1790},[1050,2338,2339,2341,2343,2346],{"class":1052,"line":1114},[1050,2340,1839],{"class":1786},[1050,2342,1842],{"class":1790},[1050,2344,2345],{"class":1245},"443:443",[1050,2347,1848],{"class":1790},[1050,2349,2350,2352],{"class":1052,"line":1120},[1050,2351,1853],{"class":1782},[1050,2353,1809],{"class":1786},[1050,2355,2356,2358],{"class":1052,"line":1129},[1050,2357,1839],{"class":1786},[1050,2359,2360],{"class":1245}," static_volume:/app/staticfiles:ro\n",[1050,2362,2363,2365],{"class":1052,"line":1134},[1050,2364,1839],{"class":1786},[1050,2366,2367],{"class":1245}," media_volume:/app/media:ro\n",[1050,2369,2370,2372],{"class":1052,"line":1140},[1050,2371,1839],{"class":1786},[1050,2373,2374],{"class":1245}," ./docker/nginx:/etc/nginx/conf.d:ro\n",[1050,2376,2377,2379],{"class":1052,"line":1149},[1050,2378,1839],{"class":1786},[1050,2380,2381],{"class":1245}," ./docker/ssl:/etc/ssl:ro\n",[1050,2383,2384,2386],{"class":1052,"line":1155},[1050,2385,1916],{"class":1782},[1050,2387,1809],{"class":1786},[1050,2389,2390,2392],{"class":1052,"line":1161},[1050,2391,1839],{"class":1786},[1050,2393,2394],{"class":1245}," web\n",[1050,2396,2397,2400,2402],{"class":1052,"line":1167},[1050,2398,2399],{"class":1782},"    restart",[1050,2401,1787],{"class":1786},[1050,2403,2404],{"class":1245}," unless-stopped\n",[1050,2406,2407],{"class":1052,"line":1173},[1050,2408,1075],{"emptyLinePlaceholder":1074},[1050,2410,2411,2413],{"class":1052,"line":1179},[1050,2412,1814],{"class":1782},[1050,2414,1809],{"class":1786},[1050,2416,2417,2419],{"class":1052,"line":1184},[1050,2418,1821],{"class":1782},[1050,2420,1809],{"class":1786},[1050,2422,2423,2426,2428],{"class":1052,"line":1190},[1050,2424,2425],{"class":1782},"      context",[1050,2427,1787],{"class":1786},[1050,2429,1827],{"class":1826},[1050,2431,2432,2435,2437],{"class":1052,"line":1199},[1050,2433,2434],{"class":1782},"      dockerfile",[1050,2436,1787],{"class":1786},[1050,2438,2439],{"class":1245}," Dockerfile.production\n",[1050,2441,2442,2444],{"class":1052,"line":1207},[1050,2443,1853],{"class":1782},[1050,2445,1809],{"class":1786},[1050,2447,2448,2450],{"class":1052,"line":1212},[1050,2449,1839],{"class":1786},[1050,2451,1869],{"class":1245},[1050,2453,2454,2456],{"class":1052,"line":1218},[1050,2455,1839],{"class":1786},[1050,2457,1876],{"class":1245},[1050,2459,2460,2462],{"class":1052,"line":1226},[1050,2461,1881],{"class":1782},[1050,2463,1809],{"class":1786},[1050,2465,2466,2468],{"class":1052,"line":1231},[1050,2467,1839],{"class":1786},[1050,2469,1106],{"class":1245},[1050,2471,2472,2474],{"class":1052,"line":1237},[1050,2473,1839],{"class":1786},[1050,2475,2476],{"class":1245}," DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}\n",[1050,2478,2479,2481],{"class":1052,"line":1252},[1050,2480,1839],{"class":1786},[1050,2482,1911],{"class":1245},[1050,2484,2485,2487],{"class":1052,"line":1260},[1050,2486,1839],{"class":1786},[1050,2488,2489],{"class":1245}," SECRET_KEY=${SECRET_KEY}\n",[1050,2491,2492,2494],{"class":1052,"line":1268},[1050,2493,1916],{"class":1782},[1050,2495,1809],{"class":1786},[1050,2497,2498,2500],{"class":1052,"line":1273},[1050,2499,1839],{"class":1786},[1050,2501,1925],{"class":1245},[1050,2503,2504,2506],{"class":1052,"line":1279},[1050,2505,1839],{"class":1786},[1050,2507,1932],{"class":1245},[1050,2509,2510,2512,2514],{"class":1052,"line":1287},[1050,2511,2399],{"class":1782},[1050,2513,1787],{"class":1786},[1050,2515,2404],{"class":1245},[1050,2517,2518,2521],{"class":1052,"line":1292},[1050,2519,2520],{"class":1782},"    deploy",[1050,2522,1809],{"class":1786},[1050,2524,2525,2528,2530],{"class":1052,"line":1298},[1050,2526,2527],{"class":1782},"      replicas",[1050,2529,1787],{"class":1786},[1050,2531,2532],{"class":1826}," 3\n",[1050,2534,2535,2538],{"class":1052,"line":1307},[1050,2536,2537],{"class":1782},"      resources",[1050,2539,1809],{"class":1786},[1050,2541,2542,2545],{"class":1052,"line":1312},[1050,2543,2544],{"class":1782},"        limits",[1050,2546,1809],{"class":1786},[1050,2548,2549,2552,2554],{"class":1052,"line":1318},[1050,2550,2551],{"class":1782},"          memory",[1050,2553,1787],{"class":1786},[1050,2555,2556],{"class":1245}," 512M\n",[1050,2558,2559,2562],{"class":1052,"line":1560},[1050,2560,2561],{"class":1782},"        reservations",[1050,2563,1809],{"class":1786},[1050,2565,2566,2568,2570],{"class":1052,"line":1565},[1050,2567,2551],{"class":1782},[1050,2569,1787],{"class":1786},[1050,2571,2572],{"class":1245}," 256M\n",[1050,2574,2575],{"class":1052,"line":1576},[1050,2576,1075],{"emptyLinePlaceholder":1074},[1050,2578,2579,2581],{"class":1052,"line":1581},[1050,2580,1951],{"class":1782},[1050,2582,1809],{"class":1786},[1050,2584,2585,2587,2589],{"class":1052,"line":1587},[1050,2586,1958],{"class":1782},[1050,2588,1787],{"class":1786},[1050,2590,1963],{"class":1245},[1050,2592,2593,2595],{"class":1052,"line":1595},[1050,2594,1853],{"class":1782},[1050,2596,1809],{"class":1786},[1050,2598,2599,2601],{"class":1052,"line":1600},[1050,2600,1839],{"class":1786},[1050,2602,1976],{"class":1245},[1050,2604,2605,2607],{"class":1052,"line":1606},[1050,2606,1839],{"class":1786},[1050,2608,2609],{"class":1245}," ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro\n",[1050,2611,2612,2614],{"class":1052,"line":1614},[1050,2613,1881],{"class":1782},[1050,2615,1809],{"class":1786},[1050,2617,2618,2620],{"class":1052,"line":1619},[1050,2619,1839],{"class":1786},[1050,2621,2622],{"class":1245}," POSTGRES_DB=${POSTGRES_DB}\n",[1050,2624,2625,2627],{"class":1052,"line":1625},[1050,2626,1839],{"class":1786},[1050,2628,2629],{"class":1245}," POSTGRES_USER=${POSTGRES_USER}\n",[1050,2631,2632,2634],{"class":1052,"line":1633},[1050,2633,1839],{"class":1786},[1050,2635,2636],{"class":1245}," POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\n",[1050,2638,2639,2641,2643],{"class":1052,"line":1639},[1050,2640,2399],{"class":1782},[1050,2642,1787],{"class":1786},[1050,2644,2404],{"class":1245},[1050,2646,2647,2649],{"class":1052,"line":1644},[1050,2648,2520],{"class":1782},[1050,2650,1809],{"class":1786},[1050,2652,2653,2655],{"class":1052,"line":1650},[1050,2654,2537],{"class":1782},[1050,2656,1809],{"class":1786},[1050,2658,2659,2661],{"class":1052,"line":1657},[1050,2660,2544],{"class":1782},[1050,2662,1809],{"class":1786},[1050,2664,2665,2667,2669],{"class":1052,"line":1662},[1050,2666,2551],{"class":1782},[1050,2668,1787],{"class":1786},[1050,2670,2671],{"class":1245}," 1G\n",[1050,2673,2674,2676],{"class":1052,"line":1667},[1050,2675,2561],{"class":1782},[1050,2677,1809],{"class":1786},[1050,2679,2680,2682,2684],{"class":1052,"line":1674},[1050,2681,2551],{"class":1782},[1050,2683,1787],{"class":1786},[1050,2685,2556],{"class":1245},[1050,2687,2688],{"class":1052,"line":1679},[1050,2689,1075],{"emptyLinePlaceholder":1074},[1050,2691,2692,2694],{"class":1052,"line":1685},[1050,2693,2029],{"class":1782},[1050,2695,1809],{"class":1786},[1050,2697,2698,2700,2702],{"class":1052,"line":1694},[1050,2699,1958],{"class":1782},[1050,2701,1787],{"class":1786},[1050,2703,2040],{"class":1245},[1050,2705,2706,2708,2710],{"class":1052,"line":1703},[1050,2707,1937],{"class":1782},[1050,2709,1787],{"class":1786},[1050,2711,2712],{"class":1245}," redis-server --appendonly yes --requirepass ${REDIS_PASSWORD}\n",[1050,2714,2715,2717],{"class":1052,"line":1708},[1050,2716,1853],{"class":1782},[1050,2718,1809],{"class":1786},[1050,2720,2721,2723],{"class":1052,"line":1715},[1050,2722,1839],{"class":1786},[1050,2724,2725],{"class":1245}," redis_data:/data\n",[1050,2727,2728,2730,2732],{"class":1052,"line":1720},[1050,2729,2399],{"class":1782},[1050,2731,1787],{"class":1786},[1050,2733,2404],{"class":1245},[1050,2735,2736,2738],{"class":1052,"line":1726},[1050,2737,2520],{"class":1782},[1050,2739,1809],{"class":1786},[1050,2741,2742,2744],{"class":1052,"line":1734},[1050,2743,2537],{"class":1782},[1050,2745,1809],{"class":1786},[1050,2747,2748,2750],{"class":1052,"line":1742},[1050,2749,2544],{"class":1782},[1050,2751,1809],{"class":1786},[1050,2753,2754,2756,2758],{"class":1052,"line":2254},[1050,2755,2551],{"class":1782},[1050,2757,1787],{"class":1786},[1050,2759,2572],{"class":1245},[1050,2761,2762,2764],{"class":1052,"line":2262},[1050,2763,2561],{"class":1782},[1050,2765,1809],{"class":1786},[1050,2767,2769,2771,2773],{"class":1052,"line":2768},71,[1050,2770,2551],{"class":1782},[1050,2772,1787],{"class":1786},[1050,2774,2775],{"class":1245}," 128M\n",[1050,2777,2779],{"class":1052,"line":2778},72,[1050,2780,1075],{"emptyLinePlaceholder":1074},[1050,2782,2784,2786],{"class":1052,"line":2783},73,[1050,2785,2066],{"class":1782},[1050,2787,1809],{"class":1786},[1050,2789,2791,2793],{"class":1052,"line":2790},74,[1050,2792,1821],{"class":1782},[1050,2794,1809],{"class":1786},[1050,2796,2798,2800,2802],{"class":1052,"line":2797},75,[1050,2799,2425],{"class":1782},[1050,2801,1787],{"class":1786},[1050,2803,1827],{"class":1826},[1050,2805,2807,2809,2811],{"class":1052,"line":2806},76,[1050,2808,2434],{"class":1782},[1050,2810,1787],{"class":1786},[1050,2812,2439],{"class":1245},[1050,2814,2816,2818,2820],{"class":1052,"line":2815},77,[1050,2817,1937],{"class":1782},[1050,2819,1787],{"class":1786},[1050,2821,2822],{"class":1245}," celery -A myproject worker -l info --concurrency=4\n",[1050,2824,2826,2828],{"class":1052,"line":2825},78,[1050,2827,1853],{"class":1782},[1050,2829,1809],{"class":1786},[1050,2831,2833,2835],{"class":1052,"line":2832},79,[1050,2834,1839],{"class":1786},[1050,2836,1876],{"class":1245},[1050,2838,2840,2842],{"class":1052,"line":2839},80,[1050,2841,1881],{"class":1782},[1050,2843,1809],{"class":1786},[1050,2845,2847,2849],{"class":1052,"line":2846},81,[1050,2848,1839],{"class":1786},[1050,2850,1106],{"class":1245},[1050,2852,2854,2856],{"class":1052,"line":2853},82,[1050,2855,1839],{"class":1786},[1050,2857,2476],{"class":1245},[1050,2859,2861,2863],{"class":1052,"line":2860},83,[1050,2862,1839],{"class":1786},[1050,2864,2865],{"class":1245}," REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379/1\n",[1050,2867,2869,2871],{"class":1052,"line":2868},84,[1050,2870,1839],{"class":1786},[1050,2872,2489],{"class":1245},[1050,2874,2876,2878],{"class":1052,"line":2875},85,[1050,2877,1916],{"class":1782},[1050,2879,1809],{"class":1786},[1050,2881,2883,2885],{"class":1052,"line":2882},86,[1050,2884,1839],{"class":1786},[1050,2886,1925],{"class":1245},[1050,2888,2890,2892],{"class":1052,"line":2889},87,[1050,2891,1839],{"class":1786},[1050,2893,1932],{"class":1245},[1050,2895,2897,2899,2901],{"class":1052,"line":2896},88,[1050,2898,2399],{"class":1782},[1050,2900,1787],{"class":1786},[1050,2902,2404],{"class":1245},[1050,2904,2906,2908],{"class":1052,"line":2905},89,[1050,2907,2520],{"class":1782},[1050,2909,1809],{"class":1786},[1050,2911,2913,2915,2917],{"class":1052,"line":2912},90,[1050,2914,2527],{"class":1782},[1050,2916,1787],{"class":1786},[1050,2918,2919],{"class":1826}," 2\n",[1050,2921,2923,2925],{"class":1052,"line":2922},91,[1050,2924,2537],{"class":1782},[1050,2926,1809],{"class":1786},[1050,2928,2930,2932],{"class":1052,"line":2929},92,[1050,2931,2544],{"class":1782},[1050,2933,1809],{"class":1786},[1050,2935,2937,2939,2941],{"class":1052,"line":2936},93,[1050,2938,2551],{"class":1782},[1050,2940,1787],{"class":1786},[1050,2942,2556],{"class":1245},[1050,2944,2946,2948],{"class":1052,"line":2945},94,[1050,2947,2561],{"class":1782},[1050,2949,1809],{"class":1786},[1050,2951,2953,2955,2957],{"class":1052,"line":2952},95,[1050,2954,2551],{"class":1782},[1050,2956,1787],{"class":1786},[1050,2958,2572],{"class":1245},[1050,2960,2962],{"class":1052,"line":2961},96,[1050,2963,1075],{"emptyLinePlaceholder":1074},[1050,2965,2967,2969],{"class":1052,"line":2966},97,[1050,2968,2154],{"class":1782},[1050,2970,1809],{"class":1786},[1050,2972,2974,2976],{"class":1052,"line":2973},98,[1050,2975,1821],{"class":1782},[1050,2977,1809],{"class":1786},[1050,2979,2981,2983,2985],{"class":1052,"line":2980},99,[1050,2982,2425],{"class":1782},[1050,2984,1787],{"class":1786},[1050,2986,1827],{"class":1826},[1050,2988,2990,2992,2994],{"class":1052,"line":2989},100,[1050,2991,2434],{"class":1782},[1050,2993,1787],{"class":1786},[1050,2995,2439],{"class":1245},[1050,2997,2999,3001,3003],{"class":1052,"line":2998},101,[1050,3000,1937],{"class":1782},[1050,3002,1787],{"class":1786},[1050,3004,2173],{"class":1245},[1050,3006,3008,3010],{"class":1052,"line":3007},102,[1050,3009,1853],{"class":1782},[1050,3011,1809],{"class":1786},[1050,3013,3015,3017],{"class":1052,"line":3014},103,[1050,3016,1839],{"class":1786},[1050,3018,1876],{"class":1245},[1050,3020,3022,3024],{"class":1052,"line":3021},104,[1050,3023,1881],{"class":1782},[1050,3025,1809],{"class":1786},[1050,3027,3029,3031],{"class":1052,"line":3028},105,[1050,3030,1839],{"class":1786},[1050,3032,1106],{"class":1245},[1050,3034,3036,3038],{"class":1052,"line":3035},106,[1050,3037,1839],{"class":1786},[1050,3039,2476],{"class":1245},[1050,3041,3043,3045],{"class":1052,"line":3042},107,[1050,3044,1839],{"class":1786},[1050,3046,2865],{"class":1245},[1050,3048,3050,3052],{"class":1052,"line":3049},108,[1050,3051,1839],{"class":1786},[1050,3053,2489],{"class":1245},[1050,3055,3057,3059],{"class":1052,"line":3056},109,[1050,3058,1916],{"class":1782},[1050,3060,1809],{"class":1786},[1050,3062,3064,3066],{"class":1052,"line":3063},110,[1050,3065,1839],{"class":1786},[1050,3067,1925],{"class":1245},[1050,3069,3071,3073],{"class":1052,"line":3070},111,[1050,3072,1839],{"class":1786},[1050,3074,1932],{"class":1245},[1050,3076,3078,3080,3082],{"class":1052,"line":3077},112,[1050,3079,2399],{"class":1782},[1050,3081,1787],{"class":1786},[1050,3083,2404],{"class":1245},[1050,3085,3087,3089],{"class":1052,"line":3086},113,[1050,3088,2520],{"class":1782},[1050,3090,1809],{"class":1786},[1050,3092,3094,3096],{"class":1052,"line":3093},114,[1050,3095,2537],{"class":1782},[1050,3097,1809],{"class":1786},[1050,3099,3101,3103],{"class":1052,"line":3100},115,[1050,3102,2544],{"class":1782},[1050,3104,1809],{"class":1786},[1050,3106,3108,3110,3112],{"class":1052,"line":3107},116,[1050,3109,2551],{"class":1782},[1050,3111,1787],{"class":1786},[1050,3113,2572],{"class":1245},[1050,3115,3117,3119],{"class":1052,"line":3116},117,[1050,3118,2561],{"class":1782},[1050,3120,1809],{"class":1786},[1050,3122,3124,3126,3128],{"class":1052,"line":3123},118,[1050,3125,2551],{"class":1782},[1050,3127,1787],{"class":1786},[1050,3129,2775],{"class":1245},[1050,3131,3133],{"class":1052,"line":3132},119,[1050,3134,1075],{"emptyLinePlaceholder":1074},[1050,3136,3138,3141],{"class":1052,"line":3137},120,[1050,3139,3140],{"class":1782},"  monitoring",[1050,3142,1809],{"class":1786},[1050,3144,3146,3148,3150],{"class":1052,"line":3145},121,[1050,3147,1958],{"class":1782},[1050,3149,1787],{"class":1786},[1050,3151,3152],{"class":1245}," prom/prometheus:latest\n",[1050,3154,3156,3158],{"class":1052,"line":3155},122,[1050,3157,1832],{"class":1782},[1050,3159,1809],{"class":1786},[1050,3161,3163,3165,3167,3170],{"class":1052,"line":3162},123,[1050,3164,1839],{"class":1786},[1050,3166,1842],{"class":1790},[1050,3168,3169],{"class":1245},"9090:9090",[1050,3171,1848],{"class":1790},[1050,3173,3175,3177],{"class":1052,"line":3174},124,[1050,3176,1853],{"class":1782},[1050,3178,1809],{"class":1786},[1050,3180,3182,3184],{"class":1052,"line":3181},125,[1050,3183,1839],{"class":1786},[1050,3185,3186],{"class":1245}," ./docker/prometheus:/etc/prometheus:ro\n",[1050,3188,3190,3192],{"class":1052,"line":3189},126,[1050,3191,1839],{"class":1786},[1050,3193,3194],{"class":1245}," prometheus_data:/prometheus\n",[1050,3196,3198,3200],{"class":1052,"line":3197},127,[1050,3199,1937],{"class":1782},[1050,3201,1809],{"class":1786},[1050,3203,3205,3207,3209,3212],{"class":1052,"line":3204},128,[1050,3206,1839],{"class":1786},[1050,3208,1791],{"class":1790},[1050,3210,3211],{"class":1245},"--config.file=/etc/prometheus/prometheus.yml",[1050,3213,1797],{"class":1790},[1050,3215,3217,3219,3221,3224],{"class":1052,"line":3216},129,[1050,3218,1839],{"class":1786},[1050,3220,1791],{"class":1790},[1050,3222,3223],{"class":1245},"--storage.tsdb.path=/prometheus",[1050,3225,1797],{"class":1790},[1050,3227,3229,3231,3233,3236],{"class":1052,"line":3228},130,[1050,3230,1839],{"class":1786},[1050,3232,1791],{"class":1790},[1050,3234,3235],{"class":1245},"--web.console.libraries=/etc/prometheus/console_libraries",[1050,3237,1797],{"class":1790},[1050,3239,3241,3243,3245,3248],{"class":1052,"line":3240},131,[1050,3242,1839],{"class":1786},[1050,3244,1791],{"class":1790},[1050,3246,3247],{"class":1245},"--web.console.templates=/etc/prometheus/consoles",[1050,3249,1797],{"class":1790},[1050,3251,3253,3255,3257],{"class":1052,"line":3252},132,[1050,3254,2399],{"class":1782},[1050,3256,1787],{"class":1786},[1050,3258,2404],{"class":1245},[1050,3260,3262],{"class":1052,"line":3261},133,[1050,3263,1075],{"emptyLinePlaceholder":1074},[1050,3265,3267,3269],{"class":1052,"line":3266},134,[1050,3268,2242],{"class":1782},[1050,3270,1809],{"class":1786},[1050,3272,3274,3276],{"class":1052,"line":3273},135,[1050,3275,2249],{"class":1782},[1050,3277,1809],{"class":1786},[1050,3279,3281,3284],{"class":1052,"line":3280},136,[1050,3282,3283],{"class":1782},"  redis_data",[1050,3285,1809],{"class":1786},[1050,3287,3289,3291],{"class":1052,"line":3288},137,[1050,3290,2257],{"class":1782},[1050,3292,1809],{"class":1786},[1050,3294,3296,3298],{"class":1052,"line":3295},138,[1050,3297,2265],{"class":1782},[1050,3299,1809],{"class":1786},[1050,3301,3303,3306],{"class":1052,"line":3302},139,[1050,3304,3305],{"class":1782},"  prometheus_data",[1050,3307,1809],{"class":1786},[1050,3309,3311],{"class":1052,"line":3310},140,[1050,3312,1075],{"emptyLinePlaceholder":1074},[1050,3314,3316,3319],{"class":1052,"line":3315},141,[1050,3317,3318],{"class":1782},"networks",[1050,3320,1809],{"class":1786},[1050,3322,3324,3327],{"class":1052,"line":3323},142,[1050,3325,3326],{"class":1782},"  default",[1050,3328,1809],{"class":1786},[1050,3330,3332,3335,3337],{"class":1052,"line":3331},143,[1050,3333,3334],{"class":1782},"    driver",[1050,3336,1787],{"class":1786},[1050,3338,3339],{"class":1245}," bridge\n",[1030,3341,3343],{"id":3342},"container-optimization","Container Optimization",[1035,3345,3347],{"id":3346},"optimized-dockerfile-with-caching","Optimized Dockerfile with Caching",[1040,3349,3351],{"className":1042,"code":3350,"language":1044,"meta":1045,"style":1045},"# Dockerfile.optimized\nFROM python:3.11-slim as base\n\n# Set environment variables\nENV PYTHONDONTWRITEBYTECODE=1\nENV PYTHONUNBUFFERED=1\nENV PIP_NO_CACHE_DIR=1\nENV PIP_DISABLE_PIP_VERSION_CHECK=1\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        curl \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Development stage\nFROM base as development\n\nWORKDIR /app\n\n# Install development dependencies\nCOPY requirements/development.txt /app/requirements/\nRUN pip install -r requirements/development.txt\n\n# Copy source code\nCOPY . /app/\n\n# Create non-root user\nRUN adduser --disabled-password --gecos '' appuser \\\n    && chown -R appuser:appuser /app\nUSER appuser\n\nCMD [\"python\", \"manage.py\", \"runserver\", \"0.0.0.0:8000\"]\n\n# Production stage\nFROM base as production\n\nWORKDIR /app\n\n# Install production dependencies only\nCOPY requirements/production.txt /app/requirements/\nRUN pip install -r requirements/production.txt\n\n# Copy source code\nCOPY . /app/\n\n# Create non-root user and set permissions\nRUN adduser --disabled-password --gecos '' appuser \\\n    && mkdir -p /app/staticfiles /app/media \\\n    && chown -R appuser:appuser /app\n\nUSER appuser\n\n# Collect static files\nRUN python manage.py collectstatic --noinput\n\n# Health check\nHEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \\\n    CMD curl -f http://localhost:8000/health/ || exit 1\n\nEXPOSE 8000\n\nCMD [\"gunicorn\", \"--bind\", \"0.0.0.0:8000\", \"--workers\", \"3\", \"myproject.wsgi:application\"]\n",[1047,3352,3353,3358,3369,3373,3377,3383,3389,3396,3403,3407,3411,3417,3421,3425,3429,3433,3438,3442,3446,3451,3463,3467,3473,3477,3482,3489,3496,3500,3505,3511,3515,3519,3530,3535,3541,3545,3570,3574,3578,3589,3593,3599,3603,3608,3615,3622,3626,3630,3636,3640,3645,3655,3660,3664,3668,3674,3678,3682,3688,3692,3696,3703,3709,3713,3719,3723],{"__ignoreMap":1045},[1050,3354,3355],{"class":1052,"line":1053},[1050,3356,3357],{"class":1056},"# Dockerfile.optimized\n",[1050,3359,3360,3362,3364,3366],{"class":1052,"line":1060},[1050,3361,1064],{"class":1063},[1050,3363,1372],{"class":1067},[1050,3365,1375],{"class":1063},[1050,3367,3368],{"class":1067}," base\n",[1050,3370,3371],{"class":1052,"line":1071},[1050,3372,1075],{"emptyLinePlaceholder":1074},[1050,3374,3375],{"class":1052,"line":1078},[1050,3376,1081],{"class":1056},[1050,3378,3379,3381],{"class":1052,"line":1084},[1050,3380,1087],{"class":1063},[1050,3382,1090],{"class":1067},[1050,3384,3385,3387],{"class":1052,"line":1093},[1050,3386,1087],{"class":1063},[1050,3388,1098],{"class":1067},[1050,3390,3391,3393],{"class":1052,"line":1101},[1050,3392,1087],{"class":1063},[1050,3394,3395],{"class":1067}," PIP_NO_CACHE_DIR=1\n",[1050,3397,3398,3400],{"class":1052,"line":1109},[1050,3399,1087],{"class":1063},[1050,3401,3402],{"class":1067}," PIP_DISABLE_PIP_VERSION_CHECK=1\n",[1050,3404,3405],{"class":1052,"line":1114},[1050,3406,1075],{"emptyLinePlaceholder":1074},[1050,3408,3409],{"class":1052,"line":1120},[1050,3410,1137],{"class":1056},[1050,3412,3413,3415],{"class":1052,"line":1129},[1050,3414,1143],{"class":1063},[1050,3416,1146],{"class":1067},[1050,3418,3419],{"class":1052,"line":1134},[1050,3420,1152],{"class":1067},[1050,3422,3423],{"class":1052,"line":1140},[1050,3424,1158],{"class":1067},[1050,3426,3427],{"class":1052,"line":1149},[1050,3428,1164],{"class":1067},[1050,3430,3431],{"class":1052,"line":1155},[1050,3432,1170],{"class":1067},[1050,3434,3435],{"class":1052,"line":1161},[1050,3436,3437],{"class":1067},"        curl \\\n",[1050,3439,3440],{"class":1052,"line":1167},[1050,3441,1176],{"class":1067},[1050,3443,3444],{"class":1052,"line":1173},[1050,3445,1075],{"emptyLinePlaceholder":1074},[1050,3447,3448],{"class":1052,"line":1179},[1050,3449,3450],{"class":1056},"# Development stage\n",[1050,3452,3453,3455,3458,3460],{"class":1052,"line":1184},[1050,3454,1064],{"class":1063},[1050,3456,3457],{"class":1067}," base ",[1050,3459,1375],{"class":1063},[1050,3461,3462],{"class":1067}," development\n",[1050,3464,3465],{"class":1052,"line":1190},[1050,3466,1075],{"emptyLinePlaceholder":1074},[1050,3468,3469,3471],{"class":1052,"line":1199},[1050,3470,1123],{"class":1063},[1050,3472,1126],{"class":1067},[1050,3474,3475],{"class":1052,"line":1207},[1050,3476,1075],{"emptyLinePlaceholder":1074},[1050,3478,3479],{"class":1052,"line":1212},[1050,3480,3481],{"class":1056},"# Install development dependencies\n",[1050,3483,3484,3486],{"class":1052,"line":1218},[1050,3485,1193],{"class":1063},[1050,3487,3488],{"class":1067}," requirements/development.txt /app/requirements/\n",[1050,3490,3491,3493],{"class":1052,"line":1226},[1050,3492,1143],{"class":1063},[1050,3494,3495],{"class":1067}," pip install -r requirements/development.txt\n",[1050,3497,3498],{"class":1052,"line":1231},[1050,3499,1075],{"emptyLinePlaceholder":1074},[1050,3501,3502],{"class":1052,"line":1237},[1050,3503,3504],{"class":1056},"# Copy source code\n",[1050,3506,3507,3509],{"class":1052,"line":1252},[1050,3508,1193],{"class":1063},[1050,3510,1223],{"class":1067},[1050,3512,3513],{"class":1052,"line":1260},[1050,3514,1075],{"emptyLinePlaceholder":1074},[1050,3516,3517],{"class":1052,"line":1268},[1050,3518,1234],{"class":1056},[1050,3520,3521,3523,3525,3527],{"class":1052,"line":1273},[1050,3522,1143],{"class":1063},[1050,3524,1242],{"class":1067},[1050,3526,1246],{"class":1245},[1050,3528,3529],{"class":1067}," appuser \\\n",[1050,3531,3532],{"class":1052,"line":1279},[1050,3533,3534],{"class":1067},"    && chown -R appuser:appuser /app\n",[1050,3536,3537,3539],{"class":1052,"line":1287},[1050,3538,1263],{"class":1063},[1050,3540,1249],{"class":1067},[1050,3542,3543],{"class":1052,"line":1292},[1050,3544,1075],{"emptyLinePlaceholder":1074},[1050,3546,3547,3549,3551,3554,3556,3559,3561,3564,3566,3568],{"class":1052,"line":1298},[1050,3548,1321],{"class":1063},[1050,3550,1324],{"class":1067},[1050,3552,3553],{"class":1245},"\"python\"",[1050,3555,1330],{"class":1067},[1050,3557,3558],{"class":1245},"\"manage.py\"",[1050,3560,1330],{"class":1067},[1050,3562,3563],{"class":1245},"\"runserver\"",[1050,3565,1330],{"class":1067},[1050,3567,1338],{"class":1245},[1050,3569,1346],{"class":1067},[1050,3571,3572],{"class":1052,"line":1307},[1050,3573,1075],{"emptyLinePlaceholder":1074},[1050,3575,3576],{"class":1052,"line":1312},[1050,3577,1471],{"class":1056},[1050,3579,3580,3582,3584,3586],{"class":1052,"line":1318},[1050,3581,1064],{"class":1063},[1050,3583,3457],{"class":1067},[1050,3585,1375],{"class":1063},[1050,3587,3588],{"class":1067}," production\n",[1050,3590,3591],{"class":1052,"line":1560},[1050,3592,1075],{"emptyLinePlaceholder":1074},[1050,3594,3595,3597],{"class":1052,"line":1565},[1050,3596,1123],{"class":1063},[1050,3598,1126],{"class":1067},[1050,3600,3601],{"class":1052,"line":1576},[1050,3602,1075],{"emptyLinePlaceholder":1074},[1050,3604,3605],{"class":1052,"line":1581},[1050,3606,3607],{"class":1056},"# Install production dependencies only\n",[1050,3609,3610,3612],{"class":1052,"line":1587},[1050,3611,1193],{"class":1063},[1050,3613,3614],{"class":1067}," requirements/production.txt /app/requirements/\n",[1050,3616,3617,3619],{"class":1052,"line":1595},[1050,3618,1143],{"class":1063},[1050,3620,3621],{"class":1067}," pip install -r requirements/production.txt\n",[1050,3623,3624],{"class":1052,"line":1600},[1050,3625,1075],{"emptyLinePlaceholder":1074},[1050,3627,3628],{"class":1052,"line":1606},[1050,3629,3504],{"class":1056},[1050,3631,3632,3634],{"class":1052,"line":1614},[1050,3633,1193],{"class":1063},[1050,3635,1223],{"class":1067},[1050,3637,3638],{"class":1052,"line":1619},[1050,3639,1075],{"emptyLinePlaceholder":1074},[1050,3641,3642],{"class":1052,"line":1625},[1050,3643,3644],{"class":1056},"# Create non-root user and set permissions\n",[1050,3646,3647,3649,3651,3653],{"class":1052,"line":1633},[1050,3648,1143],{"class":1063},[1050,3650,1242],{"class":1067},[1050,3652,1246],{"class":1245},[1050,3654,3529],{"class":1067},[1050,3656,3657],{"class":1052,"line":1639},[1050,3658,3659],{"class":1067},"    && mkdir -p /app/staticfiles /app/media \\\n",[1050,3661,3662],{"class":1052,"line":1644},[1050,3663,3534],{"class":1067},[1050,3665,3666],{"class":1052,"line":1650},[1050,3667,1075],{"emptyLinePlaceholder":1074},[1050,3669,3670,3672],{"class":1052,"line":1657},[1050,3671,1263],{"class":1063},[1050,3673,1249],{"class":1067},[1050,3675,3676],{"class":1052,"line":1662},[1050,3677,1075],{"emptyLinePlaceholder":1074},[1050,3679,3680],{"class":1052,"line":1667},[1050,3681,1276],{"class":1056},[1050,3683,3684,3686],{"class":1052,"line":1674},[1050,3685,1143],{"class":1063},[1050,3687,1284],{"class":1067},[1050,3689,3690],{"class":1052,"line":1679},[1050,3691,1075],{"emptyLinePlaceholder":1074},[1050,3693,3694],{"class":1052,"line":1685},[1050,3695,1682],{"class":1056},[1050,3697,3698,3700],{"class":1052,"line":1694},[1050,3699,1688],{"class":1063},[1050,3701,3702],{"class":1067}," --interval=30s --timeout=10s --start-period=5s --retries=3 \\\n",[1050,3704,3705,3707],{"class":1052,"line":1703},[1050,3706,1697],{"class":1063},[1050,3708,1700],{"class":1067},[1050,3710,3711],{"class":1052,"line":1708},[1050,3712,1075],{"emptyLinePlaceholder":1074},[1050,3714,3715,3717],{"class":1052,"line":1715},[1050,3716,1301],{"class":1063},[1050,3718,1304],{"class":1067},[1050,3720,3721],{"class":1052,"line":1720},[1050,3722,1075],{"emptyLinePlaceholder":1074},[1050,3724,3725,3727,3729,3731,3733,3735,3737,3739,3741,3744,3746,3749,3751,3753],{"class":1052,"line":1726},[1050,3726,1321],{"class":1063},[1050,3728,1324],{"class":1067},[1050,3730,1327],{"class":1245},[1050,3732,1330],{"class":1067},[1050,3734,1333],{"class":1245},[1050,3736,1330],{"class":1067},[1050,3738,1338],{"class":1245},[1050,3740,1330],{"class":1067},[1050,3742,3743],{"class":1245},"\"--workers\"",[1050,3745,1330],{"class":1067},[1050,3747,3748],{"class":1245},"\"3\"",[1050,3750,1330],{"class":1067},[1050,3752,1343],{"class":1245},[1050,3754,1346],{"class":1067},[1035,3756,3758],{"id":3757},"multi-architecture-build","Multi-Architecture Build",[1040,3760,3762],{"className":1042,"code":3761,"language":1044,"meta":1045,"style":1045},"# Dockerfile.multiarch\nFROM --platform=$BUILDPLATFORM python:3.11-slim as base\n\nARG TARGETPLATFORM\nARG BUILDPLATFORM\n\nENV PYTHONDONTWRITEBYTECODE=1\nENV PYTHONUNBUFFERED=1\n\n# Install dependencies based on architecture\nRUN case \"$TARGETPLATFORM\" in \\\n        \"linux/amd64\") \\\n            apt-get update && apt-get install -y --no-install-recommends \\\n                postgresql-client build-essential libpq-dev ;; \\\n        \"linux/arm64\") \\\n            apt-get update && apt-get install -y --no-install-recommends \\\n                postgresql-client build-essential libpq-dev ;; \\\n        *) echo \"Unsupported platform: $TARGETPLATFORM\" && exit 1 ;; \\\n    esac \\\n    && rm -rf /var/lib/apt/lists/*\n\nWORKDIR /app\n\n# Copy and install requirements\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Copy application\nCOPY . .\n\n# Create user and set permissions\nRUN adduser --disabled-password --gecos '' appuser \\\n    && chown -R appuser:appuser /app\n\nUSER appuser\n\n# Collect static files\nRUN python manage.py collectstatic --noinput\n\nEXPOSE 8000\n\nCMD [\"gunicorn\", \"--bind\", \"0.0.0.0:8000\", \"myproject.wsgi:application\"]\n",[1047,3763,3764,3769,3780,3784,3792,3799,3803,3809,3815,3819,3824,3837,3845,3850,3855,3862,3866,3870,3881,3886,3890,3894,3900,3904,3909,3915,3921,3925,3930,3937,3941,3946,3956,3960,3964,3970,3974,3978,3984,3988,3994,3998],{"__ignoreMap":1045},[1050,3765,3766],{"class":1052,"line":1053},[1050,3767,3768],{"class":1056},"# Dockerfile.multiarch\n",[1050,3770,3771,3773,3776,3778],{"class":1052,"line":1060},[1050,3772,1064],{"class":1063},[1050,3774,3775],{"class":1067}," --platform=$BUILDPLATFORM python:3.11-slim ",[1050,3777,1375],{"class":1063},[1050,3779,3368],{"class":1067},[1050,3781,3782],{"class":1052,"line":1071},[1050,3783,1075],{"emptyLinePlaceholder":1074},[1050,3785,3786,3789],{"class":1052,"line":1078},[1050,3787,3788],{"class":1063},"ARG",[1050,3790,3791],{"class":1067}," TARGETPLATFORM\n",[1050,3793,3794,3796],{"class":1052,"line":1084},[1050,3795,3788],{"class":1063},[1050,3797,3798],{"class":1067}," BUILDPLATFORM\n",[1050,3800,3801],{"class":1052,"line":1093},[1050,3802,1075],{"emptyLinePlaceholder":1074},[1050,3804,3805,3807],{"class":1052,"line":1101},[1050,3806,1087],{"class":1063},[1050,3808,1090],{"class":1067},[1050,3810,3811,3813],{"class":1052,"line":1109},[1050,3812,1087],{"class":1063},[1050,3814,1098],{"class":1067},[1050,3816,3817],{"class":1052,"line":1114},[1050,3818,1075],{"emptyLinePlaceholder":1074},[1050,3820,3821],{"class":1052,"line":1120},[1050,3822,3823],{"class":1056},"# Install dependencies based on architecture\n",[1050,3825,3826,3828,3831,3834],{"class":1052,"line":1129},[1050,3827,1143],{"class":1063},[1050,3829,3830],{"class":1067}," case ",[1050,3832,3833],{"class":1245},"\"$TARGETPLATFORM\"",[1050,3835,3836],{"class":1067}," in \\\n",[1050,3838,3839,3842],{"class":1052,"line":1134},[1050,3840,3841],{"class":1245},"        \"linux/amd64\"",[1050,3843,3844],{"class":1067},") \\\n",[1050,3846,3847],{"class":1052,"line":1140},[1050,3848,3849],{"class":1067},"            apt-get update && apt-get install -y --no-install-recommends \\\n",[1050,3851,3852],{"class":1052,"line":1149},[1050,3853,3854],{"class":1067},"                postgresql-client build-essential libpq-dev ;; \\\n",[1050,3856,3857,3860],{"class":1052,"line":1155},[1050,3858,3859],{"class":1245},"        \"linux/arm64\"",[1050,3861,3844],{"class":1067},[1050,3863,3864],{"class":1052,"line":1161},[1050,3865,3849],{"class":1067},[1050,3867,3868],{"class":1052,"line":1167},[1050,3869,3854],{"class":1067},[1050,3871,3872,3875,3878],{"class":1052,"line":1173},[1050,3873,3874],{"class":1067},"        *) echo ",[1050,3876,3877],{"class":1245},"\"Unsupported platform: $TARGETPLATFORM\"",[1050,3879,3880],{"class":1067}," && exit 1 ;; \\\n",[1050,3882,3883],{"class":1052,"line":1179},[1050,3884,3885],{"class":1067},"    esac \\\n",[1050,3887,3888],{"class":1052,"line":1184},[1050,3889,1176],{"class":1067},[1050,3891,3892],{"class":1052,"line":1190},[1050,3893,1075],{"emptyLinePlaceholder":1074},[1050,3895,3896,3898],{"class":1052,"line":1199},[1050,3897,1123],{"class":1063},[1050,3899,1126],{"class":1067},[1050,3901,3902],{"class":1052,"line":1207},[1050,3903,1075],{"emptyLinePlaceholder":1074},[1050,3905,3906],{"class":1052,"line":1212},[1050,3907,3908],{"class":1056},"# Copy and install requirements\n",[1050,3910,3911,3913],{"class":1052,"line":1218},[1050,3912,1193],{"class":1063},[1050,3914,1455],{"class":1067},[1050,3916,3917,3919],{"class":1052,"line":1226},[1050,3918,1143],{"class":1063},[1050,3920,1204],{"class":1067},[1050,3922,3923],{"class":1052,"line":1231},[1050,3924,1075],{"emptyLinePlaceholder":1074},[1050,3926,3927],{"class":1052,"line":1237},[1050,3928,3929],{"class":1056},"# Copy application\n",[1050,3931,3932,3934],{"class":1052,"line":1252},[1050,3933,1193],{"class":1063},[1050,3935,3936],{"class":1067}," . .\n",[1050,3938,3939],{"class":1052,"line":1260},[1050,3940,1075],{"emptyLinePlaceholder":1074},[1050,3942,3943],{"class":1052,"line":1268},[1050,3944,3945],{"class":1056},"# Create user and set permissions\n",[1050,3947,3948,3950,3952,3954],{"class":1052,"line":1273},[1050,3949,1143],{"class":1063},[1050,3951,1242],{"class":1067},[1050,3953,1246],{"class":1245},[1050,3955,3529],{"class":1067},[1050,3957,3958],{"class":1052,"line":1279},[1050,3959,3534],{"class":1067},[1050,3961,3962],{"class":1052,"line":1287},[1050,3963,1075],{"emptyLinePlaceholder":1074},[1050,3965,3966,3968],{"class":1052,"line":1292},[1050,3967,1263],{"class":1063},[1050,3969,1249],{"class":1067},[1050,3971,3972],{"class":1052,"line":1298},[1050,3973,1075],{"emptyLinePlaceholder":1074},[1050,3975,3976],{"class":1052,"line":1307},[1050,3977,1276],{"class":1056},[1050,3979,3980,3982],{"class":1052,"line":1312},[1050,3981,1143],{"class":1063},[1050,3983,1284],{"class":1067},[1050,3985,3986],{"class":1052,"line":1318},[1050,3987,1075],{"emptyLinePlaceholder":1074},[1050,3989,3990,3992],{"class":1052,"line":1560},[1050,3991,1301],{"class":1063},[1050,3993,1304],{"class":1067},[1050,3995,3996],{"class":1052,"line":1565},[1050,3997,1075],{"emptyLinePlaceholder":1074},[1050,3999,4000,4002,4004,4006,4008,4010,4012,4014,4016,4018],{"class":1052,"line":1576},[1050,4001,1321],{"class":1063},[1050,4003,1324],{"class":1067},[1050,4005,1327],{"class":1245},[1050,4007,1330],{"class":1067},[1050,4009,1333],{"class":1245},[1050,4011,1330],{"class":1067},[1050,4013,1338],{"class":1245},[1050,4015,1330],{"class":1067},[1050,4017,1343],{"class":1245},[1050,4019,1346],{"class":1067},[1030,4021,4023],{"id":4022},"docker-configuration-files","Docker Configuration Files",[1035,4025,4027],{"id":4026},"nginx-configuration-for-docker","Nginx Configuration for Docker",[1040,4029,4033],{"className":4030,"code":4031,"language":4032,"meta":1045,"style":1045},"language-nginx shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# docker/nginx/default.conf\nupstream django {\n    server web:8000;\n}\n\nserver {\n    listen 80;\n    server_name localhost;\n    \n    # Security headers\n    add_header X-Frame-Options DENY always;\n    add_header X-Content-Type-Options nosniff always;\n    add_header X-XSS-Protection \"1; mode=block\" always;\n    \n    # Static files\n    location /static/ {\n        alias /app/staticfiles/;\n        expires 1y;\n        add_header Cache-Control \"public, immutable\";\n        \n        # Compression\n        gzip on;\n        gzip_types text/css application/javascript image/svg+xml;\n    }\n    \n    # Media files\n    location /media/ {\n        alias /app/media/;\n        expires 30d;\n        add_header Cache-Control \"public\";\n    }\n    \n    # Health check\n    location /health/ {\n        proxy_pass http://django;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        access_log off;\n    }\n    \n    # Main application\n    location / {\n        proxy_pass http://django;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        \n        # Timeouts\n        proxy_connect_timeout 60s;\n        proxy_send_timeout 60s;\n        proxy_read_timeout 60s;\n        \n        # Buffering\n        proxy_buffering on;\n        proxy_buffer_size 4k;\n        proxy_buffers 8 4k;\n    }\n}\n","nginx",[1047,4034,4035,4040,4045,4050,4055,4059,4064,4069,4074,4079,4084,4089,4094,4099,4103,4108,4113,4118,4123,4128,4133,4138,4143,4148,4153,4157,4162,4167,4172,4177,4182,4186,4190,4195,4200,4205,4210,4215,4220,4225,4230,4234,4238,4243,4248,4252,4256,4260,4264,4268,4272,4277,4282,4287,4292,4296,4301,4306,4311,4316,4320],{"__ignoreMap":1045},[1050,4036,4037],{"class":1052,"line":1053},[1050,4038,4039],{},"# docker/nginx/default.conf\n",[1050,4041,4042],{"class":1052,"line":1060},[1050,4043,4044],{},"upstream django {\n",[1050,4046,4047],{"class":1052,"line":1071},[1050,4048,4049],{},"    server web:8000;\n",[1050,4051,4052],{"class":1052,"line":1078},[1050,4053,4054],{},"}\n",[1050,4056,4057],{"class":1052,"line":1084},[1050,4058,1075],{"emptyLinePlaceholder":1074},[1050,4060,4061],{"class":1052,"line":1093},[1050,4062,4063],{},"server {\n",[1050,4065,4066],{"class":1052,"line":1101},[1050,4067,4068],{},"    listen 80;\n",[1050,4070,4071],{"class":1052,"line":1109},[1050,4072,4073],{},"    server_name localhost;\n",[1050,4075,4076],{"class":1052,"line":1114},[1050,4077,4078],{},"    \n",[1050,4080,4081],{"class":1052,"line":1120},[1050,4082,4083],{},"    # Security headers\n",[1050,4085,4086],{"class":1052,"line":1129},[1050,4087,4088],{},"    add_header X-Frame-Options DENY always;\n",[1050,4090,4091],{"class":1052,"line":1134},[1050,4092,4093],{},"    add_header X-Content-Type-Options nosniff always;\n",[1050,4095,4096],{"class":1052,"line":1140},[1050,4097,4098],{},"    add_header X-XSS-Protection \"1; mode=block\" always;\n",[1050,4100,4101],{"class":1052,"line":1149},[1050,4102,4078],{},[1050,4104,4105],{"class":1052,"line":1155},[1050,4106,4107],{},"    # Static files\n",[1050,4109,4110],{"class":1052,"line":1161},[1050,4111,4112],{},"    location /static/ {\n",[1050,4114,4115],{"class":1052,"line":1167},[1050,4116,4117],{},"        alias /app/staticfiles/;\n",[1050,4119,4120],{"class":1052,"line":1173},[1050,4121,4122],{},"        expires 1y;\n",[1050,4124,4125],{"class":1052,"line":1179},[1050,4126,4127],{},"        add_header Cache-Control \"public, immutable\";\n",[1050,4129,4130],{"class":1052,"line":1184},[1050,4131,4132],{},"        \n",[1050,4134,4135],{"class":1052,"line":1190},[1050,4136,4137],{},"        # Compression\n",[1050,4139,4140],{"class":1052,"line":1199},[1050,4141,4142],{},"        gzip on;\n",[1050,4144,4145],{"class":1052,"line":1207},[1050,4146,4147],{},"        gzip_types text/css application/javascript image/svg+xml;\n",[1050,4149,4150],{"class":1052,"line":1212},[1050,4151,4152],{},"    }\n",[1050,4154,4155],{"class":1052,"line":1218},[1050,4156,4078],{},[1050,4158,4159],{"class":1052,"line":1226},[1050,4160,4161],{},"    # Media files\n",[1050,4163,4164],{"class":1052,"line":1231},[1050,4165,4166],{},"    location /media/ {\n",[1050,4168,4169],{"class":1052,"line":1237},[1050,4170,4171],{},"        alias /app/media/;\n",[1050,4173,4174],{"class":1052,"line":1252},[1050,4175,4176],{},"        expires 30d;\n",[1050,4178,4179],{"class":1052,"line":1260},[1050,4180,4181],{},"        add_header Cache-Control \"public\";\n",[1050,4183,4184],{"class":1052,"line":1268},[1050,4185,4152],{},[1050,4187,4188],{"class":1052,"line":1273},[1050,4189,4078],{},[1050,4191,4192],{"class":1052,"line":1279},[1050,4193,4194],{},"    # Health check\n",[1050,4196,4197],{"class":1052,"line":1287},[1050,4198,4199],{},"    location /health/ {\n",[1050,4201,4202],{"class":1052,"line":1292},[1050,4203,4204],{},"        proxy_pass http://django;\n",[1050,4206,4207],{"class":1052,"line":1298},[1050,4208,4209],{},"        proxy_set_header Host $host;\n",[1050,4211,4212],{"class":1052,"line":1307},[1050,4213,4214],{},"        proxy_set_header X-Real-IP $remote_addr;\n",[1050,4216,4217],{"class":1052,"line":1312},[1050,4218,4219],{},"        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n",[1050,4221,4222],{"class":1052,"line":1318},[1050,4223,4224],{},"        proxy_set_header X-Forwarded-Proto $scheme;\n",[1050,4226,4227],{"class":1052,"line":1560},[1050,4228,4229],{},"        access_log off;\n",[1050,4231,4232],{"class":1052,"line":1565},[1050,4233,4152],{},[1050,4235,4236],{"class":1052,"line":1576},[1050,4237,4078],{},[1050,4239,4240],{"class":1052,"line":1581},[1050,4241,4242],{},"    # Main application\n",[1050,4244,4245],{"class":1052,"line":1587},[1050,4246,4247],{},"    location / {\n",[1050,4249,4250],{"class":1052,"line":1595},[1050,4251,4204],{},[1050,4253,4254],{"class":1052,"line":1600},[1050,4255,4209],{},[1050,4257,4258],{"class":1052,"line":1606},[1050,4259,4214],{},[1050,4261,4262],{"class":1052,"line":1614},[1050,4263,4219],{},[1050,4265,4266],{"class":1052,"line":1619},[1050,4267,4224],{},[1050,4269,4270],{"class":1052,"line":1625},[1050,4271,4132],{},[1050,4273,4274],{"class":1052,"line":1633},[1050,4275,4276],{},"        # Timeouts\n",[1050,4278,4279],{"class":1052,"line":1639},[1050,4280,4281],{},"        proxy_connect_timeout 60s;\n",[1050,4283,4284],{"class":1052,"line":1644},[1050,4285,4286],{},"        proxy_send_timeout 60s;\n",[1050,4288,4289],{"class":1052,"line":1650},[1050,4290,4291],{},"        proxy_read_timeout 60s;\n",[1050,4293,4294],{"class":1052,"line":1657},[1050,4295,4132],{},[1050,4297,4298],{"class":1052,"line":1662},[1050,4299,4300],{},"        # Buffering\n",[1050,4302,4303],{"class":1052,"line":1667},[1050,4304,4305],{},"        proxy_buffering on;\n",[1050,4307,4308],{"class":1052,"line":1674},[1050,4309,4310],{},"        proxy_buffer_size 4k;\n",[1050,4312,4313],{"class":1052,"line":1679},[1050,4314,4315],{},"        proxy_buffers 8 4k;\n",[1050,4317,4318],{"class":1052,"line":1685},[1050,4319,4152],{},[1050,4321,4322],{"class":1052,"line":1694},[1050,4323,4054],{},[1035,4325,4327],{"id":4326},"supervisor-configuration","Supervisor Configuration",[1040,4329,4333],{"className":4330,"code":4331,"language":4332,"meta":1045,"style":1045},"language-ini shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# docker/supervisord.conf\n[supervisord]\nnodaemon=true\nuser=root\nlogfile=/var/log/supervisor/supervisord.log\npidfile=/var/run/supervisord.pid\n\n[program:gunicorn]\ncommand=/home/appuser/.local/bin/gunicorn --bind 0.0.0.0:8000 --workers 3 myproject.wsgi:application\ndirectory=/app\nuser=appuser\nautostart=true\nautorestart=true\nredirect_stderr=true\nstdout_logfile=/var/log/django/gunicorn.log\nstdout_logfile_maxbytes=50MB\nstdout_logfile_backups=10\n\n[program:nginx]\ncommand=/usr/sbin/nginx -g \"daemon off;\"\nautostart=true\nautorestart=true\nredirect_stderr=true\nstdout_logfile=/var/log/nginx/nginx.log\nstdout_logfile_maxbytes=50MB\nstdout_logfile_backups=10\n","ini",[1047,4334,4335,4340,4345,4350,4355,4360,4365,4369,4374,4379,4384,4389,4394,4399,4404,4409,4414,4419,4423,4428,4433,4437,4441,4445,4450,4454],{"__ignoreMap":1045},[1050,4336,4337],{"class":1052,"line":1053},[1050,4338,4339],{},"# docker/supervisord.conf\n",[1050,4341,4342],{"class":1052,"line":1060},[1050,4343,4344],{},"[supervisord]\n",[1050,4346,4347],{"class":1052,"line":1071},[1050,4348,4349],{},"nodaemon=true\n",[1050,4351,4352],{"class":1052,"line":1078},[1050,4353,4354],{},"user=root\n",[1050,4356,4357],{"class":1052,"line":1084},[1050,4358,4359],{},"logfile=/var/log/supervisor/supervisord.log\n",[1050,4361,4362],{"class":1052,"line":1093},[1050,4363,4364],{},"pidfile=/var/run/supervisord.pid\n",[1050,4366,4367],{"class":1052,"line":1101},[1050,4368,1075],{"emptyLinePlaceholder":1074},[1050,4370,4371],{"class":1052,"line":1109},[1050,4372,4373],{},"[program:gunicorn]\n",[1050,4375,4376],{"class":1052,"line":1114},[1050,4377,4378],{},"command=/home/appuser/.local/bin/gunicorn --bind 0.0.0.0:8000 --workers 3 myproject.wsgi:application\n",[1050,4380,4381],{"class":1052,"line":1120},[1050,4382,4383],{},"directory=/app\n",[1050,4385,4386],{"class":1052,"line":1129},[1050,4387,4388],{},"user=appuser\n",[1050,4390,4391],{"class":1052,"line":1134},[1050,4392,4393],{},"autostart=true\n",[1050,4395,4396],{"class":1052,"line":1140},[1050,4397,4398],{},"autorestart=true\n",[1050,4400,4401],{"class":1052,"line":1149},[1050,4402,4403],{},"redirect_stderr=true\n",[1050,4405,4406],{"class":1052,"line":1155},[1050,4407,4408],{},"stdout_logfile=/var/log/django/gunicorn.log\n",[1050,4410,4411],{"class":1052,"line":1161},[1050,4412,4413],{},"stdout_logfile_maxbytes=50MB\n",[1050,4415,4416],{"class":1052,"line":1167},[1050,4417,4418],{},"stdout_logfile_backups=10\n",[1050,4420,4421],{"class":1052,"line":1173},[1050,4422,1075],{"emptyLinePlaceholder":1074},[1050,4424,4425],{"class":1052,"line":1179},[1050,4426,4427],{},"[program:nginx]\n",[1050,4429,4430],{"class":1052,"line":1184},[1050,4431,4432],{},"command=/usr/sbin/nginx -g \"daemon off;\"\n",[1050,4434,4435],{"class":1052,"line":1190},[1050,4436,4393],{},[1050,4438,4439],{"class":1052,"line":1199},[1050,4440,4398],{},[1050,4442,4443],{"class":1052,"line":1207},[1050,4444,4403],{},[1050,4446,4447],{"class":1052,"line":1212},[1050,4448,4449],{},"stdout_logfile=/var/log/nginx/nginx.log\n",[1050,4451,4452],{"class":1052,"line":1218},[1050,4453,4413],{},[1050,4455,4456],{"class":1052,"line":1226},[1050,4457,4418],{},[1035,4459,4461],{"id":4460},"environment-configuration","Environment Configuration",[1040,4463,4467],{"className":4464,"code":4465,"language":4466,"meta":1045,"style":1045},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# .env.prod\n# Django\nDJANGO_SETTINGS_MODULE=myproject.settings.production\nSECRET_KEY=your-super-secret-key-here\nDEBUG=False\n\n# Database\nPOSTGRES_DB=django_app\nPOSTGRES_USER=postgres\nPOSTGRES_PASSWORD=secure_password_here\n\n# Redis\nREDIS_PASSWORD=redis_password_here\n\n# Email\nEMAIL_HOST=smtp.mailgun.org\nEMAIL_PORT=587\nEMAIL_USE_TLS=True\nEMAIL_HOST_USER=postmaster@mg.yourdomain.com\nEMAIL_HOST_PASSWORD=your-mailgun-password\n\n# AWS (if using S3)\nAWS_ACCESS_KEY_ID=your-aws-access-key\nAWS_SECRET_ACCESS_KEY=your-aws-secret-key\nAWS_STORAGE_BUCKET_NAME=your-s3-bucket\n\n# Monitoring\nSENTRY_DSN=https://...@sentry.io/...\n","bash",[1047,4468,4469,4474,4479,4491,4501,4511,4515,4520,4530,4540,4550,4554,4559,4569,4573,4578,4588,4598,4608,4618,4628,4632,4637,4647,4657,4667,4671,4676],{"__ignoreMap":1045},[1050,4470,4471],{"class":1052,"line":1053},[1050,4472,4473],{"class":1056},"# .env.prod\n",[1050,4475,4476],{"class":1052,"line":1060},[1050,4477,4478],{"class":1056},"# Django\n",[1050,4480,4481,4485,4488],{"class":1052,"line":1071},[1050,4482,4484],{"class":4483},"sSC40","DJANGO_SETTINGS_MODULE",[1050,4486,4487],{"class":1786},"=",[1050,4489,4490],{"class":1245},"myproject.settings.production\n",[1050,4492,4493,4496,4498],{"class":1052,"line":1078},[1050,4494,4495],{"class":4483},"SECRET_KEY",[1050,4497,4487],{"class":1786},[1050,4499,4500],{"class":1245},"your-super-secret-key-here\n",[1050,4502,4503,4506,4508],{"class":1052,"line":1084},[1050,4504,4505],{"class":4483},"DEBUG",[1050,4507,4487],{"class":1786},[1050,4509,4510],{"class":1245},"False\n",[1050,4512,4513],{"class":1052,"line":1093},[1050,4514,1075],{"emptyLinePlaceholder":1074},[1050,4516,4517],{"class":1052,"line":1101},[1050,4518,4519],{"class":1056},"# Database\n",[1050,4521,4522,4525,4527],{"class":1052,"line":1109},[1050,4523,4524],{"class":4483},"POSTGRES_DB",[1050,4526,4487],{"class":1786},[1050,4528,4529],{"class":1245},"django_app\n",[1050,4531,4532,4535,4537],{"class":1052,"line":1114},[1050,4533,4534],{"class":4483},"POSTGRES_USER",[1050,4536,4487],{"class":1786},[1050,4538,4539],{"class":1245},"postgres\n",[1050,4541,4542,4545,4547],{"class":1052,"line":1120},[1050,4543,4544],{"class":4483},"POSTGRES_PASSWORD",[1050,4546,4487],{"class":1786},[1050,4548,4549],{"class":1245},"secure_password_here\n",[1050,4551,4552],{"class":1052,"line":1129},[1050,4553,1075],{"emptyLinePlaceholder":1074},[1050,4555,4556],{"class":1052,"line":1134},[1050,4557,4558],{"class":1056},"# Redis\n",[1050,4560,4561,4564,4566],{"class":1052,"line":1140},[1050,4562,4563],{"class":4483},"REDIS_PASSWORD",[1050,4565,4487],{"class":1786},[1050,4567,4568],{"class":1245},"redis_password_here\n",[1050,4570,4571],{"class":1052,"line":1149},[1050,4572,1075],{"emptyLinePlaceholder":1074},[1050,4574,4575],{"class":1052,"line":1155},[1050,4576,4577],{"class":1056},"# Email\n",[1050,4579,4580,4583,4585],{"class":1052,"line":1161},[1050,4581,4582],{"class":4483},"EMAIL_HOST",[1050,4584,4487],{"class":1786},[1050,4586,4587],{"class":1245},"smtp.mailgun.org\n",[1050,4589,4590,4593,4595],{"class":1052,"line":1167},[1050,4591,4592],{"class":4483},"EMAIL_PORT",[1050,4594,4487],{"class":1786},[1050,4596,4597],{"class":1245},"587\n",[1050,4599,4600,4603,4605],{"class":1052,"line":1173},[1050,4601,4602],{"class":4483},"EMAIL_USE_TLS",[1050,4604,4487],{"class":1786},[1050,4606,4607],{"class":1245},"True\n",[1050,4609,4610,4613,4615],{"class":1052,"line":1179},[1050,4611,4612],{"class":4483},"EMAIL_HOST_USER",[1050,4614,4487],{"class":1786},[1050,4616,4617],{"class":1245},"postmaster@mg.yourdomain.com\n",[1050,4619,4620,4623,4625],{"class":1052,"line":1184},[1050,4621,4622],{"class":4483},"EMAIL_HOST_PASSWORD",[1050,4624,4487],{"class":1786},[1050,4626,4627],{"class":1245},"your-mailgun-password\n",[1050,4629,4630],{"class":1052,"line":1190},[1050,4631,1075],{"emptyLinePlaceholder":1074},[1050,4633,4634],{"class":1052,"line":1199},[1050,4635,4636],{"class":1056},"# AWS (if using S3)\n",[1050,4638,4639,4642,4644],{"class":1052,"line":1207},[1050,4640,4641],{"class":4483},"AWS_ACCESS_KEY_ID",[1050,4643,4487],{"class":1786},[1050,4645,4646],{"class":1245},"your-aws-access-key\n",[1050,4648,4649,4652,4654],{"class":1052,"line":1212},[1050,4650,4651],{"class":4483},"AWS_SECRET_ACCESS_KEY",[1050,4653,4487],{"class":1786},[1050,4655,4656],{"class":1245},"your-aws-secret-key\n",[1050,4658,4659,4662,4664],{"class":1052,"line":1218},[1050,4660,4661],{"class":4483},"AWS_STORAGE_BUCKET_NAME",[1050,4663,4487],{"class":1786},[1050,4665,4666],{"class":1245},"your-s3-bucket\n",[1050,4668,4669],{"class":1052,"line":1226},[1050,4670,1075],{"emptyLinePlaceholder":1074},[1050,4672,4673],{"class":1052,"line":1231},[1050,4674,4675],{"class":1056},"# Monitoring\n",[1050,4677,4678,4681,4683],{"class":1052,"line":1237},[1050,4679,4680],{"class":4483},"SENTRY_DSN",[1050,4682,4487],{"class":1786},[1050,4684,4685],{"class":1245},"https://...@sentry.io/...\n",[1030,4687,4689],{"id":4688},"container-orchestration","Container Orchestration",[1035,4691,4693],{"id":4692},"docker-swarm-configuration","Docker Swarm Configuration",[1040,4695,4697],{"className":1768,"code":4696,"language":1770,"meta":1045,"style":1045},"# docker-compose.swarm.yml\nversion: '3.8'\n\nservices:\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - static_volume:/app/staticfiles:ro\n      - media_volume:/app/media:ro\n    configs:\n      - source: nginx_config\n        target: /etc/nginx/conf.d/default.conf\n    deploy:\n      replicas: 2\n      placement:\n        constraints:\n          - node.role == manager\n      restart_policy:\n        condition: on-failure\n        delay: 5s\n        max_attempts: 3\n      resources:\n        limits:\n          memory: 128M\n        reservations:\n          memory: 64M\n\n  web:\n    image: myapp:latest\n    environment:\n      - DJANGO_SETTINGS_MODULE=myproject.settings.production\n    secrets:\n      - db_password\n      - secret_key\n    volumes:\n      - static_volume:/app/staticfiles\n      - media_volume:/app/media\n    deploy:\n      replicas: 3\n      update_config:\n        parallelism: 1\n        delay: 10s\n        failure_action: rollback\n        order: start-first\n      restart_policy:\n        condition: on-failure\n        delay: 5s\n        max_attempts: 3\n      resources:\n        limits:\n          memory: 512M\n        reservations:\n          memory: 256M\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:8000/health/\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 40s\n\n  db:\n    image: postgres:13\n    environment:\n      - POSTGRES_DB=django_app\n      - POSTGRES_USER=postgres\n    secrets:\n      - source: db_password\n        target: POSTGRES_PASSWORD\n    volumes:\n      - postgres_data:/var/lib/postgresql/data/\n    deploy:\n      replicas: 1\n      placement:\n        constraints:\n          - node.role == manager\n      restart_policy:\n        condition: on-failure\n      resources:\n        limits:\n          memory: 1G\n        reservations:\n          memory: 512M\n\n  redis:\n    image: redis:7-alpine\n    command: redis-server --appendonly yes\n    volumes:\n      - redis_data:/data\n    deploy:\n      replicas: 1\n      placement:\n        constraints:\n          - node.role == manager\n      restart_policy:\n        condition: on-failure\n      resources:\n        limits:\n          memory: 256M\n        reservations:\n          memory: 128M\n\nvolumes:\n  postgres_data:\n    driver: local\n  redis_data:\n    driver: local\n  static_volume:\n    driver: local\n  media_volume:\n    driver: local\n\nconfigs:\n  nginx_config:\n    file: ./docker/nginx/default.conf\n\nsecrets:\n  db_password:\n    external: true\n  secret_key:\n    external: true\n\nnetworks:\n  default:\n    driver: overlay\n    attachable: true\n",[1047,4698,4699,4704,4716,4720,4726,4732,4740,4746,4756,4766,4772,4778,4784,4791,4803,4813,4819,4827,4834,4841,4849,4856,4866,4876,4885,4891,4897,4905,4911,4920,4924,4930,4939,4945,4951,4958,4965,4972,4978,4984,4990,4996,5004,5011,5021,5030,5040,5050,5056,5064,5072,5080,5086,5092,5100,5106,5114,5121,5167,5177,5186,5195,5205,5209,5215,5223,5229,5235,5241,5247,5257,5266,5272,5278,5284,5292,5298,5304,5310,5316,5324,5330,5336,5344,5350,5358,5362,5368,5376,5385,5391,5397,5403,5411,5417,5423,5429,5435,5443,5449,5455,5463,5469,5477,5481,5487,5493,5502,5508,5516,5522,5530,5536,5544,5548,5555,5562,5572,5576,5583,5590,5601,5608,5616,5620,5626,5632,5641],{"__ignoreMap":1045},[1050,4700,4701],{"class":1052,"line":1053},[1050,4702,4703],{"class":1056},"# docker-compose.swarm.yml\n",[1050,4705,4706,4708,4710,4712,4714],{"class":1052,"line":1060},[1050,4707,1783],{"class":1782},[1050,4709,1787],{"class":1786},[1050,4711,1791],{"class":1790},[1050,4713,1794],{"class":1245},[1050,4715,1797],{"class":1790},[1050,4717,4718],{"class":1052,"line":1071},[1050,4719,1075],{"emptyLinePlaceholder":1074},[1050,4721,4722,4724],{"class":1052,"line":1078},[1050,4723,1806],{"class":1782},[1050,4725,1809],{"class":1786},[1050,4727,4728,4730],{"class":1052,"line":1084},[1050,4729,2308],{"class":1782},[1050,4731,1809],{"class":1786},[1050,4733,4734,4736,4738],{"class":1052,"line":1093},[1050,4735,1958],{"class":1782},[1050,4737,1787],{"class":1786},[1050,4739,2319],{"class":1245},[1050,4741,4742,4744],{"class":1052,"line":1101},[1050,4743,1832],{"class":1782},[1050,4745,1809],{"class":1786},[1050,4747,4748,4750,4752,4754],{"class":1052,"line":1109},[1050,4749,1839],{"class":1786},[1050,4751,1842],{"class":1790},[1050,4753,2334],{"class":1245},[1050,4755,1848],{"class":1790},[1050,4757,4758,4760,4762,4764],{"class":1052,"line":1114},[1050,4759,1839],{"class":1786},[1050,4761,1842],{"class":1790},[1050,4763,2345],{"class":1245},[1050,4765,1848],{"class":1790},[1050,4767,4768,4770],{"class":1052,"line":1120},[1050,4769,1853],{"class":1782},[1050,4771,1809],{"class":1786},[1050,4773,4774,4776],{"class":1052,"line":1129},[1050,4775,1839],{"class":1786},[1050,4777,2360],{"class":1245},[1050,4779,4780,4782],{"class":1052,"line":1134},[1050,4781,1839],{"class":1786},[1050,4783,2367],{"class":1245},[1050,4785,4786,4789],{"class":1052,"line":1140},[1050,4787,4788],{"class":1782},"    configs",[1050,4790,1809],{"class":1786},[1050,4792,4793,4795,4798,4800],{"class":1052,"line":1149},[1050,4794,1839],{"class":1786},[1050,4796,4797],{"class":1782}," source",[1050,4799,1787],{"class":1786},[1050,4801,4802],{"class":1245}," nginx_config\n",[1050,4804,4805,4808,4810],{"class":1052,"line":1155},[1050,4806,4807],{"class":1782},"        target",[1050,4809,1787],{"class":1786},[1050,4811,4812],{"class":1245}," /etc/nginx/conf.d/default.conf\n",[1050,4814,4815,4817],{"class":1052,"line":1161},[1050,4816,2520],{"class":1782},[1050,4818,1809],{"class":1786},[1050,4820,4821,4823,4825],{"class":1052,"line":1167},[1050,4822,2527],{"class":1782},[1050,4824,1787],{"class":1786},[1050,4826,2919],{"class":1826},[1050,4828,4829,4832],{"class":1052,"line":1173},[1050,4830,4831],{"class":1782},"      placement",[1050,4833,1809],{"class":1786},[1050,4835,4836,4839],{"class":1052,"line":1179},[1050,4837,4838],{"class":1782},"        constraints",[1050,4840,1809],{"class":1786},[1050,4842,4843,4846],{"class":1052,"line":1184},[1050,4844,4845],{"class":1786},"          -",[1050,4847,4848],{"class":1245}," node.role == manager\n",[1050,4850,4851,4854],{"class":1052,"line":1190},[1050,4852,4853],{"class":1782},"      restart_policy",[1050,4855,1809],{"class":1786},[1050,4857,4858,4861,4863],{"class":1052,"line":1199},[1050,4859,4860],{"class":1782},"        condition",[1050,4862,1787],{"class":1786},[1050,4864,4865],{"class":1245}," on-failure\n",[1050,4867,4868,4871,4873],{"class":1052,"line":1207},[1050,4869,4870],{"class":1782},"        delay",[1050,4872,1787],{"class":1786},[1050,4874,4875],{"class":1245}," 5s\n",[1050,4877,4878,4881,4883],{"class":1052,"line":1212},[1050,4879,4880],{"class":1782},"        max_attempts",[1050,4882,1787],{"class":1786},[1050,4884,2532],{"class":1826},[1050,4886,4887,4889],{"class":1052,"line":1218},[1050,4888,2537],{"class":1782},[1050,4890,1809],{"class":1786},[1050,4892,4893,4895],{"class":1052,"line":1226},[1050,4894,2544],{"class":1782},[1050,4896,1809],{"class":1786},[1050,4898,4899,4901,4903],{"class":1052,"line":1231},[1050,4900,2551],{"class":1782},[1050,4902,1787],{"class":1786},[1050,4904,2775],{"class":1245},[1050,4906,4907,4909],{"class":1052,"line":1237},[1050,4908,2561],{"class":1782},[1050,4910,1809],{"class":1786},[1050,4912,4913,4915,4917],{"class":1052,"line":1252},[1050,4914,2551],{"class":1782},[1050,4916,1787],{"class":1786},[1050,4918,4919],{"class":1245}," 64M\n",[1050,4921,4922],{"class":1052,"line":1260},[1050,4923,1075],{"emptyLinePlaceholder":1074},[1050,4925,4926,4928],{"class":1052,"line":1268},[1050,4927,1814],{"class":1782},[1050,4929,1809],{"class":1786},[1050,4931,4932,4934,4936],{"class":1052,"line":1273},[1050,4933,1958],{"class":1782},[1050,4935,1787],{"class":1786},[1050,4937,4938],{"class":1245}," myapp:latest\n",[1050,4940,4941,4943],{"class":1052,"line":1279},[1050,4942,1881],{"class":1782},[1050,4944,1809],{"class":1786},[1050,4946,4947,4949],{"class":1052,"line":1287},[1050,4948,1839],{"class":1786},[1050,4950,1106],{"class":1245},[1050,4952,4953,4956],{"class":1052,"line":1292},[1050,4954,4955],{"class":1782},"    secrets",[1050,4957,1809],{"class":1786},[1050,4959,4960,4962],{"class":1052,"line":1298},[1050,4961,1839],{"class":1786},[1050,4963,4964],{"class":1245}," db_password\n",[1050,4966,4967,4969],{"class":1052,"line":1307},[1050,4968,1839],{"class":1786},[1050,4970,4971],{"class":1245}," secret_key\n",[1050,4973,4974,4976],{"class":1052,"line":1312},[1050,4975,1853],{"class":1782},[1050,4977,1809],{"class":1786},[1050,4979,4980,4982],{"class":1052,"line":1318},[1050,4981,1839],{"class":1786},[1050,4983,1869],{"class":1245},[1050,4985,4986,4988],{"class":1052,"line":1560},[1050,4987,1839],{"class":1786},[1050,4989,1876],{"class":1245},[1050,4991,4992,4994],{"class":1052,"line":1565},[1050,4993,2520],{"class":1782},[1050,4995,1809],{"class":1786},[1050,4997,4998,5000,5002],{"class":1052,"line":1576},[1050,4999,2527],{"class":1782},[1050,5001,1787],{"class":1786},[1050,5003,2532],{"class":1826},[1050,5005,5006,5009],{"class":1052,"line":1581},[1050,5007,5008],{"class":1782},"      update_config",[1050,5010,1809],{"class":1786},[1050,5012,5013,5016,5018],{"class":1052,"line":1587},[1050,5014,5015],{"class":1782},"        parallelism",[1050,5017,1787],{"class":1786},[1050,5019,5020],{"class":1826}," 1\n",[1050,5022,5023,5025,5027],{"class":1052,"line":1595},[1050,5024,4870],{"class":1782},[1050,5026,1787],{"class":1786},[1050,5028,5029],{"class":1245}," 10s\n",[1050,5031,5032,5035,5037],{"class":1052,"line":1600},[1050,5033,5034],{"class":1782},"        failure_action",[1050,5036,1787],{"class":1786},[1050,5038,5039],{"class":1245}," rollback\n",[1050,5041,5042,5045,5047],{"class":1052,"line":1606},[1050,5043,5044],{"class":1782},"        order",[1050,5046,1787],{"class":1786},[1050,5048,5049],{"class":1245}," start-first\n",[1050,5051,5052,5054],{"class":1052,"line":1614},[1050,5053,4853],{"class":1782},[1050,5055,1809],{"class":1786},[1050,5057,5058,5060,5062],{"class":1052,"line":1619},[1050,5059,4860],{"class":1782},[1050,5061,1787],{"class":1786},[1050,5063,4865],{"class":1245},[1050,5065,5066,5068,5070],{"class":1052,"line":1625},[1050,5067,4870],{"class":1782},[1050,5069,1787],{"class":1786},[1050,5071,4875],{"class":1245},[1050,5073,5074,5076,5078],{"class":1052,"line":1633},[1050,5075,4880],{"class":1782},[1050,5077,1787],{"class":1786},[1050,5079,2532],{"class":1826},[1050,5081,5082,5084],{"class":1052,"line":1639},[1050,5083,2537],{"class":1782},[1050,5085,1809],{"class":1786},[1050,5087,5088,5090],{"class":1052,"line":1644},[1050,5089,2544],{"class":1782},[1050,5091,1809],{"class":1786},[1050,5093,5094,5096,5098],{"class":1052,"line":1650},[1050,5095,2551],{"class":1782},[1050,5097,1787],{"class":1786},[1050,5099,2556],{"class":1245},[1050,5101,5102,5104],{"class":1052,"line":1657},[1050,5103,2561],{"class":1782},[1050,5105,1809],{"class":1786},[1050,5107,5108,5110,5112],{"class":1052,"line":1662},[1050,5109,2551],{"class":1782},[1050,5111,1787],{"class":1786},[1050,5113,2572],{"class":1245},[1050,5115,5116,5119],{"class":1052,"line":1667},[1050,5117,5118],{"class":1782},"    healthcheck",[1050,5120,1809],{"class":1786},[1050,5122,5123,5126,5128,5130,5133,5135,5137,5140,5142,5145,5147,5149,5151,5154,5156,5158,5160,5163,5165],{"class":1052,"line":1674},[1050,5124,5125],{"class":1782},"      test",[1050,5127,1787],{"class":1786},[1050,5129,1324],{"class":1786},[1050,5131,5132],{"class":1790},"\"",[1050,5134,1321],{"class":1245},[1050,5136,5132],{"class":1790},[1050,5138,5139],{"class":1786},",",[1050,5141,1842],{"class":1790},[1050,5143,5144],{"class":1245},"curl",[1050,5146,5132],{"class":1790},[1050,5148,5139],{"class":1786},[1050,5150,1842],{"class":1790},[1050,5152,5153],{"class":1245},"-f",[1050,5155,5132],{"class":1790},[1050,5157,5139],{"class":1786},[1050,5159,1842],{"class":1790},[1050,5161,5162],{"class":1245},"http://localhost:8000/health/",[1050,5164,5132],{"class":1790},[1050,5166,1346],{"class":1786},[1050,5168,5169,5172,5174],{"class":1052,"line":1679},[1050,5170,5171],{"class":1782},"      interval",[1050,5173,1787],{"class":1786},[1050,5175,5176],{"class":1245}," 30s\n",[1050,5178,5179,5182,5184],{"class":1052,"line":1685},[1050,5180,5181],{"class":1782},"      timeout",[1050,5183,1787],{"class":1786},[1050,5185,5029],{"class":1245},[1050,5187,5188,5191,5193],{"class":1052,"line":1694},[1050,5189,5190],{"class":1782},"      retries",[1050,5192,1787],{"class":1786},[1050,5194,2532],{"class":1826},[1050,5196,5197,5200,5202],{"class":1052,"line":1703},[1050,5198,5199],{"class":1782},"      start_period",[1050,5201,1787],{"class":1786},[1050,5203,5204],{"class":1245}," 40s\n",[1050,5206,5207],{"class":1052,"line":1708},[1050,5208,1075],{"emptyLinePlaceholder":1074},[1050,5210,5211,5213],{"class":1052,"line":1715},[1050,5212,1951],{"class":1782},[1050,5214,1809],{"class":1786},[1050,5216,5217,5219,5221],{"class":1052,"line":1720},[1050,5218,1958],{"class":1782},[1050,5220,1787],{"class":1786},[1050,5222,1963],{"class":1245},[1050,5224,5225,5227],{"class":1052,"line":1726},[1050,5226,1881],{"class":1782},[1050,5228,1809],{"class":1786},[1050,5230,5231,5233],{"class":1052,"line":1734},[1050,5232,1839],{"class":1786},[1050,5234,1989],{"class":1245},[1050,5236,5237,5239],{"class":1052,"line":1742},[1050,5238,1839],{"class":1786},[1050,5240,1996],{"class":1245},[1050,5242,5243,5245],{"class":1052,"line":2254},[1050,5244,4955],{"class":1782},[1050,5246,1809],{"class":1786},[1050,5248,5249,5251,5253,5255],{"class":1052,"line":2262},[1050,5250,1839],{"class":1786},[1050,5252,4797],{"class":1782},[1050,5254,1787],{"class":1786},[1050,5256,4964],{"class":1245},[1050,5258,5259,5261,5263],{"class":1052,"line":2768},[1050,5260,4807],{"class":1782},[1050,5262,1787],{"class":1786},[1050,5264,5265],{"class":1245}," POSTGRES_PASSWORD\n",[1050,5267,5268,5270],{"class":1052,"line":2778},[1050,5269,1853],{"class":1782},[1050,5271,1809],{"class":1786},[1050,5273,5274,5276],{"class":1052,"line":2783},[1050,5275,1839],{"class":1786},[1050,5277,1976],{"class":1245},[1050,5279,5280,5282],{"class":1052,"line":2790},[1050,5281,2520],{"class":1782},[1050,5283,1809],{"class":1786},[1050,5285,5286,5288,5290],{"class":1052,"line":2797},[1050,5287,2527],{"class":1782},[1050,5289,1787],{"class":1786},[1050,5291,5020],{"class":1826},[1050,5293,5294,5296],{"class":1052,"line":2806},[1050,5295,4831],{"class":1782},[1050,5297,1809],{"class":1786},[1050,5299,5300,5302],{"class":1052,"line":2815},[1050,5301,4838],{"class":1782},[1050,5303,1809],{"class":1786},[1050,5305,5306,5308],{"class":1052,"line":2825},[1050,5307,4845],{"class":1786},[1050,5309,4848],{"class":1245},[1050,5311,5312,5314],{"class":1052,"line":2832},[1050,5313,4853],{"class":1782},[1050,5315,1809],{"class":1786},[1050,5317,5318,5320,5322],{"class":1052,"line":2839},[1050,5319,4860],{"class":1782},[1050,5321,1787],{"class":1786},[1050,5323,4865],{"class":1245},[1050,5325,5326,5328],{"class":1052,"line":2846},[1050,5327,2537],{"class":1782},[1050,5329,1809],{"class":1786},[1050,5331,5332,5334],{"class":1052,"line":2853},[1050,5333,2544],{"class":1782},[1050,5335,1809],{"class":1786},[1050,5337,5338,5340,5342],{"class":1052,"line":2860},[1050,5339,2551],{"class":1782},[1050,5341,1787],{"class":1786},[1050,5343,2671],{"class":1245},[1050,5345,5346,5348],{"class":1052,"line":2868},[1050,5347,2561],{"class":1782},[1050,5349,1809],{"class":1786},[1050,5351,5352,5354,5356],{"class":1052,"line":2875},[1050,5353,2551],{"class":1782},[1050,5355,1787],{"class":1786},[1050,5357,2556],{"class":1245},[1050,5359,5360],{"class":1052,"line":2882},[1050,5361,1075],{"emptyLinePlaceholder":1074},[1050,5363,5364,5366],{"class":1052,"line":2889},[1050,5365,2029],{"class":1782},[1050,5367,1809],{"class":1786},[1050,5369,5370,5372,5374],{"class":1052,"line":2896},[1050,5371,1958],{"class":1782},[1050,5373,1787],{"class":1786},[1050,5375,2040],{"class":1245},[1050,5377,5378,5380,5382],{"class":1052,"line":2905},[1050,5379,1937],{"class":1782},[1050,5381,1787],{"class":1786},[1050,5383,5384],{"class":1245}," redis-server --appendonly yes\n",[1050,5386,5387,5389],{"class":1052,"line":2912},[1050,5388,1853],{"class":1782},[1050,5390,1809],{"class":1786},[1050,5392,5393,5395],{"class":1052,"line":2922},[1050,5394,1839],{"class":1786},[1050,5396,2725],{"class":1245},[1050,5398,5399,5401],{"class":1052,"line":2929},[1050,5400,2520],{"class":1782},[1050,5402,1809],{"class":1786},[1050,5404,5405,5407,5409],{"class":1052,"line":2936},[1050,5406,2527],{"class":1782},[1050,5408,1787],{"class":1786},[1050,5410,5020],{"class":1826},[1050,5412,5413,5415],{"class":1052,"line":2945},[1050,5414,4831],{"class":1782},[1050,5416,1809],{"class":1786},[1050,5418,5419,5421],{"class":1052,"line":2952},[1050,5420,4838],{"class":1782},[1050,5422,1809],{"class":1786},[1050,5424,5425,5427],{"class":1052,"line":2961},[1050,5426,4845],{"class":1786},[1050,5428,4848],{"class":1245},[1050,5430,5431,5433],{"class":1052,"line":2966},[1050,5432,4853],{"class":1782},[1050,5434,1809],{"class":1786},[1050,5436,5437,5439,5441],{"class":1052,"line":2973},[1050,5438,4860],{"class":1782},[1050,5440,1787],{"class":1786},[1050,5442,4865],{"class":1245},[1050,5444,5445,5447],{"class":1052,"line":2980},[1050,5446,2537],{"class":1782},[1050,5448,1809],{"class":1786},[1050,5450,5451,5453],{"class":1052,"line":2989},[1050,5452,2544],{"class":1782},[1050,5454,1809],{"class":1786},[1050,5456,5457,5459,5461],{"class":1052,"line":2998},[1050,5458,2551],{"class":1782},[1050,5460,1787],{"class":1786},[1050,5462,2572],{"class":1245},[1050,5464,5465,5467],{"class":1052,"line":3007},[1050,5466,2561],{"class":1782},[1050,5468,1809],{"class":1786},[1050,5470,5471,5473,5475],{"class":1052,"line":3014},[1050,5472,2551],{"class":1782},[1050,5474,1787],{"class":1786},[1050,5476,2775],{"class":1245},[1050,5478,5479],{"class":1052,"line":3021},[1050,5480,1075],{"emptyLinePlaceholder":1074},[1050,5482,5483,5485],{"class":1052,"line":3028},[1050,5484,2242],{"class":1782},[1050,5486,1809],{"class":1786},[1050,5488,5489,5491],{"class":1052,"line":3035},[1050,5490,2249],{"class":1782},[1050,5492,1809],{"class":1786},[1050,5494,5495,5497,5499],{"class":1052,"line":3042},[1050,5496,3334],{"class":1782},[1050,5498,1787],{"class":1786},[1050,5500,5501],{"class":1245}," local\n",[1050,5503,5504,5506],{"class":1052,"line":3049},[1050,5505,3283],{"class":1782},[1050,5507,1809],{"class":1786},[1050,5509,5510,5512,5514],{"class":1052,"line":3056},[1050,5511,3334],{"class":1782},[1050,5513,1787],{"class":1786},[1050,5515,5501],{"class":1245},[1050,5517,5518,5520],{"class":1052,"line":3063},[1050,5519,2257],{"class":1782},[1050,5521,1809],{"class":1786},[1050,5523,5524,5526,5528],{"class":1052,"line":3070},[1050,5525,3334],{"class":1782},[1050,5527,1787],{"class":1786},[1050,5529,5501],{"class":1245},[1050,5531,5532,5534],{"class":1052,"line":3077},[1050,5533,2265],{"class":1782},[1050,5535,1809],{"class":1786},[1050,5537,5538,5540,5542],{"class":1052,"line":3086},[1050,5539,3334],{"class":1782},[1050,5541,1787],{"class":1786},[1050,5543,5501],{"class":1245},[1050,5545,5546],{"class":1052,"line":3093},[1050,5547,1075],{"emptyLinePlaceholder":1074},[1050,5549,5550,5553],{"class":1052,"line":3100},[1050,5551,5552],{"class":1782},"configs",[1050,5554,1809],{"class":1786},[1050,5556,5557,5560],{"class":1052,"line":3107},[1050,5558,5559],{"class":1782},"  nginx_config",[1050,5561,1809],{"class":1786},[1050,5563,5564,5567,5569],{"class":1052,"line":3116},[1050,5565,5566],{"class":1782},"    file",[1050,5568,1787],{"class":1786},[1050,5570,5571],{"class":1245}," ./docker/nginx/default.conf\n",[1050,5573,5574],{"class":1052,"line":3123},[1050,5575,1075],{"emptyLinePlaceholder":1074},[1050,5577,5578,5581],{"class":1052,"line":3132},[1050,5579,5580],{"class":1782},"secrets",[1050,5582,1809],{"class":1786},[1050,5584,5585,5588],{"class":1052,"line":3137},[1050,5586,5587],{"class":1782},"  db_password",[1050,5589,1809],{"class":1786},[1050,5591,5592,5595,5597],{"class":1052,"line":3145},[1050,5593,5594],{"class":1782},"    external",[1050,5596,1787],{"class":1786},[1050,5598,5600],{"class":5599},"sq3J1"," true\n",[1050,5602,5603,5606],{"class":1052,"line":3155},[1050,5604,5605],{"class":1782},"  secret_key",[1050,5607,1809],{"class":1786},[1050,5609,5610,5612,5614],{"class":1052,"line":3162},[1050,5611,5594],{"class":1782},[1050,5613,1787],{"class":1786},[1050,5615,5600],{"class":5599},[1050,5617,5618],{"class":1052,"line":3174},[1050,5619,1075],{"emptyLinePlaceholder":1074},[1050,5621,5622,5624],{"class":1052,"line":3181},[1050,5623,3318],{"class":1782},[1050,5625,1809],{"class":1786},[1050,5627,5628,5630],{"class":1052,"line":3189},[1050,5629,3326],{"class":1782},[1050,5631,1809],{"class":1786},[1050,5633,5634,5636,5638],{"class":1052,"line":3197},[1050,5635,3334],{"class":1782},[1050,5637,1787],{"class":1786},[1050,5639,5640],{"class":1245}," overlay\n",[1050,5642,5643,5646,5648],{"class":1052,"line":3204},[1050,5644,5645],{"class":1782},"    attachable",[1050,5647,1787],{"class":1786},[1050,5649,5600],{"class":5599},[1035,5651,5653],{"id":5652},"kubernetes-deployment","Kubernetes Deployment",[1040,5655,5657],{"className":1768,"code":5656,"language":1770,"meta":1045,"style":1045},"# k8s/namespace.yaml\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: django-app\n\n---\n# k8s/configmap.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: django-config\n  namespace: django-app\ndata:\n  DJANGO_SETTINGS_MODULE: \"myproject.settings.production\"\n  DEBUG: \"False\"\n  DATABASE_URL: \"postgresql://postgres:password@postgres:5432/django_app\"\n  REDIS_URL: \"redis://redis:6379/1\"\n\n---\n# k8s/secret.yaml\napiVersion: v1\nkind: Secret\nmetadata:\n  name: django-secrets\n  namespace: django-app\ntype: Opaque\ndata:\n  SECRET_KEY: \u003Cbase64-encoded-secret-key>\n  DB_PASSWORD: \u003Cbase64-encoded-db-password>\n\n---\n# k8s/deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: django-app\n  namespace: 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: myapp:latest\n        ports:\n        - containerPort: 8000\n        envFrom:\n        - configMapRef:\n            name: django-config\n        - secretRef:\n            name: django-secrets\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          timeoutSeconds: 5\n          failureThreshold: 3\n        readinessProbe:\n          httpGet:\n            path: /ready/\n            port: 8000\n          initialDelaySeconds: 5\n          periodSeconds: 5\n          timeoutSeconds: 3\n          failureThreshold: 3\n        volumeMounts:\n        - name: static-volume\n          mountPath: /app/staticfiles\n        - name: media-volume\n          mountPath: /app/media\n      volumes:\n      - name: static-volume\n        persistentVolumeClaim:\n          claimName: static-pvc\n      - name: media-volume\n        persistentVolumeClaim:\n          claimName: media-pvc\n\n---\n# k8s/service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: django-service\n  namespace: django-app\nspec:\n  selector:\n    app: django-app\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 8000\n  type: ClusterIP\n\n---\n# k8s/ingress.yaml\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n  name: django-ingress\n  namespace: django-app\n  annotations:\n    kubernetes.io/ingress.class: nginx\n    cert-manager.io/cluster-issuer: letsencrypt-prod\n    nginx.ingress.kubernetes.io/rate-limit: \"100\"\nspec:\n  tls:\n  - hosts:\n    - yourdomain.com\n    secretName: django-tls\n  rules:\n  - host: yourdomain.com\n    http:\n      paths:\n      - path: /\n        pathType: Prefix\n        backend:\n          service:\n            name: django-service\n            port:\n              number: 80\n\n---\n# k8s/hpa.yaml\napiVersion: autoscaling/v2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: django-hpa\n  namespace: django-app\nspec:\n  scaleTargetRef:\n    apiVersion: apps/v1\n    kind: Deployment\n    name: django-app\n  minReplicas: 3\n  maxReplicas: 10\n  metrics:\n  - type: Resource\n    resource:\n      name: cpu\n      target:\n        type: Utilization\n        averageUtilization: 70\n  - type: Resource\n    resource:\n      name: memory\n      target:\n        type: Utilization\n        averageUtilization: 80\n",[1047,5658,5659,5664,5674,5684,5691,5701,5705,5711,5716,5724,5733,5739,5748,5757,5764,5778,5792,5806,5820,5824,5828,5833,5841,5850,5856,5865,5873,5883,5889,5899,5909,5913,5917,5922,5931,5940,5946,5954,5962,5969,5978,5985,5992,6001,6008,6015,6022,6031,6038,6045,6057,6066,6073,6085,6092,6101,6110,6119,6127,6134,6141,6155,6169,6176,6189,6202,6209,6216,6226,6235,6245,6255,6265,6274,6281,6287,6296,6304,6312,6320,6328,6336,6343,6354,6364,6375,6384,6391,6401,6408,6418,6428,6434,6443,6447,6451,6456,6464,6473,6479,6488,6496,6502,6508,6517,6524,6537,6547,6556,6566,6570,6574,6579,6588,6597,6603,6612,6620,6627,6637,6647,6661,6667,6674,6683,6691,6701,6708,6719,6726,6733,6745,6755,6762,6769,6777,6783,6792,6796,6800,6805,6814,6823,6829,6839,6848,6855,6863,6873,6883,6893,6903,6913,6921,6934,6942,6953,6961,6972,6983,6994,7001,7011,7018,7027],{"__ignoreMap":1045},[1050,5660,5661],{"class":1052,"line":1053},[1050,5662,5663],{"class":1056},"# k8s/namespace.yaml\n",[1050,5665,5666,5669,5671],{"class":1052,"line":1060},[1050,5667,5668],{"class":1782},"apiVersion",[1050,5670,1787],{"class":1786},[1050,5672,5673],{"class":1245}," v1\n",[1050,5675,5676,5679,5681],{"class":1052,"line":1071},[1050,5677,5678],{"class":1782},"kind",[1050,5680,1787],{"class":1786},[1050,5682,5683],{"class":1245}," Namespace\n",[1050,5685,5686,5689],{"class":1052,"line":1078},[1050,5687,5688],{"class":1782},"metadata",[1050,5690,1809],{"class":1786},[1050,5692,5693,5696,5698],{"class":1052,"line":1084},[1050,5694,5695],{"class":1782},"  name",[1050,5697,1787],{"class":1786},[1050,5699,5700],{"class":1245}," django-app\n",[1050,5702,5703],{"class":1052,"line":1093},[1050,5704,1075],{"emptyLinePlaceholder":1074},[1050,5706,5707],{"class":1052,"line":1101},[1050,5708,5710],{"class":5709},"sYn-s","---\n",[1050,5712,5713],{"class":1052,"line":1109},[1050,5714,5715],{"class":1056},"# k8s/configmap.yaml\n",[1050,5717,5718,5720,5722],{"class":1052,"line":1114},[1050,5719,5668],{"class":1782},[1050,5721,1787],{"class":1786},[1050,5723,5673],{"class":1245},[1050,5725,5726,5728,5730],{"class":1052,"line":1120},[1050,5727,5678],{"class":1782},[1050,5729,1787],{"class":1786},[1050,5731,5732],{"class":1245}," ConfigMap\n",[1050,5734,5735,5737],{"class":1052,"line":1129},[1050,5736,5688],{"class":1782},[1050,5738,1809],{"class":1786},[1050,5740,5741,5743,5745],{"class":1052,"line":1134},[1050,5742,5695],{"class":1782},[1050,5744,1787],{"class":1786},[1050,5746,5747],{"class":1245}," django-config\n",[1050,5749,5750,5753,5755],{"class":1052,"line":1140},[1050,5751,5752],{"class":1782},"  namespace",[1050,5754,1787],{"class":1786},[1050,5756,5700],{"class":1245},[1050,5758,5759,5762],{"class":1052,"line":1149},[1050,5760,5761],{"class":1782},"data",[1050,5763,1809],{"class":1786},[1050,5765,5766,5769,5771,5773,5776],{"class":1052,"line":1155},[1050,5767,5768],{"class":1782},"  DJANGO_SETTINGS_MODULE",[1050,5770,1787],{"class":1786},[1050,5772,1842],{"class":1790},[1050,5774,5775],{"class":1245},"myproject.settings.production",[1050,5777,1848],{"class":1790},[1050,5779,5780,5783,5785,5787,5790],{"class":1052,"line":1161},[1050,5781,5782],{"class":1782},"  DEBUG",[1050,5784,1787],{"class":1786},[1050,5786,1842],{"class":1790},[1050,5788,5789],{"class":1245},"False",[1050,5791,1848],{"class":1790},[1050,5793,5794,5797,5799,5801,5804],{"class":1052,"line":1167},[1050,5795,5796],{"class":1782},"  DATABASE_URL",[1050,5798,1787],{"class":1786},[1050,5800,1842],{"class":1790},[1050,5802,5803],{"class":1245},"postgresql://postgres:password@postgres:5432/django_app",[1050,5805,1848],{"class":1790},[1050,5807,5808,5811,5813,5815,5818],{"class":1052,"line":1173},[1050,5809,5810],{"class":1782},"  REDIS_URL",[1050,5812,1787],{"class":1786},[1050,5814,1842],{"class":1790},[1050,5816,5817],{"class":1245},"redis://redis:6379/1",[1050,5819,1848],{"class":1790},[1050,5821,5822],{"class":1052,"line":1179},[1050,5823,1075],{"emptyLinePlaceholder":1074},[1050,5825,5826],{"class":1052,"line":1184},[1050,5827,5710],{"class":5709},[1050,5829,5830],{"class":1052,"line":1190},[1050,5831,5832],{"class":1056},"# k8s/secret.yaml\n",[1050,5834,5835,5837,5839],{"class":1052,"line":1199},[1050,5836,5668],{"class":1782},[1050,5838,1787],{"class":1786},[1050,5840,5673],{"class":1245},[1050,5842,5843,5845,5847],{"class":1052,"line":1207},[1050,5844,5678],{"class":1782},[1050,5846,1787],{"class":1786},[1050,5848,5849],{"class":1245}," Secret\n",[1050,5851,5852,5854],{"class":1052,"line":1212},[1050,5853,5688],{"class":1782},[1050,5855,1809],{"class":1786},[1050,5857,5858,5860,5862],{"class":1052,"line":1218},[1050,5859,5695],{"class":1782},[1050,5861,1787],{"class":1786},[1050,5863,5864],{"class":1245}," django-secrets\n",[1050,5866,5867,5869,5871],{"class":1052,"line":1226},[1050,5868,5752],{"class":1782},[1050,5870,1787],{"class":1786},[1050,5872,5700],{"class":1245},[1050,5874,5875,5878,5880],{"class":1052,"line":1231},[1050,5876,5877],{"class":1782},"type",[1050,5879,1787],{"class":1786},[1050,5881,5882],{"class":1245}," Opaque\n",[1050,5884,5885,5887],{"class":1052,"line":1237},[1050,5886,5761],{"class":1782},[1050,5888,1809],{"class":1786},[1050,5890,5891,5894,5896],{"class":1052,"line":1252},[1050,5892,5893],{"class":1782},"  SECRET_KEY",[1050,5895,1787],{"class":1786},[1050,5897,5898],{"class":1245}," \u003Cbase64-encoded-secret-key>\n",[1050,5900,5901,5904,5906],{"class":1052,"line":1260},[1050,5902,5903],{"class":1782},"  DB_PASSWORD",[1050,5905,1787],{"class":1786},[1050,5907,5908],{"class":1245}," \u003Cbase64-encoded-db-password>\n",[1050,5910,5911],{"class":1052,"line":1268},[1050,5912,1075],{"emptyLinePlaceholder":1074},[1050,5914,5915],{"class":1052,"line":1273},[1050,5916,5710],{"class":5709},[1050,5918,5919],{"class":1052,"line":1279},[1050,5920,5921],{"class":1056},"# k8s/deployment.yaml\n",[1050,5923,5924,5926,5928],{"class":1052,"line":1287},[1050,5925,5668],{"class":1782},[1050,5927,1787],{"class":1786},[1050,5929,5930],{"class":1245}," apps/v1\n",[1050,5932,5933,5935,5937],{"class":1052,"line":1292},[1050,5934,5678],{"class":1782},[1050,5936,1787],{"class":1786},[1050,5938,5939],{"class":1245}," Deployment\n",[1050,5941,5942,5944],{"class":1052,"line":1298},[1050,5943,5688],{"class":1782},[1050,5945,1809],{"class":1786},[1050,5947,5948,5950,5952],{"class":1052,"line":1307},[1050,5949,5695],{"class":1782},[1050,5951,1787],{"class":1786},[1050,5953,5700],{"class":1245},[1050,5955,5956,5958,5960],{"class":1052,"line":1312},[1050,5957,5752],{"class":1782},[1050,5959,1787],{"class":1786},[1050,5961,5700],{"class":1245},[1050,5963,5964,5967],{"class":1052,"line":1318},[1050,5965,5966],{"class":1782},"spec",[1050,5968,1809],{"class":1786},[1050,5970,5971,5974,5976],{"class":1052,"line":1560},[1050,5972,5973],{"class":1782},"  replicas",[1050,5975,1787],{"class":1786},[1050,5977,2532],{"class":1826},[1050,5979,5980,5983],{"class":1052,"line":1565},[1050,5981,5982],{"class":1782},"  selector",[1050,5984,1809],{"class":1786},[1050,5986,5987,5990],{"class":1052,"line":1576},[1050,5988,5989],{"class":1782},"    matchLabels",[1050,5991,1809],{"class":1786},[1050,5993,5994,5997,5999],{"class":1052,"line":1581},[1050,5995,5996],{"class":1782},"      app",[1050,5998,1787],{"class":1786},[1050,6000,5700],{"class":1245},[1050,6002,6003,6006],{"class":1052,"line":1587},[1050,6004,6005],{"class":1782},"  template",[1050,6007,1809],{"class":1786},[1050,6009,6010,6013],{"class":1052,"line":1595},[1050,6011,6012],{"class":1782},"    metadata",[1050,6014,1809],{"class":1786},[1050,6016,6017,6020],{"class":1052,"line":1600},[1050,6018,6019],{"class":1782},"      labels",[1050,6021,1809],{"class":1786},[1050,6023,6024,6027,6029],{"class":1052,"line":1606},[1050,6025,6026],{"class":1782},"        app",[1050,6028,1787],{"class":1786},[1050,6030,5700],{"class":1245},[1050,6032,6033,6036],{"class":1052,"line":1614},[1050,6034,6035],{"class":1782},"    spec",[1050,6037,1809],{"class":1786},[1050,6039,6040,6043],{"class":1052,"line":1619},[1050,6041,6042],{"class":1782},"      containers",[1050,6044,1809],{"class":1786},[1050,6046,6047,6049,6052,6054],{"class":1052,"line":1625},[1050,6048,1839],{"class":1786},[1050,6050,6051],{"class":1782}," name",[1050,6053,1787],{"class":1786},[1050,6055,6056],{"class":1245}," django\n",[1050,6058,6059,6062,6064],{"class":1052,"line":1633},[1050,6060,6061],{"class":1782},"        image",[1050,6063,1787],{"class":1786},[1050,6065,4938],{"class":1245},[1050,6067,6068,6071],{"class":1052,"line":1639},[1050,6069,6070],{"class":1782},"        ports",[1050,6072,1809],{"class":1786},[1050,6074,6075,6078,6081,6083],{"class":1052,"line":1644},[1050,6076,6077],{"class":1786},"        -",[1050,6079,6080],{"class":1782}," containerPort",[1050,6082,1787],{"class":1786},[1050,6084,1304],{"class":1826},[1050,6086,6087,6090],{"class":1052,"line":1650},[1050,6088,6089],{"class":1782},"        envFrom",[1050,6091,1809],{"class":1786},[1050,6093,6094,6096,6099],{"class":1052,"line":1657},[1050,6095,6077],{"class":1786},[1050,6097,6098],{"class":1782}," configMapRef",[1050,6100,1809],{"class":1786},[1050,6102,6103,6106,6108],{"class":1052,"line":1662},[1050,6104,6105],{"class":1782},"            name",[1050,6107,1787],{"class":1786},[1050,6109,5747],{"class":1245},[1050,6111,6112,6114,6117],{"class":1052,"line":1667},[1050,6113,6077],{"class":1786},[1050,6115,6116],{"class":1782}," secretRef",[1050,6118,1809],{"class":1786},[1050,6120,6121,6123,6125],{"class":1052,"line":1674},[1050,6122,6105],{"class":1782},[1050,6124,1787],{"class":1786},[1050,6126,5864],{"class":1245},[1050,6128,6129,6132],{"class":1052,"line":1679},[1050,6130,6131],{"class":1782},"        resources",[1050,6133,1809],{"class":1786},[1050,6135,6136,6139],{"class":1052,"line":1685},[1050,6137,6138],{"class":1782},"          requests",[1050,6140,1809],{"class":1786},[1050,6142,6143,6146,6148,6150,6153],{"class":1052,"line":1694},[1050,6144,6145],{"class":1782},"            memory",[1050,6147,1787],{"class":1786},[1050,6149,1842],{"class":1790},[1050,6151,6152],{"class":1245},"256Mi",[1050,6154,1848],{"class":1790},[1050,6156,6157,6160,6162,6164,6167],{"class":1052,"line":1703},[1050,6158,6159],{"class":1782},"            cpu",[1050,6161,1787],{"class":1786},[1050,6163,1842],{"class":1790},[1050,6165,6166],{"class":1245},"250m",[1050,6168,1848],{"class":1790},[1050,6170,6171,6174],{"class":1052,"line":1708},[1050,6172,6173],{"class":1782},"          limits",[1050,6175,1809],{"class":1786},[1050,6177,6178,6180,6182,6184,6187],{"class":1052,"line":1715},[1050,6179,6145],{"class":1782},[1050,6181,1787],{"class":1786},[1050,6183,1842],{"class":1790},[1050,6185,6186],{"class":1245},"512Mi",[1050,6188,1848],{"class":1790},[1050,6190,6191,6193,6195,6197,6200],{"class":1052,"line":1720},[1050,6192,6159],{"class":1782},[1050,6194,1787],{"class":1786},[1050,6196,1842],{"class":1790},[1050,6198,6199],{"class":1245},"500m",[1050,6201,1848],{"class":1790},[1050,6203,6204,6207],{"class":1052,"line":1726},[1050,6205,6206],{"class":1782},"        livenessProbe",[1050,6208,1809],{"class":1786},[1050,6210,6211,6214],{"class":1052,"line":1734},[1050,6212,6213],{"class":1782},"          httpGet",[1050,6215,1809],{"class":1786},[1050,6217,6218,6221,6223],{"class":1052,"line":1742},[1050,6219,6220],{"class":1782},"            path",[1050,6222,1787],{"class":1786},[1050,6224,6225],{"class":1245}," /health/\n",[1050,6227,6228,6231,6233],{"class":1052,"line":2254},[1050,6229,6230],{"class":1782},"            port",[1050,6232,1787],{"class":1786},[1050,6234,1304],{"class":1826},[1050,6236,6237,6240,6242],{"class":1052,"line":2262},[1050,6238,6239],{"class":1782},"          initialDelaySeconds",[1050,6241,1787],{"class":1786},[1050,6243,6244],{"class":1826}," 30\n",[1050,6246,6247,6250,6252],{"class":1052,"line":2768},[1050,6248,6249],{"class":1782},"          periodSeconds",[1050,6251,1787],{"class":1786},[1050,6253,6254],{"class":1826}," 10\n",[1050,6256,6257,6260,6262],{"class":1052,"line":2778},[1050,6258,6259],{"class":1782},"          timeoutSeconds",[1050,6261,1787],{"class":1786},[1050,6263,6264],{"class":1826}," 5\n",[1050,6266,6267,6270,6272],{"class":1052,"line":2783},[1050,6268,6269],{"class":1782},"          failureThreshold",[1050,6271,1787],{"class":1786},[1050,6273,2532],{"class":1826},[1050,6275,6276,6279],{"class":1052,"line":2790},[1050,6277,6278],{"class":1782},"        readinessProbe",[1050,6280,1809],{"class":1786},[1050,6282,6283,6285],{"class":1052,"line":2797},[1050,6284,6213],{"class":1782},[1050,6286,1809],{"class":1786},[1050,6288,6289,6291,6293],{"class":1052,"line":2806},[1050,6290,6220],{"class":1782},[1050,6292,1787],{"class":1786},[1050,6294,6295],{"class":1245}," /ready/\n",[1050,6297,6298,6300,6302],{"class":1052,"line":2815},[1050,6299,6230],{"class":1782},[1050,6301,1787],{"class":1786},[1050,6303,1304],{"class":1826},[1050,6305,6306,6308,6310],{"class":1052,"line":2825},[1050,6307,6239],{"class":1782},[1050,6309,1787],{"class":1786},[1050,6311,6264],{"class":1826},[1050,6313,6314,6316,6318],{"class":1052,"line":2832},[1050,6315,6249],{"class":1782},[1050,6317,1787],{"class":1786},[1050,6319,6264],{"class":1826},[1050,6321,6322,6324,6326],{"class":1052,"line":2839},[1050,6323,6259],{"class":1782},[1050,6325,1787],{"class":1786},[1050,6327,2532],{"class":1826},[1050,6329,6330,6332,6334],{"class":1052,"line":2846},[1050,6331,6269],{"class":1782},[1050,6333,1787],{"class":1786},[1050,6335,2532],{"class":1826},[1050,6337,6338,6341],{"class":1052,"line":2853},[1050,6339,6340],{"class":1782},"        volumeMounts",[1050,6342,1809],{"class":1786},[1050,6344,6345,6347,6349,6351],{"class":1052,"line":2860},[1050,6346,6077],{"class":1786},[1050,6348,6051],{"class":1782},[1050,6350,1787],{"class":1786},[1050,6352,6353],{"class":1245}," static-volume\n",[1050,6355,6356,6359,6361],{"class":1052,"line":2868},[1050,6357,6358],{"class":1782},"          mountPath",[1050,6360,1787],{"class":1786},[1050,6362,6363],{"class":1245}," /app/staticfiles\n",[1050,6365,6366,6368,6370,6372],{"class":1052,"line":2875},[1050,6367,6077],{"class":1786},[1050,6369,6051],{"class":1782},[1050,6371,1787],{"class":1786},[1050,6373,6374],{"class":1245}," media-volume\n",[1050,6376,6377,6379,6381],{"class":1052,"line":2882},[1050,6378,6358],{"class":1782},[1050,6380,1787],{"class":1786},[1050,6382,6383],{"class":1245}," /app/media\n",[1050,6385,6386,6389],{"class":1052,"line":2889},[1050,6387,6388],{"class":1782},"      volumes",[1050,6390,1809],{"class":1786},[1050,6392,6393,6395,6397,6399],{"class":1052,"line":2896},[1050,6394,1839],{"class":1786},[1050,6396,6051],{"class":1782},[1050,6398,1787],{"class":1786},[1050,6400,6353],{"class":1245},[1050,6402,6403,6406],{"class":1052,"line":2905},[1050,6404,6405],{"class":1782},"        persistentVolumeClaim",[1050,6407,1809],{"class":1786},[1050,6409,6410,6413,6415],{"class":1052,"line":2912},[1050,6411,6412],{"class":1782},"          claimName",[1050,6414,1787],{"class":1786},[1050,6416,6417],{"class":1245}," static-pvc\n",[1050,6419,6420,6422,6424,6426],{"class":1052,"line":2922},[1050,6421,1839],{"class":1786},[1050,6423,6051],{"class":1782},[1050,6425,1787],{"class":1786},[1050,6427,6374],{"class":1245},[1050,6429,6430,6432],{"class":1052,"line":2929},[1050,6431,6405],{"class":1782},[1050,6433,1809],{"class":1786},[1050,6435,6436,6438,6440],{"class":1052,"line":2936},[1050,6437,6412],{"class":1782},[1050,6439,1787],{"class":1786},[1050,6441,6442],{"class":1245}," media-pvc\n",[1050,6444,6445],{"class":1052,"line":2945},[1050,6446,1075],{"emptyLinePlaceholder":1074},[1050,6448,6449],{"class":1052,"line":2952},[1050,6450,5710],{"class":5709},[1050,6452,6453],{"class":1052,"line":2961},[1050,6454,6455],{"class":1056},"# k8s/service.yaml\n",[1050,6457,6458,6460,6462],{"class":1052,"line":2966},[1050,6459,5668],{"class":1782},[1050,6461,1787],{"class":1786},[1050,6463,5673],{"class":1245},[1050,6465,6466,6468,6470],{"class":1052,"line":2973},[1050,6467,5678],{"class":1782},[1050,6469,1787],{"class":1786},[1050,6471,6472],{"class":1245}," Service\n",[1050,6474,6475,6477],{"class":1052,"line":2980},[1050,6476,5688],{"class":1782},[1050,6478,1809],{"class":1786},[1050,6480,6481,6483,6485],{"class":1052,"line":2989},[1050,6482,5695],{"class":1782},[1050,6484,1787],{"class":1786},[1050,6486,6487],{"class":1245}," django-service\n",[1050,6489,6490,6492,6494],{"class":1052,"line":2998},[1050,6491,5752],{"class":1782},[1050,6493,1787],{"class":1786},[1050,6495,5700],{"class":1245},[1050,6497,6498,6500],{"class":1052,"line":3007},[1050,6499,5966],{"class":1782},[1050,6501,1809],{"class":1786},[1050,6503,6504,6506],{"class":1052,"line":3014},[1050,6505,5982],{"class":1782},[1050,6507,1809],{"class":1786},[1050,6509,6510,6513,6515],{"class":1052,"line":3021},[1050,6511,6512],{"class":1782},"    app",[1050,6514,1787],{"class":1786},[1050,6516,5700],{"class":1245},[1050,6518,6519,6522],{"class":1052,"line":3028},[1050,6520,6521],{"class":1782},"  ports",[1050,6523,1809],{"class":1786},[1050,6525,6526,6529,6532,6534],{"class":1052,"line":3035},[1050,6527,6528],{"class":1786},"  -",[1050,6530,6531],{"class":1782}," protocol",[1050,6533,1787],{"class":1786},[1050,6535,6536],{"class":1245}," TCP\n",[1050,6538,6539,6542,6544],{"class":1052,"line":3042},[1050,6540,6541],{"class":1782},"    port",[1050,6543,1787],{"class":1786},[1050,6545,6546],{"class":1826}," 80\n",[1050,6548,6549,6552,6554],{"class":1052,"line":3049},[1050,6550,6551],{"class":1782},"    targetPort",[1050,6553,1787],{"class":1786},[1050,6555,1304],{"class":1826},[1050,6557,6558,6561,6563],{"class":1052,"line":3056},[1050,6559,6560],{"class":1782},"  type",[1050,6562,1787],{"class":1786},[1050,6564,6565],{"class":1245}," ClusterIP\n",[1050,6567,6568],{"class":1052,"line":3063},[1050,6569,1075],{"emptyLinePlaceholder":1074},[1050,6571,6572],{"class":1052,"line":3070},[1050,6573,5710],{"class":5709},[1050,6575,6576],{"class":1052,"line":3077},[1050,6577,6578],{"class":1056},"# k8s/ingress.yaml\n",[1050,6580,6581,6583,6585],{"class":1052,"line":3086},[1050,6582,5668],{"class":1782},[1050,6584,1787],{"class":1786},[1050,6586,6587],{"class":1245}," networking.k8s.io/v1\n",[1050,6589,6590,6592,6594],{"class":1052,"line":3093},[1050,6591,5678],{"class":1782},[1050,6593,1787],{"class":1786},[1050,6595,6596],{"class":1245}," Ingress\n",[1050,6598,6599,6601],{"class":1052,"line":3100},[1050,6600,5688],{"class":1782},[1050,6602,1809],{"class":1786},[1050,6604,6605,6607,6609],{"class":1052,"line":3107},[1050,6606,5695],{"class":1782},[1050,6608,1787],{"class":1786},[1050,6610,6611],{"class":1245}," django-ingress\n",[1050,6613,6614,6616,6618],{"class":1052,"line":3116},[1050,6615,5752],{"class":1782},[1050,6617,1787],{"class":1786},[1050,6619,5700],{"class":1245},[1050,6621,6622,6625],{"class":1052,"line":3123},[1050,6623,6624],{"class":1782},"  annotations",[1050,6626,1809],{"class":1786},[1050,6628,6629,6632,6634],{"class":1052,"line":3132},[1050,6630,6631],{"class":1782},"    kubernetes.io/ingress.class",[1050,6633,1787],{"class":1786},[1050,6635,6636],{"class":1245}," nginx\n",[1050,6638,6639,6642,6644],{"class":1052,"line":3137},[1050,6640,6641],{"class":1782},"    cert-manager.io/cluster-issuer",[1050,6643,1787],{"class":1786},[1050,6645,6646],{"class":1245}," letsencrypt-prod\n",[1050,6648,6649,6652,6654,6656,6659],{"class":1052,"line":3145},[1050,6650,6651],{"class":1782},"    nginx.ingress.kubernetes.io/rate-limit",[1050,6653,1787],{"class":1786},[1050,6655,1842],{"class":1790},[1050,6657,6658],{"class":1245},"100",[1050,6660,1848],{"class":1790},[1050,6662,6663,6665],{"class":1052,"line":3155},[1050,6664,5966],{"class":1782},[1050,6666,1809],{"class":1786},[1050,6668,6669,6672],{"class":1052,"line":3162},[1050,6670,6671],{"class":1782},"  tls",[1050,6673,1809],{"class":1786},[1050,6675,6676,6678,6681],{"class":1052,"line":3174},[1050,6677,6528],{"class":1786},[1050,6679,6680],{"class":1782}," hosts",[1050,6682,1809],{"class":1786},[1050,6684,6685,6688],{"class":1052,"line":3181},[1050,6686,6687],{"class":1786},"    -",[1050,6689,6690],{"class":1245}," yourdomain.com\n",[1050,6692,6693,6696,6698],{"class":1052,"line":3189},[1050,6694,6695],{"class":1782},"    secretName",[1050,6697,1787],{"class":1786},[1050,6699,6700],{"class":1245}," django-tls\n",[1050,6702,6703,6706],{"class":1052,"line":3197},[1050,6704,6705],{"class":1782},"  rules",[1050,6707,1809],{"class":1786},[1050,6709,6710,6712,6715,6717],{"class":1052,"line":3204},[1050,6711,6528],{"class":1786},[1050,6713,6714],{"class":1782}," host",[1050,6716,1787],{"class":1786},[1050,6718,6690],{"class":1245},[1050,6720,6721,6724],{"class":1052,"line":3216},[1050,6722,6723],{"class":1782},"    http",[1050,6725,1809],{"class":1786},[1050,6727,6728,6731],{"class":1052,"line":3228},[1050,6729,6730],{"class":1782},"      paths",[1050,6732,1809],{"class":1786},[1050,6734,6735,6737,6740,6742],{"class":1052,"line":3240},[1050,6736,1839],{"class":1786},[1050,6738,6739],{"class":1782}," path",[1050,6741,1787],{"class":1786},[1050,6743,6744],{"class":1245}," /\n",[1050,6746,6747,6750,6752],{"class":1052,"line":3252},[1050,6748,6749],{"class":1782},"        pathType",[1050,6751,1787],{"class":1786},[1050,6753,6754],{"class":1245}," Prefix\n",[1050,6756,6757,6760],{"class":1052,"line":3261},[1050,6758,6759],{"class":1782},"        backend",[1050,6761,1809],{"class":1786},[1050,6763,6764,6767],{"class":1052,"line":3266},[1050,6765,6766],{"class":1782},"          service",[1050,6768,1809],{"class":1786},[1050,6770,6771,6773,6775],{"class":1052,"line":3273},[1050,6772,6105],{"class":1782},[1050,6774,1787],{"class":1786},[1050,6776,6487],{"class":1245},[1050,6778,6779,6781],{"class":1052,"line":3280},[1050,6780,6230],{"class":1782},[1050,6782,1809],{"class":1786},[1050,6784,6785,6788,6790],{"class":1052,"line":3288},[1050,6786,6787],{"class":1782},"              number",[1050,6789,1787],{"class":1786},[1050,6791,6546],{"class":1826},[1050,6793,6794],{"class":1052,"line":3295},[1050,6795,1075],{"emptyLinePlaceholder":1074},[1050,6797,6798],{"class":1052,"line":3302},[1050,6799,5710],{"class":5709},[1050,6801,6802],{"class":1052,"line":3310},[1050,6803,6804],{"class":1056},"# k8s/hpa.yaml\n",[1050,6806,6807,6809,6811],{"class":1052,"line":3315},[1050,6808,5668],{"class":1782},[1050,6810,1787],{"class":1786},[1050,6812,6813],{"class":1245}," autoscaling/v2\n",[1050,6815,6816,6818,6820],{"class":1052,"line":3323},[1050,6817,5678],{"class":1782},[1050,6819,1787],{"class":1786},[1050,6821,6822],{"class":1245}," HorizontalPodAutoscaler\n",[1050,6824,6825,6827],{"class":1052,"line":3331},[1050,6826,5688],{"class":1782},[1050,6828,1809],{"class":1786},[1050,6830,6832,6834,6836],{"class":1052,"line":6831},144,[1050,6833,5695],{"class":1782},[1050,6835,1787],{"class":1786},[1050,6837,6838],{"class":1245}," django-hpa\n",[1050,6840,6842,6844,6846],{"class":1052,"line":6841},145,[1050,6843,5752],{"class":1782},[1050,6845,1787],{"class":1786},[1050,6847,5700],{"class":1245},[1050,6849,6851,6853],{"class":1052,"line":6850},146,[1050,6852,5966],{"class":1782},[1050,6854,1809],{"class":1786},[1050,6856,6858,6861],{"class":1052,"line":6857},147,[1050,6859,6860],{"class":1782},"  scaleTargetRef",[1050,6862,1809],{"class":1786},[1050,6864,6866,6869,6871],{"class":1052,"line":6865},148,[1050,6867,6868],{"class":1782},"    apiVersion",[1050,6870,1787],{"class":1786},[1050,6872,5930],{"class":1245},[1050,6874,6876,6879,6881],{"class":1052,"line":6875},149,[1050,6877,6878],{"class":1782},"    kind",[1050,6880,1787],{"class":1786},[1050,6882,5939],{"class":1245},[1050,6884,6886,6889,6891],{"class":1052,"line":6885},150,[1050,6887,6888],{"class":1782},"    name",[1050,6890,1787],{"class":1786},[1050,6892,5700],{"class":1245},[1050,6894,6896,6899,6901],{"class":1052,"line":6895},151,[1050,6897,6898],{"class":1782},"  minReplicas",[1050,6900,1787],{"class":1786},[1050,6902,2532],{"class":1826},[1050,6904,6906,6909,6911],{"class":1052,"line":6905},152,[1050,6907,6908],{"class":1782},"  maxReplicas",[1050,6910,1787],{"class":1786},[1050,6912,6254],{"class":1826},[1050,6914,6916,6919],{"class":1052,"line":6915},153,[1050,6917,6918],{"class":1782},"  metrics",[1050,6920,1809],{"class":1786},[1050,6922,6924,6926,6929,6931],{"class":1052,"line":6923},154,[1050,6925,6528],{"class":1786},[1050,6927,6928],{"class":1782}," type",[1050,6930,1787],{"class":1786},[1050,6932,6933],{"class":1245}," Resource\n",[1050,6935,6937,6940],{"class":1052,"line":6936},155,[1050,6938,6939],{"class":1782},"    resource",[1050,6941,1809],{"class":1786},[1050,6943,6945,6948,6950],{"class":1052,"line":6944},156,[1050,6946,6947],{"class":1782},"      name",[1050,6949,1787],{"class":1786},[1050,6951,6952],{"class":1245}," cpu\n",[1050,6954,6956,6959],{"class":1052,"line":6955},157,[1050,6957,6958],{"class":1782},"      target",[1050,6960,1809],{"class":1786},[1050,6962,6964,6967,6969],{"class":1052,"line":6963},158,[1050,6965,6966],{"class":1782},"        type",[1050,6968,1787],{"class":1786},[1050,6970,6971],{"class":1245}," Utilization\n",[1050,6973,6975,6978,6980],{"class":1052,"line":6974},159,[1050,6976,6977],{"class":1782},"        averageUtilization",[1050,6979,1787],{"class":1786},[1050,6981,6982],{"class":1826}," 70\n",[1050,6984,6986,6988,6990,6992],{"class":1052,"line":6985},160,[1050,6987,6528],{"class":1786},[1050,6989,6928],{"class":1782},[1050,6991,1787],{"class":1786},[1050,6993,6933],{"class":1245},[1050,6995,6997,6999],{"class":1052,"line":6996},161,[1050,6998,6939],{"class":1782},[1050,7000,1809],{"class":1786},[1050,7002,7004,7006,7008],{"class":1052,"line":7003},162,[1050,7005,6947],{"class":1782},[1050,7007,1787],{"class":1786},[1050,7009,7010],{"class":1245}," memory\n",[1050,7012,7014,7016],{"class":1052,"line":7013},163,[1050,7015,6958],{"class":1782},[1050,7017,1809],{"class":1786},[1050,7019,7021,7023,7025],{"class":1052,"line":7020},164,[1050,7022,6966],{"class":1782},[1050,7024,1787],{"class":1786},[1050,7026,6971],{"class":1245},[1050,7028,7030,7032,7034],{"class":1052,"line":7029},165,[1050,7031,6977],{"class":1782},[1050,7033,1787],{"class":1786},[1050,7035,6546],{"class":1826},[1030,7037,7039],{"id":7038},"cicd-with-docker","CI/CD with Docker",[1035,7041,7043],{"id":7042},"github-actions-with-docker","GitHub Actions with Docker",[1040,7045,7047],{"className":1768,"code":7046,"language":1770,"meta":1045,"style":1045},"# .github/workflows/docker-deploy.yml\nname: Docker Build and Deploy\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    \n    services:\n      postgres:\n        image: postgres:13\n        env:\n          POSTGRES_PASSWORD: postgres\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n      \n      redis:\n        image: redis:7-alpine\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n    \n    steps:\n    - uses: actions/checkout@v3\n    \n    - name: Build test image\n      run: |\n        docker build --target development -t django-test .\n    \n    - name: Run tests\n      run: |\n        docker run --rm \\\n          --network host \\\n          -e DATABASE_URL=postgresql://postgres:postgres@localhost:5432/test_db \\\n          -e REDIS_URL=redis://localhost:6379/1 \\\n          django-test \\\n          python manage.py test\n    \n    - name: Run security checks\n      run: |\n        docker run --rm django-test bandit -r .\n        docker run --rm django-test safety check\n\n  build:\n    needs: test\n    runs-on: ubuntu-latest\n    \n    steps:\n    - uses: actions/checkout@v3\n    \n    - name: Set up Docker Buildx\n      uses: docker/setup-buildx-action@v2\n    \n    - name: Log in to Container Registry\n      uses: docker/login-action@v2\n      with:\n        registry: ${{ env.REGISTRY }}\n        username: ${{ github.actor }}\n        password: ${{ secrets.GITHUB_TOKEN }}\n    \n    - name: Extract metadata\n      id: meta\n      uses: docker/metadata-action@v4\n      with:\n        images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n        tags: |\n          type=ref,event=branch\n          type=ref,event=pr\n          type=sha,prefix={{branch}}-\n          type=raw,value=latest,enable={{is_default_branch}}\n    \n    - name: Build and push Docker image\n      uses: docker/build-push-action@v4\n      with:\n        context: .\n        target: production\n        push: true\n        tags: ${{ steps.meta.outputs.tags }}\n        labels: ${{ steps.meta.outputs.labels }}\n        cache-from: type=gha\n        cache-to: type=gha,mode=max\n\n  deploy:\n    needs: build\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs/heads/main'\n    \n    steps:\n    - uses: actions/checkout@v3\n    \n    - name: Deploy to production\n      uses: appleboy/ssh-action@v0.1.5\n      with:\n        host: ${{ secrets.PRODUCTION_HOST }}\n        username: ${{ secrets.PRODUCTION_USER }}\n        key: ${{ secrets.PRODUCTION_SSH_KEY }}\n        script: |\n          cd /opt/django_app\n          docker-compose -f docker-compose.prod.yml pull\n          docker-compose -f docker-compose.prod.yml up -d\n          docker system prune -f\n",[1047,7048,7049,7054,7064,7068,7075,7082,7096,7103,7115,7119,7126,7136,7146,7150,7157,7164,7174,7178,7185,7192,7200,7207,7217,7232,7237,7242,7247,7252,7257,7264,7272,7282,7287,7291,7295,7299,7303,7310,7322,7326,7337,7347,7352,7356,7367,7375,7380,7385,7390,7395,7400,7405,7409,7420,7428,7433,7438,7442,7449,7459,7467,7471,7477,7487,7491,7502,7512,7516,7527,7536,7543,7553,7563,7573,7577,7588,7598,7607,7613,7623,7632,7637,7642,7647,7652,7656,7667,7676,7682,7691,7699,7708,7717,7727,7737,7747,7751,7758,7767,7775,7785,7789,7795,7805,7809,7820,7829,7835,7845,7854,7864,7873,7878,7883,7888],{"__ignoreMap":1045},[1050,7050,7051],{"class":1052,"line":1053},[1050,7052,7053],{"class":1056},"# .github/workflows/docker-deploy.yml\n",[1050,7055,7056,7059,7061],{"class":1052,"line":1060},[1050,7057,7058],{"class":1782},"name",[1050,7060,1787],{"class":1786},[1050,7062,7063],{"class":1245}," Docker Build and Deploy\n",[1050,7065,7066],{"class":1052,"line":1071},[1050,7067,1075],{"emptyLinePlaceholder":1074},[1050,7069,7070,7073],{"class":1052,"line":1078},[1050,7071,7072],{"class":5599},"on",[1050,7074,1809],{"class":1786},[1050,7076,7077,7080],{"class":1052,"line":1084},[1050,7078,7079],{"class":1782},"  push",[1050,7081,1809],{"class":1786},[1050,7083,7084,7087,7089,7091,7094],{"class":1052,"line":1093},[1050,7085,7086],{"class":1782},"    branches",[1050,7088,1787],{"class":1786},[1050,7090,1324],{"class":1786},[1050,7092,7093],{"class":1245},"main",[1050,7095,1346],{"class":1786},[1050,7097,7098,7101],{"class":1052,"line":1101},[1050,7099,7100],{"class":1782},"  pull_request",[1050,7102,1809],{"class":1786},[1050,7104,7105,7107,7109,7111,7113],{"class":1052,"line":1109},[1050,7106,7086],{"class":1782},[1050,7108,1787],{"class":1786},[1050,7110,1324],{"class":1786},[1050,7112,7093],{"class":1245},[1050,7114,1346],{"class":1786},[1050,7116,7117],{"class":1052,"line":1114},[1050,7118,1075],{"emptyLinePlaceholder":1074},[1050,7120,7121,7124],{"class":1052,"line":1120},[1050,7122,7123],{"class":1782},"env",[1050,7125,1809],{"class":1786},[1050,7127,7128,7131,7133],{"class":1052,"line":1129},[1050,7129,7130],{"class":1782},"  REGISTRY",[1050,7132,1787],{"class":1786},[1050,7134,7135],{"class":1245}," ghcr.io\n",[1050,7137,7138,7141,7143],{"class":1052,"line":1134},[1050,7139,7140],{"class":1782},"  IMAGE_NAME",[1050,7142,1787],{"class":1786},[1050,7144,7145],{"class":1245}," ${{ github.repository }}\n",[1050,7147,7148],{"class":1052,"line":1140},[1050,7149,1075],{"emptyLinePlaceholder":1074},[1050,7151,7152,7155],{"class":1052,"line":1149},[1050,7153,7154],{"class":1782},"jobs",[1050,7156,1809],{"class":1786},[1050,7158,7159,7162],{"class":1052,"line":1155},[1050,7160,7161],{"class":1782},"  test",[1050,7163,1809],{"class":1786},[1050,7165,7166,7169,7171],{"class":1052,"line":1161},[1050,7167,7168],{"class":1782},"    runs-on",[1050,7170,1787],{"class":1786},[1050,7172,7173],{"class":1245}," ubuntu-latest\n",[1050,7175,7176],{"class":1052,"line":1167},[1050,7177,4078],{"class":1067},[1050,7179,7180,7183],{"class":1052,"line":1173},[1050,7181,7182],{"class":1782},"    services",[1050,7184,1809],{"class":1786},[1050,7186,7187,7190],{"class":1052,"line":1179},[1050,7188,7189],{"class":1782},"      postgres",[1050,7191,1809],{"class":1786},[1050,7193,7194,7196,7198],{"class":1052,"line":1184},[1050,7195,6061],{"class":1782},[1050,7197,1787],{"class":1786},[1050,7199,1963],{"class":1245},[1050,7201,7202,7205],{"class":1052,"line":1190},[1050,7203,7204],{"class":1782},"        env",[1050,7206,1809],{"class":1786},[1050,7208,7209,7212,7214],{"class":1052,"line":1199},[1050,7210,7211],{"class":1782},"          POSTGRES_PASSWORD",[1050,7213,1787],{"class":1786},[1050,7215,7216],{"class":1245}," postgres\n",[1050,7218,7219,7222,7224,7228],{"class":1052,"line":1207},[1050,7220,7221],{"class":1782},"        options",[1050,7223,1787],{"class":1786},[1050,7225,7227],{"class":7226},"siDh9"," >",[1050,7229,7231],{"class":7230},"s5Kfy","-\n",[1050,7233,7234],{"class":1052,"line":1212},[1050,7235,7236],{"class":1245},"          --health-cmd pg_isready\n",[1050,7238,7239],{"class":1052,"line":1218},[1050,7240,7241],{"class":1245},"          --health-interval 10s\n",[1050,7243,7244],{"class":1052,"line":1226},[1050,7245,7246],{"class":1245},"          --health-timeout 5s\n",[1050,7248,7249],{"class":1052,"line":1231},[1050,7250,7251],{"class":1245},"          --health-retries 5\n",[1050,7253,7254],{"class":1052,"line":1237},[1050,7255,7256],{"class":1245},"      \n",[1050,7258,7259,7262],{"class":1052,"line":1252},[1050,7260,7261],{"class":1782},"      redis",[1050,7263,1809],{"class":1786},[1050,7265,7266,7268,7270],{"class":1052,"line":1260},[1050,7267,6061],{"class":1782},[1050,7269,1787],{"class":1786},[1050,7271,2040],{"class":1245},[1050,7273,7274,7276,7278,7280],{"class":1052,"line":1268},[1050,7275,7221],{"class":1782},[1050,7277,1787],{"class":1786},[1050,7279,7227],{"class":7226},[1050,7281,7231],{"class":7230},[1050,7283,7284],{"class":1052,"line":1273},[1050,7285,7286],{"class":1245},"          --health-cmd \"redis-cli ping\"\n",[1050,7288,7289],{"class":1052,"line":1279},[1050,7290,7241],{"class":1245},[1050,7292,7293],{"class":1052,"line":1287},[1050,7294,7246],{"class":1245},[1050,7296,7297],{"class":1052,"line":1292},[1050,7298,7251],{"class":1245},[1050,7300,7301],{"class":1052,"line":1298},[1050,7302,4078],{"class":1245},[1050,7304,7305,7308],{"class":1052,"line":1307},[1050,7306,7307],{"class":1782},"    steps",[1050,7309,1809],{"class":1786},[1050,7311,7312,7314,7317,7319],{"class":1052,"line":1312},[1050,7313,6687],{"class":1786},[1050,7315,7316],{"class":1782}," uses",[1050,7318,1787],{"class":1786},[1050,7320,7321],{"class":1245}," actions/checkout@v3\n",[1050,7323,7324],{"class":1052,"line":1318},[1050,7325,4078],{"class":1067},[1050,7327,7328,7330,7332,7334],{"class":1052,"line":1560},[1050,7329,6687],{"class":1786},[1050,7331,6051],{"class":1782},[1050,7333,1787],{"class":1786},[1050,7335,7336],{"class":1245}," Build test image\n",[1050,7338,7339,7342,7344],{"class":1052,"line":1565},[1050,7340,7341],{"class":1782},"      run",[1050,7343,1787],{"class":1786},[1050,7345,7346],{"class":7226}," |\n",[1050,7348,7349],{"class":1052,"line":1576},[1050,7350,7351],{"class":1245},"        docker build --target development -t django-test .\n",[1050,7353,7354],{"class":1052,"line":1581},[1050,7355,4078],{"class":1245},[1050,7357,7358,7360,7362,7364],{"class":1052,"line":1587},[1050,7359,6687],{"class":1786},[1050,7361,6051],{"class":1782},[1050,7363,1787],{"class":1786},[1050,7365,7366],{"class":1245}," Run tests\n",[1050,7368,7369,7371,7373],{"class":1052,"line":1595},[1050,7370,7341],{"class":1782},[1050,7372,1787],{"class":1786},[1050,7374,7346],{"class":7226},[1050,7376,7377],{"class":1052,"line":1600},[1050,7378,7379],{"class":1245},"        docker run --rm \\\n",[1050,7381,7382],{"class":1052,"line":1606},[1050,7383,7384],{"class":1245},"          --network host \\\n",[1050,7386,7387],{"class":1052,"line":1614},[1050,7388,7389],{"class":1245},"          -e DATABASE_URL=postgresql://postgres:postgres@localhost:5432/test_db \\\n",[1050,7391,7392],{"class":1052,"line":1619},[1050,7393,7394],{"class":1245},"          -e REDIS_URL=redis://localhost:6379/1 \\\n",[1050,7396,7397],{"class":1052,"line":1625},[1050,7398,7399],{"class":1245},"          django-test \\\n",[1050,7401,7402],{"class":1052,"line":1633},[1050,7403,7404],{"class":1245},"          python manage.py test\n",[1050,7406,7407],{"class":1052,"line":1639},[1050,7408,4078],{"class":1245},[1050,7410,7411,7413,7415,7417],{"class":1052,"line":1644},[1050,7412,6687],{"class":1786},[1050,7414,6051],{"class":1782},[1050,7416,1787],{"class":1786},[1050,7418,7419],{"class":1245}," Run security checks\n",[1050,7421,7422,7424,7426],{"class":1052,"line":1650},[1050,7423,7341],{"class":1782},[1050,7425,1787],{"class":1786},[1050,7427,7346],{"class":7226},[1050,7429,7430],{"class":1052,"line":1657},[1050,7431,7432],{"class":1245},"        docker run --rm django-test bandit -r .\n",[1050,7434,7435],{"class":1052,"line":1662},[1050,7436,7437],{"class":1245},"        docker run --rm django-test safety check\n",[1050,7439,7440],{"class":1052,"line":1667},[1050,7441,1075],{"emptyLinePlaceholder":1074},[1050,7443,7444,7447],{"class":1052,"line":1674},[1050,7445,7446],{"class":1782},"  build",[1050,7448,1809],{"class":1786},[1050,7450,7451,7454,7456],{"class":1052,"line":1679},[1050,7452,7453],{"class":1782},"    needs",[1050,7455,1787],{"class":1786},[1050,7457,7458],{"class":1245}," test\n",[1050,7460,7461,7463,7465],{"class":1052,"line":1685},[1050,7462,7168],{"class":1782},[1050,7464,1787],{"class":1786},[1050,7466,7173],{"class":1245},[1050,7468,7469],{"class":1052,"line":1694},[1050,7470,4078],{"class":1067},[1050,7472,7473,7475],{"class":1052,"line":1703},[1050,7474,7307],{"class":1782},[1050,7476,1809],{"class":1786},[1050,7478,7479,7481,7483,7485],{"class":1052,"line":1708},[1050,7480,6687],{"class":1786},[1050,7482,7316],{"class":1782},[1050,7484,1787],{"class":1786},[1050,7486,7321],{"class":1245},[1050,7488,7489],{"class":1052,"line":1715},[1050,7490,4078],{"class":1067},[1050,7492,7493,7495,7497,7499],{"class":1052,"line":1720},[1050,7494,6687],{"class":1786},[1050,7496,6051],{"class":1782},[1050,7498,1787],{"class":1786},[1050,7500,7501],{"class":1245}," Set up Docker Buildx\n",[1050,7503,7504,7507,7509],{"class":1052,"line":1726},[1050,7505,7506],{"class":1782},"      uses",[1050,7508,1787],{"class":1786},[1050,7510,7511],{"class":1245}," docker/setup-buildx-action@v2\n",[1050,7513,7514],{"class":1052,"line":1734},[1050,7515,4078],{"class":1067},[1050,7517,7518,7520,7522,7524],{"class":1052,"line":1742},[1050,7519,6687],{"class":1786},[1050,7521,6051],{"class":1782},[1050,7523,1787],{"class":1786},[1050,7525,7526],{"class":1245}," Log in to Container Registry\n",[1050,7528,7529,7531,7533],{"class":1052,"line":2254},[1050,7530,7506],{"class":1782},[1050,7532,1787],{"class":1786},[1050,7534,7535],{"class":1245}," docker/login-action@v2\n",[1050,7537,7538,7541],{"class":1052,"line":2262},[1050,7539,7540],{"class":1782},"      with",[1050,7542,1809],{"class":1786},[1050,7544,7545,7548,7550],{"class":1052,"line":2768},[1050,7546,7547],{"class":1782},"        registry",[1050,7549,1787],{"class":1786},[1050,7551,7552],{"class":1245}," ${{ env.REGISTRY }}\n",[1050,7554,7555,7558,7560],{"class":1052,"line":2778},[1050,7556,7557],{"class":1782},"        username",[1050,7559,1787],{"class":1786},[1050,7561,7562],{"class":1245}," ${{ github.actor }}\n",[1050,7564,7565,7568,7570],{"class":1052,"line":2783},[1050,7566,7567],{"class":1782},"        password",[1050,7569,1787],{"class":1786},[1050,7571,7572],{"class":1245}," ${{ secrets.GITHUB_TOKEN }}\n",[1050,7574,7575],{"class":1052,"line":2790},[1050,7576,4078],{"class":1067},[1050,7578,7579,7581,7583,7585],{"class":1052,"line":2797},[1050,7580,6687],{"class":1786},[1050,7582,6051],{"class":1782},[1050,7584,1787],{"class":1786},[1050,7586,7587],{"class":1245}," Extract metadata\n",[1050,7589,7590,7593,7595],{"class":1052,"line":2806},[1050,7591,7592],{"class":1782},"      id",[1050,7594,1787],{"class":1786},[1050,7596,7597],{"class":1245}," meta\n",[1050,7599,7600,7602,7604],{"class":1052,"line":2815},[1050,7601,7506],{"class":1782},[1050,7603,1787],{"class":1786},[1050,7605,7606],{"class":1245}," docker/metadata-action@v4\n",[1050,7608,7609,7611],{"class":1052,"line":2825},[1050,7610,7540],{"class":1782},[1050,7612,1809],{"class":1786},[1050,7614,7615,7618,7620],{"class":1052,"line":2832},[1050,7616,7617],{"class":1782},"        images",[1050,7619,1787],{"class":1786},[1050,7621,7622],{"class":1245}," ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n",[1050,7624,7625,7628,7630],{"class":1052,"line":2839},[1050,7626,7627],{"class":1782},"        tags",[1050,7629,1787],{"class":1786},[1050,7631,7346],{"class":7226},[1050,7633,7634],{"class":1052,"line":2846},[1050,7635,7636],{"class":1245},"          type=ref,event=branch\n",[1050,7638,7639],{"class":1052,"line":2853},[1050,7640,7641],{"class":1245},"          type=ref,event=pr\n",[1050,7643,7644],{"class":1052,"line":2860},[1050,7645,7646],{"class":1245},"          type=sha,prefix={{branch}}-\n",[1050,7648,7649],{"class":1052,"line":2868},[1050,7650,7651],{"class":1245},"          type=raw,value=latest,enable={{is_default_branch}}\n",[1050,7653,7654],{"class":1052,"line":2875},[1050,7655,4078],{"class":1245},[1050,7657,7658,7660,7662,7664],{"class":1052,"line":2882},[1050,7659,6687],{"class":1786},[1050,7661,6051],{"class":1782},[1050,7663,1787],{"class":1786},[1050,7665,7666],{"class":1245}," Build and push Docker image\n",[1050,7668,7669,7671,7673],{"class":1052,"line":2889},[1050,7670,7506],{"class":1782},[1050,7672,1787],{"class":1786},[1050,7674,7675],{"class":1245}," docker/build-push-action@v4\n",[1050,7677,7678,7680],{"class":1052,"line":2896},[1050,7679,7540],{"class":1782},[1050,7681,1809],{"class":1786},[1050,7683,7684,7687,7689],{"class":1052,"line":2905},[1050,7685,7686],{"class":1782},"        context",[1050,7688,1787],{"class":1786},[1050,7690,1827],{"class":1826},[1050,7692,7693,7695,7697],{"class":1052,"line":2912},[1050,7694,4807],{"class":1782},[1050,7696,1787],{"class":1786},[1050,7698,3588],{"class":1245},[1050,7700,7701,7704,7706],{"class":1052,"line":2922},[1050,7702,7703],{"class":1782},"        push",[1050,7705,1787],{"class":1786},[1050,7707,5600],{"class":5599},[1050,7709,7710,7712,7714],{"class":1052,"line":2929},[1050,7711,7627],{"class":1782},[1050,7713,1787],{"class":1786},[1050,7715,7716],{"class":1245}," ${{ steps.meta.outputs.tags }}\n",[1050,7718,7719,7722,7724],{"class":1052,"line":2936},[1050,7720,7721],{"class":1782},"        labels",[1050,7723,1787],{"class":1786},[1050,7725,7726],{"class":1245}," ${{ steps.meta.outputs.labels }}\n",[1050,7728,7729,7732,7734],{"class":1052,"line":2945},[1050,7730,7731],{"class":1782},"        cache-from",[1050,7733,1787],{"class":1786},[1050,7735,7736],{"class":1245}," type=gha\n",[1050,7738,7739,7742,7744],{"class":1052,"line":2952},[1050,7740,7741],{"class":1782},"        cache-to",[1050,7743,1787],{"class":1786},[1050,7745,7746],{"class":1245}," type=gha,mode=max\n",[1050,7748,7749],{"class":1052,"line":2961},[1050,7750,1075],{"emptyLinePlaceholder":1074},[1050,7752,7753,7756],{"class":1052,"line":2966},[1050,7754,7755],{"class":1782},"  deploy",[1050,7757,1809],{"class":1786},[1050,7759,7760,7762,7764],{"class":1052,"line":2973},[1050,7761,7453],{"class":1782},[1050,7763,1787],{"class":1786},[1050,7765,7766],{"class":1245}," build\n",[1050,7768,7769,7771,7773],{"class":1052,"line":2980},[1050,7770,7168],{"class":1782},[1050,7772,1787],{"class":1786},[1050,7774,7173],{"class":1245},[1050,7776,7777,7780,7782],{"class":1052,"line":2989},[1050,7778,7779],{"class":1782},"    if",[1050,7781,1787],{"class":1786},[1050,7783,7784],{"class":1245}," github.ref == 'refs/heads/main'\n",[1050,7786,7787],{"class":1052,"line":2998},[1050,7788,4078],{"class":1067},[1050,7790,7791,7793],{"class":1052,"line":3007},[1050,7792,7307],{"class":1782},[1050,7794,1809],{"class":1786},[1050,7796,7797,7799,7801,7803],{"class":1052,"line":3014},[1050,7798,6687],{"class":1786},[1050,7800,7316],{"class":1782},[1050,7802,1787],{"class":1786},[1050,7804,7321],{"class":1245},[1050,7806,7807],{"class":1052,"line":3021},[1050,7808,4078],{"class":1067},[1050,7810,7811,7813,7815,7817],{"class":1052,"line":3028},[1050,7812,6687],{"class":1786},[1050,7814,6051],{"class":1782},[1050,7816,1787],{"class":1786},[1050,7818,7819],{"class":1245}," Deploy to production\n",[1050,7821,7822,7824,7826],{"class":1052,"line":3035},[1050,7823,7506],{"class":1782},[1050,7825,1787],{"class":1786},[1050,7827,7828],{"class":1245}," appleboy/ssh-action@v0.1.5\n",[1050,7830,7831,7833],{"class":1052,"line":3042},[1050,7832,7540],{"class":1782},[1050,7834,1809],{"class":1786},[1050,7836,7837,7840,7842],{"class":1052,"line":3049},[1050,7838,7839],{"class":1782},"        host",[1050,7841,1787],{"class":1786},[1050,7843,7844],{"class":1245}," ${{ secrets.PRODUCTION_HOST }}\n",[1050,7846,7847,7849,7851],{"class":1052,"line":3056},[1050,7848,7557],{"class":1782},[1050,7850,1787],{"class":1786},[1050,7852,7853],{"class":1245}," ${{ secrets.PRODUCTION_USER }}\n",[1050,7855,7856,7859,7861],{"class":1052,"line":3063},[1050,7857,7858],{"class":1782},"        key",[1050,7860,1787],{"class":1786},[1050,7862,7863],{"class":1245}," ${{ secrets.PRODUCTION_SSH_KEY }}\n",[1050,7865,7866,7869,7871],{"class":1052,"line":3070},[1050,7867,7868],{"class":1782},"        script",[1050,7870,1787],{"class":1786},[1050,7872,7346],{"class":7226},[1050,7874,7875],{"class":1052,"line":3077},[1050,7876,7877],{"class":1245},"          cd /opt/django_app\n",[1050,7879,7880],{"class":1052,"line":3086},[1050,7881,7882],{"class":1245},"          docker-compose -f docker-compose.prod.yml pull\n",[1050,7884,7885],{"class":1052,"line":3093},[1050,7886,7887],{"class":1245},"          docker-compose -f docker-compose.prod.yml up -d\n",[1050,7889,7890],{"class":1052,"line":3100},[1050,7891,7892],{"class":1245},"          docker system prune -f\n",[1035,7894,7896],{"id":7895},"docker-build-scripts","Docker Build Scripts",[1040,7898,7900],{"className":4464,"code":7899,"language":4466,"meta":1045,"style":1045},"#!/bin/bash\n# scripts/docker_build.sh - Docker build script\n\nset -e\n\n# Configuration\nIMAGE_NAME=\"myapp\"\nREGISTRY=\"ghcr.io/username\"\nVERSION=${1:-latest}\n\necho \"🐳 Building Docker image...\"\n\n# Build multi-stage image\ndocker build \\\n    --target production \\\n    --tag $IMAGE_NAME:$VERSION \\\n    --tag $IMAGE_NAME:latest \\\n    --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \\\n    --build-arg VCS_REF=$(git rev-parse --short HEAD) \\\n    .\n\n# Tag for registry\ndocker tag $IMAGE_NAME:$VERSION $REGISTRY/$IMAGE_NAME:$VERSION\ndocker tag $IMAGE_NAME:latest $REGISTRY/$IMAGE_NAME:latest\n\necho \"✅ Docker image built successfully!\"\n\n# Push to registry if requested\nif [ \"$2\" = \"push\" ]; then\n    echo \"📤 Pushing to registry...\"\n    docker push $REGISTRY/$IMAGE_NAME:$VERSION\n    docker push $REGISTRY/$IMAGE_NAME:latest\n    echo \"✅ Image pushed to registry!\"\nfi\n",[1047,7901,7902,7907,7912,7916,7926,7930,7935,7949,7963,7983,7987,7999,8003,8008,8020,8030,8045,8056,8089,8114,8119,8123,8128,8155,8174,8178,8189,8193,8198,8229,8241,8259,8273,8284],{"__ignoreMap":1045},[1050,7903,7904],{"class":1052,"line":1053},[1050,7905,7906],{"class":1056},"#!/bin/bash\n",[1050,7908,7909],{"class":1052,"line":1060},[1050,7910,7911],{"class":1056},"# scripts/docker_build.sh - Docker build script\n",[1050,7913,7914],{"class":1052,"line":1071},[1050,7915,1075],{"emptyLinePlaceholder":1074},[1050,7917,7918,7922],{"class":1052,"line":1078},[1050,7919,7921],{"class":7920},"sJdAF","set",[1050,7923,7925],{"class":7924},"sz9Cv"," -e\n",[1050,7927,7928],{"class":1052,"line":1084},[1050,7929,1075],{"emptyLinePlaceholder":1074},[1050,7931,7932],{"class":1052,"line":1093},[1050,7933,7934],{"class":1056},"# Configuration\n",[1050,7936,7937,7940,7942,7944,7947],{"class":1052,"line":1101},[1050,7938,7939],{"class":4483},"IMAGE_NAME",[1050,7941,4487],{"class":1786},[1050,7943,5132],{"class":1790},[1050,7945,7946],{"class":1245},"myapp",[1050,7948,1848],{"class":1790},[1050,7950,7951,7954,7956,7958,7961],{"class":1052,"line":1109},[1050,7952,7953],{"class":4483},"REGISTRY",[1050,7955,4487],{"class":1786},[1050,7957,5132],{"class":1790},[1050,7959,7960],{"class":1245},"ghcr.io/username",[1050,7962,1848],{"class":1790},[1050,7964,7965,7968,7970,7974,7978,7981],{"class":1052,"line":1114},[1050,7966,7967],{"class":4483},"VERSION",[1050,7969,4487],{"class":1786},[1050,7971,7973],{"class":7972},"sqOPj","${1",[1050,7975,7977],{"class":7976},"sVsLi",":-",[1050,7979,7980],{"class":4483},"latest",[1050,7982,4054],{"class":7972},[1050,7984,7985],{"class":1052,"line":1120},[1050,7986,1075],{"emptyLinePlaceholder":1074},[1050,7988,7989,7992,7994,7997],{"class":1052,"line":1129},[1050,7990,7991],{"class":7920},"echo",[1050,7993,1842],{"class":1790},[1050,7995,7996],{"class":1245},"🐳 Building Docker image...",[1050,7998,1848],{"class":1790},[1050,8000,8001],{"class":1052,"line":1134},[1050,8002,1075],{"emptyLinePlaceholder":1074},[1050,8004,8005],{"class":1052,"line":1140},[1050,8006,8007],{"class":1056},"# Build multi-stage image\n",[1050,8009,8010,8013,8016],{"class":1052,"line":1149},[1050,8011,8012],{"class":5709},"docker",[1050,8014,8015],{"class":1245}," build",[1050,8017,8019],{"class":8018},"se3Ec"," \\\n",[1050,8021,8022,8025,8028],{"class":1052,"line":1155},[1050,8023,8024],{"class":7924},"    --target",[1050,8026,8027],{"class":1245}," production",[1050,8029,8019],{"class":8018},[1050,8031,8032,8035,8038,8040,8043],{"class":1052,"line":1161},[1050,8033,8034],{"class":7924},"    --tag",[1050,8036,8037],{"class":4483}," $IMAGE_NAME",[1050,8039,1787],{"class":1245},[1050,8041,8042],{"class":4483},"$VERSION",[1050,8044,8019],{"class":8018},[1050,8046,8047,8049,8051,8054],{"class":1052,"line":1167},[1050,8048,8034],{"class":7924},[1050,8050,8037],{"class":4483},[1050,8052,8053],{"class":1245},":latest",[1050,8055,8019],{"class":8018},[1050,8057,8058,8061,8064,8067,8070,8073,8076,8079,8082,8084,8087],{"class":1052,"line":1173},[1050,8059,8060],{"class":7924},"    --build-arg",[1050,8062,8063],{"class":1245}," BUILD_DATE=",[1050,8065,8066],{"class":1786},"$(",[1050,8068,8069],{"class":5709},"date",[1050,8071,8072],{"class":7924}," -u",[1050,8074,8075],{"class":1245}," +",[1050,8077,8078],{"class":1790},"'",[1050,8080,8081],{"class":1245},"%Y-%m-%dT%H:%M:%SZ",[1050,8083,8078],{"class":1790},[1050,8085,8086],{"class":1786},")",[1050,8088,8019],{"class":8018},[1050,8090,8091,8093,8096,8098,8101,8104,8107,8110,8112],{"class":1052,"line":1179},[1050,8092,8060],{"class":7924},[1050,8094,8095],{"class":1245}," VCS_REF=",[1050,8097,8066],{"class":1786},[1050,8099,8100],{"class":5709},"git",[1050,8102,8103],{"class":1245}," rev-parse",[1050,8105,8106],{"class":7924}," --short",[1050,8108,8109],{"class":1245}," HEAD",[1050,8111,8086],{"class":1786},[1050,8113,8019],{"class":8018},[1050,8115,8116],{"class":1052,"line":1184},[1050,8117,8118],{"class":1245},"    .\n",[1050,8120,8121],{"class":1052,"line":1190},[1050,8122,1075],{"emptyLinePlaceholder":1074},[1050,8124,8125],{"class":1052,"line":1199},[1050,8126,8127],{"class":1056},"# Tag for registry\n",[1050,8129,8130,8132,8135,8137,8139,8141,8144,8147,8150,8152],{"class":1052,"line":1207},[1050,8131,8012],{"class":5709},[1050,8133,8134],{"class":1245}," tag",[1050,8136,8037],{"class":4483},[1050,8138,1787],{"class":1245},[1050,8140,8042],{"class":4483},[1050,8142,8143],{"class":4483}," $REGISTRY",[1050,8145,8146],{"class":1245},"/",[1050,8148,8149],{"class":4483},"$IMAGE_NAME",[1050,8151,1787],{"class":1245},[1050,8153,8154],{"class":4483},"$VERSION\n",[1050,8156,8157,8159,8161,8163,8165,8167,8169,8171],{"class":1052,"line":1212},[1050,8158,8012],{"class":5709},[1050,8160,8134],{"class":1245},[1050,8162,8037],{"class":4483},[1050,8164,8053],{"class":1245},[1050,8166,8143],{"class":4483},[1050,8168,8146],{"class":1245},[1050,8170,8149],{"class":4483},[1050,8172,8173],{"class":1245},":latest\n",[1050,8175,8176],{"class":1052,"line":1218},[1050,8177,1075],{"emptyLinePlaceholder":1074},[1050,8179,8180,8182,8184,8187],{"class":1052,"line":1226},[1050,8181,7991],{"class":7920},[1050,8183,1842],{"class":1790},[1050,8185,8186],{"class":1245},"✅ Docker image built successfully!",[1050,8188,1848],{"class":1790},[1050,8190,8191],{"class":1052,"line":1231},[1050,8192,1075],{"emptyLinePlaceholder":1074},[1050,8194,8195],{"class":1052,"line":1237},[1050,8196,8197],{"class":1056},"# Push to registry if requested\n",[1050,8199,8200,8203,8205,8207,8211,8213,8216,8218,8221,8223,8226],{"class":1052,"line":1252},[1050,8201,8202],{"class":7226},"if",[1050,8204,1324],{"class":1786},[1050,8206,1842],{"class":1790},[1050,8208,8210],{"class":8209},"sVyVU","$2",[1050,8212,5132],{"class":1790},[1050,8214,8215],{"class":7976}," =",[1050,8217,1842],{"class":1790},[1050,8219,8220],{"class":1245},"push",[1050,8222,5132],{"class":1790},[1050,8224,8225],{"class":1786}," ];",[1050,8227,8228],{"class":7226}," then\n",[1050,8230,8231,8234,8236,8239],{"class":1052,"line":1260},[1050,8232,8233],{"class":7920},"    echo",[1050,8235,1842],{"class":1790},[1050,8237,8238],{"class":1245},"📤 Pushing to registry...",[1050,8240,1848],{"class":1790},[1050,8242,8243,8246,8249,8251,8253,8255,8257],{"class":1052,"line":1268},[1050,8244,8245],{"class":5709},"    docker",[1050,8247,8248],{"class":1245}," push",[1050,8250,8143],{"class":4483},[1050,8252,8146],{"class":1245},[1050,8254,8149],{"class":4483},[1050,8256,1787],{"class":1245},[1050,8258,8154],{"class":4483},[1050,8260,8261,8263,8265,8267,8269,8271],{"class":1052,"line":1273},[1050,8262,8245],{"class":5709},[1050,8264,8248],{"class":1245},[1050,8266,8143],{"class":4483},[1050,8268,8146],{"class":1245},[1050,8270,8149],{"class":4483},[1050,8272,8173],{"class":1245},[1050,8274,8275,8277,8279,8282],{"class":1052,"line":1279},[1050,8276,8233],{"class":7920},[1050,8278,1842],{"class":1790},[1050,8280,8281],{"class":1245},"✅ Image pushed to registry!",[1050,8283,1848],{"class":1790},[1050,8285,8286],{"class":1052,"line":1287},[1050,8287,8288],{"class":7226},"fi\n",[1026,8290,8291],{},"This comprehensive Docker guide provides everything needed to containerize Django applications effectively, from basic containers to production orchestration with Kubernetes and Docker Swarm.",[8293,8294,8295],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .scgAs, html code.shiki .scgAs{--shiki-light:#F76D47;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .suXOh, html code.shiki .suXOh{--shiki-light:#E53935;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .sq3J1, html code.shiki .sq3J1{--shiki-light:#FF5370;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}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 .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}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 .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 .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}",{"title":1045,"searchDepth":1053,"depth":1060,"links":8297},[8298,8304,8308,8313,8317],{"id":1032,"depth":1060,"text":1033,"children":8299},[8300,8301,8302,8303],{"id":1037,"depth":1071,"text":1038},{"id":1349,"depth":1071,"text":1350},{"id":1764,"depth":1071,"text":1765},{"id":2270,"depth":1071,"text":2271},{"id":3342,"depth":1060,"text":3343,"children":8305},[8306,8307],{"id":3346,"depth":1071,"text":3347},{"id":3757,"depth":1071,"text":3758},{"id":4022,"depth":1060,"text":4023,"children":8309},[8310,8311,8312],{"id":4026,"depth":1071,"text":4027},{"id":4326,"depth":1071,"text":4327},{"id":4460,"depth":1071,"text":4461},{"id":4688,"depth":1060,"text":4689,"children":8314},[8315,8316],{"id":4692,"depth":1071,"text":4693},{"id":5652,"depth":1071,"text":5653},{"id":7038,"depth":1060,"text":7039,"children":8318},[8319,8320],{"id":7042,"depth":1071,"text":7043},{"id":7895,"depth":1071,"text":7896},"md",null,{},{"title":755,"description":1028},"OyWcWu_v109I5fnQ-22q4DKxuBzIx8U4Trd1_HsMn9s",[8327,8329],{"title":751,"path":752,"stem":753,"description":8328,"children":-1},"Deploying Django applications on Linux servers provides maximum control, performance, and cost-effectiveness. This chapter covers comprehensive server setup, security hardening, service configuration, and deployment automation for Ubuntu, CentOS, and other Linux distributions.",{"title":759,"path":760,"stem":761,"description":8330,"children":-1},"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.",1772474953495]