نصب و انتقال پروژه لاراول بر روی سرور مجازی Vps

انتقال پروژه لاراول روی سرور مجازی vps

نصب و راه اندازی لاراول بر روی سرور Vps

فریمورک قدرتمند لاراول مسیر توسعه نرم افزار های تحت وب را هر روز راحت تر کرده ، اما انتقال و اجرای برنامه های لاراولی بر روی سرور مجازی یا VPS داستان های خاص خود را دارد. برای این کار راه نسبتا طولانی در پیش دارید.

اما بر خلاف آن اجرای وبسایت های طراحی شده با فریم ورک لاراول بر روی هاست های اشتراکی نظیر Cpanel و DirectAdmin بسیار ساده و در حد آپلود کردن فایل زیپ پروژه است.

 

سختی کار در اجرای لاراول بر روی Vps در واقع این است که تمامی ملزومات پروژه باید بصورت دستی توسط شما نصب و تنظیم گردند و این اصلی ترین عامل پیچیدگی این کار است. در این آموزش تلاش خود را خواهم کرد تا بصورت گام به گام یک پروژه لاراولی را بر روی وی پی اس پیاده سازی کنیم . اگر علاقه مندید که بیشتر درباره نقاط قوت فریمورک لاراول بدانید می توانید به این لینک مراجعه کنید 

بارگزاری لاراول روی vps

پیشنیازهای لازم

در این مقاله فرض بر این قرارداده شده که شما عزیزان با لینوکس و کامند های آن آشنایی دارید . بدلیل اینکه سرور ما در این آموزش لینوکس اوبونتو می باشد میخواهیم تمامی کارهای لازم را با استفاده از فرمان در ترمینال سرور انجام دهیم. همچنین توقع این است که با مفاهیمی از قبیل Sudo , file permissions و تفاوت بین کاربر روت و غیر روت و همچنین گیت آشنایی داشته باشید .

انتقال پروژه لاراول از گیت به vps

پروژه لاراول

پروژه ای که برای این کار در نظر گرفتیم در این قسمت قرار داده شده که می توانید آن را از گیت هاب دریافت کرده و بر روی سیستم خود اجرا کنید .

پروژه لاراول برای انتقال بر روی سرور مجازی لینوکسی

حال نوبت می رسد به تهیه و آماده سازی سرور Vps با سیستم عامل لینوکس Ubuntu. در مرحله اول برای انجام این پروژه نیاز به تولید کلید امنیتی SSH دارید.

تولید SSH Keys

با توجه به آنچه در وبسایت Wikipedia در خصوص SSH یا Secure Shell توضیح داده شده است ، می دانیم که اس اس اچ یک پروتکل شبکه ایمن برای انجام یکسری امور در شبکه های غیر ایمن است که به شما امکان اتصال به ریموت یک سرور را با استفاده از رمز یا کلید می دهد. اگر از قبل کلید SSH توسط میزبان سرور به شما داده شده است که از این مرحله صرف نظر کنید اما اگر نیاز به ساخت کلید مربوطه دارید از کامند زیر در ترمینال لینوکس استفاده کنید.

 

				
					ssh-keygen -t rsa
				
			

در صورتی که کلید با موفقیت ساخته شود می توانید فایلی با نام  id_rsa.pub در مسیر  ~/.ssh/ directory پیدا کنید .

در مرحله بعدی با یوزر روت که دسترسی کامل را به شما می دهد وارد شوید. برای اینکار میتوانید از دستور زیر استفاده کنید. برای یافتن Ip مربوط به سرور خود می توانید از طریق پنل میزبانی هاست خود این اطلاعات را بیابید .

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

				
					ssh root@ "your server ip"
				
			

برای ساخت یک یوزر غیر روت با هر نام دلخواهی می توانید از کامند زیر استفاده کنید :

				
					adduser nonroot

				
			

منظور از nonroot در این قسمت همان یوزر غیر روت است که شما می توانید هر نام دیگری به جای آن استفاده کنید . در این قسمت از شما درخواست می گردد تا رمز عبور قوی برای این کاربر تعریف کنید . پس از ساخت کاربر مورد نظر شما باید آن را به Sudo group اضافه کنید . در غیر این صورت کاربر شما نمی تواند از دستورات Sudo استفاده کند. دستور مربوطه در ادامه قرار داده شده است.

				
					usermod -aG sudo nonroot

				
			

حال اگر برای ورود با کاربر جدید اقدام کنید با پیغام Permission denied مواجه خواهید شد. این اتفاق زمانی رخ می دهد که در برخی سرور های Vps برای ورود از کلید SSH ساخته شده به جای رمز استفاده می کنید.

permission denied for nonroot user in ubuntu

یک راه حل ساده این است که محتوای درون مسیر /root/.ssh را در مسیر  /home/nonroot/.ssh  قرار دهید . می توانید از سینک سازی مجدد با دستور زیر استفاده کنید .

				
					rsync --archive --chown=nonroot:nonroot /root/.ssh /home/nonroot

				
			

