Saltar al contingut

Arquitectura

Expert

Troba on viu el codi i quines regles s’apliquen abans de canviar res d’important.

HolyArrs és un sol programa en Go amb l’app web integrada. Serveix l’app web i una API JSON al port 6262, i desa les dades en 2 fitxers SQLite a la carpeta de configuració. Es connecta a gestors de baixades, Fonts (a través de Jackett o Prowlarr), servidors multimèdia, canals d’avisos i el servidor de metadades d’HolyArrs.

Segueix una sola sol·licitud. Algú demana una pel·lícula a Explorar.

  1. requests registra la petició.
  2. Després de l’aprovació, movies demana Llançaments a sources.
  3. Les regles d’elecció de mediafiles els puntuen.
  4. downloads envia el millor al gestor de baixades.
  5. Quan acaba, mediafiles importa el fitxer.
  6. S’avisa mediaservers i alerts.
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 és a l’arrel del repositori perquè go:embed no pot arribar a una carpeta pare.

Vols canviar Mira a
Com es tria un Llançament internal/mediafiles
Un client de gestor de baixades internal/downloads, proves de contracte a internal/downloads/conformance_test.go
Un canal d’avisos internal/alerts
L’inici de sessió, els usuaris, les claus d’API internal/accounts
L’assistent del primer inici internal/setup, app/frontend/src/routes/welcome
La importació d’un fitxer acabat (descomprimir, etiquetes, coincidència) internal/importer
Carpetes de la Biblioteca, adopció i canvi de nom internal/library
Com es trien i s’ordenen les files i els prestatges internal/suggest
Quines parts de l’app estan activades internal/core/parts
L’adreça d’una pàgina app/frontend/src/routes/
Una migració internal/core/database/migrations/
La imatge de Docker deploy/Dockerfile

Les comprovacions de app/backend/tools/structurecheck fan fallar la compilació quan se’n trenca una. Executa-les amb la línia de Proves.

  • Ordre de capes. Un mòdul només importa mòduls d’una capa inferior, i només el seu paquet arrel. Els mòduls de la mateixa capa no s’importen mai entre ells.
  • Cridar cap amunt. Quan un mòdul inferior necessita alguna cosa d’un de superior, el superior li passa dades simples, o l’inferior defineix una interfície petita que omple wiring.go.
  • L’SQL es queda a casa. Només els fitxers store*.go d’un mòdul tenen SQL, i només sobre les seves taules. Per llegir files d’un altre mòdul, crida el seu servei.
  • Les taules compartides són del core. Accedeix a settings, schedules, secrets, jobs i events amb els ajudants del core.
  • Una sola sortida. Cada crida a l’exterior passa per core/outbound.
  • Les funcions retingudes registren un interruptor a core/startup. Mentre està desactivat, la ruta no hi és i la pàgina amaga la funció.
  • Cap paquet calaix de sastre. Cap util, common, shared ni helpers.

L’ordre de capes és a Mòduls.

Dins d'un mòdul

Tots els mòduls del backend usen els mateixos noms de fitxer.

Fitxer Conté
routes.go Les rutes de l’API, cadascuna amb el permís que necessita
service.go i fitxers per tema La lògica que criden els altres mòduls
store.go, store_<topic>.go Tot l’SQL de les taules del mòdul
types.go Els registres del mòdul

Al costat web, lib/<module>/ conté index.ts (el que poden usar els altres mòduls), les seves parts Svelte amb les proves, i api.ts i state.svelte.ts només quan té crides o estat propis.

Paquets del core

El core és la fontaneria. No conté regles del producte i no importa cap mòdul.

Paquet Conté
core/database Obrir i migrar els dos fitxers SQLite, ajudants de consultes, ajudants de paràmetres i esdeveniments, camps de fila compartits, retallada de l’historial
core/files Ajudants de fitxers i carpetes, espai lliure del disc
core/releasename Qualitat, grup i números d’episodi a partir del nom d’un llançament
core/outbound L’única manera de cridar servidors externs, amb comprovació d’adreces
core/secrets L’emmagatzematge de claus i la rotació de claus
core/logs El registre de l’app i les notes de fallades
core/jobs La cua de tasques, les programacions i els bucles que es reinicien després d’una fallada
core/webserver Fontaneria de l’encaminador, URL base, compressió, enviament en directe
core/startup Usuari d’execució, mode de poca memòria, interruptors de funcions retingudes, límit de memòria, parts
core/parts Els interruptors de parts que consulta cada mòdul abans de servir o executar
core/model Tipus compartits, com actors i subjectes

Quan el core ha de tocar dades d’un mòdul, el mòdul registra un hook al core a wiring.go. La rotació de claus funciona així.

Dades
Fitxer Conté
holyarrs.db La Biblioteca, les sol·licituds, els paràmetres i tota la resta que importa
holyarrs-events.db L’historial i altres files d’esdeveniments. Creix i es retalla sense tocar el fitxer principal

Les migracions són fitxers SQL numerats a core/database/migrations/main i core/database/migrations/events. S’executen en iniciar.

HolyArrs és gratis. Si t'ha estalviat temps, dona-li una estrella a GitHub, patrocina'l o convida'm a un cafè.