From 30c708408e61b627afc40aac540e11709d5ef09c Mon Sep 17 00:00:00 2001 From: Ali Najmabadi Date: Tue, 9 Jul 2024 16:57:27 +0330 Subject: [PATCH] add paas/django docs --- src/components/Sidebar/data.js | 73 +-- .../django/fix-common-errors/cors-media.mdx | 55 ++ .../paas/django/fix-common-errors/cors.mdx | 100 ++-- .../fix-common-errors/upload-limit-size.mdx | 59 +- .../fix-common-errors/worker-timeout.mdx | 23 + src/pages/paas/django/getting-started.mdx | 6 +- .../paas/django/how-tos/choose-version.mdx | 60 +- .../paas/django/how-tos/customize-nginx.mdx | 46 +- src/pages/paas/django/how-tos/enable-gzip.mdx | 61 ++ .../how-tos/set-gunicorn-maxrequest.mdx | 30 + .../django/how-tos/set-gunicorn-workers.mdx | 31 + .../how-tos/set-http-security-headers.mdx | 49 +- src/pages/paas/django/how-tos/use-asgi.mdx | 38 ++ .../paas/django/how-tos/use-ffmpeg-module.mdx | 64 ++- src/pages/paas/django/how-tos/use-hooks.mdx | 14 +- .../paas/django/how-tos/use-supervisord.mdx | 44 ++ .../paas/django/how-tos/use-websocket.mdx | 538 +++++++++++++----- src/pages/paas/django/related-apps/celery.mdx | 19 + src/pages/paas/django/related-links.mdx | 10 +- .../paas/laravel/how-tos/choose-version.mdx | 6 +- .../how-tos/set-http-security-headers.mdx | 2 +- src/pages/paas/laravel/how-tos/use-hooks.mdx | 2 +- src/pages/paas/php/how-tos/choose-version.mdx | 6 +- .../php/how-tos/set-http-security-headers.mdx | 2 +- src/pages/paas/php/how-tos/use-hooks.mdx | 2 +- 25 files changed, 942 insertions(+), 398 deletions(-) create mode 100644 src/pages/paas/django/fix-common-errors/cors-media.mdx create mode 100644 src/pages/paas/django/fix-common-errors/worker-timeout.mdx create mode 100644 src/pages/paas/django/how-tos/enable-gzip.mdx create mode 100644 src/pages/paas/django/how-tos/set-gunicorn-maxrequest.mdx create mode 100644 src/pages/paas/django/how-tos/set-gunicorn-workers.mdx create mode 100644 src/pages/paas/django/how-tos/use-asgi.mdx create mode 100644 src/pages/paas/django/how-tos/use-supervisord.mdx create mode 100644 src/pages/paas/django/related-apps/celery.mdx diff --git a/src/components/Sidebar/data.js b/src/components/Sidebar/data.js index d435867b..ac02c1a3 100644 --- a/src/components/Sidebar/data.js +++ b/src/components/Sidebar/data.js @@ -908,6 +908,10 @@ export default { title: "انتخاب نسخه NodeJS", link: "/paas/nodejs/how-tos/choose-version" }, + { + title: "استفاده از ماژول FFMPEG", + link: "/paas/nodejs/how-tos/use-ffmpeg-module" + }, { hr: true }, @@ -1588,21 +1592,17 @@ export default { title: "استفاده از دیسک", link: "/paas/django/how-tos/use-disk" }, - // { - // title: "راه‌اندازی برنامه Websocket", - // link: "/paas/django/how-tos/use-websocket" - // }, { title: "تنظیم Nginx", - link: "/paas/django/how-tos/customize-php-ini" + link: "/paas/django/how-tos/customize-nginx" }, { - title: "کار با Queueها", - link: "/paas/django/how-tos/use-queues" + title: "فعال‌سازی قابلیت gzip", + link: "/paas/django/how-tos/enable-gzip" }, { - title: "فعال‌سازی SSR با Inertia", - link: "/paas/django/how-tos/enable-ssr-using-inertia" + title: "استفاده از Supervisord", + link: "/paas/django/how-tos/use-supervisord" }, { title: "تنظیم هدرهای امنیتی HTTP", @@ -1613,37 +1613,30 @@ export default { link: "/paas/django/how-tos/use-hooks" }, { - title: "تغییر نسخه PHP و Laravel", + title: "تغییر نسخه Python", link: "/paas/django/how-tos/choose-version" }, { - title: "مدیریت logهای Laravel", - link: "/paas/django/how-tos/manage-django-logs" + title: "تنظیم تعداد workerهای Gunicorn", + link: "/paas/django/how-tos/set-gunicorn-workers" }, { - title: "پیکربندی TrustedProxies", - link: "/paas/django/how-tos/configure-trustedproxies" - }, - { - title: "فعال‌سازی Gzip و Caching", - link: "/paas/django/how-tos/enable-gzip-and-caching" - }, - { - title: "استفاده از ماژول FFMPEG", - link: "/paas/django/how-tos/use-ffmpeg-module" + title: "تنظیم max_request در Gunicorn", + link: "/paas/django/how-tos/set-gunicorn-maxrequest" }, { - title: "استفاده از Ziggy", - link: "/paas/django/how-tos/use-ziggy" + title: "راه‌اندازی برنامه WebSocket", + link: "/paas/django/how-tos/use-websocket" }, { - title: "نصب یا به‌روزرسانی اکستنشن ", - link: "/paas/django/how-tos/install-new-extension" + title: "راه‌اندازی برنامه ASGI", + link: "/paas/django/how-tos/use-asgi" }, { - title: "مشاهده اکستنشن‌های نصب شده", - link: "/paas/django/how-tos/see-extension" + title: "استفاده از ماژول FFMPEG", + link: "/paas/django/how-tos/use-ffmpeg-module" }, + { hr: true }, @@ -1695,7 +1688,7 @@ export default { ) }, { - title: "رفع خطای محدودیت آپلود فایل با حجم بیش از 100MB", + title: "رفع خطای محدودیت آپلود فایل با حجم بیش از 1MB", link: "/paas/django/fix-common-errors/upload-limit-size" }, { @@ -1703,26 +1696,20 @@ export default { link: "/paas/django/fix-common-errors/cors" }, { - title: "رفع خطای 419", - link: "/paas/django/fix-common-errors/419-page-expired" - }, - { - hr: true + title: "رفع خطای CORS فایل‌های Media", + link: "/paas/django/fix-common-errors/cors-media" }, { - title: "Lumen", - icon: , - link: "/paas/django/related-apps/lumen" + title: "رفع خطای WORKER TIMEOUT", + link: "/paas/django/fix-common-errors/worker-timeout" }, { - title: "Laravel Octane", - icon: , - link: "/paas/django/related-apps/django-octane" + hr: true }, { - title: "Voyager", - icon: , - link: "/paas/django/related-apps/voyager" + title: "Celery", + icon: , + link: "/paas/django/related-apps/celery" }, ], } diff --git a/src/pages/paas/django/fix-common-errors/cors-media.mdx b/src/pages/paas/django/fix-common-errors/cors-media.mdx new file mode 100644 index 00000000..dddfd2f8 --- /dev/null +++ b/src/pages/paas/django/fix-common-errors/cors-media.mdx @@ -0,0 +1,55 @@ +import Layout from "@/components/Layout"; +import Button from "@/components/Common/button"; +import Section from "@/components/Common/section"; +import Alert from "@/components/Common/alert"; +import Tabs from "@/components/Common/tab"; +import Step from "@/components/Common/step"; +import Card from "@/components/Common/card"; +import Important from "@/components/Common/important"; +import Highlight from "react-highlight"; +import Link from "next/link"; +import NextPage from "@/components/Common/nextpage"; +import {GoArrowLeft,} from "react-icons/go"; + + +# رفع خطای CORS فایل‌های Media در برنامه‌های Django +
+ +فایل‌های رسانه (Media) به کاربران در پلتفرم Django با وب‌سرور Nginx ارائه می‌شود؛ حال، اگر کاربران‌تان برای دسترسی به فایل‌های رسانه با خطای CORS مواجه شدند باید تنظیمات Nginx پروژه‌ی خود را شخصی‌سازی کنید. + +برای رفع این خطا، یک فایل با نام liara_nginx.conf در مسیر اصلی پروژه‌ی خود ایجاد کرده و قطعه‌کد زیر را در آن، قرار دهید: +
+
+ + {`client_max_body_size 100M; + +location /media { + add_header Access-Control-Allow-Origin *; + alias /usr/src/app/media; +} + +location /static { + alias /usr/src/app/staticfiles; +} + +location / { + try_files /dev/null @django_app; +} + +location ~\\.sqlite3$ { + deny all; + error_page 403 =404 /; +} + +location ~ /\\.well-known { + allow all; +}`} + +
+
+سپس، برنامه خود را مجدداً در لیارا مستقر کنید تا تغییرات، اعمال شوند. + +با اعمال این پیکربندی، فایل‌های قرار گرفته در پوشه‌ی media با هدر Access-Control-Allow-Origin و مقدار * سرو می‌شوند. همچنین شما می‌توانید مقدار دلخواه خودتان را نیز، تنظیم کنید. + + + \ No newline at end of file diff --git a/src/pages/paas/django/fix-common-errors/cors.mdx b/src/pages/paas/django/fix-common-errors/cors.mdx index fdfad213..65f53ea0 100644 --- a/src/pages/paas/django/fix-common-errors/cors.mdx +++ b/src/pages/paas/django/fix-common-errors/cors.mdx @@ -12,92 +12,90 @@ import NextPage from "@/components/Common/nextpage"; import {GoArrowLeft,} from "react-icons/go"; -# رفع خطای CORS در برنامه‌های Laravel +# رفع خطای CORS در برنامه‌های Django
خطای CORS (Cross-Origin Resource Sharing) یک محدودیت امنیتی در مرورگرها است که جلوی درخواست‌های HTTP از منابع مختلف را می‌گیرد. -این خطا ممکن است زمانی رخ دهد که سعی کنید از یک دامنه یا پورت متفاوت به سروری دیگر درخواست ارسال کنید، و معمولاً با پیام خطایی شبیه به Access-Control-Allow-Origin در مرورگر مواجه خواهید شد. در ادامه، به رفع این خطا در فریم‌ورک‌های مختلف، پرداخته شده است: +این خطا ممکن است زمانی رخ دهد که سعی کنید از یک دامنه یا پورت متفاوت به سروری دیگر درخواست ارسال کنید، و معمولاً با پیام خطایی شبیه به Access-Control-Allow-Origin در مرورگر مواجه خواهید شد. در ادامه، به رفع این خطا، پرداخته شده است: +
-برای حل این مشکل می‌توانید از راه حل‌‌های قرار داده شده، استفاده کنید. +برای رفع این خطا، کافیست تا با اجرای دستور زیر، پکیج django-cors-headers را در پروژه خود، نصب کنید: +
+
+ + {`pip install django-cors-headers`} + +
+
-
-در ابتدا، کافیست تا با اجرای دستور زیر، این پکیج را در پروژه خود، در لوکال، نصب کنید: +در ادامه، بایستی تا به INSTALLED_APPS در فایل settings.py، مقدار corsheaders را اضافه کنید:
- - {`composer require fruitcake/laravel-cors`} + + {`INSTALLED_APPS = [ + # other apps + 'corsheaders', + # other apps +] +`}
-البته اگر که به خطای conflict برخورد کردید؛ کافیست تا پکیج‌های قدیمی مربوطه با ورژن barryvdh یا fruitcake را با اجرای دستور مثال زیر، حذف کرده و مجدداً آن را نصب کنید: +سپس، باید مقدار CorsMiddleware را به MIDDLEWARE در فایل settings.py، اضافه کنید: + +
- {`composer remove barryvdh/laravel-cors fruitcake/laravel-cors -composer require fruitcake/laravel-cors`} + {`MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', + # other middlewares ... +] +`}
-در ادامه، بایستی، یک middleware به نام HandleCors در ابتدای property به نام middleware$ در فایل app/Http/Kernel.php با محتوای زیر، اضافه کنید: +تمامی کارها انجام شده و می‌توانید برای اجازه دادن به همه دامنه‌ها، در فایل settings.py دستور زیر را وارد کنید: +
- - {`protected $middleware = [ - \\Fruitcake\\Cors\\HandleCors::class, - // ... -];`} + + {`CORS_ALLOW_ALL_ORIGINS = True`}
-تمامی کارها انجام شده است و کافیست دستور زیر را اجرا کنید تا مقادیر پیش‌فرض مربوط به CORS در مسیر config/cors.php برای‌تان قرار بگیرد و پس از آن، می‌توانید این مقادیر را بنا به نیاز خود، تغییر دهید: +یا برای اجازه دادن به دامنه‌های خاص، از قطعه کد زیر استفاده کنید:
- - {`php artisan vendor:publish --tag="cors"`} + + {`CORS_ALLOWED_ORIGINS = [ + 'http://example.com', + 'http://anotherdomain.com', +] +`}
- -