حال می توانید با استفاده از نام کاربری ایجاد شده در سیستم لاگین کنید. پس از ورود یکبار سیستم را با استفاده از کامند زیر آپدیت کنید:

				
					sudo apt update && sudo apt upgrade -y && sudo apt dist-upgrade -y

				
			

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

انتقال سورس کد پروژه لاراول بر روی سرور Vps

بسیار دیده شده است که کاربران برای انتقال کدها به سرور مجازی یک ریپازیتوری Repository یا منبع کد در گیت را Clone میکنند و هر بار برای دریافت تغییرات پروژه وارد سرور می شوند و یک Pull انجام می دهند.

اما راه بهتری هم وجود دارد ، شما می توانید سرور خود را بعنوان یک Repository قرارداده که آپدیت های پروژه را مستقیما در سرور قرار دهید و تنها با یک کامند Push آن را به منبع سرور خود ارسال کنید . حتی می تواندی عملیات را اتوماتیک ساخته تا اقداماتی نظیر نصب Dependencies ، اجرای Migration ها و … بصورت خودکار صورت گیرند .

اما قبل از این کار بریم باهم PHP و Composer را که پیشنیاز فریمورک لاراول هستند نصب کنیم.

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

				
					sudo apt install php7.4-fpm php7.4-bcmath php7.4-json php7.4-mbstring php7.4-xml -y

				
			

با در نظر گرفتن اینکه از چه دیتا بیسی استفاده مکنید MySql , SqlLite یا غیره نیاز دارید که پکیج های آنها را نیز نصب کنید.

				
					sudo apt install php7.4-mysql php7.4-pgsql php7.4-sqlite3 -y

				
			
				
					sudo apt install php7.4-redis

				
			
				
					sudo apt install zip unzip php7.4-zip curl php7.4-curl -y

				
			

در این پروژه از MySql استفاده میکنیم و از Redis برای کچینگ و اجرای دستورات. همچنین اگر در نصب Php ورژن مورد نظر را تعریف نکنید بصورت پیشفرض آخرین نسخه در دسترس برای شما نصب خواهد شد .

نصب کامپوزر Composer بر روی Vps

پس از نصب Php بر روی vps خود نوبت به نصب کامپوزر رسیده است. با استفاده از دستور زیر 

				
					php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo php composer-setup.php --install-dir /usr/local/bin --filename composer
php -r "unlink('composer-setup.php');"
				
			

پس از طی مراحل تا به اینجا اکنون آماده انتقال کدها بر روی سرور هستیم.

انتقال کدها از گیت بر روی سرور Vps

توجه داشته باشید که باید با یوزر غیر روتی که ساختید مجدد برای این کار لاگین کرده باشید. حال یک دایرکتوری در مسیر /home/nonroot بسازید. از این مسیر برای پوش کردن Repository مورد نظر خود استفاده می کنید. 

				
					mkdir -p /home/nonroot/repo/question-board.git

				
			

دستور p- برای ساخت ریپازیتوری که ناموجود است استفاده می شود. سپس با استفاده از دستور cd وارد منبع ساخته شده شوید و initialize را انجام دهید :

				
					cd /home/nonroot/repo/question-board.git
git init --bare
				
			

bare کاملا مشابه یک git repository می باشد. در واقع کاربرد آن زمانی است که می خواهیم یک remote origin ایجاد کنیم. حالا با فرض اینکه در مسیر قبلی قرار داریم یعنی این مسیر :

/home/nonroot/repo/question-board.git

با کامند cd وارد hooksشده و یک فایل جدید مطابق زیر ایجاد میکنیم :

				
					cd hooks
touch post-receive
				
			

با اینکار ما یک اسکریپت در این مسیر قرار میدهیم تا هر زمان تغییراتی در پروژه با استفاده از Push اتفاق افتاد گیت منتظر می ماند که این تغییرات کامل شود و سپس آن ها را دریافت می کند. مرحله بعد در همین مسیر هوک ها فایل ایجاد شده را باز کنید :

				
					nano post-receive

				
			

هم اکنون محتوای فایل اسکریپتی خود را با محتوای زیر آپدیت کنید :

				
					#!/bin/sh

sudo /sbin/deploy
				
			

اگر دقت کرده باشید sbin/deploy اسکریپت دیگریست که باید در این مسیر قرار گیرد. بعنوان یک نکته عرض کنم که مسیر sbin/ اساسا مسئولیت ذخیره اسکریپت هایی را بر عهده دارد که وضایف مدیریتی را کنترل میکنند. مجددا با استفاده از تکست ادیتور nano فایل اسکریپت جدید را باز کنید :

				
					sudo touch /sbin/deploy
sudo nano /sbin/deploy
				
			

یکبار دیگر محتوا را این گونه آپدیت کنید :

				
					#!/bin/sh

git --work-tree=/srv/question-board --git-dir=/home/nonroot/repo/question-board.git checkout -f
				
			

خط اول کامند مشخص کننده اسکریپت Shell می باشد . خط بعدی آن محتوای ریپازیتوری گیت را به مسیر مورد نظر کپی می کند.

توضیح بیشتر در خصوص این کامند :

