Cara Deploy Laravel 13 ke Production di Ubuntu Server Sendiri

Menjalankan php artisan serve pada laptop anda memang mudah. Tapi menjalankan aplikasi Laravel 13 di production — dengan HTTPS, deploy zero-downtime, migration yang tidak menjatuhkan site, queue worker yang kekal hidup selepas reboot, dan scheduler yang betul-betul berjalan — itulah sebabnya kebanyakan team memilih PaaS, dan bilnya.

Anda tak perlu begitu. Panduan ini membawa anda melalui deployment Laravel 13 taraf production pada satu server Ubuntu 24.04 yang anda miliki: mula-mula komponen utama dan cara menyambungkannya secara manual, kemudian hasil yang sama dengan Hanoo, di mana git push menjadi release yang sudah dibina, disahkan, dan boleh dirollback.

Ringkasnya: Laravel 13 memerlukan PHP 8.3 atau lebih baharu (8.4 ialah default yang baik). Setup production perlu PHP-FPM, web server yang menunjuk ke public/, database, Composer, Node.js untuk build Vite, susunan release atomik, queue worker di bawah process supervisor, scheduler yang berjalan setiap minit, dan HTTPS.

Apa yang Laravel 13 perlukan di production

Laravel 13 keluar pada Mac 2026 dan menaikkan versi PHP minimum kepada 8.3. Stack production yang biasa nampak seperti ini:

Susunan release zero-downtime

Tabiat production paling penting ialah jangan sekali-kali build dalam direktori yang sedang melayani trafik. Sebaliknya, setiap deploy ada direktori sendiri, dan symlink yang menentukan mana satu live:

/srv/app/
├── releases/
│ ├── 20261015-142210/
│ └── 20261016-091503/ ← new release, built here
├── shared/
│ ├── .env ← linked into every release
│ └── storage/ ← logs, sessions, uploads: survive deploys
└── current -> releases/20261016-091503

Setiap deploy akan clone commit ke dalam direktori release baharu, link shared/.env dan shared/storage ke dalamnya, install dependencies, build assets, run migrations, dan hanya selepas itu menukar arah current. Penukaran symlink bersifat atomik, jadi pengunjung hanya nampak release lama atau release baharu — tak pernah ada campuran separuh siap. Rollback pula cuma mengarahkan current ke release sebelumnya.

Pilihan 1: deploy Laravel 13 secara manual

1. Install PHP 8.4, Composer dan Node.js

Ubuntu 24.04 datang dengan PHP 8.3, yang memenuhi keperluan minimum Laravel 13. Untuk PHP 8.4, guna PPA Ondřej Surý:

sudo add-apt-repository ppa:ondrej/php && sudo apt update
sudo apt install php8.4-fpm php8.4-cli php8.4-mysql php8.4-mbstring php8.4-xml \
php8.4-curl php8.4-zip php8.4-bcmath php8.4-intl php8.4-redis php8.4-opcache

Install Composer 2 dari getcomposer.org (sahkan checksum installer), dan Node.js 22 atau 24 dari NodeSource atau version manager.

2. Buat deploy user dan database

Jalankan aplikasi sebagai user tanpa hak istimewa — jangan sekali-kali sebagai root, dan jangan guna www-data yang dikongsi dengan site lain:

sudo adduser --system --group --home /srv/app laravel

Buat database dan user khusus yang hanya boleh connect dari 127.0.0.1.

3. Arahkan web server ke current/public

Dengan Nginx, bahagian penting ialah:

server {
server_name app.example.com;
root /srv/app/current/public;
index index.php;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm-laravel.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
}
}

Perhatikan $realpath_root: ia resolve symlink semasa, jadi OPcache dan FPM terus nampak release baharu selepas switch, bukan hidangkan path lama. Sediakan PHP-FPM pool sendiri untuk laman ini, berjalan sebagai laravel user, kemudian tambah HTTPS dengan Certbot atau tukar ke Caddy, yang akan dapatkan sijil secara automatik.

4. Tulis skrip deploy

Teras setiap skrip deploy Laravel:

set -euo pipefail
RELEASE=/srv/app/releases/$(date +%Y%m%d-%H%M%S)
git clone --depth 1 --branch main git@github.com:acme/shop.git "$RELEASE"
ln -s /srv/app/shared/.env "$RELEASE/.env"
rm -rf "$RELEASE/storage" && ln -s /srv/app/shared/storage "$RELEASE/storage"
cd "$RELEASE"
composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction
npm ci && npm run build
php8.4 artisan migrate --force
php8.4 artisan optimize
ln -sfn "$RELEASE" /srv/app/current
sudo systemctl reload php8.4-fpm
php8.4 artisan queue:restart