-همچنین بخوانید: مستندات مربوط به پکیج laravel-cors -

-
-
-کافیست تا وارد فایل public/.htaccess شوید و تنظیمات مربوط به CORS را به پروژه خود اضافه کنید: +متدهای مجاز را نیز می‌توانید با اضافه کردن قطعه کد زیر به فایل settings.py، در پروژه خود، مشخص کنید:
- - {`Header set Access-Control-Allow-Origin "*" - - - - Options -MultiViews -Indexes - - - RewriteEngine On - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] - - # Send Requests To Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] -`} + + {`CORS_ALLOW_METHODS = [ + "DELETE", + "GET", + "OPTIONS", + "PATCH", + "POST", + "PUT", +]`}
- +در نهایت کافیست تا برای ثبت تغییرات، برنامه خود را مجدداً در لیارا، مستقر کنید. \ No newline at end of file diff --git a/src/pages/paas/django/fix-common-errors/upload-limit-size.mdx b/src/pages/paas/django/fix-common-errors/upload-limit-size.mdx index e5163134..841173b2 100644 --- a/src/pages/paas/django/fix-common-errors/upload-limit-size.mdx +++ b/src/pages/paas/django/fix-common-errors/upload-limit-size.mdx @@ -11,33 +11,40 @@ import Link from "next/link"; import NextPage from "@/components/Common/nextpage"; -# رفع خطای محدودیت آپلود فایل با حجم بیش از 100MB +# رفع خطای محدودیت آپلود فایل با حجم بیش از 1MB
-وب‌سرور Apache ابتدا فایل‌های آپلودی را در دایرکتوری tmp/ ذخیره می‌کند و سپس لاراول آن فایل را به Storage خودش، منتقل می‌کند. -علی‌رغم فایل سیستم پیش‌فرض برنامه‌های لاراول در لیارا، که ReadOnly است؛ دایرکتوری tmp/ قابل نوشتن است، اما محدودی 100 مگابایتی دارد. -در نتیجه شما نمی‌توانید فایل‌هایی با حجم بیش از 100MB را در پروژه خود، آپلود کنید و با خطا، مواجه خواهید شد. برای رفع این مشکل و افزایش حجم داده‌های آپلودی، کافیست تا طبق مراحل زیر، عمل کنید: - - -

ایجاد دیسک

-

طبق مستندات ساخت دیسک، یک دیسک با نام و اندازه دلخواه ایجاد کنید.