work-tree– به دایرکتوری مقصد اشاره دارد و git-dir– به منبع کد . با استفاده از کلید های Ctrl + O نانو تکست ادیتور را سیو کرده و با فشردن کلید های Ctrl + X از آن خارج شوید . یکبار تغییرات را تست کنید که مطمعن شوید پرمیشن اجرا شدن را دارند : 

				
					sudo chmod +x post-receive

				
			

آخرین مرحله از این قسمت این است که با استفاده از دستور زیر دایرکتوری مقصد را ایجاد و تکمیل کنید :

				
					sudo mkdir /srv/question-board

				
			

حالا سوال اینجاست که هوک ایجاد شده چگونه از Sudo استفاده میکند در حالی که هیچ پسوردی برای این یوزر ست نشده است ؟ با استفاده از این دستور این مشکل را نیز برطرف سازید، معنی این دستور را اینگونه توصیف کنم که هر کاربر غیر روت می تواند اسکریپت ایجاد شده را بدون پسورد اجرا کند.

مسیر زیر را با nano text editor باز کرده و اطلاعات زیر را به آن اضافه کنید :

				
					nonroot ALL=NOPASSWD: /sbin/deploy

				
			

به دنبال clone گرفتن از پروژه در محل درایو سیستم خود که در ابتدا به آن اشاره کردیم حالا همه چیز آماده عملیات Push می باشد. مجددا به ترمینال برگردید و در مسیر روت پروژه دستور زیر را اجرا کنید (فراموش نکنید که IP سرور خود را جایگزین کنید) :

				
					git remote add production ssh://nonroot@104.248.157.172/home/nonroot/repo/question-board.git

				
			

در دستور بعدی عملیات Push کردن در سرورتان به پایان میرسد :

				
					git push production master

				
			

تبریک ! عملیات با موفقیت انجام شد. برای اطمینان مجدد با یوزر غیر روتی که ساخته بودید به سرور متصل شوید و یک cd از مسیر srv/question-board/  بگیرید. در این مسیر میتوانید با استفاده از کامند مربوطه لیست فایل های انتقال داده شده را مشاهده کنید.

نکته مهم بعدی در مورد اتوماتیک سازی پروژه لاراول

آنچه باهم انجام دادیم تنها انتقال پروژه به سرور مورد نظر بود و چندین مرحله دیگر تا تکمیل نهایی آن فاصله داریم اما قبل از آن نگاهی بندازیم به اینکه چگونه پروژه لاراولی خود را اتوماتیک سازیم تا یکسری از وقایع به راحتی انجام شوند. وظایفی از قبیل نصب و بروز رسانی فایلهای مورد نیاز برنامه ، مایگریشن ها ، کش کردن ویو ها ، کانفیگ ها و روت ها و ….

برای اینکار یک فایل اسکریپت دیگر در مسیر sbin/ ایجاد و توسط نانو تکست ادیتور آن را اجرا میکنیم :

				
					sudo touch /sbin/post-deploy
sudo nano /sbin/post-deploy
				
			

محتوای فایل را اینگونه آپدیت کنید :

				
					#!/bin/sh

cd /srv/question-board

cp -n ./.env.example ./.env

COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
				
			

در این فرآیند دایرکتوری را تغییر دادیم و یک کپی از فایل env.example. ایجاد کردیم و با n- مطعمن می شویم که بر روی فایل موجود قبلی رایت نمی شود.

کامند سوم و چهارم نیز به نصب کتابخانه های مورد نیاز می پردازد. 

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

				
					sudo chmod +x /sbin/post-deploy
				
			

مسیر home/nonroot/repo/question-board.git/hooks/post-receive/ را باز کرده و دستور زیر را بعد از sudo /sbin/deploy اضافه کنید :

				
					sudo /sbin/post-deploy

				
			

ترتیب باید اینگونه باشد که اول اسکریپت post-deploy اجرا شود و بعد deploy فایل را سیو کنید و با کلید های  Ctrl + K خارج شوید .

یکبار دیگر فایل etc/sudoers/ را اجرا کنید و اینگونه آپدیت کنید :

				
					nonroot ALL=NOPASSWD: /sbin/deploy, /sbin/post-deploy

				
			

سیو کنید و از ادیتور خارج شوید. برای تست میتوانید تغییری در پروژه اعمال کنید و سپس commit و push را انجام دهید تا نتایج را ببینید. پس از اتمام پروسه با استفاده از کامند زیر محتوا را لیست کنید :

				
					ls -la
				
			

در میان سایر فایلهای پروژه یک پوشه vendor و فایل env ایجاد شده است که به شما امکان این را میدهد که کلید مورد نیاز پروژه لاراول خود را تنظیم کنید . در نهایت با دستور زیر می توانید یک کلید تولید کنید :

				
					sudo php artisan key:generate
				
			

خسته نباشید میگم تا به اینجای کار پروژه با موفقیت بارگذاری شد. مراحل بعدی شامل تنظیمات دیتا بیس و انجین NGINX میشه که سعی میکنم به زودی براتون قرار بدم . موفق باشید !