در این راهنما
- ورود به cPanel، ساخت پوشه و آپلود فایلهای پروژه
- نصب پکیجها و تنظیم دیتابیس، دامنه و فایل شروع
- اجرای migration، نمایش static و انتشار سایت روی دامنه
قبل از شروع؛ چه چیزهایی آماده باشد؟
در این آموزش، یک پروژهٔ Django که روی رایانهٔ شما اجرا میشود را روی هاست منتشر میکنیم. برنامهنویسی جنگو لازم نیست از نو انجام شود؛ کد پروژه، یک هاست فعال و دامنهای که به هاست متصل شده باشد را آماده کنید.
در مثالها، پوشهٔ هاست myapp، نام بستهٔ جنگو myproject و دامنه example.com است. بستهٔ جنگو همان پوشهای است که settings.py داخل آن قرار دارد. این نامها را با اطلاعات پروژهٔ خود جایگزین کنید.
این راهنما برای اجرای معمول Django با WSGI است؛ WSGI رابط بین وبسرور و برنامهٔ پایتون شماست. برای Channels، WebSocket یا پردازش جداگانه، تیم فنی در تنظیم محیط اجرای مناسب همراه شماست.
۱. ورود به cPanel و پیدا کردن ابزارها
cPanel پنل مدیریت هاست شماست؛ فایلها، دیتابیس و ترمینال را از همین صفحه مدیریت میکنید. برای ورود، اطلاعات سرویس فعال خود را آماده داشته باشید.
- وارد ناحیهٔ کاربری هاست وردپرس شوید؛ از حسابی استفاده کنید که هاست را با آن تهیه کردهاید.
- در بخش سرویسها، هاست فعال خود را باز کنید و گزینهٔ ورود به cPanel را بزنید. اگر لینک ورود مستقیم ندارید، از آدرس و اطلاعات ورودِ پیام فعالسازی سرویس استفاده کنید.
- پس از ورود، صفحهٔ اصلی cPanel را میبینید. نام ابزار موردنیاز، مثل
File ManagerیاTerminalرا در کادر جستوجوی پنل بنویسید.
نام کاربری cPanel را از اطلاعات سرویس پیدا کنید. هر جا در فرمانها USERNAME دیدید، همین نام را جایگزین کنید؛ این مقدار، ایمیل یا نام نمایشی حساب شما نیست.
برای این آموزش از سه ابزار استفاده میکنیم: File Manager برای فایلها، Setup Python App برای محیط پایتون و Terminal برای فرمانها. در بخش Domains نیز دامنه و مسیر فایلهای عمومی آن را ببینید. اگر دامنه هنوز به هاست وصل نیست، DNS را طبق اطلاعات فعالسازی سرویس تنظیم کنید.
۲. ساخت پوشه و آپلود پروژه
- روی رایانه، فایلهای پروژه را ZIP کنید. فایل
manage.py، پوشهٔ پروژه و برنامههای آن باید داخل ZIP باشند. پوشهٔ محیط مجازی مثل.venv، فایلهای Git و اطلاعات محرمانه را داخل آن نگذارید. - در cPanel وارد File Manager شوید و از ستون کناری، Home را باز کنید. مسیر آن معمولاً
/home/USERNAMEاست. - با + Folder پوشهای به نام
myappبسازید و وارد آن شوید. این پوشه را کنارpublic_htmlبسازید، نه داخل آن. - Upload را بزنید، ZIP را انتخاب کنید و پس از تکمیل آپلود به File Manager برگردید.
- ZIP را انتخاب کنید و Extract را بزنید. پس از استخراج، باید
/home/USERNAME/myapp/manage.pyوجود داشته باشد.
اگر فایلها داخل یک پوشهٔ اضافی مثل myapp/project/manage.py افتادهاند، فایلها و پوشههای داخل project را با Move به myapp منتقل کنید. مسیرِ دارای manage.py، ریشهٔ پروژهٔ ماست.
فایل requirements.txt نیز باید همینجا باشد. این فایل فهرست پکیجهای پروژه است. اگر آن را ندارید، روی رایانه در محیط مجازیِ فعال پروژه، فرمان python -m pip freeze > requirements.txt را اجرا و فایل ساختهشده را آپلود کنید.
۳. ساخت محیط پایتون در Setup Python App
به صفحهٔ اصلی cPanel برگردید، Setup Python App را جستوجو و باز کنید و Create Application را بزنید. تنظیمات زیر را وارد کنید:
- Python version: نسخهٔ سازگار با پروژه؛ بهتر است با نسخهٔ محیط توسعهٔ شما یکسان باشد.
- Application root: مقدار
myapp؛ مسیر نسبت به Home است، پس/home/USERNAMEرا اینجا ننویسید. - Application URL: دامنهٔ متصل به هاست. برای این مثال، برنامه را روی ریشهٔ دامنه قرار میدهیم و مسیر بعد از دامنه را خالی میگذاریم.
- Application startup file: مقدار
passenger_wsgi.py. - Application Entry point: مقدار
application.
Create را بزنید. پنل یک محیط مجازی میسازد؛ محیط مجازی یعنی پکیجهای این پروژه جدا از پروژههای دیگر نصب میشوند. دستور ورود به این محیط را که بالای صفحهٔ برنامه نمایش داده میشود کپی کنید.
۴. باز کردن Terminal و نصب پکیجها
در صفحهٔ اصلی cPanel، Terminal را جستوجو و باز کنید. در اولین ورود، پیام را بخوانید و I understand and want to proceed را بزنید. فرمانها را یکییکی وارد کنید و بعد از هر فرمان Enter بزنید.
# Use the activation command shown in your cPanel account.
# Replace USERNAME, APP_ROOT and PYTHON_VERSION with your account values.
source /home/USERNAME/virtualenv/APP_ROOT/PYTHON_VERSION/bin/activate
cd /home/USERNAME/APP_ROOT
python -m pip install -r requirements.txt
خط اول را با دستور واقعی کپیشده از Setup Python App جایگزین کنید. در خط دوم، USERNAME نام کاربری شما و APP_ROOT برابر myapp است. خط آخر پکیجها را نصب میکند؛ تا پایان نصب صبر کنید و اگر خطا دیدید، پیش از ادامه همان خطا را رفع کنید.
برای اطمینان، python -m django --version را اجرا کنید. نمایش شمارهٔ نسخه یعنی Django در همین محیط نصب شده است. هر بار Terminal تازهای باز میکنید، ابتدا محیط مجازی را فعال کنید و وارد پوشهٔ پروژه شوید.
۵. آماده کردن دیتابیس
دیتابیس محل نگهداری اطلاعات سایت است. در File Manager فایل myproject/settings.py را انتخاب کنید و Edit را بزنید. بخش DATABASES مشخص میکند پروژه از چه دیتابیسی استفاده میکند.
اگر پروژه از SQLite استفاده میکند
برای شروع به ساخت دیتابیس در پنل نیاز ندارید. تنظیمات SQLite پروژه را نگه دارید و اگر سایت دادهٔ قبلی دارد، فایل db.sqlite3 آن را نیز در پوشهٔ پروژه آپلود کنید. قبل از تغییرات از فایل دیتابیس نسخهٔ پشتیبان داشته باشید؛ آن را داخل public_html نگذارید.
اگر پروژه از MySQL یا MariaDB استفاده میکند
- در cPanel ابزار Manage My Databases یا MySQL Databases را باز کنید.
- در بخش ساخت دیتابیس، یک نام وارد کنید و دیتابیس را بسازید. نام کامل نمایشدادهشده را یادداشت کنید؛ ممکن است با نام کاربری هاست شروع شود.
- یک کاربر دیتابیس با رمز قوی بسازید. در بخش Add User To Database، کاربر را به همان دیتابیس اضافه کنید و مجوزهای لازم برنامه را ذخیره کنید.
- نام کامل دیتابیس، نام کامل کاربر، رمز و میزبان دیتابیس را در تنظیمات پروژه قرار دهید. مقدار میزبان را از اطلاعات هاست بگیرید.
اگر برنامه مشخصات اتصال را از متغیر محیطی میخواند، همان نام متغیرهایی را که در کد پروژه آمدهاند در Setup Python App اضافه کنید. ساخت دیتابیس خالی، دادههای رایانه را منتقل نمیکند؛ برای انتقال دادهٔ قبلی، خروجی دیتابیس را وارد کنید. پکیج اتصال نیز باید در requirements.txt پروژه باشد.
۶. تنظیم دامنه و کلید محرمانه
در ویرایشگر File Manager، مقادیر زیر را در settings.py تنظیم کنید. خطوط موجود را اصلاح کنید؛ یک تنظیم را دو بار در فایل ننویسید.
import os
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
DEBUG = False
ALLOWED_HOSTS = ["example.com", "www.example.com"]
STATIC_URL = "static/"
STATIC_ROOT = BASE_DIR / "staticfiles"
BASE_DIR از قبل در تنظیمات معمول جنگو تعریف شده است. example.com و www.example.com را با دامنههای واقعیِ مورد استفاده جایگزین کنید. DEBUG = False مانع نمایش جزئیات داخلی خطا به بازدیدکننده میشود.
برای ساخت کلید محرمانه، در همان Terminal با محیط مجازی فعال، فرمان زیر را اجرا کنید و خروجی را فقط برای تنظیم برنامه بردارید:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
به صفحهٔ برنامه در Setup Python App برگردید. در Environment variables، Add Variable را بزنید؛ نام را DJANGO_SECRET_KEY و مقدار را خروجی فرمان قرار دهید. با Done و سپس Save تنظیمات را ذخیره کنید. رمزها و کلید را در Git یا پیام عمومی قرار ندهید.
این متغیر در اجرای وب برنامه استفاده میشود. برای فرمانهای manage.py در Terminal هم باید آن را در همان نشست تنظیم کنید؛ فرمان زیر کلید را با ورودی پنهان دریافت میکند:
read -rs -p "Django secret key: " DJANGO_SECRET_KEY
echo
export DJANGO_SECRET_KEY
کلید مرحلهٔ قبل را وارد کنید و Enter بزنید. اگر پروژه متغیرهای اتصال دیتابیس دارد، آنها نیز باید هنگام اجرای فرمانهای مدیریتی در دسترس باشند.
۷. تنظیم فایل شروع passenger_wsgi.py
در File Manager به /home/USERNAME/myapp بروید. اگر passenger_wsgi.py وجود دارد، آن را با Edit باز کنید؛ اگر نیست، با + File بسازید. محتوای آن را با کد زیر جایگزین و Save Changes را بزنید.
import os
import sys
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(BASE_DIR))
# Replace myproject with the package that contains settings.py.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
myproject را با نام پوشهٔ دارای settings.py جایگزین کنید. این فایل باید کنار manage.py باشد. Passenger برنامه را از همین فایل و متغیر application اجرا میکند؛ لازم نیست runserver را در ترمینال باز نگه دارید.
۸. ساخت جدولها و آماده کردن فایلهای static
به Terminal برگردید؛ محیط مجازی، پوشهٔ پروژه و متغیرهای مرحلهٔ قبل باید آماده باشند. اگر دیتابیس داده دارد، قبل از migration از آن بکاپ بگیرید. سپس فرمانها را بهترتیب اجرا کنید:
python manage.py check --deploy
python manage.py migrate
python manage.py collectstatic --noinput
check --deployتنظیمات انتشار را بررسی میکند؛ پیامهای آن را بخوانید.migrateجدولهای لازم و تغییرات ساختار دیتابیس را اعمال میکند.collectstaticفایلهای CSS، JavaScript و تصاویر قالب را در پوشهٔstaticfilesجمع میکند.
نمایش CSS و تصاویر در دامنه
در این نمونه، آدرس فایلها /static/ است. در cPanel وارد Domains شوید و Document Root دامنه را پیدا کنید؛ برای دامنهٔ اصلی معمولاً public_html است. از File Manager در همان مسیر یک پوشهٔ static بسازید.
فایلها و پوشههای داخلmyapp/staticfiles را انتخاب کنید و با Copy به پوشهٔ static دامنه منتقل کنید. برای مثال، فایل admin/css/base.css باید به شکل public_html/static/admin/css/base.css قرار بگیرد. کل پوشهٔ staticfiles یا کد پایتون را در پوشهٔ عمومی کپی نکنید.
اگر پروژهٔ شما از قبل روش دیگری برای سرو static دارد، همان روش را نگه دارید. فایلهای آپلودی کاربران یا media با static متفاوتاند و باید مسیر و بکاپ جداگانه داشته باشند.
۹. راهاندازی و مشاهدهٔ سایت
- در Setup Python App برنامه را باز و Restart را بزنید.
- دامنهٔ خود را با HTTPS در مرورگر باز کنید. باید صفحهٔ پروژه دیده شود.
- یک صفحهٔ دیگر، فرم ورود و CSS سایت را هم باز کنید تا اتصال دیتابیس و فایلهای ثابت مشخص شود.
- برای ساخت مدیر سایت، در محیط مجازی و پوشهٔ پروژه فرمان
python manage.py createsuperuserرا اجرا و به پرسشهای آن پاسخ دهید؛ سپس مسیر admin پروژه را باز کنید.
برای انتشار تغییرات بعدی، فایلهای تغییرکرده را آپلود کنید، در صورت نیاز پکیجها و migration را اجرا کنید، static را دوباره جمع و منتقل کنید و در پایان Restart بزنید.
| نشانه | کاری که انجام دهید |
|---|---|
| ModuleNotFoundError | محیط مجازی را فعال و requirements.txt را نصب کنید؛ نام بستهٔ پروژه در WSGI را هم ببینید. |
| KeyError: DJANGO_SECRET_KEY | کلید را هم در تنظیمات Python App برای وب و هم در نشست Terminal برای manage.py تنظیم کنید. |
| DisallowedHost | دامنهٔ بازشده در مرورگر را بدون https:// در ALLOWED_HOSTS قرار دهید. |
| CSS نمایش داده نمیشود | collectstatic را اجرا و مسیر فایل داخل پوشهٔ static دامنه را با URL آن مقایسه کنید. |
| خطای 500 | لاگ Passenger یا برنامه را بخوانید. متن خطا را بدون رمز و کلید برای پشتیبانی بفرستید. |
سوالات متداول اولین انتشار جنگو
فایلهای پایتون را در public_html آپلود کنم؟
در این آموزش خیر؛ پروژه در پوشهٔ myapp کنار public_html است. فقط فایلهای عمومی مثل خروجی static به مسیر عمومی دامنه منتقل میشوند.
بعد از بستن Terminal، سایت خاموش میشود؟
خیر؛ سایت با Passenger و ورودی WSGI اجرا میشود. اجرای manage.py runserver در ترمینال برای انتشار سایت استفاده نمیشود.
چرا برنامه در وب اجرا میشود ولی migrate خطا میدهد؟
محیط مجازی و متغیرهای تنظیمشده در پنل لزوماً در نشست تازهٔ Terminal آماده نیستند. ابتدا محیط را فعال کنید و متغیرهای موردنیاز را در همان نشست تنظیم کنید.
منابع و ادامهٔ آموزش
راهنمای انتخاب منابع هاست در انتخاب پلن کمک میکند. برای همراهی در راهاندازی نیز پشتیبانی تخصصی هاست وردپرس در دسترس شماست.