Tambah release pruning, health check selepas switch, dan rollback path, dan anda sudah dapat asas sebuah alat deployment.

5. Queue workers dengan Supervisor

[program:laravel-queue]
command=php8.4 /srv/app/current/artisan queue:work --sleep=3 --tries=3 --max-time=3600
directory=/srv/app/current
user=laravel
numprocs=2
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
stopwaitsecs=3600

–max-time menyebabkan setiap worker keluar secara berkala, jadi Supervisor akan mulakan worker baharu yang dapat ambil code baharu dan membebaskan memori. Perintah queue:restart dalam skrip deploy memberitahu worker yang sedang berjalan supaya selesaikan job semasa dan keluar.

6. Scheduler

* * * * * cd /srv/app/current && php8.4 artisan schedule:run >> /dev/null 2>&1

Pasang scheduler ini dalam crontab milik laravel user, bukan dalam crontab root.

Pilihan 2: deploy Laravel 13 dengan Hanoo

Hanoo akan jalankan alur release di atas untuk anda, pada pelayan anda sendiri, dan setiap langkah boleh dilihat dalam dashboard.

Langkah 1: sambungkan pelayan anda

Jalankan perintah install sekali sahaja dari Connect server pada pelayan Ubuntu 22.04, 24.04 atau 26.04 LTS yang bersih. Agent akan sambung keluar melalui mutually authenticated TLS — tiada port pengurusan masuk, tiada root password dikongsi — dan anda meluluskan pelayan itu dalam dashboard. Aplikasi Laravel memerlukan sekurang-kurangnya 1 CPU core dan 2 GB RAM.

Langkah 2: cipta aplikasi daripada repository anda

Pilih Create application, pilih Laravel, dan hubungkan dengan repository anda di GitHub, GitLab atau Bitbucket. Pelayan akan menjana read-only deploy key; anda tambah public half-nya ke repository, manakala private half tidak akan keluar dari pelayan anda. Pilih PHP 8.4 (8.3–8.5 tersedia) dan tandakan pilihan database jika anda mahu database MariaDB peribadi.

Hanoo akan cipta pengguna Linux yang terasing dan PHP-FPM pool untuk aplikasi ini, serta menulis .env berdasarkan .env.example anda — dengan APP_ENV=production, APP_DEBUG=false, APP_URL ditetapkan kepada alamat aplikasi, database credentials diisi apabila anda minta database, dan APP_KEY yang baru dijana. Fail ini disimpan dalam shared directory aplikasi dan dihubungkan ke setiap release.

Langkah 3: apa yang berlaku setiap kali deploy

Setiap deploy:

  1. Mengambil commit terpilih ke dalam release baharu yang tidak boleh diubah.
  2. Mengesan toolchain anda daripada repository — composer.lock bermaksud Composer; pnpm-lock.yaml, package-lock.json atau yarn.lock menentukan pengurus pakej JavaScript — dan memasang versi Composer dan Node.js (20, 22 atau 24) yang disahkan checksum.
  3. Menjalankan composer install dan build aset anda sebagai pengguna aplikasi itu sendiri.
  4. Menautkan .env dan storage/ yang dikongsi ke dalam release, kemudian mengesahkannya.
  5. Menjalankan pipeline deploy anda — langkah seperti php artisan migrate –force, cache warm-up atau restart queue, yang dikumpulkan dalam fasa build, fasa sebelum pengaktifan, dan fasa selepas pengaktifan.
  6. Mengaktifkan release secara atomik, reload PHP-FPM, dan memeriksa sama ada site bertindak balas. Jika health check gagal, sistem akan kembali ke release sebelumnya secara automatik.

Setiap langkah diukur masanya dan outputnya dipaparkan, jadi build yang gagal memberitahu puncanya tanpa sesi SSH. Build yang gagal tidak akan menyentuh site yang sedang berjalan, dan sebarang release yang disimpan boleh dipulihkan dengan rollback satu klik.

Langkah 4: domain dan HTTPS

Tambahkan app.example.com di bawah tab Domains aplikasi anda. Hanoo memeriksa sama ada DNS menunjuk ke pelayan anda, mengeluarkan sijil Let’s Encrypt, dan mengaktifkan site tanpa downtime.

