البرمجة متوسط 14 دقيقة

كيفية نشر تطبيق Laravel على خادم VPS (Apache و MySQL)

نشر Laravel على خادم VPS يمنحك تحكمًا كاملًا في بيئة الخادم — إصدار PHP، الامتدادات، مهام cron، معالجات الطوابير، وكل شيء. سيأخذك هذا الدليل من آلة فارغة حتى تطبيق Laravel يعمل في الإنتاج، باستخدام Apache وMySQL/MariaDB.

سنتناول أيضًا كيفية دفع التحديثات بشكل نظيف عبر Git حتى تبقى عمليات النشر قابلة للتوقع والتكرار.

نفس الأسلوب يعمل مع أي مشروع Laravel 10/11/12. الأوامر مكتوبة لنظام Ubuntu 22.04 أو 24.04؛ عدّل أسماء الحزم إذا كنت تستخدم توزيعة مختلفة.

الخطوات

  1. 1

    تحديث الخادم وتثبيت المتطلبات

    ابدأ بنظام نظيف ومحدث بالكامل. ثم أضف مستودع ondrej/php للحصول على PHP 8.2 أو أحدث، ثم ثبّت Apache وMariaDB وجميع امتدادات PHP التي يحتاجها Laravel.

    bash
    apt update && apt upgrade -y
    
    add-apt-repository ppa:ondrej/php -y
    apt update
    
    apt install -y apache2 mariadb-server \
      php8.2 php8.2-cli php8.2-fpm \
      php8.2-mysql php8.2-mbstring php8.2-xml \
      php8.2-curl php8.2-zip php8.2-bcmath \
      php8.2-intl php8.2-gd php8.2-tokenizer \
      libapache2-mod-php8.2 unzip git curl
    
    a2enmod rewrite php8.2
    systemctl restart apache2
  2. 2

    تثبيت Composer

    Composer غير متوفر بإصدار حديث كافٍ في مدير حزم Ubuntu. نزّله مباشرةً من المثبّت الرسمي وانقله إلى مسار عام.

    bash
    curl -sS https://getcomposer.org/installer | php
    mv composer.phar /usr/local/bin/composer
    chmod +x /usr/local/bin/composer
    composer --version
  3. 3

    إنشاء قاعدة البيانات والمستخدم

    سجّل الدخول إلى MariaDB وأنشئ قاعدة بيانات ومستخدمًا مخصصًا للتطبيق. لا تستخدم مستخدم root في ملف .env أبدًا.

    sql
    mysql -u root
    
    CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    CREATE USER 'myapp'@'localhost' IDENTIFIED BY 'StrongPassword123!';
    GRANT ALL PRIVILEGES ON myapp.* TO 'myapp'@'localhost';
    FLUSH PRIVILEGES;
    EXIT;
  4. 4

    استنساخ المستودع

    ضع المشروع تحت /var/www/. استنسخ المستودع هناك، ثم اجعل Apache مالكًا للملفات حتى يتمكن خادم الويب من القراءة والكتابة. جميع عمليات النشر المستقبلية ستستخدم git pull من هذا المجلد — لا تنسخ الملفات يدويًا أبدًا.

    bash
    cd /var/www
    git clone https://github.com/your-username/your-repo.git myapp.com
    chown -R www-data:www-data /var/www/myapp.com
  5. 5

    ضبط ملف .env

    انسخ .env.example إلى .env وأدخل القيم الحقيقية. ملف .env لا يُضاف إلى Git أبدًا — يعيش فقط على الخادم. أنشئ APP_KEY جديدًا بعد النسخ.

    bash
    cd /var/www/myapp.com
    cp .env.example .env
    nano .env
    # Set APP_ENV=production, APP_DEBUG=false, APP_URL
    # Set DB_DATABASE, DB_USERNAME, DB_PASSWORD
    # Set MAIL_* if using email
    
    php artisan key:generate
  6. 6

    تثبيت المتطلبات وتشغيل الترحيلات

    ثبّت متطلبات الإنتاج فقط باستخدام خيار --no-dev، ثم شغّل الترحيلات. أعِد ضبط الصلاحيات بعد أن يكتب Composer إلى مجلد vendor.

    bash
    cd /var/www/myapp.com
    composer install --no-dev --optimize-autoloader
    php artisan migrate --force
    php artisan db:seed --force   # only if you have seeders to run in production
    
    chown -R www-data:www-data /var/www/myapp.com
    chmod -R 755 /var/www/myapp.com
    chmod -R 775 /var/www/myapp.com/storage
    chmod -R 775 /var/www/myapp.com/bootstrap/cache
  7. 7

    إنشاء ملف الـ Virtual Host في Apache

    أنشئ ملف إعداد vhost يوجّه Apache نحو مجلد public/ كـ document root. يتيح AllowOverride All لملف .htaccess في Laravel التعامل مع إعادة كتابة الروابط.

    bash
    nano /etc/apache2/sites-available/myapp.com.conf
  8. 8

    كتابة إعداد الـ Virtual Host

    الصق التالي في ملف الإعداد. استبدل myapp.com بنطاقك الفعلي. يجب أن يشير DocumentRoot إلى public/ لا إلى جذر المشروع — هذا أكثر خطأ شائع في الإعداد.

    nginx
    <VirtualHost *:80>
        ServerName myapp.com
        ServerAlias www.myapp.com
        DocumentRoot /var/www/myapp.com/public
    
        <Directory /var/www/myapp.com/public>
            AllowOverride All
            Require all granted
            Options -Indexes +FollowSymLinks
        </Directory>
    
        ErrorLog ${APACHE_LOG_DIR}/myapp-error.log
        CustomLog ${APACHE_LOG_DIR}/myapp-access.log combined
    </VirtualHost>
  9. 9

    تفعيل الموقع وتخزين إعدادات Laravel مؤقتًا

    فعّل الـ vhost، عطّل الموقع الافتراضي، أعِد تشغيل Apache، ثم شغّل أوامر التحسين في Laravel لتخزين الإعدادات والمسارات والقوالب مؤقتًا. هذا يُسرّع كل طلب في الإنتاج.

    عند كل نشر لاحق: git pull ثم composer install --no-dev --optimize-autoloader إذا تغيّر composer.json، ثم php artisan migrate --force إذا أُضيفت ترحيلات جديدة، ثم php artisan optimize && php artisan view:cache.

    bash
    a2ensite myapp.com.conf
    a2dissite 000-default.conf
    apache2ctl configtest   # should say "Syntax OK"
    systemctl reload apache2
    
    php artisan storage:link
    php artisan optimize
    php artisan view:cache

