Instalasi
Menjalankan Liodra dengan Docker, memilih flag fitur (NVR, VoD, broadcast), memetakan port dan volume, lalu memverifikasi bahwa layanan hidup dan siap didaftarkan ke Lenz.
Liodra didistribusikan sebagai satu image Docker yang sudah memuat media engine dan seluruh dependensinya. Satu container cukup; tidak ada database atau layanan eksternal yang dibutuhkan. Seluruh state (device, kebijakan retensi, rekaman, video unggahan) hidup di satu volume storage.
Halaman ini mencakup backend standar, yaitu mode produksi Liodra. Untuk menjalankan Liodra di atas NVR Hikvision yang sudah ada, lihat Backend Hikvision. Referensi lengkap environment variable ada di Konfigurasi.
Persyaratan
| Komponen | Kebutuhan |
|---|---|
| Host | Linux x86-64 dengan Docker Engine. Tidak memerlukan GPU. |
| CPU | Ingest adalah stream copy, jadi ringan: ~40% CPU untuk 50 kamera 1080p H.264. Sisakan headroom untuk playback dan transcode on-demand (~2 thread per penonton HEVC tanpa hardware). |
| RAM | ~50 MB dasar + ~10-20 MB per kamera aktif. |
| Disk | ~250 MB per jam per kamera 1080p 25 fps H.264 (HEVC lebih kecil). Gunakan volume terpisah untuk rekaman dan atur retensi. |
| Jaringan | Bandwidth masuk = total bitrate kamera. Bandwidth keluar = jumlah penonton × bitrate. |
| File descriptor | Setiap stream aktif memakai ~15-20 FD. Jalankan container dengan --ulimit nofile=65535:65535. |
Image
Image dipublikasikan di GitLab Container Registry Nodeflux. Login terlebih dahulu dengan kredensial GitLab Anda:
docker login registry.gitlab.com -u <gitlab-username>| Image | Catatan |
|---|---|
registry.gitlab.com/nodefluxio/liodra:<tag> | Default. RTMP, HTTP-TS, DVR, dan server RTSP di port 8554. |
registry.gitlab.com/nodefluxio/liodra:<tag>-srs6 | Varian legacy tanpa server RTSP, dipertahankan satu rilis untuk deployment lama. |
Tag yang tersedia: latest (branch main), test (merge request), dan <versi> untuk rilis (mis. 3.9.0). Untuk produksi selalu gunakan tag versi.
Quick Start
Siapkan direktori storage
Buat direktori di host yang akan menampung rekaman, video unggahan, log proses ingest, dan file konfigurasi. Direktori ini di-mount ke /usr/share/nginx/html/storage di dalam container.
mkdir -p /srv/liodra/storagePilih mode dan jalankan container
Tanpa argumen, Liodra berjalan sebagai media server minimal: manajemen device dan live streaming saja, tanpa rekaman. Tambahkan flag sesuai kebutuhan.
docker run -d \
--name liodra \
--restart unless-stopped \
--ulimit nofile=65535:65535 \
-p 9080:9080 \
-p 1935:1935 \
-p 8554:8554 \
-v /srv/liodra/storage:/usr/share/nginx/html/storage \
registry.gitlab.com/nodefluxio/liodra:3.9.0 \
--as-nvr --set-retention--as-nvr mengaktifkan DVR dan API playback. --set-retention menyalin kebijakan retensi awal (7 hari, cleanup pukul 00:00) ke retentions.yaml bila file itu belum ada. Inilah konfigurasi yang dipakai bersama Lenz.
docker run -d \
--name liodra \
--restart unless-stopped \
--ulimit nofile=65535:65535 \
-p 9080:9080 \
-p 1935:1935 \
-p 8554:8554 \
-p 9994:9994 \
-v /srv/liodra/storage:/usr/share/nginx/html/storage \
registry.gitlab.com/nodefluxio/liodra:3.9.0 \
--as-nvr --set-retention --with-vod --broadcast-onMenambahkan API upload video (--with-vod, dipakai halaman Video Management Lenz) dan broadcast WebSocket (--broadcast-on). Port 9994 hanya untuk kompatibilitas mobile-hub lama.
docker run -d \
--name liodra \
--restart unless-stopped \
--ulimit nofile=65535:65535 \
-p 9080:9080 \
-p 1935:1935 \
-v /srv/liodra/storage:/usr/share/nginx/html/storage \
registry.gitlab.com/nodefluxio/liodra:3.9.0Cocok sebagai relay: menarik kamera sekali, lalu menyajikannya ke banyak konsumen (Visionaire, pemutar) tanpa menulis apa pun ke disk.
Verifikasi
curl http://localhost:9080/api/v1/health
curl http://localhost:9080/api/v1/version
docker logs -f liodrahealth harus menjawab "status": "healthy" dengan "backend_health": true. Di log, cari baris [entrypoint] Feature flags configured: untuk memastikan flag yang Anda berikan terbaca, dan [nvr] untuk log Liodra.
Tambahkan kamera pertama
curl -X POST http://localhost:9080/api/v1/devices/rtsp \
-H "Content-Type: application/json" \
-d '{
"name": "camera_front",
"url": "rtsp://admin:[email protected]:554/stream1",
"channel": "live"
}'Dalam beberapa detik GET /api/v1/devices menampilkan status active, dan stream dapat ditonton di http://localhost:9080/api/v1/play/ts/live/camera_front. Bila --as-nvr aktif, segmen mulai ditulis ke storage/recordings/live/camera_front/.
Daftarkan ke Lenz
Di Lenz, buka Media Servers → Manajemen Server, klik Tambah Server Media, isi host Liodra dengan tipe srs dan Port API 9080, lalu klik Periksa Kesehatan. Detailnya ada di Integrasi dengan Lenz & Visionaire.
Flag Fitur
Argumen container dipetakan ke environment variable. Keduanya setara; flag lebih praktis untuk docker run, variable lebih praktis untuk Compose atau orkestrator.
| Flag | Environment variable | Efek | Default |
|---|---|---|---|
--as-nvr | ENABLE_PLAYBACK=true | Mengaktifkan perekaman DVR serta API /playbacks, /recordings, dan /retention. | nonaktif |
--set-retention | (tidak ada) | Menyalin retentions.default.yaml ke storage/retentions.yaml bila belum ada. Tanpa ini, playback aktif tetapi tidak ada cleanup sampai kebijakan dibuat lewat API. | nonaktif |
--with-vod | ENABLE_VOD=true | Mengaktifkan API /videos (upload, VoD playback) dan channel vod. | nonaktif |
--broadcast-on | ENABLE_BROADCAST=true | Mengaktifkan API /broadcast dan WebSocket /ws/v1/broadcast. | nonaktif |
--verbose | (tidak ada) | LOG_LEVEL=debug dan log media engine yang lebih rinci. | nonaktif |
--experimental | EXPERIMENTAL=true | Membuka flag eksperimental di bawah; tidak berefek sendiri. | nonaktif |
--transcode-into <h264|hevc> | TRANSCODE_INTO | Re-encode ingest ke codec target dengan GPU terintegrasi. Lihat Ingest Transcode. | copy |
--transcode-quality <N> | TRANSCODE_QUALITY | Kualitas dasar encoder 0-51. | 30 |
--transcode-threads <N> | TRANSCODE_THREADS | Batas thread encoder per ingest; 0 = tanpa batas. | 2 |
--transcode-max-bpp <F> | TRANSCODE_MAX_BPP | Batas bitrate per kamera dalam bit per piksel per detik. | 0.06 |
hikvision (argumen posisi) | NVR_BACKEND=hikvision | Menjalankan backend Hikvision alih-alih backend standar. | srs (standar) |
Saat sebuah fitur nonaktif, endpoint-nya tidak didaftarkan sama sekali dan menjawab 404. Flag runtime terlihat di GET /api/v1/config (playback_enabled, vod_enabled, broadcast_enabled) tetapi tidak pernah disimpan ke file YAML.
Port
| Port | Layanan | Keterangan | Dibutuhkan untuk |
|---|---|---|---|
9080 | Liodra API | REST API dan seluruh WebSocket. Port inilah yang diisi sebagai Port API di Lenz. | Selalu |
1935 | RTMP | Publish dan play RTMP. Dibutuhkan bila ada klien eksternal yang mem-publish (mobile, encoder) atau Visionaire menarik RTMP. | Backend standar |
8554 | RTSP | Setiap stream yang dipublish juga tersedia lewat RTSP. Tidak ada di image legacy -srs6. | Backend standar |
8080 | HTTP-TS dan dashboard | HTTP-TS langsung tanpa proxy API dan dashboard monitor web Liodra. | Debug dan monitor |
9994 | mobile-hub | Broadcast WS untuk kompatibilitas mobile-hub lama; hanya pada image yang menyertakannya. | --broadcast-on |
Port lain yang mungkin muncul di docker-compose.yaml repositori bersifat internal dan tidak dipakai oleh Lenz maupun Visionaire; jangan diekspos.
Volume dan Tata Letak Storage
Satu volume, /usr/share/nginx/html/storage, menampung semuanya:
storage/
├── recordings.yaml # daftar device (dipersist tiap 60 s dan saat berubah)
├── retentions.yaml # jadwal cleanup dan kebijakan retensi
├── recordings/ # segmen DVR: {channel}/{name}/YYYY/MM/DD/HH-mm-ss.flv (UTC)
├── vods/ # video unggahan beserta .info dan .thumb.jpg
├── logs/ # log per proses ingest
└── transcode-capacity.json # cache benchmark encoder (hanya mode eksperimental)Device di recordings.yaml dipulihkan otomatis saat container dimulai ulang, sehingga kamera kembali di-ingest tanpa perlu didaftarkan lagi.
Docker Compose
services:
liodra:
image: registry.gitlab.com/nodefluxio/liodra:3.9.0
restart: unless-stopped
command: ["--as-nvr", "--set-retention", "--with-vod"]
ulimits:
nofile:
soft: 65535
hard: 65535
ports:
- "9080:9080"
- "1935:1935"
- "8554:8554"
volumes:
- /srv/liodra/storage:/usr/share/nginx/html/storage
environment:
LOG_LEVEL: info
MAX_DISK_USAGE: "80"
MAX_ONDEMAND_PROCESSES: "32"
# RTMP_SECRET: ganti-dengan-secret-andaUpgrade
- Tarik image versi baru.
- Hentikan dan hapus container lama (
docker rm -f liodra); rekaman dan konfigurasi aman di volume. - Jalankan kembali dengan perintah yang sama dan tag baru. Device dipulihkan dari
recordings.yaml. - Periksa
GET /api/v1/versiondanCHANGELOG.mdrilis untuk perubahan perilaku.
Troubleshooting
Selanjutnya
Liodra
Media server dan NVR dari Nodeflux: ingest RTSP/RTMP tanpa batas kamera, rekaman DVR, playback berbasis waktu, dan distribusi ulang stream untuk Visionaire dan Lenz.
Konfigurasi
Referensi environment variable Liodra (inti, storage, flag fitur, auto-restart, upload, on-demand, eksperimental) serta format recordings.yaml dan retentions.yaml.