Архітектура
Для досвідчених
Дізнайся, де лежить код і які правила діють, перш ніж міняти щось велике.
Коротко
Посилання на КороткоHolyArrs — це одна програма на Go з вбудованим вебзастосунком. Вона віддає вебзастосунок і JSON API на порту 6262, а дані зберігає у 2 файлах SQLite у теці конфігурації. Вона звертається до завантажувачів, джерел (через Jackett або Prowlarr), медіасерверів, каналів сповіщень і сервера метаданих HolyArrs.
Простеж один запит. Хтось запрошує фільм на сторінці Огляд.
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 лишається вдома. SQL містять лише власні файли
store*.goмодуля, і лише для його власних таблиць. Щоб прочитати рядки іншого модуля, виклич його сервіс. - Спільні таблиці належать 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 має торкнутися даних модуля, модуль реєструє в core хук у wiring.go. Так працює ротація ключів.
Дані
| Файл | Що містить |
|---|---|
holyarrs.db |
Бібліотеку, запити, налаштування і все інше важливе |
holyarrs-events.db |
Історію та інші рядки подій. Він росте й обрізається, не чіпаючи головний файл |
Міграції — це пронумеровані файли SQL у core/database/migrations/main і core/database/migrations/events. Вони виконуються під час запуску.
Пов’язане
Посилання на Пов’язанеHolyArrs безкоштовний. Якщо він заощадив тобі час, познач його зіркою на GitHub, підтримай проєкт або пригости мене кавою.