• 0

كيف أقوم بعملية رفع مشروع Django على الاستضافة

لدي مشروع عبارة عن موقع الكتروني مبني بلغة python بايثون وإطار عمل دجانغو، أريد شرح خطوات رفعه على الاستضافة وتشغيله

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

يُمكن إستخدام منصة Heroku كما وضح شرف الدين سابقًا أو يمكن حتى إستخدام أي سيرفر إفتراضي VPS من البداية من خلال الخطوات التالية:

المتطلبات

في البداية نحتاج إلى إنشاء الخادم وضبطه في السحابة من خلال أحد خدمات شركات الإستضافة مثل DigitalOcean أو CloudNode، يمكنك أن تشتري أي خادم ويب للتجربة، وسيتم محاسبتك بالساعة (حسب وقت إستعمالك للخادم منذ وقت الشراء)، وقد تتبع شركات إستضافة خطط أخرى غير المحاسبة بالساعة.

ضبط بيئة Virtualenv جديدة

نحتاج الآن إلى إعداد بيئة وهميّة virtualenv حيث سيتم تخزين ملفات المشروع وحزم Python أيضًا. إذا كنت لا تستخدم virtualenv ، فقم ببساطة بإنشاء المجلد الذي سيتم تخزين ملفات مشروع Django فيه وانتقل إلى الخطوة التالية.

يمكنك تثبيت وإعداد Vitualenv من خلال الأوامر التالية:

sudo apt-get install python-virtualenv
virtualenv /opt/myproject

الآن بعد تثبيت وإعداد بيئة وهميّة Vitualenv للمشروع نحتاج إلى تفعيلها لكي نتمكن من تثبيت المكتبات والحزم المستخدمة في المشروع، يوجد ملف باسم activate في مجلد bin في البيئة الوهميّة التي تم إنشائها سابقًا:

source /opt/myproject/bin/activate

يمكن الإطلاع على المزيد حول البيئة الوهمية Vitualenv من خلال هذه المقالة:

كل المتبقي في هذه الخطوة هو تثبيت Django من خلال الأمر التالي:

pip install django

ملاحظة: يجب تنفيذ الأمر السابق بعد تفعيل البيئة الوهميّة مباشرة وليس في أي نافذة Terminal أخرى، لكي يتم تثبيت Django في البيئة الوهمية وليس بشكل عام على النظام.

إنشاء قاعدة بيانات المشروع

في الغالب يتم إستخدم PostgreSQL كخادم قاعدة بيانات. لإنشاء قاعدة بيانات باستخدام PostgreSQL، قم بتنفيذ الأمر التالي:

sudo su - postgres

الآن يمكن تنفيذ الأمر التالي لإنشاء قاعدة بيانات جديدة (يمكن إختيار أي اسم في هذه الخطوة):

createdb mydb

ولضمان حماية أكبر على قاعدة البيانات سوف نقوم بإنشاء مستخدم جديد وإعطائه صلاحيات التحكم في قاعدة البيانات التي قمنا بإنشائها:

createuser -P
psql
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;

في الأمر الأول سوف يتم السؤال عن اسم المستخدم الجديد وكلمة السر الخاصة به وبعض المعلومات الأخرى، ثم سيتم إعطائه الصلاحيات اللازمة من خلال جملة SQL الأخيرة.

إذا لم يكن المشروع يستخدم PostgreSQL كخادم قاعدة بيانات، فستحتاج إلى التحقق من الوثائق حول كيفية إنشاء قاعدة بيانات لخادم قاعدة البيانات الذي تختاره.

ضبط خادم Nginx

نحتاج إلى ضبط خادم Nginx لكي يتمكن من عرض موقعنا. وذلك عبر تشغيل الأمر التالي لإنشاء ملف configuration :

sudo nano /etc/nginx/sites-available/myproject

الأمر السابق سوف يقوم بإنشاء ملف جديد والبدء في تحريره عبر برنامج nano.

الآن يجب كتابة التالي لكي يتمكن خادم Nginx من التعرف على مكان المشروع وكيفية تشغيله:

