Motoshub · System Architecture

معماری کامل سیستم موتوشاب

این سند معماری محصول، معماری نرم‌افزار، بک‌اند، فرانت‌اند و اسکیمای کامل داده را به‌صورت جداگانه و دقیق شرح می‌دهد. مبنای همه‌ی توضیحات، مطالعه‌ی کامل سورس و اندازه‌گیری زنده روی استک در حال اجراست.

۱. معماری محصول ۲. معماری نرم‌افزار ۳. بک‌اند ۴. فرانت‌اند ۵. اسکیمای داده ۶. معماری استقرار

۱. معماری محصول

موتوشاب در حال گذار از یک وب‌سایت اکسوالِ یکپارچه به یک معماری Gateway + Strangler-Fig است: یک درگاه واحد جلوی چند بک‌اند می‌ایستد و به‌تدریج قابلیت‌ها از هسته‌ی قدیمی PHP به بک‌اند جدید Django منتقل می‌شوند، بدون قطع سرویس.

مصرف‌کننده‌ها

اپ موبایلiOS / Android
فرانت جدیدmotonextfront.shub.ir
سایت زنده‌ی فعلیmotonext.shub.ir

درگاه (Gateway)

api.shub.irنقطه‌ی ورود واحد برای موبایل و کل اپ آینده؛ توکن را pass-through و بین بک‌اندها مسیردهی می‌کند برنامه‌ریزی

بک‌اندها

api1.shub.irموتوشاب فعلی (PHP/Oxwall + REST API v1). قابلیت‌های امروز اینجاست. آماده‌ی استقرار
api2.shub.irبک‌اند Django (بازنویسی تدریجی). endpointها یکی‌یکی از api1 به اینجا منتقل می‌شوند. در حال توسعه

داده و مستندات

MariaDB مشترکپایگاه‌داده‌ی واحد؛ هر دو لایه‌ی PHP روی همان جدول‌ها
docs.shub.irمستندات فنی و API زنده

وضعیت فعلی ساب‌دامین‌ها

ساب‌دامیننقشوضعیت
motonext.shub.irسایت زنده‌ی فعلی (شاخه‌ی motonext)بالا
motonextfront.shub.irفرانت جدید موتوشاببالا
docs.shub.irمستندات (این سند)بالا، گواهی معتبر
api.shub.irGateway — موبایل و کل اپ آیندهنیازمند DNS
api1.shub.irموتوشاب فعلی (کار REST API v1)نیازمند DNS
api2.shub.irبک‌اند Djangoنیازمند DNS
چرا این معماری؟ api1 (موتوشاب فعلی) باید یک قرارداد تمیز، پایدار و ماژولار باشد تا (۱) Gateway بتواند جلویش بایستد و (۲) Django بتواند به‌تدریج هر endpoint را جداگانه تحویل بگیرد. به همین دلیل REST API v1 به‌صورت ماژول‌های مستقل ساخته شده است.

۲. معماری نرم‌افزار (api1 — موتوشاب فعلی)

موتوشاب یک fork از Oxwall است که یک لایه‌ی REST مدرن به نام Bridge رویش سوار شده. دو لایه‌ی دسترسی به داده روی یک پایگاه‌داده هم‌زیستی دارند.

لایه‌ی HTTP

nginxreverse proxy، FastCGI به PHP-FPM
Bridge Routerrouting مبتنی بر attribute، middleware، dispatcher

لایه‌ی REST API v1 (جدید) — تمپلیت هر فیچر

Controllerattribute route + OpenAPI
FormRequestاعتبارسنجی و sanitize
Resourceسریال‌سازی خروجی
Policyمجوز per-action
Serviceمنطق کسب‌وکار؛ BOL موجود را صدا می‌زند
Repositoryکوئری Eloquent
Model / DTOEloquent Model + DTO
QueriesFilter / Search / Sort

لایه‌ی BOL قدیمی Oxwall

*_BOL_*Serviceمنطق شیپ‌شده‌ی هر پلاگین (بازنویسی نشده)
OW_BaseDao + OW_Exampleدسترسی داده‌ی قدیمی (SQL دستی)
OW_EventManagerرویدادها، کش، اعلان‌ها

