Appearance
Arsitektur VPS, Video Streaming & Manajemen Daemon Worker
Dokumen ini merangkum arsitektur infrastruktur server VPS (Ubuntu 24.04 LTS), konfigurasi Nginx reverse proxy untuk video streaming HTTP 206, dan manajemen background worker serta scheduler Laravel berbasis systemd pada aplikasi Dracin.
1. Ikhtisar Arsitektur VPS
Aplikasi Dracin dirancang mandiri (self-contained), ringan, dan zero-friction. Seluruh komponen berjalan terisolasi di dalam VPS Ubuntu 24.04 LTS tanpa memerlukan panel pihak ketiga yang membebani resource server:
2. Optimasi Nginx untuk Video Streaming (HTTP 206 Partial Content)
Pemutaran video modern (HTML5 <video>, Video.js, HLS.js) mewajibkan dukungan byte-range request untuk mendukung scrubbing (lompat durasi playback tanpa mengunduh seluruh berkas), instant start, dan smooth chunk streaming.
Konfigurasi Nginx Server Block
Nginx dikonfigurasi untuk menangani permintaan berkas media secara langsung dengan header streaming optimal:
nginx
# Ukuran maksimal unggahan dan payload
client_max_body_size 64M;
# Optimasi Video Streaming & Media Statis (HTTP 206 Range Requests)
location ~* \.(mp4|m4v|mkv|webm|ts|m3u8|mp3|ogg|aac|flv)$ {
try_files $uri $uri/ /index.php?$query_string;
expires 30d;
add_header Cache-Control "public, max-age=2592000";
add_header Accept-Ranges bytes;
add_header X-Accel-Buffering "no";
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS";
add_header Access-Control-Allow-Headers "Range, Origin, Content-Type, Accept";
add_header Access-Control-Expose-Headers "Content-Range, Content-Length, Accept-Ranges";
sendfile on;
sendfile_max_chunk 1m;
tcp_nopush on;
tcp_nodelay on;
}
# FastCGI PHP Buffer Optimization
location = /index.php {
include fastcgi_params;
fastcgi_pass unix:/run/php/dracin.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
}Rincian Header dan Direktif Penting:
HTTP/1.1 206 Partial Content&Accept-Ranges: bytes:- Memungkinkan peramban meminta potongan byte tertentu (misal
Range: bytes=0-1023). Nginx membalas hanya potongan tersebut bersama headerContent-Range: bytes 0-1023/{total_bytes}.
- Memungkinkan peramban meminta potongan byte tertentu (misal
X-Accel-Buffering: no:- Menonaktifkan proxy buffering Nginx sehingga paket video atau chunk streaming langsung dialirkan ke klien secara real-time tanpa penundaan buffer.
Cache-Control: public, max-age=2592000:- Memberikan instruksi caching browser selama 30 hari untuk potongan video yang tidak berubah, menghemat bandwidth VPS secara drastis.
- CORS Expose Headers (
Content-Range, Content-Length, Accept-Ranges):- Wajib untuk video player JavaScript modern (HLS.js / Dash.js / Video.js) agar dapat membaca metadata durasi dan potongan byte stream.
sendfile on&sendfile_max_chunk 1m:- Memanfaatkan zero-copy kernel Linux untuk mentransfer file dari disk langsung ke socket jaringan, dengan batas chunk 1 MB agar tidak memonopoli worker process Nginx.
3. Layanan Background Worker & Scheduler (Systemd)
Seluruh pemrosesan latar belakang (antrean pengiriman notifikasi, sinkronisasi data SendFox, dsb.) dan penjadwalan berkala dikelola oleh service unit native Ubuntu systemd.
1. dracin-worker.service (Queue Worker Daemon)
Berkas konfigurasi: /etc/systemd/system/dracin-worker.service
ini
[Unit]
Description=Dracin Queue Worker Daemon
After=network.target
Wants=network.target
[Service]
Type=simple
User=dracin
Group=dracin
WorkingDirectory=/var/www/dracin/current
ExecStart=/usr/bin/php8.4 /var/www/dracin/current/artisan queue:work --sleep=3 --tries=3 --max-time=3600
Restart=always
RestartSec=5s
TimeoutStopSec=60
KillMode=process
StandardOutput=journal
StandardError=journal
SyslogIdentifier=dracin-worker
[Install]
WantedBy=multi-user.targetFitur Worker:
- Identitas Aman: Berjalan di bawah user non-root
dracin:dracin. - Parameter Eksekusi:
--sleep=3: Istirahat 3 detik jika antrean kosong untuk menghemat CPU.--tries=3: Maksimal 3 kali percobaan sebelum job ditandai gagal.--max-time=3600: Worker otomatis restart tiap 1 jam untuk mencegah kebocoran memori PHP (memory leaks).
- Auto-Recovery:
Restart=alwaysdengan jedaRestartSec=5smenjamin pemulihan instan jika terjadi uncaught exception atau worker restart. - Logging Terpusat: Output diarahkan ke systemd journal (
journalctl -u dracin-worker).
2. dracin-scheduler.service & dracin-scheduler.timer (Cron Runner)
Pengganti crontab konvensional menggunakan pasangan service & timer native systemd.
Service Unit: /etc/systemd/system/dracin-scheduler.service
ini
[Unit]
Description=Dracin Laravel Scheduler Runner
After=network.target
[Service]
Type=oneshot
User=dracin
Group=dracin
WorkingDirectory=/var/www/dracin/current
ExecStart=/usr/bin/php8.4 /var/www/dracin/current/artisan schedule:run
StandardOutput=journal
StandardError=journal
SyslogIdentifier=dracin-schedulerTimer Unit: /etc/systemd/system/dracin-scheduler.timer
ini
[Unit]
Description=Run Dracin Laravel Scheduler Every Minute
After=network.target
[Timer]
OnCalendar=minutely
Persistent=true
AccuracySec=1s
Unit=dracin-scheduler.service
[Install]
WantedBy=timers.targetKelebihan Timer Systemd Dibanding Crontab:
- Eksekusi persis pada detik ke-00 tiap menit (
OnCalendar=minutely). Persistent=true: Jika server mengalami reboot saat jadwal terlewat, timer langsung mengeksekusinya segera setelah server menyala kembali.- Status, waktu pemicu berikutnya, dan riwayat eksekusi dapat dipantau langsung via
systemctl list-timers.
4. Siklus Deployment Zero-Downtime & Auto-Restart Worker
Saat rilis aplikasi baru di-deploy ke VPS, antrean worker harus dimuat ulang agar menjalankan kode PHP terbaru, namun tanpa mematikan job yang sedang diproses (zero in-flight job drop).
Hook Deployer: artisan:queue:restart
Pada berkas deploy.php, task artisan:queue:restart disematkan segera setelah symlink release diaktifkan dan PHP-FPM di-reload:
php
// deploy.php
task('deploy', [
'deploy:prepare',
'database:backup',
'artisan:storage:link',
'artisan:config:cache',
'artisan:route:cache',
'artisan:view:cache',
'artisan:migrate',
'deploy:symlink',
'php-fpm:reload',
'artisan:queue:restart', // <-- Hook auto-restart worker
'deploy:health_check',
'deploy:unlock',
'deploy:cleanup',
'deploy:success',
]);
// Post-rollback hook
after('rollback', 'php-fpm:reload');
after('rollback', 'artisan:queue:restart'); // <-- Auto-restart jika rollback
after('rollback', 'deploy:health_check');Mekanisme Kerja:
- Deployer menjalankan
php artisan queue:restart. - Laravel menulis tanda waktu (timestamp) restart ke cache aplikasi.
- Proses
dracin-workeryang sedang berjalan mendeteksi sinyal restart setelah menyelesaikan job aktifnya, lalu keluar secara elegan (graceful exit, exit code 0). - Systemd mendeteksi proses worker berhenti dan secara otomatis menyalakan proses baru (
Restart=always, jedaRestartSec=5s). - Worker baru membaca codebase dari direktori
current(rilis baru).
5. Panduan Operasional & Diagnostik Sistem
Memeriksa Status Layanan
bash
# Status queue worker
systemctl status dracin-worker.service
# Status scheduler timer
systemctl status dracin-scheduler.timer
# Melihat jadwal timer berikutnya
systemctl list-timers dracin-scheduler.timer
# Status web server & PHP
systemctl status nginx
systemctl status php8.4-fpmMemantau Log Real-Time
bash
# Log real-time antrean background worker
journalctl -u dracin-worker.service -f
# Log eksekusi scheduler cron
journalctl -u dracin-scheduler.service -f --since "10 min ago"
# Log akses dan error Nginx
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.logMenjalankan Uji Terarah Otomatis (Targeted Verification)
Repositori menyediakan skrip verifikasi otomatis terpadu [scripts/test-streaming-worker.sh](file:///home/dev/repos/dracin/scripts/test-streaming-worker.sh):
bash
# Uji lengkap terhadap VPS staging
./scripts/test-streaming-worker.sh
# Uji offline/lokal saja (sintaks unit systemd, deployer tree & template Nginx)
./scripts/test-streaming-worker.sh --local-onlySkrip ini memvalidasi seluruh 6 tahap:
- Sintaks berkas unit systemd.
- Integrasi task
artisan:queue:restartpada tree Deployer. - Template konfigurasi Nginx untuk video streaming.
- Uji koneksi SSH target VPS.
- Uji respons live HTTP 206 Partial Content byte-range Nginx.
- Uji status aktif daemon worker, scheduler timer, pengiriman job nyata, dan auto-restart.