انتشار وب‌سایت بر روی Heroku (همانند انتشار بر روی PythonAnywhere)

همیشه برای یک توسعه دهنده خوب است که گزینه‌های انتشار مختلفی در آستین داشته باشد. چرا انتشار وب‌سایت بر روی Heroku را امتحان نکنیم، همانطور که روی PythonAnywhere منتشر کردیم؟

هروکو هم برای اپلیکیشن‌های کوچک که بازدیدکننده زیادی ندارند، رایگان است، اما انتشار وب‌سایت بر روی آن کمی ریزه‌کاری دارد.

ما از این آموزش استفاده خواهیم کرد: https://devcenter.heroku.com/articles/getting-started-with-django. اما آن را اینجا گذاشته‌ایم که استفاده از آن برای شما ساده‌تر باشد.

فایل requirements.txt

اگر قبلاً این فایل را نساخته‌اید الان باید یک فایل requirements.txt بسازید تا به هروکو بگویید که کدام پکیج‌های پایتون باید بر روی سرور نصب شود.

اما در ابتدا هروکو نیاز دارد که ما چند پکیج نصب کنیم. به کنسول خط فرمان بروید و درحالی virtualenv فعال است خط زیر را تایپ کنید:

(myvenv) $ pip install dj-database-url gunicorn whitenoise

وقتی که پکیج‌ها نصب شد به پوشه djangogirls بروید و دستور زیر را اجرا کنید:

(myvenv) $ pip freeze > requirements.txt

این دستور فایلی به نام requirements.txt می‌سازد که لیستی از پکیج‌های نصب شده (کتابخانه‌های پایتونی که شما استفاده می‌کنید، مثلاً جنگو :)) در آن قرار دارد.

نکته: دستور pip freeze لیستی از تمام پکیج‌های نصب شده در محیط مجازی شما را نشان می‌دهد و علامت >، این خروجی را به یک فایل انتقال می‌دهد. سعی کنید از دستور pip freeze بدون عبارت > requirements.txt، استفاده کنید و ببینید چه اتفاقی می‌افتد!

این فایل را باز کنید و خط زیر را به انتهای آن اضافه کنید:

psycopg2==2.7.2

برای آنکه اپلیکیشن شما در هروکو کار کند، این خط مورد نیاز است.

Procfile

چیز دیگری که هروکو لازم دارد یک Procfile است. این فایل به هروکو می‌گوید که کدام دستورها به ترتیب اجرا شوند تا وب‌سایت ما شروع به کار کند. ویرایشگر کد خود را باز کنید و فایلی با نام Procfile در پوشه djangogirls بسازید و خط زیر را به آن اضافه کنید:

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

این خط نشان می‌دهد که ما قصد داریم یک وب اپلیکیشن راه‌اندازی کنیم و این کار را با اجرای دستور gunicorn mysite.wsgi (gunicorn نرم‌افزاری است که شبیه به دستور runserver در جنگو عمل می کند اما بسیار قوی‌تر از آن است) انجام می‌دهیم.

حالا این فایل را ذخیره کنید، تمام!

فایل runtime.txt

ما نیاز داریم که به هروکو اعلام کنیم که از کدام نسخه پایتون می‌خواهیم استفاده کنیم. این کار به کمک فایلی به نام runtime.txt در پوشه djangogirls انجام می‌شود. به کمک ویرایشگر خود یک فایل جدید به این نام بسازید و فقط متن زیر (و نه چیز دیگری) را در آن وارد کنید:

python-3.6.4

mysite/local_settings.py

به خاطر اینکه هروکو محدودیت‌های بیشتری نسبت به PythonAnywhere دارد، نیاز است که از تنظیماتی متفاوت از کامپیوتر شخصی خود برای راه‌اندازی آن استفاده کنیم. هروکو نیاز دارد تا از Postgres استفاده کند درحالی که ما از SQLite استفاده کرده بودیم. به خاطر همین نیاز است تا ما از فایل تنظیمات متفاوتی نسبت به فایل مورد استفاده در محیط لوکال خود، استفاده کنیم.

حالا یک فایل به نام mysite/local_settings.py بسازید. این فایل باید شامل تنظیمات مربوط به DATABASE شما که در فایل mysite/settings.py قرار داده بودید باشد. چیزی شبیه به این:

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
DEBUG = True