نصائح ومحاذير

  • اضبط <code>APP_DEBUG=false</code> في الإنتاج — stack trace مرئي يكشف مسارات ملفاتك وقيم إعداداتك لأي شخص يستدعي خطأً.
  • شغّل <code>php artisan config:clear</code> قبل <code>php artisan optimize</code> في كل مرة تغيّر فيها قيم .env، وإلا ستظل القيم القديمة المخزنة مؤقتًا هي المُستخدمة.
  • أنشئ سكريبت نشر أو اختصار حتى تكون كل عملية نشر أمرًا واحدًا — يمنع نسيان خطوات مثل <code>chown</code> أو <code>view:cache</code>.
  • ثبّت Certbot (<code>apt install certbot python3-certbot-apache</code>) للحصول على شهادة SSL مجانية من Let's Encrypt؛ تضبط إعداد Apache تلقائيًا.
  • أنشئ مستخدم نشر بصلاحيات محدودة بدلًا من تشغيل كل شيء كـ root على خادم مشترك.

خاتمة

أصبح لديك الآن نشر Laravel على Apache وMySQL مع سير عمل تحديث نظيف قائم على Git. الخطوة التالية هي إضافة SSL عبر Certbot وإعداد معالج طابور باستخدام Supervisor حتى تستمر المهام في العمل بعد إعادة تشغيل الخادم.

#Laravel #Deployment #VPS #Linux
العودة إلى جميع الأدلة

هل تحتاج مساعدة في مشروعك؟

احجز استشارة مجانية لمدة 30 دقيقة لمناقشة تحدياتك التقنية واستكشاف الحلول معًا.