q-buffer
q-buffer, qBittorrent üzerinde torrentleri kontrollü şekilde döngüye almayı ve peer kısıtlamasını otomatikleştirmeyi amaçlayan bir uygulamadır. Buffer ekranında torrent seçip loop akışını başlatabilir, Timer ekranında etiket bazlı otomatik silme kuralları tanımlayabilirsiniz.
Neler yapar?
- qBittorrent WebUI API ile bağlanır, aktif torrent listesini gösterir.
- Seçilen torrent için loop (indir → sil → yeniden ekle) işlemini yönetir.
- Allow IP kuralıyla agresif peer kısıtlaması uygular (destek varsa ban).
- Timer kurallarıyla etiket bazlı seed süresi dolan torrentleri otomatik siler.
- Gerçek zamanlı durum, log ve metrikleri UI üzerinden gösterir.
Hızlı Başlangıç
.env.exampledosyasını.envolarak kopyalayın ve değerleri doldurun.- İlk kurulumda
wscraper-servicetarafını okuyun:Watcherözelliği için host makinede Python 3.10+ gerekir. - Geliştirme ortamını başlatın:
./scripts/bootstrap.sh --dev-mode
- Açın:
- Web: http://localhost:5173
- API/Socket: http://localhost:3001
Watcher Notu
Watcher akışı wscraper -> scrapling -> Playwright zincirini kullanır. Playwright DNS ve browser bağımlılıklarını Docker içine taşımak yerine wscraper-service host makinede çalışır; web ve server ise Docker içinde kalır. server, host servisle http://host.docker.internal:8787 üzerinden konuşur.
bootstrap.sh şu işleri tek komutta yapar:
- eksikse
wscraperrepo'yubin/wscraperaltına otomatik clone eder - Docker servislerini
up --buildile kaldırır - host
wscraper-serviceiçin Python venv hazırlar - eksik Python paketlerini ve Playwright bağımlılıklarını kurar
wscraper-servicei başlatır
wscraper-service kurulumu her çalıştırmada sıfırdan yapılmaz. Kurulum daha önce tamamlandıysa script sadece kontrol eder ve eksik yoksa yeniden kurmaz. wscraper repo da aynı şekilde idempotent yönetilir: repo eksikse clone edilir, varsa tekrar clone edilmez.
İlk Kurulumda wscraper Yapılandırması
Bu bölüm ilk kez q-buffer kuranlar içindir. Sık karışan nokta şu:
bin/wscraper/dizini scraper paketinin kendisidirbin/wscraper-service/server.py,q-bufferbackend'in çağırdığı host servisidir- yani
wscraperdizininde yalnızcaserver.pyyok; asıl tracker adapter kodlarıbin/wscraper/src/wscraper/...altındadır
Geçerli kurulum modeli:
- önce
q-bufferrepo clone edilir bootstrap.sh,bin/wscrapereksiksewscraperrepo'yu otomatik clone eder- repo zaten varsa olduğu gibi bırakır
- sadece açıkça
--update-wscraperverirseniz mevcut checkoutgit pull --ff-onlyile güncellenir
İlk kurulum adımları:
q-bufferrepo'yu clone edin..env.exampledosyasını.envolarak kopyalayın.- qBittorrent ve uygulama auth ayarlarını doldurun.
- watcher servis ayarlarını kontrol edin:
WSCRAPER_SERVICE_BASE_URL=http://host.docker.internal:8787WSCRAPER_SERVICE_TOKEN=boş bırakılabilirWSCRAPER_SERVICE_HOST=0.0.0.0WSCRAPER_SERVICE_PORT=8787WSCRAPER_SERVICE_PYTHON_BIN=python3.12WSCRAPER_GIT_URL=https://github.com/wisecolt/Bookmark-Tracker.gitWSCRAPER_GIT_REF=main
- Host makinede uygun Python sürümü olduğundan emin olun:
python3.12 --version- yoksa
python3.11veyapython3.10
- Repo root'ta şu komutu çalıştırın:
./scripts/bootstrap.sh --dev-mode
- İlk bootstrap tamamlandıktan sonra
q-buffer/bin/wscraperaltında şu dosyaların geldiğini doğrulayın:pyproject.tomlsetup.pysrc/wscraper/cli.pysrc/wscraper/sites/happyfappy.pysrc/wscraper/sites/privatehd.py
Bu komut şunları yapar:
bin/wscraperyoksaWSCRAPER_GIT_URLveWSCRAPER_GIT_REFile repo'yu clone eder- Docker
webveserverservisleriniup --buildile başlatır - host'ta
.runtime/wscraper-service/.venvoluşturur scrapling[fetchers]kurarscrapling installçalıştırırbin/wscraper-service/server.pysürecini başlatır
Kurulumdan sonra kontrol edilecekler:
curl http://127.0.0.1:8787/health
docker compose -f docker-compose.dev.yml ps
İlk komutta {"ok":true,...} benzeri cevap, ikinci komutta server ve web container'ları görülmelidir.
Host makinede Python 3.10+ gerekir. Script sırasıyla python3.12, python3.11, python3.10, python3 ikililerini dener ve uygun ilk sürümü seçer. Gerekirse .env içine WSCRAPER_SERVICE_PYTHON_BIN=python3.12 benzeri açık bir değer verebilirsiniz.
Kullanılabilir bayraklar:
./scripts/bootstrap.sh --dev-mode
./scripts/bootstrap.sh --prod-mode
./scripts/bootstrap.sh --dev-mode --skip-wscraper-fetch
./scripts/bootstrap.sh --dev-mode --update-wscraper
./scripts/bootstrap.sh --dev-mode --skip-wscraper-install
./scripts/bootstrap.sh --dev-mode --restart-wscraper
bootstrap.sh Bayrakları
bootstrap.sh şu anda tek giriş komutudur. Aynı script hem Docker servislerini kaldırır hem de host tarafındaki wscraper-service sürecini yönetir. Bu yüzden bayrakların neyi etkilediğini net bilmek önemlidir.
--dev-mode
Geliştirme ortamını başlatır.
Ne yapar:
docker compose -f docker-compose.dev.yml up --buildçalıştırır- development compose dosyasındaki
webveserverservislerini ayağa kaldırır - host makinede
wscraper-servicesürecini hazırlar ve başlatır
Ne zaman kullanılır:
- günlük geliştirme akışında
- watcher veya UI/backend değişikliği yaparken
- ilk lokal kurulumda
Örnek:
./scripts/bootstrap.sh --dev-mode
--prod-mode
Production benzeri çalışma modunu başlatır.
Ne yapar:
docker compose -f docker-compose.yml up --build -dçalıştırır- servisleri detached modda ayağa kaldırır
- host makinede
wscraper-servicesürecini hazırlar ve başlatır
Ne zaman kullanılır:
- kalıcı çalışan kurulumda
- UI terminale bağlı kalmasın istendiğinde
- production veya staging benzeri testlerde
Örnek:
./scripts/bootstrap.sh --prod-mode
--skip-wscraper-fetch
bin/wscraper repo yönetimini tamamen atlar.
Ne yapar:
bin/wscraperyoksa clone etmeye çalışmaz- varsa update etmeye çalışmaz
WSCRAPER_GIT_URLveWSCRAPER_GIT_REFdeğerlerini kullanmaz
Ne yapmaz:
wscraper-servicePython kurulumunu atlamazwscraper-servicebaşlatmayı atlamaz- Docker servislerini atlamaz
Ne zaman kullanılır:
bin/wscraperrepo’sunu manuel yönetiyorsanız- farklı bir branch üzerinde çalışıyorsanız
- bootstrap’in
git clone/pulldavranışına dokunmasını istemiyorsanız
Örnek:
./scripts/bootstrap.sh --dev-mode --skip-wscraper-fetch
--update-wscraper
Mevcut bin/wscraper checkout’unu günceller.
Ne yapar:
bin/wscraperyoksa önce clone eder- repo varsa
git pull --ff-onlydener - yalnızca fast-forward güncellemeye izin verir
Güvenlik davranışı:
bin/wscraperiçinde local değişiklik varsa script durur- merge/rebase yapmaz
- mevcut branch’i zorla değiştirmez
Ne zaman kullanılır:
wscraperrepo’daki son değişiklikleri almak istediğinizde- watcher tracker güncellemeleri geldiyse
q-bufferile birliktewscraperı da senkron tutmak istediğinizde
Örnek:
./scripts/bootstrap.sh --dev-mode --update-wscraper
--skip-wscraper-install
Host makinedeki wscraper-service Python kurulum kontrolünü atlar.
Ne yapar:
.runtime/wscraper-service/.venvdoğrulamasını atlarpip installvescrapling installçalıştırmaz
Ne yapmaz:
wscraper-servicebaşlatmayı engellemezbin/wscraperrepo kontrolünü engellemez- Docker servislerini engellemez
Ne zaman kullanılır:
- Python ortamının zaten doğru kurulu olduğundan eminseniz
- kurulum adımını kısaltmak istiyorsanız
- ağ erişimi geçici olarak sorunluysa ve mevcut venv’i kullanmak istiyorsanız
Risk:
- mevcut venv eksik veya bozuksa servis daha sonra start aşamasında hata verebilir
Örnek:
./scripts/bootstrap.sh --dev-mode --skip-wscraper-install
--restart-wscraper
Çalışan wscraper-service sürecini zorla yeniden başlatır.
Ne yapar:
- mevcut PID dosyasını okuyup çalışan host service’i durdurur
- sonra yeni bir
wscraper-servicesüreci başlatır
Ne zaman kullanılır:
bin/wscraper-service/server.pydeğiştiyse- tracker adapter kodu değiştiyse
- eski host process cache/state taşıyor gibi görünüyorsa
Örnek:
./scripts/bootstrap.sh --dev-mode --restart-wscraper
Bayrak Kombinasyonları
En sık kullanılan kombinasyonlar:
- Normal geliştirme:
./scripts/bootstrap.sh --dev-mode
wscraperrepo’yu da güncelleyerek geliştirme:
./scripts/bootstrap.sh --dev-mode --update-wscraper
- Mevcut
wscrapercheckout’una hiç dokunmadan geliştirme:
./scripts/bootstrap.sh --dev-mode --skip-wscraper-fetch
- Host service’i yeniden başlatarak geliştirme:
./scripts/bootstrap.sh --dev-mode --restart-wscraper
- Ağsız veya hızlı tekrar başlatma denemesi:
./scripts/bootstrap.sh --dev-mode --skip-wscraper-fetch --skip-wscraper-install --restart-wscraper
Önemli Notlar
--update-wscraperile--skip-wscraper-fetchaynı anda kullanılmamalıdır. Mantıksal olarak biri güncelleme isterken diğeri git işlemlerini kapatır.--skip-wscraper-install, yalnızca host Python ortamının zaten doğru kurulu olduğundan eminseniz kullanılmalıdır.--restart-wscraper, yalnızca host service sürecini etkiler; Docker container’ları yeniden oluşturmaz.
Docker tarafında normal ağ erişimi hâlâ gereklidir. DNS problemi yaşarsanız Docker Desktop içinde sabit resolver (8.8.8.8, 1.1.1.1) tanımlayın. Docker DNS doğru ayarlanmamışsa:
pnpm install- image pull işlemleri
- container içi paket kurulumları
kurulum sırasında kırılabilir.
Önerilen Docker Engine ayarı:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"dns": ["8.8.8.8", "1.1.1.1"]
}
Docker Desktop yeniden başladıktan sonra şu testler başarılı olmalıdır:
docker run --rm alpine nslookup registry-1.docker.io
docker run --rm alpine nslookup files.pythonhosted.org
docker run --rm alpine nslookup cdn.playwright.dev
Host servis için kullanılacak ortam değişkenleri:
WSCRAPER_SERVICE_BASE_URLvarsayılan:http://host.docker.internal:8787WSCRAPER_SERVICE_TOKENvarsayılan: boşWSCRAPER_SERVICE_HOSTvarsayılan:0.0.0.0WSCRAPER_SERVICE_PORTvarsayılan:8787WSCRAPER_SERVICE_PYTHON_BINörnek:python3.12WSCRAPER_GIT_URLvarsayılan:https://github.com/wisecolt/Bookmark-Tracker.gitWSCRAPER_GIT_REFvarsayılan:main
Daha detaylı wscraper dökümü için:
Kullanım (Buffer)
- qBittorrent’te torrentleri ekleyin (UI listeye düşer).
- Loop yapmak istediğiniz torrent için listede upload ikonuna tıklayın ve
.torrentdosyasını seçin.- Bu işlem torrent dosyasını arşivler.
- Arşiv yüklenmeden Loop Setup başlamaz.
- Allow IP, Loop sayısı ve Delay değerlerini girip Start’a basın.
Kullanım (Timer)
- Etiketleri qBittorrent’te oluşturun (radarr, tv-sonarr gibi).
- Timer ekranında etiket seçip seed süresi kuralı ekleyin.
- Süresi dolan torrentler qBittorrent ve diskten silinir.
Production
./scripts/bootstrap.sh --prod-mode
Ardından http://localhost:3001
Ortam Değişkenleri
QBIT_BASE_URL,QBIT_USERNAME,QBIT_PASSWORDAPP_USERNAME,APP_PASSWORD,JWT_SECRETPOLL_INTERVAL_MS,ENFORCE_INTERVAL_MS,DEFAULT_DELAY_MS,MAX_LOOP_LIMITWEB_ALLOWED_HOSTS(ör:localhost,qbuffer.bee,qbuffer.panda)WSCRAPER_SERVICE_BASE_URL,WSCRAPER_SERVICE_TOKEN
Klasör Yapısı
apps/server: Express API + socket.ioapps/web: Vite React UIdata: JSON DB, loglar, arşivlenen torrent dosyaları