> For the complete documentation index, see [llms.txt](https://overleaf-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://overleaf-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://overleaf-pro.ayaka.space/on-premises/ar/albda/pages/f24259c1dc7ae4567b9ed3587d530fa537846567#the-overleaf.rc-file) ملف التهيئة.
{% endhint %}

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

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

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

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

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

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

* **المستخدم**: يحمّل صفحة المحرّر
* **المحرّر**: يفتح مقبس ويب
* **المحرّر**: يرسل طلبًا لفتح مستند عبر مقبس ويب
  * **real-time** -> **document-updater**: يتم تحميل المستند من MongoDB إلى Redis
* **المحرّر**: يرسل تحديث المستند عبر مقبس ويب
  * **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

**الترجمة — وضع المزامنة «الكاملة»**

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

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

* **المحرّر**: يرسل طلب ترجمة مع ضبط sync-mode على «التزايدي»
* **web** -> **document-updater**: الحصول على أي مستندات من Redis
  * تُخزَّن أيضًا تجزئة «حالة المشروع» في Redis
  * **web** يرسل تجزئة شجرة الملفات إلى `document-updater` و `document-updater` يمكنه تحويل الترجمة التزايدية إلى ترجمة كاملة عند عدم التطابق
    * انظر عملية الترجمة كما تُنفَّذ عندما يطلب المحرّر «ترجمة كاملة»
* **web** -> **clsi**: يُرسل طلب الترجمة إلى `clsi`، بما في ذلك:
  * وضع المزامنة
  * تجزئة شجرة الملفات -> «حالة المشروع»
  * جميع المستندات من Redis مع محتواها -> خاضعة للحد الأقصى لحجم جسم الطلب البالغ 7 ميغابايت
  * لا توجد ملفات ثنائية
* **clsi**: التحقق من الحالة على القرص مع sync-mode و«حالة المشروع»
  * هذه مزامنة تزايدية، لذا يجب أن تتطابق «حالة المشروع»
  * عند عدم التطابق: الاستجابة بـ409، والسماح للويب بإعادة المحاولة مع مزامنة «كاملة»
    * انظر عملية الترجمة كما تُنفَّذ عندما يطلب المحرّر «ترجمة كاملة»
* **clsi**: كتابة المستندات المحدّثة في مجلد التجميع
* **clsi**: التأكد من وجود حاوي Docker بالتهيئة المطلوبة
  * بناء خيارات الحاوي، بما في ذلك إصدار texlive
  * تجزئة الخيارات
  * اسم الحاوي: `project-<project-id>-<user-id>-<hash>`
* **clsi**: بدء الحاوي وبث stdout/stderr إلى الذاكرة -> الحد 2 ميغابايت
* **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://overleaf-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.
