×

📺 IPTV

B2C · Xtream · Reseller

IPTV Kelola Pengguna

Tingkat Penyimpanan Arsip

Sistem arsip tiga tingkat untuk 500+ klien secara bersamaan.

Pembuat enkode

Tulis Penyangga

Jendela panas 2 jam (NVMe atau tmpfs)

→ cermin (kontinu)

RAID HDD 5

50 TB, retensi 14 hari

→ ambil terlebih dahulu sesuai permintaan

Tembolok Pemutaran

Cache hangat 1 TB, 500+ klien

Klien

Cermin, bukan bergerak

Segmen yang lebih lama dari mirror_min_age_menit diSALIN ke RAID secara terus-menerus.

Tingkat

Tujuan

Pengaturan

Tulis Penyangga

Menerima segmen 24/7, menyimpan hot window 2 jam untuk pemutaran mundur cepat, melindungi RAID dari IO acak.

device_path (memblokir perangkat atau 'tmpfs'), tmpfs_size_pct (10-50% MemAvailable ketika tmpfs), mirror_min_age_menit, evict_age_menit, flush_threshold_percent (pemicu pemaksaan flush)

Arsip RAID HDD

Penyimpanan jangka panjang untuk retensi penuh (default 14 hari).

hari_retensi, perangkat_serangan, lokasi_nginx, persen_gratis min

Cache Pemutaran (opsional)

Cache sisi baca untuk file populer yang lebih lama dari 2 jam (mis. EPG catch-up).

prefetch_hours, max_sessions, eviction_policy (sesi/lru/fifo)

Perhitungan kapasitas

penulisan langsung × 2h = write_buffer ukuran jendela panas.

Bacaan (pencarian tingkat-sadar)

Stream.dvr_file_path/2 memeriksa write_buffer → playback_cache → arsip secara berurutan.

Disk Virtual tmpfs (pengembangan/pengujian)

Setiap tingkat dapat menggunakan disk virtual tmpfs yang didukung RAM, bukan perangkat blok fisik.

Ukuran dalam % RAM bebas

Alokasi ditentukan sebagai persentase MemAvailable (dari /proc/meminfo) — langkah 10, nilai valid 20/10/30/40/50.

Penjaga keamanan OOM

Jika target yang dihitung melebihi 60% dari MemAvailable saat ini, pemasangan ditolak dan tingkatan tetap offline (Stream.archive_path lolos ke tingkat sehat berikutnya).

Nyalakan ulang kegigihan

tmpfs tinggal di RAM — konten buffer apa pun dalam penerbangan HILANG saat host melakukan boot ulang.

Kapan menggunakan tmpfs

Gunakan tmpfs untuk write_buffer ketika: (a) kotak dev/test tidak memiliki NVMe cadangan namun Anda masih ingin pipeline DVR lengkap berjalan untuk pengujian integrasi, (b) operator ingin memvalidasi perilaku mirror + archive tanpa membeli NVMe terlebih dahulu, (c) pengujian singkat yang loss-on-reboot dapat diterima.

Pembilasan lebih cepat untuk tmpfs

Jika tingkat tulisnya adalah tmpfs, StorageTierFlush menggunakan default yang lebih ketat — mirror_min_age 2 mnt, evict_age 15 mnt (vs 5 mnt / 120 mnt untuk NVMe fisik).

Penyediaan & Keamanan Otomatis Tingkat

Tingkat dikonfigurasi satu kali melalui Config > Storage > Storage Tiers dan disediakan secara otomatis — tidak ada pengeditan mkfs/mount/fstab manual pada host.

Benih boot default

Pada boot pertama (tidak ada tingkat tulis di DB), sistem secara otomatis membuat tingkat tulis yang didukung tmpfs dengan alokasi MemAvailable 30%, titik pemasangan /mnt/nvme_write.

Kesehatan & kegagalan

Stream.archive_path/1 mengembalikan tingkat 'sehat' pertama — write_buffer jika dipasang+dapat ditulis+free_pct di atas batas aman, jika tidak, kembali ke arsip (mode terdegradasi).

Perubahan ukuran langsung

Mengubah tmpfs_size_pct di UI memicu umount + remount dengan ukuran baru di Simpan.

URL Dasar — ​​Pemutar OSTV

Bidang Paket

API Paket

Kebijakan Kata Sandi

API Pengecer

Pengaturan

Bidang Pengguna

Manajemen Pengguna

IPTV Kelola Pengguna

URL Dasar — ​​Pemutar OSTV

Aplikasi OSTV Player memungkinkan pengguna untuk mengubah URL basis server (alamat API).

Alasan: Mengubah URL dasar hanya ditujukan untuk administrator/pengguna root sehingga mereka dapat beralih antar server (misalnya produksi vs pengujian).

Bidang Pengguna

API Paket

Mengembalikan daftar semua paket aktif dengan harga dan periode penagihan.

Daftar pengguna manajemen (reseller/penyedia).

Mengembalikan saldo kredit untuk pengguna manajemen tertentu.

Bidang Paket

API Pengecer

API untuk reseller/penyedia.

Kebijakan Kata Sandi

Kata sandi diperlukan saat membuat pelanggan.

Minimal 8 karakter

Minimal 1 huruf besar (A-Z)

