1402/02/23 7 دقیقه 1393 کلمه

چگونه پروژه لاراول را روی سرور دیپلوی کنیم ؟

لاراول DevOPS

ابتدا باید به این اشاره کرد که دیپلوی و نگهداری از پروژه لاراولی روی سرور کار ساده‌ای نیست و به دانش کافی در این زمینه نیاز است. البته در این نوشته منظور از سرور، سرور مجازی (Virtual Private Server) یا سرور اختصاصی (Dedicated Server) هست و در این آموزش سراغ هاست اشتراکی نرفتیم. دلیل اصلی این موضوع دسترسی‌های محدود هاست‌های اشتراکی است. یکی از این محدودیت‌ها عدم دسترسی SSH می‌باشد.

 how-to-deploy-laravel-on-server

این نوشته به 4 مرحله زیر تقسیم شده است:

  • بارگیری کدهای توسعه یافته جدید
  • اعمال تغییرات روی وابستگی‌ها
  • اعمال تغییرات روی پایگاه داده
  • پاکسازی و بهینه سازی لاراول

بنابراین، به زبان ساده آخرین تغییرات کد را روی گیت‌هاب، گیت‌لب یا گیت سرور شخصی Push یا Merge می‌کنیم و به صورت دستی یا اسکریپت Automation عملیات 4گانه را روی پروژه انجام می‌دهیم تا فایل نهایی در سرور قرار گیرد. در ادامه با این 4 مرحله آشنا خواهیم شد.


فهرست مطالب ارائه شده:

مرحله صفرم: سرور در حالت Down قرار گیرد

معمولا مراحل دیپلوی کردن 5 الی 10 ثانیه و یا بیشتر زمان نیاز خواهد داشت. در این بازه زمانی اگر کاربری از سایت استفاده کند و در حال ثبت فاکتور، ورود به سایت یا عملیاتی انجام دهد که موجب تغییر در پایگاه داده شود، تکلیف چه خواهد بود ؟ در برخی مواقع باعث تداخل بین داده/کدهای قدیمی با داده/کدهای جدید خواهد شد.

برای جلوگیری از این اتفاق 2 روش وجود دارد :

  1. با دستور php artisan down سرور را در حالت غیرقابل دسترس (Inaccessible) قرار دهیم.
  2. پروژه را با یکی از ابزارهای بدون قطعی یا zero-downtime دیپلوی کنیم.

برای پروژه‌های تازه شروع شده پیشنهاد می‌شود از روش اول یعنی دستور artisan down استفاده شود. زمانی که این دستور اجرا می‌شود کاربران سایت با پیغام SERVICE UNAVAILABLE و کد خطای 503 مواجه خواهند شد. در نهایت برای خروج از این وضعیت و دردسترس قرار دادن سایت کافی است دستور php artisan up را اجرا کنیم.

برای اینکه صفحه پیشفرض حالت دردست ساخت (maintenance mode) لاراول را شخصی سازی کنیم کافی است یک فایل در مسیر resources/views/errors/503.blade.php ایجاد کنیم. اگر فایل مورد نظر در مسیر پروژه باشد صفحه پیشفرض خطای 503 لاراول با صفحه طراحی شده جایگزین خواهد شد. برای اینکه کاربران در مدت دیپلوی از سایت خارج نشوند هرچه صفحه موردنظر جلب توجه کند بسیار برای SEO مفید خواهد بود.

حال که هیچ کسی دسترسی به پروژه ندارد و ریسک تداخل یا از بین رفتن داده صفر شده است. پروسه اجرای دیپلوی شروع می‌شود.


مرحله اول: تغییرات کد روی سرور Pull شود

فقط کافیست با دستور git pull آخرین تغییرات روی پروژه را از برنچ موردنظر داخل سرور بارگیری کنیم.

git pull origin main

اگر روی سرور تست یا stage هستیم از دستور زیر استفاده می‌کنیم. به عبارت دیگر برنچ دیپلوی اصلی را با برنچ تست مجزا می‌کنیم تا توسعه راحت‌تر انجام شود.

git pull origin develop

همچنین در این نقطه از پروژه نیاز هست حتما ریپازیتوری گیت پروژه خود را به همراه تمام تنظیمات و دسترسی‌های لازم روی سرور انجام داده باشیم. البته مراحل اولیه راه اندازی گیت و تنظیمات آن خارج از مباحث این نوشته است.


مرحله دوم: وابستگی‌های پروژه

اگر پکیج جدیدی روی پروژه نصب کنیم یا پکیج‌های موجود را آپدیت کنیم باید از دستور composer استفاده کنیم.

معمولا برای مدیریت وابستگی‌ها در لاراول مراحل زیر در هربار دیپلوی باید انجام شود:

  1. به صورت لوکال با دستور composer require [PACKAGE_NAME] پکیج‌ها را نصب می‌کنیم یا با دستور composer update اقدام به آپدیت پکیج‌های موجود می‌کنیم.
  2. این دو دستور باعث آپدیت فایل composer.lock می‌شود که هنگام push کردن، روی ریپازیتوری گیت قرار می‌گیرد.
  3. هنگام دیپلوی، با زدن دستور composer install تغییرات فایل composer.lock در سرور اعمال می‌شود.

قانون مهم این است که هیچوقت از دستور composer update روی سرور استفاده نکنید و دستور composer install را اجرا کنید. درغیراینصورت زمان دیپلوی طولانی‌تر خواهد شد (سرعت composer update کمتر است) و همچنین موجب ایجاد تداخل بین سرور و محیط توسعه لوکال خواهد شد (فایل composer.lock هردوطرف تغییر می‌کند).