server {
    server_name yourdomainorip.com;

    access_log off;

    location /static/ {
        alias /opt/myenv/static/;
    }

    location / {
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
}

يمكن الآن حفظ الملف عبر الضغط على Ctrl + O ثم إغلاق الملف عبر الضغط على Ctrl + X

لكي يتعرف Nginx على الملف السابق الذي قمنا بإنشائه يجب تنفيذ الأوامر التالية:

cd /etc/nginx/sites-enabled
sudo ln -s ../sites-available/myproject
sudo service nginx restart

إن ظهر خطأ كالتالي:

server_names_hash, you should increase server_names_hash_bucket_size: 32

لحل المشكلة يجب تعديل الملف /etc/nginx/nginx.conf وإلغاء التعليق عن السطر التالي:

server_names_hash_bucket_size 64;

حتى الآن تم إعداد الخادم بشكل سليم ويتبقى أن نرفع ملفات مشروع Django نفسه إلى الخادم، ويمكن إستخدام أي بروتوكول لنقل أو إدارة الإصدارات مثل FTP, SFTP, SCP, Git, SVN، ويفضل إستخدام Git نظرًا لأنه الأسرع والأسهل في التثبيت والإعداد والأسرع في نقل الملفات أيضًا، لذلك يجب رفع المشروع على مستودع في أحد المواقع مثل GitHub أو GitLab .. إلخ، والحصول على رابط المستودع حيث سنقوم بإستخدامه في الخطوة التالي:

إذا لم يكن لديك Git مثبت مسبقًا، فيمكن تثبيته عبر الأمر التالي:

sudo apt-get install git

نحتاج الآن إلى إنشاء مجلد للمشروع في البيئة الوهمية التي قمنا بإنشائها في الخطوات الأولى وتحميل نسخة من ملفات المشروع إليه:

cd /opt/myproject
mkdir myproject
cd myproject
git clone https://github.com/path/to/repo .

ملاحظة: يحتوي الأمر الأخير على نقطة . وهي تشير إلى المجلد الحالي الذي سيتم تنزيل الملفات إليه.

تثبيت وإعداد خادم التطبيقات App Server

نحتاج الآن إلى إستخدام اداة مثل gunicorn لكي تعمل كخادم HTTP وتدير الزيارات إلى المشروع، لذلك سجب تثبيتها وجعل هذا الخادم يستمع إلى الزيارات من المنفذ 8001 الذي قمنا بإعداده في خطوة إعداد Nginx السابقة:

source /opt/myproject/bin/activate
pip install gunicorn
gunicorn_django --bind yourdomainorip.com:8001

يمكنك الآن الضغط على Ctrl + z ثم كتابة "bg" لكي يعمل المشروع في الخلفية.

ضبط إعدادات المشروع

الخطوة الأخيرة هي إعداد المشروع نفسه وتغير بعض الإعدادات الخاصة به لكي يتعمل بشكل سليم وبدون مشاكل. في البداية سوف نقوم بتعديل ملف settings.py من خلال الأمر التالي:

sudo nano /opt/myproject/myproject/settings.py

ويجب تعديل وضع التطوير Development Mode عبر تغير قيمة المتغير DEBUG إلى False:

DEBUG = False

أيضًا يجب إعداد قاعدة البيانات من خلال تعديل DATABASES:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.psycopg2',
        'NAME': 'mydb',                      # database name.

        # The following settings are not used with sqlite3:
        'USER': 'myuser',
        'PASSWORD': 'password',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

كما يجب تعديل مسارات الملفات الثابتة Static Files من خلال تعديل المتغير STATIC_ROOT و STATIC_URL، كالتالي:

STATIC_ROOT = '/opt/myproject/static/'
STATIC_URL = '/static/'

الآن يمكن حفظ المشروع والتوجه إلى المجلد الذي يحتوي الملف manage.py ثم تنفيذ الأمر التالي:

python manage.py collectstatic

سيجمع هذا الأمر جميع الملفات الثابتة Static Files في المجلد الذي قمنا بتعيينه في ملف settings.py أعلاه.

هذا كل شيء، يمكن الآن زيارة الموقع عبر IP الخادم VPS أو ربطه بنطاق/مجال Domain معين. وفي هذه الحالة ستحتاج إلى شراء نطاق Domain لكي تتمكن من تشغيل مشروعك عبر الإنترنت، حيث أن شركات الإستضافة تمنحك الخادم فقط في أغلب الأحيان، لذلك يجب أن تقوم بشراء نطاق لموقعك بنفسك من خلال أحد شركات الإستضافة مثل namechape أو GoDaddy ..إلخ ، لذلك يجب أن يكون لديك مجال يشير إلى خادم الويب الذي تم إنشاؤه حديثًا.

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0
  1. من الممكن القيام بمثل ذلك عبر منصة heroku , نبدأ أولاً بتثبيت heroku command line عبر الأمر التالي لمستخدمين ليونكس 
  2. sudo snap install --classic heroku
  3. وعبر الرابط التالي لمستخدمي ويندوز  
    https://cli-assets.heroku.com/heroku-x86.exe

     

  4. بعد ذلك نقوم بتسجيل الدخول الى حساب heroku الخاص بك عبر نافذة الأوامر بالشكل التالي 

    heroku login
    Enter your Heroku credentials:
    Email: your_email.com
    Password: *********
    

     

  5. قم بإنشاء ملف runtime.txt في مجلد المشروع وقم بتحديد اصدار البايثون فيه, على سبيل المثال

    python-2.7.12

     

  6. نقوم بانشاء ملف الprocfile في مجلد المشروع لتحديد الأوامر المراد تنفيذها عند بدأ تشغيل المشروع على  heroku 

     touch Procfile

     ومن ثم نقوم بإضافة الأمر التالى في الملف والذي يحدد خادم الويب الذي سيُستخدم في تشغيل المشروع

    web: gunicorn djangoherokuapp.wsgi --log-file -

     

  7. ومن ثم نقوم بتعديل ملف الsettings.py ووضع الdependencies التالية بالشكل التالي

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'herokuapp',
    ]

     

  8.  ومن ثم نقوم بتثبيت تلك الإعتماديات من أجل عمل المشروع بشكل صحيح على المنصة

    pip install gunicorn dj-database-url whitenoise psycopg2

     

  9. ولنجعل heroku يعلم أن المشروع المُراد تثبيته هو مشروع python نقوم بإنشاء ملف requirements.txt 

    pip freeze > requirements.txt

     

  10. ونقوم بتحديد الdependencies وإصداراتها في الملف 

    dj-database-url==0.4.2
    Django==1.11.7
    gunicorn==19.7.1
    psycopg2==2.7.3.2
    pytz==2017.3
    whitenoise==3.3.1

     

  11. إن كان المشروع يحتوي على ملفات ثابتة(static files) مثل الhtml, css, javascript, images فإن للأسف heroku ﻻ يقوم بدعم التعامل مع تلك الملفات بشكل إفتراضي لذا سنقوم بإستخدام الwhitenoise الذي قمنا بتثبيته مسبقاً وكتابة الأوامر التالية في ملف الsettings.py

    PROJECT_ROOT   =   os.path.join(os.path.abspath(__file__))
    STATIC_ROOT  =   os.path.join(PROJECT_ROOT, 'staticfiles')
    STATIC_URL = '/static/'
    
    STATICFILES_DIRS = (
        os.path.join(PROJECT_ROOT, 'static'),
    )
    
    STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

     

  12. ومن ثم نقوم بإضافة الخدمات الوسيطة(middle ware ) في ملف الsettings.py 

    MIDDLEWARE = [
        'whitenoise.middleware.WhiteNoiseMiddleware',
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]

     

  13. نقوم بعد ذلك بإنشاء المشروع على heroku عبر الأمر التالي

    heroku create herokudjangoapp

     

  14. نقوم بعد ذلك بتهيئة مستودع git عبر الأمر التالي

    git init

     

  15. ومن ثم نحتاج لربط ذلك المشروع بالمشروع الذي لدينا على الحاسب 
    heroku git:remote -a herokudjangoapp

     

  16. ومن ثم نقوم بتنفيذ الأوامر التالية من أجل رفع المشروع على heroku 

    git add .
    git commit -m "first commit"
    git push heroku master

    سيستغرق ذلك بعضاً من الوقت ومن ثم ستجد المشروع قد تم رفعه بنجاح

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن