Bỏ qua để đến nội dung

Kiến trúc

Nâng cao

Biết mã nằm ở đâu và quy tắc nào áp dụng trước khi bạn thay đổi một thứ lớn.

HolyArrs là một chương trình Go duy nhất, có sẵn ứng dụng web bên trong. Nó phục vụ ứng dụng web và một API JSON trên cổng 6262, và lưu dữ liệu trong 2 tệp SQLite ở thư mục cấu hình. Nó gọi ra các trình tải xuống, các Nguồn (qua Jackett hoặc Prowlarr), máy chủ media, các kênh cảnh báo và máy chủ metadata của HolyArrs.

Hãy theo dõi một yêu cầu. Có người yêu cầu một bộ phim lẻ trên Khám phá.

  1. requests ghi lại yêu cầu.
  2. Sau khi được duyệt, movies nhờ sources tìm các bản phát hành.
  3. Các quy tắc chọn trong mediafiles chấm điểm chúng.
  4. downloads gửi bản tốt nhất cho trình tải xuống.
  5. Khi tải xong, mediafiles nhập tệp vào.
  6. mediaservers và alerts được báo.
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 nằm ở gốc repo vì go:embed không thể với tới thư mục cha.

Bạn muốn thay đổi Xem trong
Cách chọn một bản phát hành internal/mediafiles
Một client trình tải xuống internal/downloads, các bài kiểm tra hợp đồng trong internal/downloads/conformance_test.go
Một kênh cảnh báo internal/alerts
Đăng nhập, người dùng, khóa API internal/accounts
Trình hướng dẫn lần chạy đầu tiên internal/setup, app/frontend/src/routes/welcome
Nhập một tệp đã tải xong (giải nén, thẻ, đối chiếu) internal/importer
Thư mục Thư viện, tiếp nhận và đổi tên internal/library
Cách chọn và sắp xếp các hàng và kệ internal/suggest
Những phần nào của ứng dụng đang bật internal/core/parts
Địa chỉ một trang app/frontend/src/routes/
Một migration internal/core/database/migrations/
Docker image deploy/Dockerfile

Các bước kiểm tra trong app/backend/tools/structurecheck làm bản build thất bại khi có quy tắc bị vi phạm. Chạy chúng bằng dòng lệnh trong Kiểm thử.

  • Thứ tự tầng. Một module chỉ import các module ở tầng thấp hơn, và chỉ import gói gốc của chúng. Các module cùng tầng không import nhau.
  • Gọi lên trên. Khi module thấp cần thứ gì từ module cao hơn, module cao truyền dữ liệu thuần xuống, hoặc module thấp định nghĩa một interface nhỏ để wiring.go điền vào.
  • SQL ở yên trong nhà. Chỉ các tệp store*.go của chính module mới chứa SQL, và chỉ trên bảng của chính nó. Muốn đọc các hàng của module khác, hãy gọi service của nó.
  • Bảng dùng chung thuộc về core. Truy cập settings, schedules, secrets, jobs và events qua các hàm hỗ trợ của core.
  • Một lối ra. Mọi lệnh gọi ra ngoài đều đi qua core/outbound.
  • Tính năng chưa mở đăng ký một công tắc với core/startup. Khi công tắc tắt, route không tồn tại và trang ẩn tính năng đó.
  • Không có gói chứa tạp. Không có util, common, shared hay helpers.

Thứ tự tầng nằm trong Module.

Bên trong một module

Mọi module backend dùng cùng một bộ tên tệp.

Tệp Chứa
routes.go Các route API, mỗi route kèm quyền nó cần
service.go và các tệp theo chủ đề Logic mà các module khác gọi
store.go, store_<topic>.go Toàn bộ SQL cho các bảng của chính module
types.go Các bản ghi của module

Ở phía web, lib/<module>/ chứa index.ts (phần các module khác được dùng), các phần Svelte và bài kiểm tra của chúng, cùng api.ts và state.svelte.ts chỉ khi module có lệnh gọi hoặc trạng thái riêng.

Các gói core

Core là phần đường ống. Nó không chứa quy tắc sản phẩm và không import module nào.

Gói Chứa
core/database Mở và migrate cả hai tệp SQLite, các hàm hỗ trợ truy vấn, cài đặt và sự kiện, các trường hàng dùng chung, cắt bớt lịch sử
core/files Các hàm hỗ trợ tệp và thư mục, dung lượng ổ đĩa trống
core/releasename Chất lượng, nhóm và số tập lấy từ tên một bản phát hành
core/outbound Cách duy nhất để gọi máy chủ bên ngoài, kèm kiểm tra địa chỉ
core/secrets Kho khóa và việc xoay khóa
core/logs Nhật ký ứng dụng và ghi chú sự cố
core/jobs Hàng đợi tác vụ, lịch chạy và các vòng lặp tự khởi động lại sau sự cố
core/webserver Phần router, URL base, nén, đẩy dữ liệu trực tiếp
core/startup Người dùng chạy chương trình, chế độ ít bộ nhớ, công tắc tính năng chưa mở, giới hạn bộ nhớ, các phần
core/parts Các công tắc phần mà mọi module hỏi trước khi phục vụ hoặc chạy
core/model Các kiểu dùng chung như actor và subject

Khi core phải đụng đến dữ liệu của module, module đăng ký một hook với core trong wiring.go. Việc xoay khóa hoạt động theo cách này.

Dữ liệu
Tệp Chứa
holyarrs.db Thư viện, các yêu cầu, cài đặt và mọi thứ quan trọng khác
holyarrs-events.db Lịch sử và các hàng sự kiện khác. Nó lớn dần và được cắt bớt mà không đụng đến tệp chính

Migration là các tệp SQL được đánh số trong core/database/migrations/main và core/database/migrations/events. Chúng chạy khi khởi động.

HolyArrs miễn phí. Nếu nó giúp bạn tiết kiệm thời gian, hãy gắn sao trên GitHub, tài trợ dự án hoặc mời tôi một ly cà phê.