- - ) - }, - { - step: "۲", - content: ( - <> -

تعریف مسیر برای دیسک

-

طبق مستندات تعریف مسیر دیسک، دیسک ایجاد شده را به مسیر tmp/ متصل کنید.

- - ) - },]}/> -
-با انجام کارهای فوق، فضای پوشه tmp/ افزایش خواهد یافت. +از آنجایی که در لیارا، برای اجرای برنامه‌های Django، از وب‌سرور Nginx استفاده می‌شود. +در این وب‌سرور، به‌صورت پیش‌فرض حداکثر حجم مجاز آپلود فایل 1MB در نظر گرفته شده‌است. شما می‌توانید یک فایل با نام liara_nginx.conf در مسیر اصلی پروژه ایجاد کنید و محتویات زیر را داخل آن قرار دهید: + +
+
+ + {`client_max_body_size 250M; + +location /media { + alias /usr/src/app/media; +} + +location /static { + alias /usr/src/app/staticfiles; +} + +location / { + try_files /dev/null @django_app; +} + +location ~\\.sqlite3$ { + deny all; + error_page 403 =404 /; +} + +location ~ /\\.well-known { + allow all; +}`} + +
+
+با قرار دادن فایل بالا در ریشه‌ی برنامه‌ی‌تان حداکثر حجم مجاز آپلود فایل به 250MB افزایش می‌یابد. شما می‌توانید مقدار دلخواه خودتان را تنظیم کنید. در انتها، کافیست تا برنامه را مجدداً در لیارا مستقر کنید تا تغییرات، اعمال شوند. \ No newline at end of file diff --git a/src/pages/paas/django/fix-common-errors/worker-timeout.mdx b/src/pages/paas/django/fix-common-errors/worker-timeout.mdx new file mode 100644 index 00000000..e9259db2 --- /dev/null +++ b/src/pages/paas/django/fix-common-errors/worker-timeout.mdx @@ -0,0 +1,23 @@ +import Layout from "@/components/Layout"; +import Button from "@/components/Common/button"; +import Section from "@/components/Common/section"; +import Alert from "@/components/Common/alert"; +import Tabs from "@/components/Common/tab"; +import Step from "@/components/Common/step"; +import Card from "@/components/Common/card"; +import Important from "@/components/Common/important"; +import Highlight from "react-highlight"; +import Link from "next/link"; +import NextPage from "@/components/Common/nextpage"; +import {GoArrowLeft,} from "react-icons/go"; + + +# رفع خطای WORKER TIMEOUT در برنامه‌های Django +
+ +خطای WORKER TIMEOUT در Gunicorn نشان می‌دهد که یک یا چند worker پس از گذشتن از زمان مجاز تعیین‌شده برای پردازش درخواست‌ها، پاسخی ارسال نکرده‌اند و در نتیجه توسط Gunicorn متوقف و دوباره راه‌اندازی شده‌اند. این مشکل معمولاً زمانی رخ می‌دهد که پردازش یک درخواست بیش از حد طولانی شود. +برای رفع این خطا و در صورتی که به WORKER TIMEOUT بیشتر از 30 ثانیه نیاز دارید، می‌توانید طبق مستندات تنظیم متغیرهای محیطی، متغیر محیطی GUNICORN_TIMEOUT را با مقدار مورد نظرتان (به ثانیه)، به برنامه، اضافه کنید: +
+set gunicorn timeout env + + \ No newline at end of file diff --git a/src/pages/paas/django/getting-started.mdx b/src/pages/paas/django/getting-started.mdx index 93e975cf..cfbdb8c9 100644 --- a/src/pages/paas/django/getting-started.mdx +++ b/src/pages/paas/django/getting-started.mdx @@ -62,11 +62,9 @@ import { در ادامه، مستندات مربوط به ابزارهای Django برای شما قرار گرفته است:
-
+
{[ - { alt: 'django', platform: 'Lumen', link: "/paas/django/related-apps/lumen" }, - { alt: 'django', platform: 'Django Octane', link: "/paas/django/related-apps/django-octane" }, - { alt: 'django', platform: 'Voyager', link: "/paas/django/related-apps/voyager" }, + { alt: 'celery', platform: 'Celery', link: "/paas/django/related-apps/celery" }, ].map(item => diff --git a/src/pages/paas/django/how-tos/choose-version.mdx b/src/pages/paas/django/how-tos/choose-version.mdx index f7883cdb..5acbcfc1 100644 --- a/src/pages/paas/django/how-tos/choose-version.mdx +++ b/src/pages/paas/django/how-tos/choose-version.mdx @@ -11,21 +11,20 @@ import Link from "next/link"; import NextPage from "@/components/Common/nextpage"; -# انتخاب نسخه PHP و لاراول +# انتخاب نسخه Python
-در حال حاضر در پلتفرم Laravel لیارا، نسخه‌های زیر از PHP ارائه می‌شوند: +در حال حاضر در پلتفرم Django لیارا، نسخه‌های زیر از Python ارائه می‌شوند:
    {[ - {text: '7.2 (بدون‌آپدیت)',}, - {text: '7.3 (بدون‌آپدیت)',}, - {text: '7.4 (پیش‌فرض)',}, - {text: '8.0',}, - {text: '8.1',}, - {text: '8.2',}, - {text: '8.3',}, + {text: '3.7 (بدون به‌روزرسانی)',}, + {text: '3.8',}, + {text: '8.9',}, + {text: '3.10 (پیش‌فرض)',}, + {text: '3.11',}, + {text: '3.12',}, ].map((item, index) => (
  • - قابلیت‌های جدید برای نسخه‌های بدون آپدیت، ارائه نمی‌شوند و برای رفع این مشکل، باید ورژن PHP برنامه خود را، ارتقاء دهید. + قابلیت‌های جدید برای نسخه‌های بدون به‌روزرسانی، ارائه نمی‌شوند و برای رفع این مشکل، باید ورژن Python برنامه خود را، ارتقاء دهید.

    - -

    -توجه داشته باشید که ionCube در PHP نسخه 8.3 پشتیبانی نمی‌شود. -

    -
    -
    -همچنین، لیارا از نسخه‌های لاراول زیر پشتیبانی می‌کند: - -
    -
    -
      - {[ - {text: 'Laravel 5.5.^',}, - {text: 'Laravel 6.^'}, - {text: 'Laravel 7.^',}, - {text: 'Laravel 8.^',}, - {text: 'Laravel 9.^',}, - {text: 'Laravel 10.^',}, - {text: 'Laravel 11',}, - ].map((item, index) => ( -
    • - {item.text} -
    • - ))} -
    -

    پس از بارگذاری پروژه خود در لیارا، کافیست تا در مرحله انتخاب نسخه، نسخه مورد نظر برنامه‌تان را انتخاب کنید.

    - how to choose version in liara console + how to choose version in liara console , <>

    - برای تغییر نسخه پیش‌فرض، کافیست تا یک فایل به نام liara.json در مسیر اصلی پروژه، ایجاد کنید و قطعه کد زیر را درون آن، قرار دهید. قطعه کد زیر برای تغییر نسخه PHP به 8.2 می‌باشد: + برای تغییر نسخه پیش‌فرض، کافیست تا یک فایل به نام liara.json در مسیر اصلی پروژه، ایجاد کنید و قطعه کد زیر را درون آن، قرار دهید. قطعه کد زیر برای تغییر نسخه Python به 3.12 می‌باشد:

    {`{ - "laravel": { - "phpVersion": "8.2" + "django": { + "pythonVersion": "3.12" } }`} @@ -104,5 +72,5 @@ import NextPage from "@/components/Common/nextpage"; ]} /> - + \ No newline at end of file diff --git a/src/pages/paas/django/how-tos/customize-nginx.mdx b/src/pages/paas/django/how-tos/customize-nginx.mdx index 04c01b9e..36718dd1 100644 --- a/src/pages/paas/django/how-tos/customize-nginx.mdx +++ b/src/pages/paas/django/how-tos/customize-nginx.mdx @@ -51,46 +51,12 @@ location ~ /\\.well-known { سپس، کافیست تا برنامه خود را، مجدداً در لیارا مستقر کنید تا تنظیمات مدنظرتان، اعمال بشود. -
    -قابلیت gzip در NGINX برای فشرده‌سازی محتوا قبل از ارسال آن به مرورگر کاربران استفاده می‌شود. این کار باعث کاهش حجم داده‌های منتقل‌شده و در نتیجه کاهش زمان بارگذاری صفحات وب می‌شود، که می‌تواند به بهبود عملکرد کمک کند. -برای فعال‌کردن قابلیت gzip می‌توانید قطعه کد زیر را در فایل liara_nginx.conf وارد کنید: - -
    -
    - -{`gzip on; -gzip_disable "msie6"; -gzip_vary on; -gzip_proxied any; -gzip_comp_level 6; -gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; - -client_max_body_size 100M; - -location /media { - alias /usr/src/app/media; -} - -location /static { - alias /usr/src/app/staticfiles; -} - -location / { - try_files /dev/null @django_app; -} - -location ~\\.sqlite3$ { - deny all; - error_page 403 =404 /; -} - -location ~ /\\.well-known { - allow all; -}`} - -
    -
    + +

    + امکان تغییر تنظیمات nginx از ابتدا وجود ندارد. شما می‌توانید تنها برخی از این تنظیمات را شخصی‌سازی کنید. در نهایت، فایل تنظیمات شما داخل بلاک server در تنظیمات اصلی، include خواهد شد. +

    +
    - + \ No newline at end of file diff --git a/src/pages/paas/django/how-tos/enable-gzip.mdx b/src/pages/paas/django/how-tos/enable-gzip.mdx new file mode 100644 index 00000000..5ee802e4 --- /dev/null +++ b/src/pages/paas/django/how-tos/enable-gzip.mdx @@ -0,0 +1,61 @@ +import Layout from "@/components/Layout"; +import Button from "@/components/Common/button"; +import Section from "@/components/Common/section"; +import Alert from "@/components/Common/alert"; +import Tabs from "@/components/Common/tab"; +import Step from "@/components/Common/step"; +import Card from "@/components/Common/card"; +import Important from "@/components/Common/important"; +import Highlight from "react-highlight"; +import Link from "next/link"; +import NextPage from "@/components/Common/nextpage"; + + +# فعال‌سازی قابلیت gzip در برنامه‌های Django +
    + +قابلیت gzip در NGINX برای فشرده‌سازی محتوا قبل از ارسال آن به مرورگر کاربران استفاده می‌شود. این کار باعث کاهش حجم داده‌های منتقل‌شده و در نتیجه کاهش زمان بارگذاری صفحات وب می‌شود، که می‌تواند به بهبود عملکرد کمک کند. +
    + +برای فعال‌کردن قابلیت gzip می‌توانید از فایل liara_nginx.conf استفاده کنید. برای این کار کافیست این فایل را در مسیر اصلی پروژه، ایجاد کنید و یا اگر که از قبل این‌کار را انجام داده‌اید؛ قطعه کد زیر را در آن، قرار دهید: + +
    +
    + +{`gzip on; +gzip_disable "msie6"; +gzip_vary on; +gzip_proxied any; +gzip_comp_level 6; +gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; + +client_max_body_size 100M; + +location /media { + alias /usr/src/app/media; +} + +location /static { + alias /usr/src/app/staticfiles; +} + +location / { + try_files /dev/null @django_app; +} + +location ~\\.sqlite3$ { + deny all; + error_page 403 =404 /; +} + +location ~ /\\.well-known { + allow all; +}`} + +
    +
    + +پس از انجام کار فوق، کافیست برای اعمال تغییرات، برنامه‌تان را مجدداً در لیارا، مستقر کنید. + + + \ No newline at end of file diff --git a/src/pages/paas/django/how-tos/set-gunicorn-maxrequest.mdx b/src/pages/paas/django/how-tos/set-gunicorn-maxrequest.mdx new file mode 100644 index 00000000..686c92da --- /dev/null +++ b/src/pages/paas/django/how-tos/set-gunicorn-maxrequest.mdx @@ -0,0 +1,30 @@ +import Layout from "@/components/Layout"; +import Button from "@/components/Common/button"; +import Section from "@/components/Common/section"; +import Alert from "@/components/Common/alert"; +import Tabs from "@/components/Common/tab"; +import Step from "@/components/Common/step"; +import Card from "@/components/Common/card"; +import Important from "@/components/Common/important"; +import Highlight from "react-highlight"; +import Link from "next/link"; +import NextPage from "@/components/Common/nextpage"; + + +# تنظیم max_request در Gunicorn در برنامه‌های Django +
    + +در Gunicorn، پارامتر max_requests تعداد درخواست‌هایی را که هر Worker باید قبل از retirement (خاتمه کار) پردازش کند، مشخص می‌کند. پس از رسیدن یک Worker به این اندازه، به طور خودکار retired می‌شود و یک Worker جدید جایگزین آن می‌شود. + +یکی از راه‌های جلوگیری از نشت حافظه و مصرف بالای RAM در Gunicorn، تنظیم پارامتر max_requests است. با تنظیم این پارامتر، با رسیدن تعداد درخواست‌های هر یک از Threadهای Gunicorn به این عدد، آن Thread ری‌استارت شده و حافظه‌ی RAM آن خالی می‌شود. +در صورتی که در برنا‌مه‌ی Django خود نیاز به ری‌استارت WORKER THREAD بعد از تعداد مشخصی Request دارید، می‌توانید طبق مستندات تنظیم متغیرهای محیطی، متغیر محیطی GUNICORN_MAX_REQUESTS را با مقدار 1000 به برنامه Django خود، اضافه کنید. + +
    + +

    +مقدار پیش‌فرض این متغیر در برنامه‌های Django، برابر با 10000 است. +

    +
    + + + \ No newline at end of file diff --git a/src/pages/paas/django/how-tos/set-gunicorn-workers.mdx b/src/pages/paas/django/how-tos/set-gunicorn-workers.mdx new file mode 100644 index 00000000..d8cd4e71 --- /dev/null +++ b/src/pages/paas/django/how-tos/set-gunicorn-workers.mdx @@ -0,0 +1,31 @@ +import Layout from "@/components/Layout"; +import Button from "@/components/Common/button"; +import Section from "@/components/Common/section"; +import Alert from "@/components/Common/alert"; +import Tabs from "@/components/Common/tab"; +import Step from "@/components/Common/step"; +import Card from "@/components/Common/card"; +import Important from "@/components/Common/important"; +import Highlight from "react-highlight"; +import Link from "next/link"; +import NextPage from "@/components/Common/nextpage"; + + +# تنظیم تعداد workerهای Gunicorn در برنامه‌های Django +
    + +در Gunicorn، یک worker فرآیندی است که مسئول پردازش درخواست‌ها و پاسخ‌ها در یک برنامه وب است. worker می‌تواند به صورت مستقل از بقیه فرآیندها عمل کند و بار کاری بین آنها، به سادگی، تقسیم می‌شود. این کار باعث افزایش کارایی و مقیاس‌پذیری برنامه می‌شود. + +برای تنظیم تعداد Workerهای Gunicorn کافیست تا طبق مستندات تنظیم متغیرهای محیطی، یک متغیر محیطی به نام GUNICORN_WORKERS +با مقدار دلخواه که همان تعداد Workerها است، به برنامه اضافه کنید. + + +
    + +

    +مقدار پیش‌فرض این متغیر در برنامه‌های Django، برابر با 3 است. +

    +
    + + + \ No newline at end of file diff --git a/src/pages/paas/django/how-tos/set-http-security-headers.mdx b/src/pages/paas/django/how-tos/set-http-security-headers.mdx index 8c935c61..c26a60a5 100644 --- a/src/pages/paas/django/how-tos/set-http-security-headers.mdx +++ b/src/pages/paas/django/how-tos/set-http-security-headers.mdx @@ -21,36 +21,37 @@ import NextPage from "@/components/Common/nextpage"; Content Security Policy (CSP) و Strict-Transport-Security (HSTS) می‌کنند. -شما می‌توانید هدرهای امنیتی را مانند قطعه کد مثال زیر، در فایل public/.htaccess تنظیم کرده و نحوه‌ی برقراری ارتباط با سایت را، برای مرورگرها، تعیین کنید: +شما می‌توانید هدرهای امنیتی را مانند قطعه کد مثال زیر، در فایل liara_nginx.conf تنظیم کرده و نحوه‌ی برقراری ارتباط با سایت را، برای مرورگرها، تعیین کنید:
    - - {` - - Options -MultiViews -Indexes - + + {`add_header X-Frame-Options DENY always; +add_header X-Content-Type-Options: nosniff; +add_header X-XSS-Protection "1; mode=block" always; +add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; - Header always set X-Frame-Options "DENY" - Header always set X-Content-Type-Options "nosniff" - Header always set X-XSS-Protection "1; mode=block" - Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" +client_max_body_size 100M; - RewriteEngine On +location /media { + alias /usr/src/app/media; +} - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] +location /static { + alias /usr/src/app/staticfiles; +} - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] +location / { + try_files /dev/null @django_app; +} - # Send Requests To Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] -`} +location ~\.sqlite3$ { + deny all; + error_page 403 =404 /; +} + +location ~ /\.well-known { + allow all; +}`}
    @@ -63,7 +64,7 @@ Content Security Policy (CSP) و Strict-Transport-Security (HSTS)

    -همچنین بخوانید: تهیه گواهی SSL +همچنین بخوانید: تهیه گواهی SSL

    diff --git a/src/pages/paas/django/how-tos/use-asgi.mdx b/src/pages/paas/django/how-tos/use-asgi.mdx new file mode 100644 index 00000000..6fc7a99c --- /dev/null +++ b/src/pages/paas/django/how-tos/use-asgi.mdx @@ -0,0 +1,38 @@ +import Layout from "@/components/Layout"; +import Button from "@/components/Common/button"; +import Section from "@/components/Common/section"; +import Alert from "@/components/Common/alert"; +import Tabs from "@/components/Common/tab"; +import Step from "@/components/Common/step"; +import Card from "@/components/Common/card"; +import Important from "@/components/Common/important"; +import Highlight from "react-highlight"; +import Link from "next/link"; +import NextPage from "@/components/Common/nextpage"; + + +# راه‌اندازی برنامه ASGI در برنامه‌های Django +
    + +ASGI یا Asynchronous Server Gateway Interface در Django یک استاندارد برای ساخت و مدیریت برنامه‌های وب ناهمگام است که از ویژگی‌های همزمان و ناهمزمان پشتیبانی می‌کند. ASGI، جایگزین WSGI شده و امکان استفاده از قابلیت‌های وب‌سوکت، پروتکل‌های HTTP2 و سایر عملیات‌های ناهمزمان را فراهم می‌کند. +
    +برای استقرار برنامه‌های ASGI در پلتفرم Django لیارا تنها باید WSGI_APPLICATION را از فایل settings.py برنامه حذف کنید و مسیر فایل پیکربندی برنامه‌ی ASGI خود را در متغیر ASGI_APPLICATION مقداردهی کنید. به عنوان مثال، اگر نام پروژه‌تان myapp است، باید قطعه کد زیر را از فایل settings.py پاک کنید: + +
    +
    + + {`WSGI_APPLICATION = 'myapp.wsgi.application'`} + +
    +
    + +و به جای آن، از قطعه کد زیر استفاده کنید: +
    +
    + + {`ASGI_APPLICATION = 'myapp.asgi.application'`} + +
    + + + \ No newline at end of file diff --git a/src/pages/paas/django/how-tos/use-ffmpeg-module.mdx b/src/pages/paas/django/how-tos/use-ffmpeg-module.mdx index d942ceb9..c755d2d0 100644 --- a/src/pages/paas/django/how-tos/use-ffmpeg-module.mdx +++ b/src/pages/paas/django/how-tos/use-ffmpeg-module.mdx @@ -11,33 +11,69 @@ import Link from "next/link"; import NextPage from "@/components/Common/nextpage"; -# استفاده از ماژول FFMPEG در Laravel +# استفاده از ماژول FFMPEG در Django
    FFMPEG یک نرم‌افزار متن‌باز برای پردازش چندرسانه‌ای است که قابلیت ضبط، تبدیل، پخش ویدیوی زنده و پخش استریمی (streaming) را دارد. این ابزار بسیار قدرتمند است و برای انواع مختلفی از فرمت‌های صوتی و تصویری، قابلیت‌ها و توابع متنوعی ارائه می‌دهد. -ماژول FFMPEG به‌صورت پیش‌فرض در برنامه‌های Laravel نصب است و همچنین متغیرهای محیطی FFMPEG_PATH و FFPROBE_PATH در این پلتفرم تنظیم شده‌اند. شما برای استفاده از این ماژول تنها کافیست پکیج php-ffmpeg را با اجرای دستور زیر نصب کنید: - +ماژول FFMPEG به‌صورت پیش‌فرض در برنامه‌های Django نصب است و همچنین متغیرهای محیطی FFMPEG_PATH و FFPROBE_PATH در این پلتفرم تنظیم شده‌اند. +برای استفاده از FFmpeg در برنامه‌های Django، می‌توانید از کتابخانه‌های پایتون برای تعامل با FFmpeg استفاده کنید. یکی از محبوب‌ترین کتابخانه‌ها برای این کار، ffmpeg-python است که می‌توانید با اجرای دستور زیر، آن را نصب کنید:
    - {`composer require php-ffmpeg/php-ffmpeg`} + {`pip install ffmpeg-python`}
    -در نهایت، می‌توانید همانند قطعه کد زیر، از این پکیج در برنامه خود، بهره ببرید: + +تمامی کارها انجام شده است و شما می‌توانید از FFMPEG استفاده کنید؛ به عنوان مثال: + + + + +
    +
    + + {`import ffmpeg + +def convert_video(input_file_path, output_file_path, codec='libx264'): + try: + ( + ffmpeg + .input(input_file_path) + .output(output_file_path, vcodec=codec) + .run(overwrite_output=True) + ) + except ffmpeg.Error as e: + print(f"Error: {e.stderr.decode()}") + raise +`} + +
    + +یا حتی می‌توانید در viewهای Django، از این پکیج استفاده کنید؛ به عنوان مثال: + +
    - - {`use FFMpeg; - -$ffmpeg = FFMpeg::create([ - 'ffmpeg.binaries' => env('FFMPEG_PATH', '/usr/bin/ffmpeg'), - 'ffprobe.binaries' => env('FFPROBE_PATH', '/usr/bin/ffprobe'), -]);`} - + + {`from django.http import HttpResponse +from .ffmpeg_utils import convert_video + +def process_video(request): + input_file = '/path/to/input/video.mp4' + output_file = '/path/to/output/video.mp4' + + try: + convert_video(input_file, output_file) + return HttpResponse("Video processed successfully.") + except Exception as e: + return HttpResponse(f"Error processing video: {e}", status=500) +`} +
    +
    - + \ No newline at end of file diff --git a/src/pages/paas/django/how-tos/use-hooks.mdx b/src/pages/paas/django/how-tos/use-hooks.mdx index c95e2696..5e6b9f3e 100644 --- a/src/pages/paas/django/how-tos/use-hooks.mdx +++ b/src/pages/paas/django/how-tos/use-hooks.mdx @@ -13,7 +13,7 @@ import Table from "@/components/Common/table"; -# استفاده از Hooks در برنامه‌های Laravel +# استفاده از Hooks در برنامه‌های Django
    Hookها در برنامه‌نویسی به دستوراتی گفته می‌شود که به شما اجازه می‌دهند تا عملکرد یک برنامه را در یک نقطه خاص از فرایند اجرا یا استقرار آن، تغییر یا بهبود دهید؛ بدون اینکه نیاز به تغییر کد اصلی داشته باشید. @@ -29,13 +29,13 @@ Hookها در برنامه‌نویسی به دستوراتی گفته می‌ش ]} data={[ [ "liara_pre_build.sh", - "npm run build قبل از اجرای دستور", + "قبل از بیلد فایل‌های قسمت فرانت برنامه", "ندارد", "نصب پکیج‌های سیستمی لازم با apt-get", ], [ "liara_post_build.sh", - "npm run build بعد از اجرای دستور", + "بعد از بیلد فایل‌های قسمت فرانت برنامه ", "ندارد", "اجرای دستورات مرتبط با cache و بهینه‌سازی", ], @@ -50,22 +50,22 @@ Hookها در برنامه‌نویسی به دستوراتی گفته می‌ش به عنوان مثال، می‌توانید در فایل liara_pre_start.sh دستورات مربوط به migrations را بنویسید تا نیازی نباشد که پس از استقرار برنامه، آن را به صورت دستی در خط فرمان برنامه خود، اجرا کنید:
    - {`echo "Running pre-start script for Laravel..." + {`echo "Running pre-start script..." # run migrations -php artisan migrate --force +python manage.py migrate # other needed commands # ... -echo "Pre-start script for Laravel finished."`} +echo "Pre-start script finished."`}

    -توجه داشته باشید که در نسخه‌های بدون آپدیت PHP، این قابلیت پشتیبانی نمی‌شود. +توجه داشته باشید که در نسخه‌های بدون به‌روزرسانی Python، این قابلیت پشتیبانی نمی‌شود.

    diff --git a/src/pages/paas/django/how-tos/use-supervisord.mdx b/src/pages/paas/django/how-tos/use-supervisord.mdx new file mode 100644 index 00000000..51461c94 --- /dev/null +++ b/src/pages/paas/django/how-tos/use-supervisord.mdx @@ -0,0 +1,44 @@ +import Layout from "@/components/Layout"; +import Button from "@/components/Common/button"; +import Section from "@/components/Common/section"; +import Alert from "@/components/Common/alert"; +import Tabs from "@/components/Common/tab"; +import Step from "@/components/Common/step"; +import Card from "@/components/Common/card"; +import Important from "@/components/Common/important"; +import Highlight from "react-highlight"; +import Link from "next/link"; +import NextPage from "@/components/Common/nextpage"; + + +# استفاده از Supervisord در برنامه‌های Django +
    + +supervisord یک ابزار مدیریتی است که برای اجرا و کنترل فرآیندهای پس‌زمینه (background processes) طراحی شده است. این ابزار می‌تواند برای مدیریت سرویس‌های مختلف در یک محیط واقعی، مورد استفاده قرار گیرد. + +شما می‌توانید در مسیر اصلی پروژه، یک فایل به نام supervisor.conf ایجاد کنید و درون این فایل، Workerهای خود را برای اجرای background jobها، تعریف کنید. به عنوان مثال، برای ایجاد یک Worker در یک برنامه celery، می‌توانید از قطعه کد زیر استفاده کنید: + +
    +
    + +{`[program:celery-worker] +process_name=%(program_name)s_%(process_num)02d +command=celery -A proj worker -l INFO +autostart=true +autorestart=true +stopasgroup=true +killasgroup=true +numprocs=1 +startsecs=10 +stopwaitsecs=600 +redirect_stderr=true +stdout_logfile=/tmp/worker.log`} + +
    +
    + +پس از انجام کار فوق، کافیست برای اعمال تغییرات، برنامه‌تان را مجدداً در لیارا، مستقر کنید. پس از استقرار، +Supervisor اجرا شده و دستور شما را در Background اجرا خواهد کرد. + + + \ No newline at end of file diff --git a/src/pages/paas/django/how-tos/use-websocket.mdx b/src/pages/paas/django/how-tos/use-websocket.mdx index 47083988..4cddc85e 100644 --- a/src/pages/paas/django/how-tos/use-websocket.mdx +++ b/src/pages/paas/django/how-tos/use-websocket.mdx @@ -15,187 +15,469 @@ import NextPage from "@/components/Common/nextpage";
    وب‌سوکت (WebSocket) یک فناوری ارتباطی در وب است که به سرور و مرورگر اجازه می‌دهد از طریق یک اتصال دوطرفه دائمی، داده‌ها را به صورت تعاملی ارسال و دریافت کنند. در واقع مرورگر می‌تواند داده‌ها را بفرستد و دریافت کند بدون اینکه نیازی به بارگیری دوباره صفحه وب (refresh) باشد. این ویژگی به برنامه‌های تعاملی مانند چت‌های زنده و بازی‌های آنلاین کمک می‌کند. -در ادامه، به نحوه ایجاد برنامه WebSocket در فریم‌ورک NextJS با استفاده از پکیج Socket.IO و همچنین نحوه استقرار آن در لیارا، پرداخته شده است. +در ادامه، به نحوه ایجاد برنامه WebSocket در فریم‌ورک Django با استفاده از ماژول channels و همچنین نحوه استقرار آن در لیارا، پرداخته شده است. -
    -پروژه‌ در پیش‌رو، یک چت‌روم تحت وب در فریم‌ورک NextJS است که کاربران می‌توانند در آن به صورت Realtime (با تکیه بر WebSocket) به گفتگو بپردازند. -در ابتدا، بایستی پکیج‌های مورد نیاز برنامه را با اجرای دستور زیر با استفاده از npm، نصب کنید: +
    +پروژه‌ در پیش‌رو، یک چت‌روم تحت وب در فریم‌ورک Django است که کاربران می‌توانند در آن به صورت Realtime (با تکیه بر WebSocket) به گفتگو بپردازند. +در ابتدا، بایستی در محیط مجازی، با اجرای دستور زیر، یک پروژه جدید Django را، ایجاد کنید:
    - {`npm install express socket.io socket.io-client`} + {`django-admin startproject ChatApp`}
    -در ادامه، بایستی در مسیر اصلی پروژه، یک فایل به نام server.js ایجاد کنید و محتوای زیر را درون آن قرار دهید. این فایل برای -مدیریت برنامه NextJS و سرور Socket.IO به کار می‌رود: +‌پس از اجرای دستور فوق، کافیست تا دستور زیر را اجرا کنید تا ماژول‌های channels و daphne برای‌تان نصب شود:
    - - {`const express = require('express'); -const next = require('next'); -const http = require('http'); -const socketIo = require('socket.io'); - -const dev = process.env.NODE_ENV !== 'production'; -const app = next({ dev }); -const handle = app.getRequestHandler(); - -const port = process.env.PORT || 3000; - -app.prepare().then(() => { - const server = express(); - const httpServer = http.createServer(server); - const io = socketIo(httpServer, { - cors: { - origin: '*', - }, - }); - - io.on('connection', (socket) => { - console.log('a user connected'); - socket.on('message', (message) => { - io.emit('message', message); - }); - - socket.on('disconnect', () => { - console.log('user disconnected'); - }); - }); - - server.all('*', (req, res) => { - return handle(req, res); - }); - - httpServer.listen(port, (err) => { - if (err) throw err; - console.log(\`ready on port \${port}\`); - }); -}); -`} + + {`pip install channels daphne`}
    -سپس، در مسیر اصلی پروژه، یک دایرکتوری به نام components ایجاد کنید و درون آن، یک فایل به نام Chat.js بسازید و قطعه کد زیر را، درون آن، قرار دهید: +حال، بایستی با استفاده از دستور زیر، یک application جدید به نام chat در پروژه ایجاد کنید: +
    -{`import { useEffect, useState } from 'react'; -import io from 'socket.io-client'; +{`python manage.py startapp chat`} + +
    +
    + +پس از اجرای دستورات فوق، کافیست تا برنامه chat و ماژول‌های channels و daphne را به INSTALLED_APPS در فایل settings.py به شکل زیر، اضافه کنید: -const socket = io(); +
    +
    + + {`INSTALLED_APPS = [ + 'daphne', + 'chat', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'channels', +]`} + +
    +
    -export default function Chat() { - const [message, setMessage] = useState(''); - const [messages, setMessages] = useState([]); +پس از انجام کار فوق، باید قطعه کد زیر را در فایل settings.py قرار دهید: - useEffect(() => { - socket.on('message', (message) => { - setMessages((prevMessages) => [...prevMessages, message]); - }); +
    +
    + + {`ASGI_APPLICATION = 'ChatApp.asgi.application'`} + +
    +
    - return () => { - socket.off('message'); - }; - }, []); +سپس، فایل‌ها و دایرکتوری‌های زیر را در مسیرهای مشخص شده، ایجاد کنید: - const sendMessage = () => { - if (message) { - socket.emit('message', message); - setMessage(''); - } - }; - - return ( -
    -
    - {messages.map((msg, index) => ( -
    {msg}
    - ))} -
    - setMessage(e.target.value)} - /> - -
    - ); -} -`} +
    +
      +
    • فایل chat/urls.py
    • +
      +
    • دایرکتوری chat/templates
    • +
      +
    • دایرکتوری chat/templates/chat
    • +
      +
    • فایل‌های chat/templates/chat/chatPage.html و chat/templates/chat/LoginPage.html
    • +
      +
    • فایل chat/routing.py
    • +
      +
    • فایل chat/consumers.py
    • +
      +
    +
    + +اکنون، در فایل ChatApp/urls.py قطعه کد زیر را قرار دهید: + +
    +
    + + {`from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path("", include("chat.urls")), +]`}
    -پس از انجام کار فوق، کافیست تا در مسیر pages/index.js قطعه کد زیر -را قرار دهید: + +و قطعه کد زیر را نیز در chat/urls.py قرار دهید: +
    - - {`import Head from 'next/head'; -import Chat from '../components/Chat'; - -export default function Home() { - return ( -
    - - Next.js Chat App - - - - -
    -

    Welcome to the Chat App

    - -
    -
    - ); + + {`from django.urls import path, include +from chat import views as chat_views +from django.contrib.auth.views import LoginView, LogoutView + + +urlpatterns = [ + path("", chat_views.chatPage, name="chat-page"), + + # login-section + path("auth/login/", LoginView.as_view + (template_name="chat/LoginPage.html"), name="login-user"), + path("auth/logout/", LogoutView.as_view(), name="logout-user"), +]`} + +
    +
    + +سپس، در chat/views.py قطعه کد زیر را قرار دهید: + +
    +
    + + {`from django.shortcuts import render, redirect + + +def chatPage(request, *args, **kwargs): + if not request.user.is_authenticated: + return redirect("login-user") + context = {} + return render(request, "chat/chatPage.html", context)`} + +
    +
    + +اکنون، می‌توانید در chat/templates/chat/chatPage.html از قطعه کد ساده زیر استفاده کنید: + +
    +
    + + {` + + +

    Welcome to chat site! {{request.user}}

    +
    + {% if request.user.is_authenticated %} +
    Logout the chat Page Logout
    + {% endif %} +
    +
    + + +
    +
    +
    + + +`} +
    +
    +
    + +و همچنین، قطعه کد زیر را در chat/templates/chat/LoginPage.html به کار ببرید: + +
    +
    + + {` + + +
    + {% csrf_token %} + {{form.as_p}} +
    + +
    + +`} +
    +
    +
    + +پس از انجام کارهای فوق، کافیست تا دستورات زیر را اجرا کنید: + +
    +
    + + {`python manage.py makemigrations +python manage.py migrate`} + +
    +
    + +اکنون، باید قطعه کد زیر را در chat/routing.py قرار دهید: + + +
    +
    + + {`from django.urls import path , include +from chat.consumers import ChatConsumer + +# Here, "" is routing to the URL ChatConsumer which +# will handle the chat functionality. +websocket_urlpatterns = [ + path("" , ChatConsumer.as_asgi()) , +]`} + +
    +
    + +و همچنین در chat/consumers.py قطعه کد زیر را قرار دهید: + +
    +
    + + {`import json +from channels.generic.websocket import AsyncWebsocketConsumer + +class ChatConsumer(AsyncWebsocketConsumer): + async def connect(self): + self.roomGroupName = "group_chat_gfg" + await self.channel_layer.group_add( + self.roomGroupName , + self.channel_name + ) + await self.accept() + async def disconnect(self , close_code): + await self.channel_layer.group_discard( + self.roomGroupName , + self.channel_layer + ) + async def receive(self, text_data): + text_data_json = json.loads(text_data) + message = text_data_json["message"] + username = text_data_json["username"] + await self.channel_layer.group_send( + self.roomGroupName,{ + "type" : "sendMessage" , + "message" : message , + "username" : username , + }) + async def sendMessage(self , event) : + message = event["message"] + username = event["username"] + await self.send(text_data = json.dumps({"message":message ,"username":username}))`} + +
    +
    + +پس از انجام کارهای فوق، اکنون کافیست تا در ChatApp/asgi.py قطعه کد زیر را قرار دهید: + +
    +
    + + {`import os +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ChatApp.settings') + +from channels.auth import AuthMiddlewareStack +from channels.routing import ProtocolTypeRouter , URLRouter +from chat import routing + +application = ProtocolTypeRouter( + { + "http" : get_asgi_application() , + "websocket" : AuthMiddlewareStack( + URLRouter( + routing.websocket_urlpatterns + ) + ) + } +)`} + +
    +
    + +در ادامه، باید قطعه کد زیر را به فایل settings.py اضافه کنید: + +
    +
    + + {`CHANNEL_LAYERS = { + "default": { + "BACKEND": "channels.layers.InMemoryChannelLayer" + } } `}
    -تمامی کارها انجام شده است و شما می‌توانید با اجرای دستور node server.js برنامه خود را اجرا کرده و از آن استفاده کنید. -
    + +

    +در نظر داشته باشید که قطعه کد فوق، مناسب محیط توسعه است و برای استفاده در محیط Production، بهتر است از Redis Channels استفاده کنید. در ادامه، نحوه استفاده از Redis Channels در برنامه‌های جنگو، آموزش داده شده است. +

    +
    +
    + +در نهایت، قطعه کد زیر را به انتهای فایل settings.py اضافه کنید: -از آنجایی که برنامه WebSocket فوق (یا به صورت کلی، اکثر برنامه‌های مبتنی بر Websocket) به یک سرور برای مدیریت Socket نیاز دارند؛ بنابراین -برای استقرار این برنامه در لیارا، بهتر است که از پلتفرم NodeJS استفاده شود. -برای این کار کافیست تا طبق مستندات ساخت برنامه NodeJS یک برنامه NodeJS ایجاد کنید و اسکریپت start درون فایل package.json خود را به شکل زیر، تغییر دهید:
    - - {`{ -"scripts": { - "dev": "next dev", - "build": "next build", - "start": "node server.js", - "lint": "next lint" - }, - }`} + + {`LOGIN_REDIRECT_URL= "chat-page" +LOGOUT_REDIRECT_URL= "login-user"`}
    -در نهایت، کافیست تا با اجرای دستور زیر، برنامه خود را در لیارا، مستقر کنید: +تمام کارها انجام شده است و اکنون می‌توانید با استفاده از دستور زیر؛ کاربران مدنظر خود را ایجاد کنید تا در چت‌روم، با یکدیگر تعامل داشته باشند: +
    - - {`liara deploy --port=3000 --platform=node`} + + {`python manage.py createsuperuser`} + +
    +
    + +در انتها، با استفاده از دستور زیر، می‌توانید برنامه را اجرا و استفاده کنید: + +
    +
    + + {`python manage.py runserver`}
    +
    + + +
    +
    + + {``} + +
    +
    + +
    + +برای استقرار برنامه‌های وب‌سوکت جنگو در لیارا، نیازی به انجام تغییر خاصی نیست. صرفاً باید به جای استفاده از آدرس ws، عبارت wss را به کار ببرید تا اتصال، ایمن و سازگار باشد. همچنین، در فایل settings.py باید قطعه کد زیر را حذف کنید: +
    +
    + + {`WSGI_APPLICATION = 'ChatApp.wsgi.application'`} + +
    +
    + +و به جای آن، از قطعه کد زیر استفاده کنید: + +
    +
    + + {`ASGI_APPLICATION = 'ChatApp.asgi.application'`} + +
    +
    + + +

    +مقدار متغیرهای فوق وابسته به نام پروژه، متغیر هستند و این مقدار در این‌جا، یک مثال برای پروژه‌ای به نام ChatApp می‌باشد. +

    +
    +
    + +از آنجایی که استفاده از InMemoryChannelLayer در حالت Production، احتمال نشت داده‌ها را بسیار افزایش می‌دهد؛ پس بهتر است به جای آن، از Redis Channels استفاده کنید. برای این کار نیز، کافیست تا در ابتدا ماژول channels-redis در پروژه خود، نصب کنید: + +
    +
    + + {`pip install channels-redis`} + +
    +
    + +پس از نصب ماژول فوق، کافیست تا قطعه کد زیر را از فایل settings.py حذف کنید: + +
    +
    + + {`CHANNEL_LAYERS = { + "default": { + "BACKEND": "channels.layers.InMemoryChannelLayer" + } +}`} + +
    +
    + +و قطعه کد زیر را جایگزین آن کنید: + +
    +
    + + {`import os +CHANNEL_LAYERS = { + "default": { + "BACKEND": "channels_redis.pubsub.RedisPubSubChannelLayer", + "CONFIG": { + "hosts":[{ + "address": os.getenv('REDIS_URI'), + }]} + } +}`} + +
    +
    + + +

    +باید طبق مستندات تنظیم متغیرهای محیطی، یک متغیر محیطی به نام REDIS_URI با مقدار URI دیتابیس Redis خود به برنامه Djangoتان، اضافه کنید. +

    +
    + +در انتها، می‌توانید برنامه خود را بدون هیچ مشکل خاصی، در لیارا مستقر کنید. + +

    -سورس کامل یک برنامه NextJS WebSocket آماده استقرار در اینجا موجود است که می‌توانید از آن استفاده کنید. +سورس کامل یک برنامه Django WebSocket آماده استقرار در اینجا موجود است که می‌توانید از آن استفاده کنید.

    - + \ No newline at end of file diff --git a/src/pages/paas/django/related-apps/celery.mdx b/src/pages/paas/django/related-apps/celery.mdx new file mode 100644 index 00000000..40c87742 --- /dev/null +++ b/src/pages/paas/django/related-apps/celery.mdx @@ -0,0 +1,19 @@ +import Layout from "@/components/Layout"; +import Button from "@/components/Common/button"; +import Section from "@/components/Common/section"; +import Alert from "@/components/Common/alert"; +import Tabs from "@/components/Common/tab"; +import Step from "@/components/Common/step"; +import Card from "@/components/Common/card"; +import Important from "@/components/Common/important"; +import Highlight from "react-highlight"; +import Link from "next/link"; +import NextPage from "@/components/Common/nextpage"; + + +# استقرار برنامه‌های Django وابسته به Celery در لیارا +
    +Celery یک کتابخانه مدیریت صف و پردازش‌های ناهمزمان در پایتون است که به شما امکان می‌دهد تا وظایف (tasks) سنگین و زمان‌بر را به صورت پس‌زمینه و مستقل از اجرای اصلی برنامه، انجام دهید. این ابزار برای اجرای وظایف به صورت توزیع‌شده و با قابلیت زمان‌بندی طراحی شده است و معمولاً با Django برای مدیریت وظایف پس‌زمینه مثل ارسال ایمیل، پردازش داده‌ها و سایر عملیات طولانی ترکیب می‌شود. + + +
    \ No newline at end of file diff --git a/src/pages/paas/django/related-links.mdx b/src/pages/paas/django/related-links.mdx index 3ae91e86..d8139c12 100644 --- a/src/pages/paas/django/related-links.mdx +++ b/src/pages/paas/django/related-links.mdx @@ -12,15 +12,15 @@ import NextPage from "@/components/Common/nextpage"; import {GoArrowLeft,} from "react-icons/go"; -# لینک‌های مرتبط با پلتفرم Laravel +# لینک‌های مرتبط با پلتفرم Django
    -در ادامه، لینک‌های تمامی مستندات مربوط به پلتفرم Laravel برای شما قرار گرفته است تا بتوانید بیش از پیش، برنامه‌تان را بهینه‌تر و سریع‌تر توسعه دهید: +در ادامه، لینک‌های تمامی مستندات مربوط به پلتفرم Django برای شما قرار گرفته است تا بتوانید بیش از پیش، برنامه‌تان را بهینه‌تر و سریع‌تر توسعه دهید:
    {[ - { platform: 'مستندات راه‌اندازی سرور ایمیل لیارا در برنامه‌های Laravel', link: "/" }, - { platform: 'مستندات اتصال برنامه‌های Laravel به سرویس ذخیره‌سازی ابری لیارا', link: "/" }, - { platform: 'مستندات اتصال دامنه خریداری شده به برنامه Laravel با سیستم مدیریت DNS لیارا', link: "/" }, + { platform: 'مستندات راه‌اندازی سرور ایمیل لیارا در برنامه‌های Django', link: "/" }, + { platform: 'مستندات اتصال برنامه‌های Django به سرویس ذخیره‌سازی ابری لیارا', link: "/" }, + { platform: 'مستندات اتصال دامنه خریداری شده به برنامه Django با سیستم مدیریت DNS لیارا', link: "/" }, { platform: '', link: "/" }, ].map(item => diff --git a/src/pages/paas/laravel/how-tos/choose-version.mdx b/src/pages/paas/laravel/how-tos/choose-version.mdx index 56b4f709..609203a5 100644 --- a/src/pages/paas/laravel/how-tos/choose-version.mdx +++ b/src/pages/paas/laravel/how-tos/choose-version.mdx @@ -19,8 +19,8 @@ import NextPage from "@/components/Common/nextpage";
      {[ - {text: '7.2 (بدون‌آپدیت)',}, - {text: '7.3 (بدون‌آپدیت)',}, + {text: '7.2 (بدون به‌روزرسانی)',}, + {text: '7.3 (بدون به‌روزرسانی)',}, {text: '7.4 (پیش‌فرض)',}, {text: '8.0',}, {text: '8.1',}, @@ -41,7 +41,7 @@ import NextPage from "@/components/Common/nextpage";

      - قابلیت‌های جدید برای نسخه‌های بدون آپدیت، ارائه نمی‌شوند و برای رفع این مشکل، باید ورژن PHP برنامه خود را، ارتقاء دهید. + قابلیت‌های جدید برای نسخه‌های بدون به‌روزرسانی، ارائه نمی‌شوند و برای رفع این مشکل، باید ورژن PHP برنامه خود را، ارتقاء دهید.

      diff --git a/src/pages/paas/laravel/how-tos/set-http-security-headers.mdx b/src/pages/paas/laravel/how-tos/set-http-security-headers.mdx index 8c935c61..24407cd4 100644 --- a/src/pages/paas/laravel/how-tos/set-http-security-headers.mdx +++ b/src/pages/paas/laravel/how-tos/set-http-security-headers.mdx @@ -63,7 +63,7 @@ Content Security Policy (CSP) و Strict-Transport-Security (HSTS)

      -همچنین بخوانید: تهیه گواهی SSL +همچنین بخوانید: تهیه گواهی SSL

      diff --git a/src/pages/paas/laravel/how-tos/use-hooks.mdx b/src/pages/paas/laravel/how-tos/use-hooks.mdx index c95e2696..8fa22cce 100644 --- a/src/pages/paas/laravel/how-tos/use-hooks.mdx +++ b/src/pages/paas/laravel/how-tos/use-hooks.mdx @@ -65,7 +65,7 @@ echo "Pre-start script for Laravel finished."`}

      -توجه داشته باشید که در نسخه‌های بدون آپدیت PHP، این قابلیت پشتیبانی نمی‌شود. +توجه داشته باشید که در نسخه‌های بدون به‌روزرسانی PHP، این قابلیت پشتیبانی نمی‌شود.

      diff --git a/src/pages/paas/php/how-tos/choose-version.mdx b/src/pages/paas/php/how-tos/choose-version.mdx index fae36c2c..48d6403a 100644 --- a/src/pages/paas/php/how-tos/choose-version.mdx +++ b/src/pages/paas/php/how-tos/choose-version.mdx @@ -19,8 +19,8 @@ import NextPage from "@/components/Common/nextpage";
        {[ - {text: '7.2 (بدون‌آپدیت)',}, - {text: '7.3 (بدون‌آپدیت)',}, + {text: '7.2 (بدون به‌روزرسانی)',}, + {text: '7.3 (بدون به‌روزرسانی)',}, {text: '7.4',}, {text: '8.0 (پیش‌فرض)',}, {text: '8.1',}, @@ -41,7 +41,7 @@ import NextPage from "@/components/Common/nextpage";

        - قابلیت‌های جدید برای نسخه‌های بدون آپدیت، ارائه نمی‌شوند و برای رفع این مشکل، باید ورژن PHP برنامه خود را، ارتقاء دهید. + قابلیت‌های جدید برای نسخه‌های بدون به‌روزرسانی، ارائه نمی‌شوند و برای رفع این مشکل، باید ورژن PHP برنامه خود را، ارتقاء دهید.

        diff --git a/src/pages/paas/php/how-tos/set-http-security-headers.mdx b/src/pages/paas/php/how-tos/set-http-security-headers.mdx index 4007addc..fa9fc631 100644 --- a/src/pages/paas/php/how-tos/set-http-security-headers.mdx +++ b/src/pages/paas/php/how-tos/set-http-security-headers.mdx @@ -43,7 +43,7 @@ Content Security Policy (CSP) و Strict-Transport-Security (HSTS)

        -همچنین بخوانید: تهیه گواهی SSL +همچنین بخوانید: تهیه گواهی SSL

        diff --git a/src/pages/paas/php/how-tos/use-hooks.mdx b/src/pages/paas/php/how-tos/use-hooks.mdx index 137b2eda..a17e85b5 100644 --- a/src/pages/paas/php/how-tos/use-hooks.mdx +++ b/src/pages/paas/php/how-tos/use-hooks.mdx @@ -57,7 +57,7 @@ echo "Pre-start script for PHP finished.`}

        -توجه داشته باشید که در نسخه‌های بدون آپدیت PHP، این قابلیت پشتیبانی نمی‌شود. +توجه داشته باشید که در نسخه‌های بدون به‌روزرسانی PHP، این قابلیت پشتیبانی نمی‌شود.