Skip to content

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:

Browser / Video PlayerVPS Ubuntu 24.04 (Staging / Production)PHP Deployer (Local / CI)Nginx Reverse ProxyPHP 8.4-FPM PoolSQLite DatabaseSystemd Daemon WorkerSystemd Timer SchedulerAtomic releases | queue:restart hookPort 80/443 | HTTP 206 Byte-Range | X-Accel-Buffering: noPool: dracin.sock | User: dracin | Ondemand PMshared/database/database.sqlite (WAL Mode)dracin-worker.service | queue:workdracin-scheduler.timer | schedule:run (minutely)Request web / video streamFastCGI dynamic requestsServe static video / assets (HTTP 206)Read / write data & jobsPoll queue jobsTrigger schedule:run tiap menitAtomic deploy & auto-restart worker

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: ​

  1. 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 header Content-Range: bytes 0-1023/{total_bytes}.
  2. X-Accel-Buffering: no:
    • Menonaktifkan proxy buffering Nginx sehingga paket video atau chunk streaming langsung dialirkan ke klien secara real-time tanpa penundaan buffer.
  3. Cache-Control: public, max-age=2592000:
    • Memberikan instruksi caching browser selama 30 hari untuk potongan video yang tidak berubah, menghemat bandwidth VPS secara drastis.
  4. 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.
  5. 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.target

Fitur 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=always dengan jeda RestartSec=5s menjamin 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-scheduler

Timer 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.target

Kelebihan 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: ​

  1. Deployer menjalankan php artisan queue:restart.
  2. Laravel menulis tanda waktu (timestamp) restart ke cache aplikasi.
  3. Proses dracin-worker yang sedang berjalan mendeteksi sinyal restart setelah menyelesaikan job aktifnya, lalu keluar secara elegan (graceful exit, exit code 0).
  4. Systemd mendeteksi proses worker berhenti dan secara otomatis menyalakan proses baru (Restart=always, jeda RestartSec=5s).
  5. 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-fpm

Memantau 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.log

Menjalankan 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-only

Skrip ini memvalidasi seluruh 6 tahap:

  1. Sintaks berkas unit systemd.
  2. Integrasi task artisan:queue:restart pada tree Deployer.
  3. Template konfigurasi Nginx untuk video streaming.
  4. Uji koneksi SSH target VPS.
  5. Uji respons live HTTP 206 Partial Content byte-range Nginx.
  6. Uji status aktif daemon worker, scheduler timer, pengiriman job nyata, dan auto-restart.

AGC Dracin — Platform streaming drama mandiri berkinerja tinggi untuk komunitas Dojo.