[{"data":1,"prerenderedAt":8843},["ShallowReactive",2],{"navigation":3,"/security/secure-deployment-checklist":1016,"/security/secure-deployment-checklist-surround":8838},[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":575,"body":1018,"description":1028,"extension":8833,"links":8834,"meta":8835,"navigation":1088,"path":576,"seo":8836,"stem":577,"__hash__":8837},"docs/14.security/09.secure-deployment-checklist.md",{"type":1019,"value":1020,"toc":8797},"minimark",[1021,1025,1029,1034,1039,2302,2306,2580,2584,2588,3007,3011,3343,3347,3536,3540,3544,3727,3731,4198,4202,4206,5309,5313,5597,5601,5605,6547,6551,6555,8177,8181,8185,8622,8626,8630,8649,8653,8670,8674,8691,8695,8712,8716,8719,8722,8760,8763,8767,8770,8790,8793],[1022,1023,575],"h1",{"id":1024},"secure-deployment-checklist",[1026,1027,1028],"p",{},"Deploying Django applications securely requires careful attention to configuration, infrastructure, and operational practices. This comprehensive checklist covers all aspects of production security to ensure your application is protected against common threats and vulnerabilities.",[1030,1031,1033],"h2",{"id":1032},"pre-deployment-security-configuration","Pre-Deployment Security Configuration",[1035,1036,1038],"h3",{"id":1037},"django-settings-security","Django Settings Security",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# settings/production.py - Secure production settings\nimport os\nfrom pathlib import Path\n\n# SECURITY WARNING: keep the secret key used in production secret!\nSECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')\nif not SECRET_KEY:\n    raise ValueError(\"DJANGO_SECRET_KEY environment variable must be set\")\n\n# SECURITY WARNING: don't run with debug turned on in production!\nDEBUG = False\n\n# Allowed hosts configuration\nALLOWED_HOSTS = [\n    'yourdomain.com',\n    'www.yourdomain.com',\n    'api.yourdomain.com',\n]\n\n# Security middleware configuration\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'whitenoise.middleware.WhiteNoiseMiddleware',  # Static files\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'corsheaders.middleware.CorsMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\n# Database security\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'NAME': os.environ.get('DB_NAME'),\n        'USER': os.environ.get('DB_USER'),\n        'PASSWORD': os.environ.get('DB_PASSWORD'),\n        'HOST': os.environ.get('DB_HOST'),\n        'PORT': os.environ.get('DB_PORT', '5432'),\n        'OPTIONS': {\n            'sslmode': 'require',\n        },\n        'CONN_MAX_AGE': 600,\n    }\n}\n\n# Cache security\nCACHES = {\n    'default': {\n        'BACKEND': 'django_redis.cache.RedisCache',\n        'LOCATION': os.environ.get('REDIS_URL'),\n        'OPTIONS': {\n            'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n            'CONNECTION_POOL_KWARGS': {\n                'ssl_cert_reqs': 'required',\n                'ssl_ca_certs': '/path/to/ca-certificates.crt',\n            }\n        }\n    }\n}\n\n# Session security\nSESSION_ENGINE = 'django.contrib.sessions.backends.cache'\nSESSION_CACHE_ALIAS = 'default'\nSESSION_COOKIE_SECURE = True\nSESSION_COOKIE_HTTPONLY = True\nSESSION_COOKIE_SAMESITE = 'Strict'\nSESSION_COOKIE_AGE = 3600  # 1 hour\nSESSION_EXPIRE_AT_BROWSER_CLOSE = True\nSESSION_SAVE_EVERY_REQUEST = True\n\n# CSRF protection\nCSRF_COOKIE_SECURE = True\nCSRF_COOKIE_HTTPONLY = True\nCSRF_COOKIE_SAMESITE = 'Strict'\nCSRF_TRUSTED_ORIGINS = [\n    'https://yourdomain.com',\n    'https://www.yourdomain.com',\n]\n\n# Security headers\nSECURE_BROWSER_XSS_FILTER = True\nSECURE_CONTENT_TYPE_NOSNIFF = True\nSECURE_HSTS_SECONDS = 31536000  # 1 year\nSECURE_HSTS_INCLUDE_SUBDOMAINS = True\nSECURE_HSTS_PRELOAD = True\nSECURE_SSL_REDIRECT = True\nSECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')\n\n# X-Frame-Options\nX_FRAME_OPTIONS = 'DENY'\n\n# File upload security\nFILE_UPLOAD_MAX_MEMORY_SIZE = 5242880  # 5MB\nDATA_UPLOAD_MAX_MEMORY_SIZE = 5242880  # 5MB\nFILE_UPLOAD_PERMISSIONS = 0o644\nFILE_UPLOAD_DIRECTORY_PERMISSIONS = 0o755\n","python","",[1047,1048,1049,1058,1069,1083,1090,1096,1139,1155,1177,1182,1188,1200,1205,1211,1222,1236,1248,1260,1266,1271,1277,1287,1299,1315,1327,1339,1351,1363,1375,1387,1399,1404,1409,1415,1426,1441,1464,1498,1531,1564,1597,1639,1653,1675,1681,1699,1705,1711,1716,1722,1732,1745,1766,1799,1812,1833,1847,1869,1890,1896,1902,1907,1912,1917,1923,1939,1953,1964,1974,1989,2003,2013,2023,2028,2034,2044,2054,2068,2078,2090,2102,2107,2112,2118,2128,2138,2152,2162,2172,2182,2211,2216,2222,2237,2242,2248,2262,2274,2289],"code",{"__ignoreMap":1045},[1050,1051,1054],"span",{"class":1052,"line":1053},"line",1,[1050,1055,1057],{"class":1056},"s9Tkl","# settings/production.py - Secure production settings\n",[1050,1059,1061,1065],{"class":1052,"line":1060},2,[1050,1062,1064],{"class":1063},"siDh9","import",[1050,1066,1068],{"class":1067},"sftqT"," os\n",[1050,1070,1072,1075,1078,1080],{"class":1052,"line":1071},3,[1050,1073,1074],{"class":1063},"from",[1050,1076,1077],{"class":1067}," pathlib ",[1050,1079,1064],{"class":1063},[1050,1081,1082],{"class":1067}," Path\n",[1050,1084,1086],{"class":1052,"line":1085},4,[1050,1087,1089],{"emptyLinePlaceholder":1088},true,"\n",[1050,1091,1093],{"class":1052,"line":1092},5,[1050,1094,1095],{"class":1056},"# SECURITY WARNING: keep the secret key used in production secret!\n",[1050,1097,1099,1103,1107,1110,1113,1117,1119,1123,1126,1130,1134,1136],{"class":1052,"line":1098},6,[1050,1100,1102],{"class":1101},"se3Ec","SECRET_KEY",[1050,1104,1106],{"class":1105},"soVBu"," =",[1050,1108,1109],{"class":1067}," os",[1050,1111,1112],{"class":1105},".",[1050,1114,1116],{"class":1115},"sBPpx","environ",[1050,1118,1112],{"class":1105},[1050,1120,1122],{"class":1121},"siWMO","get",[1050,1124,1125],{"class":1105},"(",[1050,1127,1129],{"class":1128},"sbYkP","'",[1050,1131,1133],{"class":1132},"sTbE_","DJANGO_SECRET_KEY",[1050,1135,1129],{"class":1128},[1050,1137,1138],{"class":1105},")\n",[1050,1140,1142,1145,1149,1152],{"class":1052,"line":1141},7,[1050,1143,1144],{"class":1063},"if",[1050,1146,1148],{"class":1147},"sVsLi"," not",[1050,1150,1151],{"class":1101}," SECRET_KEY",[1050,1153,1154],{"class":1105},":\n",[1050,1156,1158,1161,1165,1167,1170,1173,1175],{"class":1052,"line":1157},8,[1050,1159,1160],{"class":1063},"    raise",[1050,1162,1164],{"class":1163},"sa2tF"," ValueError",[1050,1166,1125],{"class":1105},[1050,1168,1169],{"class":1128},"\"",[1050,1171,1172],{"class":1132},"DJANGO_SECRET_KEY environment variable must be set",[1050,1174,1169],{"class":1128},[1050,1176,1138],{"class":1105},[1050,1178,1180],{"class":1052,"line":1179},9,[1050,1181,1089],{"emptyLinePlaceholder":1088},[1050,1183,1185],{"class":1052,"line":1184},10,[1050,1186,1187],{"class":1056},"# SECURITY WARNING: don't run with debug turned on in production!\n",[1050,1189,1191,1194,1196],{"class":1052,"line":1190},11,[1050,1192,1193],{"class":1101},"DEBUG",[1050,1195,1106],{"class":1105},[1050,1197,1199],{"class":1198},"s8XtY"," False\n",[1050,1201,1203],{"class":1052,"line":1202},12,[1050,1204,1089],{"emptyLinePlaceholder":1088},[1050,1206,1208],{"class":1052,"line":1207},13,[1050,1209,1210],{"class":1056},"# Allowed hosts configuration\n",[1050,1212,1214,1217,1219],{"class":1052,"line":1213},14,[1050,1215,1216],{"class":1101},"ALLOWED_HOSTS",[1050,1218,1106],{"class":1105},[1050,1220,1221],{"class":1105}," [\n",[1050,1223,1225,1228,1231,1233],{"class":1052,"line":1224},15,[1050,1226,1227],{"class":1128},"    '",[1050,1229,1230],{"class":1132},"yourdomain.com",[1050,1232,1129],{"class":1128},[1050,1234,1235],{"class":1105},",\n",[1050,1237,1239,1241,1244,1246],{"class":1052,"line":1238},16,[1050,1240,1227],{"class":1128},[1050,1242,1243],{"class":1132},"www.yourdomain.com",[1050,1245,1129],{"class":1128},[1050,1247,1235],{"class":1105},[1050,1249,1251,1253,1256,1258],{"class":1052,"line":1250},17,[1050,1252,1227],{"class":1128},[1050,1254,1255],{"class":1132},"api.yourdomain.com",[1050,1257,1129],{"class":1128},[1050,1259,1235],{"class":1105},[1050,1261,1263],{"class":1052,"line":1262},18,[1050,1264,1265],{"class":1105},"]\n",[1050,1267,1269],{"class":1052,"line":1268},19,[1050,1270,1089],{"emptyLinePlaceholder":1088},[1050,1272,1274],{"class":1052,"line":1273},20,[1050,1275,1276],{"class":1056},"# Security middleware configuration\n",[1050,1278,1280,1283,1285],{"class":1052,"line":1279},21,[1050,1281,1282],{"class":1101},"MIDDLEWARE",[1050,1284,1106],{"class":1105},[1050,1286,1221],{"class":1105},[1050,1288,1290,1292,1295,1297],{"class":1052,"line":1289},22,[1050,1291,1227],{"class":1128},[1050,1293,1294],{"class":1132},"django.middleware.security.SecurityMiddleware",[1050,1296,1129],{"class":1128},[1050,1298,1235],{"class":1105},[1050,1300,1302,1304,1307,1309,1312],{"class":1052,"line":1301},23,[1050,1303,1227],{"class":1128},[1050,1305,1306],{"class":1132},"whitenoise.middleware.WhiteNoiseMiddleware",[1050,1308,1129],{"class":1128},[1050,1310,1311],{"class":1105},",",[1050,1313,1314],{"class":1056},"  # Static files\n",[1050,1316,1318,1320,1323,1325],{"class":1052,"line":1317},24,[1050,1319,1227],{"class":1128},[1050,1321,1322],{"class":1132},"django.contrib.sessions.middleware.SessionMiddleware",[1050,1324,1129],{"class":1128},[1050,1326,1235],{"class":1105},[1050,1328,1330,1332,1335,1337],{"class":1052,"line":1329},25,[1050,1331,1227],{"class":1128},[1050,1333,1334],{"class":1132},"corsheaders.middleware.CorsMiddleware",[1050,1336,1129],{"class":1128},[1050,1338,1235],{"class":1105},[1050,1340,1342,1344,1347,1349],{"class":1052,"line":1341},26,[1050,1343,1227],{"class":1128},[1050,1345,1346],{"class":1132},"django.middleware.common.CommonMiddleware",[1050,1348,1129],{"class":1128},[1050,1350,1235],{"class":1105},[1050,1352,1354,1356,1359,1361],{"class":1052,"line":1353},27,[1050,1355,1227],{"class":1128},[1050,1357,1358],{"class":1132},"django.middleware.csrf.CsrfViewMiddleware",[1050,1360,1129],{"class":1128},[1050,1362,1235],{"class":1105},[1050,1364,1366,1368,1371,1373],{"class":1052,"line":1365},28,[1050,1367,1227],{"class":1128},[1050,1369,1370],{"class":1132},"django.contrib.auth.middleware.AuthenticationMiddleware",[1050,1372,1129],{"class":1128},[1050,1374,1235],{"class":1105},[1050,1376,1378,1380,1383,1385],{"class":1052,"line":1377},29,[1050,1379,1227],{"class":1128},[1050,1381,1382],{"class":1132},"django.contrib.messages.middleware.MessageMiddleware",[1050,1384,1129],{"class":1128},[1050,1386,1235],{"class":1105},[1050,1388,1390,1392,1395,1397],{"class":1052,"line":1389},30,[1050,1391,1227],{"class":1128},[1050,1393,1394],{"class":1132},"django.middleware.clickjacking.XFrameOptionsMiddleware",[1050,1396,1129],{"class":1128},[1050,1398,1235],{"class":1105},[1050,1400,1402],{"class":1052,"line":1401},31,[1050,1403,1265],{"class":1105},[1050,1405,1407],{"class":1052,"line":1406},32,[1050,1408,1089],{"emptyLinePlaceholder":1088},[1050,1410,1412],{"class":1052,"line":1411},33,[1050,1413,1414],{"class":1056},"# Database security\n",[1050,1416,1418,1421,1423],{"class":1052,"line":1417},34,[1050,1419,1420],{"class":1101},"DATABASES",[1050,1422,1106],{"class":1105},[1050,1424,1425],{"class":1105}," {\n",[1050,1427,1429,1431,1434,1436,1439],{"class":1052,"line":1428},35,[1050,1430,1227],{"class":1128},[1050,1432,1433],{"class":1132},"default",[1050,1435,1129],{"class":1128},[1050,1437,1438],{"class":1105},":",[1050,1440,1425],{"class":1105},[1050,1442,1444,1447,1450,1452,1454,1457,1460,1462],{"class":1052,"line":1443},36,[1050,1445,1446],{"class":1128},"        '",[1050,1448,1449],{"class":1132},"ENGINE",[1050,1451,1129],{"class":1128},[1050,1453,1438],{"class":1105},[1050,1455,1456],{"class":1128}," '",[1050,1458,1459],{"class":1132},"django.db.backends.postgresql",[1050,1461,1129],{"class":1128},[1050,1463,1235],{"class":1105},[1050,1465,1467,1469,1472,1474,1476,1478,1480,1482,1484,1486,1488,1490,1493,1495],{"class":1052,"line":1466},37,[1050,1468,1446],{"class":1128},[1050,1470,1471],{"class":1132},"NAME",[1050,1473,1129],{"class":1128},[1050,1475,1438],{"class":1105},[1050,1477,1109],{"class":1067},[1050,1479,1112],{"class":1105},[1050,1481,1116],{"class":1115},[1050,1483,1112],{"class":1105},[1050,1485,1122],{"class":1121},[1050,1487,1125],{"class":1105},[1050,1489,1129],{"class":1128},[1050,1491,1492],{"class":1132},"DB_NAME",[1050,1494,1129],{"class":1128},[1050,1496,1497],{"class":1105},"),\n",[1050,1499,1501,1503,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1527,1529],{"class":1052,"line":1500},38,[1050,1502,1446],{"class":1128},[1050,1504,1505],{"class":1132},"USER",[1050,1507,1129],{"class":1128},[1050,1509,1438],{"class":1105},[1050,1511,1109],{"class":1067},[1050,1513,1112],{"class":1105},[1050,1515,1116],{"class":1115},[1050,1517,1112],{"class":1105},[1050,1519,1122],{"class":1121},[1050,1521,1125],{"class":1105},[1050,1523,1129],{"class":1128},[1050,1525,1526],{"class":1132},"DB_USER",[1050,1528,1129],{"class":1128},[1050,1530,1497],{"class":1105},[1050,1532,1534,1536,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1560,1562],{"class":1052,"line":1533},39,[1050,1535,1446],{"class":1128},[1050,1537,1538],{"class":1132},"PASSWORD",[1050,1540,1129],{"class":1128},[1050,1542,1438],{"class":1105},[1050,1544,1109],{"class":1067},[1050,1546,1112],{"class":1105},[1050,1548,1116],{"class":1115},[1050,1550,1112],{"class":1105},[1050,1552,1122],{"class":1121},[1050,1554,1125],{"class":1105},[1050,1556,1129],{"class":1128},[1050,1558,1559],{"class":1132},"DB_PASSWORD",[1050,1561,1129],{"class":1128},[1050,1563,1497],{"class":1105},[1050,1565,1567,1569,1572,1574,1576,1578,1580,1582,1584,1586,1588,1590,1593,1595],{"class":1052,"line":1566},40,[1050,1568,1446],{"class":1128},[1050,1570,1571],{"class":1132},"HOST",[1050,1573,1129],{"class":1128},[1050,1575,1438],{"class":1105},[1050,1577,1109],{"class":1067},[1050,1579,1112],{"class":1105},[1050,1581,1116],{"class":1115},[1050,1583,1112],{"class":1105},[1050,1585,1122],{"class":1121},[1050,1587,1125],{"class":1105},[1050,1589,1129],{"class":1128},[1050,1591,1592],{"class":1132},"DB_HOST",[1050,1594,1129],{"class":1128},[1050,1596,1497],{"class":1105},[1050,1598,1600,1602,1605,1607,1609,1611,1613,1615,1617,1619,1621,1623,1626,1628,1630,1632,1635,1637],{"class":1052,"line":1599},41,[1050,1601,1446],{"class":1128},[1050,1603,1604],{"class":1132},"PORT",[1050,1606,1129],{"class":1128},[1050,1608,1438],{"class":1105},[1050,1610,1109],{"class":1067},[1050,1612,1112],{"class":1105},[1050,1614,1116],{"class":1115},[1050,1616,1112],{"class":1105},[1050,1618,1122],{"class":1121},[1050,1620,1125],{"class":1105},[1050,1622,1129],{"class":1128},[1050,1624,1625],{"class":1132},"DB_PORT",[1050,1627,1129],{"class":1128},[1050,1629,1311],{"class":1105},[1050,1631,1456],{"class":1128},[1050,1633,1634],{"class":1132},"5432",[1050,1636,1129],{"class":1128},[1050,1638,1497],{"class":1105},[1050,1640,1642,1644,1647,1649,1651],{"class":1052,"line":1641},42,[1050,1643,1446],{"class":1128},[1050,1645,1646],{"class":1132},"OPTIONS",[1050,1648,1129],{"class":1128},[1050,1650,1438],{"class":1105},[1050,1652,1425],{"class":1105},[1050,1654,1656,1659,1662,1664,1666,1668,1671,1673],{"class":1052,"line":1655},43,[1050,1657,1658],{"class":1128},"            '",[1050,1660,1661],{"class":1132},"sslmode",[1050,1663,1129],{"class":1128},[1050,1665,1438],{"class":1105},[1050,1667,1456],{"class":1128},[1050,1669,1670],{"class":1132},"require",[1050,1672,1129],{"class":1128},[1050,1674,1235],{"class":1105},[1050,1676,1678],{"class":1052,"line":1677},44,[1050,1679,1680],{"class":1105},"        },\n",[1050,1682,1684,1686,1689,1691,1693,1697],{"class":1052,"line":1683},45,[1050,1685,1446],{"class":1128},[1050,1687,1688],{"class":1132},"CONN_MAX_AGE",[1050,1690,1129],{"class":1128},[1050,1692,1438],{"class":1105},[1050,1694,1696],{"class":1695},"s7CZa"," 600",[1050,1698,1235],{"class":1105},[1050,1700,1702],{"class":1052,"line":1701},46,[1050,1703,1704],{"class":1105},"    }\n",[1050,1706,1708],{"class":1052,"line":1707},47,[1050,1709,1710],{"class":1105},"}\n",[1050,1712,1714],{"class":1052,"line":1713},48,[1050,1715,1089],{"emptyLinePlaceholder":1088},[1050,1717,1719],{"class":1052,"line":1718},49,[1050,1720,1721],{"class":1056},"# Cache security\n",[1050,1723,1725,1728,1730],{"class":1052,"line":1724},50,[1050,1726,1727],{"class":1101},"CACHES",[1050,1729,1106],{"class":1105},[1050,1731,1425],{"class":1105},[1050,1733,1735,1737,1739,1741,1743],{"class":1052,"line":1734},51,[1050,1736,1227],{"class":1128},[1050,1738,1433],{"class":1132},[1050,1740,1129],{"class":1128},[1050,1742,1438],{"class":1105},[1050,1744,1425],{"class":1105},[1050,1746,1748,1750,1753,1755,1757,1759,1762,1764],{"class":1052,"line":1747},52,[1050,1749,1446],{"class":1128},[1050,1751,1752],{"class":1132},"BACKEND",[1050,1754,1129],{"class":1128},[1050,1756,1438],{"class":1105},[1050,1758,1456],{"class":1128},[1050,1760,1761],{"class":1132},"django_redis.cache.RedisCache",[1050,1763,1129],{"class":1128},[1050,1765,1235],{"class":1105},[1050,1767,1769,1771,1774,1776,1778,1780,1782,1784,1786,1788,1790,1792,1795,1797],{"class":1052,"line":1768},53,[1050,1770,1446],{"class":1128},[1050,1772,1773],{"class":1132},"LOCATION",[1050,1775,1129],{"class":1128},[1050,1777,1438],{"class":1105},[1050,1779,1109],{"class":1067},[1050,1781,1112],{"class":1105},[1050,1783,1116],{"class":1115},[1050,1785,1112],{"class":1105},[1050,1787,1122],{"class":1121},[1050,1789,1125],{"class":1105},[1050,1791,1129],{"class":1128},[1050,1793,1794],{"class":1132},"REDIS_URL",[1050,1796,1129],{"class":1128},[1050,1798,1497],{"class":1105},[1050,1800,1802,1804,1806,1808,1810],{"class":1052,"line":1801},54,[1050,1803,1446],{"class":1128},[1050,1805,1646],{"class":1132},[1050,1807,1129],{"class":1128},[1050,1809,1438],{"class":1105},[1050,1811,1425],{"class":1105},[1050,1813,1815,1817,1820,1822,1824,1826,1829,1831],{"class":1052,"line":1814},55,[1050,1816,1658],{"class":1128},[1050,1818,1819],{"class":1132},"CLIENT_CLASS",[1050,1821,1129],{"class":1128},[1050,1823,1438],{"class":1105},[1050,1825,1456],{"class":1128},[1050,1827,1828],{"class":1132},"django_redis.client.DefaultClient",[1050,1830,1129],{"class":1128},[1050,1832,1235],{"class":1105},[1050,1834,1836,1838,1841,1843,1845],{"class":1052,"line":1835},56,[1050,1837,1658],{"class":1128},[1050,1839,1840],{"class":1132},"CONNECTION_POOL_KWARGS",[1050,1842,1129],{"class":1128},[1050,1844,1438],{"class":1105},[1050,1846,1425],{"class":1105},[1050,1848,1850,1853,1856,1858,1860,1862,1865,1867],{"class":1052,"line":1849},57,[1050,1851,1852],{"class":1128},"                '",[1050,1854,1855],{"class":1132},"ssl_cert_reqs",[1050,1857,1129],{"class":1128},[1050,1859,1438],{"class":1105},[1050,1861,1456],{"class":1128},[1050,1863,1864],{"class":1132},"required",[1050,1866,1129],{"class":1128},[1050,1868,1235],{"class":1105},[1050,1870,1872,1874,1877,1879,1881,1883,1886,1888],{"class":1052,"line":1871},58,[1050,1873,1852],{"class":1128},[1050,1875,1876],{"class":1132},"ssl_ca_certs",[1050,1878,1129],{"class":1128},[1050,1880,1438],{"class":1105},[1050,1882,1456],{"class":1128},[1050,1884,1885],{"class":1132},"/path/to/ca-certificates.crt",[1050,1887,1129],{"class":1128},[1050,1889,1235],{"class":1105},[1050,1891,1893],{"class":1052,"line":1892},59,[1050,1894,1895],{"class":1105},"            }\n",[1050,1897,1899],{"class":1052,"line":1898},60,[1050,1900,1901],{"class":1105},"        }\n",[1050,1903,1905],{"class":1052,"line":1904},61,[1050,1906,1704],{"class":1105},[1050,1908,1910],{"class":1052,"line":1909},62,[1050,1911,1710],{"class":1105},[1050,1913,1915],{"class":1052,"line":1914},63,[1050,1916,1089],{"emptyLinePlaceholder":1088},[1050,1918,1920],{"class":1052,"line":1919},64,[1050,1921,1922],{"class":1056},"# Session security\n",[1050,1924,1926,1929,1931,1933,1936],{"class":1052,"line":1925},65,[1050,1927,1928],{"class":1101},"SESSION_ENGINE",[1050,1930,1106],{"class":1105},[1050,1932,1456],{"class":1128},[1050,1934,1935],{"class":1132},"django.contrib.sessions.backends.cache",[1050,1937,1938],{"class":1128},"'\n",[1050,1940,1942,1945,1947,1949,1951],{"class":1052,"line":1941},66,[1050,1943,1944],{"class":1101},"SESSION_CACHE_ALIAS",[1050,1946,1106],{"class":1105},[1050,1948,1456],{"class":1128},[1050,1950,1433],{"class":1132},[1050,1952,1938],{"class":1128},[1050,1954,1956,1959,1961],{"class":1052,"line":1955},67,[1050,1957,1958],{"class":1101},"SESSION_COOKIE_SECURE",[1050,1960,1106],{"class":1105},[1050,1962,1963],{"class":1198}," True\n",[1050,1965,1967,1970,1972],{"class":1052,"line":1966},68,[1050,1968,1969],{"class":1101},"SESSION_COOKIE_HTTPONLY",[1050,1971,1106],{"class":1105},[1050,1973,1963],{"class":1198},[1050,1975,1977,1980,1982,1984,1987],{"class":1052,"line":1976},69,[1050,1978,1979],{"class":1101},"SESSION_COOKIE_SAMESITE",[1050,1981,1106],{"class":1105},[1050,1983,1456],{"class":1128},[1050,1985,1986],{"class":1132},"Strict",[1050,1988,1938],{"class":1128},[1050,1990,1992,1995,1997,2000],{"class":1052,"line":1991},70,[1050,1993,1994],{"class":1101},"SESSION_COOKIE_AGE",[1050,1996,1106],{"class":1105},[1050,1998,1999],{"class":1695}," 3600",[1050,2001,2002],{"class":1056},"  # 1 hour\n",[1050,2004,2006,2009,2011],{"class":1052,"line":2005},71,[1050,2007,2008],{"class":1101},"SESSION_EXPIRE_AT_BROWSER_CLOSE",[1050,2010,1106],{"class":1105},[1050,2012,1963],{"class":1198},[1050,2014,2016,2019,2021],{"class":1052,"line":2015},72,[1050,2017,2018],{"class":1101},"SESSION_SAVE_EVERY_REQUEST",[1050,2020,1106],{"class":1105},[1050,2022,1963],{"class":1198},[1050,2024,2026],{"class":1052,"line":2025},73,[1050,2027,1089],{"emptyLinePlaceholder":1088},[1050,2029,2031],{"class":1052,"line":2030},74,[1050,2032,2033],{"class":1056},"# CSRF protection\n",[1050,2035,2037,2040,2042],{"class":1052,"line":2036},75,[1050,2038,2039],{"class":1101},"CSRF_COOKIE_SECURE",[1050,2041,1106],{"class":1105},[1050,2043,1963],{"class":1198},[1050,2045,2047,2050,2052],{"class":1052,"line":2046},76,[1050,2048,2049],{"class":1101},"CSRF_COOKIE_HTTPONLY",[1050,2051,1106],{"class":1105},[1050,2053,1963],{"class":1198},[1050,2055,2057,2060,2062,2064,2066],{"class":1052,"line":2056},77,[1050,2058,2059],{"class":1101},"CSRF_COOKIE_SAMESITE",[1050,2061,1106],{"class":1105},[1050,2063,1456],{"class":1128},[1050,2065,1986],{"class":1132},[1050,2067,1938],{"class":1128},[1050,2069,2071,2074,2076],{"class":1052,"line":2070},78,[1050,2072,2073],{"class":1101},"CSRF_TRUSTED_ORIGINS",[1050,2075,1106],{"class":1105},[1050,2077,1221],{"class":1105},[1050,2079,2081,2083,2086,2088],{"class":1052,"line":2080},79,[1050,2082,1227],{"class":1128},[1050,2084,2085],{"class":1132},"https://yourdomain.com",[1050,2087,1129],{"class":1128},[1050,2089,1235],{"class":1105},[1050,2091,2093,2095,2098,2100],{"class":1052,"line":2092},80,[1050,2094,1227],{"class":1128},[1050,2096,2097],{"class":1132},"https://www.yourdomain.com",[1050,2099,1129],{"class":1128},[1050,2101,1235],{"class":1105},[1050,2103,2105],{"class":1052,"line":2104},81,[1050,2106,1265],{"class":1105},[1050,2108,2110],{"class":1052,"line":2109},82,[1050,2111,1089],{"emptyLinePlaceholder":1088},[1050,2113,2115],{"class":1052,"line":2114},83,[1050,2116,2117],{"class":1056},"# Security headers\n",[1050,2119,2121,2124,2126],{"class":1052,"line":2120},84,[1050,2122,2123],{"class":1101},"SECURE_BROWSER_XSS_FILTER",[1050,2125,1106],{"class":1105},[1050,2127,1963],{"class":1198},[1050,2129,2131,2134,2136],{"class":1052,"line":2130},85,[1050,2132,2133],{"class":1101},"SECURE_CONTENT_TYPE_NOSNIFF",[1050,2135,1106],{"class":1105},[1050,2137,1963],{"class":1198},[1050,2139,2141,2144,2146,2149],{"class":1052,"line":2140},86,[1050,2142,2143],{"class":1101},"SECURE_HSTS_SECONDS",[1050,2145,1106],{"class":1105},[1050,2147,2148],{"class":1695}," 31536000",[1050,2150,2151],{"class":1056},"  # 1 year\n",[1050,2153,2155,2158,2160],{"class":1052,"line":2154},87,[1050,2156,2157],{"class":1101},"SECURE_HSTS_INCLUDE_SUBDOMAINS",[1050,2159,1106],{"class":1105},[1050,2161,1963],{"class":1198},[1050,2163,2165,2168,2170],{"class":1052,"line":2164},88,[1050,2166,2167],{"class":1101},"SECURE_HSTS_PRELOAD",[1050,2169,1106],{"class":1105},[1050,2171,1963],{"class":1198},[1050,2173,2175,2178,2180],{"class":1052,"line":2174},89,[1050,2176,2177],{"class":1101},"SECURE_SSL_REDIRECT",[1050,2179,1106],{"class":1105},[1050,2181,1963],{"class":1198},[1050,2183,2185,2188,2190,2193,2195,2198,2200,2202,2204,2207,2209],{"class":1052,"line":2184},90,[1050,2186,2187],{"class":1101},"SECURE_PROXY_SSL_HEADER",[1050,2189,1106],{"class":1105},[1050,2191,2192],{"class":1105}," (",[1050,2194,1129],{"class":1128},[1050,2196,2197],{"class":1132},"HTTP_X_FORWARDED_PROTO",[1050,2199,1129],{"class":1128},[1050,2201,1311],{"class":1105},[1050,2203,1456],{"class":1128},[1050,2205,2206],{"class":1132},"https",[1050,2208,1129],{"class":1128},[1050,2210,1138],{"class":1105},[1050,2212,2214],{"class":1052,"line":2213},91,[1050,2215,1089],{"emptyLinePlaceholder":1088},[1050,2217,2219],{"class":1052,"line":2218},92,[1050,2220,2221],{"class":1056},"# X-Frame-Options\n",[1050,2223,2225,2228,2230,2232,2235],{"class":1052,"line":2224},93,[1050,2226,2227],{"class":1101},"X_FRAME_OPTIONS",[1050,2229,1106],{"class":1105},[1050,2231,1456],{"class":1128},[1050,2233,2234],{"class":1132},"DENY",[1050,2236,1938],{"class":1128},[1050,2238,2240],{"class":1052,"line":2239},94,[1050,2241,1089],{"emptyLinePlaceholder":1088},[1050,2243,2245],{"class":1052,"line":2244},95,[1050,2246,2247],{"class":1056},"# File upload security\n",[1050,2249,2251,2254,2256,2259],{"class":1052,"line":2250},96,[1050,2252,2253],{"class":1101},"FILE_UPLOAD_MAX_MEMORY_SIZE",[1050,2255,1106],{"class":1105},[1050,2257,2258],{"class":1695}," 5242880",[1050,2260,2261],{"class":1056},"  # 5MB\n",[1050,2263,2265,2268,2270,2272],{"class":1052,"line":2264},97,[1050,2266,2267],{"class":1101},"DATA_UPLOAD_MAX_MEMORY_SIZE",[1050,2269,1106],{"class":1105},[1050,2271,2258],{"class":1695},[1050,2273,2261],{"class":1056},[1050,2275,2277,2280,2282,2286],{"class":1052,"line":2276},98,[1050,2278,2279],{"class":1101},"FILE_UPLOAD_PERMISSIONS",[1050,2281,1106],{"class":1105},[1050,2283,2285],{"class":2284},"s5Kfy"," 0o",[1050,2287,2288],{"class":1695},"644\n",[1050,2290,2292,2295,2297,2299],{"class":1052,"line":2291},99,[1050,2293,2294],{"class":1101},"FILE_UPLOAD_DIRECTORY_PERMISSIONS",[1050,2296,1106],{"class":1105},[1050,2298,2285],{"class":2284},[1050,2300,2301],{"class":1695},"755\n",[1035,2303,2305],{"id":2304},"environment-variables-configuration","Environment Variables Configuration",[1040,2307,2311],{"className":2308,"code":2309,"language":2310,"meta":1045,"style":1045},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# .env.production - Production environment variables\n# Never commit this file to version control!\n\n# Django configuration\nDJANGO_SECRET_KEY=your-super-secret-key-here-make-it-long-and-random\nDJANGO_SETTINGS_MODULE=myproject.settings.production\nADMIN_URL=secret-admin-path-12345/\nADMIN_EMAIL=admin@yourdomain.com\n\n# Database configuration\nDB_NAME=production_db\nDB_USER=db_user\nDB_PASSWORD=secure-database-password\nDB_HOST=db.internal.yourdomain.com\nDB_PORT=5432\n\n# Cache configuration\nREDIS_URL=rediss://username:password@redis.internal.yourdomain.com:6380/0\n\n# Email configuration\nEMAIL_HOST=smtp.yourdomain.com\nEMAIL_HOST_USER=noreply@yourdomain.com\nEMAIL_HOST_PASSWORD=secure-email-password\nDEFAULT_FROM_EMAIL=noreply@yourdomain.com\n\n# Third-party service keys\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# Encryption keys\nFIELD_ENCRYPTION_KEY=your-field-encryption-key\nFILE_ENCRYPTION_KEY=your-file-encryption-key\n\n# Monitoring and logging\nSENTRY_DSN=https://your-sentry-dsn@sentry.io/project-id\n","bash",[1047,2312,2313,2318,2323,2327,2332,2343,2353,2363,2373,2377,2382,2391,2400,2409,2418,2427,2431,2436,2445,2449,2454,2464,2474,2484,2493,2497,2502,2512,2522,2532,2536,2541,2551,2561,2565,2570],{"__ignoreMap":1045},[1050,2314,2315],{"class":1052,"line":1053},[1050,2316,2317],{"class":1056},"# .env.production - Production environment variables\n",[1050,2319,2320],{"class":1052,"line":1060},[1050,2321,2322],{"class":1056},"# Never commit this file to version control!\n",[1050,2324,2325],{"class":1052,"line":1071},[1050,2326,1089],{"emptyLinePlaceholder":1088},[1050,2328,2329],{"class":1052,"line":1085},[1050,2330,2331],{"class":1056},"# Django configuration\n",[1050,2333,2334,2337,2340],{"class":1052,"line":1092},[1050,2335,1133],{"class":2336},"sSC40",[1050,2338,2339],{"class":1105},"=",[1050,2341,2342],{"class":1132},"your-super-secret-key-here-make-it-long-and-random\n",[1050,2344,2345,2348,2350],{"class":1052,"line":1098},[1050,2346,2347],{"class":2336},"DJANGO_SETTINGS_MODULE",[1050,2349,2339],{"class":1105},[1050,2351,2352],{"class":1132},"myproject.settings.production\n",[1050,2354,2355,2358,2360],{"class":1052,"line":1141},[1050,2356,2357],{"class":2336},"ADMIN_URL",[1050,2359,2339],{"class":1105},[1050,2361,2362],{"class":1132},"secret-admin-path-12345/\n",[1050,2364,2365,2368,2370],{"class":1052,"line":1157},[1050,2366,2367],{"class":2336},"ADMIN_EMAIL",[1050,2369,2339],{"class":1105},[1050,2371,2372],{"class":1132},"admin@yourdomain.com\n",[1050,2374,2375],{"class":1052,"line":1179},[1050,2376,1089],{"emptyLinePlaceholder":1088},[1050,2378,2379],{"class":1052,"line":1184},[1050,2380,2381],{"class":1056},"# Database configuration\n",[1050,2383,2384,2386,2388],{"class":1052,"line":1190},[1050,2385,1492],{"class":2336},[1050,2387,2339],{"class":1105},[1050,2389,2390],{"class":1132},"production_db\n",[1050,2392,2393,2395,2397],{"class":1052,"line":1202},[1050,2394,1526],{"class":2336},[1050,2396,2339],{"class":1105},[1050,2398,2399],{"class":1132},"db_user\n",[1050,2401,2402,2404,2406],{"class":1052,"line":1207},[1050,2403,1559],{"class":2336},[1050,2405,2339],{"class":1105},[1050,2407,2408],{"class":1132},"secure-database-password\n",[1050,2410,2411,2413,2415],{"class":1052,"line":1213},[1050,2412,1592],{"class":2336},[1050,2414,2339],{"class":1105},[1050,2416,2417],{"class":1132},"db.internal.yourdomain.com\n",[1050,2419,2420,2422,2424],{"class":1052,"line":1224},[1050,2421,1625],{"class":2336},[1050,2423,2339],{"class":1105},[1050,2425,2426],{"class":1132},"5432\n",[1050,2428,2429],{"class":1052,"line":1238},[1050,2430,1089],{"emptyLinePlaceholder":1088},[1050,2432,2433],{"class":1052,"line":1250},[1050,2434,2435],{"class":1056},"# Cache configuration\n",[1050,2437,2438,2440,2442],{"class":1052,"line":1262},[1050,2439,1794],{"class":2336},[1050,2441,2339],{"class":1105},[1050,2443,2444],{"class":1132},"rediss://username:password@redis.internal.yourdomain.com:6380/0\n",[1050,2446,2447],{"class":1052,"line":1268},[1050,2448,1089],{"emptyLinePlaceholder":1088},[1050,2450,2451],{"class":1052,"line":1273},[1050,2452,2453],{"class":1056},"# Email configuration\n",[1050,2455,2456,2459,2461],{"class":1052,"line":1279},[1050,2457,2458],{"class":2336},"EMAIL_HOST",[1050,2460,2339],{"class":1105},[1050,2462,2463],{"class":1132},"smtp.yourdomain.com\n",[1050,2465,2466,2469,2471],{"class":1052,"line":1289},[1050,2467,2468],{"class":2336},"EMAIL_HOST_USER",[1050,2470,2339],{"class":1105},[1050,2472,2473],{"class":1132},"noreply@yourdomain.com\n",[1050,2475,2476,2479,2481],{"class":1052,"line":1301},[1050,2477,2478],{"class":2336},"EMAIL_HOST_PASSWORD",[1050,2480,2339],{"class":1105},[1050,2482,2483],{"class":1132},"secure-email-password\n",[1050,2485,2486,2489,2491],{"class":1052,"line":1317},[1050,2487,2488],{"class":2336},"DEFAULT_FROM_EMAIL",[1050,2490,2339],{"class":1105},[1050,2492,2473],{"class":1132},[1050,2494,2495],{"class":1052,"line":1329},[1050,2496,1089],{"emptyLinePlaceholder":1088},[1050,2498,2499],{"class":1052,"line":1341},[1050,2500,2501],{"class":1056},"# Third-party service keys\n",[1050,2503,2504,2507,2509],{"class":1052,"line":1353},[1050,2505,2506],{"class":2336},"AWS_ACCESS_KEY_ID",[1050,2508,2339],{"class":1105},[1050,2510,2511],{"class":1132},"your-aws-access-key\n",[1050,2513,2514,2517,2519],{"class":1052,"line":1365},[1050,2515,2516],{"class":2336},"AWS_SECRET_ACCESS_KEY",[1050,2518,2339],{"class":1105},[1050,2520,2521],{"class":1132},"your-aws-secret-key\n",[1050,2523,2524,2527,2529],{"class":1052,"line":1377},[1050,2525,2526],{"class":2336},"AWS_STORAGE_BUCKET_NAME",[1050,2528,2339],{"class":1105},[1050,2530,2531],{"class":1132},"your-s3-bucket\n",[1050,2533,2534],{"class":1052,"line":1389},[1050,2535,1089],{"emptyLinePlaceholder":1088},[1050,2537,2538],{"class":1052,"line":1401},[1050,2539,2540],{"class":1056},"# Encryption keys\n",[1050,2542,2543,2546,2548],{"class":1052,"line":1406},[1050,2544,2545],{"class":2336},"FIELD_ENCRYPTION_KEY",[1050,2547,2339],{"class":1105},[1050,2549,2550],{"class":1132},"your-field-encryption-key\n",[1050,2552,2553,2556,2558],{"class":1052,"line":1411},[1050,2554,2555],{"class":2336},"FILE_ENCRYPTION_KEY",[1050,2557,2339],{"class":1105},[1050,2559,2560],{"class":1132},"your-file-encryption-key\n",[1050,2562,2563],{"class":1052,"line":1417},[1050,2564,1089],{"emptyLinePlaceholder":1088},[1050,2566,2567],{"class":1052,"line":1428},[1050,2568,2569],{"class":1056},"# Monitoring and logging\n",[1050,2571,2572,2575,2577],{"class":1052,"line":1443},[1050,2573,2574],{"class":2336},"SENTRY_DSN",[1050,2576,2339],{"class":1105},[1050,2578,2579],{"class":1132},"https://your-sentry-dsn@sentry.io/project-id\n",[1030,2581,2583],{"id":2582},"server-infrastructure-security","Server Infrastructure Security",[1035,2585,2587],{"id":2586},"web-server-configuration-nginx","Web Server Configuration (Nginx)",[1040,2589,2593],{"className":2590,"code":2591,"language":2592,"meta":1045,"style":1045},"language-nginx shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# /etc/nginx/sites-available/yourdomain.com\nserver {\n    listen 80;\n    server_name yourdomain.com www.yourdomain.com;\n    \n    # Redirect all HTTP to HTTPS\n    return 301 https://$server_name$request_uri;\n}\n\nserver {\n    listen 443 ssl http2;\n    server_name yourdomain.com www.yourdomain.com;\n    \n    # SSL Configuration\n    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;\n    ssl_session_timeout 1d;\n    ssl_session_cache shared:MozTLS:10m;\n    ssl_session_tickets off;\n    \n    # Modern SSL configuration\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;\n    ssl_prefer_server_ciphers off;\n    \n    # HSTS\n    add_header Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\" always;\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    add_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\n    \n    # Hide server information\n    server_tokens off;\n    \n    # Rate limiting\n    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;\n    limit_req_zone $binary_remote_addr zone=api:10m rate=100r/m;\n    \n    # Main application\n    location / {\n        proxy_pass http://127.0.0.1:8000;\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    \n    # Admin interface with rate limiting\n    location /secret-admin-path-12345/ {\n        limit_req zone=login burst=5 nodelay;\n        \n        proxy_pass http://127.0.0.1:8000;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        \n        # Additional security for admin\n        allow 192.168.1.0/24;  # Office IP range\n        allow 10.0.0.0/8;      # VPN range\n        deny all;\n    }\n    \n    # Static files\n    location /static/ {\n        alias /path/to/your/staticfiles/;\n        expires 1y;\n        add_header Cache-Control \"public, immutable\";\n    }\n    \n    # Media files with security\n    location /media/ {\n        alias /path/to/your/media/;\n        \n        # Prevent execution of uploaded files\n        location ~* \\.(php|pl|py|jsp|asp|sh|cgi)$ {\n            deny all;\n        }\n    }\n}\n","nginx",[1047,2594,2595,2600,2605,2610,2615,2620,2625,2630,2634,2638,2642,2647,2651,2655,2660,2665,2670,2675,2680,2685,2689,2694,2699,2704,2709,2713,2718,2723,2727,2732,2737,2742,2747,2752,2756,2761,2766,2770,2775,2780,2785,2789,2794,2799,2804,2809,2814,2819,2824,2829,2834,2839,2844,2849,2853,2857,2862,2867,2872,2876,2880,2884,2888,2892,2896,2900,2905,2910,2915,2920,2924,2928,2933,2938,2943,2948,2953,2957,2961,2966,2971,2976,2980,2985,2990,2995,2999,3003],{"__ignoreMap":1045},[1050,2596,2597],{"class":1052,"line":1053},[1050,2598,2599],{},"# /etc/nginx/sites-available/yourdomain.com\n",[1050,2601,2602],{"class":1052,"line":1060},[1050,2603,2604],{},"server {\n",[1050,2606,2607],{"class":1052,"line":1071},[1050,2608,2609],{},"    listen 80;\n",[1050,2611,2612],{"class":1052,"line":1085},[1050,2613,2614],{},"    server_name yourdomain.com www.yourdomain.com;\n",[1050,2616,2617],{"class":1052,"line":1092},[1050,2618,2619],{},"    \n",[1050,2621,2622],{"class":1052,"line":1098},[1050,2623,2624],{},"    # Redirect all HTTP to HTTPS\n",[1050,2626,2627],{"class":1052,"line":1141},[1050,2628,2629],{},"    return 301 https://$server_name$request_uri;\n",[1050,2631,2632],{"class":1052,"line":1157},[1050,2633,1710],{},[1050,2635,2636],{"class":1052,"line":1179},[1050,2637,1089],{"emptyLinePlaceholder":1088},[1050,2639,2640],{"class":1052,"line":1184},[1050,2641,2604],{},[1050,2643,2644],{"class":1052,"line":1190},[1050,2645,2646],{},"    listen 443 ssl http2;\n",[1050,2648,2649],{"class":1052,"line":1202},[1050,2650,2614],{},[1050,2652,2653],{"class":1052,"line":1207},[1050,2654,2619],{},[1050,2656,2657],{"class":1052,"line":1213},[1050,2658,2659],{},"    # SSL Configuration\n",[1050,2661,2662],{"class":1052,"line":1224},[1050,2663,2664],{},"    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;\n",[1050,2666,2667],{"class":1052,"line":1238},[1050,2668,2669],{},"    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;\n",[1050,2671,2672],{"class":1052,"line":1250},[1050,2673,2674],{},"    ssl_session_timeout 1d;\n",[1050,2676,2677],{"class":1052,"line":1262},[1050,2678,2679],{},"    ssl_session_cache shared:MozTLS:10m;\n",[1050,2681,2682],{"class":1052,"line":1268},[1050,2683,2684],{},"    ssl_session_tickets off;\n",[1050,2686,2687],{"class":1052,"line":1273},[1050,2688,2619],{},[1050,2690,2691],{"class":1052,"line":1279},[1050,2692,2693],{},"    # Modern SSL configuration\n",[1050,2695,2696],{"class":1052,"line":1289},[1050,2697,2698],{},"    ssl_protocols TLSv1.2 TLSv1.3;\n",[1050,2700,2701],{"class":1052,"line":1301},[1050,2702,2703],{},"    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;\n",[1050,2705,2706],{"class":1052,"line":1317},[1050,2707,2708],{},"    ssl_prefer_server_ciphers off;\n",[1050,2710,2711],{"class":1052,"line":1329},[1050,2712,2619],{},[1050,2714,2715],{"class":1052,"line":1341},[1050,2716,2717],{},"    # HSTS\n",[1050,2719,2720],{"class":1052,"line":1353},[1050,2721,2722],{},"    add_header Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\" always;\n",[1050,2724,2725],{"class":1052,"line":1365},[1050,2726,2619],{},[1050,2728,2729],{"class":1052,"line":1377},[1050,2730,2731],{},"    # Security headers\n",[1050,2733,2734],{"class":1052,"line":1389},[1050,2735,2736],{},"    add_header X-Frame-Options \"DENY\" always;\n",[1050,2738,2739],{"class":1052,"line":1401},[1050,2740,2741],{},"    add_header X-Content-Type-Options \"nosniff\" always;\n",[1050,2743,2744],{"class":1052,"line":1406},[1050,2745,2746],{},"    add_header X-XSS-Protection \"1; mode=block\" always;\n",[1050,2748,2749],{"class":1052,"line":1411},[1050,2750,2751],{},"    add_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\n",[1050,2753,2754],{"class":1052,"line":1417},[1050,2755,2619],{},[1050,2757,2758],{"class":1052,"line":1428},[1050,2759,2760],{},"    # Hide server information\n",[1050,2762,2763],{"class":1052,"line":1443},[1050,2764,2765],{},"    server_tokens off;\n",[1050,2767,2768],{"class":1052,"line":1466},[1050,2769,2619],{},[1050,2771,2772],{"class":1052,"line":1500},[1050,2773,2774],{},"    # Rate limiting\n",[1050,2776,2777],{"class":1052,"line":1533},[1050,2778,2779],{},"    limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;\n",[1050,2781,2782],{"class":1052,"line":1566},[1050,2783,2784],{},"    limit_req_zone $binary_remote_addr zone=api:10m rate=100r/m;\n",[1050,2786,2787],{"class":1052,"line":1599},[1050,2788,2619],{},[1050,2790,2791],{"class":1052,"line":1641},[1050,2792,2793],{},"    # Main application\n",[1050,2795,2796],{"class":1052,"line":1655},[1050,2797,2798],{},"    location / {\n",[1050,2800,2801],{"class":1052,"line":1677},[1050,2802,2803],{},"        proxy_pass http://127.0.0.1:8000;\n",[1050,2805,2806],{"class":1052,"line":1683},[1050,2807,2808],{},"        proxy_set_header Host $host;\n",[1050,2810,2811],{"class":1052,"line":1701},[1050,2812,2813],{},"        proxy_set_header X-Real-IP $remote_addr;\n",[1050,2815,2816],{"class":1052,"line":1707},[1050,2817,2818],{},"        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n",[1050,2820,2821],{"class":1052,"line":1713},[1050,2822,2823],{},"        proxy_set_header X-Forwarded-Proto $scheme;\n",[1050,2825,2826],{"class":1052,"line":1718},[1050,2827,2828],{},"        \n",[1050,2830,2831],{"class":1052,"line":1724},[1050,2832,2833],{},"        # Timeouts\n",[1050,2835,2836],{"class":1052,"line":1734},[1050,2837,2838],{},"        proxy_connect_timeout 60s;\n",[1050,2840,2841],{"class":1052,"line":1747},[1050,2842,2843],{},"        proxy_send_timeout 60s;\n",[1050,2845,2846],{"class":1052,"line":1768},[1050,2847,2848],{},"        proxy_read_timeout 60s;\n",[1050,2850,2851],{"class":1052,"line":1801},[1050,2852,1704],{},[1050,2854,2855],{"class":1052,"line":1814},[1050,2856,2619],{},[1050,2858,2859],{"class":1052,"line":1835},[1050,2860,2861],{},"    # Admin interface with rate limiting\n",[1050,2863,2864],{"class":1052,"line":1849},[1050,2865,2866],{},"    location /secret-admin-path-12345/ {\n",[1050,2868,2869],{"class":1052,"line":1871},[1050,2870,2871],{},"        limit_req zone=login burst=5 nodelay;\n",[1050,2873,2874],{"class":1052,"line":1892},[1050,2875,2828],{},[1050,2877,2878],{"class":1052,"line":1898},[1050,2879,2803],{},[1050,2881,2882],{"class":1052,"line":1904},[1050,2883,2808],{},[1050,2885,2886],{"class":1052,"line":1909},[1050,2887,2813],{},[1050,2889,2890],{"class":1052,"line":1914},[1050,2891,2818],{},[1050,2893,2894],{"class":1052,"line":1919},[1050,2895,2823],{},[1050,2897,2898],{"class":1052,"line":1925},[1050,2899,2828],{},[1050,2901,2902],{"class":1052,"line":1941},[1050,2903,2904],{},"        # Additional security for admin\n",[1050,2906,2907],{"class":1052,"line":1955},[1050,2908,2909],{},"        allow 192.168.1.0/24;  # Office IP range\n",[1050,2911,2912],{"class":1052,"line":1966},[1050,2913,2914],{},"        allow 10.0.0.0/8;      # VPN range\n",[1050,2916,2917],{"class":1052,"line":1976},[1050,2918,2919],{},"        deny all;\n",[1050,2921,2922],{"class":1052,"line":1991},[1050,2923,1704],{},[1050,2925,2926],{"class":1052,"line":2005},[1050,2927,2619],{},[1050,2929,2930],{"class":1052,"line":2015},[1050,2931,2932],{},"    # Static files\n",[1050,2934,2935],{"class":1052,"line":2025},[1050,2936,2937],{},"    location /static/ {\n",[1050,2939,2940],{"class":1052,"line":2030},[1050,2941,2942],{},"        alias /path/to/your/staticfiles/;\n",[1050,2944,2945],{"class":1052,"line":2036},[1050,2946,2947],{},"        expires 1y;\n",[1050,2949,2950],{"class":1052,"line":2046},[1050,2951,2952],{},"        add_header Cache-Control \"public, immutable\";\n",[1050,2954,2955],{"class":1052,"line":2056},[1050,2956,1704],{},[1050,2958,2959],{"class":1052,"line":2070},[1050,2960,2619],{},[1050,2962,2963],{"class":1052,"line":2080},[1050,2964,2965],{},"    # Media files with security\n",[1050,2967,2968],{"class":1052,"line":2092},[1050,2969,2970],{},"    location /media/ {\n",[1050,2972,2973],{"class":1052,"line":2104},[1050,2974,2975],{},"        alias /path/to/your/media/;\n",[1050,2977,2978],{"class":1052,"line":2109},[1050,2979,2828],{},[1050,2981,2982],{"class":1052,"line":2114},[1050,2983,2984],{},"        # Prevent execution of uploaded files\n",[1050,2986,2987],{"class":1052,"line":2120},[1050,2988,2989],{},"        location ~* \\.(php|pl|py|jsp|asp|sh|cgi)$ {\n",[1050,2991,2992],{"class":1052,"line":2130},[1050,2993,2994],{},"            deny all;\n",[1050,2996,2997],{"class":1052,"line":2140},[1050,2998,1901],{},[1050,3000,3001],{"class":1052,"line":2154},[1050,3002,1704],{},[1050,3004,3005],{"class":1052,"line":2164},[1050,3006,1710],{},[1035,3008,3010],{"id":3009},"application-server-configuration-gunicorn","Application Server Configuration (Gunicorn)",[1040,3012,3014],{"className":1042,"code":3013,"language":1044,"meta":1045,"style":1045},"# gunicorn.conf.py - Secure Gunicorn configuration\nimport multiprocessing\nimport os\n\n# Server socket\nbind = \"127.0.0.1:8000\"\nbacklog = 2048\n\n# Worker processes\nworkers = multiprocessing.cpu_count() * 2 + 1\nworker_class = \"sync\"\nworker_connections = 1000\ntimeout = 30\nkeepalive = 2\nmax_requests = 1000\nmax_requests_jitter = 50\n\n# Security\nlimit_request_line = 4094\nlimit_request_fields = 100\nlimit_request_field_size = 8190\n\n# Logging\naccesslog = \"/var/log/gunicorn/access.log\"\nerrorlog = \"/var/log/gunicorn/error.log\"\nloglevel = \"info\"\n\n# Process naming\nproc_name = \"django_app\"\n\n# Server mechanics\ndaemon = False\npidfile = \"/var/run/gunicorn/django.pid\"\nuser = \"django\"\ngroup = \"django\"\n",[1047,3015,3016,3021,3028,3034,3038,3043,3059,3069,3073,3078,3108,3122,3132,3142,3152,3161,3171,3175,3180,3190,3200,3210,3214,3219,3233,3247,3261,3265,3270,3284,3288,3293,3302,3316,3330],{"__ignoreMap":1045},[1050,3017,3018],{"class":1052,"line":1053},[1050,3019,3020],{"class":1056},"# gunicorn.conf.py - Secure Gunicorn configuration\n",[1050,3022,3023,3025],{"class":1052,"line":1060},[1050,3024,1064],{"class":1063},[1050,3026,3027],{"class":1067}," multiprocessing\n",[1050,3029,3030,3032],{"class":1052,"line":1071},[1050,3031,1064],{"class":1063},[1050,3033,1068],{"class":1067},[1050,3035,3036],{"class":1052,"line":1085},[1050,3037,1089],{"emptyLinePlaceholder":1088},[1050,3039,3040],{"class":1052,"line":1092},[1050,3041,3042],{"class":1056},"# Server socket\n",[1050,3044,3045,3048,3050,3053,3056],{"class":1052,"line":1098},[1050,3046,3047],{"class":1067},"bind ",[1050,3049,2339],{"class":1105},[1050,3051,3052],{"class":1128}," \"",[1050,3054,3055],{"class":1132},"127.0.0.1:8000",[1050,3057,3058],{"class":1128},"\"\n",[1050,3060,3061,3064,3066],{"class":1052,"line":1141},[1050,3062,3063],{"class":1067},"backlog ",[1050,3065,2339],{"class":1105},[1050,3067,3068],{"class":1695}," 2048\n",[1050,3070,3071],{"class":1052,"line":1157},[1050,3072,1089],{"emptyLinePlaceholder":1088},[1050,3074,3075],{"class":1052,"line":1179},[1050,3076,3077],{"class":1056},"# Worker processes\n",[1050,3079,3080,3083,3085,3088,3090,3093,3096,3099,3102,3105],{"class":1052,"line":1184},[1050,3081,3082],{"class":1067},"workers ",[1050,3084,2339],{"class":1105},[1050,3086,3087],{"class":1067}," multiprocessing",[1050,3089,1112],{"class":1105},[1050,3091,3092],{"class":1121},"cpu_count",[1050,3094,3095],{"class":1105},"()",[1050,3097,3098],{"class":1147}," *",[1050,3100,3101],{"class":1695}," 2",[1050,3103,3104],{"class":1147}," +",[1050,3106,3107],{"class":1695}," 1\n",[1050,3109,3110,3113,3115,3117,3120],{"class":1052,"line":1190},[1050,3111,3112],{"class":1067},"worker_class ",[1050,3114,2339],{"class":1105},[1050,3116,3052],{"class":1128},[1050,3118,3119],{"class":1132},"sync",[1050,3121,3058],{"class":1128},[1050,3123,3124,3127,3129],{"class":1052,"line":1202},[1050,3125,3126],{"class":1067},"worker_connections ",[1050,3128,2339],{"class":1105},[1050,3130,3131],{"class":1695}," 1000\n",[1050,3133,3134,3137,3139],{"class":1052,"line":1207},[1050,3135,3136],{"class":1067},"timeout ",[1050,3138,2339],{"class":1105},[1050,3140,3141],{"class":1695}," 30\n",[1050,3143,3144,3147,3149],{"class":1052,"line":1213},[1050,3145,3146],{"class":1067},"keepalive ",[1050,3148,2339],{"class":1105},[1050,3150,3151],{"class":1695}," 2\n",[1050,3153,3154,3157,3159],{"class":1052,"line":1224},[1050,3155,3156],{"class":1067},"max_requests ",[1050,3158,2339],{"class":1105},[1050,3160,3131],{"class":1695},[1050,3162,3163,3166,3168],{"class":1052,"line":1238},[1050,3164,3165],{"class":1067},"max_requests_jitter ",[1050,3167,2339],{"class":1105},[1050,3169,3170],{"class":1695}," 50\n",[1050,3172,3173],{"class":1052,"line":1250},[1050,3174,1089],{"emptyLinePlaceholder":1088},[1050,3176,3177],{"class":1052,"line":1262},[1050,3178,3179],{"class":1056},"# Security\n",[1050,3181,3182,3185,3187],{"class":1052,"line":1268},[1050,3183,3184],{"class":1067},"limit_request_line ",[1050,3186,2339],{"class":1105},[1050,3188,3189],{"class":1695}," 4094\n",[1050,3191,3192,3195,3197],{"class":1052,"line":1273},[1050,3193,3194],{"class":1067},"limit_request_fields ",[1050,3196,2339],{"class":1105},[1050,3198,3199],{"class":1695}," 100\n",[1050,3201,3202,3205,3207],{"class":1052,"line":1279},[1050,3203,3204],{"class":1067},"limit_request_field_size ",[1050,3206,2339],{"class":1105},[1050,3208,3209],{"class":1695}," 8190\n",[1050,3211,3212],{"class":1052,"line":1289},[1050,3213,1089],{"emptyLinePlaceholder":1088},[1050,3215,3216],{"class":1052,"line":1301},[1050,3217,3218],{"class":1056},"# Logging\n",[1050,3220,3221,3224,3226,3228,3231],{"class":1052,"line":1317},[1050,3222,3223],{"class":1067},"accesslog ",[1050,3225,2339],{"class":1105},[1050,3227,3052],{"class":1128},[1050,3229,3230],{"class":1132},"/var/log/gunicorn/access.log",[1050,3232,3058],{"class":1128},[1050,3234,3235,3238,3240,3242,3245],{"class":1052,"line":1329},[1050,3236,3237],{"class":1067},"errorlog ",[1050,3239,2339],{"class":1105},[1050,3241,3052],{"class":1128},[1050,3243,3244],{"class":1132},"/var/log/gunicorn/error.log",[1050,3246,3058],{"class":1128},[1050,3248,3249,3252,3254,3256,3259],{"class":1052,"line":1341},[1050,3250,3251],{"class":1067},"loglevel ",[1050,3253,2339],{"class":1105},[1050,3255,3052],{"class":1128},[1050,3257,3258],{"class":1132},"info",[1050,3260,3058],{"class":1128},[1050,3262,3263],{"class":1052,"line":1353},[1050,3264,1089],{"emptyLinePlaceholder":1088},[1050,3266,3267],{"class":1052,"line":1365},[1050,3268,3269],{"class":1056},"# Process naming\n",[1050,3271,3272,3275,3277,3279,3282],{"class":1052,"line":1377},[1050,3273,3274],{"class":1067},"proc_name ",[1050,3276,2339],{"class":1105},[1050,3278,3052],{"class":1128},[1050,3280,3281],{"class":1132},"django_app",[1050,3283,3058],{"class":1128},[1050,3285,3286],{"class":1052,"line":1389},[1050,3287,1089],{"emptyLinePlaceholder":1088},[1050,3289,3290],{"class":1052,"line":1401},[1050,3291,3292],{"class":1056},"# Server mechanics\n",[1050,3294,3295,3298,3300],{"class":1052,"line":1406},[1050,3296,3297],{"class":1067},"daemon ",[1050,3299,2339],{"class":1105},[1050,3301,1199],{"class":1198},[1050,3303,3304,3307,3309,3311,3314],{"class":1052,"line":1411},[1050,3305,3306],{"class":1067},"pidfile ",[1050,3308,2339],{"class":1105},[1050,3310,3052],{"class":1128},[1050,3312,3313],{"class":1132},"/var/run/gunicorn/django.pid",[1050,3315,3058],{"class":1128},[1050,3317,3318,3321,3323,3325,3328],{"class":1052,"line":1417},[1050,3319,3320],{"class":1067},"user ",[1050,3322,2339],{"class":1105},[1050,3324,3052],{"class":1128},[1050,3326,3327],{"class":1132},"django",[1050,3329,3058],{"class":1128},[1050,3331,3332,3335,3337,3339,3341],{"class":1052,"line":1428},[1050,3333,3334],{"class":1067},"group ",[1050,3336,2339],{"class":1105},[1050,3338,3052],{"class":1128},[1050,3340,3327],{"class":1132},[1050,3342,3058],{"class":1128},[1035,3344,3346],{"id":3345},"systemd-service-configuration","Systemd Service Configuration",[1040,3348,3352],{"className":3349,"code":3350,"language":3351,"meta":1045,"style":1045},"language-ini shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# /etc/systemd/system/django.service\n[Unit]\nDescription=Django Application\nAfter=network.target postgresql.service redis.service\nRequires=postgresql.service redis.service\n\n[Service]\nType=notify\nUser=django\nGroup=django\nWorkingDirectory=/opt/django-app\nEnvironment=DJANGO_SETTINGS_MODULE=myproject.settings.production\nEnvironmentFile=/opt/django-app/.env.production\nExecStart=/opt/django-app/venv/bin/gunicorn --config /opt/django-app/gunicorn.conf.py myproject.wsgi:application\nExecReload=/bin/kill -s HUP $MAINPID\nKillMode=mixed\nTimeoutStopSec=5\nPrivateTmp=true\nRestart=on-failure\nRestartSec=5\n\n# Security settings\nNoNewPrivileges=true\nProtectSystem=strict\nProtectHome=true\nReadWritePaths=/opt/django-app/media /var/log/django /var/log/gunicorn\nPrivateDevices=true\nProtectKernelTunables=true\nProtectKernelModules=true\nProtectControlGroups=true\nRestrictRealtime=true\nRestrictSUIDSGID=true\nLockPersonality=true\nMemoryDenyWriteExecute=true\n\n[Install]\nWantedBy=multi-user.target\n","ini",[1047,3353,3354,3359,3364,3369,3374,3379,3383,3388,3393,3398,3403,3408,3413,3418,3423,3428,3433,3438,3443,3448,3453,3457,3462,3467,3472,3477,3482,3487,3492,3497,3502,3507,3512,3517,3522,3526,3531],{"__ignoreMap":1045},[1050,3355,3356],{"class":1052,"line":1053},[1050,3357,3358],{},"# /etc/systemd/system/django.service\n",[1050,3360,3361],{"class":1052,"line":1060},[1050,3362,3363],{},"[Unit]\n",[1050,3365,3366],{"class":1052,"line":1071},[1050,3367,3368],{},"Description=Django Application\n",[1050,3370,3371],{"class":1052,"line":1085},[1050,3372,3373],{},"After=network.target postgresql.service redis.service\n",[1050,3375,3376],{"class":1052,"line":1092},[1050,3377,3378],{},"Requires=postgresql.service redis.service\n",[1050,3380,3381],{"class":1052,"line":1098},[1050,3382,1089],{"emptyLinePlaceholder":1088},[1050,3384,3385],{"class":1052,"line":1141},[1050,3386,3387],{},"[Service]\n",[1050,3389,3390],{"class":1052,"line":1157},[1050,3391,3392],{},"Type=notify\n",[1050,3394,3395],{"class":1052,"line":1179},[1050,3396,3397],{},"User=django\n",[1050,3399,3400],{"class":1052,"line":1184},[1050,3401,3402],{},"Group=django\n",[1050,3404,3405],{"class":1052,"line":1190},[1050,3406,3407],{},"WorkingDirectory=/opt/django-app\n",[1050,3409,3410],{"class":1052,"line":1202},[1050,3411,3412],{},"Environment=DJANGO_SETTINGS_MODULE=myproject.settings.production\n",[1050,3414,3415],{"class":1052,"line":1207},[1050,3416,3417],{},"EnvironmentFile=/opt/django-app/.env.production\n",[1050,3419,3420],{"class":1052,"line":1213},[1050,3421,3422],{},"ExecStart=/opt/django-app/venv/bin/gunicorn --config /opt/django-app/gunicorn.conf.py myproject.wsgi:application\n",[1050,3424,3425],{"class":1052,"line":1224},[1050,3426,3427],{},"ExecReload=/bin/kill -s HUP $MAINPID\n",[1050,3429,3430],{"class":1052,"line":1238},[1050,3431,3432],{},"KillMode=mixed\n",[1050,3434,3435],{"class":1052,"line":1250},[1050,3436,3437],{},"TimeoutStopSec=5\n",[1050,3439,3440],{"class":1052,"line":1262},[1050,3441,3442],{},"PrivateTmp=true\n",[1050,3444,3445],{"class":1052,"line":1268},[1050,3446,3447],{},"Restart=on-failure\n",[1050,3449,3450],{"class":1052,"line":1273},[1050,3451,3452],{},"RestartSec=5\n",[1050,3454,3455],{"class":1052,"line":1279},[1050,3456,1089],{"emptyLinePlaceholder":1088},[1050,3458,3459],{"class":1052,"line":1289},[1050,3460,3461],{},"# Security settings\n",[1050,3463,3464],{"class":1052,"line":1301},[1050,3465,3466],{},"NoNewPrivileges=true\n",[1050,3468,3469],{"class":1052,"line":1317},[1050,3470,3471],{},"ProtectSystem=strict\n",[1050,3473,3474],{"class":1052,"line":1329},[1050,3475,3476],{},"ProtectHome=true\n",[1050,3478,3479],{"class":1052,"line":1341},[1050,3480,3481],{},"ReadWritePaths=/opt/django-app/media /var/log/django /var/log/gunicorn\n",[1050,3483,3484],{"class":1052,"line":1353},[1050,3485,3486],{},"PrivateDevices=true\n",[1050,3488,3489],{"class":1052,"line":1365},[1050,3490,3491],{},"ProtectKernelTunables=true\n",[1050,3493,3494],{"class":1052,"line":1377},[1050,3495,3496],{},"ProtectKernelModules=true\n",[1050,3498,3499],{"class":1052,"line":1389},[1050,3500,3501],{},"ProtectControlGroups=true\n",[1050,3503,3504],{"class":1052,"line":1401},[1050,3505,3506],{},"RestrictRealtime=true\n",[1050,3508,3509],{"class":1052,"line":1406},[1050,3510,3511],{},"RestrictSUIDSGID=true\n",[1050,3513,3514],{"class":1052,"line":1411},[1050,3515,3516],{},"LockPersonality=true\n",[1050,3518,3519],{"class":1052,"line":1417},[1050,3520,3521],{},"MemoryDenyWriteExecute=true\n",[1050,3523,3524],{"class":1052,"line":1428},[1050,3525,1089],{"emptyLinePlaceholder":1088},[1050,3527,3528],{"class":1052,"line":1443},[1050,3529,3530],{},"[Install]\n",[1050,3532,3533],{"class":1052,"line":1466},[1050,3534,3535],{},"WantedBy=multi-user.target\n",[1030,3537,3539],{"id":3538},"database-security","Database Security",[1035,3541,3543],{"id":3542},"postgresql-security-configuration","PostgreSQL Security Configuration",[1040,3545,3549],{"className":3546,"code":3547,"language":3548,"meta":1045,"style":1045},"language-sql shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","-- Database security setup\n-- Create dedicated database user\nCREATE USER django_user WITH PASSWORD 'secure_password';\n\n-- Create database\nCREATE DATABASE django_production OWNER django_user;\n\n-- Grant minimal required permissions\nGRANT CONNECT ON DATABASE django_production TO django_user;\nGRANT USAGE ON SCHEMA public TO django_user;\nGRANT CREATE ON SCHEMA public TO django_user;\n\n-- Revoke unnecessary permissions\nREVOKE ALL ON DATABASE django_production FROM PUBLIC;\nREVOKE ALL ON SCHEMA public FROM PUBLIC;\n","sql",[1047,3550,3551,3556,3561,3590,3594,3599,3615,3619,3624,3645,3665,3682,3686,3691,3711],{"__ignoreMap":1045},[1050,3552,3553],{"class":1052,"line":1053},[1050,3554,3555],{"class":1056},"-- Database security setup\n",[1050,3557,3558],{"class":1052,"line":1060},[1050,3559,3560],{"class":1056},"-- Create dedicated database user\n",[1050,3562,3563,3567,3570,3574,3577,3580,3582,3585,3587],{"class":1052,"line":1071},[1050,3564,3566],{"class":3565},"scgAs","CREATE",[1050,3568,3569],{"class":3565}," USER",[1050,3571,3573],{"class":3572},"sljsM"," django_user",[1050,3575,3576],{"class":3565}," WITH",[1050,3578,3579],{"class":3565}," PASSWORD",[1050,3581,1456],{"class":1128},[1050,3583,3584],{"class":1132},"secure_password",[1050,3586,1129],{"class":1128},[1050,3588,3589],{"class":1067},";\n",[1050,3591,3592],{"class":1052,"line":1085},[1050,3593,1089],{"emptyLinePlaceholder":1088},[1050,3595,3596],{"class":1052,"line":1092},[1050,3597,3598],{"class":1056},"-- Create database\n",[1050,3600,3601,3603,3606,3609,3612],{"class":1052,"line":1098},[1050,3602,3566],{"class":3565},[1050,3604,3605],{"class":3565}," DATABASE",[1050,3607,3608],{"class":3572}," django_production",[1050,3610,3611],{"class":3565}," OWNER",[1050,3613,3614],{"class":1067}," django_user;\n",[1050,3616,3617],{"class":1052,"line":1141},[1050,3618,1089],{"emptyLinePlaceholder":1088},[1050,3620,3621],{"class":1052,"line":1157},[1050,3622,3623],{"class":1056},"-- Grant minimal required permissions\n",[1050,3625,3626,3629,3632,3635,3637,3640,3643],{"class":1052,"line":1179},[1050,3627,3628],{"class":3565},"GRANT",[1050,3630,3631],{"class":3565}," CONNECT",[1050,3633,3634],{"class":3565}," ON",[1050,3636,3605],{"class":3565},[1050,3638,3639],{"class":1067}," django_production ",[1050,3641,3642],{"class":3565},"TO",[1050,3644,3614],{"class":1067},[1050,3646,3647,3649,3652,3655,3658,3661,3663],{"class":1052,"line":1184},[1050,3648,3628],{"class":3565},[1050,3650,3651],{"class":1067}," USAGE ",[1050,3653,3654],{"class":3565},"ON",[1050,3656,3657],{"class":3565}," SCHEMA",[1050,3659,3660],{"class":1067}," public ",[1050,3662,3642],{"class":3565},[1050,3664,3614],{"class":1067},[1050,3666,3667,3669,3672,3674,3676,3678,3680],{"class":1052,"line":1190},[1050,3668,3628],{"class":3565},[1050,3670,3671],{"class":3565}," CREATE",[1050,3673,3634],{"class":3565},[1050,3675,3657],{"class":3565},[1050,3677,3660],{"class":1067},[1050,3679,3642],{"class":3565},[1050,3681,3614],{"class":1067},[1050,3683,3684],{"class":1052,"line":1202},[1050,3685,1089],{"emptyLinePlaceholder":1088},[1050,3687,3688],{"class":1052,"line":1207},[1050,3689,3690],{"class":1056},"-- Revoke unnecessary permissions\n",[1050,3692,3693,3696,3699,3701,3703,3705,3708],{"class":1052,"line":1213},[1050,3694,3695],{"class":3565},"REVOKE",[1050,3697,3698],{"class":1067}," ALL ",[1050,3700,3654],{"class":3565},[1050,3702,3605],{"class":3565},[1050,3704,3639],{"class":1067},[1050,3706,3707],{"class":3565},"FROM",[1050,3709,3710],{"class":1067}," PUBLIC;\n",[1050,3712,3713,3715,3717,3719,3721,3723,3725],{"class":1052,"line":1224},[1050,3714,3695],{"class":3565},[1050,3716,3698],{"class":1067},[1050,3718,3654],{"class":3565},[1050,3720,3657],{"class":3565},[1050,3722,3660],{"class":1067},[1050,3724,3707],{"class":3565},[1050,3726,3710],{"class":1067},[1035,3728,3730],{"id":3729},"database-backup-security","Database Backup Security",[1040,3732,3734],{"className":2308,"code":3733,"language":2310,"meta":1045,"style":1045},"#!/bin/bash\n# secure_backup.sh - Secure database backup script\n\nset -euo pipefail\n\n# Configuration\nDB_NAME=\"django_production\"\nDB_USER=\"django_user\"\nBACKUP_DIR=\"/secure/backups\"\nENCRYPTION_KEY=\"/secure/keys/backup.key\"\nRETENTION_DAYS=30\n\n# Create backup directory\nmkdir -p \"$BACKUP_DIR\"\n\n# Generate backup filename\nTIMESTAMP=$(date +%Y%m%d_%H%M%S)\nBACKUP_FILE=\"$BACKUP_DIR/django_backup_$TIMESTAMP.sql\"\nENCRYPTED_FILE=\"$BACKUP_FILE.gpg\"\n\n# Create database dump\npg_dump -h localhost -U \"$DB_USER\" -d \"$DB_NAME\" \\\n    --no-password --verbose --clean --no-acl --no-owner \\\n    > \"$BACKUP_FILE\"\n\n# Encrypt backup\ngpg --cipher-algo AES256 --compress-algo 1 --s2k-mode 3 \\\n    --s2k-digest-algo SHA512 --s2k-count 65536 \\\n    --symmetric --output \"$ENCRYPTED_FILE\" \"$BACKUP_FILE\"\n\n# Remove unencrypted backup\nrm \"$BACKUP_FILE\"\n\n# Set secure permissions\nchmod 600 \"$ENCRYPTED_FILE\"\n\n# Clean old backups\nfind \"$BACKUP_DIR\" -name \"django_backup_*.sql.gpg\" \\\n    -mtime +$RETENTION_DAYS -delete\n\n# Log backup completion\nlogger \"Django database backup completed: $ENCRYPTED_FILE\"\n\necho \"Backup completed successfully: $ENCRYPTED_FILE\"\n",[1047,3735,3736,3741,3746,3750,3763,3767,3772,3785,3798,3812,3826,3836,3840,3845,3862,3866,3871,3887,3909,3926,3930,3935,3969,3988,3999,4003,4008,4033,4049,4070,4074,4079,4090,4094,4099,4112,4116,4121,4144,4157,4161,4166,4180,4184],{"__ignoreMap":1045},[1050,3737,3738],{"class":1052,"line":1053},[1050,3739,3740],{"class":1056},"#!/bin/bash\n",[1050,3742,3743],{"class":1052,"line":1060},[1050,3744,3745],{"class":1056},"# secure_backup.sh - Secure database backup script\n",[1050,3747,3748],{"class":1052,"line":1071},[1050,3749,1089],{"emptyLinePlaceholder":1088},[1050,3751,3752,3756,3760],{"class":1052,"line":1085},[1050,3753,3755],{"class":3754},"sJdAF","set",[1050,3757,3759],{"class":3758},"sz9Cv"," -euo",[1050,3761,3762],{"class":1132}," pipefail\n",[1050,3764,3765],{"class":1052,"line":1092},[1050,3766,1089],{"emptyLinePlaceholder":1088},[1050,3768,3769],{"class":1052,"line":1098},[1050,3770,3771],{"class":1056},"# Configuration\n",[1050,3773,3774,3776,3778,3780,3783],{"class":1052,"line":1141},[1050,3775,1492],{"class":2336},[1050,3777,2339],{"class":1105},[1050,3779,1169],{"class":1128},[1050,3781,3782],{"class":1132},"django_production",[1050,3784,3058],{"class":1128},[1050,3786,3787,3789,3791,3793,3796],{"class":1052,"line":1157},[1050,3788,1526],{"class":2336},[1050,3790,2339],{"class":1105},[1050,3792,1169],{"class":1128},[1050,3794,3795],{"class":1132},"django_user",[1050,3797,3058],{"class":1128},[1050,3799,3800,3803,3805,3807,3810],{"class":1052,"line":1179},[1050,3801,3802],{"class":2336},"BACKUP_DIR",[1050,3804,2339],{"class":1105},[1050,3806,1169],{"class":1128},[1050,3808,3809],{"class":1132},"/secure/backups",[1050,3811,3058],{"class":1128},[1050,3813,3814,3817,3819,3821,3824],{"class":1052,"line":1184},[1050,3815,3816],{"class":2336},"ENCRYPTION_KEY",[1050,3818,2339],{"class":1105},[1050,3820,1169],{"class":1128},[1050,3822,3823],{"class":1132},"/secure/keys/backup.key",[1050,3825,3058],{"class":1128},[1050,3827,3828,3831,3833],{"class":1052,"line":1190},[1050,3829,3830],{"class":2336},"RETENTION_DAYS",[1050,3832,2339],{"class":1105},[1050,3834,3835],{"class":1132},"30\n",[1050,3837,3838],{"class":1052,"line":1202},[1050,3839,1089],{"emptyLinePlaceholder":1088},[1050,3841,3842],{"class":1052,"line":1207},[1050,3843,3844],{"class":1056},"# Create backup directory\n",[1050,3846,3847,3851,3854,3856,3860],{"class":1052,"line":1213},[1050,3848,3850],{"class":3849},"sYn-s","mkdir",[1050,3852,3853],{"class":3758}," -p",[1050,3855,3052],{"class":1128},[1050,3857,3859],{"class":3858},"su_V2","$BACKUP_DIR",[1050,3861,3058],{"class":1128},[1050,3863,3864],{"class":1052,"line":1224},[1050,3865,1089],{"emptyLinePlaceholder":1088},[1050,3867,3868],{"class":1052,"line":1238},[1050,3869,3870],{"class":1056},"# Generate backup filename\n",[1050,3872,3873,3876,3879,3882,3885],{"class":1052,"line":1250},[1050,3874,3875],{"class":2336},"TIMESTAMP",[1050,3877,3878],{"class":1105},"=$(",[1050,3880,3881],{"class":3849},"date",[1050,3883,3884],{"class":1132}," +%Y%m%d_%H%M%S",[1050,3886,1138],{"class":1105},[1050,3888,3889,3892,3894,3896,3898,3901,3904,3907],{"class":1052,"line":1262},[1050,3890,3891],{"class":2336},"BACKUP_FILE",[1050,3893,2339],{"class":1105},[1050,3895,1169],{"class":1128},[1050,3897,3859],{"class":3858},[1050,3899,3900],{"class":1132},"/django_backup_",[1050,3902,3903],{"class":3858},"$TIMESTAMP",[1050,3905,3906],{"class":1132},".sql",[1050,3908,3058],{"class":1128},[1050,3910,3911,3914,3916,3918,3921,3924],{"class":1052,"line":1268},[1050,3912,3913],{"class":2336},"ENCRYPTED_FILE",[1050,3915,2339],{"class":1105},[1050,3917,1169],{"class":1128},[1050,3919,3920],{"class":3858},"$BACKUP_FILE",[1050,3922,3923],{"class":1132},".gpg",[1050,3925,3058],{"class":1128},[1050,3927,3928],{"class":1052,"line":1273},[1050,3929,1089],{"emptyLinePlaceholder":1088},[1050,3931,3932],{"class":1052,"line":1279},[1050,3933,3934],{"class":1056},"# Create database dump\n",[1050,3936,3937,3940,3943,3946,3949,3951,3954,3956,3959,3961,3964,3966],{"class":1052,"line":1289},[1050,3938,3939],{"class":3849},"pg_dump",[1050,3941,3942],{"class":3758}," -h",[1050,3944,3945],{"class":1132}," localhost",[1050,3947,3948],{"class":3758}," -U",[1050,3950,3052],{"class":1128},[1050,3952,3953],{"class":3858},"$DB_USER",[1050,3955,1169],{"class":1128},[1050,3957,3958],{"class":3758}," -d",[1050,3960,3052],{"class":1128},[1050,3962,3963],{"class":3858},"$DB_NAME",[1050,3965,1169],{"class":1128},[1050,3967,3968],{"class":1101}," \\\n",[1050,3970,3971,3974,3977,3980,3983,3986],{"class":1052,"line":1301},[1050,3972,3973],{"class":3758},"    --no-password",[1050,3975,3976],{"class":3758}," --verbose",[1050,3978,3979],{"class":3758}," --clean",[1050,3981,3982],{"class":3758}," --no-acl",[1050,3984,3985],{"class":3758}," --no-owner",[1050,3987,3968],{"class":1101},[1050,3989,3990,3993,3995,3997],{"class":1052,"line":1317},[1050,3991,3992],{"class":1147},"    >",[1050,3994,3052],{"class":1128},[1050,3996,3920],{"class":3858},[1050,3998,3058],{"class":1128},[1050,4000,4001],{"class":1052,"line":1329},[1050,4002,1089],{"emptyLinePlaceholder":1088},[1050,4004,4005],{"class":1052,"line":1341},[1050,4006,4007],{"class":1056},"# Encrypt backup\n",[1050,4009,4010,4013,4016,4019,4022,4025,4028,4031],{"class":1052,"line":1353},[1050,4011,4012],{"class":3849},"gpg",[1050,4014,4015],{"class":3758}," --cipher-algo",[1050,4017,4018],{"class":1132}," AES256",[1050,4020,4021],{"class":3758}," --compress-algo",[1050,4023,4024],{"class":1695}," 1",[1050,4026,4027],{"class":3758}," --s2k-mode",[1050,4029,4030],{"class":1695}," 3",[1050,4032,3968],{"class":1101},[1050,4034,4035,4038,4041,4044,4047],{"class":1052,"line":1365},[1050,4036,4037],{"class":3758},"    --s2k-digest-algo",[1050,4039,4040],{"class":1132}," SHA512",[1050,4042,4043],{"class":3758}," --s2k-count",[1050,4045,4046],{"class":1695}," 65536",[1050,4048,3968],{"class":1101},[1050,4050,4051,4054,4057,4059,4062,4064,4066,4068],{"class":1052,"line":1377},[1050,4052,4053],{"class":3758},"    --symmetric",[1050,4055,4056],{"class":3758}," --output",[1050,4058,3052],{"class":1128},[1050,4060,4061],{"class":3858},"$ENCRYPTED_FILE",[1050,4063,1169],{"class":1128},[1050,4065,3052],{"class":1128},[1050,4067,3920],{"class":3858},[1050,4069,3058],{"class":1128},[1050,4071,4072],{"class":1052,"line":1389},[1050,4073,1089],{"emptyLinePlaceholder":1088},[1050,4075,4076],{"class":1052,"line":1401},[1050,4077,4078],{"class":1056},"# Remove unencrypted backup\n",[1050,4080,4081,4084,4086,4088],{"class":1052,"line":1406},[1050,4082,4083],{"class":3849},"rm",[1050,4085,3052],{"class":1128},[1050,4087,3920],{"class":3858},[1050,4089,3058],{"class":1128},[1050,4091,4092],{"class":1052,"line":1411},[1050,4093,1089],{"emptyLinePlaceholder":1088},[1050,4095,4096],{"class":1052,"line":1417},[1050,4097,4098],{"class":1056},"# Set secure permissions\n",[1050,4100,4101,4104,4106,4108,4110],{"class":1052,"line":1428},[1050,4102,4103],{"class":3849},"chmod",[1050,4105,1696],{"class":1695},[1050,4107,3052],{"class":1128},[1050,4109,4061],{"class":3858},[1050,4111,3058],{"class":1128},[1050,4113,4114],{"class":1052,"line":1443},[1050,4115,1089],{"emptyLinePlaceholder":1088},[1050,4117,4118],{"class":1052,"line":1466},[1050,4119,4120],{"class":1056},"# Clean old backups\n",[1050,4122,4123,4126,4128,4130,4132,4135,4137,4140,4142],{"class":1052,"line":1500},[1050,4124,4125],{"class":3849},"find",[1050,4127,3052],{"class":1128},[1050,4129,3859],{"class":3858},[1050,4131,1169],{"class":1128},[1050,4133,4134],{"class":3758}," -name",[1050,4136,3052],{"class":1128},[1050,4138,4139],{"class":1132},"django_backup_*.sql.gpg",[1050,4141,1169],{"class":1128},[1050,4143,3968],{"class":1101},[1050,4145,4146,4149,4151,4154],{"class":1052,"line":1533},[1050,4147,4148],{"class":3758},"    -mtime",[1050,4150,3104],{"class":1132},[1050,4152,4153],{"class":2336},"$RETENTION_DAYS",[1050,4155,4156],{"class":3758}," -delete\n",[1050,4158,4159],{"class":1052,"line":1566},[1050,4160,1089],{"emptyLinePlaceholder":1088},[1050,4162,4163],{"class":1052,"line":1599},[1050,4164,4165],{"class":1056},"# Log backup completion\n",[1050,4167,4168,4171,4173,4176,4178],{"class":1052,"line":1641},[1050,4169,4170],{"class":3849},"logger",[1050,4172,3052],{"class":1128},[1050,4174,4175],{"class":1132},"Django database backup completed: ",[1050,4177,4061],{"class":3858},[1050,4179,3058],{"class":1128},[1050,4181,4182],{"class":1052,"line":1655},[1050,4183,1089],{"emptyLinePlaceholder":1088},[1050,4185,4186,4189,4191,4194,4196],{"class":1052,"line":1677},[1050,4187,4188],{"class":3754},"echo",[1050,4190,3052],{"class":1128},[1050,4192,4193],{"class":1132},"Backup completed successfully: ",[1050,4195,4061],{"class":3858},[1050,4197,3058],{"class":1128},[1030,4199,4201],{"id":4200},"monitoring-and-alerting","Monitoring and Alerting",[1035,4203,4205],{"id":4204},"security-monitoring-setup","Security Monitoring Setup",[1040,4207,4209],{"className":1042,"code":4208,"language":1044,"meta":1045,"style":1045},"# monitoring.py - Security monitoring utilities\nimport logging\nimport time\nfrom django.core.cache import cache\nfrom django.http import HttpResponseForbidden\nfrom django.utils.deprecation import MiddlewareMixin\n\nlogger = logging.getLogger('security')\n\nclass SecurityMonitoringMiddleware(MiddlewareMixin):\n    \"\"\"Monitor and log security events\"\"\"\n    \n    def __init__(self, get_response):\n        self.get_response = get_response\n        super().__init__(get_response)\n    \n    def process_request(self, request):\n        \"\"\"Monitor incoming requests for suspicious activity\"\"\"\n        \n        # Log admin access attempts\n        if request.path.startswith('/admin/'):\n            logger.info(\n                f\"Admin access attempt: {request.META.get('REMOTE_ADDR')} \"\n                f\"-> {request.path} [{request.method}]\"\n            )\n        \n        # Monitor for suspicious patterns\n        self.check_suspicious_patterns(request)\n        \n        # Rate limiting check\n        if self.is_rate_limited(request):\n            logger.warning(\n                f\"Rate limit exceeded: {request.META.get('REMOTE_ADDR')} \"\n                f\"-> {request.path}\"\n            )\n            return HttpResponseForbidden(\"Rate limit exceeded\")\n    \n    def check_suspicious_patterns(self, request):\n        \"\"\"Check for suspicious request patterns\"\"\"\n        \n        # Check for SQL injection attempts\n        suspicious_params = ['union', 'select', 'drop', 'insert', 'delete']\n        query_string = request.META.get('QUERY_STRING', '').lower()\n        \n        for param in suspicious_params:\n            if param in query_string:\n                logger.warning(\n                    f\"Suspicious SQL pattern detected: {request.META.get('REMOTE_ADDR')} \"\n                    f\"-> {request.path}?{query_string}\"\n                )\n                break\n        \n        # Check for XSS attempts\n        xss_patterns = ['\u003Cscript', 'javascript:', 'onerror=', 'onload=']\n        for pattern in xss_patterns:\n            if pattern in query_string:\n                logger.warning(\n                    f\"Suspicious XSS pattern detected: {request.META.get('REMOTE_ADDR')} \"\n                    f\"-> {request.path}?{query_string}\"\n                )\n                break\n    \n    def is_rate_limited(self, request):\n        \"\"\"Simple rate limiting implementation\"\"\"\n        client_ip = request.META.get('REMOTE_ADDR')\n        cache_key = f\"rate_limit:{client_ip}\"\n        \n        # Get current request count\n        current_requests = cache.get(cache_key, 0)\n        \n        # Check if limit exceeded (100 requests per minute)\n        if current_requests >= 100:\n            return True\n        \n        # Increment counter\n        cache.set(cache_key, current_requests + 1, 60)  # 1 minute timeout\n        return False\n",[1047,4210,4211,4216,4223,4230,4252,4268,4289,4293,4319,4323,4340,4353,4357,4379,4394,4411,4415,4433,4443,4447,4452,4480,4492,4535,4569,4574,4578,4583,4598,4602,4607,4625,4636,4669,4687,4691,4710,4714,4731,4740,4744,4749,4803,4843,4847,4863,4877,4888,4922,4950,4955,4960,4964,4969,5014,5028,5040,5050,5083,5109,5113,5117,5121,5138,5147,5174,5196,5200,5205,5231,5235,5240,5255,5261,5265,5270,5302],{"__ignoreMap":1045},[1050,4212,4213],{"class":1052,"line":1053},[1050,4214,4215],{"class":1056},"# monitoring.py - Security monitoring utilities\n",[1050,4217,4218,4220],{"class":1052,"line":1060},[1050,4219,1064],{"class":1063},[1050,4221,4222],{"class":1067}," logging\n",[1050,4224,4225,4227],{"class":1052,"line":1071},[1050,4226,1064],{"class":1063},[1050,4228,4229],{"class":1067}," time\n",[1050,4231,4232,4234,4237,4239,4242,4244,4247,4249],{"class":1052,"line":1085},[1050,4233,1074],{"class":1063},[1050,4235,4236],{"class":1067}," django",[1050,4238,1112],{"class":1105},[1050,4240,4241],{"class":1067},"core",[1050,4243,1112],{"class":1105},[1050,4245,4246],{"class":1067},"cache ",[1050,4248,1064],{"class":1063},[1050,4250,4251],{"class":1067}," cache\n",[1050,4253,4254,4256,4258,4260,4263,4265],{"class":1052,"line":1092},[1050,4255,1074],{"class":1063},[1050,4257,4236],{"class":1067},[1050,4259,1112],{"class":1105},[1050,4261,4262],{"class":1067},"http ",[1050,4264,1064],{"class":1063},[1050,4266,4267],{"class":1067}," HttpResponseForbidden\n",[1050,4269,4270,4272,4274,4276,4279,4281,4284,4286],{"class":1052,"line":1098},[1050,4271,1074],{"class":1063},[1050,4273,4236],{"class":1067},[1050,4275,1112],{"class":1105},[1050,4277,4278],{"class":1067},"utils",[1050,4280,1112],{"class":1105},[1050,4282,4283],{"class":1067},"deprecation ",[1050,4285,1064],{"class":1063},[1050,4287,4288],{"class":1067}," MiddlewareMixin\n",[1050,4290,4291],{"class":1052,"line":1141},[1050,4292,1089],{"emptyLinePlaceholder":1088},[1050,4294,4295,4298,4300,4303,4305,4308,4310,4312,4315,4317],{"class":1052,"line":1157},[1050,4296,4297],{"class":1067},"logger ",[1050,4299,2339],{"class":1105},[1050,4301,4302],{"class":1067}," logging",[1050,4304,1112],{"class":1105},[1050,4306,4307],{"class":1121},"getLogger",[1050,4309,1125],{"class":1105},[1050,4311,1129],{"class":1128},[1050,4313,4314],{"class":1132},"security",[1050,4316,1129],{"class":1128},[1050,4318,1138],{"class":1105},[1050,4320,4321],{"class":1052,"line":1179},[1050,4322,1089],{"emptyLinePlaceholder":1088},[1050,4324,4325,4328,4332,4334,4337],{"class":1052,"line":1184},[1050,4326,4327],{"class":2284},"class",[1050,4329,4331],{"class":4330},"sD-vU"," SecurityMonitoringMiddleware",[1050,4333,1125],{"class":1105},[1050,4335,4336],{"class":3849},"MiddlewareMixin",[1050,4338,4339],{"class":1105},"):\n",[1050,4341,4342,4346,4350],{"class":1052,"line":1190},[1050,4343,4345],{"class":4344},"sm7ve","    \"\"\"",[1050,4347,4349],{"class":4348},"sVyVU","Monitor and log security events",[1050,4351,4352],{"class":4344},"\"\"\"\n",[1050,4354,4355],{"class":1052,"line":1202},[1050,4356,2619],{"class":1067},[1050,4358,4359,4362,4365,4367,4371,4373,4377],{"class":1052,"line":1207},[1050,4360,4361],{"class":2284},"    def",[1050,4363,4364],{"class":3754}," __init__",[1050,4366,1125],{"class":1105},[1050,4368,4370],{"class":4369},"sRjD_","self",[1050,4372,1311],{"class":1105},[1050,4374,4376],{"class":4375},"sCyAa"," get_response",[1050,4378,4339],{"class":1105},[1050,4380,4381,4384,4386,4389,4391],{"class":1052,"line":1213},[1050,4382,4383],{"class":1101},"        self",[1050,4385,1112],{"class":1105},[1050,4387,4388],{"class":1115},"get_response",[1050,4390,1106],{"class":1105},[1050,4392,4393],{"class":1067}," get_response\n",[1050,4395,4396,4399,4402,4405,4407,4409],{"class":1052,"line":1224},[1050,4397,4398],{"class":1163},"        super",[1050,4400,4401],{"class":1105},"().",[1050,4403,4404],{"class":3754},"__init__",[1050,4406,1125],{"class":1105},[1050,4408,4388],{"class":1121},[1050,4410,1138],{"class":1105},[1050,4412,4413],{"class":1052,"line":1238},[1050,4414,2619],{"class":1067},[1050,4416,4417,4419,4422,4424,4426,4428,4431],{"class":1052,"line":1250},[1050,4418,4361],{"class":2284},[1050,4420,4421],{"class":3572}," process_request",[1050,4423,1125],{"class":1105},[1050,4425,4370],{"class":4369},[1050,4427,1311],{"class":1105},[1050,4429,4430],{"class":4375}," request",[1050,4432,4339],{"class":1105},[1050,4434,4435,4438,4441],{"class":1052,"line":1262},[1050,4436,4437],{"class":4344},"        \"\"\"",[1050,4439,4440],{"class":4348},"Monitor incoming requests for suspicious activity",[1050,4442,4352],{"class":4344},[1050,4444,4445],{"class":1052,"line":1268},[1050,4446,2828],{"class":1067},[1050,4448,4449],{"class":1052,"line":1273},[1050,4450,4451],{"class":1056},"        # Log admin access attempts\n",[1050,4453,4454,4457,4459,4461,4464,4466,4469,4471,4473,4476,4478],{"class":1052,"line":1279},[1050,4455,4456],{"class":1063},"        if",[1050,4458,4430],{"class":1067},[1050,4460,1112],{"class":1105},[1050,4462,4463],{"class":1115},"path",[1050,4465,1112],{"class":1105},[1050,4467,4468],{"class":1121},"startswith",[1050,4470,1125],{"class":1105},[1050,4472,1129],{"class":1128},[1050,4474,4475],{"class":1132},"/admin/",[1050,4477,1129],{"class":1128},[1050,4479,4339],{"class":1105},[1050,4481,4482,4485,4487,4489],{"class":1052,"line":1289},[1050,4483,4484],{"class":1067},"            logger",[1050,4486,1112],{"class":1105},[1050,4488,3258],{"class":1121},[1050,4490,4491],{"class":1105},"(\n",[1050,4493,4494,4497,4500,4504,4507,4509,4513,4515,4517,4519,4521,4524,4526,4529,4532],{"class":1052,"line":1301},[1050,4495,4496],{"class":2284},"                f",[1050,4498,4499],{"class":1132},"\"Admin access attempt: ",[1050,4501,4503],{"class":4502},"s3h35","{",[1050,4505,4506],{"class":1121},"request",[1050,4508,1112],{"class":1105},[1050,4510,4512],{"class":4511},"sFGJz","META",[1050,4514,1112],{"class":1105},[1050,4516,1122],{"class":1121},[1050,4518,1125],{"class":1105},[1050,4520,1129],{"class":1128},[1050,4522,4523],{"class":1132},"REMOTE_ADDR",[1050,4525,1129],{"class":1128},[1050,4527,4528],{"class":1105},")",[1050,4530,4531],{"class":4502},"}",[1050,4533,4534],{"class":1132}," \"\n",[1050,4536,4537,4539,4542,4544,4546,4548,4550,4552,4555,4557,4559,4561,4564,4566],{"class":1052,"line":1317},[1050,4538,4496],{"class":2284},[1050,4540,4541],{"class":1132},"\"-> ",[1050,4543,4503],{"class":4502},[1050,4545,4506],{"class":1121},[1050,4547,1112],{"class":1105},[1050,4549,4463],{"class":1115},[1050,4551,4531],{"class":4502},[1050,4553,4554],{"class":1132}," [",[1050,4556,4503],{"class":4502},[1050,4558,4506],{"class":1121},[1050,4560,1112],{"class":1105},[1050,4562,4563],{"class":1115},"method",[1050,4565,4531],{"class":4502},[1050,4567,4568],{"class":1132},"]\"\n",[1050,4570,4571],{"class":1052,"line":1329},[1050,4572,4573],{"class":1105},"            )\n",[1050,4575,4576],{"class":1052,"line":1341},[1050,4577,2828],{"class":1067},[1050,4579,4580],{"class":1052,"line":1353},[1050,4581,4582],{"class":1056},"        # Monitor for suspicious patterns\n",[1050,4584,4585,4587,4589,4592,4594,4596],{"class":1052,"line":1365},[1050,4586,4383],{"class":1101},[1050,4588,1112],{"class":1105},[1050,4590,4591],{"class":1121},"check_suspicious_patterns",[1050,4593,1125],{"class":1105},[1050,4595,4506],{"class":1121},[1050,4597,1138],{"class":1105},[1050,4599,4600],{"class":1052,"line":1377},[1050,4601,2828],{"class":1067},[1050,4603,4604],{"class":1052,"line":1389},[1050,4605,4606],{"class":1056},"        # Rate limiting check\n",[1050,4608,4609,4611,4614,4616,4619,4621,4623],{"class":1052,"line":1401},[1050,4610,4456],{"class":1063},[1050,4612,4613],{"class":1101}," self",[1050,4615,1112],{"class":1105},[1050,4617,4618],{"class":1121},"is_rate_limited",[1050,4620,1125],{"class":1105},[1050,4622,4506],{"class":1121},[1050,4624,4339],{"class":1105},[1050,4626,4627,4629,4631,4634],{"class":1052,"line":1406},[1050,4628,4484],{"class":1067},[1050,4630,1112],{"class":1105},[1050,4632,4633],{"class":1121},"warning",[1050,4635,4491],{"class":1105},[1050,4637,4638,4640,4643,4645,4647,4649,4651,4653,4655,4657,4659,4661,4663,4665,4667],{"class":1052,"line":1411},[1050,4639,4496],{"class":2284},[1050,4641,4642],{"class":1132},"\"Rate limit exceeded: ",[1050,4644,4503],{"class":4502},[1050,4646,4506],{"class":1121},[1050,4648,1112],{"class":1105},[1050,4650,4512],{"class":4511},[1050,4652,1112],{"class":1105},[1050,4654,1122],{"class":1121},[1050,4656,1125],{"class":1105},[1050,4658,1129],{"class":1128},[1050,4660,4523],{"class":1132},[1050,4662,1129],{"class":1128},[1050,4664,4528],{"class":1105},[1050,4666,4531],{"class":4502},[1050,4668,4534],{"class":1132},[1050,4670,4671,4673,4675,4677,4679,4681,4683,4685],{"class":1052,"line":1417},[1050,4672,4496],{"class":2284},[1050,4674,4541],{"class":1132},[1050,4676,4503],{"class":4502},[1050,4678,4506],{"class":1121},[1050,4680,1112],{"class":1105},[1050,4682,4463],{"class":1115},[1050,4684,4531],{"class":4502},[1050,4686,3058],{"class":1132},[1050,4688,4689],{"class":1052,"line":1428},[1050,4690,4573],{"class":1105},[1050,4692,4693,4696,4699,4701,4703,4706,4708],{"class":1052,"line":1443},[1050,4694,4695],{"class":1063},"            return",[1050,4697,4698],{"class":1121}," HttpResponseForbidden",[1050,4700,1125],{"class":1105},[1050,4702,1169],{"class":1128},[1050,4704,4705],{"class":1132},"Rate limit exceeded",[1050,4707,1169],{"class":1128},[1050,4709,1138],{"class":1105},[1050,4711,4712],{"class":1052,"line":1466},[1050,4713,2619],{"class":1067},[1050,4715,4716,4718,4721,4723,4725,4727,4729],{"class":1052,"line":1500},[1050,4717,4361],{"class":2284},[1050,4719,4720],{"class":3572}," check_suspicious_patterns",[1050,4722,1125],{"class":1105},[1050,4724,4370],{"class":4369},[1050,4726,1311],{"class":1105},[1050,4728,4430],{"class":4375},[1050,4730,4339],{"class":1105},[1050,4732,4733,4735,4738],{"class":1052,"line":1533},[1050,4734,4437],{"class":4344},[1050,4736,4737],{"class":4348},"Check for suspicious request patterns",[1050,4739,4352],{"class":4344},[1050,4741,4742],{"class":1052,"line":1566},[1050,4743,2828],{"class":1067},[1050,4745,4746],{"class":1052,"line":1599},[1050,4747,4748],{"class":1056},"        # Check for SQL injection attempts\n",[1050,4750,4751,4754,4756,4758,4760,4763,4765,4767,4769,4772,4774,4776,4778,4781,4783,4785,4787,4790,4792,4794,4796,4799,4801],{"class":1052,"line":1641},[1050,4752,4753],{"class":1067},"        suspicious_params ",[1050,4755,2339],{"class":1105},[1050,4757,4554],{"class":1105},[1050,4759,1129],{"class":1128},[1050,4761,4762],{"class":1132},"union",[1050,4764,1129],{"class":1128},[1050,4766,1311],{"class":1105},[1050,4768,1456],{"class":1128},[1050,4770,4771],{"class":1132},"select",[1050,4773,1129],{"class":1128},[1050,4775,1311],{"class":1105},[1050,4777,1456],{"class":1128},[1050,4779,4780],{"class":1132},"drop",[1050,4782,1129],{"class":1128},[1050,4784,1311],{"class":1105},[1050,4786,1456],{"class":1128},[1050,4788,4789],{"class":1132},"insert",[1050,4791,1129],{"class":1128},[1050,4793,1311],{"class":1105},[1050,4795,1456],{"class":1128},[1050,4797,4798],{"class":1132},"delete",[1050,4800,1129],{"class":1128},[1050,4802,1265],{"class":1105},[1050,4804,4805,4808,4810,4812,4814,4816,4818,4820,4822,4824,4827,4829,4831,4834,4837,4840],{"class":1052,"line":1655},[1050,4806,4807],{"class":1067},"        query_string ",[1050,4809,2339],{"class":1105},[1050,4811,4430],{"class":1067},[1050,4813,1112],{"class":1105},[1050,4815,4512],{"class":4511},[1050,4817,1112],{"class":1105},[1050,4819,1122],{"class":1121},[1050,4821,1125],{"class":1105},[1050,4823,1129],{"class":1128},[1050,4825,4826],{"class":1132},"QUERY_STRING",[1050,4828,1129],{"class":1128},[1050,4830,1311],{"class":1105},[1050,4832,4833],{"class":1128}," ''",[1050,4835,4836],{"class":1105},").",[1050,4838,4839],{"class":1121},"lower",[1050,4841,4842],{"class":1105},"()\n",[1050,4844,4845],{"class":1052,"line":1677},[1050,4846,2828],{"class":1067},[1050,4848,4849,4852,4855,4858,4861],{"class":1052,"line":1683},[1050,4850,4851],{"class":1063},"        for",[1050,4853,4854],{"class":1067}," param ",[1050,4856,4857],{"class":1063},"in",[1050,4859,4860],{"class":1067}," suspicious_params",[1050,4862,1154],{"class":1105},[1050,4864,4865,4868,4870,4872,4875],{"class":1052,"line":1701},[1050,4866,4867],{"class":1063},"            if",[1050,4869,4854],{"class":1067},[1050,4871,4857],{"class":1147},[1050,4873,4874],{"class":1067}," query_string",[1050,4876,1154],{"class":1105},[1050,4878,4879,4882,4884,4886],{"class":1052,"line":1707},[1050,4880,4881],{"class":1067},"                logger",[1050,4883,1112],{"class":1105},[1050,4885,4633],{"class":1121},[1050,4887,4491],{"class":1105},[1050,4889,4890,4893,4896,4898,4900,4902,4904,4906,4908,4910,4912,4914,4916,4918,4920],{"class":1052,"line":1713},[1050,4891,4892],{"class":2284},"                    f",[1050,4894,4895],{"class":1132},"\"Suspicious SQL pattern detected: ",[1050,4897,4503],{"class":4502},[1050,4899,4506],{"class":1121},[1050,4901,1112],{"class":1105},[1050,4903,4512],{"class":4511},[1050,4905,1112],{"class":1105},[1050,4907,1122],{"class":1121},[1050,4909,1125],{"class":1105},[1050,4911,1129],{"class":1128},[1050,4913,4523],{"class":1132},[1050,4915,1129],{"class":1128},[1050,4917,4528],{"class":1105},[1050,4919,4531],{"class":4502},[1050,4921,4534],{"class":1132},[1050,4923,4924,4926,4928,4930,4932,4934,4936,4938,4941,4943,4946,4948],{"class":1052,"line":1718},[1050,4925,4892],{"class":2284},[1050,4927,4541],{"class":1132},[1050,4929,4503],{"class":4502},[1050,4931,4506],{"class":1121},[1050,4933,1112],{"class":1105},[1050,4935,4463],{"class":1115},[1050,4937,4531],{"class":4502},[1050,4939,4940],{"class":1132},"?",[1050,4942,4503],{"class":4502},[1050,4944,4945],{"class":1121},"query_string",[1050,4947,4531],{"class":4502},[1050,4949,3058],{"class":1132},[1050,4951,4952],{"class":1052,"line":1724},[1050,4953,4954],{"class":1105},"                )\n",[1050,4956,4957],{"class":1052,"line":1734},[1050,4958,4959],{"class":1063},"                break\n",[1050,4961,4962],{"class":1052,"line":1747},[1050,4963,2828],{"class":1067},[1050,4965,4966],{"class":1052,"line":1768},[1050,4967,4968],{"class":1056},"        # Check for XSS attempts\n",[1050,4970,4971,4974,4976,4978,4980,4983,4985,4987,4989,4992,4994,4996,4998,5001,5003,5005,5007,5010,5012],{"class":1052,"line":1801},[1050,4972,4973],{"class":1067},"        xss_patterns ",[1050,4975,2339],{"class":1105},[1050,4977,4554],{"class":1105},[1050,4979,1129],{"class":1128},[1050,4981,4982],{"class":1132},"\u003Cscript",[1050,4984,1129],{"class":1128},[1050,4986,1311],{"class":1105},[1050,4988,1456],{"class":1128},[1050,4990,4991],{"class":1132},"javascript:",[1050,4993,1129],{"class":1128},[1050,4995,1311],{"class":1105},[1050,4997,1456],{"class":1128},[1050,4999,5000],{"class":1132},"onerror=",[1050,5002,1129],{"class":1128},[1050,5004,1311],{"class":1105},[1050,5006,1456],{"class":1128},[1050,5008,5009],{"class":1132},"onload=",[1050,5011,1129],{"class":1128},[1050,5013,1265],{"class":1105},[1050,5015,5016,5018,5021,5023,5026],{"class":1052,"line":1814},[1050,5017,4851],{"class":1063},[1050,5019,5020],{"class":1067}," pattern ",[1050,5022,4857],{"class":1063},[1050,5024,5025],{"class":1067}," xss_patterns",[1050,5027,1154],{"class":1105},[1050,5029,5030,5032,5034,5036,5038],{"class":1052,"line":1835},[1050,5031,4867],{"class":1063},[1050,5033,5020],{"class":1067},[1050,5035,4857],{"class":1147},[1050,5037,4874],{"class":1067},[1050,5039,1154],{"class":1105},[1050,5041,5042,5044,5046,5048],{"class":1052,"line":1849},[1050,5043,4881],{"class":1067},[1050,5045,1112],{"class":1105},[1050,5047,4633],{"class":1121},[1050,5049,4491],{"class":1105},[1050,5051,5052,5054,5057,5059,5061,5063,5065,5067,5069,5071,5073,5075,5077,5079,5081],{"class":1052,"line":1871},[1050,5053,4892],{"class":2284},[1050,5055,5056],{"class":1132},"\"Suspicious XSS pattern detected: ",[1050,5058,4503],{"class":4502},[1050,5060,4506],{"class":1121},[1050,5062,1112],{"class":1105},[1050,5064,4512],{"class":4511},[1050,5066,1112],{"class":1105},[1050,5068,1122],{"class":1121},[1050,5070,1125],{"class":1105},[1050,5072,1129],{"class":1128},[1050,5074,4523],{"class":1132},[1050,5076,1129],{"class":1128},[1050,5078,4528],{"class":1105},[1050,5080,4531],{"class":4502},[1050,5082,4534],{"class":1132},[1050,5084,5085,5087,5089,5091,5093,5095,5097,5099,5101,5103,5105,5107],{"class":1052,"line":1892},[1050,5086,4892],{"class":2284},[1050,5088,4541],{"class":1132},[1050,5090,4503],{"class":4502},[1050,5092,4506],{"class":1121},[1050,5094,1112],{"class":1105},[1050,5096,4463],{"class":1115},[1050,5098,4531],{"class":4502},[1050,5100,4940],{"class":1132},[1050,5102,4503],{"class":4502},[1050,5104,4945],{"class":1121},[1050,5106,4531],{"class":4502},[1050,5108,3058],{"class":1132},[1050,5110,5111],{"class":1052,"line":1898},[1050,5112,4954],{"class":1105},[1050,5114,5115],{"class":1052,"line":1904},[1050,5116,4959],{"class":1063},[1050,5118,5119],{"class":1052,"line":1909},[1050,5120,2619],{"class":1067},[1050,5122,5123,5125,5128,5130,5132,5134,5136],{"class":1052,"line":1914},[1050,5124,4361],{"class":2284},[1050,5126,5127],{"class":3572}," is_rate_limited",[1050,5129,1125],{"class":1105},[1050,5131,4370],{"class":4369},[1050,5133,1311],{"class":1105},[1050,5135,4430],{"class":4375},[1050,5137,4339],{"class":1105},[1050,5139,5140,5142,5145],{"class":1052,"line":1919},[1050,5141,4437],{"class":4344},[1050,5143,5144],{"class":4348},"Simple rate limiting implementation",[1050,5146,4352],{"class":4344},[1050,5148,5149,5152,5154,5156,5158,5160,5162,5164,5166,5168,5170,5172],{"class":1052,"line":1925},[1050,5150,5151],{"class":1067},"        client_ip ",[1050,5153,2339],{"class":1105},[1050,5155,4430],{"class":1067},[1050,5157,1112],{"class":1105},[1050,5159,4512],{"class":4511},[1050,5161,1112],{"class":1105},[1050,5163,1122],{"class":1121},[1050,5165,1125],{"class":1105},[1050,5167,1129],{"class":1128},[1050,5169,4523],{"class":1132},[1050,5171,1129],{"class":1128},[1050,5173,1138],{"class":1105},[1050,5175,5176,5179,5181,5184,5187,5189,5192,5194],{"class":1052,"line":1941},[1050,5177,5178],{"class":1067},"        cache_key ",[1050,5180,2339],{"class":1105},[1050,5182,5183],{"class":2284}," f",[1050,5185,5186],{"class":1132},"\"rate_limit:",[1050,5188,4503],{"class":4502},[1050,5190,5191],{"class":1067},"client_ip",[1050,5193,4531],{"class":4502},[1050,5195,3058],{"class":1132},[1050,5197,5198],{"class":1052,"line":1955},[1050,5199,2828],{"class":1067},[1050,5201,5202],{"class":1052,"line":1966},[1050,5203,5204],{"class":1056},"        # Get current request count\n",[1050,5206,5207,5210,5212,5215,5217,5219,5221,5224,5226,5229],{"class":1052,"line":1976},[1050,5208,5209],{"class":1067},"        current_requests ",[1050,5211,2339],{"class":1105},[1050,5213,5214],{"class":1067}," cache",[1050,5216,1112],{"class":1105},[1050,5218,1122],{"class":1121},[1050,5220,1125],{"class":1105},[1050,5222,5223],{"class":1121},"cache_key",[1050,5225,1311],{"class":1105},[1050,5227,5228],{"class":1695}," 0",[1050,5230,1138],{"class":1105},[1050,5232,5233],{"class":1052,"line":1991},[1050,5234,2828],{"class":1067},[1050,5236,5237],{"class":1052,"line":2005},[1050,5238,5239],{"class":1056},"        # Check if limit exceeded (100 requests per minute)\n",[1050,5241,5242,5244,5247,5250,5253],{"class":1052,"line":2015},[1050,5243,4456],{"class":1063},[1050,5245,5246],{"class":1067}," current_requests ",[1050,5248,5249],{"class":1147},">=",[1050,5251,5252],{"class":1695}," 100",[1050,5254,1154],{"class":1105},[1050,5256,5257,5259],{"class":1052,"line":2025},[1050,5258,4695],{"class":1063},[1050,5260,1963],{"class":1198},[1050,5262,5263],{"class":1052,"line":2030},[1050,5264,2828],{"class":1067},[1050,5266,5267],{"class":1052,"line":2036},[1050,5268,5269],{"class":1056},"        # Increment counter\n",[1050,5271,5272,5275,5277,5279,5281,5283,5285,5287,5290,5292,5294,5297,5299],{"class":1052,"line":2046},[1050,5273,5274],{"class":1067},"        cache",[1050,5276,1112],{"class":1105},[1050,5278,3755],{"class":1121},[1050,5280,1125],{"class":1105},[1050,5282,5223],{"class":1121},[1050,5284,1311],{"class":1105},[1050,5286,5246],{"class":1121},[1050,5288,5289],{"class":1147},"+",[1050,5291,4024],{"class":1695},[1050,5293,1311],{"class":1105},[1050,5295,5296],{"class":1695}," 60",[1050,5298,4528],{"class":1105},[1050,5300,5301],{"class":1056},"  # 1 minute timeout\n",[1050,5303,5304,5307],{"class":1052,"line":2056},[1050,5305,5306],{"class":1063},"        return",[1050,5308,1199],{"class":1198},[1035,5310,5312],{"id":5311},"ssl-certificate-management","SSL Certificate Management",[1040,5314,5316],{"className":2308,"code":5315,"language":2310,"meta":1045,"style":1045},"#!/bin/bash\n# ssl_setup.sh - SSL certificate setup and renewal\n\n# Install Certbot\nsudo apt-get update\nsudo apt-get install certbot python3-certbot-nginx\n\n# Obtain SSL certificate\nsudo certbot --nginx -d yourdomain.com -d www.yourdomain.com\n\n# Set up automatic renewal\nsudo crontab -e\n# Add: 0 12 * * * /usr/bin/certbot renew --quiet\n\n# Test renewal\nsudo certbot renew --dry-run\n\n# Create certificate monitoring script\ncat > /opt/scripts/cert_monitor.sh \u003C\u003C 'EOF'\n#!/bin/bash\n# Monitor SSL certificate expiration\n\nDOMAIN=\"yourdomain.com\"\nTHRESHOLD_DAYS=30\n\n# Check certificate expiration\nEXPIRY_DATE=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -dates | grep notAfter | cut -d= -f2)\nEXPIRY_EPOCH=$(date -d \"$EXPIRY_DATE\" +%s)\nCURRENT_EPOCH=$(date +%s)\nDAYS_UNTIL_EXPIRY=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 ))\n\nif [ $DAYS_UNTIL_EXPIRY -lt $THRESHOLD_DAYS ]; then\n    echo \"WARNING: SSL certificate for $DOMAIN expires in $DAYS_UNTIL_EXPIRY days\"\n    # Send alert email\n    echo \"SSL certificate for $DOMAIN expires in $DAYS_UNTIL_EXPIRY days\" | \\\n        mail -s \"SSL Certificate Expiration Warning\" admin@yourdomain.com\nfi\nEOF\n\nchmod +x /opt/scripts/cert_monitor.sh\n\n# Add to cron (daily check)\necho \"0 9 * * * /opt/scripts/cert_monitor.sh\" | sudo crontab -\n",[1047,5317,5318,5322,5327,5331,5336,5347,5362,5366,5371,5390,5394,5399,5409,5414,5418,5423,5435,5439,5444,5461,5465,5470,5474,5479,5484,5488,5493,5498,5503,5508,5513,5517,5522,5527,5532,5537,5542,5547,5552,5556,5566,5570,5575],{"__ignoreMap":1045},[1050,5319,5320],{"class":1052,"line":1053},[1050,5321,3740],{"class":1056},[1050,5323,5324],{"class":1052,"line":1060},[1050,5325,5326],{"class":1056},"# ssl_setup.sh - SSL certificate setup and renewal\n",[1050,5328,5329],{"class":1052,"line":1071},[1050,5330,1089],{"emptyLinePlaceholder":1088},[1050,5332,5333],{"class":1052,"line":1085},[1050,5334,5335],{"class":1056},"# Install Certbot\n",[1050,5337,5338,5341,5344],{"class":1052,"line":1092},[1050,5339,5340],{"class":3849},"sudo",[1050,5342,5343],{"class":1132}," apt-get",[1050,5345,5346],{"class":1132}," update\n",[1050,5348,5349,5351,5353,5356,5359],{"class":1052,"line":1098},[1050,5350,5340],{"class":3849},[1050,5352,5343],{"class":1132},[1050,5354,5355],{"class":1132}," install",[1050,5357,5358],{"class":1132}," certbot",[1050,5360,5361],{"class":1132}," python3-certbot-nginx\n",[1050,5363,5364],{"class":1052,"line":1141},[1050,5365,1089],{"emptyLinePlaceholder":1088},[1050,5367,5368],{"class":1052,"line":1157},[1050,5369,5370],{"class":1056},"# Obtain SSL certificate\n",[1050,5372,5373,5375,5377,5380,5382,5385,5387],{"class":1052,"line":1179},[1050,5374,5340],{"class":3849},[1050,5376,5358],{"class":1132},[1050,5378,5379],{"class":3758}," --nginx",[1050,5381,3958],{"class":3758},[1050,5383,5384],{"class":1132}," yourdomain.com",[1050,5386,3958],{"class":3758},[1050,5388,5389],{"class":1132}," www.yourdomain.com\n",[1050,5391,5392],{"class":1052,"line":1184},[1050,5393,1089],{"emptyLinePlaceholder":1088},[1050,5395,5396],{"class":1052,"line":1190},[1050,5397,5398],{"class":1056},"# Set up automatic renewal\n",[1050,5400,5401,5403,5406],{"class":1052,"line":1202},[1050,5402,5340],{"class":3849},[1050,5404,5405],{"class":1132}," crontab",[1050,5407,5408],{"class":3758}," -e\n",[1050,5410,5411],{"class":1052,"line":1207},[1050,5412,5413],{"class":1056},"# Add: 0 12 * * * /usr/bin/certbot renew --quiet\n",[1050,5415,5416],{"class":1052,"line":1213},[1050,5417,1089],{"emptyLinePlaceholder":1088},[1050,5419,5420],{"class":1052,"line":1224},[1050,5421,5422],{"class":1056},"# Test renewal\n",[1050,5424,5425,5427,5429,5432],{"class":1052,"line":1238},[1050,5426,5340],{"class":3849},[1050,5428,5358],{"class":1132},[1050,5430,5431],{"class":1132}," renew",[1050,5433,5434],{"class":3758}," --dry-run\n",[1050,5436,5437],{"class":1052,"line":1250},[1050,5438,1089],{"emptyLinePlaceholder":1088},[1050,5440,5441],{"class":1052,"line":1262},[1050,5442,5443],{"class":1056},"# Create certificate monitoring script\n",[1050,5445,5446,5449,5452,5455,5458],{"class":1052,"line":1268},[1050,5447,5448],{"class":3849},"cat",[1050,5450,5451],{"class":1147}," >",[1050,5453,5454],{"class":1132}," /opt/scripts/cert_monitor.sh",[1050,5456,5457],{"class":1147}," \u003C\u003C",[1050,5459,5460],{"class":1128}," 'EOF'\n",[1050,5462,5463],{"class":1052,"line":1273},[1050,5464,3740],{"class":1132},[1050,5466,5467],{"class":1052,"line":1279},[1050,5468,5469],{"class":1132},"# Monitor SSL certificate expiration\n",[1050,5471,5472],{"class":1052,"line":1289},[1050,5473,1089],{"emptyLinePlaceholder":1088},[1050,5475,5476],{"class":1052,"line":1301},[1050,5477,5478],{"class":1132},"DOMAIN=\"yourdomain.com\"\n",[1050,5480,5481],{"class":1052,"line":1317},[1050,5482,5483],{"class":1132},"THRESHOLD_DAYS=30\n",[1050,5485,5486],{"class":1052,"line":1329},[1050,5487,1089],{"emptyLinePlaceholder":1088},[1050,5489,5490],{"class":1052,"line":1341},[1050,5491,5492],{"class":1132},"# Check certificate expiration\n",[1050,5494,5495],{"class":1052,"line":1353},[1050,5496,5497],{"class":1132},"EXPIRY_DATE=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -dates | grep notAfter | cut -d= -f2)\n",[1050,5499,5500],{"class":1052,"line":1365},[1050,5501,5502],{"class":1132},"EXPIRY_EPOCH=$(date -d \"$EXPIRY_DATE\" +%s)\n",[1050,5504,5505],{"class":1052,"line":1377},[1050,5506,5507],{"class":1132},"CURRENT_EPOCH=$(date +%s)\n",[1050,5509,5510],{"class":1052,"line":1389},[1050,5511,5512],{"class":1132},"DAYS_UNTIL_EXPIRY=$(( ($EXPIRY_EPOCH - $CURRENT_EPOCH) / 86400 ))\n",[1050,5514,5515],{"class":1052,"line":1401},[1050,5516,1089],{"emptyLinePlaceholder":1088},[1050,5518,5519],{"class":1052,"line":1406},[1050,5520,5521],{"class":1132},"if [ $DAYS_UNTIL_EXPIRY -lt $THRESHOLD_DAYS ]; then\n",[1050,5523,5524],{"class":1052,"line":1411},[1050,5525,5526],{"class":1132},"    echo \"WARNING: SSL certificate for $DOMAIN expires in $DAYS_UNTIL_EXPIRY days\"\n",[1050,5528,5529],{"class":1052,"line":1417},[1050,5530,5531],{"class":1132},"    # Send alert email\n",[1050,5533,5534],{"class":1052,"line":1428},[1050,5535,5536],{"class":1132},"    echo \"SSL certificate for $DOMAIN expires in $DAYS_UNTIL_EXPIRY days\" | \\\n",[1050,5538,5539],{"class":1052,"line":1443},[1050,5540,5541],{"class":1132},"        mail -s \"SSL Certificate Expiration Warning\" admin@yourdomain.com\n",[1050,5543,5544],{"class":1052,"line":1466},[1050,5545,5546],{"class":1132},"fi\n",[1050,5548,5549],{"class":1052,"line":1500},[1050,5550,5551],{"class":1128},"EOF\n",[1050,5553,5554],{"class":1052,"line":1533},[1050,5555,1089],{"emptyLinePlaceholder":1088},[1050,5557,5558,5560,5563],{"class":1052,"line":1566},[1050,5559,4103],{"class":3849},[1050,5561,5562],{"class":1132}," +x",[1050,5564,5565],{"class":1132}," /opt/scripts/cert_monitor.sh\n",[1050,5567,5568],{"class":1052,"line":1599},[1050,5569,1089],{"emptyLinePlaceholder":1088},[1050,5571,5572],{"class":1052,"line":1641},[1050,5573,5574],{"class":1056},"# Add to cron (daily check)\n",[1050,5576,5577,5579,5581,5584,5586,5589,5592,5594],{"class":1052,"line":1655},[1050,5578,4188],{"class":3754},[1050,5580,3052],{"class":1128},[1050,5582,5583],{"class":1132},"0 9 * * * /opt/scripts/cert_monitor.sh",[1050,5585,1169],{"class":1128},[1050,5587,5588],{"class":1147}," |",[1050,5590,5591],{"class":3849}," sudo",[1050,5593,5405],{"class":1132},[1050,5595,5596],{"class":1132}," -\n",[1030,5598,5600],{"id":5599},"backup-and-recovery","Backup and Recovery",[1035,5602,5604],{"id":5603},"comprehensive-backup-strategy","Comprehensive Backup Strategy",[1040,5606,5608],{"className":2308,"code":5607,"language":2310,"meta":1045,"style":1045},"#!/bin/bash\n# comprehensive_backup.sh - Complete application backup\n\nset -euo pipefail\n\n# Configuration\nBACKUP_ROOT=\"/secure/backups\"\nAPP_ROOT=\"/opt/django-app\"\nDB_NAME=\"django_production\"\nDB_USER=\"django_user\"\nRETENTION_DAYS=30\n\n# Create backup directory structure\nTIMESTAMP=$(date +%Y%m%d_%H%M%S)\nBACKUP_DIR=\"$BACKUP_ROOT/$TIMESTAMP\"\nmkdir -p \"$BACKUP_DIR\"\n\necho \"Starting comprehensive backup: $TIMESTAMP\"\n\n# 1. Database backup\necho \"Backing up database...\"\npg_dump -h localhost -U \"$DB_USER\" -d \"$DB_NAME\" \\\n    --no-password --verbose --clean --no-acl --no-owner \\\n    > \"$BACKUP_DIR/database.sql\"\n\n# 2. Application code backup\necho \"Backing up application code...\"\ntar -czf \"$BACKUP_DIR/application.tar.gz\" \\\n    --exclude=\"*.pyc\" \\\n    --exclude=\"__pycache__\" \\\n    --exclude=\".git\" \\\n    --exclude=\"node_modules\" \\\n    --exclude=\"venv\" \\\n    -C \"$APP_ROOT\" .\n\n# 3. Media files backup\necho \"Backing up media files...\"\nif [ -d \"$APP_ROOT/media\" ]; then\n    tar -czf \"$BACKUP_DIR/media.tar.gz\" -C \"$APP_ROOT\" media/\nfi\n\n# 4. Configuration files backup\necho \"Backing up configuration files...\"\nmkdir -p \"$BACKUP_DIR/config\"\ncp /etc/nginx/sites-available/yourdomain.com \"$BACKUP_DIR/config/\"\ncp /etc/systemd/system/django.service \"$BACKUP_DIR/config/\"\ncp \"$APP_ROOT/.env.production\" \"$BACKUP_DIR/config/\"\n\n# 5. Create backup manifest\necho \"Creating backup manifest...\"\ncat > \"$BACKUP_DIR/manifest.txt\" \u003C\u003C EOF\nBackup created: $(date)\nHostname: $(hostname)\nDatabase size: $(du -h \"$BACKUP_DIR/database.sql\" | cut -f1)\nApplication size: $(du -h \"$BACKUP_DIR/application.tar.gz\" | cut -f1)\n\nFiles included:\n$(ls -la \"$BACKUP_DIR\")\nEOF\n\n# 6. Encrypt entire backup\necho \"Encrypting backup...\"\ntar -czf - -C \"$BACKUP_ROOT\" \"$TIMESTAMP\" | \\\n    gpg --cipher-algo AES256 --compress-algo 1 --s2k-mode 3 \\\n        --s2k-digest-algo SHA512 --s2k-count 65536 \\\n        --symmetric --output \"$BACKUP_ROOT/backup_$TIMESTAMP.tar.gz.gpg\"\n\n# 7. Remove unencrypted backup\nrm -rf \"$BACKUP_DIR\"\n\n# 8. Set secure permissions\nchmod 600 \"$BACKUP_ROOT/backup_$TIMESTAMP.tar.gz.gpg\"\n\n# 9. Clean old backups\nfind \"$BACKUP_ROOT\" -name \"backup_*.tar.gz.gpg\" \\\n    -mtime +$RETENTION_DAYS -delete\n\n# 10. Log completion\nBACKUP_SIZE=$(du -h \"$BACKUP_ROOT/backup_$TIMESTAMP.tar.gz.gpg\" | cut -f1)\nlogger \"Django backup completed: backup_$TIMESTAMP.tar.gz.gpg ($BACKUP_SIZE)\"\n\necho \"Backup completed successfully: backup_$TIMESTAMP.tar.gz.gpg ($BACKUP_SIZE)\"\n",[1047,5609,5610,5614,5619,5623,5631,5635,5639,5652,5666,5678,5690,5698,5702,5707,5719,5737,5749,5753,5766,5770,5775,5786,5812,5826,5839,5843,5848,5859,5878,5892,5905,5918,5931,5944,5959,5963,5968,5979,6002,6030,6034,6038,6043,6054,6069,6086,6101,6122,6126,6131,6142,6162,6174,6186,6216,6243,6247,6252,6270,6274,6278,6283,6294,6321,6340,6353,6374,6378,6383,6396,6400,6405,6423,6427,6432,6453,6463,6467,6472,6503,6524,6528],{"__ignoreMap":1045},[1050,5611,5612],{"class":1052,"line":1053},[1050,5613,3740],{"class":1056},[1050,5615,5616],{"class":1052,"line":1060},[1050,5617,5618],{"class":1056},"# comprehensive_backup.sh - Complete application backup\n",[1050,5620,5621],{"class":1052,"line":1071},[1050,5622,1089],{"emptyLinePlaceholder":1088},[1050,5624,5625,5627,5629],{"class":1052,"line":1085},[1050,5626,3755],{"class":3754},[1050,5628,3759],{"class":3758},[1050,5630,3762],{"class":1132},[1050,5632,5633],{"class":1052,"line":1092},[1050,5634,1089],{"emptyLinePlaceholder":1088},[1050,5636,5637],{"class":1052,"line":1098},[1050,5638,3771],{"class":1056},[1050,5640,5641,5644,5646,5648,5650],{"class":1052,"line":1141},[1050,5642,5643],{"class":2336},"BACKUP_ROOT",[1050,5645,2339],{"class":1105},[1050,5647,1169],{"class":1128},[1050,5649,3809],{"class":1132},[1050,5651,3058],{"class":1128},[1050,5653,5654,5657,5659,5661,5664],{"class":1052,"line":1157},[1050,5655,5656],{"class":2336},"APP_ROOT",[1050,5658,2339],{"class":1105},[1050,5660,1169],{"class":1128},[1050,5662,5663],{"class":1132},"/opt/django-app",[1050,5665,3058],{"class":1128},[1050,5667,5668,5670,5672,5674,5676],{"class":1052,"line":1179},[1050,5669,1492],{"class":2336},[1050,5671,2339],{"class":1105},[1050,5673,1169],{"class":1128},[1050,5675,3782],{"class":1132},[1050,5677,3058],{"class":1128},[1050,5679,5680,5682,5684,5686,5688],{"class":1052,"line":1184},[1050,5681,1526],{"class":2336},[1050,5683,2339],{"class":1105},[1050,5685,1169],{"class":1128},[1050,5687,3795],{"class":1132},[1050,5689,3058],{"class":1128},[1050,5691,5692,5694,5696],{"class":1052,"line":1190},[1050,5693,3830],{"class":2336},[1050,5695,2339],{"class":1105},[1050,5697,3835],{"class":1132},[1050,5699,5700],{"class":1052,"line":1202},[1050,5701,1089],{"emptyLinePlaceholder":1088},[1050,5703,5704],{"class":1052,"line":1207},[1050,5705,5706],{"class":1056},"# Create backup directory structure\n",[1050,5708,5709,5711,5713,5715,5717],{"class":1052,"line":1213},[1050,5710,3875],{"class":2336},[1050,5712,3878],{"class":1105},[1050,5714,3881],{"class":3849},[1050,5716,3884],{"class":1132},[1050,5718,1138],{"class":1105},[1050,5720,5721,5723,5725,5727,5730,5733,5735],{"class":1052,"line":1224},[1050,5722,3802],{"class":2336},[1050,5724,2339],{"class":1105},[1050,5726,1169],{"class":1128},[1050,5728,5729],{"class":3858},"$BACKUP_ROOT",[1050,5731,5732],{"class":1132},"/",[1050,5734,3903],{"class":3858},[1050,5736,3058],{"class":1128},[1050,5738,5739,5741,5743,5745,5747],{"class":1052,"line":1238},[1050,5740,3850],{"class":3849},[1050,5742,3853],{"class":3758},[1050,5744,3052],{"class":1128},[1050,5746,3859],{"class":3858},[1050,5748,3058],{"class":1128},[1050,5750,5751],{"class":1052,"line":1250},[1050,5752,1089],{"emptyLinePlaceholder":1088},[1050,5754,5755,5757,5759,5762,5764],{"class":1052,"line":1262},[1050,5756,4188],{"class":3754},[1050,5758,3052],{"class":1128},[1050,5760,5761],{"class":1132},"Starting comprehensive backup: ",[1050,5763,3903],{"class":3858},[1050,5765,3058],{"class":1128},[1050,5767,5768],{"class":1052,"line":1268},[1050,5769,1089],{"emptyLinePlaceholder":1088},[1050,5771,5772],{"class":1052,"line":1273},[1050,5773,5774],{"class":1056},"# 1. Database backup\n",[1050,5776,5777,5779,5781,5784],{"class":1052,"line":1279},[1050,5778,4188],{"class":3754},[1050,5780,3052],{"class":1128},[1050,5782,5783],{"class":1132},"Backing up database...",[1050,5785,3058],{"class":1128},[1050,5787,5788,5790,5792,5794,5796,5798,5800,5802,5804,5806,5808,5810],{"class":1052,"line":1289},[1050,5789,3939],{"class":3849},[1050,5791,3942],{"class":3758},[1050,5793,3945],{"class":1132},[1050,5795,3948],{"class":3758},[1050,5797,3052],{"class":1128},[1050,5799,3953],{"class":3858},[1050,5801,1169],{"class":1128},[1050,5803,3958],{"class":3758},[1050,5805,3052],{"class":1128},[1050,5807,3963],{"class":3858},[1050,5809,1169],{"class":1128},[1050,5811,3968],{"class":1101},[1050,5813,5814,5816,5818,5820,5822,5824],{"class":1052,"line":1301},[1050,5815,3973],{"class":3758},[1050,5817,3976],{"class":3758},[1050,5819,3979],{"class":3758},[1050,5821,3982],{"class":3758},[1050,5823,3985],{"class":3758},[1050,5825,3968],{"class":1101},[1050,5827,5828,5830,5832,5834,5837],{"class":1052,"line":1317},[1050,5829,3992],{"class":1147},[1050,5831,3052],{"class":1128},[1050,5833,3859],{"class":3858},[1050,5835,5836],{"class":1132},"/database.sql",[1050,5838,3058],{"class":1128},[1050,5840,5841],{"class":1052,"line":1329},[1050,5842,1089],{"emptyLinePlaceholder":1088},[1050,5844,5845],{"class":1052,"line":1341},[1050,5846,5847],{"class":1056},"# 2. Application code backup\n",[1050,5849,5850,5852,5854,5857],{"class":1052,"line":1353},[1050,5851,4188],{"class":3754},[1050,5853,3052],{"class":1128},[1050,5855,5856],{"class":1132},"Backing up application code...",[1050,5858,3058],{"class":1128},[1050,5860,5861,5864,5867,5869,5871,5874,5876],{"class":1052,"line":1365},[1050,5862,5863],{"class":3849},"tar",[1050,5865,5866],{"class":3758}," -czf",[1050,5868,3052],{"class":1128},[1050,5870,3859],{"class":3858},[1050,5872,5873],{"class":1132},"/application.tar.gz",[1050,5875,1169],{"class":1128},[1050,5877,3968],{"class":1101},[1050,5879,5880,5883,5885,5888,5890],{"class":1052,"line":1377},[1050,5881,5882],{"class":3758},"    --exclude=",[1050,5884,1169],{"class":1128},[1050,5886,5887],{"class":1132},"*.pyc",[1050,5889,1169],{"class":1128},[1050,5891,3968],{"class":1101},[1050,5893,5894,5896,5898,5901,5903],{"class":1052,"line":1389},[1050,5895,5882],{"class":3758},[1050,5897,1169],{"class":1128},[1050,5899,5900],{"class":1132},"__pycache__",[1050,5902,1169],{"class":1128},[1050,5904,3968],{"class":1101},[1050,5906,5907,5909,5911,5914,5916],{"class":1052,"line":1401},[1050,5908,5882],{"class":3758},[1050,5910,1169],{"class":1128},[1050,5912,5913],{"class":1132},".git",[1050,5915,1169],{"class":1128},[1050,5917,3968],{"class":1101},[1050,5919,5920,5922,5924,5927,5929],{"class":1052,"line":1406},[1050,5921,5882],{"class":3758},[1050,5923,1169],{"class":1128},[1050,5925,5926],{"class":1132},"node_modules",[1050,5928,1169],{"class":1128},[1050,5930,3968],{"class":1101},[1050,5932,5933,5935,5937,5940,5942],{"class":1052,"line":1411},[1050,5934,5882],{"class":3758},[1050,5936,1169],{"class":1128},[1050,5938,5939],{"class":1132},"venv",[1050,5941,1169],{"class":1128},[1050,5943,3968],{"class":1101},[1050,5945,5946,5949,5951,5954,5956],{"class":1052,"line":1417},[1050,5947,5948],{"class":3758},"    -C",[1050,5950,3052],{"class":1128},[1050,5952,5953],{"class":3858},"$APP_ROOT",[1050,5955,1169],{"class":1128},[1050,5957,5958],{"class":1132}," .\n",[1050,5960,5961],{"class":1052,"line":1428},[1050,5962,1089],{"emptyLinePlaceholder":1088},[1050,5964,5965],{"class":1052,"line":1443},[1050,5966,5967],{"class":1056},"# 3. Media files backup\n",[1050,5969,5970,5972,5974,5977],{"class":1052,"line":1466},[1050,5971,4188],{"class":3754},[1050,5973,3052],{"class":1128},[1050,5975,5976],{"class":1132},"Backing up media files...",[1050,5978,3058],{"class":1128},[1050,5980,5981,5983,5985,5987,5989,5991,5994,5996,5999],{"class":1052,"line":1500},[1050,5982,1144],{"class":1063},[1050,5984,4554],{"class":1105},[1050,5986,3958],{"class":1147},[1050,5988,3052],{"class":1128},[1050,5990,5953],{"class":3858},[1050,5992,5993],{"class":1132},"/media",[1050,5995,1169],{"class":1128},[1050,5997,5998],{"class":1105}," ];",[1050,6000,6001],{"class":1063}," then\n",[1050,6003,6004,6007,6009,6011,6013,6016,6018,6021,6023,6025,6027],{"class":1052,"line":1533},[1050,6005,6006],{"class":3849},"    tar",[1050,6008,5866],{"class":3758},[1050,6010,3052],{"class":1128},[1050,6012,3859],{"class":3858},[1050,6014,6015],{"class":1132},"/media.tar.gz",[1050,6017,1169],{"class":1128},[1050,6019,6020],{"class":3758}," -C",[1050,6022,3052],{"class":1128},[1050,6024,5953],{"class":3858},[1050,6026,1169],{"class":1128},[1050,6028,6029],{"class":1132}," media/\n",[1050,6031,6032],{"class":1052,"line":1566},[1050,6033,5546],{"class":1063},[1050,6035,6036],{"class":1052,"line":1599},[1050,6037,1089],{"emptyLinePlaceholder":1088},[1050,6039,6040],{"class":1052,"line":1641},[1050,6041,6042],{"class":1056},"# 4. Configuration files backup\n",[1050,6044,6045,6047,6049,6052],{"class":1052,"line":1655},[1050,6046,4188],{"class":3754},[1050,6048,3052],{"class":1128},[1050,6050,6051],{"class":1132},"Backing up configuration files...",[1050,6053,3058],{"class":1128},[1050,6055,6056,6058,6060,6062,6064,6067],{"class":1052,"line":1677},[1050,6057,3850],{"class":3849},[1050,6059,3853],{"class":3758},[1050,6061,3052],{"class":1128},[1050,6063,3859],{"class":3858},[1050,6065,6066],{"class":1132},"/config",[1050,6068,3058],{"class":1128},[1050,6070,6071,6074,6077,6079,6081,6084],{"class":1052,"line":1683},[1050,6072,6073],{"class":3849},"cp",[1050,6075,6076],{"class":1132}," /etc/nginx/sites-available/yourdomain.com",[1050,6078,3052],{"class":1128},[1050,6080,3859],{"class":3858},[1050,6082,6083],{"class":1132},"/config/",[1050,6085,3058],{"class":1128},[1050,6087,6088,6090,6093,6095,6097,6099],{"class":1052,"line":1701},[1050,6089,6073],{"class":3849},[1050,6091,6092],{"class":1132}," /etc/systemd/system/django.service",[1050,6094,3052],{"class":1128},[1050,6096,3859],{"class":3858},[1050,6098,6083],{"class":1132},[1050,6100,3058],{"class":1128},[1050,6102,6103,6105,6107,6109,6112,6114,6116,6118,6120],{"class":1052,"line":1707},[1050,6104,6073],{"class":3849},[1050,6106,3052],{"class":1128},[1050,6108,5953],{"class":3858},[1050,6110,6111],{"class":1132},"/.env.production",[1050,6113,1169],{"class":1128},[1050,6115,3052],{"class":1128},[1050,6117,3859],{"class":3858},[1050,6119,6083],{"class":1132},[1050,6121,3058],{"class":1128},[1050,6123,6124],{"class":1052,"line":1713},[1050,6125,1089],{"emptyLinePlaceholder":1088},[1050,6127,6128],{"class":1052,"line":1718},[1050,6129,6130],{"class":1056},"# 5. Create backup manifest\n",[1050,6132,6133,6135,6137,6140],{"class":1052,"line":1724},[1050,6134,4188],{"class":3754},[1050,6136,3052],{"class":1128},[1050,6138,6139],{"class":1132},"Creating backup manifest...",[1050,6141,3058],{"class":1128},[1050,6143,6144,6146,6148,6150,6152,6155,6157,6159],{"class":1052,"line":1734},[1050,6145,5448],{"class":3849},[1050,6147,5451],{"class":1147},[1050,6149,3052],{"class":1128},[1050,6151,3859],{"class":3858},[1050,6153,6154],{"class":1132},"/manifest.txt",[1050,6156,1169],{"class":1128},[1050,6158,5457],{"class":1147},[1050,6160,6161],{"class":1128}," EOF\n",[1050,6163,6164,6167,6170,6172],{"class":1052,"line":1747},[1050,6165,6166],{"class":1132},"Backup created: ",[1050,6168,6169],{"class":1105},"$(",[1050,6171,3881],{"class":3849},[1050,6173,1138],{"class":1105},[1050,6175,6176,6179,6181,6184],{"class":1052,"line":1768},[1050,6177,6178],{"class":1132},"Hostname: ",[1050,6180,6169],{"class":1105},[1050,6182,6183],{"class":3849},"hostname",[1050,6185,1138],{"class":1105},[1050,6187,6188,6191,6193,6196,6198,6200,6202,6204,6206,6208,6211,6214],{"class":1052,"line":1801},[1050,6189,6190],{"class":1132},"Database size: ",[1050,6192,6169],{"class":1105},[1050,6194,6195],{"class":3849},"du",[1050,6197,3942],{"class":3758},[1050,6199,3052],{"class":1128},[1050,6201,3859],{"class":3858},[1050,6203,5836],{"class":1132},[1050,6205,1169],{"class":1128},[1050,6207,5588],{"class":1147},[1050,6209,6210],{"class":3849}," cut",[1050,6212,6213],{"class":3758}," -f1",[1050,6215,1138],{"class":1105},[1050,6217,6218,6221,6223,6225,6227,6229,6231,6233,6235,6237,6239,6241],{"class":1052,"line":1814},[1050,6219,6220],{"class":1132},"Application size: ",[1050,6222,6169],{"class":1105},[1050,6224,6195],{"class":3849},[1050,6226,3942],{"class":3758},[1050,6228,3052],{"class":1128},[1050,6230,3859],{"class":3858},[1050,6232,5873],{"class":1132},[1050,6234,1169],{"class":1128},[1050,6236,5588],{"class":1147},[1050,6238,6210],{"class":3849},[1050,6240,6213],{"class":3758},[1050,6242,1138],{"class":1105},[1050,6244,6245],{"class":1052,"line":1835},[1050,6246,1089],{"emptyLinePlaceholder":1088},[1050,6248,6249],{"class":1052,"line":1849},[1050,6250,6251],{"class":1132},"Files included:\n",[1050,6253,6254,6256,6259,6262,6264,6266,6268],{"class":1052,"line":1871},[1050,6255,6169],{"class":1105},[1050,6257,6258],{"class":3849},"ls",[1050,6260,6261],{"class":3758}," -la",[1050,6263,3052],{"class":1128},[1050,6265,3859],{"class":3858},[1050,6267,1169],{"class":1128},[1050,6269,1138],{"class":1105},[1050,6271,6272],{"class":1052,"line":1892},[1050,6273,5551],{"class":1128},[1050,6275,6276],{"class":1052,"line":1898},[1050,6277,1089],{"emptyLinePlaceholder":1088},[1050,6279,6280],{"class":1052,"line":1904},[1050,6281,6282],{"class":1056},"# 6. Encrypt entire backup\n",[1050,6284,6285,6287,6289,6292],{"class":1052,"line":1909},[1050,6286,4188],{"class":3754},[1050,6288,3052],{"class":1128},[1050,6290,6291],{"class":1132},"Encrypting backup...",[1050,6293,3058],{"class":1128},[1050,6295,6296,6298,6300,6303,6305,6307,6309,6311,6313,6315,6317,6319],{"class":1052,"line":1914},[1050,6297,5863],{"class":3849},[1050,6299,5866],{"class":3758},[1050,6301,6302],{"class":1132}," -",[1050,6304,6020],{"class":3758},[1050,6306,3052],{"class":1128},[1050,6308,5729],{"class":3858},[1050,6310,1169],{"class":1128},[1050,6312,3052],{"class":1128},[1050,6314,3903],{"class":3858},[1050,6316,1169],{"class":1128},[1050,6318,5588],{"class":1147},[1050,6320,3968],{"class":1101},[1050,6322,6323,6326,6328,6330,6332,6334,6336,6338],{"class":1052,"line":1919},[1050,6324,6325],{"class":3849},"    gpg",[1050,6327,4015],{"class":3758},[1050,6329,4018],{"class":1132},[1050,6331,4021],{"class":3758},[1050,6333,4024],{"class":1695},[1050,6335,4027],{"class":3758},[1050,6337,4030],{"class":1695},[1050,6339,3968],{"class":1101},[1050,6341,6342,6345,6347,6349,6351],{"class":1052,"line":1925},[1050,6343,6344],{"class":3758},"        --s2k-digest-algo",[1050,6346,4040],{"class":1132},[1050,6348,4043],{"class":3758},[1050,6350,4046],{"class":1695},[1050,6352,3968],{"class":1101},[1050,6354,6355,6358,6360,6362,6364,6367,6369,6372],{"class":1052,"line":1941},[1050,6356,6357],{"class":3758},"        --symmetric",[1050,6359,4056],{"class":3758},[1050,6361,3052],{"class":1128},[1050,6363,5729],{"class":3858},[1050,6365,6366],{"class":1132},"/backup_",[1050,6368,3903],{"class":3858},[1050,6370,6371],{"class":1132},".tar.gz.gpg",[1050,6373,3058],{"class":1128},[1050,6375,6376],{"class":1052,"line":1955},[1050,6377,1089],{"emptyLinePlaceholder":1088},[1050,6379,6380],{"class":1052,"line":1966},[1050,6381,6382],{"class":1056},"# 7. Remove unencrypted backup\n",[1050,6384,6385,6387,6390,6392,6394],{"class":1052,"line":1976},[1050,6386,4083],{"class":3849},[1050,6388,6389],{"class":3758}," -rf",[1050,6391,3052],{"class":1128},[1050,6393,3859],{"class":3858},[1050,6395,3058],{"class":1128},[1050,6397,6398],{"class":1052,"line":1991},[1050,6399,1089],{"emptyLinePlaceholder":1088},[1050,6401,6402],{"class":1052,"line":2005},[1050,6403,6404],{"class":1056},"# 8. Set secure permissions\n",[1050,6406,6407,6409,6411,6413,6415,6417,6419,6421],{"class":1052,"line":2015},[1050,6408,4103],{"class":3849},[1050,6410,1696],{"class":1695},[1050,6412,3052],{"class":1128},[1050,6414,5729],{"class":3858},[1050,6416,6366],{"class":1132},[1050,6418,3903],{"class":3858},[1050,6420,6371],{"class":1132},[1050,6422,3058],{"class":1128},[1050,6424,6425],{"class":1052,"line":2025},[1050,6426,1089],{"emptyLinePlaceholder":1088},[1050,6428,6429],{"class":1052,"line":2030},[1050,6430,6431],{"class":1056},"# 9. Clean old backups\n",[1050,6433,6434,6436,6438,6440,6442,6444,6446,6449,6451],{"class":1052,"line":2036},[1050,6435,4125],{"class":3849},[1050,6437,3052],{"class":1128},[1050,6439,5729],{"class":3858},[1050,6441,1169],{"class":1128},[1050,6443,4134],{"class":3758},[1050,6445,3052],{"class":1128},[1050,6447,6448],{"class":1132},"backup_*.tar.gz.gpg",[1050,6450,1169],{"class":1128},[1050,6452,3968],{"class":1101},[1050,6454,6455,6457,6459,6461],{"class":1052,"line":2046},[1050,6456,4148],{"class":3758},[1050,6458,3104],{"class":1132},[1050,6460,4153],{"class":2336},[1050,6462,4156],{"class":3758},[1050,6464,6465],{"class":1052,"line":2056},[1050,6466,1089],{"emptyLinePlaceholder":1088},[1050,6468,6469],{"class":1052,"line":2070},[1050,6470,6471],{"class":1056},"# 10. Log completion\n",[1050,6473,6474,6477,6479,6481,6483,6485,6487,6489,6491,6493,6495,6497,6499,6501],{"class":1052,"line":2080},[1050,6475,6476],{"class":2336},"BACKUP_SIZE",[1050,6478,3878],{"class":1105},[1050,6480,6195],{"class":3849},[1050,6482,3942],{"class":3758},[1050,6484,3052],{"class":1128},[1050,6486,5729],{"class":3858},[1050,6488,6366],{"class":1132},[1050,6490,3903],{"class":3858},[1050,6492,6371],{"class":1132},[1050,6494,1169],{"class":1128},[1050,6496,5588],{"class":1147},[1050,6498,6210],{"class":3849},[1050,6500,6213],{"class":3758},[1050,6502,1138],{"class":1105},[1050,6504,6505,6507,6509,6512,6514,6517,6520,6522],{"class":1052,"line":2092},[1050,6506,4170],{"class":3849},[1050,6508,3052],{"class":1128},[1050,6510,6511],{"class":1132},"Django backup completed: backup_",[1050,6513,3903],{"class":3858},[1050,6515,6516],{"class":1132},".tar.gz.gpg (",[1050,6518,6519],{"class":3858},"$BACKUP_SIZE",[1050,6521,4528],{"class":1132},[1050,6523,3058],{"class":1128},[1050,6525,6526],{"class":1052,"line":2104},[1050,6527,1089],{"emptyLinePlaceholder":1088},[1050,6529,6530,6532,6534,6537,6539,6541,6543,6545],{"class":1052,"line":2109},[1050,6531,4188],{"class":3754},[1050,6533,3052],{"class":1128},[1050,6535,6536],{"class":1132},"Backup completed successfully: backup_",[1050,6538,3903],{"class":3858},[1050,6540,6516],{"class":1132},[1050,6542,6519],{"class":3858},[1050,6544,4528],{"class":1132},[1050,6546,3058],{"class":1128},[1030,6548,6550],{"id":6549},"security-auditing","Security Auditing",[1035,6552,6554],{"id":6553},"automated-security-checks","Automated Security Checks",[1040,6556,6558],{"className":1042,"code":6557,"language":1044,"meta":1045,"style":1045},"# security_audit.py - Automated security audit script\nimport os\nimport subprocess\nimport json\nfrom pathlib import Path\n\nclass SecurityAuditor:\n    \"\"\"Perform automated security audits\"\"\"\n    \n    def __init__(self, project_root):\n        self.project_root = Path(project_root)\n        self.results = {}\n    \n    def run_full_audit(self):\n        \"\"\"Run complete security audit\"\"\"\n        \n        print(\"Starting security audit...\")\n        \n        # Check Django configuration\n        self.audit_django_settings()\n        \n        # Check dependencies for vulnerabilities\n        self.audit_dependencies()\n        \n        # Check file permissions\n        self.audit_file_permissions()\n        \n        # Generate report\n        self.generate_report()\n    \n    def audit_django_settings(self):\n        \"\"\"Audit Django settings for security issues\"\"\"\n        \n        print(\"Auditing Django settings...\")\n        \n        settings_issues = []\n        \n        # Check common security settings\n        security_checks = [\n            ('DEBUG', False, \"DEBUG should be False in production\"),\n            ('ALLOWED_HOSTS', None, \"ALLOWED_HOSTS should not contain wildcards\"),\n            ('SECRET_KEY', None, \"SECRET_KEY should be set from environment\"),\n        ]\n        \n        # This would check actual Django settings in practice\n        # For now, we'll simulate the checks\n        \n        self.results['django_settings'] = settings_issues\n    \n    def audit_dependencies(self):\n        \"\"\"Check dependencies for known vulnerabilities\"\"\"\n        \n        print(\"Auditing dependencies...\")\n        \n        try:\n            # Run safety check (requires 'safety' package)\n            result = subprocess.run(\n                ['safety', 'check', '--json'],\n                capture_output=True,\n                text=True,\n                cwd=self.project_root\n            )\n            \n            if result.returncode == 0:\n                self.results['dependencies'] = []\n            else:\n                vulnerabilities = json.loads(result.stdout)\n                self.results['dependencies'] = vulnerabilities\n                \n        except (subprocess.CalledProcessError, json.JSONDecodeError, FileNotFoundError):\n            self.results['dependencies'] = [\"Could not run dependency audit\"]\n    \n    def audit_file_permissions(self):\n        \"\"\"Check file permissions for security issues\"\"\"\n        \n        print(\"Auditing file permissions...\")\n        \n        permission_issues = []\n        \n        # Check sensitive files\n        sensitive_files = [\n            '.env',\n            '.env.production',\n            'db.sqlite3',\n        ]\n        \n        for filename in sensitive_files:\n            filepath = self.project_root / filename\n            if filepath.exists():\n                stat = filepath.stat()\n                mode = oct(stat.st_mode)[-3:]\n                \n                # Check if file is world-readable\n                if int(mode[2]) > 0:\n                    permission_issues.append(f\"{filename} is world-readable ({mode})\")\n        \n        self.results['file_permissions'] = permission_issues\n    \n    def generate_report(self):\n        \"\"\"Generate security audit report\"\"\"\n        \n        print(\"\\n\" + \"=\"*50)\n        print(\"SECURITY AUDIT REPORT\")\n        print(\"=\"*50)\n        \n        total_issues = sum(len(issues) for issues in self.results.values() if isinstance(issues, list))\n        \n        print(f\"Total issues found: {total_issues}\")\n        print()\n        \n        for category, issues in self.results.items():\n            print(f\"{category.upper().replace('_', ' ')}:\")\n            if isinstance(issues, list):\n                if issues:\n                    for issue in issues:\n                        print(f\"  ❌ {issue}\")\n                else:\n                    print(\"  ✅ No issues found\")\n            else:\n                print(f\"  ℹ️  {issues}\")\n            print()\n\nif __name__ == \"__main__\":\n    import sys\n    \n    project_root = sys.argv[1] if len(sys.argv) > 1 else \"/opt/django-app\"\n    \n    auditor = SecurityAuditor(project_root)\n    auditor.run_full_audit()\n",[1047,6559,6560,6565,6571,6578,6585,6595,6599,6608,6617,6621,6638,6658,6672,6676,6689,6698,6702,6718,6722,6727,6738,6742,6747,6758,6762,6767,6778,6782,6787,6798,6802,6815,6824,6828,6843,6847,6857,6861,6866,6875,6902,6928,6953,6958,6962,6967,6972,6976,7002,7006,7019,7028,7032,7047,7051,7058,7063,7080,7113,7126,7137,7151,7155,7160,7179,7203,7210,7237,7260,7265,7296,7328,7332,7345,7354,7358,7373,7377,7386,7390,7395,7404,7415,7426,7437,7441,7445,7459,7478,7493,7509,7540,7544,7549,7576,7614,7618,7642,7646,7659,7669,7674,7704,7720,7739,7744,7806,7811,7834,7841,7846,7873,7924,7941,7951,7966,7990,7998,8015,8022,8045,8052,8057,8077,8086,8091,8143,8148,8164],{"__ignoreMap":1045},[1050,6561,6562],{"class":1052,"line":1053},[1050,6563,6564],{"class":1056},"# security_audit.py - Automated security audit script\n",[1050,6566,6567,6569],{"class":1052,"line":1060},[1050,6568,1064],{"class":1063},[1050,6570,1068],{"class":1067},[1050,6572,6573,6575],{"class":1052,"line":1071},[1050,6574,1064],{"class":1063},[1050,6576,6577],{"class":1067}," subprocess\n",[1050,6579,6580,6582],{"class":1052,"line":1085},[1050,6581,1064],{"class":1063},[1050,6583,6584],{"class":1067}," json\n",[1050,6586,6587,6589,6591,6593],{"class":1052,"line":1092},[1050,6588,1074],{"class":1063},[1050,6590,1077],{"class":1067},[1050,6592,1064],{"class":1063},[1050,6594,1082],{"class":1067},[1050,6596,6597],{"class":1052,"line":1098},[1050,6598,1089],{"emptyLinePlaceholder":1088},[1050,6600,6601,6603,6606],{"class":1052,"line":1141},[1050,6602,4327],{"class":2284},[1050,6604,6605],{"class":4330}," SecurityAuditor",[1050,6607,1154],{"class":1105},[1050,6609,6610,6612,6615],{"class":1052,"line":1157},[1050,6611,4345],{"class":4344},[1050,6613,6614],{"class":4348},"Perform automated security audits",[1050,6616,4352],{"class":4344},[1050,6618,6619],{"class":1052,"line":1179},[1050,6620,2619],{"class":1067},[1050,6622,6623,6625,6627,6629,6631,6633,6636],{"class":1052,"line":1184},[1050,6624,4361],{"class":2284},[1050,6626,4364],{"class":3754},[1050,6628,1125],{"class":1105},[1050,6630,4370],{"class":4369},[1050,6632,1311],{"class":1105},[1050,6634,6635],{"class":4375}," project_root",[1050,6637,4339],{"class":1105},[1050,6639,6640,6642,6644,6647,6649,6652,6654,6656],{"class":1052,"line":1190},[1050,6641,4383],{"class":1101},[1050,6643,1112],{"class":1105},[1050,6645,6646],{"class":1115},"project_root",[1050,6648,1106],{"class":1105},[1050,6650,6651],{"class":1121}," Path",[1050,6653,1125],{"class":1105},[1050,6655,6646],{"class":1121},[1050,6657,1138],{"class":1105},[1050,6659,6660,6662,6664,6667,6669],{"class":1052,"line":1202},[1050,6661,4383],{"class":1101},[1050,6663,1112],{"class":1105},[1050,6665,6666],{"class":1115},"results",[1050,6668,1106],{"class":1105},[1050,6670,6671],{"class":1105}," {}\n",[1050,6673,6674],{"class":1052,"line":1207},[1050,6675,2619],{"class":1067},[1050,6677,6678,6680,6683,6685,6687],{"class":1052,"line":1213},[1050,6679,4361],{"class":2284},[1050,6681,6682],{"class":3572}," run_full_audit",[1050,6684,1125],{"class":1105},[1050,6686,4370],{"class":4369},[1050,6688,4339],{"class":1105},[1050,6690,6691,6693,6696],{"class":1052,"line":1224},[1050,6692,4437],{"class":4344},[1050,6694,6695],{"class":4348},"Run complete security audit",[1050,6697,4352],{"class":4344},[1050,6699,6700],{"class":1052,"line":1238},[1050,6701,2828],{"class":1067},[1050,6703,6704,6707,6709,6711,6714,6716],{"class":1052,"line":1250},[1050,6705,6706],{"class":3754},"        print",[1050,6708,1125],{"class":1105},[1050,6710,1169],{"class":1128},[1050,6712,6713],{"class":1132},"Starting security audit...",[1050,6715,1169],{"class":1128},[1050,6717,1138],{"class":1105},[1050,6719,6720],{"class":1052,"line":1262},[1050,6721,2828],{"class":1067},[1050,6723,6724],{"class":1052,"line":1268},[1050,6725,6726],{"class":1056},"        # Check Django configuration\n",[1050,6728,6729,6731,6733,6736],{"class":1052,"line":1273},[1050,6730,4383],{"class":1101},[1050,6732,1112],{"class":1105},[1050,6734,6735],{"class":1121},"audit_django_settings",[1050,6737,4842],{"class":1105},[1050,6739,6740],{"class":1052,"line":1279},[1050,6741,2828],{"class":1067},[1050,6743,6744],{"class":1052,"line":1289},[1050,6745,6746],{"class":1056},"        # Check dependencies for vulnerabilities\n",[1050,6748,6749,6751,6753,6756],{"class":1052,"line":1301},[1050,6750,4383],{"class":1101},[1050,6752,1112],{"class":1105},[1050,6754,6755],{"class":1121},"audit_dependencies",[1050,6757,4842],{"class":1105},[1050,6759,6760],{"class":1052,"line":1317},[1050,6761,2828],{"class":1067},[1050,6763,6764],{"class":1052,"line":1329},[1050,6765,6766],{"class":1056},"        # Check file permissions\n",[1050,6768,6769,6771,6773,6776],{"class":1052,"line":1341},[1050,6770,4383],{"class":1101},[1050,6772,1112],{"class":1105},[1050,6774,6775],{"class":1121},"audit_file_permissions",[1050,6777,4842],{"class":1105},[1050,6779,6780],{"class":1052,"line":1353},[1050,6781,2828],{"class":1067},[1050,6783,6784],{"class":1052,"line":1365},[1050,6785,6786],{"class":1056},"        # Generate report\n",[1050,6788,6789,6791,6793,6796],{"class":1052,"line":1377},[1050,6790,4383],{"class":1101},[1050,6792,1112],{"class":1105},[1050,6794,6795],{"class":1121},"generate_report",[1050,6797,4842],{"class":1105},[1050,6799,6800],{"class":1052,"line":1389},[1050,6801,2619],{"class":1067},[1050,6803,6804,6806,6809,6811,6813],{"class":1052,"line":1401},[1050,6805,4361],{"class":2284},[1050,6807,6808],{"class":3572}," audit_django_settings",[1050,6810,1125],{"class":1105},[1050,6812,4370],{"class":4369},[1050,6814,4339],{"class":1105},[1050,6816,6817,6819,6822],{"class":1052,"line":1406},[1050,6818,4437],{"class":4344},[1050,6820,6821],{"class":4348},"Audit Django settings for security issues",[1050,6823,4352],{"class":4344},[1050,6825,6826],{"class":1052,"line":1411},[1050,6827,2828],{"class":1067},[1050,6829,6830,6832,6834,6836,6839,6841],{"class":1052,"line":1417},[1050,6831,6706],{"class":3754},[1050,6833,1125],{"class":1105},[1050,6835,1169],{"class":1128},[1050,6837,6838],{"class":1132},"Auditing Django settings...",[1050,6840,1169],{"class":1128},[1050,6842,1138],{"class":1105},[1050,6844,6845],{"class":1052,"line":1428},[1050,6846,2828],{"class":1067},[1050,6848,6849,6852,6854],{"class":1052,"line":1443},[1050,6850,6851],{"class":1067},"        settings_issues ",[1050,6853,2339],{"class":1105},[1050,6855,6856],{"class":1105}," []\n",[1050,6858,6859],{"class":1052,"line":1466},[1050,6860,2828],{"class":1067},[1050,6862,6863],{"class":1052,"line":1500},[1050,6864,6865],{"class":1056},"        # Check common security settings\n",[1050,6867,6868,6871,6873],{"class":1052,"line":1533},[1050,6869,6870],{"class":1067},"        security_checks ",[1050,6872,2339],{"class":1105},[1050,6874,1221],{"class":1105},[1050,6876,6877,6880,6882,6884,6886,6888,6891,6893,6895,6898,6900],{"class":1052,"line":1566},[1050,6878,6879],{"class":1105},"            (",[1050,6881,1129],{"class":1128},[1050,6883,1193],{"class":1132},[1050,6885,1129],{"class":1128},[1050,6887,1311],{"class":1105},[1050,6889,6890],{"class":1198}," False",[1050,6892,1311],{"class":1105},[1050,6894,3052],{"class":1128},[1050,6896,6897],{"class":1132},"DEBUG should be False in production",[1050,6899,1169],{"class":1128},[1050,6901,1497],{"class":1105},[1050,6903,6904,6906,6908,6910,6912,6914,6917,6919,6921,6924,6926],{"class":1052,"line":1599},[1050,6905,6879],{"class":1105},[1050,6907,1129],{"class":1128},[1050,6909,1216],{"class":1132},[1050,6911,1129],{"class":1128},[1050,6913,1311],{"class":1105},[1050,6915,6916],{"class":1198}," None",[1050,6918,1311],{"class":1105},[1050,6920,3052],{"class":1128},[1050,6922,6923],{"class":1132},"ALLOWED_HOSTS should not contain wildcards",[1050,6925,1169],{"class":1128},[1050,6927,1497],{"class":1105},[1050,6929,6930,6932,6934,6936,6938,6940,6942,6944,6946,6949,6951],{"class":1052,"line":1641},[1050,6931,6879],{"class":1105},[1050,6933,1129],{"class":1128},[1050,6935,1102],{"class":1132},[1050,6937,1129],{"class":1128},[1050,6939,1311],{"class":1105},[1050,6941,6916],{"class":1198},[1050,6943,1311],{"class":1105},[1050,6945,3052],{"class":1128},[1050,6947,6948],{"class":1132},"SECRET_KEY should be set from environment",[1050,6950,1169],{"class":1128},[1050,6952,1497],{"class":1105},[1050,6954,6955],{"class":1052,"line":1655},[1050,6956,6957],{"class":1105},"        ]\n",[1050,6959,6960],{"class":1052,"line":1677},[1050,6961,2828],{"class":1067},[1050,6963,6964],{"class":1052,"line":1683},[1050,6965,6966],{"class":1056},"        # This would check actual Django settings in practice\n",[1050,6968,6969],{"class":1052,"line":1701},[1050,6970,6971],{"class":1056},"        # For now, we'll simulate the checks\n",[1050,6973,6974],{"class":1052,"line":1707},[1050,6975,2828],{"class":1067},[1050,6977,6978,6980,6982,6984,6987,6989,6992,6994,6997,6999],{"class":1052,"line":1713},[1050,6979,4383],{"class":1101},[1050,6981,1112],{"class":1105},[1050,6983,6666],{"class":1115},[1050,6985,6986],{"class":1105},"[",[1050,6988,1129],{"class":1128},[1050,6990,6991],{"class":1132},"django_settings",[1050,6993,1129],{"class":1128},[1050,6995,6996],{"class":1105},"]",[1050,6998,1106],{"class":1105},[1050,7000,7001],{"class":1067}," settings_issues\n",[1050,7003,7004],{"class":1052,"line":1718},[1050,7005,2619],{"class":1067},[1050,7007,7008,7010,7013,7015,7017],{"class":1052,"line":1724},[1050,7009,4361],{"class":2284},[1050,7011,7012],{"class":3572}," audit_dependencies",[1050,7014,1125],{"class":1105},[1050,7016,4370],{"class":4369},[1050,7018,4339],{"class":1105},[1050,7020,7021,7023,7026],{"class":1052,"line":1734},[1050,7022,4437],{"class":4344},[1050,7024,7025],{"class":4348},"Check dependencies for known vulnerabilities",[1050,7027,4352],{"class":4344},[1050,7029,7030],{"class":1052,"line":1747},[1050,7031,2828],{"class":1067},[1050,7033,7034,7036,7038,7040,7043,7045],{"class":1052,"line":1768},[1050,7035,6706],{"class":3754},[1050,7037,1125],{"class":1105},[1050,7039,1169],{"class":1128},[1050,7041,7042],{"class":1132},"Auditing dependencies...",[1050,7044,1169],{"class":1128},[1050,7046,1138],{"class":1105},[1050,7048,7049],{"class":1052,"line":1801},[1050,7050,2828],{"class":1067},[1050,7052,7053,7056],{"class":1052,"line":1814},[1050,7054,7055],{"class":1063},"        try",[1050,7057,1154],{"class":1105},[1050,7059,7060],{"class":1052,"line":1835},[1050,7061,7062],{"class":1056},"            # Run safety check (requires 'safety' package)\n",[1050,7064,7065,7068,7070,7073,7075,7078],{"class":1052,"line":1849},[1050,7066,7067],{"class":1067},"            result ",[1050,7069,2339],{"class":1105},[1050,7071,7072],{"class":1067}," subprocess",[1050,7074,1112],{"class":1105},[1050,7076,7077],{"class":1121},"run",[1050,7079,4491],{"class":1105},[1050,7081,7082,7085,7087,7090,7092,7094,7096,7099,7101,7103,7105,7108,7110],{"class":1052,"line":1871},[1050,7083,7084],{"class":1105},"                [",[1050,7086,1129],{"class":1128},[1050,7088,7089],{"class":1132},"safety",[1050,7091,1129],{"class":1128},[1050,7093,1311],{"class":1105},[1050,7095,1456],{"class":1128},[1050,7097,7098],{"class":1132},"check",[1050,7100,1129],{"class":1128},[1050,7102,1311],{"class":1105},[1050,7104,1456],{"class":1128},[1050,7106,7107],{"class":1132},"--json",[1050,7109,1129],{"class":1128},[1050,7111,7112],{"class":1105},"],\n",[1050,7114,7115,7119,7121,7124],{"class":1052,"line":1892},[1050,7116,7118],{"class":7117},"sqOPj","                capture_output",[1050,7120,2339],{"class":1105},[1050,7122,7123],{"class":1198},"True",[1050,7125,1235],{"class":1105},[1050,7127,7128,7131,7133,7135],{"class":1052,"line":1898},[1050,7129,7130],{"class":7117},"                text",[1050,7132,2339],{"class":1105},[1050,7134,7123],{"class":1198},[1050,7136,1235],{"class":1105},[1050,7138,7139,7142,7144,7146,7148],{"class":1052,"line":1904},[1050,7140,7141],{"class":7117},"                cwd",[1050,7143,2339],{"class":1105},[1050,7145,4370],{"class":1101},[1050,7147,1112],{"class":1105},[1050,7149,7150],{"class":1115},"project_root\n",[1050,7152,7153],{"class":1052,"line":1909},[1050,7154,4573],{"class":1105},[1050,7156,7157],{"class":1052,"line":1914},[1050,7158,7159],{"class":1067},"            \n",[1050,7161,7162,7164,7167,7169,7172,7175,7177],{"class":1052,"line":1919},[1050,7163,4867],{"class":1063},[1050,7165,7166],{"class":1067}," result",[1050,7168,1112],{"class":1105},[1050,7170,7171],{"class":1115},"returncode",[1050,7173,7174],{"class":1147}," ==",[1050,7176,5228],{"class":1695},[1050,7178,1154],{"class":1105},[1050,7180,7181,7184,7186,7188,7190,7192,7195,7197,7199,7201],{"class":1052,"line":1925},[1050,7182,7183],{"class":1101},"                self",[1050,7185,1112],{"class":1105},[1050,7187,6666],{"class":1115},[1050,7189,6986],{"class":1105},[1050,7191,1129],{"class":1128},[1050,7193,7194],{"class":1132},"dependencies",[1050,7196,1129],{"class":1128},[1050,7198,6996],{"class":1105},[1050,7200,1106],{"class":1105},[1050,7202,6856],{"class":1105},[1050,7204,7205,7208],{"class":1052,"line":1941},[1050,7206,7207],{"class":1063},"            else",[1050,7209,1154],{"class":1105},[1050,7211,7212,7215,7217,7220,7222,7225,7227,7230,7232,7235],{"class":1052,"line":1955},[1050,7213,7214],{"class":1067},"                vulnerabilities ",[1050,7216,2339],{"class":1105},[1050,7218,7219],{"class":1067}," json",[1050,7221,1112],{"class":1105},[1050,7223,7224],{"class":1121},"loads",[1050,7226,1125],{"class":1105},[1050,7228,7229],{"class":1121},"result",[1050,7231,1112],{"class":1105},[1050,7233,7234],{"class":1115},"stdout",[1050,7236,1138],{"class":1105},[1050,7238,7239,7241,7243,7245,7247,7249,7251,7253,7255,7257],{"class":1052,"line":1966},[1050,7240,7183],{"class":1101},[1050,7242,1112],{"class":1105},[1050,7244,6666],{"class":1115},[1050,7246,6986],{"class":1105},[1050,7248,1129],{"class":1128},[1050,7250,7194],{"class":1132},[1050,7252,1129],{"class":1128},[1050,7254,6996],{"class":1105},[1050,7256,1106],{"class":1105},[1050,7258,7259],{"class":1067}," vulnerabilities\n",[1050,7261,7262],{"class":1052,"line":1976},[1050,7263,7264],{"class":1067},"                \n",[1050,7266,7267,7270,7272,7275,7277,7280,7282,7284,7286,7289,7291,7294],{"class":1052,"line":1991},[1050,7268,7269],{"class":1063},"        except",[1050,7271,2192],{"class":1105},[1050,7273,7274],{"class":1067},"subprocess",[1050,7276,1112],{"class":1105},[1050,7278,7279],{"class":1115},"CalledProcessError",[1050,7281,1311],{"class":1105},[1050,7283,7219],{"class":1067},[1050,7285,1112],{"class":1105},[1050,7287,7288],{"class":1115},"JSONDecodeError",[1050,7290,1311],{"class":1105},[1050,7292,7293],{"class":1163}," FileNotFoundError",[1050,7295,4339],{"class":1105},[1050,7297,7298,7301,7303,7305,7307,7309,7311,7313,7315,7317,7319,7321,7324,7326],{"class":1052,"line":2005},[1050,7299,7300],{"class":1101},"            self",[1050,7302,1112],{"class":1105},[1050,7304,6666],{"class":1115},[1050,7306,6986],{"class":1105},[1050,7308,1129],{"class":1128},[1050,7310,7194],{"class":1132},[1050,7312,1129],{"class":1128},[1050,7314,6996],{"class":1105},[1050,7316,1106],{"class":1105},[1050,7318,4554],{"class":1105},[1050,7320,1169],{"class":1128},[1050,7322,7323],{"class":1132},"Could not run dependency audit",[1050,7325,1169],{"class":1128},[1050,7327,1265],{"class":1105},[1050,7329,7330],{"class":1052,"line":2015},[1050,7331,2619],{"class":1067},[1050,7333,7334,7336,7339,7341,7343],{"class":1052,"line":2025},[1050,7335,4361],{"class":2284},[1050,7337,7338],{"class":3572}," audit_file_permissions",[1050,7340,1125],{"class":1105},[1050,7342,4370],{"class":4369},[1050,7344,4339],{"class":1105},[1050,7346,7347,7349,7352],{"class":1052,"line":2030},[1050,7348,4437],{"class":4344},[1050,7350,7351],{"class":4348},"Check file permissions for security issues",[1050,7353,4352],{"class":4344},[1050,7355,7356],{"class":1052,"line":2036},[1050,7357,2828],{"class":1067},[1050,7359,7360,7362,7364,7366,7369,7371],{"class":1052,"line":2046},[1050,7361,6706],{"class":3754},[1050,7363,1125],{"class":1105},[1050,7365,1169],{"class":1128},[1050,7367,7368],{"class":1132},"Auditing file permissions...",[1050,7370,1169],{"class":1128},[1050,7372,1138],{"class":1105},[1050,7374,7375],{"class":1052,"line":2056},[1050,7376,2828],{"class":1067},[1050,7378,7379,7382,7384],{"class":1052,"line":2070},[1050,7380,7381],{"class":1067},"        permission_issues ",[1050,7383,2339],{"class":1105},[1050,7385,6856],{"class":1105},[1050,7387,7388],{"class":1052,"line":2080},[1050,7389,2828],{"class":1067},[1050,7391,7392],{"class":1052,"line":2092},[1050,7393,7394],{"class":1056},"        # Check sensitive files\n",[1050,7396,7397,7400,7402],{"class":1052,"line":2104},[1050,7398,7399],{"class":1067},"        sensitive_files ",[1050,7401,2339],{"class":1105},[1050,7403,1221],{"class":1105},[1050,7405,7406,7408,7411,7413],{"class":1052,"line":2109},[1050,7407,1658],{"class":1128},[1050,7409,7410],{"class":1132},".env",[1050,7412,1129],{"class":1128},[1050,7414,1235],{"class":1105},[1050,7416,7417,7419,7422,7424],{"class":1052,"line":2114},[1050,7418,1658],{"class":1128},[1050,7420,7421],{"class":1132},".env.production",[1050,7423,1129],{"class":1128},[1050,7425,1235],{"class":1105},[1050,7427,7428,7430,7433,7435],{"class":1052,"line":2120},[1050,7429,1658],{"class":1128},[1050,7431,7432],{"class":1132},"db.sqlite3",[1050,7434,1129],{"class":1128},[1050,7436,1235],{"class":1105},[1050,7438,7439],{"class":1052,"line":2130},[1050,7440,6957],{"class":1105},[1050,7442,7443],{"class":1052,"line":2140},[1050,7444,2828],{"class":1067},[1050,7446,7447,7449,7452,7454,7457],{"class":1052,"line":2154},[1050,7448,4851],{"class":1063},[1050,7450,7451],{"class":1067}," filename ",[1050,7453,4857],{"class":1063},[1050,7455,7456],{"class":1067}," sensitive_files",[1050,7458,1154],{"class":1105},[1050,7460,7461,7464,7466,7468,7470,7472,7475],{"class":1052,"line":2164},[1050,7462,7463],{"class":1067},"            filepath ",[1050,7465,2339],{"class":1105},[1050,7467,4613],{"class":1101},[1050,7469,1112],{"class":1105},[1050,7471,6646],{"class":1115},[1050,7473,7474],{"class":1147}," /",[1050,7476,7477],{"class":1067}," filename\n",[1050,7479,7480,7482,7485,7487,7490],{"class":1052,"line":2174},[1050,7481,4867],{"class":1063},[1050,7483,7484],{"class":1067}," filepath",[1050,7486,1112],{"class":1105},[1050,7488,7489],{"class":1121},"exists",[1050,7491,7492],{"class":1105},"():\n",[1050,7494,7495,7498,7500,7502,7504,7507],{"class":1052,"line":2184},[1050,7496,7497],{"class":1067},"                stat ",[1050,7499,2339],{"class":1105},[1050,7501,7484],{"class":1067},[1050,7503,1112],{"class":1105},[1050,7505,7506],{"class":1121},"stat",[1050,7508,4842],{"class":1105},[1050,7510,7511,7514,7516,7519,7521,7523,7525,7528,7531,7534,7537],{"class":1052,"line":2213},[1050,7512,7513],{"class":1067},"                mode ",[1050,7515,2339],{"class":1105},[1050,7517,7518],{"class":3754}," oct",[1050,7520,1125],{"class":1105},[1050,7522,7506],{"class":1121},[1050,7524,1112],{"class":1105},[1050,7526,7527],{"class":1115},"st_mode",[1050,7529,7530],{"class":1105},")[",[1050,7532,7533],{"class":1147},"-",[1050,7535,7536],{"class":1695},"3",[1050,7538,7539],{"class":1105},":]\n",[1050,7541,7542],{"class":1052,"line":2218},[1050,7543,7264],{"class":1067},[1050,7545,7546],{"class":1052,"line":2224},[1050,7547,7548],{"class":1056},"                # Check if file is world-readable\n",[1050,7550,7551,7554,7557,7559,7562,7564,7567,7570,7572,7574],{"class":1052,"line":2239},[1050,7552,7553],{"class":1063},"                if",[1050,7555,7556],{"class":1163}," int",[1050,7558,1125],{"class":1105},[1050,7560,7561],{"class":1121},"mode",[1050,7563,6986],{"class":1105},[1050,7565,7566],{"class":1695},"2",[1050,7568,7569],{"class":1105},"])",[1050,7571,5451],{"class":1147},[1050,7573,5228],{"class":1695},[1050,7575,1154],{"class":1105},[1050,7577,7578,7581,7583,7586,7588,7591,7593,7595,7598,7600,7603,7605,7607,7609,7612],{"class":1052,"line":2244},[1050,7579,7580],{"class":1067},"                    permission_issues",[1050,7582,1112],{"class":1105},[1050,7584,7585],{"class":1121},"append",[1050,7587,1125],{"class":1105},[1050,7589,7590],{"class":2284},"f",[1050,7592,1169],{"class":1132},[1050,7594,4503],{"class":4502},[1050,7596,7597],{"class":1121},"filename",[1050,7599,4531],{"class":4502},[1050,7601,7602],{"class":1132}," is world-readable (",[1050,7604,4503],{"class":4502},[1050,7606,7561],{"class":1121},[1050,7608,4531],{"class":4502},[1050,7610,7611],{"class":1132},")\"",[1050,7613,1138],{"class":1105},[1050,7615,7616],{"class":1052,"line":2250},[1050,7617,2828],{"class":1067},[1050,7619,7620,7622,7624,7626,7628,7630,7633,7635,7637,7639],{"class":1052,"line":2264},[1050,7621,4383],{"class":1101},[1050,7623,1112],{"class":1105},[1050,7625,6666],{"class":1115},[1050,7627,6986],{"class":1105},[1050,7629,1129],{"class":1128},[1050,7631,7632],{"class":1132},"file_permissions",[1050,7634,1129],{"class":1128},[1050,7636,6996],{"class":1105},[1050,7638,1106],{"class":1105},[1050,7640,7641],{"class":1067}," permission_issues\n",[1050,7643,7644],{"class":1052,"line":2276},[1050,7645,2619],{"class":1067},[1050,7647,7648,7650,7653,7655,7657],{"class":1052,"line":2291},[1050,7649,4361],{"class":2284},[1050,7651,7652],{"class":3572}," generate_report",[1050,7654,1125],{"class":1105},[1050,7656,4370],{"class":4369},[1050,7658,4339],{"class":1105},[1050,7660,7662,7664,7667],{"class":1052,"line":7661},100,[1050,7663,4437],{"class":4344},[1050,7665,7666],{"class":4348},"Generate security audit report",[1050,7668,4352],{"class":4344},[1050,7670,7672],{"class":1052,"line":7671},101,[1050,7673,2828],{"class":1067},[1050,7675,7677,7679,7681,7683,7686,7688,7690,7692,7694,7696,7699,7702],{"class":1052,"line":7676},102,[1050,7678,6706],{"class":3754},[1050,7680,1125],{"class":1105},[1050,7682,1169],{"class":1128},[1050,7684,7685],{"class":1101},"\\n",[1050,7687,1169],{"class":1128},[1050,7689,3104],{"class":1147},[1050,7691,3052],{"class":1128},[1050,7693,2339],{"class":1132},[1050,7695,1169],{"class":1128},[1050,7697,7698],{"class":1147},"*",[1050,7700,7701],{"class":1695},"50",[1050,7703,1138],{"class":1105},[1050,7705,7707,7709,7711,7713,7716,7718],{"class":1052,"line":7706},103,[1050,7708,6706],{"class":3754},[1050,7710,1125],{"class":1105},[1050,7712,1169],{"class":1128},[1050,7714,7715],{"class":1132},"SECURITY AUDIT REPORT",[1050,7717,1169],{"class":1128},[1050,7719,1138],{"class":1105},[1050,7721,7723,7725,7727,7729,7731,7733,7735,7737],{"class":1052,"line":7722},104,[1050,7724,6706],{"class":3754},[1050,7726,1125],{"class":1105},[1050,7728,1169],{"class":1128},[1050,7730,2339],{"class":1132},[1050,7732,1169],{"class":1128},[1050,7734,7698],{"class":1147},[1050,7736,7701],{"class":1695},[1050,7738,1138],{"class":1105},[1050,7740,7742],{"class":1052,"line":7741},105,[1050,7743,2828],{"class":1067},[1050,7745,7747,7750,7752,7755,7757,7760,7762,7765,7767,7770,7773,7775,7777,7779,7781,7783,7786,7788,7791,7794,7796,7798,7800,7803],{"class":1052,"line":7746},106,[1050,7748,7749],{"class":1067},"        total_issues ",[1050,7751,2339],{"class":1105},[1050,7753,7754],{"class":3754}," sum",[1050,7756,1125],{"class":1105},[1050,7758,7759],{"class":3754},"len",[1050,7761,1125],{"class":1105},[1050,7763,7764],{"class":1121},"issues",[1050,7766,4528],{"class":1105},[1050,7768,7769],{"class":1063}," for",[1050,7771,7772],{"class":1121}," issues ",[1050,7774,4857],{"class":1063},[1050,7776,4613],{"class":1101},[1050,7778,1112],{"class":1105},[1050,7780,6666],{"class":1115},[1050,7782,1112],{"class":1105},[1050,7784,7785],{"class":1121},"values",[1050,7787,3095],{"class":1105},[1050,7789,7790],{"class":1063}," if",[1050,7792,7793],{"class":3754}," isinstance",[1050,7795,1125],{"class":1105},[1050,7797,7764],{"class":1121},[1050,7799,1311],{"class":1105},[1050,7801,7802],{"class":1163}," list",[1050,7804,7805],{"class":1105},"))\n",[1050,7807,7809],{"class":1052,"line":7808},107,[1050,7810,2828],{"class":1067},[1050,7812,7814,7816,7818,7820,7823,7825,7828,7830,7832],{"class":1052,"line":7813},108,[1050,7815,6706],{"class":3754},[1050,7817,1125],{"class":1105},[1050,7819,7590],{"class":2284},[1050,7821,7822],{"class":1132},"\"Total issues found: ",[1050,7824,4503],{"class":4502},[1050,7826,7827],{"class":1121},"total_issues",[1050,7829,4531],{"class":4502},[1050,7831,1169],{"class":1132},[1050,7833,1138],{"class":1105},[1050,7835,7837,7839],{"class":1052,"line":7836},109,[1050,7838,6706],{"class":3754},[1050,7840,4842],{"class":1105},[1050,7842,7844],{"class":1052,"line":7843},110,[1050,7845,2828],{"class":1067},[1050,7847,7849,7851,7854,7856,7858,7860,7862,7864,7866,7868,7871],{"class":1052,"line":7848},111,[1050,7850,4851],{"class":1063},[1050,7852,7853],{"class":1067}," category",[1050,7855,1311],{"class":1105},[1050,7857,7772],{"class":1067},[1050,7859,4857],{"class":1063},[1050,7861,4613],{"class":1101},[1050,7863,1112],{"class":1105},[1050,7865,6666],{"class":1115},[1050,7867,1112],{"class":1105},[1050,7869,7870],{"class":1121},"items",[1050,7872,7492],{"class":1105},[1050,7874,7876,7879,7881,7883,7885,7887,7890,7892,7895,7897,7900,7902,7904,7907,7909,7911,7913,7915,7917,7919,7922],{"class":1052,"line":7875},112,[1050,7877,7878],{"class":3754},"            print",[1050,7880,1125],{"class":1105},[1050,7882,7590],{"class":2284},[1050,7884,1169],{"class":1132},[1050,7886,4503],{"class":4502},[1050,7888,7889],{"class":1121},"category",[1050,7891,1112],{"class":1105},[1050,7893,7894],{"class":1121},"upper",[1050,7896,4401],{"class":1105},[1050,7898,7899],{"class":1121},"replace",[1050,7901,1125],{"class":1105},[1050,7903,1129],{"class":1128},[1050,7905,7906],{"class":1132},"_",[1050,7908,1129],{"class":1128},[1050,7910,1311],{"class":1105},[1050,7912,1456],{"class":1128},[1050,7914,1456],{"class":1128},[1050,7916,4528],{"class":1105},[1050,7918,4531],{"class":4502},[1050,7920,7921],{"class":1132},":\"",[1050,7923,1138],{"class":1105},[1050,7925,7927,7929,7931,7933,7935,7937,7939],{"class":1052,"line":7926},113,[1050,7928,4867],{"class":1063},[1050,7930,7793],{"class":3754},[1050,7932,1125],{"class":1105},[1050,7934,7764],{"class":1121},[1050,7936,1311],{"class":1105},[1050,7938,7802],{"class":1163},[1050,7940,4339],{"class":1105},[1050,7942,7944,7946,7949],{"class":1052,"line":7943},114,[1050,7945,7553],{"class":1063},[1050,7947,7948],{"class":1067}," issues",[1050,7950,1154],{"class":1105},[1050,7952,7954,7957,7960,7962,7964],{"class":1052,"line":7953},115,[1050,7955,7956],{"class":1063},"                    for",[1050,7958,7959],{"class":1067}," issue ",[1050,7961,4857],{"class":1063},[1050,7963,7948],{"class":1067},[1050,7965,1154],{"class":1105},[1050,7967,7969,7972,7974,7976,7979,7981,7984,7986,7988],{"class":1052,"line":7968},116,[1050,7970,7971],{"class":3754},"                        print",[1050,7973,1125],{"class":1105},[1050,7975,7590],{"class":2284},[1050,7977,7978],{"class":1132},"\"  ❌ ",[1050,7980,4503],{"class":4502},[1050,7982,7983],{"class":1121},"issue",[1050,7985,4531],{"class":4502},[1050,7987,1169],{"class":1132},[1050,7989,1138],{"class":1105},[1050,7991,7993,7996],{"class":1052,"line":7992},117,[1050,7994,7995],{"class":1063},"                else",[1050,7997,1154],{"class":1105},[1050,7999,8001,8004,8006,8008,8011,8013],{"class":1052,"line":8000},118,[1050,8002,8003],{"class":3754},"                    print",[1050,8005,1125],{"class":1105},[1050,8007,1169],{"class":1128},[1050,8009,8010],{"class":1132},"  ✅ No issues found",[1050,8012,1169],{"class":1128},[1050,8014,1138],{"class":1105},[1050,8016,8018,8020],{"class":1052,"line":8017},119,[1050,8019,7207],{"class":1063},[1050,8021,1154],{"class":1105},[1050,8023,8025,8028,8030,8032,8035,8037,8039,8041,8043],{"class":1052,"line":8024},120,[1050,8026,8027],{"class":3754},"                print",[1050,8029,1125],{"class":1105},[1050,8031,7590],{"class":2284},[1050,8033,8034],{"class":1132},"\"  ℹ️  ",[1050,8036,4503],{"class":4502},[1050,8038,7764],{"class":1121},[1050,8040,4531],{"class":4502},[1050,8042,1169],{"class":1132},[1050,8044,1138],{"class":1105},[1050,8046,8048,8050],{"class":1052,"line":8047},121,[1050,8049,7878],{"class":3754},[1050,8051,4842],{"class":1105},[1050,8053,8055],{"class":1052,"line":8054},122,[1050,8056,1089],{"emptyLinePlaceholder":1088},[1050,8058,8060,8062,8066,8068,8070,8073,8075],{"class":1052,"line":8059},123,[1050,8061,1144],{"class":1063},[1050,8063,8065],{"class":8064},"s131V"," __name__",[1050,8067,7174],{"class":1147},[1050,8069,3052],{"class":1128},[1050,8071,8072],{"class":1132},"__main__",[1050,8074,1169],{"class":1128},[1050,8076,1154],{"class":1105},[1050,8078,8080,8083],{"class":1052,"line":8079},124,[1050,8081,8082],{"class":1063},"    import",[1050,8084,8085],{"class":1067}," sys\n",[1050,8087,8089],{"class":1052,"line":8088},125,[1050,8090,2619],{"class":1067},[1050,8092,8094,8097,8099,8102,8104,8107,8109,8112,8114,8116,8119,8121,8124,8126,8128,8130,8132,8134,8137,8139,8141],{"class":1052,"line":8093},126,[1050,8095,8096],{"class":1067},"    project_root ",[1050,8098,2339],{"class":1105},[1050,8100,8101],{"class":1067}," sys",[1050,8103,1112],{"class":1105},[1050,8105,8106],{"class":1115},"argv",[1050,8108,6986],{"class":1105},[1050,8110,8111],{"class":1695},"1",[1050,8113,6996],{"class":1105},[1050,8115,7790],{"class":1063},[1050,8117,8118],{"class":3754}," len",[1050,8120,1125],{"class":1105},[1050,8122,8123],{"class":1121},"sys",[1050,8125,1112],{"class":1105},[1050,8127,8106],{"class":1115},[1050,8129,4528],{"class":1105},[1050,8131,5451],{"class":1147},[1050,8133,4024],{"class":1695},[1050,8135,8136],{"class":1063}," else",[1050,8138,3052],{"class":1128},[1050,8140,5663],{"class":1132},[1050,8142,3058],{"class":1128},[1050,8144,8146],{"class":1052,"line":8145},127,[1050,8147,2619],{"class":1067},[1050,8149,8151,8154,8156,8158,8160,8162],{"class":1052,"line":8150},128,[1050,8152,8153],{"class":1067},"    auditor ",[1050,8155,2339],{"class":1105},[1050,8157,6605],{"class":1121},[1050,8159,1125],{"class":1105},[1050,8161,6646],{"class":1121},[1050,8163,1138],{"class":1105},[1050,8165,8167,8170,8172,8175],{"class":1052,"line":8166},129,[1050,8168,8169],{"class":1067},"    auditor",[1050,8171,1112],{"class":1105},[1050,8173,8174],{"class":1121},"run_full_audit",[1050,8176,4842],{"class":1105},[1030,8178,8180],{"id":8179},"deployment-checklist","Deployment Checklist",[1035,8182,8184],{"id":8183},"pre-production-checklist","Pre-Production Checklist",[1040,8186,8190],{"className":8187,"code":8188,"language":8189,"meta":1045,"style":1045},"language-markdown shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Django Security Deployment Checklist\n\n## Environment Configuration\n- [ ] DEBUG = False in production settings\n- [ ] SECRET_KEY is set from environment variable\n- [ ] ALLOWED_HOSTS is properly configured (no wildcards)\n- [ ] Database credentials are in environment variables\n- [ ] All sensitive data is in environment variables\n- [ ] .env files are not in version control\n- [ ] Environment variables are properly secured\n\n## Security Settings\n- [ ] SecurityMiddleware is enabled\n- [ ] SECURE_SSL_REDIRECT = True\n- [ ] SECURE_HSTS_SECONDS = 31536000 (1 year)\n- [ ] SECURE_HSTS_INCLUDE_SUBDOMAINS = True\n- [ ] SECURE_HSTS_PRELOAD = True\n- [ ] SECURE_CONTENT_TYPE_NOSNIFF = True\n- [ ] SECURE_BROWSER_XSS_FILTER = True\n- [ ] X_FRAME_OPTIONS = 'DENY'\n- [ ] SESSION_COOKIE_SECURE = True\n- [ ] SESSION_COOKIE_HTTPONLY = True\n- [ ] CSRF_COOKIE_SECURE = True\n- [ ] CSRF_COOKIE_HTTPONLY = True\n\n## Database Security\n- [ ] Database user has minimal required permissions\n- [ ] Database connection uses SSL\n- [ ] Database password is strong and unique\n- [ ] Database backups are encrypted\n- [ ] Row-level security is configured (if needed)\n\n## Server Configuration\n- [ ] Web server (Nginx/Apache) is properly configured\n- [ ] SSL certificate is installed and valid\n- [ ] Security headers are configured\n- [ ] Rate limiting is implemented\n- [ ] Admin interface URL is obscured\n- [ ] Static files are served securely\n- [ ] File upload restrictions are in place\n\n## Application Security\n- [ ] All user input is validated and sanitized\n- [ ] SQL injection protection is verified\n- [ ] XSS protection is implemented\n- [ ] CSRF protection is enabled\n- [ ] Authentication system is secure\n- [ ] Password validation is comprehensive\n- [ ] Session management is secure\n\n## Infrastructure Security\n- [ ] Server OS is updated and patched\n- [ ] Firewall is properly configured\n- [ ] SSH access is secured (key-based, no root)\n- [ ] Unnecessary services are disabled\n- [ ] Log files are properly secured\n- [ ] Backup system is implemented and tested\n\n## Monitoring and Logging\n- [ ] Security logging is enabled\n- [ ] Log rotation is configured\n- [ ] Monitoring alerts are set up\n- [ ] Intrusion detection is configured\n- [ ] Performance monitoring is in place\n- [ ] Error tracking is implemented (Sentry, etc.)\n\n## Backup and Recovery\n- [ ] Automated backup system is implemented\n- [ ] Backups are encrypted\n- [ ] Backup restoration is tested\n- [ ] Disaster recovery plan is documented\n- [ ] Backup retention policy is defined\n\n## Compliance and Documentation\n- [ ] Security policies are documented\n- [ ] Incident response plan is prepared\n- [ ] Security audit is completed\n- [ ] Penetration testing is performed\n- [ ] Compliance requirements are met\n- [ ] Security training is provided to team\n\n## Post-Deployment\n- [ ] Security monitoring is active\n- [ ] SSL certificate auto-renewal is working\n- [ ] Backup system is running correctly\n- [ ] Performance metrics are being collected\n- [ ] Security alerts are being received\n- [ ] Regular security updates are scheduled\n","markdown",[1047,8191,8192,8197,8201,8206,8211,8216,8221,8226,8231,8236,8241,8245,8250,8255,8260,8265,8270,8275,8280,8285,8290,8295,8300,8305,8310,8314,8319,8324,8329,8334,8339,8344,8348,8353,8358,8363,8368,8373,8378,8383,8388,8392,8397,8402,8407,8412,8417,8422,8427,8432,8436,8441,8446,8451,8456,8461,8466,8471,8475,8480,8485,8490,8495,8500,8505,8510,8514,8519,8524,8529,8534,8539,8544,8548,8553,8558,8563,8568,8573,8578,8583,8587,8592,8597,8602,8607,8612,8617],{"__ignoreMap":1045},[1050,8193,8194],{"class":1052,"line":1053},[1050,8195,8196],{},"# Django Security Deployment Checklist\n",[1050,8198,8199],{"class":1052,"line":1060},[1050,8200,1089],{"emptyLinePlaceholder":1088},[1050,8202,8203],{"class":1052,"line":1071},[1050,8204,8205],{},"## Environment Configuration\n",[1050,8207,8208],{"class":1052,"line":1085},[1050,8209,8210],{},"- [ ] DEBUG = False in production settings\n",[1050,8212,8213],{"class":1052,"line":1092},[1050,8214,8215],{},"- [ ] SECRET_KEY is set from environment variable\n",[1050,8217,8218],{"class":1052,"line":1098},[1050,8219,8220],{},"- [ ] ALLOWED_HOSTS is properly configured (no wildcards)\n",[1050,8222,8223],{"class":1052,"line":1141},[1050,8224,8225],{},"- [ ] Database credentials are in environment variables\n",[1050,8227,8228],{"class":1052,"line":1157},[1050,8229,8230],{},"- [ ] All sensitive data is in environment variables\n",[1050,8232,8233],{"class":1052,"line":1179},[1050,8234,8235],{},"- [ ] .env files are not in version control\n",[1050,8237,8238],{"class":1052,"line":1184},[1050,8239,8240],{},"- [ ] Environment variables are properly secured\n",[1050,8242,8243],{"class":1052,"line":1190},[1050,8244,1089],{"emptyLinePlaceholder":1088},[1050,8246,8247],{"class":1052,"line":1202},[1050,8248,8249],{},"## Security Settings\n",[1050,8251,8252],{"class":1052,"line":1207},[1050,8253,8254],{},"- [ ] SecurityMiddleware is enabled\n",[1050,8256,8257],{"class":1052,"line":1213},[1050,8258,8259],{},"- [ ] SECURE_SSL_REDIRECT = True\n",[1050,8261,8262],{"class":1052,"line":1224},[1050,8263,8264],{},"- [ ] SECURE_HSTS_SECONDS = 31536000 (1 year)\n",[1050,8266,8267],{"class":1052,"line":1238},[1050,8268,8269],{},"- [ ] SECURE_HSTS_INCLUDE_SUBDOMAINS = True\n",[1050,8271,8272],{"class":1052,"line":1250},[1050,8273,8274],{},"- [ ] SECURE_HSTS_PRELOAD = True\n",[1050,8276,8277],{"class":1052,"line":1262},[1050,8278,8279],{},"- [ ] SECURE_CONTENT_TYPE_NOSNIFF = True\n",[1050,8281,8282],{"class":1052,"line":1268},[1050,8283,8284],{},"- [ ] SECURE_BROWSER_XSS_FILTER = True\n",[1050,8286,8287],{"class":1052,"line":1273},[1050,8288,8289],{},"- [ ] X_FRAME_OPTIONS = 'DENY'\n",[1050,8291,8292],{"class":1052,"line":1279},[1050,8293,8294],{},"- [ ] SESSION_COOKIE_SECURE = True\n",[1050,8296,8297],{"class":1052,"line":1289},[1050,8298,8299],{},"- [ ] SESSION_COOKIE_HTTPONLY = True\n",[1050,8301,8302],{"class":1052,"line":1301},[1050,8303,8304],{},"- [ ] CSRF_COOKIE_SECURE = True\n",[1050,8306,8307],{"class":1052,"line":1317},[1050,8308,8309],{},"- [ ] CSRF_COOKIE_HTTPONLY = True\n",[1050,8311,8312],{"class":1052,"line":1329},[1050,8313,1089],{"emptyLinePlaceholder":1088},[1050,8315,8316],{"class":1052,"line":1341},[1050,8317,8318],{},"## Database Security\n",[1050,8320,8321],{"class":1052,"line":1353},[1050,8322,8323],{},"- [ ] Database user has minimal required permissions\n",[1050,8325,8326],{"class":1052,"line":1365},[1050,8327,8328],{},"- [ ] Database connection uses SSL\n",[1050,8330,8331],{"class":1052,"line":1377},[1050,8332,8333],{},"- [ ] Database password is strong and unique\n",[1050,8335,8336],{"class":1052,"line":1389},[1050,8337,8338],{},"- [ ] Database backups are encrypted\n",[1050,8340,8341],{"class":1052,"line":1401},[1050,8342,8343],{},"- [ ] Row-level security is configured (if needed)\n",[1050,8345,8346],{"class":1052,"line":1406},[1050,8347,1089],{"emptyLinePlaceholder":1088},[1050,8349,8350],{"class":1052,"line":1411},[1050,8351,8352],{},"## Server Configuration\n",[1050,8354,8355],{"class":1052,"line":1417},[1050,8356,8357],{},"- [ ] Web server (Nginx/Apache) is properly configured\n",[1050,8359,8360],{"class":1052,"line":1428},[1050,8361,8362],{},"- [ ] SSL certificate is installed and valid\n",[1050,8364,8365],{"class":1052,"line":1443},[1050,8366,8367],{},"- [ ] Security headers are configured\n",[1050,8369,8370],{"class":1052,"line":1466},[1050,8371,8372],{},"- [ ] Rate limiting is implemented\n",[1050,8374,8375],{"class":1052,"line":1500},[1050,8376,8377],{},"- [ ] Admin interface URL is obscured\n",[1050,8379,8380],{"class":1052,"line":1533},[1050,8381,8382],{},"- [ ] Static files are served securely\n",[1050,8384,8385],{"class":1052,"line":1566},[1050,8386,8387],{},"- [ ] File upload restrictions are in place\n",[1050,8389,8390],{"class":1052,"line":1599},[1050,8391,1089],{"emptyLinePlaceholder":1088},[1050,8393,8394],{"class":1052,"line":1641},[1050,8395,8396],{},"## Application Security\n",[1050,8398,8399],{"class":1052,"line":1655},[1050,8400,8401],{},"- [ ] All user input is validated and sanitized\n",[1050,8403,8404],{"class":1052,"line":1677},[1050,8405,8406],{},"- [ ] SQL injection protection is verified\n",[1050,8408,8409],{"class":1052,"line":1683},[1050,8410,8411],{},"- [ ] XSS protection is implemented\n",[1050,8413,8414],{"class":1052,"line":1701},[1050,8415,8416],{},"- [ ] CSRF protection is enabled\n",[1050,8418,8419],{"class":1052,"line":1707},[1050,8420,8421],{},"- [ ] Authentication system is secure\n",[1050,8423,8424],{"class":1052,"line":1713},[1050,8425,8426],{},"- [ ] Password validation is comprehensive\n",[1050,8428,8429],{"class":1052,"line":1718},[1050,8430,8431],{},"- [ ] Session management is secure\n",[1050,8433,8434],{"class":1052,"line":1724},[1050,8435,1089],{"emptyLinePlaceholder":1088},[1050,8437,8438],{"class":1052,"line":1734},[1050,8439,8440],{},"## Infrastructure Security\n",[1050,8442,8443],{"class":1052,"line":1747},[1050,8444,8445],{},"- [ ] Server OS is updated and patched\n",[1050,8447,8448],{"class":1052,"line":1768},[1050,8449,8450],{},"- [ ] Firewall is properly configured\n",[1050,8452,8453],{"class":1052,"line":1801},[1050,8454,8455],{},"- [ ] SSH access is secured (key-based, no root)\n",[1050,8457,8458],{"class":1052,"line":1814},[1050,8459,8460],{},"- [ ] Unnecessary services are disabled\n",[1050,8462,8463],{"class":1052,"line":1835},[1050,8464,8465],{},"- [ ] Log files are properly secured\n",[1050,8467,8468],{"class":1052,"line":1849},[1050,8469,8470],{},"- [ ] Backup system is implemented and tested\n",[1050,8472,8473],{"class":1052,"line":1871},[1050,8474,1089],{"emptyLinePlaceholder":1088},[1050,8476,8477],{"class":1052,"line":1892},[1050,8478,8479],{},"## Monitoring and Logging\n",[1050,8481,8482],{"class":1052,"line":1898},[1050,8483,8484],{},"- [ ] Security logging is enabled\n",[1050,8486,8487],{"class":1052,"line":1904},[1050,8488,8489],{},"- [ ] Log rotation is configured\n",[1050,8491,8492],{"class":1052,"line":1909},[1050,8493,8494],{},"- [ ] Monitoring alerts are set up\n",[1050,8496,8497],{"class":1052,"line":1914},[1050,8498,8499],{},"- [ ] Intrusion detection is configured\n",[1050,8501,8502],{"class":1052,"line":1919},[1050,8503,8504],{},"- [ ] Performance monitoring is in place\n",[1050,8506,8507],{"class":1052,"line":1925},[1050,8508,8509],{},"- [ ] Error tracking is implemented (Sentry, etc.)\n",[1050,8511,8512],{"class":1052,"line":1941},[1050,8513,1089],{"emptyLinePlaceholder":1088},[1050,8515,8516],{"class":1052,"line":1955},[1050,8517,8518],{},"## Backup and Recovery\n",[1050,8520,8521],{"class":1052,"line":1966},[1050,8522,8523],{},"- [ ] Automated backup system is implemented\n",[1050,8525,8526],{"class":1052,"line":1976},[1050,8527,8528],{},"- [ ] Backups are encrypted\n",[1050,8530,8531],{"class":1052,"line":1991},[1050,8532,8533],{},"- [ ] Backup restoration is tested\n",[1050,8535,8536],{"class":1052,"line":2005},[1050,8537,8538],{},"- [ ] Disaster recovery plan is documented\n",[1050,8540,8541],{"class":1052,"line":2015},[1050,8542,8543],{},"- [ ] Backup retention policy is defined\n",[1050,8545,8546],{"class":1052,"line":2025},[1050,8547,1089],{"emptyLinePlaceholder":1088},[1050,8549,8550],{"class":1052,"line":2030},[1050,8551,8552],{},"## Compliance and Documentation\n",[1050,8554,8555],{"class":1052,"line":2036},[1050,8556,8557],{},"- [ ] Security policies are documented\n",[1050,8559,8560],{"class":1052,"line":2046},[1050,8561,8562],{},"- [ ] Incident response plan is prepared\n",[1050,8564,8565],{"class":1052,"line":2056},[1050,8566,8567],{},"- [ ] Security audit is completed\n",[1050,8569,8570],{"class":1052,"line":2070},[1050,8571,8572],{},"- [ ] Penetration testing is performed\n",[1050,8574,8575],{"class":1052,"line":2080},[1050,8576,8577],{},"- [ ] Compliance requirements are met\n",[1050,8579,8580],{"class":1052,"line":2092},[1050,8581,8582],{},"- [ ] Security training is provided to team\n",[1050,8584,8585],{"class":1052,"line":2104},[1050,8586,1089],{"emptyLinePlaceholder":1088},[1050,8588,8589],{"class":1052,"line":2109},[1050,8590,8591],{},"## Post-Deployment\n",[1050,8593,8594],{"class":1052,"line":2114},[1050,8595,8596],{},"- [ ] Security monitoring is active\n",[1050,8598,8599],{"class":1052,"line":2120},[1050,8600,8601],{},"- [ ] SSL certificate auto-renewal is working\n",[1050,8603,8604],{"class":1052,"line":2130},[1050,8605,8606],{},"- [ ] Backup system is running correctly\n",[1050,8608,8609],{"class":1052,"line":2140},[1050,8610,8611],{},"- [ ] Performance metrics are being collected\n",[1050,8613,8614],{"class":1052,"line":2154},[1050,8615,8616],{},"- [ ] Security alerts are being received\n",[1050,8618,8619],{"class":1052,"line":2164},[1050,8620,8621],{},"- [ ] Regular security updates are scheduled\n",[1030,8623,8625],{"id":8624},"security-best-practices-summary","Security Best Practices Summary",[1035,8627,8629],{"id":8628},"configuration-security","Configuration Security",[8631,8632,8633,8637,8640,8643,8646],"ul",{},[8634,8635,8636],"li",{},"Never use DEBUG=True in production",[8634,8638,8639],{},"Use environment variables for all sensitive data",[8634,8641,8642],{},"Implement proper HTTPS with HSTS",[8634,8644,8645],{},"Configure security headers correctly",[8634,8647,8648],{},"Use strong, unique passwords and keys",[1035,8650,8652],{"id":8651},"infrastructure-security","Infrastructure Security",[8631,8654,8655,8658,8661,8664,8667],{},[8634,8656,8657],{},"Keep all systems updated and patched",[8634,8659,8660],{},"Use firewalls and network segmentation",[8634,8662,8663],{},"Implement proper access controls",[8634,8665,8666],{},"Monitor system logs and metrics",[8634,8668,8669],{},"Regular security audits and testing",[1035,8671,8673],{"id":8672},"application-security","Application Security",[8631,8675,8676,8679,8682,8685,8688],{},[8634,8677,8678],{},"Validate and sanitize all user input",[8634,8680,8681],{},"Use Django's built-in security features",[8634,8683,8684],{},"Implement proper authentication and authorization",[8634,8686,8687],{},"Protect against common vulnerabilities (OWASP Top 10)",[8634,8689,8690],{},"Regular dependency updates and vulnerability scanning",[1035,8692,8694],{"id":8693},"operational-security","Operational Security",[8631,8696,8697,8700,8703,8706,8709],{},[8634,8698,8699],{},"Implement comprehensive monitoring and alerting",[8634,8701,8702],{},"Maintain secure backup and recovery procedures",[8634,8704,8705],{},"Document security policies and procedures",[8634,8707,8708],{},"Train team members on security best practices",[8634,8710,8711],{},"Have an incident response plan ready",[1030,8713,8715],{"id":8714},"conclusion","Conclusion",[1026,8717,8718],{},"Securing a Django application in production requires attention to multiple layers: application configuration, server infrastructure, database security, monitoring, and operational procedures. This checklist provides a comprehensive foundation, but security is an ongoing process that requires regular updates, monitoring, and adaptation to new threats.",[1026,8720,8721],{},"Key takeaways:",[8631,8723,8724,8731,8737,8743,8749,8754],{},[8634,8725,8726,8730],{},[8727,8728,8729],"strong",{},"Defense in depth",": Implement security at multiple layers",[8634,8732,8733,8736],{},[8727,8734,8735],{},"Principle of least privilege",": Grant minimal necessary permissions",[8634,8738,8739,8742],{},[8727,8740,8741],{},"Regular updates",": Keep all components updated and patched",[8634,8744,8745,8748],{},[8727,8746,8747],{},"Monitoring",": Implement comprehensive logging and alerting",[8634,8750,8751,8753],{},[8727,8752,579],{},": Regularly test security measures and backup procedures",[8634,8755,8756,8759],{},[8727,8757,8758],{},"Documentation",": Maintain clear security policies and procedures",[1026,8761,8762],{},"Remember that security is not a one-time setup but an ongoing responsibility that requires continuous attention and improvement.",[1030,8764,8766],{"id":8765},"next-steps","Next Steps",[1026,8768,8769],{},"With your Django application now secured for production deployment, consider implementing additional security measures such as:",[8631,8771,8772,8775,8778,8781,8784,8787],{},[8634,8773,8774],{},"Web Application Firewall (WAF)",[8634,8776,8777],{},"Intrusion Detection System (IDS)",[8634,8779,8780],{},"Security Information and Event Management (SIEM)",[8634,8782,8783],{},"Regular penetration testing",[8634,8785,8786],{},"Security awareness training for your team",[8634,8788,8789],{},"Compliance with relevant security standards (SOC 2, ISO 27001, etc.)",[1026,8791,8792],{},"Security is a journey, not a destination. Stay informed about new threats and continuously improve your security posture.",[8794,8795,8796],"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 .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .scgAs, html code.shiki .scgAs{--shiki-light:#F76D47;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}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 .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .su_V2, html code.shiki .su_V2{--shiki-light:#90A4AE;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--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 .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":1045,"searchDepth":1053,"depth":1060,"links":8798},[8799,8803,8808,8812,8816,8819,8822,8825,8831,8832],{"id":1032,"depth":1060,"text":1033,"children":8800},[8801,8802],{"id":1037,"depth":1071,"text":1038},{"id":2304,"depth":1071,"text":2305},{"id":2582,"depth":1060,"text":2583,"children":8804},[8805,8806,8807],{"id":2586,"depth":1071,"text":2587},{"id":3009,"depth":1071,"text":3010},{"id":3345,"depth":1071,"text":3346},{"id":3538,"depth":1060,"text":3539,"children":8809},[8810,8811],{"id":3542,"depth":1071,"text":3543},{"id":3729,"depth":1071,"text":3730},{"id":4200,"depth":1060,"text":4201,"children":8813},[8814,8815],{"id":4204,"depth":1071,"text":4205},{"id":5311,"depth":1071,"text":5312},{"id":5599,"depth":1060,"text":5600,"children":8817},[8818],{"id":5603,"depth":1071,"text":5604},{"id":6549,"depth":1060,"text":6550,"children":8820},[8821],{"id":6553,"depth":1071,"text":6554},{"id":8179,"depth":1060,"text":8180,"children":8823},[8824],{"id":8183,"depth":1071,"text":8184},{"id":8624,"depth":1060,"text":8625,"children":8826},[8827,8828,8829,8830],{"id":8628,"depth":1071,"text":8629},{"id":8651,"depth":1071,"text":8652},{"id":8672,"depth":1071,"text":8673},{"id":8693,"depth":1071,"text":8694},{"id":8714,"depth":1060,"text":8715},{"id":8765,"depth":1060,"text":8766},"md",null,{},{"title":575,"description":1028},"LBya_FaWLJJ-EdYU310O0sEZGO0qIueVN3pbDn9jgcM",[8839,8841],{"title":571,"path":572,"stem":573,"description":8840,"children":-1},"Proper password storage and cryptographic practices are fundamental to application security. Django provides robust built-in password hashing and cryptographic utilities, but understanding how to use them correctly is crucial for protecting user data.",{"title":579,"path":580,"stem":581,"description":8842,"children":-1},"Testing is a critical aspect of Django development that ensures your application works correctly, maintains quality over time, and provides confidence when making changes. Django provides a comprehensive testing framework built on Python's unittest module, along with additional tools specifically designed for web application testing.",1772474940109]