داده و احراز هویت

MariaDB 10.5۴۰۷ جدول، پیشوند ow_
JWT (HS256)پل بین توکن و OW::getUser() در هر درخواست
RBAC اکسوالگروه/اکشن/نقش
نکته‌ی مهم — دو ORM روی یک دیتابیس: لایه‌ی جدید از Eloquent (کامپوننت ORM لاراول، نه خود لاراول) و لایه‌ی قدیمی از OW_BaseDao استفاده می‌کند؛ هر دو به همان جدول‌ها می‌نویسند. نوشتن با Eloquent، رویداد/کش لایه‌ی قدیمی را دور می‌زند. جزئیات در راهنمای عملیات.

اعداد کلیدی لایه‌ی API

موردمقدار
عملیات REST۲۹۳ (GET ۱۱۵ / POST ۸۵ / DELETE ۵۶ / PATCH ۳۷)
مسیرها۱۷۸
مدل‌های Eloquent۷۴ مدل در ۲۶ پلاگین
پلاگین‌های فعال۵۱ (هرکدام init.php در هر درخواست)
تست‌های Pest۴۴ فایل، ۱۲۰ assertion سبز

۳. بک‌اند

api1 — PHP / Oxwall (فعلی)

api2 — Django (در حال توسعه)

احراز هویت میان PHP و Django

API فعلی با JWT (HS256) کار می‌کند؛ توکن با sha256(OW_PASSWORD_PEPPER) امضا و claims دارد: { iat, exp, sub: userId }.

۴. فرانت‌اند

۵. اسکیمای داده (MariaDB — ۴۰۷ جدول، پیشوند ow_)

اسکیما بر پایه‌ی هسته‌ی Oxwall است؛ هر پلاگین جدول‌های خودش را دارد. مهم‌ترین دامنه‌ها:

دامنهجداول کلیدیتوضیح
هویت و کاربرow_base_user, ow_base_user_profile, ow_base_question_dataحساب کاربری، پروفایل، مقادیر پرسش‌های پروفایل (نام نمایشی از اینجا)
مجوز (RBAC)ow_base_authorization_role, _action, _group, _role_permissionگروه/اکشن/نقش و grant؛ مبنای Policyهای API
پلاگین و ویجتow_base_plugin, ow_base_component, ow_base_component_placeپلاگین‌های نصب/فعال، ویجت‌های صفحه‌ی اصلی (index/dashboard)
تازه‌ها (فید)ow_newsfeed_action, _activity, _action_feed, _statusپست‌ها؛ visibility bitmask و privacy کنترل دیده‌شدن برای مهمان
رسانهow_photo, ow_photo_album, ow_video_clipعکس/آلبوم/ویدیو
محتواow_blogs_post, ow_iisnews_entry, ow_forum_topic, ow_forum_postبلاگ، خبر، فروم
اجتماعow_groups_group, ow_event_item, ow_friends_friendship, ow_mailbox_conversationگروه، رویداد، دوستی، پیام‌رسان
سازمانی/پژوهشیow_iisgrant_*, ow_iiscfp_*, ow_iisticketing_*, ow_iisjcse_*گرنت، فراخوان، تیکتینگ، نشریه
نکته‌ی طراحی داده: اسکیمای اکسوال ستون‌های created_at/updated_at استاندارد لاراول را ندارد؛ به همین دلیل مدل‌های Eloquent با $timestamps=false تنظیم شده‌اند و فیلدهای زمانی (مثل addDatetime) دستی مدیریت می‌شوند. تاریخ‌ها به‌صورت timestamp عددی ذخیره و در خروجی API به ISO-8601 + جلالی تبدیل می‌شوند.

مدل رابطه‌ای نمونه (رسانه)

ow_base_user (id) ────< ow_photo_album (userId)
                              │
                              └────< ow_photo (albumId)
                                          │
                                          └── ow_photo_album_cover (photoId)

۶. معماری استقرار (این سند و docs.shub.ir)

docs.shub.ir · معماری کامل سیستم موتوشاب · نسخه‌ی زنده و قابل‌به‌روزرسانی