Setidaknya 1 karakter khusus (!@#$%^&* dll.)

Berlaku untuk UI dan API.

Pengaturan

Penyediaan & Keamanan Otomatis Tingkat

Deteksi otomatis kapasitas + sistem file: ketika NVMe gratis dipilih dari dropdown, kapasitas (GB) dibaca dari lsblk -bn -o SIZE dan FS saat ini dari blkid (dengan fallback seluruh disk).

Mekanisme Tier Flush — Cermin Berkelanjutan

StorageTierFlush GenServer berjalan setiap 60 detik.

Mengapa mirror terus menerus berbunyi "tunggu 60 menit, pindahkan secara batch": (1) Pemuatan RAID merata — tidak ada lonjakan 5GB pada batas jam, hanya sedikit segmen 7MB;

Keamanan segmen yang sedang berlangsung: mirror hanya mengambil file yang lebih lama dari MIRROR_MIN_AGE_MINUTES melalui find -mmin +5.

Penyetelan per penerapan (.env)

500–1000

Aturan ukuran:

Kalender Pratinjau DVR

Tab Pratinjau DVR menampilkan kalender yang dirender oleh server yang hanya menyoroti hari-hari di mana rekaman ada di disk.

Hari dengan rekaman dapat diklik (biru) — mengklik akan mengisi input tanggal dan waktu dengan hari itu pada pukul 00:00;

Diimplementasikan di Stream.available_dvr_days/1 melalui find -min depth 4 -max depth 4 -type d pada setiap tingkat pemasangan;

API Pemain B2C

Ringkasan

API B2C (Business-to-Consumer) menyediakan otentikasi dan akses streaming untuk aplikasi pemutar pengguna akhir.

Otentikasi

Otentikasi pengguna dan dapatkan auth_token untuk panggilan API berikutnya.

Metode

Titik akhir

Badan Permintaan

Parameter

Jenis

Diperlukan

Keterangan

Ya

Nama login pengguna

Kata sandi pengguna

Contoh Permintaan

Bidang Respon

Respon Sukses (200)

Token autentikasi terenkripsi untuk panggilan API berikutnya

Tanggal/waktu kedaluwarsa token dalam format ISO 8601

Contoh Respon Sukses

Respon Kesalahan (403)

Pesan deskripsi kesalahan

Kode status HTTP

Contoh Respon Kesalahan

Info Pengguna

Ambil informasi tentang pengguna yang diautentikasi menggunakan token autentikasi.

Bidang Respon

Nama pengguna pengguna yang diautentikasi

Pesan server (kosongkan jika tidak ada)

Status otentikasi (1 = diautentikasi)

Status akun: Aktif, Diblokir, Dinonaktifkan, Uji Coba

Tanggal kedaluwarsa akun (null jika tidak terbatas)

Jumlah koneksi aktif saat ini

Tanggal pembuatan akun dalam format ISO 8601

Koneksi simultan maksimum yang diperbolehkan

Daftar format aliran keluaran yang diizinkan

Nama penyedia pemilik/pengecer pengguna (null jika tidak ada)

URL gambar logo penyedia (null jika tidak ada)

URL gambar logo penciutan penyedia 208x208 (null jika tidak ada)

Waktu server saat ini dalam format ISO 8601

Contoh Permintaan

Kategori

Ambil kategori yang difilter menurut jenisnya.

Jenis kategori: siaran langsung, vod, atau serial

ID Kategori sebagai string

Nama tampilan kategori

ID kategori induk (0 jika root)

Hash konten MD5 untuk pembatalan cache

Contoh Permintaan

Detil VOD

Ambil informasi mendetail untuk item VOD tertentu, termasuk metadata dan tautan streaming.

ID aliran VOD (UUID)

Bidang Objek Info

URL gambar sampul

Pengidentifikasi TMDB

URL gambar latar belakang

Rangkaian genre

Plot / deskripsi

Anggota pemeran

Nilai peringkat (0-10)

Nama direktur

Tanggal rilis

Durasi dalam hitungan detik

Durasi sebagai string yang diformat

Array ID kategori

1 jika konten dewasa, 0 sebaliknya

Bidang Objek VOD

ID aliran VOD

Judul VOD

Tanggal ditambahkan (ISO 8601)

URL tautan streaming

Metadata kodek video/audio

Detil Seri

Ambil informasi serial dengan daftar season dan episode lengkap, dikelompokkan berdasarkan nomor musim.

ID Seri (UUID)

Bidang Array Musim

Nomor musim

Nama tampilan musim

Jumlah episode dalam satu musim

Tanggal tayang musim ini

Ikhtisar/deskripsi musim

URL gambar sampul musim

Objek Episode

Peta dikunci berdasarkan string nomor musim.

Bidang Objek Episode

ID Episode

ID episode TMDB

Nomor episode dalam musim

Judul episode

Tanggal ditambahkan (ISO 8601)

Nomor musim

Objek info episode (struktur yang sama dengan info VOD)

URL tautan streaming

Metadata kodek video/audio

Catatan

Kedaluwarsa token tergantung pada peran pengguna: admin = 365 hari, lainnya = 30 hari|Akun yang dinonaktifkan tidak dapat mengautentikasi (mengembalikan 403)|Setiap proses masuk yang berhasil memperbarui stempel waktu_login terakhir pengguna|Token dienkripsi dan berisi user_id, nama pengguna, peran, dan masa berlaku

Respon Sukses (200)

Token autentikasi diperoleh dari titik akhir /auth