Skip to content
karshoprimePublic

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

180 Commits

Folders and files

Repository files navigation

logo

StreamFlow: Web-Based Multi-Platform Streaming

Version License: MIT PRs Welcome GitHub Stars GitHub Forks

StreamFlow adalah platform live streaming berbasis web yang powerful dan mudah digunakan. Streaming ke YouTube, Facebook, dan platform RTMP lainnya secara bersamaan dengan satu aplikasi. Dilengkapi dengan video management, scheduled streaming, dan real-time monitoring untuk pengalaman streaming yang profesional.

πŸš€ Installation β€’ πŸ“– Documentation β€’ 🐳 Docker β€’ πŸͺ› Troubleshooting β€’ πŸ’¬ Community

screenshot


✨ Fitur Utama

  • Multi-Platform Streaming - Streaming ke berbagai platform populer secara bersamaan
  • Video Gallery - Kelola koleksi video dengan antarmuka yang intuitif
  • Upload Video - Upload dari local storage atau import langsung dari Google Drive
  • Scheduled Streaming - Jadwalkan streaming dengan pengaturan waktu yang fleksibel
  • Advanced Settings - Kontrol penuh untuk bitrate, resolusi, FPS, dan orientasi video
  • Real-time Monitoring - Monitor status streaming dengan dashboard real-time
  • Video Analytics - Pantau statistik dan performa video langsung dari aplikasi
  • Responsive UI - Antarmuka modern yang responsif di semua perangkat

πŸ’» System Requirements

  • Node.js v18 atau versi terbaru
  • FFmpeg untuk video processing (6.1+ jika ingin streaming video H.265 β€” lihat bagian Loop Video H.265 di bawah)
  • SQLite3 (sudah termasuk dalam package)
  • VPS/Server dengan minimal 1 Core CPU & 1GB RAM
  • Port 7575 (dapat disesuaikan di file .env)

⚑ Quick Installation

Untuk instalasi otomatis, jalankan perintah berikut:

curl -o install.sh https://raw.githubusercontent.com/bangtutorial/streamflow/main/install.sh && chmod +x install.sh && ./install.sh

πŸ”§ Manual Installation

1. Persiapan Server

Update sistem operasi:

sudo apt update && sudo apt upgrade -y

Install Node.js:

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs

Verifikasi instalasi Node.js:

node --version
npm --version

Install FFmpeg:

sudo apt install ffmpeg -y

Verifikasi instalasi FFmpeg:

ffmpeg -version

Install Git:

sudo apt install git -y

2. Setup Project StreamFlow

Clone repository:

git clone https://github.com/bangtutorial/streamflow

Masuk ke direktori project:

cd streamflow

Install Paket Node.JS:

npm install

Generate Secret Key:

node generate-secret.js

Konfigurasi port (opsional):

nano .env

Jalankan aplikasi:

npm run dev

3. Konfigurasi Firewall

PENTING: Buka port SSH terlebih dahulu untuk menghindari terputusnya koneksi!

Buka port SSH (biasanya port 22):

sudo ufw allow ssh
# atau jika menggunakan port custom SSH
# sudo ufw allow [PORT_SSH_ANDA]

Buka port aplikasi (default: 7575):

sudo ufw allow 7575

Verifikasi aturan firewall sebelum mengaktifkan:

sudo ufw status verbose

Aktifkan firewall:

sudo ufw enable

Verifikasi status firewall setelah aktif:

sudo ufw status

4. Install Process Manager

Install PM2 untuk mengelola aplikasi:

sudo npm install -g pm2

5. Menjalankan Aplikasi

Jalankan aplikasi dengan PM2:

pm2 start app.js --name streamflow

Setup Auto-Restart saat Server Reboot:

# Simpan konfigurasi PM2 saat ini
pm2 save

# Setup PM2 untuk auto-start saat server restart
pm2 startup

# Ikuti instruksi yang muncul, biasanya berupa command yang harus dijalankan dengan sudo
# Contoh output: sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u username --hp /home/username

# Setelah menjalankan command startup, save kembali
pm2 save

Perintah PM2 Berguna:

# Lihat status aplikasi
pm2 status

# Restart aplikasi
pm2 restart streamflow

