Files
q-buffer/README.md

377 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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ıç
1) `.env.example` dosyasını `.env` olarak kopyalayın ve değerleri doldurun.
2) İlk kurulumda `wscraper-service` tarafını okuyun: `Watcher` özelliği için host makinede Python 3.10+ gerekir.
3) Geliştirme ortamını başlatın:
```bash
./scripts/bootstrap.sh --dev-mode
```
4) 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 `wscraper` repo'yu `bin/wscraper` altına otomatik clone eder
- Docker servislerini `up --build` ile kaldırır
- host `wscraper-service` için Python venv hazırlar
- eksik Python paketlerini ve Playwright bağımlılıklarını kurar
- `wscraper-service`i 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 kendisidir
- `bin/wscraper-service/server.py`, `q-buffer` backend'in çağırdığı host servisidir
- yani `wscraper` dizininde yalnızca `server.py` yok; asıl tracker adapter kodları `bin/wscraper/src/wscraper/...` altındadır
Geçerli kurulum modeli:
- önce `q-buffer` repo clone edilir
- `bootstrap.sh`, `bin/wscraper` eksikse `wscraper` repo'yu otomatik clone eder
- repo zaten varsa olduğu gibi bırakır
- sadece açıkça `--update-wscraper` verirseniz mevcut checkout `git pull --ff-only` ile güncellenir
İlk kurulum adımları:
1. `q-buffer` repo'yu clone edin.
2. `.env.example` dosyasını `.env` olarak kopyalayın.
3. qBittorrent ve uygulama auth ayarlarını doldurun.
4. watcher servis ayarlarını kontrol edin:
- `WSCRAPER_SERVICE_BASE_URL=http://host.docker.internal:8787`
- `WSCRAPER_SERVICE_TOKEN=` boş bırakılabilir
- `WSCRAPER_SERVICE_HOST=0.0.0.0`
- `WSCRAPER_SERVICE_PORT=8787`
- `WSCRAPER_SERVICE_PYTHON_BIN=python3.12`
- `WSCRAPER_GIT_URL=https://github.com/wisecolt/Bookmark-Tracker.git`
- `WSCRAPER_GIT_REF=main`
5. Host makinede uygun Python sürümü olduğundan emin olun:
- `python3.12 --version`
- yoksa `python3.11` veya `python3.10`
6. Repo root'ta şu komutu çalıştırın:
```bash
./scripts/bootstrap.sh --dev-mode
```
7. İlk bootstrap tamamlandıktan sonra `q-buffer/bin/wscraper` altında şu dosyaların geldiğini doğrulayın:
- `pyproject.toml`
- `setup.py`
- `src/wscraper/cli.py`
- `src/wscraper/sites/happyfappy.py`
- `src/wscraper/sites/privatehd.py`
Bu komut şunları yapar:
- `bin/wscraper` yoksa `WSCRAPER_GIT_URL` ve `WSCRAPER_GIT_REF` ile repo'yu clone eder
- Docker `web` ve `server` servislerini `up --build` ile başlatır
- host'ta `.runtime/wscraper-service/.venv` oluşturur
- `scrapling[fetchers]` kurar
- `scrapling install` çalıştırır
- `bin/wscraper-service/server.py` sürecini başlatır
Kurulumdan sonra kontrol edilecekler:
```bash
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:
```bash
./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 `web` ve `server` servislerini ayağa kaldırır
- host makinede `wscraper-service` sü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:
```bash
./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-service` sü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:
```bash
./scripts/bootstrap.sh --prod-mode
```
#### `--skip-wscraper-fetch`
`bin/wscraper` repo yönetimini tamamen atlar.
Ne yapar:
- `bin/wscraper` yoksa clone etmeye çalışmaz
- varsa update etmeye çalışmaz
- `WSCRAPER_GIT_URL` ve `WSCRAPER_GIT_REF` değerlerini kullanmaz
Ne yapmaz:
- `wscraper-service` Python kurulumunu atlamaz
- `wscraper-service` başlatmayı atlamaz
- Docker servislerini atlamaz
Ne zaman kullanılır:
- `bin/wscraper` reposunu manuel yönetiyorsanız
- farklı bir branch üzerinde çalışıyorsanız
- bootstrapin `git clone/pull` davranışına dokunmasını istemiyorsanız
Örnek:
```bash
./scripts/bootstrap.sh --dev-mode --skip-wscraper-fetch
```
#### `--update-wscraper`
Mevcut `bin/wscraper` checkoutunu günceller.
Ne yapar:
- `bin/wscraper` yoksa önce clone eder
- repo varsa `git pull --ff-only` dener
- yalnızca fast-forward güncellemeye izin verir
Güvenlik davranışı:
- `bin/wscraper` içinde local değişiklik varsa script durur
- merge/rebase yapmaz
- mevcut branchi zorla değiştirmez
Ne zaman kullanılır:
- `wscraper` repodaki son değişiklikleri almak istediğinizde
- watcher tracker güncellemeleri geldiyse
- `q-buffer` ile birlikte `wscraper`ı da senkron tutmak istediğinizde
Örnek:
```bash
./scripts/bootstrap.sh --dev-mode --update-wscraper
```
#### `--skip-wscraper-install`
Host makinedeki `wscraper-service` Python kurulum kontrolünü atlar.
Ne yapar:
- `.runtime/wscraper-service/.venv` doğrulamasını atlar
- `pip install` ve `scrapling install` çalıştırmaz
Ne yapmaz:
- `wscraper-service` başlatmayı engellemez
- `bin/wscraper` repo 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 venvi kullanmak istiyorsanız
Risk:
- mevcut venv eksik veya bozuksa servis daha sonra start aşamasında hata verebilir
Örnek:
```bash
./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 servicei durdurur
- sonra yeni bir `wscraper-service` süreci başlatır
Ne zaman kullanılır:
- `bin/wscraper-service/server.py` değiştiyse
- tracker adapter kodu değiştiyse
- eski host process cache/state taşıyor gibi görünüyorsa
Örnek:
```bash
./scripts/bootstrap.sh --dev-mode --restart-wscraper
```
### Bayrak Kombinasyonları
En sık kullanılan kombinasyonlar:
- Normal geliştirme:
```bash
./scripts/bootstrap.sh --dev-mode
```
- `wscraper` repoyu da güncelleyerek geliştirme:
```bash
./scripts/bootstrap.sh --dev-mode --update-wscraper
```
- Mevcut `wscraper` checkoutuna hiç dokunmadan geliştirme:
```bash
./scripts/bootstrap.sh --dev-mode --skip-wscraper-fetch
```
- Host servicei yeniden başlatarak geliştirme:
```bash
./scripts/bootstrap.sh --dev-mode --restart-wscraper
```
- Ağsız veya hızlı tekrar başlatma denemesi:
```bash
./scripts/bootstrap.sh --dev-mode --skip-wscraper-fetch --skip-wscraper-install --restart-wscraper
```
### Önemli Notlar
- `--update-wscraper` ile `--skip-wscraper-fetch` aynı 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 containerları 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ı:
```json
{
"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:
```bash
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_URL` varsayılan: `http://host.docker.internal:8787`
- `WSCRAPER_SERVICE_TOKEN` varsayılan: boş
- `WSCRAPER_SERVICE_HOST` varsayılan: `0.0.0.0`
- `WSCRAPER_SERVICE_PORT` varsayılan: `8787`
- `WSCRAPER_SERVICE_PYTHON_BIN` örnek: `python3.12`
- `WSCRAPER_GIT_URL` varsayılan: `https://github.com/wisecolt/Bookmark-Tracker.git`
- `WSCRAPER_GIT_REF` varsayılan: `main`
Daha detaylı `wscraper` dökümü için:
- [bin/wscraper/README.md](/Users/wisecolt-macmini/Project/q-buffer/bin/wscraper/README.md)
## Kullanım (Buffer)
1) qBittorrentte torrentleri ekleyin (UI listeye düşer).
2) Loop yapmak istediğiniz torrent için listede **upload ikonu**na tıklayın ve `.torrent` dosyasını seçin.
- Bu işlem torrent dosyasını arşivler.
- **Arşiv yüklenmeden Loop Setup başlamaz.**
3) Allow IP, Loop sayısı ve Delay değerlerini girip **Start**a basın.
## Kullanım (Timer)
1) Etiketleri qBittorrentte oluşturun (radarr, tv-sonarr gibi).
2) Timer ekranında etiket seçip seed süresi kuralı ekleyin.
3) Süresi dolan torrentler qBittorrent ve diskten silinir.
## Production
```bash
./scripts/bootstrap.sh --prod-mode
```
Ardından http://localhost:3001
## Ortam Değişkenleri
- `QBIT_BASE_URL`, `QBIT_USERNAME`, `QBIT_PASSWORD`
- `APP_USERNAME`, `APP_PASSWORD`, `JWT_SECRET`
- `POLL_INTERVAL_MS`, `ENFORCE_INTERVAL_MS`, `DEFAULT_DELAY_MS`, `MAX_LOOP_LIMIT`
- `WEB_ALLOWED_HOSTS` (ör: `localhost,qbuffer.bee,qbuffer.panda`)
- `WSCRAPER_SERVICE_BASE_URL`, `WSCRAPER_SERVICE_TOKEN`
## Klasör Yapısı
- `apps/server`: Express API + socket.io
- `apps/web`: Vite React UI
- `data`: JSON DB, loglar, arşivlenen torrent dosyaları