> 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/aliadadat/overleaf-toolkit/amlyat-altjmya-almazwlh.md).

# عمليات التجميع المعزولة

يأتي Overleaf Pro مع خيار تشغيل عمليات التجميع داخل بيئة رملية مؤمّنة لأمان المؤسسات. ويتم ذلك عبر تشغيل كل مشروع في بيئة Docker مؤمّنة خاصة به.

### تحسين الأمان

تُعدّ عمليات التجميع المعزولة الخيار الموصى به لـ Server Pro نظرًا لأن العديد من مستندات LaTeX تتطلب/يمكنها تنفيذ أوامر shell عشوائية كجزء من عملية تجميع PDF. إذا استخدمت عمليات التجميع المعزولة، فسيعمل كل تجميع في حاوية Docker منفصلة بقدرات محدودة لا تتم مشاركتها مع أي مستخدم أو مشروع آخر، ولا يكون لديها أي وصول إلى الموارد الخارجية مثل شبكة المضيف.

{% hint style="warning" %}
إذا حاولت تشغيل Overleaf Pro **بدون** عمليات التجميع المعزولة، فسيعمل التجميع جنبًا إلى جنب مع عمليات تجميع متزامنة أخرى داخل حاوية Docker الرئيسية، وسيحصل المستخدمون على صلاحيات قراءة وكتابة كاملة إلى `sharelatex` موارد الحاوية (نظام الملفات، الشبكة، ومتغيرات البيئة) عند تشغيل تجميعات LaTeX.
{% endhint %}

### إدارة أسهل للحزم

لتجنب تثبيت الحزم يدويًا، نوصي بتمكين عمليات التجميع المعزولة. هذا إعداد قابل للتهيئة داخل Server Pro، وسيمنح مستخدميك الوصول إلى نفس بيئة TeX Live الموجودة على overleaf.com ولكن ضمن تثبيتك المحلي الخاص. تحتوي صور TeX Live المستخدمة في عمليات التجميع المعزولة على الحزم والخطوط الأكثر شيوعًا والمختبرة مقابل قوالب المعرض لدينا، مما يضمن أقصى توافق مع المشاريع المحلية.

يتيح لك تمكين عمليات التجميع المعزولة تهيئة إصدارات TeX Live التي يمكن للمستخدمين الاختيار منها داخل مشاريعهم، إلى جانب تعيين إصدار صورة TeX Live افتراضي للمشاريع الجديدة.

{% hint style="info" %}
إذا حاولت تشغيل Overleaf Pro من دون عمليات التجميع المعزولة، فسيستخدم مثيلك تلقائيًا إصدارًا أساسيًا من TeX Live للتجميع. هذا الإصدار الأساسي خفيف الوزن ولا يحتوي إلا على مجموعة فرعية محدودة جدًا من حزم LaTeX، مما سيؤدي على الأرجح إلى أخطاء بسبب الحزم المفقودة لدى مستخدميك، خاصةً إذا حاولوا استخدام القوالب الجاهزة.
{% endhint %}

