> For the complete documentation index, see [llms.txt](https://ayakaleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ayakaleaf-pro.ayaka.space/on-premises/ar/albda/microservices.md).

# الخدمات المصغّرة

الطريقة الموصى بها لنشر وإدارة مثيلات Overleaf Server CE وOverleaf Pro هي عبر استخدام Toolkit.

يُبسّط Toolkit إنشاء مثيل Overleaf الخاص بك من خلال استخدام بعض البرامج النصية المخصّصة التي تعزل تنسيق الخدمات المصغّرة المطلوبة. ما عليك سوى تشغيل برنامج التهيئة المرفق، وتوفير بعض خيارات الإعداد مثل مسارات التخزين الدائم لديك، وسيتكفّل Toolkit بتوفير الخدمات المصغّرة التي تكوّن مثيل Overleaf Server CE أو Pro الخاص بك وربطها.

وهذا يتيح لك التفرغ للتركيز على تخصيص تجربة المستخدم وتنفيذ الميزات المحددة التي يتكوّن منها مثيلك المحلي. يتولى Toolkit جميع التعقيدات في الخلفية، مما يتيح نشرًا مبسطًا لمثيل Overleaf الخاص بك.

{% hint style="info" %}
لأسباب تتعلق بالإرث، يُسمّى الحاوي الرئيسي لـ Overleaf `sharelatex`، وهو مبني على `sharelatex/sharelatex` صورة Docker. وذلك لأن التقنية تستند إلى قاعدة كود ShareLaTeX، التي دُمجت في Overleaf. انظر [هذه التدوينةarrow-up-right](https://www.overleaf.com/blog/518-exciting-news-sharelatex-is-joining-overleaf) لمزيد من التفاصيل. في وقت ما في المستقبل، سيُعاد تسميته ليتوافق مع مخطط تسمية Overleaf.
{% endhint %}

#### البنية

داخل حاوية Overleaf، يعمل البرنامج كمجموعة من الخدمات المصغّرة، تُدار بواسطة `runit`. بعض الملفات الأكثر إثارة للاهتمام داخل الحاوية هي:

* `/etc/service/`: ملفات التهيئة للخدمات المصغّرة.
* `/var/log/overleaf/`: سجلات كل خدمة مصغّرة.
* `/overleaf/services/`: الشفرة الخاصة بالخدمات المصغّرة المختلفة.
* `/var/lib/overleaf/`: نقطة الربط للبيانات الدائمة (تقابل الدليل المشار إليه بـ `OVERLEAF_DATA_PATH` على المضيف).

#### حاويتا MongoDB وRedis

يعتمد Overleaf على قاعدتي بيانات خارجيتين: MongoDB وRedis. افتراضيًا، سيقوم Toolkit بتوفير حاوية لكل من هاتين القاعدتين، بالإضافة إلى حاوية Overleaf، ليكون المجموع ثلاث حاويات Docker.

{% hint style="info" %}
إذا كنت تفضّل الاتصال بمثيل MongoDB أو Redis موجود مسبقًا، فيمكنك ذلك عبر تعيين الإعدادات المناسبة في [overleaf.rc](https://ayakaleaf-pro.ayaka.space/on-premises/ar/albda/pages/f24259c1dc7ae4567b9ed3587d530fa537846567#the-overleaf.rc-file) ملف التكوين.
{% endhint %}

#### المحرر وعملية التجميع

يقدّم هذا القسم نظرة عامة شاملة على التعامل مع المستندات وعملية التجميع.

{% hint style="info" %}
تصف هذه الصفحة عملية التجميع باستخدام عمليات التجميع المعزولة كما هي متاحة في Overleaf Pro فقط. في Server CE، تستخدم عملية التجميع عمليات فرعية بسيطة — استبدل العناصر التي تشير إلى **الحاوية** بعنصر واحد **تشغيل التجميع في عملية فرعية**.
{% endhint %}

المكوّنات / الجهات الفاعلة:

* `المستخدم` — مستخدم للتطبيق
* `المحرر` — التطبيق العميل الذي يعمل في المتصفح
* `clsi` — الخدمة المصغّرة المستخدمة لتجميع ملفات PDF
* `document-updater` — الخدمة المصغّرة المستخدمة لمعالجة تحديثات المستند
* `filestore` — الخدمة المصغّرة التي تتعامل مع الملفات الثنائية
* `real-time` — الخدمة المصغّرة المستخدمة للتعامل مع اتصالات WebSocket
* `web` — الخدمة (غير المصغّرة تمامًا) المستخدمة للتعامل مع طلبات API

**تخزين Redis المؤقت**

* **المستخدم**: تحميل صفحة المحرر
* **المحرر**: فتح اتصال WebSocket
* **المحرر**: إرسال طلب لفتح مستند عبر WebSocket
  * **real-time** -> **document-updater**: يتم تحميل المستند من MongoDB إلى Redis
* **المحرر**: إرسال تحديث المستند عبر WebSocket
  * **real-time** -> **document-updater**: يتم تحديث المستند في Redis
* **المحرر**: إرسال المزيد من طلبات التجميع
  * بعد مرور 5 دقائق منذ آخر تفريغ (لكل مستند):
    * **document-updater**: تفريغ المستند من Redis إلى MongoDB
* **المحرر**: إرسال المزيد من التحديثات
  * كل 100 تحديث (لكل مستند):
    * **document-updater**: تفريغ سجل المستند من Redis إلى MongoDB
* **المستخدم**: يغادر المحرر/يغلق تبويب المتصفح
  * بعد 5 دقائق
    * **real-time**: يتحقق من وجود متعاونين آخرين، وإذا لم يوجد:
      * **real-time** -> **document-updater**: يفرغ المستندات من Redis إلى MongoDB

**القراءة من MongoDB إلى Redis**

* **document-updater** -> **web** -> **docstore**: القراءة من MongoDB

**التفريغ من Redis إلى MongoDB**

* **document-updater** -> **web** -> **docstore**: الكتابة إلى MongoDB

**التجميع — وضع المزامنة "الكامل"**

* **المحرر**: إرسال طلب تجميع مع ضبط وضع المزامنة على "كامل"
* **web** -> **document-updater**: يتم تفريغ أي مستندات من Redis إلى MongoDB
* **web** -> **docstore**: يتم تنزيل جميع المستندات من MongoDB
* **web** -> **clsi**: يتم إرسال طلب التجميع إلى `clsi`، بما في ذلك:
  * وضع المزامنة
  * تجزئة شجرة الملفات -> "حالة المشروع"
  * جميع المستندات مع محتواها -> مع مراعاة حد 7MB لحجم جسم الطلب
  * روابط الملفات الثنائية للتنزيل المنفصل
* **clsi**: التحقق من الحالة على القرص مع وضع المزامنة و"حالة المشروع"
  * هذه مزامنة كاملة، لذا يمكن تجاهل الحالة السابقة على القرص
* **clsi**: تنظيف دليل التجميع
* **clsi**: كتابة جميع المستندات إلى دليل التجميع
* **clsi**: كتابة جميع الملفات الثنائية إلى دليل التجميع
  * `clsi` ينسخ الملفات من ذاكرة تخزين مؤقت محلية خاصة بكل مشروع
  * عند فشل التخزين المؤقت:
    * **clsi** -> **filestore**: تنزيل الملفات
* **clsi**: كتابة "حالة المشروع"
* **clsi**: التأكد من وجود حاوية Docker بالإعداد المطلوب
  * بناء خيارات الحاوية، بما في ذلك إصدار texlive
  * خيارات التجزئة
  * اسم الحاوية: `project-<project-id>-<user-id>-<hash>`
* **clsi**: بدء الحاوية وتدفق المخرجات stdout/stderr إلى الذاكرة -> حد 2MB
* **clsi**: ترك الحاوية المتوقفة خلفه -> تتم إزالتها بعد 24 ساعة
* **clsi**: كتابة stdout/stderr إلى القرص
* **clsi**: نسخ ملفات الإخراج إلى دليل إخراج فريد
  * معرّف البناء يتكوّن من 8 بايتات عشوائية بالإضافة إلى طابع زمني بدقة المللي ثانية
  * حذف جميع مجلدات البناء ما عدا آخر 3 (مجهول) / آخر 1 (مستخدم مسجّل الدخول)
* **clsi**: فشل التجميع/انتهت المهلة
  * حذف ذاكرة التخزين المؤقت للتجميع — قد تحتوي على ملفات جزئية/ذاكرة تخزين مؤقت تالفة
* **المحرر**: تنزيل output.log وoutput.pdf

**التجميع — وضع المزامنة "التدريجي"**

* **المحرر**: إرسال طلب تجميع مع ضبط وضع المزامنة على "تدريجي"
* **web** -> **document-updater**: جلب أي مستندات من Redis
  * تُخزَّن أيضًا تجزئة "حالة المشروع" في Redis
  * **web** إرسال تجزئة شجرة الملفات إلى `document-updater` و `document-updater` يمكنه تحويل التجميع التدريجي إلى تجميع كامل عند عدم التطابق
    * انظر عملية التجميع كما تُنفّذ عندما يطلب المحرر تجميعًا "كاملاً"
* **web** -> **clsi**: يتم إرسال طلب التجميع إلى `clsi`، بما في ذلك:
  * وضع المزامنة
  * تجزئة شجرة الملفات -> "حالة المشروع"
  * جميع المستندات من Redis مع محتواها -> مع مراعاة حد 7MB لحجم جسم الطلب
  * لا توجد ملفات ثنائية
* **clsi**: التحقق من الحالة على القرص مع وضع المزامنة و"حالة المشروع"
  * هذه مزامنة تدريجية، لذا يجب أن تتطابق "حالة المشروع"
  * عند عدم التطابق: الرد بـ 409، ودع الويب يعيد المحاولة باستخدام مزامنة "كاملة"
    * انظر عملية التجميع كما تُنفّذ عندما يطلب المحرر تجميعًا "كاملاً"
* **clsi**: كتابة المستندات المحدّثة إلى دليل التجميع
* **clsi**: التأكد من وجود حاوية Docker بالإعداد المطلوب
  * بناء خيارات الحاوية، بما في ذلك إصدار texlive
  * خيارات التجزئة
  * اسم الحاوية: `project-<project-id>-<user-id>-<hash>`
* **clsi**: بدء الحاوية وتدفق المخرجات stdout/stderr إلى الذاكرة -> حد 2MB
* **clsi**: ترك الحاوية المتوقفة خلفه -> تتم إزالتها بعد 24 ساعة
* **clsi**: كتابة stdout/stderr إلى القرص
* **clsi**: نسخ ملفات الإخراج إلى دليل إخراج فريد
  * معرّف البناء يتكوّن من 8 بايتات عشوائية بالإضافة إلى طابع زمني بدقة المللي ثانية
  * حذف جميع مجلدات البناء ما عدا آخر 3 (مجهول) / آخر 1 (مستخدم مسجّل الدخول)
* **clsi**: فشل التجميع/انتهت المهلة
  * حذف ذاكرة التخزين المؤقت للتجميع — قد تحتوي على ملفات جزئية/ذاكرة تخزين مؤقت تالفة
* **المحرر**: تنزيل output.log وoutput.pdf

**التجميع — التبديل بين الأوضاع**

* **المحرر**: يلاحظ فشلًا في التجميع، ويكون التجميع التالي "كاملًا"
* **المحرر**: يلاحظ نجاحًا في التجميع، ويكون التجميع التالي "تدريجيًا"


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ayakaleaf-pro.ayaka.space/on-premises/ar/albda/microservices.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
