Deploy Laravel روی Ubuntu — راهنمای گام‌به‌گام استقرار

آموزش کامل و قدم‌به‌قدم استقرار پروژه Laravel روی سرور Ubuntu 22.04. از اتصال SSH تا تنظیم Nginx، PHP-FPM، MySQL، Redis، Supervisor و SSL با Certbot.

نویسنده

تیم فنی زیر ساخت افرادین

دسته‌بندی

آموزش

زمان مطالعه

02 Mins read

تاریخ انتشار

28 Jul, 2026

Deploy Laravel روی Ubuntu — راهنمای گام‌به‌گام استقرار

پروژه Laravel شما روی لوکال کار می‌کند، تمام تست‌ها پاس می‌شوند، و حالا نوبت به هیجان‌انگیزترین بخش رسیده: Deploy روی سرور واقعی. اما اگر اولین بار است که یک پروژه Laravel را روی Ubuntu دیپلوی می‌کنید، ممکن است با انبوهی از تنظیمات—از Nginx و PHP-FPM گرفته تا Supervisor و SSL—روبه‌رو شوید.

در این راهنما، تمام مراحل را قدم‌به‌قدم و به زبان ساده توضیح می‌دهیم. فرض می‌کنیم شما یک VPS با Ubuntu 22.04 LTS دارید و دسترسی root یا کاربر sudo به آن دارید.

پیش‌نیازها

قبل از شروع، مطمئن شوید که موارد زیر را دارید:

  • یک VPS لینوکسی با Ubuntu 22.04 LTS (حداقل ۲ گیگ RAM، توصیه ۴ گیگ)
  • دسترسی SSH به سرور با کلید یا رمز عبور
  • دامنه متصل به سرور (A Record تنظیم شده باشد)
  • پروژه Laravel آماده روی GitHub / GitLab

گام اول — اتصال به سرور و بروزرسانی

اولین قدم، اتصال به VPS از طریق SSH است:

ssh root@your-server-ip

پس از ورود، همیشه اول سیستم را بروزرسانی کنید:

sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common curl wget unzip git

یک کاربر غیر-root برای امنیت بیشتر بسازید:

adduser deployer
usermod -aG sudo deployer

حالا با کاربر جدید ادامه می‌دهیم:

su - deployer

گام دوم — نصب PHP 8.3 و افزونه‌های لازم

Laravel 11 به PHP 8.2 یا بالاتر نیاز دارد. ما PHP 8.3 را از مخزن Ondřej Surý نصب می‌کنیم:

sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install -y php8.3 php8.3-fpm php8.3-cli \
  php8.3-mbstring php8.3-xml php8.3-curl \
  php8.3-mysql php8.3-sqlite3 php8.3-redis \
  php8.3-gd php8.3-zip php8.3-bcmath php8.3-intl

نکته: افزونه php8.3-redis را فقط اگر از Redis استفاده می‌کنید نصب کنید. برای پروژه‌های ساده، php8.3-sqlite3 هم کافی است.

سرویس PHP-FPM را اجرا و فعال کنید:

sudo systemctl enable php8.3-fpm
sudo systemctl start php8.3-fpm

تأیید کنید که PHP-FPM در حال اجراست:

sudo systemctl status php8.3-fpm

گام سوم — نصب Composer

Composer مدیر بسته‌های PHP است و برای Laravel ضروری:

cd ~
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer --version

باید خروجی مشابه Composer version 2.7.x ببینید.

گام چهارم — نصب Nginx

Nginx به عنوان وب‌سرور اصلی و Reverse Proxy عمل می‌کند:

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

حالا باید در مرورگر IP سرور خود را ببینید—صفحه پیش‌فرض Nginx.

تنظیم فایل Nginx برای Laravel

یک فایل کانفیگ جدید بسازید:

sudo nano /etc/nginx/sites-available/your-domain.com

محتوای زیر را قرار دهید (دامنه و مسیر را جایگزین کنید):

