İçeriğe geç

Mimari

Uzman

Büyük bir şeyi değiştirmeden önce kodun nerede durduğunu ve hangi kuralların geçerli olduğunu bul.

HolyArrs, web uygulaması içine gömülü tek bir Go programıdır. Web uygulamasını ve bir JSON API’sini 6262 portundan sunar, verilerini yapılandırma klasöründeki 2 SQLite dosyasında tutar. İndiricilere, Kaynaklara (Jackett veya Prowlarr üzerinden), medya sunucularına, uyarı kanallarına ve HolyArrs metadata sunucusuna dışarıdan istek atar.

Tek bir isteği takip et. Biri Explore’da (Keşfet) bir film istiyor.

  1. requests isteği kaydeder.
  2. Onaydan sonra movies, sources modülünden sürüm adaylarını ister.
  3. mediafiles içindeki seçim kuralları bunlara puan verir.
  4. downloads en iyisini indiriciye gönderir.
  5. İndirme bitince mediafiles dosyayı içe aktarır.
  6. mediaservers ve alerts haberdar edilir.
app/backend/cmd/holyarrs/ main.go starts the program; wiring.go builds the modules and joins them
app/backend/internal/<module>/ one flat folder per module
app/backend/internal/core/ plumbing every module may use
app/backend/tools/ dev-only programs
app/frontend/ the SvelteKit web app; embed.go bundles its build
app/frontend/src/routes/<page>/ thin pages that combine module parts
app/frontend/src/lib/<module>/ each module's web code
app/frontend/src/lib/ui/ parts used by 2 or more modules, and nothing else
app/frontend/src/lib/core/ server client, app state, helpers
app/tests/ end-to-end tests (Playwright)
deploy/ the Dockerfile and release scripts
docs/ guides and these pages

go.mod repo kökünde durur, çünkü go:embed üst klasöre uzanamaz.

Değiştirmek istediğin şey Bakılacak yer
Bir sürüm adayının nasıl seçildiği internal/mediafiles
Bir indirici istemcisi internal/downloads, sözleşme testleri internal/downloads/conformance_test.go içinde
Bir uyarı kanalı internal/alerts
Giriş, kullanıcılar, API anahtarları internal/accounts
İlk açılış sihirbazı internal/setup, app/frontend/src/routes/welcome
Biten bir dosyayı içe aktarma (arşivden çıkarma, etiketler, eşleştirme) internal/importer
Kütüphane klasörleri, sahiplenme ve yeniden adlandırma internal/library
Satırların ve rafların nasıl seçilip sıralandığı internal/suggest
Uygulamanın hangi modüllerinin açık olduğu internal/core/parts
Bir sayfa adresi app/frontend/src/routes/
Bir migrasyon internal/core/database/migrations/
Docker imajı deploy/Dockerfile

app/backend/tools/structurecheck içindeki denetimler, bir kural bozulduğunda derlemeyi başarısız kılar. Bunları Test sayfasındaki satırla çalıştır.

  • Katman sırası. Bir modül yalnızca alt katmandaki modülleri, o da sadece kök paketlerini içe aktarır. Aynı katmandaki modüller birbirini asla içe aktarmaz.
  • Yukarı çağırma. Alttaki bir modülün üsttekinden bir şeye ihtiyacı olursa, ya üstteki düz veriyi aşağı geçirir ya da alttaki küçük bir arayüz tanımlar ve bunu wiring.go doldurur.
  • SQL kendi evinde kalır. SQL’i yalnızca modülün kendi store*.go dosyaları tutar, o da sadece kendi tabloları üzerinde. Başka bir modülün satırlarını okumak için onun servisini çağır.
  • Ortak tablolar core’a aittir. settings, schedules, secrets, jobs ve events tablolarına core yardımcıları üzerinden eriş.
  • Tek çıkış yolu. Dışarıya giden her çağrı core/outbound üzerinden geçer.
  • Bekletilen özellikler core/startup ile bir anahtar kaydeder. Anahtar kapalıyken rota yoktur ve sayfa özelliği gizler.
  • Her şeyin atıldığı paketler yok. util, common, shared veya helpers yok.

Katman sırası Modüller sayfasında.

Bir modülün içi

Her backend modülü aynı dosya adlarını kullanır.

Dosya İçeriği
routes.go API rotaları, her biri gerektirdiği izinle
service.go ve konu dosyaları Diğer modüllerin çağırdığı mantık
store.go, store_<topic>.go Modülün kendi tabloları için tüm SQL
types.go Modülün kayıtları

Web tarafında lib/<module>/ şunları tutar: index.ts (diğer modüllerin kullanabileceği şeyler), Svelte parçaları ve testleri, ayrıca yalnızca kendi çağrıları veya durumu varsa api.ts ve state.svelte.ts.

Core paketleri

Core, altyapıdır. Ürün kuralı tutmaz ve hiçbir modülü içe aktarmaz.

Paket İçeriği
core/database Her iki SQLite dosyasını açma ve migrasyon, sorgu yardımcıları, ayar ve olay yardımcıları, ortak satır alanları, geçmişi kırpma
core/files Dosya ve klasör yardımcıları, boş disk alanı
core/releasename Bir sürüm adından kalite, grup ve bölüm numaraları
core/outbound Dış sunucuları çağırmanın tek yolu, adres denetimleriyle
core/secrets Anahtar deposu ve anahtar döndürme
core/logs Uygulama günlüğü ve çökme notları
core/jobs İş kuyruğu, zamanlamalar ve çöküşten sonra yeniden başlayan döngüler
core/webserver Router altyapısı, URL base, sıkıştırma, canlı gönderim
core/startup Çalışma kullanıcısı, düşük bellek modu, bekletilen anahtarlar, bellek sınırı, modüller
core/parts Her modülün sunmadan veya çalışmadan önce sorduğu modül anahtarları
core/model Aktörler ve konular gibi ortak türler

Core’un modül verisine dokunması gerekirse, modül wiring.go içinde core’a bir kanca kaydeder. Anahtar döndürme böyle çalışır.

Veri
Dosya İçeriği
holyarrs.db Kütüphane, istekler, ayarlar ve önemli diğer her şey
holyarrs-events.db Geçmiş ve diğer olay satırları. Büyür ve ana dosyaya dokunmadan kırpılır

Migrasyonlar, core/database/migrations/main ve core/database/migrations/events içindeki numaralı SQL dosyalarıdır. Başlangıçta çalışırlar.

HolyArrs ücretsiz. Zamanından tasarruf ettirdiyse GitHub'da yıldızla, sponsor ol ya da bana bir kahve ısmarla.