Sedhossein
Sedhossein
خواندن ۵ دقیقه·۴ سال پیش

چگونگی استقرار لاراول / Laravel در هاست اشتراکی / shared host


سلام. تو این نوشته قصد دارم برای کسی که دنبال جواب سریع هستش اول از همه مراحل حل مشکل رو بگم و اگر علاقه مند بودی در بعدش به یک سری نکات و خوبی(!) و بدی های این کار بپردازیم.


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

از اونجایی که میدونیم قسمت مهمی از این محبوبیت‌ها ساپورت کردن PHP هستش پس اگر اپلیکیشن لاراولی داریم و قصد داریم که تو هاست اشتراکی بالا بیاریمش، این نوشته شاید کمکتون کنه. اگرچه خود من به دلایل زیادی اینکار رو برای محصولات پرکاربرد و جدی توصیه نمیکنم و دراین نوشته نمیخوام زیاد بهش بپردازم و فقط یک سری مشکلاتی که از نظر خودم اذیت کننده هستن رو نام میبرم. اما اگر دوست داشتی در مورد مشکلات اینکار بیشتر بدونی بلاگ های زیادی از جمله این لینک به مواردیش اشاره کرده.

قبل از شروع به گفتن مراحل کار این نکته رو گوشه ذهنتون داشته باشید که:

هرجایی که مینویسم public_html منظورم دایرکتوری هست که اصطلاحا serve شده و درخواست‌ها به اون آدرس روت میشه. که این اسم در ادمین پنل های مختلف(Cpanel, DrirectAdmin, Plesk) متفاوت میتونه باشه. و همچنین اینکه اگر ssl داشته باشید شاید استراتژی های متفاوتی برای مدیریت درخواست های با ssl و بدون اون داشته باشید که معمولا در DirectAdmin یه دایرکتوری به اسم private_html میسازن که یا محتوای متفاوت از public_html داره یا یک symlink به آن خواهد بود. در با صرف نظر کردن این نکات همه جا از public_html استفاده میکنم ولی شما حواستون باشه.

مراحل:

  • ساختار پروژه رو به شکل زیر درست کنید. دایرکتوری public رو یک لایه بیرون تر از بقیه دایرکتوری ها بزارید:
├ application/ ├── core/ │   ├── app/ │   ├── bootstrap/ │   ├── config/ │   ├── database/ │   ├── resources/ │   ├── routes/ │   ├── storage/ │   └──tests/ └── public/


  • پروژه رو zip کنید و بفرستید روی هاست و روی هاست unzip کنید(با هر روشی که راحتید. FTP, AdminPanel ....).
  • دامپ دیتابیس(ساخت دیتابیس و مایگریشن) رو آماده کنید و روی دیتابیس هاست هم import کنید.
  • حتما حتما حتما دایرکتوری core پروژه رو بیرون public_html (ترجیحا کنارش) بزارید.
  • فایل ENV. رو با مقادیر پروداکشن به‌روز کنید و حتما خارج public_html بزاریدش(نکته‌ی قبل شروع مراحل فراموش نشه!). همچنین برای لود کردن محتوای ENV. از یک مسیر جدید(بیرون core تو ساختاری که بالا گفتیم) میتونید از فانکشن app->useEnvironmentPath("/path")$ استفاده کنید.
  • محتواهای دایرکتوری public پروژه که آپلود کردید رو ببر توی مسیر serve هاست یا همون public_html.
  • رو فایل public_html/index.php آدرس لود کردن فایل های رو درست کنید(ممکن هست تو روژن های متفاوت لاراول تفاوت های ریزی باشه. شما باید تمامی مسیرها رو در ضورت تغییر در ساختارتون به‌روز کنید) و همچنین تکه کدی که مسیر public پروژه رو مشخص کرده هم باید اضافه کنید(تست شده با لاراول ۸).