# Stop aplikasi
pm2 stop streamflow

# Lihat logs aplikasi
pm2 logs streamflow

# Monitor resource usage
pm2 monit

Akses aplikasi melalui browser:

http://IP_SERVER:PORT

Contoh: http://88.12.34.56:7575

πŸ’° Monetisasi Live (gaya YouTube Studio)

Panel Monetization tersedia di form Create/Edit stream (mode YouTube), di form Rotation (berlaku untuk semua item), dan lewat tombol koin pada kartu stream/rotation yang sedang live (Live monetization). Kontrolnya sama dengan Live Control Room YouTube Studio:

Kontrol Keterangan
Ads on/off Mengaktifkan iklan pada broadcast (adsMonetizationStatus)
Auto ad breaks YouTube menyisipkan mid-roll otomatis
Frequency Low / Medium / High Frekuensi yang dioptimalkan YouTube
Custom interval 6–30 menit Jeda iklan tetap, serentak untuk semua penonton atau bergantian
Delay ads at start Tunda iklan N menit setelah live mulai
Run ad break (30–180 detik) Sisipkan mid-roll manual saat live berjalan

Status kelayakan (eligible) dan status iklan yang sebenarnya dibaca langsung dari YouTube di panel Live monetization. Perubahan saat live langsung dikirim ke YouTube; untuk stream yang belum mulai, pengaturan disimpan dan diterapkan saat broadcast dibuat.

Catatan: fitur ini memakai liveBroadcasts.monetizationDetails dan liveBroadcasts.insertCuepoint dari YouTube Data API v3. Channel harus sudah masuk YouTube Partner Program; kalau tidak, YouTube menolak permintaan dan stream tetap jalan tanpa iklan.

🌐 Terjemahan Judul & Deskripsi (Localizations)

Pilih bahasa (satu per satu, preset, atau semua ~80 bahasa YouTube) di form stream / rotation, atau lewat panel Live monetization β†’ Translate now. Judul dan deskripsi diterjemahkan lalu dikirim ke YouTube sebagai localizations, sehingga penonton melihat judul sesuai bahasa mereka.

Provider diatur di Settings β†’ Integration β†’ Translation Settings:

  • Google Cloud Translation API (disarankan): enable Cloud Translation API di Google Cloud Console β†’ buat API key β†’ tempel di Settings β†’ klik Test.
  • OpenAI / Gemini (opsional): tetap didukung.

Halaman Translate dipakai untuk menerjemahkan video/live yang sudah ada di channel secara massal.

πŸ” Jadwal Berulang (Repeat)

Di form Create/Edit stream (manual maupun YouTube), aktifkan Enable Schedule, isi Start & End, lalu pilih Repeat: Once, Every day, atau Every week. Setelah stream berakhir di End Time, jadwal digeser otomatis ke hari/minggu berikutnya (durasi sama) dan broadcast YouTube baru dibuat. Stream yang di-stop manual di tengah jendela tidak langsung restart β€” ia menunggu jadwal berikutnya. Untuk menghentikan permanen, ubah Repeat ke Once atau matikan schedule.

πŸ”‘ Stream Name (Key Stream) & Live Nonstop

Di form Create/Edit stream YouTube ada field Stream Name (key stream): isi dengan nama yang sama untuk beberapa stream/jadwal ulang dan semuanya berbagi satu key stream YouTube (RTMP url/key) yang sama β€” persis seperti nama rotation yang otomatis dipakai sebagai nama key stream-nya. Nama baru (atau dikosongkan) = key stream baru dibuat.

Tombol Live Nonstop (ikon ∞) di form Create/Edit stream (manual maupun YouTube) membuat stream berjalan 24/7: tidak ada Start/End/Repeat, dan kalau FFmpeg crash ia terus di-restart otomatis tanpa batas retry (bukan berhenti setelah 15x percobaan seperti stream biasa). Stream nonstop juga otomatis di-resume kalau server/proses Node-nya di-restart (pm2 restart, deploy, reboot) β€” broadcast YouTube yang sudah ada dipakai lagi, bukan bikin baru β€” sehingga siaran 24/7 tidak terputus permanen hanya karena restart. Stream biasa (bukan nonstop) yang sedang live juga otomatis di-resume kalau saat restart ia masih berada di dalam jendela jadwalnya (waktu sekarang < End Time) β€” hanya stream yang jadwalnya sudah lewat, atau yang tidak punya End Time sama sekali, yang direset ke offline seperti biasa.

