Architecture
Expert
Repérez où se trouve le code et quelles règles s’appliquent avant de faire un gros changement.
En bref
Lien vers En brefHolyArrs est un seul programme Go qui contient l’application web. Il sert l’application web et une API JSON sur le port 6262, et garde ses données dans 2 fichiers SQLite dans le dossier de configuration. Il appelle les clients de téléchargement, les sources (via Jackett ou Prowlarr), les serveurs multimédias, les canaux d’alerte et le serveur de métadonnées HolyArrs.
Suivez une demande. Quelqu’un demande un film dans Explore (Explorer).
requestsenregistre la demande.- Après approbation,
moviesdemande des releases àsources. - Les règles de sélection dans
mediafilesleur donnent un score. downloadsenvoie la meilleure au client de téléchargement.- Quand le téléchargement est terminé,
mediafilesimporte le fichier. mediaserversetalertssont prévenus.
Carte du code
Lien vers Carte du codeapp/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 à la racine du dépôt, car go:embed ne peut pas atteindre un dossier parent.
Où trouver quoi
Lien vers Où trouver quoi| Vous voulez modifier | Regardez dans |
|---|---|
| La façon dont une release est choisie | internal/mediafiles |
| Un client de téléchargement | internal/downloads, tests de contrat dans internal/downloads/conformance_test.go |
| Un canal d’alerte | internal/alerts |
| La connexion, les utilisateurs, les clés API | internal/accounts |
| L’assistant de premier lancement | internal/setup, app/frontend/src/routes/welcome |
| L’import d’un fichier terminé (décompression, étiquettes, correspondance) | internal/importer |
| Les dossiers de bibliothèque, l’adoption et le renommage | internal/library |
| Le choix et l’ordre des rangées et des étagères | internal/suggest |
| Les modules de l’application qui sont activés | internal/core/parts |
| L’adresse d’une page | app/frontend/src/routes/ |
| Une migration | internal/core/database/migrations/ |
| L’image Docker | deploy/Dockerfile |
Les règles
Lien vers Les règlesLes contrôles dans app/backend/tools/structurecheck font échouer le build dès qu’une règle n’est pas respectée. Lancez-les avec la ligne donnée dans Tests.
- Ordre des couches. Un module importe seulement des modules d’une couche inférieure, et seulement leur paquet racine. Les modules d’une même couche ne s’importent jamais entre eux.
- Appeler vers le haut. Quand un module inférieur a besoin de quelque chose d’un module supérieur, le module supérieur lui passe des données simples, ou le module inférieur définit une petite interface que
wiring.goremplit. - Le SQL reste chez lui. Seuls les fichiers
store*.god’un module contiennent du SQL, et seulement sur ses propres tables. Pour lire les lignes d’un autre module, appelez son service. - Les tables partagées appartiennent à core. Accédez à
settings,schedules,secrets,jobseteventspar les fonctions d’aide de core. - Une seule sortie. Chaque appel vers l’extérieur passe par
core/outbound. - Les fonctionnalités en réserve enregistrent un interrupteur auprès de
core/startup. Tant qu’il est désactivé, la route n’existe pas et la page masque la fonctionnalité. - Pas de paquets fourre-tout. Pas de
util,common,sharednihelpers.
L’ordre des couches est dans Modules.
Pour les experts
Lien vers Pour les expertsDans un module
Chaque module du backend utilise les mêmes noms de fichiers.
| Fichier | Contient |
|---|---|
routes.go |
Les routes de l’API, chacune avec la permission qu’elle demande |
service.go et les fichiers par sujet |
La logique que les autres modules appellent |
store.go, store_<topic>.go |
Tout le SQL des tables du module |
types.go |
Les enregistrements du module |
Côté web, lib/<module>/ contient index.ts (ce que les autres modules peuvent utiliser), ses composants Svelte et leurs tests, plus api.ts et state.svelte.ts seulement quand il a ses propres appels ou son propre état.
Paquets de core
Core, c’est la tuyauterie. Il ne contient aucune règle du produit et n’importe aucun module.
| Paquet | Contient |
|---|---|
core/database |
L’ouverture et la migration des deux fichiers SQLite, les fonctions d’aide pour les requêtes, les fonctions d’aide pour les paramètres et les événements, les champs de ligne partagés, le nettoyage de l’historique |
core/files |
Les fonctions d’aide pour les fichiers et les dossiers, l’espace disque libre |
core/releasename |
La qualité, le groupe et les numéros d’épisode tirés du nom d’une release |
core/outbound |
La seule façon d’appeler des serveurs extérieurs, avec contrôle des adresses |
core/secrets |
Le magasin de clés et la rotation des clés |
core/logs |
Le journal de l’application et les notes de plantage |
core/jobs |
La file des tâches, les planifications et les boucles qui redémarrent après un plantage |
core/webserver |
La tuyauterie du routeur, la base d’URL, la compression, l’envoi en direct |
core/startup |
L’utilisateur d’exécution, le mode mémoire réduite, les interrupteurs des fonctionnalités en réserve, la limite de mémoire, les modules de l’application |
core/parts |
Les interrupteurs des modules de l’application, que chaque module consulte avant de servir ou de s’exécuter |
core/model |
Les types partagés, comme les acteurs et les sujets |
Quand core doit toucher aux données d’un module, le module enregistre un point d’accroche auprès de core dans wiring.go. La rotation des clés fonctionne ainsi.
Données
| Fichier | Contient |
|---|---|
holyarrs.db |
La Bibliothèque, les demandes, les paramètres et tout ce qui compte |
holyarrs-events.db |
L’historique et les autres lignes d’événements. Il grossit et il est nettoyé sans toucher au fichier principal |
Les migrations sont des fichiers SQL numérotés dans core/database/migrations/main et core/database/migrations/events. Elles s’exécutent au démarrage.
Voir aussi
Lien vers Voir aussiHolyArrs est gratuit. S'il vous a fait gagner du temps, mettez-lui une étoile sur GitHub, sponsorisez-le ou offrez-moi un café.