สถาปัตยกรรม
ผู้เชี่ยวชาญ
รู้ว่าโค้ดอยู่ตรงไหนและมีกฎอะไรบ้าง ก่อนแก้ส่วนที่ใหญ่
สรุปสั้น ๆ
ลิงก์ไปยัง สรุปสั้น ๆHolyArrs เป็นโปรแกรม Go ตัวเดียวที่มีเว็บแอปฝังอยู่ในตัว ให้บริการเว็บแอปและ JSON API ที่ port 6262 และเก็บข้อมูลไว้ในไฟล์ SQLite 2 ไฟล์ในโฟลเดอร์คอนฟิก โปรแกรมเรียกออกไปยังตัวดาวน์โหลด แหล่งค้นหา (ผ่าน Jackett หรือ Prowlarr) มีเดียเซิร์ฟเวอร์ ช่องทางการแจ้งเตือน และเซิร์ฟเวอร์ metadata ของ 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 อยู่ที่รากของ repo เพราะ go:embed เข้าถึงโฟลเดอร์แม่ไม่ได้
หาของได้ที่ไหน
ลิงก์ไปยัง หาของได้ที่ไหน| ถ้าต้องการแก้ | ดูที่ |
|---|---|
| วิธีเลือกรีลีส | internal/mediafiles |
| ตัวเชื่อมตัวดาวน์โหลด | internal/downloads ส่วนเทสต์สัญญาอยู่ใน internal/downloads/conformance_test.go |
| ช่องทางการแจ้งเตือน | internal/alerts |
| การล็อกอิน ผู้ใช้ API key | internal/accounts |
| ตัวช่วยตั้งค่าครั้งแรก | internal/setup, app/frontend/src/routes/welcome |
| การนำเข้าไฟล์ที่ดาวน์โหลดเสร็จ (แตกไฟล์ แท็ก การจับคู่) | internal/importer |
| โฟลเดอร์คลัง การรับเข้าดูแล และการเปลี่ยนชื่อ | internal/library |
| วิธีเลือกและเรียงแถวและชั้นวาง | internal/suggest |
| ส่วนใดของแอปที่เปิดอยู่ | internal/core/parts |
| ที่อยู่ของหน้า | app/frontend/src/routes/ |
| migration | internal/core/database/migrations/ |
| Docker image | deploy/Dockerfile |
การตรวจสอบใน app/backend/tools/structurecheck จะทำให้บิลด์ล้มเหลวเมื่อมีข้อใดข้อหนึ่งถูกละเมิด รันได้ด้วยคำสั่งในหน้า การทดสอบ
- ลำดับชั้น โมดูลนำเข้าได้เฉพาะโมดูลในชั้นที่ต่ำกว่า และเฉพาะ package ราก โมดูลในชั้นเดียวกันห้ามนำเข้าหากัน
- การเรียกขึ้นข้างบน เมื่อโมดูลชั้นล่างต้องการบางอย่างจากชั้นบน โมดูลชั้นบนส่งข้อมูลธรรมดาลงมาให้ หรือโมดูลชั้นล่างกำหนด interface เล็ก ๆ ให้
wiring.goเติมให้ - SQL อยู่บ้านตัวเอง มีเพียงไฟล์
store*.goของโมดูลเองที่มี SQL และใช้กับตารางของโมดูลเองเท่านั้น หากต้องการอ่านแถวของโมดูลอื่น ให้เรียก service ของโมดูลนั้น - ตารางที่ใช้ร่วมกันเป็นของ core เข้าถึง
settings,schedules,secrets,jobsและeventsผ่านตัวช่วยของ core - ทางออกทางเดียว ทุกการเรียกออกไปภายนอกต้องผ่าน
core/outbound - ฟีเจอร์ที่ยังไม่เปิดให้ใช้ ลงทะเบียนสวิตช์กับ
core/startupขณะที่สวิตช์ปิด จะไม่มีเส้นทางนั้น และหน้าเว็บจะซ่อนฟีเจอร์ - ห้ามมี package แบบรวมของจิปาถะ ห้ามมี
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 ซึ่งมีเฉพาะเมื่อโมดูลมีการเรียก API หรือสถานะของตัวเอง
แพ็กเกจของ core
Core คือโครงสร้างพื้นฐาน ไม่มีกฎของตัวผลิตภัณฑ์ และไม่นำเข้าโมดูลใด
| Package | เก็บอะไร |
|---|---|
core/database |
การเปิดและ migrate ไฟล์ SQLite ทั้งสอง ตัวช่วยสำหรับ query ตัวช่วยของ settings และ events ฟิลด์ของแถวที่ใช้ร่วมกัน การตัดประวัติเก่า |
core/files |
ตัวช่วยจัดการไฟล์และโฟลเดอร์ พื้นที่ดิสก์ว่าง |
core/releasename |
คุณภาพ กลุ่ม และเลขตอน จากชื่อรีลีส |
core/outbound |
ทางเดียวที่ใช้เรียกเซิร์ฟเวอร์ภายนอก พร้อมการตรวจที่อยู่ |
core/secrets |
ที่เก็บคีย์และการหมุนคีย์ |
core/logs |
Log ของแอปและบันทึกการแครช |
core/jobs |
คิวงาน ตารางเวลา และลูปที่เริ่มใหม่เองหลังแครช |
core/webserver |
โครงสร้าง router, URL base, การบีบอัด, live push |
core/startup |
ผู้ใช้ที่ใช้รัน โหมดประหยัดหน่วยความจำ สวิตช์ของฟีเจอร์ที่ยังไม่เปิดให้ใช้ ขีดจำกัดหน่วยความจำ ส่วนต่าง ๆ |
core/parts |
สวิตช์ของแต่ละส่วนที่ทุกโมดูลต้องถามก่อนให้บริการหรือทำงาน |
core/model |
ชนิดข้อมูลที่ใช้ร่วมกัน เช่น actor และ subject |
เมื่อ core ต้องแตะข้อมูลของโมดูล โมดูลจะลงทะเบียน hook กับ core ใน wiring.go การหมุนคีย์ทำงานด้วยวิธีนี้
ข้อมูล
| ไฟล์ | เก็บอะไร |
|---|---|
holyarrs.db |
คลัง คำขอ การตั้งค่า และทุกอย่างที่สำคัญ |
holyarrs-events.db |
ประวัติและแถวเหตุการณ์อื่น ๆ ไฟล์นี้โตและถูกตัดเก่าออกได้โดยไม่แตะไฟล์หลัก |
Migration คือไฟล์ SQL ที่มีเลขลำดับ อยู่ใน core/database/migrations/main และ core/database/migrations/events และจะรันตอนเริ่มโปรแกรม
หน้าที่เกี่ยวข้อง
ลิงก์ไปยัง หน้าที่เกี่ยวข้องHolyArrs ใช้ได้ฟรี ถ้าช่วยประหยัดเวลาคุณได้ กดดาวบน GitHub, สนับสนุนโปรเจกต์ หรือ เลี้ยงกาแฟผู้พัฒนา