Untuk broadcast YouTube, "auto stop"-nya YouTube sendiri dimatikan selama stream nonstop berjalan, dan untuk stream terjadwal juga dimatikan sampai 30 menit sebelum End Time β€” supaya restart/reconnect sesaat tidak bikin YouTube ikut mengakhiri broadcast-nya secara sepihak. Begitu masuk 30 menit terakhir sebelum End Time, auto stop otomatis dinyalakan lagi sebagai jaring pengaman kalau logika stop kita sendiri gagal. Aplikasi juga mengecek status broadcast lama sebelum dipakai ulang (misal setelah resume) β€” kalau ternyata sudah di-end dari sisi YouTube (manual di YouTube Studio atau oleh auto stop), broadcast baru otomatis dibuat (key stream/RTMP tetap dipakai ulang bila namanya sama) alih-alih terus mendorong data ke broadcast yang sudah mati.

🎚️ Audio Mixing di Playlist

Di form Create/Edit Playlist, tab Audios, ada panel Audio Mixing. Secara default (toggle mati) audio dari background music yang dipilih akan mengganti total audio asli videonya (perilaku lama). Aktifkan toggle Mix with original audio supaya audio asli video dan background music sama-sama kedengaran β€” masing-masing punya slider gain sendiri (0%-200%) untuk atur keseimbangan volumenya.

Tombol Preview mix memutar video pertama + audio pertama yang dipilih langsung di browser (pakai Web Audio API, tanpa lewat server/FFmpeg sama sekali) sehingga volumenya langsung berubah real-time begitu slider digeser β€” jadi bisa diatur dulu by-ear sebelum disimpan. Catatan: kalau video sumbernya memang tidak punya audio track sama sekali, mode mix tidak akan menghasilkan apa-apa dari sisi video itu (tidak ada yang bisa di-mix); pakai mode default (replace) untuk video semacam itu.

🎞️ Loop Video H.265 (HEVC) di Mode Copy

Video H.265 butuh bitrate kira-kira setengah dari H.264 untuk kualitas yang sama, jadi bandwidth VPS muat lebih banyak stream sekaligus β€” dan karena mode default (tanpa Advanced Settings) hanya meng-copy codec, CPU tetap hampir tidak terpakai.

Syarat: FFmpeg 6.1 atau lebih baru. RTMP/FLV klasik tidak bisa membawa HEVC; dukungannya (Enhanced RTMP) baru ada sejak FFmpeg 6.1. Ubuntu 22.04 bawaannya FFmpeg 4.4, jadi pasang build statis terbaru:

sudo bash scripts/install-ffmpeg-static.sh
pm2 restart streamflow

Script itu memasang FFmpeg ke /opt/ffmpeg-static dan membuat link di /usr/local/bin tanpa menghapus FFmpeg bawaan apt. Urutan binary yang dipakai aplikasi: FFMPEG_PATH di .env β†’ /usr/local/bin/ffmpeg β†’ /usr/bin/ffmpeg β†’ binary bawaan npm. Versi yang terdeteksi dicetak di log saat aplikasi start (pm2 logs). Stream yang sedang live tetap memakai FFmpeg lama sampai stream itu di-restart.

Di Gallery, setiap video sekarang punya badge codec (H.264 / H.265), terdeteksi otomatis saat upload/import (video lama dianalisis di background saat Gallery dibuka). Badge kuning muncul kalau jarak keyframe lebih dari 4 detik β€” YouTube minta keyframe tiap 2 detik, dan jarak yang panjang bisa bikin glitch di titik sambungan loop.

