StreamTube

Karşılaştığım Zorluk

Kendi video altyapını barındırmak, bir dosyayı sunucuya koymaktan çok daha fazlası. Video oynatma göründüğü kadar masum değil: ham dosya parçalara bölünmeli, doğru bit hızlarında yeniden kodlanmalı ve zayıf bir ev bağlantısında bile izleyiciyi sürekli yükleniyor ekranında bırakmadan akmalı. Hazır bir servis kullansaydım bütün bunlar arka planda kendiliğinden hallolurdu; ama o rahatlığın karşılığında GB ve dakika başına ödeme yapmayı, üstüne platforma kilitlenmeyi göze almam gerekirdi. Kendi altyapımda ne fatura var ne kilit — bunun bedeli de takılan bir FFmpeg işinden dolan diske, yavaşlayan bir yüklemeye kadar her arızanın doğrudan benim sorunum olması.

İşin en kritik kararı, transcoding'i yükleme isteğinden tümüyle koparmaktı. Her yüklemede doğrudan FFmpeg'i tetikleyip Next.js sürecinin dakikalarca süren kodlamayı ayakta tutmasını beklemek, tek düğümlü bir kümede kısa sürede felakete dönerdi. Bunun yerine yükleme önce depoya iniyor, kodlama ise arka planda ayrı ve kuyruğa alınmış bir adım olarak yürüyor. Elimde bulutun elastik yedek kapasitesi olmadığı için bu ayrım burada çok daha hayati: takılan ya da aşırı büyük bir iş tüm kümeyi değil yalnızca kendini yavaşlatmalı.

"Amacım bir klonu yeniden yazmak değildi; videonun yüklendiği andan izleyicinin ekranına düştüğü ana kadar geçen her adımı kendi altyapımda ayakta tutmanın gerçekte nasıl bir şey olduğunu görmekti."

Geliştirdiğim Çözüm

Frontend'i ve API'yi tek bir deploy edilebilir birimde toplamak için Next.js 16 kullandım. Kullanıcılar, yüklemeler, izlenmeler ve oynatma listeleri arasındaki ilişkiler net olduğundan metadata tarafında doküman veritabanı yerine PostgreSQL ve Prisma'yı seçtim. Videoların kendisi, aynı kümede koşan, kendi barındırdığım S3 uyumlu bir nesne deposunda duruyor — GB başına bulut faturası yok; kodlamayı ise FFmpeg üstleniyor. Tüm sistem, homelab'imdeki tek düğümlü bir Kubernetes kümesinde, üzerinde koşan yaklaşık on başka projeyle birlikte yaşıyor ve hepsi GitOps mantığında deploy ediliyor — yani elle kubectl komutu yok, git'e düşen değişiklik doğrudan kümeye yansıyor.