النشر وأفضل ممارسات الإنتاج
يتطلب نشر تطبيق لارافل في الإنتاج تخطيطًا وتكوينًا دقيقين. في هذا الدرس، سنغطي كل ما تحتاج لمعرفته حول إعداد ونشر وصيانة تطبيق لارافل في بيئة الإنتاج.
متطلبات الخادم
تأكد من أن خادم الإنتاج الخاص بك يلبي متطلبات لارافل:
# الحد الأدنى من المتطلبات
- PHP >= 8.1
- Composer
- OpenSSL PHP Extension
- PDO PHP Extension
- Mbstring PHP Extension
- Tokenizer PHP Extension
- XML PHP Extension
- Ctype PHP Extension
- JSON PHP Extension
- BCMath PHP Extension (لـ Cashier، إلخ)
# خادم الويب
- Apache مع mod_rewrite أو
- Nginx
# قاعدة البيانات
- MySQL 5.7+ / MariaDB 10.3+
- PostgreSQL 10.0+
- SQLite 3.8.8+
- SQL Server 2017+
# أدوات إضافية
- Redis (للذاكرة المؤقتة وقوائم الانتظار)
- Supervisor (لعمال قوائم الانتظار)
- Node.js و npm (لأصول الواجهة الأمامية)
تكوين البيئة
قم بتكوين ملف .env بشكل صحيح للإنتاج:
# التطبيق
APP_NAME="Your Application"
APP_ENV=production
APP_KEY=base64:GENERATE_THIS_WITH_php_artisan_key:generate
APP_DEBUG=false
APP_URL=https://yourdomain.com
# قاعدة البيانات
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_secure_password
# الذاكرة المؤقتة والجلسات
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
# Redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
# البريد
MAIL_MAILER=smtp
MAIL_HOST=your-mail-server.com
MAIL_PORT=587
MAIL_USERNAME=your-username
MAIL_PASSWORD=your-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@yourdomain.com
MAIL_FROM_NAME="${APP_NAME}"
# السجلات
LOG_CHANNEL=stack
LOG_LEVEL=error
تحذير: لا تقم أبدًا بتعيين APP_DEBUG=true في الإنتاج! هذا يعرض معلومات حساسة مثل بيانات اعتماد قاعدة البيانات وبنية التطبيق للمهاجمين المحتملين.
أوامر التحسين
قم بتشغيل هذه الأوامر قبل النشر أو بعد أي تغييرات:
# إنشاء مفتاح التطبيق (مرة واحدة فقط، في أول نشر)
php artisan key:generate
# ذاكرة مؤقتة للتكوين
php artisan config:cache
# ذاكرة مؤقتة للمسارات
php artisan route:cache
# ذاكرة مؤقتة للعروض
php artisan view:cache
# ذاكرة مؤقتة للأحداث
php artisan event:cache
# تحسين autoloader
composer install --optimize-autoloader --no-dev
# مسح جميع ذاكرات التخزين المؤقت (إذا لزم الأمر)
php artisan optimize:clear
# تشغيل جميع التحسينات دفعة واحدة
php artisan optimize
تكوين خادم الويب
تكوين Nginx
server {
listen 80;
listen [::]:80;
server_name yourdomain.com;
root /var/www/yourdomain.com/public;
add_header X-Frame-Options "SAMEORIGIN";
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.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
تكوين Apache
<VirtualHost *:80>
ServerName yourdomain.com
DocumentRoot /var/www/yourdomain.com/public
<Directory /var/www/yourdomain.com/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/yourdomain-error.log
CustomLog ${APACHE_LOG_DIR}/yourdomain-access.log combined
</VirtualHost>
أذونات الملفات
قم بتعيين الأذونات المناسبة للأمان:
# تعيين الملكية (استبدل www-data بمستخدم خادم الويب الخاص بك)
sudo chown -R www-data:www-data /var/www/yourdomain.com
# تعيين أذونات الدليل
sudo find /var/www/yourdomain.com -type d -exec chmod 755 {} \;
# تعيين أذونات الملف
sudo find /var/www/yourdomain.com -type f -exec chmod 644 {} \;
# التخزين والذاكرة المؤقتة تحتاج أذونات الكتابة
sudo chmod -R 775 /var/www/yourdomain.com/storage
sudo chmod -R 775 /var/www/yourdomain.com/bootstrap/cache
ترحيل قاعدة البيانات
تعامل مع ترحيلات قاعدة البيانات بعناية في الإنتاج:
# نسخ احتياطي لقاعدة البيانات قبل الترحيل
mysqldump -u username -p database_name > backup_$(date +%Y%m%d_%H%M%S).sql
# تشغيل الترحيلات
php artisan migrate --force
# التراجع إذا لزم الأمر (لديك خطة!)
php artisan migrate:rollback --step=1
# التحقق من حالة الترحيل
php artisan migrate:status
# تشغيل seeders (كن حذرًا!)
php artisan db:seed --class=ProductionSeeder
نصيحة: اختبر دائمًا الترحيلات على بيئة تجهيز تعكس الإنتاج قبل تشغيلها على البيانات الحية.
عمال قوائم الانتظار مع Supervisor
حافظ على تشغيل عمال قوائم الانتظار باستخدام Supervisor:
# تثبيت Supervisor
sudo apt-get install supervisor
# إنشاء تكوين Supervisor
# /etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/yourdomain.com/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/yourdomain.com/storage/logs/worker.log
stopwaitsecs=3600
# إعادة تحميل Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
# التحقق من الحالة
sudo supervisorctl status
جدولة المهام
قم بإعداد جدولة لارافل باستخدام cron:
# تحرير crontab
crontab -e
# إضافة جدولة لارافل (يعمل كل دقيقة)
* * * * * cd /var/www/yourdomain.com && php artisan schedule:run >> /dev/null 2>&1
# تحقق من أنها تعمل
php artisan schedule:list
النشر بدون توقف
انشر بدون توقف باستخدام روابط رمزية:
# هيكل الدليل
/var/www/yourdomain.com/
├── current -> releases/20240115120000
├── releases/
│ ├── 20240115120000/
│ ├── 20240114110000/
│ └── 20240113100000/
└── shared/
├── .env
└── storage/
# سكريبت النشر (deploy.sh)
#!/bin/bash
RELEASE=$(date +%Y%m%d%H%M%S)
APP_DIR=/var/www/yourdomain.com
RELEASE_DIR=$APP_DIR/releases/$RELEASE
# إنشاء دليل الإصدار
mkdir -p $RELEASE_DIR
# استنساخ/نسخ الكود إلى دليل الإصدار
git clone --depth 1 git@github.com:username/repo.git $RELEASE_DIR
# ربط الملفات المشتركة
ln -s $APP_DIR/shared/.env $RELEASE_DIR/.env
ln -s $APP_DIR/shared/storage $RELEASE_DIR/storage
# تثبيت التبعيات
cd $RELEASE_DIR
composer install --optimize-autoloader --no-dev
# تشغيل التحسينات
php artisan config:cache
php artisan route:cache
php artisan view:cache
# تشغيل الترحيلات
php artisan migrate --force
# التبديل إلى الإصدار الجديد (عملية ذرية)
ln -sfn $RELEASE_DIR $APP_DIR/current
# إعادة تحميل PHP-FPM
sudo systemctl reload php8.2-fpm
# إعادة تشغيل عمال قوائم الانتظار
php artisan queue:restart
# الاحتفاظ بآخر 5 إصدارات فقط
cd $APP_DIR/releases && ls -t | tail -n +6 | xargs rm -rf
echo "تم النشر: $RELEASE"
تكوين SSL/TLS
قم بتأمين تطبيقك باستخدام HTTPS باستخدام Let's Encrypt:
# تثبيت Certbot
sudo apt-get install certbot python3-certbot-nginx
# لـ Nginx
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
# لـ Apache
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com
# التجديد التلقائي (تم تكوينه بالفعل بواسطة Certbot)
sudo certbot renew --dry-run
# فرض HTTPS في لارافل
// app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\URL;
public function boot()
{
if ($this->app->environment('production')) {
URL::forceScheme('https');
}
}
Laravel Forge
قم بتبسيط النشر باستخدام Laravel Forge (خدمة مدفوعة):
- توفير الخادم: قم بإعداد الخوادم تلقائيًا على DigitalOcean و AWS و Linode، إلخ
- النشر: النشر بالضغط من GitHub أو GitLab أو Bitbucket
- شهادات SSL: تكامل Let's Encrypt بنقرة واحدة
- عمال قوائم الانتظار: تكوين Supervisor التلقائي
- المهام المجدولة: إدارة مهام cron المرئية
- المراقبة: مراقبة الخادم والتنبيهات
# سكريبت نشر Forge (يعمل تلقائيًا عند git push)
cd /home/forge/yourdomain.com
git pull origin main
composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan queue:restart
php artisan optimize
Laravel Vapor
النشر بدون خادم على AWS Lambda:
- التوسع التلقائي: يتوسع تلقائيًا للتعامل مع حركة المرور
- الدفع لكل استخدام: ادفع فقط مقابل الاستخدام الفعلي
- عدم التوقف: عمليات نشر بدون توقف مدمجة
- قاعدة البيانات: يعمل مع RDS، Aurora Serverless
- الأصول: تكامل CloudFront CDN
- قوائم الانتظار: تكامل SQS لقوائم انتظار المهام
# تثبيت Vapor CLI
composer require laravel/vapor-cli
# تسجيل الدخول
vapor login
# تهيئة المشروع
vapor init
# النشر في الإنتاج
vapor deploy production
المراقبة والسجلات
قم بإعداد المراقبة المناسبة للإنتاج:
# تكوين السجلات
// config/logging.php
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['daily', 'slack'],
'ignore_exceptions' => false,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
],
# استخدم خدمات المراقبة
- Sentry (تتبع الأخطاء)
- New Relic (APM)
- Datadog (مراقبة البنية التحتية)
- Laravel Telescope (تصحيح التطوير)
- Laravel Horizon (مراقبة قوائم الانتظار)
تمرين 1: قائمة التحقق من الإنتاج
أنشئ قائمة تحقق شاملة للنشر:
- تحقق من تعيين جميع متغيرات البيئة بشكل صحيح
- تأكد من أن APP_DEBUG هو false
- قم بإعداد السجلات المناسبة مع إشعارات Slack
- قم بتكوين Redis للذاكرة المؤقتة وقوائم الانتظار
- قم بإعداد Supervisor لعمال قوائم الانتظار
- قم بتكوين cron لجدولة المهام
- قم بتشغيل جميع أوامر التحسين
- قم بتعيين أذونات الملفات المناسبة
تمرين 2: سكريبت النشر
أنشئ سكريبت نشر بدون توقف:
- اكتب سكريبت bash ينشئ إصدارات مؤرخة
- قم بتضمين خطوات: استنساخ الكود، تثبيت التبعيات، تشغيل الترحيلات
- استخدم الروابط الرمزية للتبديل بين الإصدارات
- احتفظ بآخر 5 إصدارات فقط
- أضف وظيفة التراجع
- اختبر السكريبت على خادم تجهيز
تمرين 3: SSL والأمان
قم بتنفيذ أفضل ممارسات الأمان:
- قم بتثبيت وتكوين شهادة SSL مع Let's Encrypt
- فرض HTTPS في لارافل
- أضف رؤوس الأمان في تكوين خادم الويب
- قم بإعداد التجديد التلقائي للشهادة
- قم بتكوين تحديد المعدل لنقاط نهاية API
- اختبر تكوين SSL مع SSL Labs
قائمة التحقق من الإنتاج
- البيئة: APP_ENV=production، APP_DEBUG=false
- الأمان: HTTPS ممكّن، رؤوس الأمان مكونة
- التحسين: تشغيل جميع أوامر الذاكرة المؤقتة، autoloader محسّن
- قاعدة البيانات: بيانات اعتماد مناسبة، تجميع الاتصالات ممكّن
- الذاكرة المؤقتة: Redis مكوّن للذاكرة المؤقتة والجلسة وقوائم الانتظار
- قائمة الانتظار: Supervisor يشغل العمال، queue:restart عند النشر
- الجدولة: مهمة cron مكونة للجدولة
- السجلات: سجلات الأخطاء إلى الملفات وخدمة المراقبة
- النسخ الاحتياطية: نسخ احتياطية تلقائية لقاعدة البيانات والملفات
- المراقبة: مراقبة التطبيق والخادم ممكّنة
الخلاصة
في هذا الدرس، تعلمت:
- متطلبات الخادم لتطبيقات لارافل
- التكوين البيئي المناسب للإنتاج
- أوامر التحسين الأساسية
- تكوين خادم الويب لـ Nginx و Apache
- أذونات الملفات والأمان
- استراتيجيات ترحيل قاعدة البيانات
- إدارة عمال قوائم الانتظار باستخدام Supervisor
- تقنيات النشر بدون توقف
- تكوين SSL/TLS مع Let's Encrypt
- استخدام Laravel Forge و Vapor للنشر
- أفضل ممارسات المراقبة والسجلات
تهانينا! لقد أكملت دورة Laravel Framework. لديك الآن المعرفة لبناء واختبار ونشر تطبيقات لارافل احترافية. تذكر: النشر ليس النهاية - المراقبة المستمرة والصيانة والتحسين ضرورية لتطبيقات الإنتاج. استمر في التعلم، وابقَ على اطلاع بإصدارات لارافل، وابنِ أشياء رائعة!