Tombol Optimize for loop (ikon ↻ di tiap video) membuat salinan H.265 yang aman untuk di-loop di mode copy: keyframe tetap tiap 2 detik, closed GOP, tanpa B-frame, 8-bit, audio AAC. Video asli tidak diubah; hasilnya muncul sebagai video baru berjudul <judul> (H.265 loop) dengan badge hijau Loop. Pilihan kualitas: High (CRF 20), Balanced (CRF 23), Smallest file (CRF 26). Encode berjalan di background satu per satu dengan prioritas CPU rendah (nice) supaya stream yang sedang live tidak terganggu, dan bisa dibatalkan dari Gallery. Untuk video panjang prosesnya bisa lama β€” cukup dilakukan sekali per video.

Pengaman saat start stream (mode copy): kalau videonya H.265 tapi FFmpeg di server masih di bawah 6.1, atau playlist mencampur codec berbeda (misalnya H.264 + H.265), stream langsung ditolak dengan pesan yang jelas β€” bukan gagal diam-diam lalu retry berulang. Mode Advanced Settings tidak terpengaruh (tetap re-encode ke H.264).

Catatan: YouTube menerima HEVC lewat Enhanced RTMP, tapi tidak semua platform RTMP lain mendukungnya β€” untuk tujuan selain YouTube, cek dulu dokumentasi platformnya. Image Docker bawaan memakai FFmpeg dari Debian yang belum tentu 6.1+; cek versinya di log saat start.

πŸ”” Notifikasi Telegram / Webhook

Settings β†’ Integration β†’ Alert Notifications (khusus admin). Isi token bot Telegram (dari @BotFather) + chat ID, dan/atau URL webhook (n8n, Discord, gateway WhatsApp, dll.), pilih event, lalu klik Send test.

Event yang tersedia: stream berhenti setelah retry habis, FFmpeg crash & restart, stream stale (auto restart), stream gagal start (error YouTube API), stream mulai/berakhir, token channel YouTube expired, monetisasi ditolak YouTube, terjemahan gagal, item rotation gagal, disk hampir penuh (threshold bisa diatur), dan app restart. Alert yang sama tidak dikirim ulang dalam 10 menit.

Token OAuth channel yang di-refresh otomatis oleh Google kini selalu disimpan kembali ke database di semua jalur (rotation, translate, edit stream), sehingga channel tidak lagi "expired" diam-diam. Kalau token benar-benar dicabut, channel ditandai expired dan notifikasi dikirim.

πŸ” Reset Password

Jika lupa password atau perlu reset akun:

cd streamflow && node reset-password.js

⏰ Pengaturan Timezone Server

Untuk memastikan scheduled streaming berjalan dengan waktu yang akurat:

Cek timezone saat ini:

timedatectl status

Lihat daftar timezone tersedia:

timedatectl list-timezones | grep Asia

Set timezone ke WIB (Jakarta):

sudo timedatectl set-timezone Asia/Jakarta

Restart aplikasi setelah mengubah timezone:

pm2 restart streamflow

🐳 Docker Deployment

1. Persiapan Environment

Buat file .env di root project:

PORT=7575
SESSION_SECRET=your_random_secret_here
NODE_ENV=development

2. Build dan Jalankan

docker-compose up --build

Akses aplikasi: http://localhost:7575

3. Data Persistence

Data akan tersimpan secara otomatis di:

  • Database: db/
  • Logs: logs/
  • Upload files: public/uploads/

4. Reset Password (Docker)

docker-compose exec app node reset-password.js

πŸͺ› Troubleshooting

Permission Error

chmod -R 755 public/uploads/

Port Already in Use

# Cek proses yang menggunakan port
sudo lsof -i :7575

# Kill proses jika diperlukan
sudo kill -9 <PID>

Database Error

# Reset database (PERINGATAN: akan menghapus semua data)
rm db/*.db

# Restart aplikasi untuk membuat database baru
pm2 restart streamflow

Docker Troubleshooting

Tidak bisa login:

  • Pastikan NODE_ENV=development untuk akses HTTP
  • Periksa permission folder:
    sudo chmod -R 777 db/ logs/ public/uploads/
  • Pastikan SESSION_SECRET tidak berubah

Production (HTTPS):

  • Set NODE_ENV=production
  • Akses melalui HTTPS untuk cookie session

πŸ’« Contributors

Contributors

πŸ“„ License

MIT License


Β© 2026 - Bang Tutorial

About

No description, website, or topics provided.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages