> 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/althyeh/overleaf-toolkit/sandboxed-compiles.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 من دون عمليات التجميع المعزولة، فستستخدم نسختك افتراضيًا نسخة scheme أساسية من TeX Live لعمليات التجميع. هذه النسخة الأساسية خفيفة الوزن ولا تحتوي إلا على مجموعة محدودة جدًا من حزم LaTeX، مما سيؤدي على الأرجح إلى أخطاء نقص الحزم لدى المستخدمين، خاصة إذا حاولوا استخدام قوالب مُنشأة مسبقًا.
{% endhint %}

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

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

## كيف يعمل

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

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

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

#### لمستخدمي 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:
        #...
        volumes:
            - /data/overleaf_data:/var/lib/overleaf
<strong>            - /var/run/docker.sock:/var/run/docker.sock
</strong>        environment:
            #...
<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` لتسريع التنزيل.
{% 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 قيد الاستخدام للمشاريع الحالية.

{% tabs %}
{% tab title="تثبيت شائع" %}
يُثبّت التهيئة التالية جميع صور TeX Live Docker الكاملة من 2025 إلى 2026. نوصي بتوفر 80 غيغابايت على الأقل من مساحة التخزين قبل استخدام هذه التهيئة.

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

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

{% endcode %}
{% endtab %}

{% tab title="تثبيت كامل" %}
تُثبّت التهيئة التالية جميع صور TeX Live Docker الكاملة من 2020 إلى 2026. نوصي بتوفر 256 غيغابايت على الأقل من مساحة التخزين قبل استخدام هذه التهيئة.

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

```dotenv
ALL_TEX_LIVE_DOCKER_IMAGES=ghcr.io/ayaka-notes/texlive-full:2026.1,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
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=Texlive 2026,Texlive 2025,Texlive 2024,Texlive 2023,Texlive 2022,Texlive 2021,Texlive 2020
TEX_LIVE_DOCKER_IMAGE=ghcr.io/ayaka-notes/texlive-full:2026.1
```

{% endcode %}
{% endtab %}
{% endtabs %}

{% 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`:

* `ghcr.io/ayaka-notes/texlive-full:2026.1` (أيضًا `latest` وسم)
* `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
إذا (process.env.SANDBOXED_COMPILES === 'true') {
  // عيّن جذر الصورة الافتراضي إذا لم يكن مُوفّرًا
  let imageRootPath = process.env.IMAGE_ROOT || "ghcr.io/ayaka-notes";
  // صدّر imageRoot إلى Settings
  Settings.imageRoot = imageRootPath

  // should يكون 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 %}

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

هذه حالة حقيقية من مجتمع overleaf:

> باستخدام `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) لا توجد حاوية - لا توجد صورة: texlive/texlive:latest-full ... 
> ```
>
> {% endcode %}
>
> يبدو أن الإعدادات المحدّثة في `variables.env` لا يتم تطبيقها. ما زال التجميع يحاول تشغيل `texlive/texlive:latest-full` الصورة، وليس الصورة الجديدة.
>
> حاولت إعادة التشغيل، وحذف الحاويات وإعادة التشغيل، لكن المشكلة نفسها ما زالت قائمة.
>
> هل من حلول؟

بسبب بعض القيود التقنية، إذا كنت قد أعددت صورة Docker TeXLive واحدة فقط، مثل `texlive-fullA: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
```

وبعد تشغيل نسخة 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://ayakaleaf-pro.ayaka.space/on-premises/ar/althyeh/overleaf-toolkit/sandboxed-compiles.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.