نظرًا لأن Overleaf Pro صُمم للعمل دون اتصال بالإنترنت، فلا توجد طريقة آلية لدمج قوالب معرض overleaf.com في تثبيتك المحلي؛ ومع ذلك، من الممكن القيام بذلك يدويًا على أساس كل قالب على حدة. لمزيد من المعلومات حول كيفية عمل ذلك، يُرجى الاطلاع على دليلنا الخاص بنقل القوالب من overleaf.com: [/pages/b85d0905301f984f25f85203f0c0db75749a32d0#transferring-templates-from-overleaf.com](https://overleaf-pro.ayaka.space/on-premises/ar/aliadadat/overleaf-toolkit/pages/b85d0905301f984f25f85203f0c0db75749a32d0#transferring-templates-from-overleaf.com "mention").

{% hint style="info" %}
تتطلب عمليات التجميع المعزولة أن يكون `sharelatex` لدى الحاوية وصول إلى مأخذ Docker على جهاز المضيف (عبر bind mount) حتى تتمكن من إدارة حاويات التجميع الشقيقة هذه.
{% endhint %}

## كيف يعمل

عند تمكين عمليات التجميع المعزولة، سيتم تركيب مأخذ Docker من جهاز المضيف إلى `sharelatex` الحاوية، بحيث تتمكن خدمة التجميع داخل الحاوية من إنشاء حاويات Docker جديدة على المضيف. ثم عند كل تشغيل للمجمّع في كل مشروع، ستقوم خدمة تجميع LaTeX ‏(CLSI) بما يلي:

* كتابة ملفات المشروع إلى موقع داخل `OVERLEAF_DATA_PATH`.
* استخدام مأخذ Docker المركّب لإنشاء `texlive` حاوية جديدة لتشغيل التجميع.
* جعل `texlive` الحاوية تقرأ بيانات المشروع من الموقع تحت `OVERLEAF_DATA_PATH`.
* تجميع المشروع داخل `texlive` الحاوية.

### تمكين عمليات التجميع المعزولة&#xD;

#### لمستخدم Toolkit

لتمكين عمليات التجميع المعزولة (المعروفة أيضًا باسم الحاويات الشقيقة)، اضبط خيارات التهيئة التالية في `overleaf-toolkit/config/overleaf.rc`:

{% code title="config/overleaf.rc" %}

```dotenv
SERVER_PRO=true
SIBLING_CONTAINERS_ENABLED=true
```

{% endcode %}

#### لمستخدم Docker Compose <a href="#docker-compose-example" id="docker-compose-example"></a>

{% hint style="danger" %}
بدءًا من Overleaf CE/Server Pro `5.0.3` تمت إعادة تسمية متغيرات البيئة من `SHARELATEX_*` إلى `OVERLEAF_*`.
{% endhint %}

إذا كنت تستخدم `4.x` إصدار (أو أقدم)، يرجى التأكد من أن المتغيرات مسبوقة بالشكل المناسب (مثل `SHARELATEX_MONGO_URL` بدلًا من `OVERLEAF_MONGO_URL`).

<pre class="language-yml"><code class="lang-yml">version: '2'
services:
    sharelatex:
        #...
        الأحجام:
            - /data/overleaf_data:/var/lib/overleaf
<strong>            - /var/run/docker.sock:/var/run/docker.sock
</strong>        البيئة:
            #...
<strong>            DOCKER_RUNNER: "true"
</strong><strong>            SANDBOXED_COMPILES: "true"
</strong><strong>            SANDBOXED_COMPILES_HOST_DIR: "/data/overleaf_data/data/compiles"
</strong>            #...
        #...
</code></pre>

### تغيير صورة TexLive

{% hint style="info" %}
لمستخدمي البر الرئيسي للصين، يمكنك استخدام `ghcr.nju.edu.cn` لتسريع عملية التنزيل.&#x20;
{% endhint %}

يستخدم Overleaf Pro ثلاثة متغيرات بيئية لتحديد صور TeX Live التي سيتم استخدامها لعمليات التجميع المعزولة:

* `TEX_LIVE_DOCKER_IMAGE` **(مطلوب)،** صورة TeX Live الافتراضية المستخدمة لتجميع المشاريع الجديدة. يجب أن تكون هذه الصورة مضمنة في `ALL_TEX_LIVE_DOCKER_IMAGES`.
* `ALL_TEX_LIVE_DOCKER_IMAGE_NAMES` **(مطلوب)،** قائمة مفصولة بفواصل بالأسماء الودية للصور، وتُستخدم لخيارات الواجهة الأمامية.
* `ALL_TEX_LIVE_DOCKER_IMAGES` **(مطلوب)،** قائمة مفصولة بفواصل بصور TeX Live المطلوب استخدامها. إذا استُخدم Overleaf Toolkit للنشر، فسيتم تنزيل هذه الصور أو تحديثها. لتخطي التنزيل، عيّن `SIBLING_CONTAINERS_PULL=false` في `config/overleaf.rc`.

عند بدء تشغيل مثيل Overleaf Pro الخاص بك باستخدام `bin/up` الأمر، سيقوم Toolkit تلقائيًا بسحب جميع الصور المدرجة في `ALL_TEX_LIVE_DOCKER_IMAGES`.

إليك مثالًا نضبط فيه TeX Live 2025 افتراضيًا للمشاريع الجديدة، ونُبقي 2024 قيد الاستخدام للمشاريع الموجودة.

{% code title="config/variables.env" overflow="wrap" %}

```dotenv
ALL_TEX_LIVE_DOCKER_IMAGES=ghcr.io/ayaka-notes/texlive-full:2025.1, ghcr.io/ayaka-notes/texlive-full:2024.1
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=Texlive 2025, Texlive 2024
TEX_LIVE_DOCKER_IMAGE=ghcr.io/ayaka-notes/texlive-full:2025.1
```

{% endcode %}

{% hint style="danger" %}
يُنصح بشدة بتعيين **صورتين texlive-full على الأقل** . وللتفاصيل، انظر [#known-issues](#known-issues "mention")
{% endhint %}

### صور TeX Live المتاحة

هذه سلسلة من صور TeX Live المحسّنة خصيصًا لـ Overleaf، ويمكن أيضًا إضافتها إلى `TEX_LIVE_DOCKER_IMAGE` و `ALL_TEX_LIVE_DOCKER_IMAGES`:&#x20;

* `ghcr.io/ayaka-notes/texlive-full:2025.1` (وأيضًا `الأحدث` علامة)
* `ghcr.io/ayaka-notes/texlive-full:2024.1`
* `ghcr.io/ayaka-notes/texlive-full:2023.1`
* `ghcr.io/ayaka-notes/texlive-full:2022.1`
* `ghcr.io/ayaka-notes/texlive-full:2021.1`
* `ghcr.io/ayaka-notes/texlive-full:2020.1`

{% hint style="warning" %}
هناك مخطط صارم يتعلق بكيفية وسم الصور **يجب** أن تُوسم (ينطبق التعبير النمطي التالي `^[0-9]+.[0-9]+`، حيث يحدد الرقم الأول سنة TeX Live والثاني إصدار التصحيح).
{% endhint %}

### هل يمكنني استخدام سجل صور آخر؟

> قد يتساءل البعض إن كان بإمكاني استبدال `ghcr.io` بموقع مرآة آخر، أو تبديل texlive إلى صورة أخرى من Docker Hub؟

لا، لا نوصي بذلك لأن التهيئة معقدة نسبيًا. إذا كنت تُنزّل من موقع مرآة، فيمكنك إعادة تسمية صورتك إلى `ghcr.io/ayaka-notes/texlive-full`.

ولكن، إذا كنت ترغب حقًا في استخدام سجل الصور الخاص بك، فأضف:

{% code title="config/variables.env" overflow="wrap" %}

```dotenv
IMAGE_ROOT=hub.your.com/your-repo
```

{% endcode %}

ثم، تحتاج إلى التأكد من أن جميع صور texlive موجودة في `your-repo`، مثل

* `hub.your.com/your-repo/texlive-full:2025.1`
* `hub.your.com/your-repo/texlive-full:2024.1`

للحصول على معلومات مفصّلة، اقرأ الشفرة المصدرية أدناه لفهم كيفية تحليل متغيرات البيئة الخاصة بك:

{% code title="sandboxed-compiles/index.mjs" overflow="wrap" expandable="true" %}

```mjs
if (process.env.SANDBOXED_COMPILES === 'true') {
  // تعيين جذر الصورة الافتراضي إذا لم يكن محددًا
  let imageRootPath = process.env.IMAGE_ROOT || "ghcr.io/ayaka-notes";
  // تصدير imageRoot إلى Settings
  Settings.imageRoot = imageRootPath

  // يجب أن تكون allowedImageNames كالتالي:
  // [
  //  { imageName: "texlive-2023:latest", imageDesc: "TeX Live 2023" },
  //  { imageName: "texlive-2022:latest", imageDesc: "TeX Live 2022" },
  // ]
  Settings.allowedImageNames = parseTextExtensions(process.env.ALL_TEX_LIVE_DOCKER_IMAGES)
    .map((texImage, index) => ({
      imageName: texImage.split("/")[texImage.split("/").length - 1],
      imageDesc: parseTextExtensions(process.env.ALL_TEX_LIVE_DOCKER_IMAGE_NAMES)[index]
        || texImage.split(':')[1],
    }))
  
  // في النهاية، سيتم تجميع imageName مع imageRoot لتكوين المسار الكامل للصورة
  // سيكون الاسم الكامل مثل: ghcr.io/ayaka-notes/texlive-2023:latest

  // تعيين اسم الصورة الافتراضي إذا لم يكن محددًا
  if(!process.env.TEX_LIVE_DOCKER_IMAGE) {
    process.env.TEX_LIVE_DOCKER_IMAGE = imageRootPath + "/" + Settings.allowedImageNames[0].imageName
  }

  // تصدير currentImageName إلى Settings
  // هذا هو اسم الصورة للمشاريع التي تم إنشاؤها حديثًا
  Settings.currentImageName = process.env.TEX_LIVE_DOCKER_IMAGE
}
```

{% endcode %}

### المشكلات المعروفة

> استخدام `6.0.1-ext-v3.3`، لدي هذه الإعدادات في `variables.env`:
>
> ```dotenv
> TEX_LIVE_DOCKER_IMAGE=texlive/texlive:latest-full
> ALL_TEX_LIVE_DOCKER_IMAGES=texlive/texlive:latest-full
> ```
>
> وهذا يعمل بشكل جيد مع `texlive/texlive:latest-full`. ومع ذلك، قمت بسحب صورة texlive أخرى `danteev/texlive:2025-10-15` وقمت بتغيير كلا المتغيرين إلى اسم الصورة الجديد لكن الأمر لا يعمل:
>
> ```dotenv
> TEX_LIVE_DOCKER_IMAGE=danteev/texlive:2025-10-15
> ALL_TEX_LIVE_DOCKER_IMAGES=danteev/texlive:2025-10-15
> ```
>
> في السجلات، أرى ما يلي:
>
> {% code overflow="wrap" %}
>
> ```
> {"name":"clsi","level":50,"err":{"message":"(HTTP code 404) لا توجد حاوية بهذا الاسم - لا توجد صورة: texlive/texlive:latest-full ","name":"Error","stack":"Error: (HTTP code 404) no such container - No such image: texlive/texlive:latest-full ..."}} 
> ```
>
> {% endcode %}
>
> يبدو أن الإعدادات المحدثة في `variables.env` لا يتم تطبيقها. لا يزال التجميع يحاول تشغيل `texlive/texlive:latest-full` الصورة، وليس الصورة الجديدة.
>
> حاولت إعادة التشغيل، وحذف الحاويات وإعادة التشغيل، لكن ما زالت المشكلة نفسها.
>
> أي حلول؟

بسبب بعض القيود التقنية، إذا كنت قد أعددت صورة Docker TeXLive واحدة فقط، مثل `texlive-fullA:latest`&#x20;

```
ALL_TEX_LIVE_DOCKER_IMAGES=texlive/texliveA:latest-full
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=TeXLiveA
TEX_LIVE_DOCKER_IMAGE=texlive/texliveA:latest-full
```

وبعد تشغيل مثيل Overleaf الخاص بك لفترة من الوقت، قد ترغب في تعديل صورة TeXLive إلى `texlive-fullB:latest`. عندها، ستلاحظ أن المستخدمين غير قادرين على تجميع جميع المشاريع.

```
ALL_TEX_LIVE_DOCKER_IMAGES=texlive/texliveA:latest-full
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=TeXLiveA
TEX_LIVE_DOCKER_IMAGE=texlive/texliveA:latest-full
```

وذلك لأن اسم صورة TeXLive-Full (للتجميع المعزول) في كل مشروع يُخزَّن بشكل دائم في قاعدة البيانات. *فقط عندما يغيّر المستخدم إصدار TeXLive الخاص بمشروعه، مثلًا من 2024 إلى 2025، سيتغير اسم الصورة في قاعدة البيانات*.

عندما يقوم CLSI بتجميع مشروع، فإنه يستخدم اسم صورة الحاوية الموجود في قاعدة البيانات لتجميع المشروع مباشرة.

إذا كنت توفر صورة Docker واحدة فقط، فلن يتمكن المستخدمون من تعديل الصورة المستخدمة لتجميع المشروع. في هذه الحالة، تحتاج إلى كتابة برنامج نصي لـ **تعديل** صورة TeXLive يدويًا لجميع مشاريع المستخدمين في MongoDB.

### تصحيح الأخطاء

شغّل الأمر التالي للتحقق من سجل clsi من Toolkit:

{% code overflow="wrap" %}

```bash
bin/logs clsi
```

{% endcode %}


---

# 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/aliadadat/overleaf-toolkit/amlyat-altjmya-almazwlh.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.
