- چطور 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 — دو راه ساده
- راهاندازی در بوت و حفظ سرویس
- نکات امنیتی عملی
- بهینهسازی عملکرد برای محیط تولید
- Queue workers و Horizon
- نکات مرتبط با لوکیشن و انتخاب دیتاسنتر
- پشتیبانگیری، مانیتورینگ و لاگها
- اشکالزدایی رایج
- نتیجهگیری و توصیه نهایی
- خدمات مرتبط
- Часто задаваемые вопросы
چطور Laravel را با Docker Compose روی Ubuntu 22.04 نصب و راهاندازی کنیم؟
در این راهنمای عملی و فنی، گامبهگام نصب و پیکربندی یک اپلیکیشن Laravel С использованием Docker Compose روی سرور Убунту 22.04 شرح داده شده است. هدف این مطلب فراهم کردن دستورالعملهای قابل تکرار برای توسعهدهندگان، تیمهای DevOps و مدیران فنی است تا یک محیط تولیدی امن، قابلاسکیل و قابل نگهداری بهوجود آورند.
چکلیست اولیه
قبل از شروع، موارد زیر را آماده کنید:
- Сервер Убунту 22.04 با دسترسی root یا کاربر دارای 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سپس از سیستم خارج و دوباره وارد شوید یا از newgrp docker Использовать.
برای بررسی نصب:
docker --version
docker compose versionساختار پیشنهادی پروژه
پیشنهاد میشود پوشه پروژه به شکل زیر سازماندهی شود تا نگهداری و توسعه سادهتر باشد:
project-root/docker/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 (app):
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.comSSL و Let’s Encrypt — دو راه ساده
برای فعالسازی HTTPS دو راه ساده وجود دارد:
- استفاده از Certbot روی host: Nginx را موقتا متوقف کنید، گواهی صادر شده را در پوشه
./certsقرار دهید و آن را به کانتینر mount کنید. - استفاده از راهکار خودکار: ابزارهایی مانند docker-letsencrypt-nginx-proxy-companion Или Traefik برای مدیریت خودکار گواهی مناسباند.
مثال سریع با 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 از restart: unless-stopped استفاده شده است. در صورت نیاز میتوان یک unit systemd برای docker-compose ساخت.
نکات امنیتی عملی
- استفاده از کاربر غیرِ root در کانتینر PHP (
appuserدر Dockerfile بالا) - محدود کردن دسترسی به پورت دیتابیس با فایروال (UFW):
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enableسایر توصیهها:
- بکاپگیری منظم از حجم دیتابیس (
db_data) و نگهداری آن خارج از سرور - فعالسازی HTTPS و HSTS
- استفاده از secrets یا سرویس مدیریت کلید برای نگهداری رمزها (Docker secrets یا سرویسهای مدیریت کلید)
- استفاده از ابزارهای امنیتی مثل фейл2бан و در صورت نیاز WAF مانند ModSecurity
- استفاده از CDN یا سرویس Anti-DDoS برای محافظت از ترافیک
بهینهسازی عملکرد برای محیط تولید
- فعالسازی OPcache در
php.ini:opcache.memory_consumption=256 opcache.validate_timestamps=0 - تنظیم php-fpm (pm = dynamic یا ondemand) و افزایش
max_childrenمطابق با حافظه سرور - استفاده از Redis برای cache و session
- استفاده از CDN برای فایلهای استاتیک
- Horizontal scaling: اجرای چند instance از سرویس app با load balancer (NGINX یا HAProxy)
- برای real-time و queue از workerهای جداگانه و supervisor یا سرویسهای مجزا استفاده کنید
Queue workers و Horizon
برای اجرای queue workers یک سرویس جداگانه در 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/احراز هویت قرار دهید.
نکات مرتبط با لوکیشن و انتخاب دیتاسنتر
نکات عملی برای انتخاب لوکیشن:
- برای کمترین latency سرور را در لوکیشن نزدیک به کاربران نهایی یا مقصد انتخاب کنید. شرکت ارائهدهنده خدمات بیش از 85 представительств по всему миру دارد.
- برای گیمرها یا تریدرها، لوکیشنی با پینگ پایین و شبکه BGP بهینه انتخاب کنید.
- برای پردازشهای AI و رندرینگ از سرورهای دارای GPU استفاده کنید.
- برای مقاومت در برابر DDoS از سرورها و CDN دارای محافظت Anti-DDoS بهره ببرید.
پشتیبانگیری، مانیتورینگ و لاگها
- لاگهای کانتینرها با
docker logsقابل دسترسی هستند؛ برای جمعآوری مرکزی از ELK یا Prometheus+Grafana استفاده کنید. - بکاپ دیتابیس روزانه و انجام تست Restore دورهای
- مانیتورینگ منابع CPU/RAM، اپلیکیشن و پیگیری خطاها در CI/CD
اشکالزدایی رایج
- خطای 502 Bad Gateway: بررسی کنید php-fpm در کانتینر app اجرا شود و fastcgi_pass به آدرس درست (
app:9000) اشاره کند. - مشکل اتصال به دیتابیس: متغیرهای .env، شبکه docker و لاگهای MySQL را بررسی کنید.
- مجوزهای فایل: در صورت خطاهای permission، مالکیت پوشههای storage و bootstrap/cache را تنظیم کنید:
sudo chown -R 1000:1000 src/storage src/bootstrap/cacheنتیجهگیری و توصیه نهایی
استفاده از Docker Compose برای اجرای Laravel روی Ubuntu 22.04 توسعه و استقرار را ساده، قابل تکرار و قابل مقیاس میکند. با پیروی از این راهنما میتوانید یک محیط تولیدی امن، سریع و قابل نگهداری راهاندازی کنید: PHP-FPM همراه با Nginx، MySQL/MariaDB یا PostgreSQL، Redis برای cache و queue، و تنظیمات SSL و مانیتورینگ.
خدمات مرتبط
برای پیادهسازی حرفهای این معماری میتوانید از خدمات زیر بهره ببرید:
- Больше, чем 85 представительств по всему миру برای کاهش latency و نزدیک کردن سرور به کاربر یا مقصد
- سرور گرافیکی (GPU) برای محاسبات AI و رندرینگ
- VPS مخصوص ترید با پینگ پایین و شبکه BGP بهینه
- VPS مخصوص گیم با پینگ پایین و Anti-DDoS
- خدمات هاست و ثبت دامنه، CDN و راهکارهای شبکه و BGP
- سرور ابری با عملکرد بالا و بکاپ مدیریتشده









