Sari la conținut

Arhitectura

Expert

Află unde stă codul și ce reguli se aplică, înainte să schimbi ceva mare.

HolyArrs este un singur program Go cu aplicația web inclusă. Servește aplicația web și un API JSON pe portul 6262 și își ține datele în 2 fișiere SQLite din dosarul de configurare. Apelează programe de descărcare, Surse (prin Jackett sau Prowlarr), servere media, canale de alerte și serverul de metadate HolyArrs.

Urmărește o singură cerere. Cineva cere un film în Explore.

  1. requests notează cererea.
  2. După aprobare, movies cere variante de la sources.
  3. Regulile de alegere din mediafiles le notează cu puncte.
  4. downloads trimite cea mai bună variantă la programul de descărcare.
  5. Când se termină, mediafiles importă fișierul.
  6. mediaservers și alerts sunt anunțate.
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 stă în rădăcina depozitului, pentru că go:embed nu poate ajunge într-un dosar părinte.

Vrei să schimbi Caută în
Cum se alege o variantă internal/mediafiles
Un client de program de descărcare internal/downloads, teste de contract în internal/downloads/conformance_test.go
Un canal de alerte internal/alerts
Conectare, utilizatori, chei API internal/accounts
Asistentul de la prima pornire internal/setup, app/frontend/src/routes/welcome
Importul unui fișier terminat (despachetare, etichete, potrivire) internal/importer
Dosarele Bibliotecii, preluare și redenumire internal/library
Cum se aleg și se ordonează rândurile și rafturile internal/suggest
Ce părți din aplicație sunt pornite internal/core/parts
Adresa unei pagini app/frontend/src/routes/
O migrare internal/core/database/migrations/
Imaginea Docker deploy/Dockerfile

Verificările din app/backend/tools/structurecheck opresc build-ul când se încalcă o regulă. Le rulezi cu linia din Testare.

  • Ordinea straturilor. Un modul importă doar module de pe un strat mai jos, și doar pachetul lor de bază. Modulele de pe același strat nu se importă niciodată între ele.
  • Apel în sus. Când un modul de jos are nevoie de ceva de la unul de sus, cel de sus trimite în jos date simple, sau cel de jos definește o interfață mică pe care o completează wiring.go.
  • SQL rămâne acasă. Doar fișierele store*.go ale unui modul conțin SQL, și doar pentru tabelele lui. Ca să citești rândurile altui modul, apelează serviciul lui.
  • Tabelele comune aparțin lui core. Ajungi la settings, schedules, secrets, jobs și events prin ajutoarele din core.
  • O singură ieșire. Orice apel spre exterior trece prin core/outbound.
  • Funcțiile reținute înregistrează un comutator în core/startup. Cât timp e oprit, ruta nu există, iar pagina ascunde funcția.
  • Fără pachete cu de toate. Fără util, common, shared sau helpers.

Ordinea straturilor e în Module.

În interiorul unui modul

Fiecare modul din backend folosește aceleași nume de fișiere.

Fișier Conține
routes.go Rutele API, fiecare cu permisiunea de care are nevoie
service.go și fișierele pe teme Logica pe care o apelează alte module
store.go, store_<topic>.go Tot SQL-ul pentru tabelele proprii ale modulului
types.go Înregistrările modulului

În partea web, lib/<module>/ conține index.ts (ce pot folosi alte module), părțile lui Svelte și testele lor, plus api.ts și state.svelte.ts doar când are apeluri sau stare proprii.

Pachetele core

Core este instalația de bază. Nu are reguli de produs și nu importă niciun modul.

Pachet Conține
core/database Deschiderea și migrarea ambelor fișiere SQLite, ajutoare pentru interogări, setări și evenimente, câmpuri comune de rând, tăierea istoricului
core/files Ajutoare pentru fișiere și dosare, spațiu liber pe disc
core/releasename Calitate, grup și numere de episod dintr-un nume de variantă
core/outbound Singura cale de a apela servere externe, cu verificări de adresă
core/secrets Depozitul de chei și rotirea cheilor
core/logs Jurnalul aplicației și notele de oprire forțată
core/jobs Coada de sarcini, programele și buclele care repornesc după o cădere
core/webserver Instalația routerului, URL base, compresie, trimitere live
core/startup Utilizatorul de rulare, mod cu memorie puțină, comutatoare pentru funcții reținute, limită de memorie, părți
core/parts Comutatoarele de părți pe care le întreabă fiecare modul înainte să servească sau să ruleze
core/model Tipuri comune, cum ar fi actori și subiecte

Când core trebuie să atingă datele unui modul, modulul înregistrează un cârlig în core, în wiring.go. Rotirea cheilor funcționează așa.

Datele
Fișier Conține
holyarrs.db Biblioteca, cererile, setările și tot ce contează
holyarrs-events.db Istoricul și alte rânduri de evenimente. Crește și e tăiat fără să atingă fișierul principal

Migrările sunt fișiere SQL numerotate în core/database/migrations/main și core/database/migrations/events. Rulează la pornire.

HolyArrs este gratuit. Dacă ți-a economisit timp, dă-i o stea pe GitHub, sponsorizează-l sau cumpără-mi o cafea.