موضع نص الإشعار اتصل بنا تفضل الآن!

إزاي نقلت مشروع Laravel كبير من Shared Hosting إلى VPS بدون توقف الخدمة

George Bahgat

رحلة الانتقال من HostGator إلى عالم VPS الواسع

إذا كنت تعمل على مشروع Laravel كبير، فمن المؤكد أنك مررت بتلك اللحظة الحرجة التي تدرك فيها أن بيئة الاستضافة المشتركة مثل HostGator لم تعد تكفي لطموحات مشروعك. كنت أعاني بشكل شخصي من حدود خطتهم "Baby Plan" الشهيرة، حيث لم أعد أتحمل قيود الأداء، ومشاكل أذونات الملفات العشوائية، والعجز عن تثبيت إضافات PHP التي يحتاجها التطبيق. لم يكن الأمر مجرد مساحة تخزين أو نطاق ترددي، بل كان يشبه العيش في غرفة صغيرة بينما مشروعك يحتاج إلى منزل كبير. الانتقال إلى VPS كان يعني التحرر من هذه القيود، والحصول على تحكم كامل في بيئة التشغيل، وهو ما سأشاركك إياه بالتفصيل في هذه الرحلة الشاملة.

الكلمات المفتاحية: نقل Laravel من HostGator، VPS، ترحيل قاعدة البيانات بدون توقف، إعداد سيرفر Laravel، استراتيجية DNS.

التحضير للرحلة: لماذا كان VPS هو الحل بعد معاناة مع HostGator

بعد سنوات من العمل على استضافة HostGator المشتركة، أصبحت أواجه عقبات حقيقية. مشروعي الذي بدأ كنموذج بسيط تحول إلى منصة SaaS معقدة، ووصلت إلى نقطة لم أعد أتحمل فيها المزيد من التباطؤ. كانت المشاكل تتلخص في:

أذونات الملفات: كانت مجلدات التخزين وذاكرة التخزين المؤقت (storage و bootstrap/cache) تسبب لي صداعاً مستمراً. تنفيذ أوامر chmod عبر File Manager في cPanel كان حلاً مؤقتاً ينهار مع كل تحديث كبير.

قيود الأداء: خلال فترات الذروة، كان التطبيق يتباطأ بشكل ملحوظ، وكان من المستحيل تحديد إذا كان السبب هو جاري في السيرفر الذي يستخدم كل الموارد!

عدم المرونة: محاولة تثبيت إضافة مثل swoole أو حتى تفعيل بعض دوال PHP الأساسية كانت معركة مع دعم الفنادق.

هذه المعاناة هي التي دفعتني لاتخاذ قرار الانتقال، ولكن بتحدي واضح: كيف أنتقل دون أن أوقف الخدمة عن المستخدمين ولو لثانية واحدة؟

تحذير هام: لا تبدأ عملية النقل دون وجود نسخة احتياطية حديثة ومؤكدة من جميع بياناتك في HostGator، بما في ذلك قواعد البيانات والملفات المُرفعة. هذه خطوة غير قابلة للمساومة.

اختيار البيئة الجديدة: إعداد VPS مثالي لـ Laravel

اختيار السيرفر المناسب وتهيئته بشكل صحيح هو أساس بناء بيئة مستقرة ومؤهلة لاستقبال مشروعك الكبير.

مواصفات السيرفر المناسب لمشروع Laravel كبير

اعتماداً على حجم مشروعي واحتياجاته، اخترت خطة VPS تحتوي على 4 نواة افتراضية vCPU و 8 جيجابايت من الذاكرة العشوائية RAM و 100 جيجابايت من مساحة التخزين SSD. هذه المواصفات كانت مناسبة للتعامل مع عدد المستخدمين المتزامنين وحجم البيانات في مشروعي.

تهيئة السيرفر: تثبيت الحزمة الأساسية LEMP Stack

بعد الحصول على السيرفر، قمت بتهيئته بيئة LEMP Stack والتي تتكون من: نظام التشغيل Linux، وخادم Nginx، وقاعدة البيانات MySQL، ولغة PHP. هذه الحزمة هي البيئة المثالية لتشغيل تطبيقات Laravel. اتبعت الخطوات التالية:

