# SaaS متعدد المستأجرين بلغة Go على ToGO: دراسة حالة SeatFor

> كيف بُنيت SeatFor، منصة الحجز التي يحصل فيها كل نشاط على موقعه ولوحة إدارته وتطبيقه، على ToGO: الإضافات، وأمان الصفوف في Postgres، وأدوات MCP، وما كان صعبًا.

*2026-10-19T12:48:48Z*

# SaaS متعدد المستأجرين بلغة Go على ToGO: دراسة حالة SeatFor

SeatFor منصة حجز يحصل فيها كل نشاط تجاري على موقع حجز خاص به ولوحة إدارة ونطاق مخصص اختياري وتطبيق للجوال. هذه قصة بناء SaaS متعدد المستأجرين بلغة Go على ToGO، بأرقام محسوبة من الشيفرة وحدود مذكورة بوضوح. المستودع خاص، فالشرح هنا معماري بلا مقاطع شيفرة.

## 1. المشكلة

تحتاج الأنشطة القائمة على المواعيد (السبا والصالونات والعيادات والنوادي) إلى حجز عبر الإنترنت لا يكرر الموعد، وموقع باسمها، وعملاء وولاء، ومخزون ونقطة بيع، وتطبيق. بناء ذلك لكل نشاط على حدة لا يتّسع. وبناؤه مرة واحدة لعدة أنشطة يعني أن عزل المستأجرين يجب أن يكون صحيحًا في كل مكان، حتى في المسارات التي نسي أحد فحصها.

بدأت SeatFor تطبيق حجز لنشاط واحد ثم صارت منصة متعددة المستأجرين. وكان لا بد من إضافة العزل دون إعادة كتابة النطاق البرمجي.

## 2. لماذا ToGO

- **واجهة Go واحدة بـ REST وGraphQL من المخطط نفسه.** يولّد `togo generate` الاستعلامات المطبوعة (sqlc) وGraphQL (gqlgen) والترحيلات (Atlas) ووثيقة OpenAPI. ويحصل تطبيقا الويب والجوال على عميل مطبوع من هذه الوثيقة.
- **نواة صغيرة وإضافات.** المصادقة والتخزين المؤقت والطوابير والزمن الحقيقي والتخزين والترجمة ومشغّل Postgres كلها إضافات، لا شيفرة لصق يدوية.
- **سير عمل مألوف.** `togo make:resource` و`togo migrate` و`togo serve` تُبقي دورة العمل اليومية قصيرة.

تثبّت SeatFor الإصدار v0.21.0 من ToGO (من `go.mod`).

## 3. المعمارية

**الإضافات.** يستورد الملف `internal/plugins/plugins.gen.go` ثماني إضافات: auth وauth-dev وcache وdb-postgres وi18n وqueue وrealtime وstorage. ويضيف `go.mod` وحدات orm وvalidation وfaker وsettings وproviders.

**الواجهة.** موجّه chi مع Huma لـ REST وOpenAPI 3.1، وgqlgen لـ GraphQL. ويعرض `togo.yaml` المسارات `/api` و`/graphql` و`/docs`.

**تعدد المستأجرين.** يُحدَّد المستأجر من مضيف الطلب: النشاط له نطاق فرعي خاص، أو نطاقه الخاص بعد ربطه. ويتصل مجمّع قاعدة البيانات الافتراضي بدور Postgres مقيَّد تحت أمان مستوى الصفوف، ويضبط المستأجر لكل جملة. وإن لم يوجد مستأجر في السياق لا ترى الاستعلامات شيئًا: أي أنه يفشل مغلقًا. أما الأعمال العابرة للمستأجرين عمدًا (تحديد المضيف، ومسح التذكيرات، ولوحة المشغّل) فتستخدم مجمّعًا منفصلًا للمنصة بصورة صريحة. والقاعدة في المشروع أن شرط `WHERE tenant_id` لا يحلّ أبدًا محل السياسة.

**الاستحقاقات.** ميزات كل نشاط وحصصه قواعد في قاعدة البيانات. وتفرض مشغّلات BEFORE INSERT الحصص الشهرية للحجوزات والعملاء الجدد، فلا يستطيع أي مسار كتابة تجاوزها. وتحوّل الواجهة الرفض إلى أخطاء مطبوعة، وتُفرض مفاتيح الميزات عند حافة REST.

**الحجز.** حزمة واحدة تضم حساب الفترات وآلة حالات الانتقال والدفع والفواتير ونقاط الولاء، مع اختبارات golden حيث تكون الانحدارات مكلفة.