Langkah 5: queue dan scheduler

Secara default, .env menggunakan QUEUE_CONNECTION=sync, yang menjalankan jobs di dalam web request. Untuk pemprosesan background sebenar:

  • Pasang Valkey daripada Manage Services pada pelayan (ia serasi dengan Redis, jadi driver redis Laravel berfungsi tanpa sebarang perubahan), atau gunakan driver queue database. Kemudian tetapkan QUEUE_CONNECTION dan, jika anda menggunakan Valkey, CACHE_STORE serta SESSION_DRIVER dalam .env melalui SSH sebagai pengguna aplikasi.
  • Tambahkan program Supervisor untuk aplikasi yang menjalankan php8.4 artisan queue:work –sleep=3 –tries=3 –max-time=3600. Program ini berjalan sebagai pengguna aplikasi dalam release semasanya; anda boleh memulakan, menghentikan, dan memulakan semula program tersebut, serta membaca lognya daripada dashboard.
  • Tambahkan entri di bawah tab Cron jobs aplikasi anda untuk menjalankan php8.4 artisan schedule:run setiap minit. Anda boleh menjalankannya secara on-demand dan melihat hasil serta output terkini.

Senarai semak production untuk Laravel 13

  • APP_ENV=production dan APP_DEBUG=false — mod debug akan membocorkan environment variables dalam halaman ralat.
  • Selepas setiap deploy, jalankan php artisan optimize untuk menyimpan cache config, routes, views dan events.
  • Pastikan OPcache diaktifkan; dengan susunan symlink atomik, selesaikan path menggunakan realpath supaya release baharu dapat digunakan.
  • Letakkan sessions, cache dan queues pada Valkey/Redis atau database — bukan pada file, apabila anda sudah mempunyai lebih daripada satu worker.
  • Pastikan storage/ dan .env berada di luar direktori release, dikongsi merentas semua release.
  • Migrasi perlu serasi dengan release terdahulu, supaya rollback tidak merosakkan aplikasi.
  • Mulakan semula queue workers pada setiap deploy, dengan –max-time sebagai jaring keselamatan.
  • Jalankan scheduler setiap minit sebagai pengguna aplikasi.
  • Buat backup database dan storage/app di luar server.

Soalan Lazim

Apakah versi PHP yang diperlukan oleh Laravel 13?

Laravel 13 memerlukan PHP 8.3 atau lebih baharu, dan menyokong PHP 8.3, 8.4 serta 8.5. PHP 8.4 ialah default yang wajar untuk produksi hari ini.

Bagaimana cara deploy Laravel tanpa downtime?

Bina setiap release dalam direktorinya sendiri, kongsi .env dan storage/ antara release, jalankan migrasi sebelum pertukaran, kemudian arahkan semula symlink current kepada release baharu secara atomik dan reload PHP-FPM. Hanoo melakukan tepat perkara ini pada setiap deploy, dan kembali secara automatik jika release baharu gagal health check.

Adakah anda perlukan Laravel Forge atau PaaS untuk hosting Laravel?

Tidak. Mana-mana server Ubuntu dengan PHP-FPM, server web, database dan Supervisor boleh menjalankan Laravel dalam produksi. Alat seperti Hanoo mengautomasi setup dan alur release, sementara server dan kod tetap sepenuhnya milik anda.

Bagaimana cara menjalankan Laravel queue workers dalam produksi?

Jalankan php artisan queue:work di bawah process supervisor seperti Supervisor, sebagai pengguna aplikasi, dengan –max-time supaya worker dikitar semula, dan jalankan php artisan queue:restart selepas setiap deploy supaya mereka memuatkan kod baharu.

Bagaimana cara menjalankan Laravel scheduler pada server?

Tambah satu entri cron yang menjalankan php artisan schedule:run setiap minit dari direktori semasa aplikasi. Laravel menentukan tugas berjadual mana yang perlu dijalankan setiap kali cron berjalan.

Bolehkah saya guna Valkey sebagai ganti Redis dengan Laravel?

Ya. Valkey ialah fork open-source Redis yang menggunakan protokol yang sama, jadi driver redis cache, session dan queue Laravel berfungsi dengannya tanpa sebarang perubahan.

Asalnya diterbitkan di blog Hanoo.


Sumber Rujukan:

  • Artikel asal: Dev.to PHP
  • Diterjemah daripada artikel asal ke Bahasa Melayu oleh AI Editorial – haqis.com
Comments

Similar Posts