أولاً، قمت بتحديث نظام التشغيل Ubuntu:

sudo apt update && sudo apt upgrade -y

ثم تثبيت حزمة Nginx:

sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

بعدها، قمت بتثبيت إصدار PHP 8.1 مع الإضافات المطلوبة لتشغيل Laravel:

sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.1-fpm php8.1-mysql php8.1-mbstring php8.1-xml php8.1-bcmath php8.1-curl php8.1-zip php8.1-gd -y

وأخيراً، تثبيت قاعدة البيانات MySQL 8:

sudo apt install mysql-server -y
sudo systemctl enable mysql
sudo systemctl start mysql

بعد التثبيت، قمت بتأمين قاعدة البيانات عبر الأمر sudo mysql_secure_installation، وإنشاء مستخدم جديد مخصص للتطبيق بدلاً من استخدام المستخدم root.

نصيحة: Laravel Forge يمكنه أتمتة جميع خطوات إعداد السيرفر هذه بنقرة واحدة. إذا كنت تريد توفير الوقت وتجنب الأخطاء اليدوية، فقد يكون Forge خياراً ممتازاً.

تهيئة بيئة Laravel: الأذونات والإعدادات الخاصة

من أكثر الأخطاء شيوعاً التي واجهتني هي مشاكل الأذونات. مجلدات التخزين وذاكرة التخزين المؤقت (storage و cache) في Laravel تحتاج إلى أذونات كتابة من قبل خادم الويب. لحل هذه المشكلة، قمت بتنفيذ الأوامر التالية في مجلد التطبيق:

sudo chown -R www-data:www-data /var/www/html/your-project
sudo chmod -R 775 /var/www/html/your-project/storage
sudo chmod -R 775 /var/www/html/your-project/bootstrap/cache

كما قمت بتعديل إعدادات PHP لتناسب متطلبات Laravel، مثل زيادة قيمة memory_limit و upload_max_filesize في ملف php.ini:

sudo nano /etc/php/8.1/fpm/php.ini

وقمت بتعديل القيم التالية:

memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 180

استراتيجية الانتقال بدون توقف: قلب العملية الناجحة

هنا يكمن التحدي الحقيقي. كيف تنقل التطبيق الحي دون أن يشعر المستخدمون بأي انقطاع؟ الحل يكمن في استراتيجية محكمة تعتمد على تزامن عمليات النقل مع توجيه الحركة بشكل سلس.

نقل البيانات بشكل متوازي: العيش في عالمين

بدلاً من إيقاف الموقع القديم ثم البدء بنقل البيانات، قمت بتشغيل الموقع الجديد بالتوازي مع القديم. أولاً، نقلت جميع ملفات التطبيق من HostGator عبر Rsync، وهي أداة فعالة للمزامنة بين السيرفرات. استخدمت الأمر التالي من السيرفر الجديد:

rsync -avz -e "ssh -p 22" username@hostgator-server-ip:/path/to/your/project/ /var/www/html/your-project/

لتنفيذ هذا الأمر، كان علي أولاً إنشاء مفتاح SSH على السيرفر الجديد وإضافته إلى حساب HostGator عبر cPanel في قسم "SSH Keys".

ترحيل قاعدة البيانات بدون توقف: التحدي الأكبر

ترحيل قاعدة البيانات الحية هو الجزء الأكثر حساسية في العملية برمتها. التحدي هو نقل البيانات المتغيرة باستمرار دون التسبب في فقدان البيانات أو تعارضها.

لضمان نقل البيانات بشكل متسق، اتبعت نهجاً مرحلياً. أولاً، قمت بتفعيل وضع الصيانة على التطبيق في HostGator لفترة وجيزة جداً (لا تزيد عن دقيقة واحدة) باستخدام الأمر المعروف في Laravel:

php artisan down

خلال هذه الدقيقة، قمت بعمل نسخة نهائية من قاعدة البيانات في HostGator باستخدام mysqldump:

