دواپس و لینوکس
استقرار لاراول و Vue روی اوبونتو
اولین باری که یک اپ لاراول و Vue (با Inertia) را روی یک VPS لخت اوبونتو مستقر کردم، سه آموزش مختلف را دنبال کردم و باز هم به یک صفحه سفید، خطاهای 502 و یک worker صف رسیدم که بیصدا مرده بود. یک آخر هفته طول کشید تا درست شود. این همان راهنمایی است که آرزو میکردم داشتم — کامل، مرتب و صادق درباره بخشهایی که آدمها را زمین میزنند.
چه چیزی را مستقر میکنیم
پشته:
- Ubuntu 22.04 LTS روی یک VPS (هتزنر، دیجیتالاوشن، هر چه)
- Nginx بهعنوان reverse proxy و سرور فایل ایستا
- PHP 8.3 + PHP-FPM برای لاراول
- Node.js برای ساخت داراییهای فرانتاند (Vite)
- PostgreSQL (یا MySQL) برای پایگاه داده
- Redis برای کش و صفها
- Supervisor برای workerهای صف و زمانبند
استقرار یک قدم نیست — یک توالی است. از یک قدم بپرید و نیمهشب دیباگش میکنید.
قدم ۱: خط پایه سرور
قبل از هر چیز، سرور را سختسازی کنید. یک کاربر غیر-root بسازید، ورود SSH با رمز را غیرفعال کنید، UFW را فعال کنید:
adduser deploy
usermod -aG sudo deploy
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable
ضروریات را نصب کنید: git curl unzip. منطقه زمانی را تنظیم کنید. بهروزرسانیهای امنیتی خودکار را فعال کنید. این را در پست راهاندازی اوبونتو با جزئیات بیشتر پوشش دادم، اما از آن نپرید — یک پورت باز یک دعوتنامه است.
قدم ۲: نصب پشته رانتایم
# PHP 8.3 و افزونهها
sudo apt install php8.3-fpm php8.3-cli php8.3-pgsql php8.3-redis \
php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip php8.3-gd
# Node.js 20 LTS
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs
# PostgreSQL و Redis
sudo apt install postgresql redis-server
قدم ۳: کلون و پیکربندی اپ
cd /var/www
sudo git clone git@github.com:you/your-app.git
sudo chown -R deploy:www-data your-app
cd your-app
cp .env.example .env
php artisan key:generate
.env را برای تولید ویرایش کنید: APP_ENV=production، APP_DEBUG=false، اعتبارنامههای پایگاه داده، Redis، ایمیل و APP_URL واقعیتان را تنظیم کنید.
قدم ۴: ساخت و بهینهسازی
composer install --no-dev --optimize-autoloader
npm ci
npm run build
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
قدم npm run build داراییهای Vue/Inertia شما را از طریق Vite به public/build/ کامپایل میکند. اگر از این بپرید، اپ شما بدون CSS و بدون جاوااسکریپت بارگذاری میشود — همان صفحه سفید کلاسیک.
قدم ۵: پیکربندی Nginx
server {
listen 80;
server_name yourdomain.com;
root /var/www/your-app/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
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 ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 30d;
access_log off;
}
}
سایت را فعال کنید، کانفیگ را تست و Nginx را ریلود کنید. مجوزهای درست را روی storage/ و bootstrap/cache/ بگذارید — لاراول باید آنجا بنویسد.
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache
قدم ۶: SSL با Let's Encrypt
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com
Certbot کانفیگ Nginx شما را تغییر میدهد و تمدید خودکار را راهاندازی میکند. با sudo certbot renew --dry-run تأیید کنید.
قدم ۷: workerهای صف با Supervisor
صفهای لاراول خودشان اجرا نمیشوند. Supervisor workerها را زنده نگه میدارد:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/your-app/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=deploy
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/your-app/storage/logs/worker.log
قدم ۸: زمانبند
یک ورودی cron برای زمانبند لاراول اضافه کنید:
* * * * * cd /var/www/your-app && php artisan schedule:run >> /dev/null 2>&1
اسکریپت استقرار برای بهروزرسانیها
استقرارهای تکراری را اتومات کنید:
#!/bin/bash
set -e
cd /var/www/your-app
git pull origin main
composer install --no-dev --optimize-autoloader
npm ci && npm run build
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
sudo supervisorctl restart laravel-worker:*
php artisan queue:restart
اشتباهات رایج
- فراموش کردن
npm run build. علت شماره یک صفحات خالی در تولید. APP_DEBUG=trueدر تولید. ردپای خطا را به دنیا نشان میدهد. هرگز.- مجوزهای فایل اشتباه. خطای 500 روی هر عملیات نوشتن اگر storage قابلنوشتن نباشد.
- نبود worker صف. jobها بیصدا تلنبار میشوند؛ ایمیلها هرگز فرستاده نمیشوند.
- کش نکردن کانفیگ/مسیرها. هر درخواست فایلهای کانفیگ را بیجهت از دیسک تجزیه میکند.
بهترین شیوهها
- از یک اسکریپت استقرار یا خط لوله CI استفاده کنید — استقرارهای دستی قدمها را فراموش میکنند.
.envرا بیرون از گیت نگه دارید؛ رازها را روی سرور یا از طریق یک vault مدیریت کنید.- فضای دیسک را مانیتور کنید — لاگها و jobهای شکستخورده بیصدا دیسک را پر میکنند.
- اسکریپت استقرار را قبل از اجرا در تولید، روی staging تست کنید.
جمعبندی
استقرار لاراول و Vue روی اوبونتو وقتی توالی را بدانید سرراست است: سرور را سختسازی کنید، پشته را نصب، اپ را پیکربندی، داراییها را بسازید، Nginx را تنظیم، SSL اضافه و workerها را با Supervisor زنده نگه دارید. هر قدمی را از قلم بیندازید و زیر فشار دیباگش میکنید. این راهنما را نشانه بگذارید، بهترتیب دنبال کنید و استقرار بعدیتان کسلکننده میشود — که دقیقاً همان چیزی است که میخواهید.