حالا آن را ذخیره کنید! :)

mysite/settings.py

کار دیگری که باید انجام دهیم اصلاح فایل settings.py است. فایل mysite/settings.py را در ویرایشگر خود باز کنید و خط‌های زیر را اصلاح کنید:

import dj_database_url
...
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1', '.herokuapp.com']
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'djangogirls',
'USER': 'name',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '',
}
}
...
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)

این کار تنظیمات مورد نیاز برای هروکو را انجام می‌دهد!

حالا این فایل را ذخیره کنید.

mysite/wsgi.py

فایل mysite/wsgi.py را باز کنید و این خط‌ها را به آن اضافه کنید:

from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)

بسیار عالی!

اکانت هروکو

لازم است که جعبه ابزار هروکو را از آدرس https://toolbelt.heroku.com/ نصب کنید (اگر این کار را در مراحل راه‌اندازی انجام داده‌اید می‌توانید از این بخش رد شوید):

وقتی جعبه ابزار هروکو را بر روی ویندوز نصب می‌کنید مطمئن شوید که هنگامی که سو‌‌ٔال می‌کند چه کامپوننت‌هایی نصب شود، گزینه "Custom Installation" را انتخاب کنید. در لیست کامپوننت‌هایی که بعد از این نمایش داده می‌شود، گزینه "Git and SSH"را هم انتخاب کنید.

در ویندوز، شما باید دستور setx PATH "%PATH%;C:\Program Files\Git\bin" را نیز اجرا کنید تا Git و SSH به PATH خط فرمان شما اضافه شود. خط فرمان را ببندید و دوباره باز کنید تا تغییرات ایجاد شده، فعال شود.

بعد از باز کردن خط فرمان فراموش نکنید که دوباره به پوشه djangogirls بروید و محیط مجازی پروژه را فعال کنید! (راهنمایی: بخش نصب و راه اندازی جنگو را دوباره مرور کنید)

در ضمن یک اکانت رایگان هروکو نیز در آدرس https://id.heroku.com/signup/www-home-top بسازید.

حالا با اجرای این دستور بر روی کامپیوتر خود، وارد اکانت هروکو شوید:

$ heroku login

اگر کلید SSH نداشته باشید، این دستور به صورت اتوماتیک یکی خواهد ساخت. کلید SSH برای ارسال کدها به هروکو مورد نیاز است.

Git commit

هروکو از گیت برای انتشار استفاده می‌کند. بر خلاف PythonAnywhere، شما می‌توانید به صورت مستقیم و بدون استفاده از گیتهاب، کدها را به هروکو بفرستید. اما لازم است چند کار دیگر انجام دهیم.

فایل .gitignore که در پوشه djangogirls قرار دارد را باز کنید و عبارت local_settings.py را به آن اضافه کنید. نیاز داریم که گیت، فایل local_settings را در نظر نگیرد و آن را به هروکو ارسال نکند.

*.pyc
db.sqlite3
myvenv
__pycache__
local_settings.py

حالا تغییرات در گیت را کامیت می‌کنیم.

$ git status
$ git add -A .
$ git commit -m "additional files and changes for Heroku"

یک نام برای اپلیکیشن انتخاب کنید

ما وبلاگ شما را در آدرس [نام منتخب شما].herokuapp.com منتشر خواهیم کرد، بنابراین لازم است که نامی را انتخاب کنیم که فرد دیگری آن را انتخاب نکرده باشد. این نام، لازم نیست که به نام اپ blog در پروژه جنگو، یا نام mysite که از آن برای پروژه استفاده کرده‌ایم ربطی داشته باشد. این نام می‌تواند هرچیزی که شما دوست دارید باشد، اما هروکو نسبت به آنکه از چه کاراکترهایی استفاده کنید سختگیر است: شما اجازه دارید که فقط از حروف کوچک انگلیسی (حروف بزرگ و کاراکترهای خاص مانند حروف فارسی پذیرفته نیست)، اعداد و خط فاصله(-) استفاده کنید.

وقتی یک اسم پیدا کردید، این دستور را اجرا کنید و djangogirlsblog را با نام منتخب خودتان عوض کنید:

$ heroku create djangogirlsblog

نکته: به یاد داشته باشید که djangogirlsblog را با نام منتخب خود در هروکو جابجا کنید.