چند مورد از flag های مناسب برای افزودن به دستور composer install:

composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader

در توضیح دستور بالا به موارد زیر می‌توان اشاره کرد :

  • no-dev-- صرفا پکیج‌هایی نصب خواهد شد که در بخش require فایل composer.json قرار دارند.
  • no-interaction-- بدون اینکه هیچ تعاملی با کاربر داشته باشد و بدون پرسیدن تایید انجام عملیات، اقدام به نصب می‌کند.
  • prefer-dist-- به صورت پیشفرض فعال است و اقدام به نصب پکیج از ریپازیتوری مرکزی composer می‌کند.
  • optimize-autoloader-- با ایجاد classmap پکیج‌ها باعث افزایش کارایی پروژه می‌شود.

مرحله سوم: تغییرات پایگاه داده

برای توسعه پایگاه داده، اگر نیاز به افزودن Migration جدید باشد چه کار باید کرد ؟ در اسکریپت های دیپلوی دستور زیر باید اجرا شود :

php artisan migrate --force

در دستور بالا ویژگی force-- باعث می‌شود دستور بدون پرسیدن هیچ سوالی حتما اجرا شود.

اگر seeder جدید داشته باشیم چه کار باید بکنیم؟ یک مسئله همیشگی در مورد برخورد با این موارد وجود دارد.

بسیاری از برنامه نویسان زمان شروع پروژه یکبار دستور php artisan db:seed را اجرا کرده و دیگر در ادامه آن را فراموش می‌کنند. در نهایت اگر نیاز به داده پیشفرضی داخل پایگاه داده باشد آن را داخل Migration موردنظر قرار می‌دهند تا داده ایجاد شود.

اما اگر شما به صورت دستی دیپلوی را انجام می‌دهید با استفاده از دستور زیر داده جدید در جدول roles وارد می‌شود:

php artisan db:seed --class=RoleSeeder

مرحله چهارم: تغییرات محیط برنامه و بهینه سازی پروژه

این مرحله دلخواه دیپلوی هست و می‌توانید آن را نادیده بگیرید. اما صبر کنید برای استقرار بهینه پروژه لاراولی خود روی سرور مجموعه دستوراتی در دسترس هستند.

چند نمونه از دستورات مهم این بخش در زیر آورده شده است:

php artisan cache:clear
php artisan route:clear
php artisan view:clear
echo "" | sudo -S service php8.1-fpm reload

با دستورات بالا، cache پروژه پاک می‌شود و از اجرای کدهای قدیمی جلوگیری می‌شود. همچنین برای اینکه دستورات Queue و Job به درستی اجرا شوند نیاز هست یکبار ریستارت شوند.


مرحله آخر: پروژه Up شود

در ابتدای دیپلوی هم اشاره شد که حتما بعد از اجرای مراحل، پروژه به حالت عادی خود برگردد. اگر از دستور php artisan down استفاده کردیم، با اجرای دستور php artisan up پروژه دردسترس قرار خواهد گرفت.


دریک نگاه

لیست دستورات این نوشته به صورت یکجا در زیر آورده شده است. به دقت به آن‌ها نگاه کنید و با توجه به نیاز خود اقدام به شخصی سازی کنید:

cd /home/some-subfolders/your-app-folder
php artisan down
git pull origin main
composer install --no-interaction --no-dev
php artisan migrate --force
php artisan cache:clear
php artisan route:clear
php artisan view:clear
echo "" | sudo -S service php8.1-fpm reload
php artisan up

صبرکنید، دیپلوی بدون قطعی Zero-Downtime چیست ؟

ابزارها و سرویس‌های زیادی برای این منظور هم خارج از کشور و هم داخل ایران وجود دارد که به چند نمونه در زیر اشاره شده است :

  • Envoyer
  • Ploi
  • Deployer
  • Fandogh
  • Liara

در بخش روش‌های جلوگیری از بروز خطا هنگام دیپلوی به روش اول یعنی php artisan down اشاره شد اما در روش دوم که موسوم به Zero-Downtime بود نیاز هست از سرویس‌های موجود به صورت رایگان یا پولی استفاده کنیم.

Zero-Downtime چگونه کار می‌کند ؟

به طور کلی در این روش هربار که عمل Deploy انجام می‌شود یک نسخه کاملا مجزای پروژه در پوشه‌ای به صورت مخفی قرار می‌گیرد که دستورات روی آن اجرا می‌شود و آخرین تغییرات را شامل می‌شود. در همین حین پروژه قدیمی در مسیر اصلی به کار خود ادامه می‌دهد. پس از اتمام دستورات به صورت آنی یک لینک (symlink) بین پوشه جدید ایجاد شده با مسیری که Domain روی آن ست شده است ایجاد می‌شود. پس از استقرار پروژه جدید، پروژه قدیمی به پوشه‌ای جهت نگه داشتن آرشیو Deploy منتقل می‌شود.


نتیجه گیری

به صورت کلی در پروسه اجرای دیپلوی دستورات گفته شده چه به صورت دستی چه با اسکریپت‌های Automated اجرا می‌شوند. هر یک از مراحل حسب نیاز شما می‌توانند شخصی سازی شوند. می‌توانید از مراحل حذف کنید یا مراحل جدید به آن اضافه کنید.

در این نوشته به صورت کلی مراحل دیپلوی و نگهداری پروژه لاراولی روی سرور ارائه شد. امیدوارم مفید واقع شود.

همچنین در آینده درسنامه‌ای در خصوص دیپلوی به صورت مفصل با مثال‌های واقعی ارائه خواهد شد. با مترووب بروز بمانید...


علی مهدوی

علی مهدوی برنامه نویس ارشد وب