Ga naar inhoud

Architectuur

Gevorderd

Zoek waar code staat en welke regels gelden voordat je iets groots wijzigt.

HolyArrs is één Go-programma met de web-app ingebouwd. Het serveert de web-app en een JSON-API op poort 6262 en bewaart zijn data in 2 SQLite-bestanden in de configuratiemap. Het roept downloaders, bronnen (via Jackett of Prowlarr), mediaservers, meldingskanalen en de HolyArrs-metadataserver aan.

Volg één aanvraag. Iemand vraagt op Ontdekken een film aan.

  1. requests legt de aanvraag vast.
  2. Na goedkeuring vraagt movies aan sources om releases.
  3. De keuzeregels in mediafiles geven ze een score.
  4. downloads stuurt de beste naar de downloader.
  5. Als die klaar is, importeert mediafiles het bestand.
  6. mediaservers en alerts krijgen bericht.
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 staat in de hoofdmap van de repo, omdat go:embed niet bij een bovenliggende map kan.

Je wilt wijzigen Kijk in
Hoe een release wordt gekozen internal/mediafiles
Een downloaderclient internal/downloads, contracttests in internal/downloads/conformance_test.go
Een meldingskanaal internal/alerts
Aanmelden, gebruikers, API-sleutels internal/accounts
De wizard voor de eerste start internal/setup, app/frontend/src/routes/welcome
Een klaar bestand importeren (uitpakken, tags, koppelen aan een titel) internal/importer
Bibliotheekmappen, overnemen en hernoemen internal/library
Hoe rijen en planken worden gekozen en geordend internal/suggest
Welke onderdelen van de app aanstaan internal/core/parts
Het adres van een pagina app/frontend/src/routes/
Een migratie internal/core/database/migrations/
De Docker-image deploy/Dockerfile

Controles in app/backend/tools/structurecheck laten de build mislukken als er een regel wordt overtreden. Voer ze uit met de regel in Testen.

  • Laagvolgorde. Een module importeert alleen modules op een lagere laag, en alleen hun hoofdpakket. Modules op dezelfde laag importeren elkaar nooit.
  • Omhoog aanroepen. Heeft een lagere module iets nodig van een hogere, dan geeft de hogere gewone data door naar beneden, of de lagere definieert een kleine interface die wiring.go invult.
  • SQL blijft thuis. Alleen de eigen store*.go-bestanden van een module bevatten SQL, en alleen voor de eigen tabellen. Wil je rijen van een andere module lezen, roep dan de service van die module aan.
  • Gedeelde tabellen horen bij core. Gebruik settings, schedules, secrets, jobs en events via de hulpfuncties van core.
  • Eén weg naar buiten. Elke aanroep naar buiten gaat via core/outbound.
  • Uitgestelde functies registreren een schakelaar bij core/startup. Staat die uit, dan bestaat de route niet en verbergt de pagina de functie.
  • Geen verzamelpakketten. Geen util, common, shared of helpers.

De laagvolgorde staat in Modules.

In een module

Elke backendmodule gebruikt dezelfde bestandsnamen.

Bestand Bevat
routes.go API-routes, elk met het recht dat het nodig heeft
service.go en onderwerpbestanden Logica die andere modules aanroepen
store.go, store_<topic>.go Alle SQL voor de eigen tabellen van de module
types.go De records van de module

Aan de webkant bevat lib/<module>/ een index.ts (wat andere modules mogen gebruiken), de Svelte-onderdelen met hun tests, en api.ts en state.svelte.ts alleen als de module eigen aanroepen of een eigen status heeft.

Core-pakketten

Core is de onderliggende infrastructuur. Het bevat geen productregels en importeert geen module.

Pakket Bevat
core/database Beide SQLite-bestanden openen en migreren, queryhulpjes, hulpjes voor instellingen en gebeurtenissen, gedeelde rijvelden, geschiedenis opschonen
core/files Hulpjes voor bestanden en mappen, vrije schijfruimte
core/releasename Kwaliteit, groep en afleveringsnummers uit de naam van een release
core/outbound De enige weg om externe servers aan te roepen, met adrescontroles
core/secrets De sleutelopslag en sleutelrotatie
core/logs De applog en crashnotities
core/jobs De takenwachtrij, schema’s en de lussen die na een crash herstarten
core/webserver Router, URL base, compressie, live push
core/startup De gebruiker waarmee het programma draait, modus voor weinig geheugen, uitgestelde schakelaars, geheugenlimiet, onderdelen
core/parts De schakelaars voor onderdelen die elke module raadpleegt voordat die iets serveert of uitvoert
core/model Gedeelde typen zoals actors en subjects

Moet core bij data van een module, dan registreert de module in wiring.go een hook bij core. Sleutelrotatie werkt zo.

Data
Bestand Bevat
holyarrs.db De bibliotheek, aanvragen, instellingen en al het andere dat ertoe doet
holyarrs-events.db Geschiedenis en andere gebeurtenisrijen. Dit bestand groeit en wordt opgeschoond zonder het hoofdbestand aan te raken

Migraties zijn genummerde SQL-bestanden in core/database/migrations/main en core/database/migrations/events. Ze draaien bij het starten.

Gerelateerde pagina’s

Link naar Gerelateerde pagina’s

HolyArrs is gratis. Heeft het je tijd bespaard, geef het een ster op GitHub, sponsor het of trakteer me op een kop koffie.