اگر نتوانستید اسمی انتخاب کنید، می‌توانید فقط دستور زیر را اجرا کنید:

$ heroku create

هروکو یک اسم استفاده نشده را برای اپلیکیشن شما انتخاب خواهد کرد (چیزی شبیه به enigmatic-cove-2527).

اگر هر زمان لازم داشتید که نام اپلیکیشن هروکو را تغییر دهید به کمک دستور زیر می‌توانید این کار را انجام دهید (عبارت the-new-name را با نام جدید جابجا کنید):

$ heroku apps:rename the-new-name

نکته: به یاد داشته باشید که بعد از تغییر نام اپلیکیشن، لازم است که برای دسترسی به وب‌سایت خود از آدرس [the-new-name].herokuapp.com استفاده کنید.

انتشار بر روی هروکو!

تنظیمات زیادی را تا الان انجام داده‌ایم، درست است؟ اما همه این کارها را فقط لازم است یک بار انجام دهیم. حالا می‌توانیم اپلیکیشن را منتشر کنیم!

وقتی شما دستور heroku create را اجرا می‌کنید، این دستور به صورت اتوماتیک، هروکو ریموت را برای اپ ما در مخزن گیت ما ایجاد می‌کند. حالا به سادگی با دستور گیت پوش، می‌توانیم اپلیکیشن خود را منتشر کنیم:

$ git push heroku master

نکته: این دستور احتمالاً چیزهای زیادی را در هنگام اولین اجرا نشان می‌دهد، چرا که هروکو در حال کامپایل و نصب psycopg است. اگر پس از پایان کار و در انتهای خطوط نوشته‌شده عبارتی شبیه به https://yourapplicationname.herokuapp.com/ deployed to Heroku ببینید یعنی کل عملیات موفقیت‌آمیز بوده است.

اپلیکیشن خود را بازدید کنید

شما کدهای خود را بر روی هروکو منتشر کردید و نوع فرآیند را در فایل Procfileمعرفی کرده‌اید (فرآیند ساخت web را کمی قبل‌تر انتخاب کرده بودیم). حالا می‌توانیم به هروکو بگوییم که این web process را آغاز کند:

برای این‌ کار دستور زیر را اجرا کنید:

$ heroku ps:scale web=1

این دستور به هروکو می‌گوید که فقط یک نسخه از فرآیند web ما را اجرا کند. از آنجاکه اپلیکیشن بلاگ ما بسیار ساده است، ما نیاز به منابع بیشتری نداریم پس همین یک نسخه از فرآیند کافی است. می‌توانید از هروکو بخواهید که نسخه‌های بیشتری از اپلیکیشن شما را اجرا کند (هروکو این نوع از فرآیندها را "Dynos" می‌نامد پس تعجب نکنید اگر این عبارت را دیدید) اما این بخش از خدمات هروکو رایگان نیست.

حالا می‌توانیم این اپ را در مرورگر خود با دستور heroku open باز کنیم.

$ heroku open

نکته: شما خطایی خواهید دید! تا دقایقی دیگر به آن خواهیم پرداخت.

این کار یک url شبیه به https://djangogirlsblog.herokuapp.com/ در مرورگر شما باز می‌کند. در اینجا ممکن است صفحه خطایی را ببینید.

خطایی که شما می‌بینید به خاطر آن است که وقتی ما کدها را بر روی هروکو منتشر کردیم یک دیتابیس جدید اما خالی ساخته‌ایم. لازم است که دستورهای migrate و createsuperuser را همانند کاری که در PythonAnywhere انجام دادیم، اجرا کنیم. اما این بار این دستورات را به روش متفاوتی در خط فرمان کامپیوتر خودمان و به کمک heroku run اجرا می‌کنیم:

$ heroku run python manage.py migrate
$ heroku run python manage.py createsuperuser

خط فرمان از شما خواهد خواست که یک نام کاربری و گذرواژه انتخاب کنید. این اطلاعات برای ورود شما به صفحه ادمین وب‌سایت منتشر شده استفاده خواهد شد.

مرورگر خود را دوباره بارگذاری کنید، نتیجه را خواهید دید! حالا شما دو روش مختلف برای میزبانی وب‌سایت خود بلد هستید. روش مورد علاقه خود را انتخاب کنید :)