server {
    listen 80;
    server_name your-domain.com www.your-domain.com;
    root /var/www/your-project/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.3-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-domain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

گام پنجم — نصب MySQL (یا MariaDB)

sudo apt install -y mysql-server
sudo mysql_secure_installation

در mysql_secure_installation رمز root را تنظیم کنید و به تمام سوالات Yes بگویید.

ساخت دیتابیس و کاربر:

sudo mysql -u root -p
CREATE DATABASE laravel_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'strong-password-here';
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

گام ششم — نصب Node.js (برای کامپایل Assets)

پروژه‌های Laravel معمولاً از Vite برای مدیریت assets استفاده می‌کنند:

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node --version  # باید v20.x.x باشد
npm --version

گام هفتم — کلون و دیپلوی پروژه

cd /var/www
sudo git clone https://github.com/your-username/your-repo.git your-project
sudo chown -R deployer:www-data your-project
cd your-project

نصب dependencies:

composer install --no-dev --optimize-autoloader
npm install
npm run build

تنظیم فایل .env:

cp .env.example .env
nano .env

مقادیر زیر را متناسب با پروژه خود تنظیم کنید:

APP_NAME="پروژه شما"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-domain.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=strong-password-here

تولید Application Key و اجرای migration:

php artisan key:generate
php artisan storage:link
php artisan migrate --force
php artisan optimize

گام هشتم — تنظیم Supervisor برای Queue Worker

اگر پروژه شما از Queue استفاده می‌کند، باید یک worker دائمی اجرا کنید:

sudo apt install -y supervisor

فایل کانفیگ Supervisor بسازید:

sudo nano /etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/your-project/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=deployer
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/your-project/storage/logs/worker.log
stopwaitsecs=3600

فعال‌سازی worker:

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

وضعیت worker را چک کنید:

sudo supervisorctl status

گام نهم — تنظیم SSL با Certbot

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com -d www.your-domain.com

Certbot به صورت خودکار SSL را در Nginx تنظیم می‌کند و تمدید خودکار را فعال می‌کند.

تست تمدید خودکار:

sudo certbot renew --dry-run

گام دهم — تنظیم Cron برای Scheduler

Laravel Scheduler وظایف زمان‌بندی شده را مدیریت می‌کند:

crontab -e

این خط را اضافه کنید:

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

چک‌لیست نهایی

قبل از تحویل پروژه، این موارد را دوباره بررسی کنید:

  • APP_DEBUG=false در فایل .env
  • SSL فعال و معتبر است
  • فایروال فقط پورت‌های 22، 80 و 443 را باز دارد: sudo ufw allow 22/tcp && sudo ufw allow 80/tcp && sudo ufw allow 443/tcp && sudo ufw enable
  • Supervisor worker فعال و running است
  • composer install با فلگ --no-dev اجرا شده
  • cron job برای Scheduler تنظیم شده
  • بک‌آپ خودکار دیتابیس تنظیم شده

تبریک! 🎉 پروژه Laravel شما روی Ubuntu 22.04 در حال اجراست. برای پروژه‌های بزرگ‌تر که نیاز به مقیاس‌پذیری دارند، می‌توانید از Docker + Docker Compose یا Kubernetes استفاده کنید که در مقاله بعدی به آن می‌پردازیم.


نکته تیم افرادین: اگر زمان کافی برای طی این مراحل را ندارید، سرورهای ابری افرادین با Laravel Stack از پیش نصب شده (PHP 8.3، MySQL، Redis، Nginx، Supervisor و Certbot) در کمتر از ۵ دقیقه آماده تحویل هستند. کافیست پروژه خود را push کنید.

پست های مرتبط

Docker روی VPS — راهنمای کامل نصب و اجرا

داشتن یک VPS خوب عالی است، اما مدیریت دستی سرویس‌ها—از PHP و Nginx گرفته تا MySQL و Redis—می‌تواند کابوس باشد. Docker این مشکل را حل می‌کند: هر سرویس در کانتینر ایزوله خودش اجرا می‌شود، با یک دستور docker compose up -d کل پروژه بالا می‌آید، و بدترین سناریو این است که با docker compose down همه چیز را ریست کنید. در این راهنما، از صفر مطلق شروع می‌کنیم—نصب Docker روی VPS تازه، اجرای اولین کانتینر، نوشتن فایل docker-compose.yml برای یک پروژه واقعی، و در نهایت تنظیمات امنیتی و monitoring. پیش‌نیازهاVPS با Ubuntu 22.04 یا 24.04 (حداقل ۲ گیگ RAM، توصیه ۴ گیگ) دسترسی SSH با کاربر sudo حداقل ۲۰ گیگابایت فضای خالی (Imageهای Docker سریع حجم می‌گیرند!)گام اول — اتصال و آماده‌سازی سرور ssh your-user@vps-ip sudo apt update && sudo apt upgrade -yپکیج‌های پایه را نصب کنید: sudo apt install -y ca-certificates curl gnupg lsb-releaseگام دوم — نصب Docker Engine (روش رسمی) Docker را از مخزن رسمی Docker—نه مخزن Ubuntu—نصب می‌کنیم. نسخه Ubuntu قدیمی است و باگ دارد. # اضافه کردن GPG key رسمی Docker sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg# اضافه کردن مخزن Docker 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حالا Docker را نصب کنید: sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io \ docker-buildx-plugin docker-compose-pluginنکته مهم: docker-compose-plugin همان Docker Compose V2 است که به صورت docker compose (با space، نه dash) اجرا می‌شود. نسخه قدیمی docker-compose منسوخ شده. گام سوم — اجرای Docker بدون sudo به صورت پیش‌فرض فقط root می‌تواند Docker اجرا کند. برای راحتی، کاربر خود را به گروه docker اضافه کنید: sudo usermod -aG docker $USER newgrp dockerحالا بدون sudo تست کنید: docker run hello-worldاگر پیام Hello from Docker! را دیدید، همه چیز آماده است. گام چهارم — اولین پروژه Docker: Nginx بیایید با یک مثال ساده مطمئن شویم همه چیز کار می‌کند: docker run -d --name my-nginx -p 8080:80 nginx:alpineحالا در مرورگر به http://your-vps-ip:8080 بروید—باید صفحه پیش‌فرض Nginx را ببینید. متوقف کردن کانتینر: docker stop my-nginx docker rm my-nginxگام پنجم — Docker Compose: اجرای پروژه واقعی حالا یک پروژه واقعی با Docker Compose اجرا می‌کنیم. فرض کنید یک اپلیکیشن Node.js با MongoDB دارید. ساخت پوشه پروژه: mkdir ~/myapp && cd ~/myappفایل docker-compose.yml را بسازید: version: '3.8'services: app: image: node:20-alpine container_name: myapp-node working_dir: /app volumes: - ./app:/app ports: - "3000:3000" command: sh -c "npm install && node server.js" depends_on: mongo: condition: service_healthy restart: unless-stopped networks: - app-network mongo: image: mongo:7 container_name: myapp-mongo volumes: - mongo_data:/data/db environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-secret} restart: unless-stopped networks: - app-network healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh --quiet interval: 10s timeout: 5s retries: 5 mongo-express: image: mongo-express:latest container_name: myapp-mongo-ui ports: - "8081:8081" environment: ME_CONFIG_MONGODB_ADMINUSERNAME: admin ME_CONFIG_MONGODB_ADMINPASSWORD: ${MONGO_PASSWORD:-secret} ME_CONFIG_MONGODB_URL: mongodb://admin:${MONGO_PASSWORD:-secret}@mongo:27017/ depends_on: mongo: condition: service_healthy restart: unless-stopped networks: - app-networknetworks: app-network: driver: bridgevolumes: mongo_data:اجرای پروژه: docker compose up -dمشاهده وضعیت: docker compose ps docker compose logs -fمتوقف کردن: docker compose downگام ششم — مدیریت Volume‌ها و بک‌آپ داده‌های داخل کانتینر ephemeral هستند—با حذف کانتینر، داده‌ها از بین می‌روند. برای ذخیره دائمی از Volume استفاده کنید. مشاهده Volumeها: docker volume lsبک‌آپ گرفتن از Volume (مثلاً دیتابیس MongoDB): docker run --rm -v myapp_mongo_data:/data -v $(pwd):/backup alpine \ tar czf /backup/mongo-backup-$(date +%Y%m%d).tar.gz -C /data .بازگردانی بک‌آپ: docker run --rm -v myapp_mongo_data:/data -v $(pwd):/backup alpine \ tar xzf /backup/mongo-backup-20260801.tar.gz -C /dataگام هفتم — امنیت کانتینرها ۱. همیشه از imageهای رسمی و trusted استفاده کنید # خوب ✅ docker pull node:20-alpine docker pull nginx:alpine# بد ❌ docker pull some-random-user/unknown-image۲. کانتینرها را با کاربر non-root اجرا کنید services: app: image: node:20-alpine user: "1000:1000" # UID:GID کاربر غیر-root۳. Resource Limits تنظیم کنید بدون limit، یک کانتینر می‌تواند تمام RAM و CPU سرور را مصرف کند: services: app: image: node:20-alpine deploy: resources: limits: cpus: '1.0' memory: 512M reservations: cpus: '0.5' memory: 256M۴. اسکن امنیتی imageها docker scout quickview nginx:alpine docker scout cves nginx:alpine۵. فایروال Docker را دور نزنید Docker به صورت پیش‌فرض قوانین iptables را دستکاری می‌کند و ممکن است پورت‌ها را بدون اجازه UFW باز کند. برای جلوگیری: sudo nano /etc/docker/daemon.json{ "iptables": false, "ip-forward": false }و سپس: sudo systemctl restart dockerگام هشتم — Monitoring و عیب‌یابی Docker Stats (لحظه‌ای) docker statsPortainer — مدیریت گرافیکی Docker docker volume create portainer_data docker run -d \ -p 9443:9443 -p 8000:8000 \ --name portainer --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latestحالا در مرورگر به https://your-vps-ip:9443 بروید—یک داشبورد کامل برای مدیریت Docker دارید. لاگ‌های متمرکز با Dozzle docker run -d --name dozzle \ -v /var/run/docker.sock:/var/run/docker.sock \ -p 8080:8080 \ amir20/dozzle:latestپاکسازی دوره‌ای Docker imageهای قدیمی و استفاده نشده می‌توانند گیگابایت‌ها فضا اشغال کنند: # پاکسازی imageهای بدون تگ docker image prune -a -f# پاکسازی volumeهای استفاده نشده docker volume prune -f# پاکسازی همه چیز (با احتیاط!) docker system prune -a --volumes -fیک cron job هفتگی برای پاکسازی خودکار تنظیم کنید: crontab -e0 3 * * 0 docker system prune -a -f --filter "until=168h"مقایسه: Docker روی VPS vs Kubernetesمعیار Docker Compose روی VPS Kubernetesپیچیدگی راه‌اندازی ⭐ کم ⭐⭐⭐⭐⭐ بالامناسب برای ۱-۱۰ کانتینر، استارتاپ‌ها ۲۰+ کانتینر، EnterpriseAuto-scaling ❌ دستی ✅ خودکارLoad balancing نیاز به Nginx دستی ✅ داخلی (Ingress)هزینه فقط هزینه VPS هزینه cluster + managementیادگیری ۱-۲ روز ۱-۳ ماهبرای ۹۰٪ پروژه‌ها، Docker Compose روی یک VPS خوب بیش از حد کافی است. وقتی به ۱۰+ میکروسرویس رسیدید و نیاز به auto-scaling و zero-downtime deployment دارید، آن وقت Kubernetes را در نظر بگیرید.نکته تیم افرادین: سرورهای ابری افرادین با Docker Engine و Docker Compose از پیش نصب شده و بهینه‌شده عرضه می‌شوند. کافیست فایل docker-compose.yml خود را push کنید و پروژه در چند دقیقه بالا می‌آید. Portainer و Dozzle هم با یک کلیک قابل نصب هستند.

تیم فنی زیر ساخت افرادین

تیم فنی و مهندسی

30 Jul, 2026