Architettura
Esperto
Scopri dove si trova il codice e quali regole valgono prima di cambiare qualcosa di grande.
In breve
Link a In breveHolyArrs è un unico programma Go con l’app web incorporata. Serve l’app web e un’API JSON sulla porta 6262 e tiene i dati in 2 file SQLite nella cartella di configurazione. Comunica con i downloader, le Fonti (tramite Jackett o Prowlarr), i server multimediali, i canali di avviso e il server di metadati di HolyArrs.
Segui una richiesta. Qualcuno richiede un film su Explore (Esplora).
requestsregistra la richiesta.- Dopo l’approvazione,
movieschiede le release asources. - Le regole di scelta in
mediafilesle valutano. downloadsmanda la migliore al downloader.- Quando ha finito,
mediafilesimporta il file. mediaserversealertsvengono avvisati.
Mappa del codice
Link a Mappa del codiceapp/backend/cmd/holyarrs/ main.go starts the program; wiring.go builds the modules and joins themapp/backend/internal/<module>/ one flat folder per moduleapp/backend/internal/core/ plumbing every module may useapp/backend/tools/ dev-only programsapp/frontend/ the SvelteKit web app; embed.go bundles its buildapp/frontend/src/routes/<page>/ thin pages that combine module partsapp/frontend/src/lib/<module>/ each module's web codeapp/frontend/src/lib/ui/ parts used by 2 or more modules, and nothing elseapp/frontend/src/lib/core/ server client, app state, helpersapp/tests/ end-to-end tests (Playwright)deploy/ the Dockerfile and release scriptsdocs/ guides and these pagesgo.mod si trova nella radice del repository perché go:embed non può raggiungere una cartella superiore.
Dove trovare le cose
Link a Dove trovare le cose| Vuoi cambiare | Guarda in |
|---|---|
| Come viene scelta una release | internal/mediafiles |
| Un client di downloader | internal/downloads, test di contratto in internal/downloads/conformance_test.go |
| Un canale di avviso | internal/alerts |
| Accesso, utenti, chiavi API | internal/accounts |
| La procedura guidata del primo avvio | internal/setup, app/frontend/src/routes/welcome |
| Importare un file completato (decompressione, tag, abbinamento) | internal/importer |
| Cartelle della Libreria, adozione e rinomina | internal/library |
| Come vengono scelte e ordinate righe e scaffali | internal/suggest |
| Quali parti dell’app sono attive | internal/core/parts |
| L’indirizzo di una pagina | app/frontend/src/routes/ |
| Una migrazione | internal/core/database/migrations/ |
| L’immagine Docker | deploy/Dockerfile |
Le regole
Link a Le regoleI controlli in app/backend/tools/structurecheck fanno fallire la compilazione quando una regola viene infranta. Eseguili con la riga indicata in Test.
- Ordine dei livelli. Un modulo importa solo moduli di un livello inferiore, e solo il loro pacchetto radice. I moduli dello stesso livello non si importano mai a vicenda.
- Chiamare verso l’alto. Quando un modulo inferiore ha bisogno di qualcosa da uno superiore, quello superiore gli passa dati semplici, oppure quello inferiore definisce una piccola interfaccia che
wiring.goriempie. - L’SQL resta a casa. Solo i file
store*.godi un modulo contengono SQL, e solo sulle sue tabelle. Per leggere le righe di un altro modulo, chiama il suo servizio. - Le tabelle condivise appartengono a core. Raggiungi
settings,schedules,secrets,jobsedeventstramite gli helper di core. - Una sola uscita. Ogni chiamata verso l’esterno passa da
core/outbound. - Le funzioni in sospeso registrano un interruttore con
core/startup. Finché è disattivato, la route non c’è e la pagina nasconde la funzione. - Niente pacchetti ripostiglio. Niente
util,common,sharedohelpers.
L’ordine dei livelli è in Moduli.
Per esperti
Link a Per espertiDentro un modulo
Ogni modulo del backend usa gli stessi nomi di file.
| File | Contiene |
|---|---|
routes.go |
Le route dell’API, ciascuna con il permesso che richiede |
service.go e i file per argomento |
La logica che chiamano gli altri moduli |
store.go, store_<topic>.go |
Tutto l’SQL per le tabelle del modulo |
types.go |
I record del modulo |
Lato web, lib/<module>/ contiene index.ts (ciò che gli altri moduli possono usare), le sue parti Svelte e i relativi test, più api.ts e state.svelte.ts solo quando il modulo ha chiamate o stato propri.
Pacchetti core
Core è l’impianto di base. Non contiene regole di prodotto e non importa nessun modulo.
| Pacchetto | Contiene |
|---|---|
core/database |
Apertura e migrazione dei due file SQLite, helper per le query, helper per impostazioni ed eventi, campi di riga condivisi, riduzione della Cronologia |
core/files |
Helper per file e cartelle, spazio libero su disco |
core/releasename |
Qualità, gruppo e numeri degli episodi dal nome di una release |
core/outbound |
L’unico modo per chiamare server esterni, con controllo degli indirizzi |
core/secrets |
L’archivio delle chiavi e la rotazione delle chiavi |
core/logs |
Il log dell’app e le note sui crash |
core/jobs |
La coda dei processi, le pianificazioni e i cicli che ripartono dopo un crash |
core/webserver |
Impianto del router, URL base, compressione, push in tempo reale |
core/startup |
Utente di esecuzione, modalità a basso consumo di memoria, interruttori delle funzioni in sospeso, limite di memoria, parti |
core/parts |
Gli interruttori delle parti che ogni modulo controlla prima di servire o eseguire |
core/model |
Tipi condivisi, come attori e soggetti |
Quando core deve toccare i dati di un modulo, il modulo registra un hook con core in wiring.go. La rotazione delle chiavi funziona così.
Dati
| File | Contiene |
|---|---|
holyarrs.db |
La Libreria, le richieste, le impostazioni e tutto il resto che conta |
holyarrs-events.db |
La Cronologia e altre righe di eventi. Cresce e viene ridotto senza toccare il file principale |
Le migrazioni sono file SQL numerati in core/database/migrations/main e core/database/migrations/events. Vengono eseguite all’avvio.
Correlati
Link a CorrelatiHolyArrs è gratis. Se ti ha fatto risparmiare tempo, metti una stella su GitHub, sostienilo o offrimi un caffè.