Архитектура
Експерт
Намери къде живее кодът и кои правила важат, преди да променяш нещо голямо.
Накратко
Връзка към НакраткоHolyArrs е една програма на Go с вградено уеб приложение. Тя сервира уеб приложението и JSON API на порт 6262 и държи данните си в 2 файла SQLite в папката с конфигурация. Тя се обръща към програми за изтегляне, Източници (през Jackett или Prowlarr), медийни сървъри, канали за известия и сървъра за метаданни на HolyArrs.
Проследи една заявка. Някой заявява филм в Explore (Разглеждане).
requestsзаписва заявката.- След одобрението
moviesпитаsourcesза издания. - Правилата за избор в
mediafilesим дават точки. downloadsпраща най-доброто към програмата за изтегляне.- Когато свърши,
mediafilesимпортира файла. mediaserversиalertsполучават съобщение.
Карта на кода
Връзка към Карта на кодаapp/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 стои в корена на хранилището, защото go:embed не може да достигне родителска папка.
Къде да търсиш
Връзка към Къде да търсиш| Искаш да промениш | Виж в |
|---|---|
| Как се избира издание | internal/mediafiles |
| Програма за изтегляне | internal/downloads, тестове за съвместимост в internal/downloads/conformance_test.go |
| Канал за известия | internal/alerts |
| Вход, потребители, API ключове | internal/accounts |
| Съветникът при първо стартиране | internal/setup, app/frontend/src/routes/welcome |
| Импортиране на готов файл (разархивиране, етикети, съпоставяне) | internal/importer |
| Папки на Библиотеката, поемане и преименуване | internal/library |
| Как се избират и подреждат редовете и рафтовете | internal/suggest |
| Кои модули на приложението са включени | internal/core/parts |
| Адрес на страница | app/frontend/src/routes/ |
| Миграция | internal/core/database/migrations/ |
| Образът на Docker | deploy/Dockerfile |
Правилата
Връзка към ПравилатаПроверките в app/backend/tools/structurecheck чупят билда, когато някое правило се наруши. Пусни ги с реда от Тестване.
- Ред на слоевете. Модулът импортира само модули от по-нисък слой и само техния коренов пакет. Модули от един и същ слой никога не се импортират помежду си.
- Извикване нагоре. Когато долен модул има нужда от нещо от по-горен, горният подава обикновени данни надолу или долният дефинира малък интерфейс, който
wiring.goпопълва. - SQL си стои вкъщи. Само собствените
store*.goфайлове на модула съдържат SQL и то само върху собствените му таблици. За да прочетеш редове на друг модул, извикай неговата услуга. - Споделените таблици са на core. Стигай до
settings,schedules,secrets,jobsиeventsпрез помощниците на core. - Един изход. Всяко извикване навън минава през
core/outbound. - Задържаните функции регистрират превключвател в
core/startup. Докато е изключен, маршрутът го няма и страницата крие функцията. - Без пакети за всичко. Без
util,common,sharedилиhelpers.
Редът на слоевете е в Модули.
За експерти
Връзка към За експертиВътре в един модул
Всеки модул в бекенда използва едни и същи имена на файлове.
| Файл | Съдържа |
|---|---|
routes.go |
API маршрути, всеки с правото, което му трябва |
service.go и файловете по теми |
Логика, която извикват други модули |
store.go, store_<topic>.go |
Целият SQL за собствените таблици на модула |
types.go |
Записите на модула |
В уеб частта lib/<module>/ съдържа index.ts (какво могат да ползват другите модули), своите части на Svelte и техните тестове, а api.ts и state.svelte.ts има само ако модулът си има собствени извиквания или състояние.
Пакетите на core
Core е инфраструктурата. Той не съдържа продуктови правила и не импортира модули.
| Пакет | Съдържа |
|---|---|
core/database |
Отваряне и миграции на двата файла SQLite, помощници за заявки, за настройки и събития, споделени полета на редовете, подрязване на историята |
core/files |
Помощници за файлове и папки, свободно място на диска |
core/releasename |
Качество, група и номера на епизоди от името на издание |
core/outbound |
Единственият начин да извикаш външни сървъри, с проверка на адресите |
core/secrets |
Хранилището за ключове и смяната на ключове |
core/logs |
Дневникът на приложението и бележките за сривове |
core/jobs |
Опашката със задачи, графиците и циклите, които се рестартират след срив |
core/webserver |
Маршрутизация, URL base, компресия, живо изпращане |
core/startup |
Потребител за изпълнение, режим за малко памет, задържани превключватели, лимит на паметта, модули |
core/parts |
Превключвателите на модулите, които всеки модул проверява, преди да обслужва или да работи |
core/model |
Споделени типове, като актьори и субекти |
Когато core трябва да пипне данни на модул, модулът регистрира hook при core във wiring.go. Смяната на ключове работи така.
Данни
| Файл | Съдържа |
|---|---|
holyarrs.db |
Библиотеката, заявките, настройките и всичко останало, което има значение |
holyarrs-events.db |
Историята и други редове със събития. Расте и се подрязва, без да пипа главния файл |
Миграциите са номерирани SQL файлове в core/database/migrations/main и core/database/migrations/events. Те се изпълняват при стартиране.
Свързано
Връзка към СвързаноHolyArrs е безплатен. Ако ти е спестил време, сложи му звезда в GitHub, подкрепи го или почерпи ме с кафе.