Retention
Menghapus rekaman secara otomatis berdasarkan umur, jendela jam, dan kuota disk per channel, dengan pengaman darurat saat disk hampir penuh.
Pengenalan
Rekaman DVR tumbuh sekitar 10 sampai 40 GB per kamera per hari tergantung bitrate. Retention adalah worker di dalam Liodra yang menghapus segmen lama sesuai kebijakan, sehingga disk tidak pernah penuh dan Anda tidak perlu cron job eksternal.
Kebijakan disimpan di retentions.yaml pada volume storage dan dapat diubah lewat API saat runtime tanpa restart. Ada satu kebijakan default yang berlaku untuk semua channel, dan kebijakan per channel yang menimpanya.
| Parameter | Arti | Default |
|---|---|---|
duration_days | Umur maksimum rekaman dalam hari | 7 |
disk_quota_mb | Batas ukuran arsip channel; 0 = tanpa kuota | 0 |
headroom_percent | Saat kuota terlampaui, hapus sampai quota × (100 - headroom)% agar tidak menghapus tiap malam | 1 (maks. 50) |
time_of_day_start / time_of_day_end | Hanya simpan rekaman di jendela jam ini (UTC), mis. 07:00:00 sampai 19:00:00 untuk jam kerja | 00:00:00 sampai 23:59:59 |
Lenz mengelola nilai-nilai ini dari halaman Preferences → Retention (kartu Playback Retention, satu per Media Server) dan menampilkan pemakaian disk dari GET /api/v1/retention/usage. Lenz memakai field yang sama (duration_days, disk_quota_mb) sehingga perubahan dari Lenz dan dari API langsung ke Liodra saling terlihat.
Cara Menggunakan
Aktifkan retensi
Jalankan container dengan --as-nvr --set-retention. Flag kedua menyalin retentions.default.yaml (retensi 7 hari, jadwal 00:00:00) ke storage/retentions.yaml bila file itu belum ada. Endpoint /api/v1/retention/* hanya terdaftar bila file tersebut valid; tanpa itu Anda mendapat 404.
Lihat konfigurasi dan peringatan
curl http://localhost:9080/api/v1/retentionRespons berisi jadwal, kebijakan default, kebijakan per channel, max_disk_usage_percent, max_recommended_quota_mb (kuota tertinggi yang masih di bawah MAX_DISK_USAGE), dan warnings bila ada kuota yang melampauinya.
Ubah kebijakan default dan jadwal
curl -X PUT http://localhost:9080/api/v1/retention/default \
-H 'Content-Type: application/json' \
-d '{ "duration_days": 14, "disk_quota_mb": 2000000, "headroom_percent": 5 }'
curl -X PUT http://localhost:9080/api/v1/retention/schedule \
-H 'Content-Type: application/json' \
-d '{ "time": "02:30:00" }'Worker dijadwalkan ulang otomatis setelah perubahan.
Tambahkan pengecualian per channel
curl -X POST http://localhost:9080/api/v1/retention/policies \
-H 'Content-Type: application/json' \
-d '{
"channel": "live/lobby",
"retention": {
"duration_days": 30,
"time_of_day_start": "06:00:00",
"time_of_day_end": "22:00:00"
}
}'channel boleh bertingkat (live/gedung-a/lantai-2) dan kebijakan berlaku untuk semua device di bawahnya.
Pantau dan uji
curl http://localhost:9080/api/v1/retention/usage # disk sistem + I/O
curl http://localhost:9080/api/v1/retention/usage/live/lobby # ukuran satu channel
curl -X POST http://localhost:9080/api/v1/retention/cleanup/live/lobby # jalankan sekarangCleanup manual mengembalikan CleanupStats (file dihapus, byte dibebaskan, per channel, error) sehingga efek kebijakan bisa diverifikasi tanpa menunggu jadwal.
Fitur Utama
Tiga pass per channel
Setiap kali cleanup berjalan (terjadwal atau manual), tiap channel diproses dalam urutan tetap:
- Umur: direktori hari yang seluruhnya lebih tua dari
duration_daysdihapus utuh (murah, saturm -rper hari), lalu file individual yang tersisa diperiksa. - Jendela jam: untuk 24 jam sebelumnya, segmen di luar
time_of_day_start..enddihapus. Hanya hari sebelumnya yang dipindai agar operasi tetap ringan, jadi kebijakan baru hanya berlaku ke depan. - Kuota: bila ukuran channel melampaui
disk_quota_mb, file tertua dihapus satu per satu sampai berada di bawahquota × (100 - headroom_percent)%.
Channel ditemukan otomatis dari struktur direktori recordings/, termasuk channel bertingkat, jadi device baru langsung tercakup oleh kebijakan default.
Pengaman darurat (MAX_DISK_USAGE)
Terlepas dari jadwal, worker melakukan heartbeat tiap RETENTION_HEARTBEAT_INTERVAL (1 menit, minimum 30 detik). Bila pemakaian disk melewati MAX_DISK_USAGE (80%), Liodra menjalankan cleanup global darurat dengan tiga pengaman:
- hanya file yang lebih tua dari 1 jam yang boleh dihapus;
- paling banyak 20% dari total file per putaran;
- target turun ke
MAX_DISK_USAGE - 5%(tidak pernah di bawah 50%).
Pengaman ini mencegah penghapusan massal akibat salah konfigurasi, tetapi juga berarti disk yang jauh terlalu kecil tidak akan "diselamatkan" seketika. Ukur kebutuhan disk dengan max_recommended_quota_mb.
Penyimpanan dan hot reload
Perubahan lewat API ditulis ke retentions.yaml (version, last_updated, cleanup_schedule) dan langsung berlaku. Mengedit file secara manual juga bisa, tetapi memerlukan restart container agar terbaca.
Statistik cleanup
POST /api/v1/retention/cleanup mengembalikan ringkasan yang sama dengan yang ditulis ke log [Retention]:
{
"start_time": "2026-09-16T00:00:00Z",
"end_time": "2026-09-16T00:00:04Z",
"duration": "4.2s",
"files_deleted": 2880,
"bytes_freed": 25769803776,
"channel_stats": [{ "channel": "live/lobby", "files_deleted": 2880, "bytes_freed": 25769803776 }],
"errors": []
}API Reference
Detail lengkap di API Reference: Retention.
| Method | Path | Fungsi |
|---|---|---|
GET | /api/v1/retention | Konfigurasi, batas disk, dan peringatan |
PUT | /api/v1/retention/schedule | Ubah jam cleanup harian |
PUT | /api/v1/retention/default | Ubah kebijakan default |
POST | /api/v1/retention/policies | Tambah kebijakan channel |
PUT | /api/v1/retention/policies/{channel} | Ubah kebijakan channel |
DELETE | /api/v1/retention/policies/{channel} | Hapus kebijakan channel (kembali ke default) |
POST | /api/v1/retention/cleanup | Jalankan cleanup semua channel |
POST | /api/v1/retention/cleanup/{channel} | Jalankan cleanup satu channel |
GET | /api/v1/retention/usage | Pemakaian dan I/O disk sistem |
GET | /api/v1/retention/usage/{channel} | Ukuran arsip satu channel |
Tips & Troubleshooting
Selanjutnya
API Reference: Recordings
Endpoint untuk menemukan stream yang memiliki rekaman, ketersediaan harian dan per jam, playback berbasis waktu, unduh klip, dan penghapusan rekaman.
API Reference: Retention
Endpoint untuk membaca dan mengubah kebijakan retensi, menjalankan cleanup, dan memantau pemakaian disk.