Arquitectura
Experto
Encuentra dónde vive el código y qué reglas se aplican antes de cambiar algo grande.
La versión corta
Enlace a La versión cortaHolyArrs es un solo programa en Go con la app web incluida. Sirve la app web y una API JSON en el puerto 6262, y guarda sus datos en 2 archivos SQLite en la carpeta de configuración. Se comunica con Gestores de descargas, Fuentes (a través de Jackett o Prowlarr), servidores multimedia, canales de avisos y el servidor de metadatos de HolyArrs.
Sigue una solicitud. Alguien pide una película en Explorar.
requestsregistra la solicitud.- Tras la aprobación,
moviespide Lanzamientos asources. - Las Reglas de elección de
mediafileslos puntúan. downloadsenvía el mejor al Gestor de descargas.- Cuando termina,
mediafilesimporta el archivo. - Se informa a
mediaserversy aalerts.
Mapa del código
Enlace a Mapa del códigoapp/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 está en la raíz del repositorio porque go:embed no puede llegar a una carpeta superior.
Dónde encontrar cada cosa
Enlace a Dónde encontrar cada cosa| Quieres cambiar | Mira en |
|---|---|
| Cómo se elige un Lanzamiento | internal/mediafiles |
| Un cliente de Gestor de descargas | internal/downloads, pruebas de contrato en internal/downloads/conformance_test.go |
| Un canal de avisos | internal/alerts |
| Inicio de sesión, usuarios, claves de API | internal/accounts |
| El asistente de primer inicio | internal/setup, app/frontend/src/routes/welcome |
| La importación de un archivo terminado (descompresión, etiquetas, coincidencias) | internal/importer |
| Carpetas de la Biblioteca, adoptar y renombrar | internal/library |
| Cómo se eligen y ordenan las filas y los estantes | internal/suggest |
| Qué partes de la app están activadas | internal/core/parts |
| La dirección de una página | app/frontend/src/routes/ |
| Una migración | internal/core/database/migrations/ |
| La imagen de Docker | deploy/Dockerfile |
Las reglas
Enlace a Las reglasLas comprobaciones de app/backend/tools/structurecheck hacen fallar la compilación cuando se rompe una. Ejecútalas con la línea que está en Pruebas.
- Orden de capas. Un módulo importa solo módulos de una capa inferior, y solo su paquete raíz. Los módulos de la misma capa nunca se importan entre sí.
- Llamar hacia arriba. Cuando un módulo inferior necesita algo de uno superior, el superior le pasa datos simples hacia abajo, o el inferior define una interfaz pequeña que
wiring.gocompleta. - El SQL se queda en casa. Solo los archivos
store*.gode un módulo contienen SQL, y solo sobre sus propias tablas. Para leer las filas de otro módulo, llama a su servicio. - Las tablas compartidas son de core. Accede a
settings,schedules,secrets,jobsyeventsmediante las funciones de ayuda de core. - Una sola salida. Toda llamada al exterior pasa por
core/outbound. - Las funciones retenidas registran un interruptor en
core/startup. Mientras está desactivado, la ruta no existe y la página oculta la función. - Sin paquetes cajón de sastre. Nada de
util,common,sharednihelpers.
El orden de capas está en Módulos.
Para expertos
Enlace a Para expertosDentro de un módulo
Todos los módulos del backend usan los mismos nombres de archivo.
| Archivo | Contiene |
|---|---|
routes.go |
Las rutas de la API, cada una con el permiso que necesita |
service.go y archivos por tema |
La lógica a la que llaman otros módulos |
store.go, store_<topic>.go |
Todo el SQL de las tablas propias del módulo |
types.go |
Los registros del módulo |
En el lado web, lib/<module>/ contiene index.ts (lo que otros módulos pueden usar), sus partes de Svelte y sus pruebas, además de api.ts y state.svelte.ts solo cuando tiene llamadas o estado propios.
Paquetes de core
Core es la fontanería. No contiene reglas del producto y no importa ningún módulo.
| Paquete | Contiene |
|---|---|
core/database |
Apertura y migración de los dos archivos SQLite, ayudas para consultas, ayudas para ajustes y eventos, campos de fila compartidos, recorte del historial |
core/files |
Ayudas para archivos y carpetas, espacio libre en disco |
core/releasename |
Calidad, grupo y números de episodio a partir del nombre de un lanzamiento |
core/outbound |
La única vía para llamar a servidores externos, con comprobación de direcciones |
core/secrets |
El almacén de claves y la rotación de claves |
core/logs |
El registro (log) de la app y las notas de fallos |
core/jobs |
La cola de tareas, las programaciones y los bucles que se reinician tras un fallo |
core/webserver |
Fontanería del enrutador, URL base, compresión, envío en vivo |
core/startup |
Usuario de ejecución, modo de poca memoria, interruptores de funciones retenidas, límite de memoria, Partes |
core/parts |
Los interruptores de Parte que cada módulo consulta antes de servir o ejecutar algo |
core/model |
Tipos compartidos, como actores y sujetos |
Cuando core tiene que tocar datos de un módulo, el módulo registra un enganche en core desde wiring.go. La rotación de claves funciona así.
Datos
| Archivo | Contiene |
|---|---|
holyarrs.db |
La Biblioteca, las solicitudes, los ajustes y todo lo demás que importa |
holyarrs-events.db |
El Historial y otras filas de eventos. Crece y se recorta sin tocar el archivo principal |
Las migraciones son archivos SQL numerados en core/database/migrations/main y core/database/migrations/events. Se ejecutan al iniciar.
Relacionado
Enlace a RelacionadoHolyArrs es gratis. Si te ahorró tiempo, dale una estrella en GitHub, patrocínalo o invítame a un café.