mysqldump -u username -p database_name > backup.sql

ثم نقلت ملف النسخة الاحتياطية إلى السيرفر الجديد عبر SCP:

scp backup.sql user@your-new-server-ip:/tmp/

ثم استوردتها إلى قاعدة البيانات الجديدة على السيرفر الجديد:

mysql -u username -p new_database_name < /tmp/backup.sql

بعد التأكد من نجاح عملية الاستيراد، قمت بإعادة تشغيل التطبيق على HostGator:

php artisan up

إعداد النطاق DNS: فن التحول غير المرئي

أهم عنصر في عملية النقل بدون توقف هو إدارة النطاق DNS بشكل استراتيجي. بدلا من تغيير توجيه ال DNS مباشرة إلى السيرفر الجديد، اتبعت استراتيجية مختلفة. قمت بتخفيض وقت التخزين المؤقت لسجل TTL (Time to Live) في إعدادات DNS في HostGator إلى قيمة منخفضة (مثل 300 ثانية) قبل يومين من عملية النقل. هذا يسمح للخوادم والمستخدمين بتحديث عنوان IP الجديد بسرعة كبيرة عندما يحين وقت التغيير.

في لحظة التنفيذ، قمت بتغيير سجل A في إعدادات DNS في HostGator ليشير إلى عنوان IP الجديد للسيرفر. بسبب قيمة TTL المنخفضة، انتشر التغيير بسرعة، وكان الانتقال سلساً تقريباً.

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

ترحيل الملفات والمرفقات: مزامنة البيانات الديناميكية

في مشروعي، كان لدى المستخدمون القدرة على رفع الصور والمستندات، وكان مجلد التخزين (storage) يحوي آلاف الملفات التي يتم الوصول إليها باستمرار. لضمان نقل هذه الملفات دون فقدان أي ملف جديد يتم رفعه أثناء عملية النقل، استخدمت أداة Rsync بشكل متكرر.

قمت أولاً بنسخ جميع الملفات الموجودة من HostGator إلى السيرفر الجديد. ثم، قبل التبديل النهائي مباشرة، قمت بتشغيل Rsync مرة أخرى لنقل الملفات الجديدة أو المتغيرة التي تم إنشاؤها أثناء النسخة الأولى:

rsync -avz -e "ssh -p 22" --update username@hostgator-server-ip:/path/to/your/project/storage/ /var/www/html/your-project/storage/

هذه الطريقة تضمن نقل جميع الملفات تقريباً دون أي فقدان.

التهيئة النهائية على VPS

بعد اكتمال نقل جميع البيانات، جاء دور تهيئة السيرفر الجديد للعمل الأمثل.

إعداد خادم الويب Nginx

قمت بإنشاء ملف Virtual Host جديد لـ Nginx:

sudo nano /etc/nginx/sites-available/your-project

وأضفت التكوين التالي:

server {
    listen 80;
    server_name your-domain.com;
    root /var/www/html/your-project/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

ثم قمت بتفعيل الموقع:

sudo ln -s /etc/nginx/sites-available/your-project /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

إعداد Supervisor للتعامل مع Queues

مشروعي كان يعتمد بشكل كبير على Queues لمعالجة المهام في الخلفية. في HostGator، كنت أستخدم Horizon ولكن مع مشاكل متكررة في الاستقرار. على VPS، قمت بإعداد Supervisor لإدارة عمليات Queue:

sudo apt install supervisor -y
sudo nano /etc/supervisor/conf.d/laravel-worker.conf

وأضفت التكوين التالي:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/your-project/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/html/your-project/storage/logs/worker.log

ثم قمت بتشغيل Supervisor:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

إعداد مهام CRON التلقائية

في HostGator، كنت أضبط مهام CRON عبر واجهة cPanel. على VPS، قمت بإضافة المهمة مباشرة إلى crontab:

crontab -e

وأضفت السطر التالي:

* * * * * cd /var/www/html/your-project && php artisan schedule:run >> /dev/null 2>&1

الاختبار والمراقبة بعد الانتقال

بعد اكتمال نقل جميع البيانات وتغيير إعدادات DNS، تبدأ مرحلة لا تقل أهمية: مرحلة المراقبة والاختبار المكثف.

اختبار جميع وظائف التطبيق

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

مراقبة أداء السيرفر الجديد

استخدمت أدوات مراقبة مثل htop و nmon لمراقبة استخدام وحدة المعالجة المركزية والذاكرة على السيرفر الجديد. كما رصدت ملفات السجلات (Logs) الخاصة بـ Nginx و Laravel لاكتشاف أي أخطاء قد لا تظهر للمستخدمين العاديين.

ملاحظة أداء: لاحظت بعد الانتقال أن أداء التطبيق تحسن بنسبة ملحوظة تجاوزت 60%. أوقات التحميل انخفضت، وقدرة الاستيعاب ازدادت، وأصبح التطبيق أكثر استقراراً. هذا التحسن كان دليلاً عملياً على صحة قرار الانتقال.

دروس مستفادة ونصائح للطريق

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

التخطيط المفصل هو نصف النجاح

لا يمكنك المبالغة في أهمية التخطيط. كلما خططت للتفاصيل الدقيقة، كلما كانت العملية أكثر سلاسة. قم بكتابة كل خطوة، وحدد المسؤوليات، وضع توقعات واقعية للوقت المطلوب.

الاختبار في بيئة مشابهة للإنتاج

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

لا تتعجل في إيقاف السيرفر القديم

بعد اكتمال النقل واستقرار العمل على السيرفر الجديد، احتفظت بحساب HostGator يعمل لمدة أسبوعين كاملين كنسخة احتياطية حية. في حالة اكتشاف أي مشكلة حرجة في السيرفر الجديد، كان بإمكاني إعادة توجيه الحركة إلى القديم بسرعة. بعد أسبوعين من الاستقرار، قمت بإيقاف حساب HostGator بشكل نهائي.

الخاتمة: من عالم الضيق إلى رحابة السيطرة

الانتقال من استضافة HostGator المشتركة إلى VPS لمشروع Laravel كبير يشبه الانتقال من شقة مستأجرة صغيرة إلى منزل تمتلكه. إنها رحلة من القيود إلى الحرية، ومن اللايقين إلى التحكم الكامل. نعم، العملية تتطلب جهداً وتخطيطاً، لكن المكاسب تستحق كل هذا العناء.

الأداء الأفضل، والاستقرار الأعلى، والأمان المعزز، والمرونة الكبيرة في التوسع، كلها مكاسب ستحققها بعد هذه الرحلة. الأهم من ذلك، ستكتسب ثقة عميقة في قدرتك على إدارة البنية التحتية لتطبيقك، وهي مهارة لا تقدر بثمن في مسيرة أي مطور أو صاحب مشروع رقمي.

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


خطوتك التالية: ابدأ بجرد شامل لمشروعك على HostGator: حجم قاعدة البيانات، حجم الملفات في مجلد التخزين، الإضافات المستخدمة، والخدمات المرتبطة. ثم ابحث عن موفر VPS يلبي احتياجاتك الحالية ويسمح بالتوسع المستقبلي. الرحلة تبدأ بخطوة.

إرسال تعليق

الموافقة على ملفات تعريف الارتباط
”نحن نقدم ملفات تعريف الارتباط على هذا الموقع لتحليل حركة المرور وتذكر تفضيلاتك وتحسين تجربتك.“
لا يتوفر اتصال بالإنترنت!
”يبدو أن هناك خطأ ما في اتصالك بالإنترنت ، يرجى التحقق من اتصالك بالإنترنت والمحاولة مرة أخرى.“
تم الكشف عن مانع الإعلانات!
”لقد اكتشفنا أنك تستخدم مكونًا إضافيًا لحظر الإعلانات في متصفحك.
تُستخدم العائدات التي نحققها من الإعلانات لإدارة موقع الويب هذا ، ونطلب منك إدراج موقعنا في القائمة البيضاء في المكون الإضافي لحظر الإعلانات.“
Site is Blocked
Sorry! This site is not available in your country.