diff --git a/.env.example b/.env.example index 7e68fea..0bad304 100644 --- a/.env.example +++ b/.env.example @@ -26,4 +26,6 @@ WSCRAPER_SERVICE_TOKEN= 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 NODE_ENV=development diff --git a/README.md b/README.md index 39b43e4..487d738 100644 --- a/README.md +++ b/README.md @@ -31,12 +31,13 @@ q-buffer, qBittorrent üzerinde torrentleri kontrollü şekilde döngüye almay `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-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ı @@ -46,43 +47,45 @@ Bu bölüm ilk kez `q-buffer` kuranlar içindir. Sık karışan nokta şu: - `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 -Mevcut geçici kurulum modeli: +Geçerli kurulum modeli: - önce `q-buffer` repo clone edilir -- sonra `wscraper` repo ayrıca clone edilir -- clone edilen `wscraper` kodu `q-buffer/bin/wscraper` altına yerleştirilir - -Yani yeni bir makinede yalnızca `q-buffer` clone etmek şu an yeterli değildir; `wscraper` kaynak kodunun da ayrıca gelmesi gerekir. +- `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. `wscraper` repo'yu ayrıca clone edin ve `q-buffer/bin/wscraper` altına yerleştirin. -3. `.env.example` dosyasını `.env` olarak kopyalayın. -4. qBittorrent ve uygulama auth ayarlarını doldurun. -5. watcher servis ayarlarını kontrol 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` -6. `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` -7. Host makinede uygun Python sürümü olduğundan emin olun: + - `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` -8. Repo root'ta şu komutu çalıştırın: +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 @@ -105,10 +108,192 @@ 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` repo’sunu manuel yönetiyorsanız +- farklı bir branch üzerinde çalışıyorsanız +- bootstrap’in `git clone/pull` davranışına dokunmasını istemiyorsanız + +Örnek: + +```bash +./scripts/bootstrap.sh --dev-mode --skip-wscraper-fetch +``` + +#### `--update-wscraper` + +Mevcut `bin/wscraper` checkout’unu 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 branch’i zorla değiştirmez + +Ne zaman kullanılır: +- `wscraper` repo’daki 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 venv’i 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 service’i 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` repo’yu da güncelleyerek geliştirme: + +```bash +./scripts/bootstrap.sh --dev-mode --update-wscraper +``` + +- Mevcut `wscraper` checkout’una hiç dokunmadan geliştirme: + +```bash +./scripts/bootstrap.sh --dev-mode --skip-wscraper-fetch +``` + +- Host service’i 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 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` @@ -147,6 +332,8 @@ Host servis için kullanılacak ortam değişkenleri: - `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: diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh index 7fa83ea..f57a912 100755 --- a/scripts/bootstrap.sh +++ b/scripts/bootstrap.sh @@ -2,6 +2,7 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +WSCRAPER_DIR="$ROOT_DIR/bin/wscraper" RUNTIME_DIR="$ROOT_DIR/.runtime/wscraper-service" VENV_DIR="$RUNTIME_DIR/.venv" PID_FILE="$RUNTIME_DIR/wscraper-service.pid" @@ -10,12 +11,14 @@ MARKER_FILE="$RUNTIME_DIR/.setup-complete" MODE="" SKIP_INSTALL="false" RESTART_WSCRAPER="false" +SKIP_FETCH="false" +UPDATE_WSCRAPER="false" usage() { cat <<'EOF' Usage: - ./scripts/bootstrap.sh --dev-mode [--skip-wscraper-install] [--restart-wscraper] - ./scripts/bootstrap.sh --prod-mode [--skip-wscraper-install] [--restart-wscraper] + ./scripts/bootstrap.sh --dev-mode [--skip-wscraper-fetch] [--update-wscraper] [--skip-wscraper-install] [--restart-wscraper] + ./scripts/bootstrap.sh --prod-mode [--skip-wscraper-fetch] [--update-wscraper] [--skip-wscraper-install] [--restart-wscraper] EOF } @@ -30,6 +33,12 @@ while [[ $# -gt 0 ]]; do --skip-wscraper-install) SKIP_INSTALL="true" ;; + --skip-wscraper-fetch) + SKIP_FETCH="true" + ;; + --update-wscraper) + UPDATE_WSCRAPER="true" + ;; --restart-wscraper|--restart) RESTART_WSCRAPER="true" ;; @@ -65,6 +74,8 @@ WSCRAPER_SERVICE_HOST="${WSCRAPER_SERVICE_HOST:-0.0.0.0}" WSCRAPER_SERVICE_PORT="${WSCRAPER_SERVICE_PORT:-8787}" WSCRAPER_SERVICE_TOKEN="${WSCRAPER_SERVICE_TOKEN:-}" WSCRAPER_SERVICE_PYTHON_BIN="${WSCRAPER_SERVICE_PYTHON_BIN:-}" +WSCRAPER_GIT_URL="${WSCRAPER_GIT_URL:-https://github.com/wisecolt/Bookmark-Tracker.git}" +WSCRAPER_GIT_REF="${WSCRAPER_GIT_REF:-main}" detect_python_bin() { if [[ -n "$WSCRAPER_SERVICE_PYTHON_BIN" ]] && command -v "$WSCRAPER_SERVICE_PYTHON_BIN" >/dev/null 2>&1; then @@ -89,6 +100,55 @@ detect_python_bin() { PYTHON_BIN="$(detect_python_bin)" +ensure_wscraper_repo() { + if [[ "$SKIP_FETCH" == "true" ]]; then + echo "wscraper repo kontrolu atlandi." + return + fi + + if [[ ! -d "$WSCRAPER_DIR" ]]; then + echo "wscraper repo klonlaniyor..." + git clone --branch "$WSCRAPER_GIT_REF" "$WSCRAPER_GIT_URL" "$WSCRAPER_DIR" + return + fi + + if [[ ! -d "$WSCRAPER_DIR/.git" ]]; then + echo "bin/wscraper dizini var ama git reposu degil. Lutfen duzeltin veya dizini temizleyin." >&2 + exit 1 + fi + + if [[ "$UPDATE_WSCRAPER" != "true" ]]; then + echo "wscraper repo mevcut, yeniden klonlanmayacak." + return + fi + + local status_output + status_output="$(git -C "$WSCRAPER_DIR" status --porcelain)" + if [[ -n "$status_output" ]]; then + echo "wscraper repo kirli durumda; --update-wscraper uygulanmadi." >&2 + echo "Lutfen bin/wscraper icindeki degisiklikleri commit edin veya temizleyin." >&2 + exit 1 + fi + + echo "wscraper repo guncelleniyor..." + git -C "$WSCRAPER_DIR" pull --ff-only +} + +validate_wscraper_repo() { + local expected_paths=( + "$WSCRAPER_DIR/pyproject.toml" + "$WSCRAPER_DIR/setup.py" + "$WSCRAPER_DIR/src/wscraper/cli.py" + ) + local path + for path in "${expected_paths[@]}"; do + if [[ ! -e "$path" ]]; then + echo "wscraper repo eksik veya bozuk gorunuyor: $path bulunamadi." >&2 + exit 1 + fi + done +} + service_running() { if [[ ! -f "$PID_FILE" ]]; then return 1 @@ -160,7 +220,7 @@ start_wscraper_service() { WSCRAPER_SERVICE_HOST="$WSCRAPER_SERVICE_HOST" \ WSCRAPER_SERVICE_PORT="$WSCRAPER_SERVICE_PORT" \ WSCRAPER_SERVICE_TOKEN="$WSCRAPER_SERVICE_TOKEN" \ - PYTHONPATH="$ROOT_DIR/bin/wscraper/src" \ + PYTHONPATH="$WSCRAPER_DIR/src" \ "$VENV_DIR/bin/python3" \ "$ROOT_DIR/bin/wscraper-service/server.py" \ >>"$LOG_FILE" 2>&1 & @@ -192,6 +252,8 @@ run_docker() { docker compose -f "$ROOT_DIR/docker-compose.yml" up --build -d } +ensure_wscraper_repo +validate_wscraper_repo install_wscraper_service start_wscraper_service run_docker