Blog · 1 Nov 2026 · 5 min read
Menyiapkan Supervisor, systemd, dan PM2 di VPS untuk Laravel queue dan Node.js worker
Panduan singkat memilih antara systemd, Supervisor dan PM2 serta langkah setup dan cutover tanpa downtime untuk Laravel queue dan Node.js worker di VPS.
By Tim Gocelerus
Masalah: Anda ingin menjalankan Laravel queue (php artisan queue:work / Horizon) dan worker Node.js di VPS, dan melakukan cutover dari shared hosting tanpa downtime untuk job dan file.
Mengapa ada tiga alat berbeda
-
systemd
- Sudah tersedia di Debian/Ubuntu modern dan terintegrasi dengan proses boot.
- Memberi opsi limit sumber daya langsung di unit file (MemoryMax=, CPUQuota=) dan biasanya lebih sedikit lapisan operasi.
- Sering direkomendasikan sebagai default untuk proses server di VPS. (lihat sumber).
-
Supervisor
- Daemon Python yang mengelola proses; berguna kalau tim sudah terbiasa atau ingin satu manager menangani banyak program.
- Konfigurasi sentral di /etc/supervisor/conf.d/ membuatnya mudah mengelola beberapa worker.
-
PM2
- Dirancang untuk Node.js: clustering, restart zero-downtime, ekosistem tooling.
- Memiliki perintah
pm2 startupyang bisa meng-generate service systemd untuk boot otomatis.
Rekomendasi singkat: gunakan systemd (atau Supervisor jika tim sudah mengandalkannya) untuk proses PHP/Laravel; gunakan PM2 untuk worker Node.js kecuali ada alasan khusus pakai Supervisor untuk Node.
Persiapan umum sebelum setup
- Pastikan user yang menjalankan worker ada dan punya izin membaca/menulis ke direktori aplikasi.
- Tentukan backend queue Anda (database, Redis, dll.). Jika queue menyimpan job di service yang harus dimigrasi, rencanakan replikasi/migrasi service tersebut juga.
- Siapkan mekanisme sinkron file antara sumber dan tujuan (lihat bagian cutover).
Contoh: systemd untuk Laravel queue
- Buat file unit, misal
/etc/systemd/system/laravel-queue.service:
[Unit]
Description=Laravel Queue Worker
After=network.target
[Service]
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /path/to/artisan queue:work --sleep=3 --tries=3
RestartSec=5
# batas sumber daya contoh
MemoryMax=200M
CPUQuota=50%
[Install]
WantedBy=multi-user.target
- Aktifkan dan jalankan:
sudo systemctl daemon-reload
sudo systemctl enable --now laravel-queue.service
Catatan: Ganti User, Group, dan path artisan sesuai instalasi Anda. Nilai MemoryMax/CPUQuota hanya contoh — sesuaikan berdasarkan kapasitas VPS.
Contoh: Supervisor untuk Laravel (opsional)
- Install Supervisor dan buat file di
/etc/supervisor/conf.d/laravel-worker.conf:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/artisan queue:work --sleep=3 --tries=3
numprocs=3
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/log/laravel-worker.log
- Reload konfigurasi Supervisor:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl restart laravel-worker:*
Gunakan Supervisor bila Anda ingin satu daemon mengontrol banyak program dengan konfigurasi berbasis file seperti di atas.
Contoh: PM2 untuk worker Node.js
- Dari direktori aplikasi Node.js, jalankan:
pm2 start worker.js --name my-worker
pm2 save
- Buat startup script systemd agar PM2 otomatis jalan setelah reboot:
pm2 startup systemd
# ikuti perintah yang dihasilkan untuk menulis service ke systemd
Untuk pengaturan lebih lanjut, gunakan ecosystem.config.js agar Anda bisa mendefinisikan instance, environment, dan opsi restart.
Zero‑downtime cutover: rsync + replikasi database + DNS TTL (ringkas)
Prinsip utamanya: lakukan sinkron file berulang, pastikan data transaksi (DB) tetap sinkron, lalu pada cutover lakukan langkah singkat sehingga jeda penulisan hanya beberapa menit.
-
Turunkan TTL DNS 24–48 jam sebelum cutover ke nilai kecil (misalnya 300 detik).
-
Salin awal semua file dari sumber ke tujuan dengan rsync:
rsync -aHv --exclude='node_modules' --exclude='.git' /path/to/site/ user@target:/var/www/site/
-
Jalankan sinkronisasi berkelanjutan: gunakan lsyncd jika Anda ingin sinkronisasi realtime, atau jalankan rsync berkala (cron).
-
Setup replikasi database (contoh: MySQL GTID) agar transaksi tetap mengikuti ke target. Pastikan replika tidak lagging; verifikasi status replikasi sampai catch-up.
-
Cutover (window singkat):
- Hentikan penulisan ke sumber (non-aktifkan form/checkout atau set situs ke mode maintenance sementara).
- Stop worker di sumber agar tidak memproses job baru.
- Jalankan rsync final dengan opsi
--deleteuntuk memastikan tujuan persis sama:
rsync -aHv --delete --exclude='node_modules' /path/to/site/ user@target:/var/www/site/
- Putuskan replikasi (promote target jadi writable jika perlu) dan pastikan database pada target menerima penulisan.
- Start worker di target (systemd / Supervisor / PM2).
- Ganti A/AAAA record DNS ke IP tujuan.
- Pantau log dan worker. Setelah stabil, kembalikan TTL ke nilai normal (1800–3600 detik).
Catatan penting:
- Waktu untuk menurunkan TTL harus memperhitungkan TTL lama — turunkan 24–48 jam sebelum cutover agar cache global sempat kedaluwarsa.
- Jika queue Anda menggunakan Redis atau storage eksternal lain, rencanakan migrasi atau akses bersama pada cutover.
- Selalu uji proses ini di staging sebelum melakukan ke produksi.
Verifikasi dan pemulihan cepat
- Sebelum cutover, verifikasi unit systemd / Supervisor / PM2 berjalan di target dan memproses job test.
- Siapkan rollback plan: jika ada masalah setelah DNS berubah, Anda harus bisa memutar kembali DNS ke IP lama (ingat cache resolver) dan menonaktifkan worker di target.
- Pantau job queue length, error log, dan latensi permintaan beberapa menit pertama setelah cutover.
Penutup singkat
Gocelerus is cPanel web hosting for Southeast Asia, serving Indonesia and Cambodia first. Servers are in Singapore, with NVMe storage, LiteSpeed web server and Imunify360 security. Daily backups are included. Moving an existing website to Gocelerus is free (the team does the migration). Plans and prices are at https://gocelerus.com/pricing.