if (file_exists(__DIR__.'/../core/storage/framework/maintenance.php')) { require __DIR__.'/../core/storage/framework/maintenance.php'; } require __DIR__ . '/../core/vendor/autoload.php'; $app = require_once __DIR__ . '/../core/bootstrap/app.php'; // #### NEW PART #### // set the public path to this directory $app->bind('path.public', function() { return __DIR__; });


  • اگر به هر نحوی دسترسی shell ویا اجرای job هارو دارید تغییرات اصلاح آدرس پروژه رو مثل بالا برای فایل‌های core/server.php و core/artisan نیز انجام بدید
  • اگر مثل من شما هم در پروژه نیاز به آپلود فایل داشتید و دسترسی ساختن symlink نداشتید از کلک من میتونید استفاده کنید! داخل فایل core/config/filesystems.php تکه کد زیر رو اضافه کنید:
'disks' => [ // .... 'public_uploads' => [ 'driver' => 'local', 'root' => public_path('storage'), 'visibility' => 'public', 'url' => public_path('storage'), ], ],

و بعدش هرجایی که میخواستید فایلی رو آپلود کنید میتونید اینطوری هندل کنید:

Storage::disk('public_uploads')->put($filePath, $image);


  • حتما حتما تو کانفیگ وب سرورتون حواستون باشه دسترسی به دایرکتوری های مهمتون و فایل های ENV. رو گرفته باشید تا پسورد و اطلاعاتتون لو نره.


مشکلات:

  • نسخه بندی(ورژن) و استقرار(دیپلوی)
    یکی از مهمترین نکته‌های هر محصول نرم‌افزاری(مخصوصا در محیط وب) استقرار، نگهداری و نسخه سازی(versioning) آن است. در هاست اشتراکی فرایندهای اتوماتیک و تمیز برای استقرار نسخه‌های جدید نرم‌افزار وجود نداره و خیلی از قسمت‌های این فرایندها رو باید دستی انجام داد. شما میتونید یا از محیط‌های گرافیکی سرویس دهنده ها(Plesk, Cpanel, DirectAdmin) فایل هاتون رو آپلود/آپدیت کنید. یا با FTP از ابزارهایی مثل FileZilla استفاده کنید و تغییرات رو اعمال کنید. همچنین برای import/export از دیتابیس هم از phpmyadmin که مهمولا همه هاست اشتراکی‌ها نصب دارند میتونید استفاده کنید.
  • ساختار پروژه
    از اونجایی که ساختار پیشفرض لاراول برای کارکردن تو هاست اشتراکی آماده نیست باید تغییراتی رو هم داخل کد و ساختارش درست ایجاد کنیم.
  • محدودیت‌های هاست اشتراکی! محدودیت استفاده از امکانات لاراول!
    به علت محدودیت‌های سطح دسترسی تو هاست اشتراکی از برای داشتن قابلیت‌های زیر قراره که اذیت بشیم:
    - توسعه و استقرار مستمر
    - استفاده از ابزارهای caching مثل redis, memcached
    - استفاده از migrationها
    - فقدان extensionهای خاص و محدودیت نصب آن درصورت نیازمندی یک پیکیج
    - نبود artisan console و tinker
    - نبود supervisor درنتیجه نداشتن job/queue
    - و ....
  • امنیت
    مراقبت باشید که وقتی دارید اپلیکیشن رو آماده پروداکشن می‌کنید فایل‌هایی که نمیخوایید و نباید معلوم باشن معلوم نباشن! یعنی چی؟ یعنی اگر عکس، فایل ENV. ، یا ... دارید که نباید دیده بشه، هم توی وب حواستون به کانفیگ های وب‌سرور تون باشه که نزارید این فایل ها اصطلاحا serve بشه، هم داخل فایل `public_html/*` فایل‌های مهم رو نزارید! چون معمولا این مورد فراموش میشه.



سخن پایانی

در آخر هم امیدوارم شما هم مثل من اگر و اگر مجبور بودید فقط این کارهارو کنید و به کارتون بیاد این نوشته :)))) اگر پیشنهاد و انتقادی و تجربه‌ایی داشتی که فکر میکنی به بهتر شدن این متن کمک میکنه حتما نظر بده.


خوش باشی

laravelphpلاراولهاست اشتراکی
Software Engineer @Snapp!
شاید از این پست‌ها خوشتان بیاید