**الأحداث والإشعارات.** مركز أحداث داخل العملية يغذّي التحديثات الفورية، وحزمة notify تركّب التذكيرات والإشعارات الفورية، مع مسح تذكيرات يعمل عبر المستأجرين.

**MCP.** تعرض `internal/mcp` أدوات للاجتماعات للوكلاء: سرد أنواع الاجتماعات، وسرد اجتماع وجلبه، وإنشاء اجتماع وإلغاؤه، وضبط التوفر.

**العملاء.** تطبيق ويب بـ Next.js 16 (عربي وإنجليزي مع RTL) وتطبيق جوال بـ React Native، وكلاهما مبني على وثيقة OpenAPI نفسها.

## 4. الشيفرة

المستودع خاص، فلا مقاطع هنا. والأجزاء المهمة صغيرة: محلّل مضيف، وغلاف مجمّع يضبط المستأجر لكل جملة، والسياسات في ملفات المخطط.

## 5. أرقام (محسوبة من المستودع)

| ما المحسوب | العدد | كيف |
|---|---|---|
| إضافات ToGO المستوردة | 8 | `internal/plugins/plugins.gen.go` |
| أدوات MCP المسجَّلة | 6 | مدخلات الأدوات في `internal/mcp/tools.go` |
| ملفات المخطط المرقّمة | 42 | `internal/db/schema/*.sql` |
| ملفات اختبار Go (دون الويب) | 79 | عدّ `*_test.go` |
| إصدار ToGO | v0.21.0 | `go.mod` |

لا توجد هنا أرقام مستخدمين أو إيرادات أو أداء، لأنها لم تُقَس لهذه المقالة.

## 6. ما كان صعبًا وكيف ساعد ToGO

- **عزل يمكن الوثوق به.** القرار الحاسم كان وضع العزل في قاعدة البيانات لا في كل استعلام. ToGO لم يفعل ذلك عنا: أمان الصفوف ومحلّل المضيف وغلاف المجمّع شيفرة تطبيق. وما قدّمه ToGO مكان ثابت لوضعها وطبقة بيانات مولّدة تمر كلها عبر المجمّع نفسه.
- **الأعمال العابرة للمستأجرين.** التذكيرات وأدوات المشغّل تحتاج إلى رؤية الجميع، فتستخدم مجمّع المنصة صراحة. وإبقاء هذه القائمة قصيرة ومرئية يتطلب انضباطًا.
- **التحويل لاحقًا.** الانتقال من نشاط واحد إلى عدة أنشطة يعني أن كل اختبار يكتب في صفوف مشتركة يجب أن يأخذ قفلًا، لأن الحزم تعمل بالتوازي على Postgres واحد.
- **كلفة التوليد.** خطوة التوليد (sqlc وgqlgen وAtlas وOpenAPI) مريحة، وهي أيضًا شيء إضافي يجب إبقاؤه متزامنًا. ويجري فحص للمخطط قبل التوليد والترحيل والاختبار.
- **ToGO في الإصدار 0.x.** بعض الإضافات بين 0.1 و0.3، فنثبّت الإصدارات ونتوقع تغييرات كاسرة.

## الأسئلة الشائعة

### هل يمكن بناء SaaS متعدد المستأجرين بلغة Go مع ToGO؟
نعم. SeatFor مثال على ذلك. يُحدَّد المستأجر من مضيف الطلب، ويعزل أمان مستوى الصفوف في Postgres البيانات.

### هل يوفّر ToGO تعدد المستأجرين جاهزًا؟
لا. هنا هو شيفرة تطبيق. ويوفّر ToGO النواة والإضافات وتوليد الشيفرة حوله.

### أي إضافات ToGO تستخدمها SeatFor؟
auth وauth-dev وcache وdb-postgres وi18n وqueue وrealtime وstorage.

### هل SeatFor مفتوحة المصدر؟
لا، المستودع خاص.

## روابط

- [SeatFor](https://seatfor.com)
- [ToGO على GitHub](https://github.com/togo-framework/togo)
- [معرض ToGO](https://to-go.dev/ar/showcase)

## اقرأ أيضًا

- [اعرض تطبيق Go كخادم MCP مع web-mcp](/ar/blog/go-mcp-server-togo-web-mcp)
- [ToGO أم Gin وEcho وFiber](/ar/blog/togo-vs-gin-echo-fiber)

---

Source: https://to-go.dev/ar/blog/seatfor-togo-case-study
