- كيفية تثبيت وإعداد Laravel باستخدام Docker Compose على Ubuntu 22.04؟
- قائمة التحقق الأولية
- تثبيت Docker و Docker Compose على Ubuntu 22.04
- هيكل المشروع المقترح
- ملف Dockerfile الموصى به لـ PHP-FPM (PHP 8.1)
- مثال على ملف docker-compose.yml
- ملف تكوين Nginx (docker/nginx/default.conf)
- إعداد الكود وتثبيت التبعيات
- إعداد ملف .env لـ Docker
- بروتوكول SSL و Let's Encrypt - طريقتان سهلتان
- تشغيل الخدمة عند بدء التشغيل والحفاظ عليها
- نصائح أمنية عملية
- تحسين الأداء لبيئات الإنتاج
- عمال الطوابير و Horizon
- نصائح متعلقة باختيار الموقع ومركز البيانات
- النسخ الاحتياطية والمراقبة والسجلات
- تصحيح الأخطاء الشائعة
- الخلاصة والتوصية النهائية
- الخدمات ذات الصلة
- الأسئلة الشائعة
كيفية تثبيت وإعداد Laravel باستخدام Docker Compose على Ubuntu 22.04؟
في هذا الدليل العملي والتقني، سنرشدك خطوة بخطوة خلال عملية تثبيت وتكوين التطبيق. Laravel استخدام Docker Compose على الخادم أوبونتو 22.04 تهدف هذه المقالة إلى توفير إرشادات قابلة للتكرار للمطورين وفرق DevOps والمديرين التقنيين لإنشاء بيئة إنتاج آمنة وقابلة للتطوير والصيانة.
قائمة التحقق الأولية
قبل البدء، جهّز ما يلي:
- خادم أوبونتو 22.04 باستخدام صلاحيات الجذر أو مستخدم لديه صلاحيات sudo
- عامل ميناء (إصدار مستقر) و Docker Compose (أو استخدم إضافة docker compose)
- المنافذ المفتوحة: 80/443 للويب؛ إذا لزم الأمر 3306 أو 5432 بالنسبة لقاعدة البيانات (ويفضل أن تقتصر على عناوين IP)
- مساحة تخزين كافية (يوصى باستخدام SSD) وإمكانية الوصول إلى واحد من أكثر من 85 موقعًا عالمي في حالة استخدام الخدمات السحابية
- اسم النطاق وسجل نظام أسماء النطاقات (DNS) الذي يشير إلى عنوان IP الخاص بالخادم
تثبيت Docker و Docker Compose على Ubuntu 22.04
قم بتشغيل الأوامر التالية على الخادم لتثبيت Docker ومكون docker compose الإضافي:
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo usermod -aG docker $USERثم قم بتسجيل الخروج ثم تسجيل الدخول مرة أخرى أو مجموعة جديدة من دوكر يستخدم.
للتحقق من التثبيت:
docker --version
docker compose versionهيكل المشروع المقترح
يوصى بتنظيم مجلد المشروع على النحو التالي لتسهيل الصيانة والتطوير:
جذر المشروع/عامل ميناء/nginx/default.confphp/Dockerfile
src/— كود Laravel (أو mount)ملف docker-compose.yml.env
ملف Dockerfile الموصى به لـ PHP-FPM (PHP 8.1)
ملف ذو مسار docker/php/Dockerfile أنشئ شيئًا مشابهًا للمثال التالي:
FROM php:8.1-fpm
# Install required tools and extensions
RUN apt-get update && apt-get install -y \
git zip unzip libpng-dev libjpeg-dev libfreetype6-dev libonig-dev libxml2-dev \
libzip-dev libpq-dev cron curl supervisor \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd pdo pdo_mysql pdo_pgsql mbstring xml bcmath zip opcache \
&& pecl install redis && docker-php-ext-enable redis \
&& pecl install xdebug || true \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# Create non-root user
RUN useradd -G www-data,root -u 1000 -d /home/appuser appuser
WORKDIR /var/www/html
USER appuserمثال على ملف docker-compose.yml
النسخة المقترحة ملف docker-compose.yml لتشغيل التطبيق، وخادم الويب، وقاعدة البيانات، وRedis:
version: "3.8"
services:
app:
build:
context: .
dockerfile: docker/php/Dockerfile
image: laravel_app:latest
container_name: laravel_app
restart: unless-stopped
volumes:
- ./src:/var/www/html
- ./docker/php/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
environment:
- APP_ENV=production
- APP_DEBUG=false
networks:
- laravel-net
web:
image: nginx:alpine
container_name: laravel_web
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./src:/var/www/html:ro
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./certs:/etc/letsencrypt
depends_on:
- app
networks:
- laravel-net
db:
image: mysql:8.0
container_name: laravel_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: laravel
MYSQL_USER: laravel
MYSQL_PASSWORD: secret
volumes:
- db_data:/var/lib/mysql
networks:
- laravel-net
redis:
image: redis:6-alpine
container_name: laravel_redis
restart: unless-stopped
volumes:
- redis_data:/data
networks:
- laravel-net
volumes:
db_data:
redis_data:
networks:
laravel-net:
driver: bridgeملف تكوين Nginx (docker/nginx/default.conf)
مثال على إعدادات Nginx لتوجيه الطلبات إلى PHP-FPM (التطبيق):
server {
listen 80;
server_name example.com;
root /var/www/html/public;
index index.php index.html;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location ~ /\.ht {
deny all;
}
}ملحوظة: في البنى التي تحتوي على خادم وكيل عكسي أو خدمات متعددة، يمكنك وضع Nginx في طبقة موازن التحميل أو شبكة توصيل المحتوى (CDN).
إعداد الكود وتثبيت التبعيات
إذا لم يكن لديك مشروع Laravel، يمكنك إنشاء مشروع جديد باستخدام Composer:
composer create-project --prefer-dist laravel/laravel srcثم بناء وتشغيل الحاويات:
docker compose build
docker compose up -dلتشغيل أوامر Composer و Artisan داخل حاوية PHP:
docker exec -it laravel_app bash
composer install --no-dev --optimize-autoloader
php artisan key:generate
php artisan migrate --force
php artisan config:cache
php artisan route:cache
exitإعداد ملف .env لـ Docker
مثال على تكوين ملف .env متوافق مع docker-compose:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret
CACHE_DRIVER=redis
REDIS_HOST=redis
APP_URL=https://example.comبروتوكول SSL و Let's Encrypt - طريقتان سهلتان
هناك طريقتان بسيطتان لتفعيل بروتوكول HTTPS:
- استخدام Certbot على المضيف: أوقف Nginx مؤقتًا، وضع الشهادة الصادرة في المجلد.
./certsثم قم بتثبيته على الحاوية. - استخدام الحل الآلي: أدوات مثل docker-letsencrypt-nginx-proxy-companion أو مرور إنها مناسبة لإدارة الشهادات الآلية.
مثال سريع باستخدام Certbot:
sudo apt install -y certbot
sudo docker compose down
sudo certbot certonly --standalone -d example.com --non-interactive --agree-tos -m [email protected]
# Copy certificates from /etc/letsencrypt/live/... to ./certs and then:
sudo docker compose up -dتشغيل الخدمة عند بدء التشغيل والحفاظ عليها
لضمان استمرار عمل الخدمات بعد إعادة التشغيل:
sudo systemctl enable dockerبالإضافة إلى ذلك، في docker-compose من إعادة التشغيل: إلا إذا تم إيقافها تم استخدامه. إذا لزم الأمر، يمكن إنشاء وحدة systemd لـ docker-compose.
نصائح أمنية عملية
- استخدام مستخدم غير الجذر في حاوية PHP (
مستخدم التطبيق(في ملف Dockerfile أعلاه) - تقييد الوصول إلى منفذ قاعدة البيانات باستخدام جدار الحماية (UFW):
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enableتوصيات أخرى:
- النسخ الاحتياطي المنتظم لوحدة تخزين قاعدة البيانات (
بيانات قاعدة البيانات) وتخزينها خارج الخادم - تفعيل بروتوكول HTTPS وHSTS
- استخدام الأسرار أو خدمات إدارة المفاتيح لتخزين كلمات المرور (أسرار Docker أو خدمات إدارة المفاتيح)
- استخدم أدوات الأمان مثل Fail2ban وإذا لزم الأمر، مثل جدار الحماية لتطبيقات الويب مود سيكيوريتي
- استخدم شبكة توصيل المحتوى (CDN) أو خدمة مكافحة هجمات DDoS لحماية حركة البيانات.
تحسين الأداء لبيئات الإنتاج
- تفعيل OPcache في
php.ini:opcache.memory_consumption=256 opcache.validate_timestamps=0 - إعداد php-fpm (pm = ديناميكي أو عند الطلب) وزيادة
max_childrenوفقًا لذاكرة الخادم - استخدام Redis للتخزين المؤقت والجلسات
- استخدام شبكة توصيل المحتوى (CDN) للملفات الثابتة
- التوسع الأفقي: تشغيل عدة نسخ من خدمة التطبيق باستخدام موازن تحميل (NGINX أو HAProxy)
- استخدم عمالاً ومشرفين منفصلين أو خدمات منفصلة للوقت الفعلي وقوائم الانتظار.
عمال الطوابير و Horizon
أضف خدمة منفصلة في docker-compose لتشغيل عمال قائمة الانتظار. مثال:
worker:
build: ...
command: php /var/www/html/artisan queue:work --sleep=3 --tries=3
depends_on: [app, redis]
restart: unless-stoppedبالنسبة لـ Laravel Horizon، من الأفضل استخدام حاوية مخصصة مع تثبيت PHP و Horizon ووضعها خلف Nginx/authentication.
نصائح متعلقة باختيار الموقع ومركز البيانات
نصائح عملية لاختيار الموقع:
- للحصول على أقل زمن استجابة، اختر خادمًا في موقع قريب من المستخدمين النهائيين أو الوجهة. مزود الخدمة أكثر من ذلك. 85 موقعًا عالميًا نعم، لقد حدث ذلك.
- بالنسبة للاعبين أو المتداولين، اختر موقعًا يتميز بزمن استجابة منخفض وشبكة BGP محسّنة.
- استخدم خوادم مزودة بوحدات معالجة الرسومات (GPU) لمعالجة الذكاء الاصطناعي وعرضه.
- استخدم الخوادم وشبكات توصيل المحتوى (CDN) المزودة بحماية ضد هجمات DDoS لمقاومة هذه الهجمات.
النسخ الاحتياطية والمراقبة والسجلات
- سجلات الحاويات مع
سجلات Dockerيمكن الوصول إليها؛ استخدم ELK أو Prometheus+Grafana للتجميع المركزي. - النسخ الاحتياطي اليومي لقاعدة البيانات واختبار الاستعادة الدوري
- مراقبة موارد وحدة المعالجة المركزية/ذاكرة الوصول العشوائي، وتتبع التطبيقات والأخطاء في التكامل المستمر/التسليم المستمر
تصحيح الأخطاء الشائعة
- خطأ بوابة غير صالحة 502: تأكد من تشغيل php-fpm في حاوية التطبيق وأن fastcgi_pass مضبوط على العنوان الصحيح (
التطبيق: 9000) للإشارة إلى ذلك. - مشكلة في الاتصال بقاعدة البيانات: تحقق من متغيرات .env، وشبكة Docker، وسجلات MySQL.
- أذونات الملفات: في حالة حدوث أخطاء في الأذونات، قم بتعيين ملكية مجلدات التخزين ومجلدات التمهيد/ذاكرة التخزين المؤقت:
sudo chown -R 1000:1000 src/storage src/bootstrap/cacheالخلاصة والتوصية النهائية
يُسهّل استخدام Docker Compose لتشغيل Laravel على Ubuntu 22.04 عملية التطوير والنشر، ويجعلها قابلة للتكرار والتوسع. باتباع هذا الدليل، يمكنك إعداد بيئة إنتاج آمنة وسريعة وسهلة الصيانة. PHP-FPM مع Nginx، MySQL/MariaDB أو PostgreSQL، Redis للتخزين المؤقت وقائمة الانتظار، وإعدادات SSL والمراقبة.
الخدمات ذات الصلة
لتنفيذ هذه البنية بشكل احترافي، يمكنك استخدام الخدمات التالية:
- أكثر من 85 موقعًا عالميًا لتقليل زمن الاستجابة وتقريب الخادم من المستخدم أو الوجهة
- خادم الرسومات (GPU) للحوسبة والعرض باستخدام الذكاء الاصطناعي
- خادم افتراضي خاص للتداول مع زمن استجابة منخفض وشبكة BGP محسّنة
- خادم افتراضي خاص للألعاب مع زمن استجابة منخفض وحماية من هجمات DDoS
- خدمات الاستضافة وتسجيل النطاقات، وشبكات توصيل المحتوى (CDN)، وحلول الشبكات وبروتوكول بوابة الحدود (BGP).
- خادم سحابي عالي الأداء ونسخ احتياطي مُدار









