> 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/alsyanh/horizontal-scaling.md).

# التوسّع الأفقي

بدءًا من الإصدار 3.5.6، يدعم Server Pro التوسّع الأفقي.

يسرد هذا المستند المتطلبات التقنية ويقدّم إرشادات لتشغيل Server Pro على أكثر من عقدة واحدة.

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

إذا كنت تستخدم `4.x` إصدارًا (أو أقدم)، فيرجى التأكد من أن المتغيرات تسبقها البادئة وفقًا لذلك (مثلًا `SHARELATEX_SITE_URL` بدلًا من `OVERLEAF_SITE_URL`)
{% endhint %}

يستلزم إعداد التوسّع الأفقي قدرًا كبيرًا من الجهد. ننصح بالنظر في التوسّع الأفقي **فقط** عند الوصول إلى نطاق معيّن. على سبيل المثال، تم إعداد تثبيت Server Pro لـ 1000 مستخدم إجمالي بنجاح باستخدام خادم واحد مزود بمعالجين رباعيي النوى و32 غيغابايت من ذاكرة النظام. راجع [متطلبات العتاد](/on-premises/ar/albda/requirements/hardware-requirements.md) الوثائق للحصول على التوصيات.

يتضمن نشر Server Pro مع التوسّع الأفقي مجموعة من المكوّنات الخارجية، مثل موازن تحميل وخلفية تخزين متوافقة مع S3.

يمكننا المساعدة في استكشاف الأخطاء في حاويات Server Pro التي قد تكون ناتجة عن سوء إعداد، وتقديم نصائح عامة استنادًا إلى هذا المستند. للأسف، لا يمكننا تقديم المساعدة في إعداد التطبيقات/الأنظمة التابعة لجهات خارجية.

لا تغطي شروط الدعم لدينا حل المشكلات التقنية الخاصة بالعتاد/البرمجيات لديك من أجل توفير المكوّنات الخارجية.

### المتطلبات

#### تخزين بيانات خارجي ومركزي

يمكن تقسيم تخزين البيانات في Server Pro إلى أربعة مخازن بيانات:

* **MongoDB**

  * تُخزَّن معظم البيانات في MongoDB.
  * ندعم إما نسخة محلية أو نسخة خارجية، مثل [MongoDB](https://www.mongodb.com/atlas) Atlas (خدمة MongoDB مُدارة بالكامل تعمل ضمن بنية AWS التحتية).<br>

  **ملاحظة:** للأسف، لا يوجد دعم رسمي حاليًا لقواعد بيانات متوافقة مع MongoDB مثل CosmoDB/DocumentDB، لأننا لم نختبر Server Pro معها. وعلى الرغم من أن نشر Server Pro مع قواعد بيانات متوافقة **قد** يكون ممكنًا، فإننا ندعم رسميًا فقط عمليات النشر التي تستخدم MongoDB.<br>
* **Redis**

  * يخزّن Redis البيانات المؤقتة، مثل تحديثات المستندات المعلّقة قبل تفريغها إلى MongoDB.
  * يُستخدم Redis للتواصل بشأن تحديثات المستندات بين الخدمات المختلفة وإخطار المحرر بتغييرات الحالة في مشروع معيّن.
  * يُستخدم Redis لتخزين جلسات المستخدم.
  * ندعم إما نسخة محلية أو نسخة خارجية.<br>

  **ملاحظة:** للأسف، لا يوجد دعم رسمي حاليًا لمخازن المفاتيح/القيم المتوافقة مع Redis مثل KeyDB/Valkey، لأننا لم نختبر Server Pro معها. وعلى الرغم من أن نشر Server Pro مع مخازن متوافقة **قد** يكون ممكنًا، فإننا ندعم رسميًا فقط عمليات النشر التي تستخدم Redis.<br>
* **ملفات المشروع وملفات السجلّ**

  * تُخزَّن ملفات المشروع غير القابلة للتحرير خارج MongoDB.

    كما يخزّن نظام سجلّات المشروع الجديد (بدءًا من Server Pro 3.5) السجل خارج MongoDB أيضًا.
  * بالنسبة للحالات الصغيرة المفردة، ندعم إما نظام ملفات محليًا (يمكن أن يكون مدعومًا بواسطة SSD محلي أو NFS أو EBS) أو [نظام تخزين بيانات متوافق مع S3](/on-premises/ar/aliadadat/overleaf-toolkit/s3.md).
  * للتوسّع الأفقي، نحن **فقط** ندعم أنظمة تخزين بيانات متوافقة مع S3.<br>

  **مهم:** NFS/Amazon EFS/Amazon EBS هي **لا** مدعومة للتوسّع الأفقي. يرجى الاطلاع على قسم [تخزين العتاد](/on-premises/ar/albda/requirements/hardware-requirements.md#storage) المتطلبات الخاص بتوسيع التخزين في Server Pro للحصول على مزيد من التفاصيل.
* **الملفات المؤقتة**
  * يجب أن تعمل عمليات تجميع LaTeX على أقراص محلية وسريعة للحصول على أفضل أداء. لا حاجة إلى الاحتفاظ بمخرجات التجميع أو نسخها احتياطيًا.
  * كما أن تخزين عمليات رفع الملفات الجديدة مؤقتًا وإنشاء ملفات ZIP للمشاريع يستفيد أيضًا من استخدام قرص محلي.

{% hint style="danger" %}
ننصح بشدة باستخدام قرص محلي. يمكن أن يؤدي استخدام أي نوع من الأقراص الشبكية (مثل NFS أو EBS) إلى أخطاء تجميع غير متوقعة ومشكلات أداء أخرى.
{% endhint %}

#### **جسر Git**

{% hint style="info" %}
أصبح Git-bridge متاحًا في Server Pro بدءًا من الإصدار 4.0.1.
{% endhint %}

تُخزَّن مستودعات git محليًا على القرص. لا توجد خيارات نسخ متماثل متاحة. يجب تشغيل Git-bridge كـ **نسخة وحيدة**. وللحصول على أفضل أداء، ننصح باستخدام قرص محلي لبيانات git-bridge. يجب نسخ قرص بيانات git-bridge احتياطيًا بانتظام.

لتخزين البيانات مع التوسّع الأفقي، تحتاج إلى:

* نسخة MongoDB مركزية يمكن الوصول إليها من جميع مثيلات Server Pro
* نسخة Redis مركزية يمكن الوصول إليها من جميع مثيلات Server Pro
* خلفية تخزين مركزية متوافقة مع S3 لملفات المشروع والسجل
* قرص محلي على كل مثيل للملفات المؤقتة
* قرص محلي على المثيل الذي يستضيف حاوية git-bridge لبيانات git-bridge

#### متطلبات موازن التحميل

* **توجيه دائم**، مثل استخدام ملف تعريف ارتباط

  ينبع هذا المتطلب من هذه المكوّنات:

  * تستخدم ميزة التحرير في الوقت الفعلي في Server Pro WebSockets مع بديل إلى XHR polling. لكل جلسة تحرير حالة محلية على جانب الخادم، ويجب دائمًا توجيه طلبات جلسة التحرير المعينة إلى نفس مثيل Server Pro. وتستخدم ميزة التعاون Redis [Pub/Sub](https://redis.io/docs/latest/develop/interact/pubsub/) لمشاركة التحديثات بين عدة مثيلات من Server Pro.
  * يحتفظ تجميع LaTeX بالمخرجات وذاكرة التخزين المؤقت للتجميع محليًا من أجل الأداء الأمثل. عند إرسال طلب تجميع إلى أحد مثيلات Server Pro، يجب توجيه طلبات تنزيل PDF/السجل التالية إلى نفس المثيل.
* **مهلات طلبات طويلة** لدعم تجميع مستندات LaTeX الكبيرة
* **دعم WebSocket** لأداء أمثل
* **حجم حمولة POST يبلغ 50 ميغابايت**
* **مهلة البقاء على الاتصال** يجب أن تكون أقل من مهلة البقاء على الاتصال في Server Pro

  يمكن ضبط مهلة البقاء على الاتصال في Server Pro باستخدام متغير البيئة `NGINX_KEEPALIVE_TIMEOUT`. القيمة الافتراضية هي 65 ثانية.

  بالقيمة الافتراضية، تعمل مهلة بقاء على الاتصال مدتها 60 ثانية في موازن التحميل.

  مع `NGINX_KEEPALIVE_TIMEOUT=120`، يمكن لموازن التحميل أن يختار 115 ثانية.
* **عناوين IP الخاصة بالعملاء**

  اضبط رأس الطلب `X-Forwarded-For` على عنوان IP الخاص بالعميل.
* عندما **إنهاء SSL**

  يحتاج موازن التحميل إلى إضافة رأس الطلب `X-Forwarded-Proto: https`.

<details>

<summary>مثال على إعداد HAProxy</summary>

```
global
  group haproxy
  user haproxy

  # تسجيل مطوّل
  log stdout format raw local0 debug

defaults
  mode                    http
  option                  httpchk HEAD /status
  http-check              expect status 200
  default-server          check

  # تسجيل مطوّل
  log                     global
  option                  httplog

  # إعادة التوجيه إلى backend مختلف إذا كان الثابت متوقفًا
  option                  redispatch 1
  # هذه المحاولات تخص أخطاء اتصال TCP، وليس استجابات HTTP ذات الحالة 500
  retries                 3

  # جلسة ثابتة لمدة 24 ساعة من عدم النشاط -- تُحذف مخرجات التجميع بعد 24 ساعة
  cookie                  server-pro-ha insert maxidle 24h

  # حاول الاتصال بأي backend لمدة دقيقة واحدة، ثم أعد 503
  timeout queue           1m
  # امنح مثيلات Server Pro 15 ثانية لبدء التشغيل
  timeout connect         15s

  # أوقف الطلبات القادمة من عملاء بطيئين جدًا (اسمح بدقيقة واحدة من الخمول عند قراءة طلب)
  timeout client          1m

  # اسمح بالتجميع البطيء -- الحد المبرمج داخل clsi هو 10 دقائق
  timeout server          10m

  # افصل المحرر بعد 23 ساعة -- ساعة واحدة قبل آخر استخدام لهم أمس
  timeout tunnel          23h

  # ملاحظة: يعمل سلوك keepalive في haproxy بشكل ممتاز مع إعداد keepalive الافتراضي في Server Pro.
  #       يقوم Haproxy بتنظيف الاتصالات في الخلفية وسيعيد توجيه الطلبات عند الحاجة.

listen server-pro-ha-http
  bind :80
  http-request redirect scheme https unless { ssl_fc }

listen server-pro-ha-https
  bind :443 ssl crt /etc/ssl/certs/ssl-key-and-certificate-bundle.pem

  # أخبر التطبيق أننا خلف https
  http-request set-header X-Forwarded-Proto https

  # أخبر التطبيق بعنوان IP الفعلي للعميل
  option forwardfor

  # راجع https://hstspreload.org/#deployment-recommendations
  http-response set-header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload;"

  # وجّه حركة مرور git إلى الحاوية الشقيقة لـ git-bridge
  use-server server-pro-ha-1 if { path_beg /git/ }

  # تصحيح الأخطاء
  http-response add-header X-Served-By %s
  stats enable
  stats uri /haproxy

  server server-pro-ha-1 198.18.1.1:80 cookie server-pro-ha-1
  server server-pro-ha-2 198.18.1.2:80 cookie server-pro-ha-2
  server server-pro-ha-3 198.18.1.3:80 cookie server-pro-ha-3
```

</details>

#### إعداد Server Pro

**الأسرار**

يجب أن تتوافق مثيلات Server Pro على أسرار مشتركة:

* `WEB_API_PASSWORD` (مصادقة web api)
* `STAGING_PASSWORD` و `V1_HISTORY_PASSWORD` القيمة نفسها (مصادقة السجل)
* `CRYPTO_RANDOM` (لملف تعريف الارتباط الخاص بالجلسة)
* `OT_JWT_AUTH_KEY` (مصادقة السجل)

يجب إعداد جميع هذه الأسرار بقيمة فريدة خاصة بها ومشاركتها بين المثيلات.

عند عدم الإعداد وتوجيه طلبات المستخدم إلى مثيلات مختلفة من Server Pro، ستفشل طلباتهم في فحوصات المصادقة، وسينتقلون إما إلى صفحة تسجيل الدخول كثيرًا أو ستفشل إجراءاتهم في واجهة المستخدم بطرق غير متوقعة.

عند عدم الإعداد، يستخدم Server Pro قيمة عشوائية جديدة لكل سر استنادًا إلى 32 بايت عشوائية من `/dev/urandom` (256 بت عشوائية).

{% code overflow="wrap" %}

```bash
# https://github.com/overleaf/overleaf/blob/45ca0f796c679103efd305ddbef28073c4a5de32/server-ce/init_scripts/00_regen_sharelatex_secrets.sh#L14
dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev | tr -d '\n+/'
```

{% endcode %}

**MongoDB**

أشر `OVERLEAF_MONGO_URL` (`SHARELATEX_MONGO_URL` للإصدارات `4.x` والأقدم) إلى مثيل MongoDB المركزي.

**Redis**

أشر `OVERLEAF_REDIS_HOST` (`SHARELATEX_REDIS_HOST` للإصدارات `4.x` والأقدم) و `REDIS_HOST` إلى مثيل Redis المركزي.

**تخزين S3 متوافق لملفات المشروع والسجل**

يرجى الاطلاع على الوثائق الخاصة بـ [تخزين متوافق مع S3](/on-premises/ar/aliadadat/overleaf-toolkit/s3.md) للمزيد من التفاصيل.

**الملفات المؤقتة**

التركيب الافتراضي عبر bind-mounted لـ SSD محلي إلى `/var/lib/overleaf` (`/var/lib/sharelatex` للإصدارات `4.x` والأقدم) سيكون كافيًا. تأكد من الإشارة إلى `SANDBOXED_COMPILES_HOST_DIR` إلى نقطة التركيب على المضيف.

{% hint style="danger" %}
ننصح بشدة باستخدام قرص محلي. يمكن أن يؤدي استخدام أي نوع من الأقراص الشبكية (مثل NFS أو EBS) إلى أخطاء تجميع غير متوقعة ومشكلات أداء أخرى.
{% endhint %}

**إعداد الوكيل**

* اضبط `OVERLEAF_BEHIND_PROXY=true` (`SHARELATEX_BEHIND_PROXY` للإصدارات `4.x` والأقدم) للحصول على عناوين IP دقيقة للعملاء.
* اضبط `TRUSTED_PROXY_IPS` على عنوان IP الخاص بموازن التحميل (يمكن تحديد عدة CIDR، مفصولة بفاصلة).

**تكامل Git-bridge**

{% hint style="info" %}
أصبح Git-bridge متاحًا في Server Pro بدءًا من الإصدار 4.0.1.
{% endhint %}

تحتاج حاوية git-bridge إلى حاوية Server Pro شقيقة للتعامل مع طلبات git الواردة. يمكن لهذه الحاوية الشقيقة أن تخدم حركة مرور المستخدم العادية أيضًا. في الإعداد النموذجي، تعمل النسخة الأولى كحاوية شقيقة لـ git-bridge، لكن أي نسخة يمكن أن تؤدي هذا الدور فعليًا.

لماذا نحتاج إلى تخصيص حاوية Server Pro واحدة كحاوية شقيقة لـ git-bridge؟ يسلّم Server Pro عناوين URL للتنزيل الخاصة بخدمة السجل إلى git-bridge. نحتاج إلى إعداد عناوين URL هذه بحيث تكون قابلة للوصول من حاوية git-bridge.

إعداد حاوية Server Pro:

* اضبط `GIT_BRIDGE_ENABLED` إلى `'true'`
* اضبط `GIT_BRIDGE_HOST` إلى `<اسم حاوية git-bridge>` مثلًا `git-bridge`
* اضبط `GIT_BRIDGE_PORT` إلى `8000`
* اضبط `V1_HISTORY_URL` إلى `http://<اسم حاوية Server Pro الشقيقة>:3100/api`.

  ملاحظة: هذا ضروري فقط على الحاوية الشقيقة لحاوية git-bridge. يمكن للمثيلات الأخرى استخدام عنوان URL لـ localhost، وهو الافتراضي.

إعداد حاوية git-bridge:

* اضبط `GIT_BRIDGE_API_BASE_URL` إلى `http://<اسم حاوية Server Pro الشقيقة>/api/v0`، على سبيل المثال `http://server-pro-ha-1/api/v0`
* اضبط `GIT_BRIDGE_OAUTH2_SERVER` إلى `http://<اسم حاوية Server Pro الشقيقة>`، على سبيل المثال `http://server-pro-ha-1`
* اضبط `GIT_BRIDGE_POSTBACK_BASE_URL` إلى `http://<اسم حاوية git-bridge>:8000`، على سبيل المثال `http://git-bridge:8000`
* اضبط `GIT_BRIDGE_ROOT_DIR` إلى قرص بيانات git-bridge المثبت كـ bind-mounted، مثلًا `/data/git-bridge`

<details>

<summary>مثال على إعداد docker-compose.yml</summary>

يوضح الإعداد التالي إعدادًا مستقلًا. لكي يعمل العرض التوضيحي، تحتاج إلى توفير مفتاح/شهادة SSL صالحين وضبط `OVERLEAF_SITE_URL` (`SHARELATEX_SITE_URL` للإصدارات `4.x` والأقدم). بالنسبة إلى إعداد فعلي، يجب استبدال الأسرار الوهمية بأسرار حقيقية كما هو مذكور داخل النص. ولإعداد فعلي، تحتاج إلى نقل الحاويات الفردية إلى عقد مخصصة وضبط عناوين IP وفقًا لإعداد الشبكة المحلي لديك.

```yaml
version: '2.2'

# إعداد التوسّع الأفقي الفعلي: اختر شبكتك الخاصة واستبدل عناوين IP في الإعداد.
networks:
    default:
        ipam:
            config:
                # هذه الشبكة الفرعية جزء من شبكة فرعية محجوزة تُستخدم لأغراض القياس المعياري
                # https://tools.ietf.org/html/rfc2544
                # الشبكة الفرعية الكاملة هي 198.18.0.0/15
                # استخدم 198.18.0.0/24 لموازن التحميل وقواعد البيانات
                # استخدم 198.18.1.0/24 لـ server-pro
                # استخدم 198.18.0.128/25 للحاوية المؤقتة
                - gateway: 198.18.0.1
                  ip_range: 198.18.0.128/25
                  subnet: 198.18.0.0/23

services:
    # إعداد التوسّع الأفقي الفعلي: شغّل haproxy خارج Docker على مضيف منفصل.
    lb:
        image: haproxy:2.6
        container_name: lb
        user: root
        logging:
            driver: local
            options:
                max-size: 10g
                max-file: '100'
        الأحجام:
            - ./haproxy.conf:/usr/local/etc/haproxy/haproxy.cfg
            # cat certificate.pem key.pem > ssl-key-and-certificate-bundle.pem
            - /path/to/ssl-key-and-certificate-bundle.pem:/etc/ssl/certs/ssl-key-and-certificate-bundle.pem
        # بديل لـ "ports": استخدم شبكة المضيف لتجنّب تكلفة docker-proxy
        network_mode: host

        # بديل لـ "network_mode: host": استخدم docker-proxy لعزل الشبكة
        # ports:
        #     - "80:80"
        #     - "443:443"
        # networks:
        #     default:
        #         ipv4_address: 198.18.0.2

        # إعداد التوسّع الأفقي الفعلي: احذف هذه لأنها تعمل على مضيفين آخرين.
        depends_on:
            server-pro-ha-1:
                condition: service_started
            server-pro-ha-2:
                condition: service_started
            server-pro-ha-3:
                condition: service_started

    # إعداد التوسّع الأفقي الفعلي: شغّل هذه الحاوية بجانب server-pro-ha-1.
    # لـ Server Pro 4.0 وما بعده.
    git-bridge:
        restart: always
        # يجب أن يطابق الوسم وسم الحاوية `server-pro-ha-1`.
        image: quay.io/sharelatex/git-bridge:4.0.1
        الأحجام:
            # إعداد التوسّع الأفقي الفعلي: أشر /data/git-bridge إلى قرص SSD محلي مخصص.
            - ~/git_bridge_data:/data/git-bridge
        container_name: git-bridge
        البيئة:
            GIT_BRIDGE_API_BASE_URL: "http://server-pro-ha-1/api/v0"
            GIT_BRIDGE_OAUTH2_SERVER: "http://server-pro-ha-1"
            GIT_BRIDGE_POSTBACK_BASE_URL: "http://198.18.0.6:8000"
            GIT_BRIDGE_ROOT_DIR: "/data/git-bridge"
        user: root
        command: ["/server-pro-start.sh"]

        # إعداد التوسّع الأفقي الفعلي: شغّل على المضيف 198.18.0.6 واعرض المنفذ
        # ports:
        #     - "8000:8000"
        networks:
            default:
                ipv4_address: 198.18.0.6

    # إعداد التوسّع الأفقي الفعلي: شغّل هذه الحاوية على مضيف منفصل.
    server-pro-ha-1: &server-pro-ha-config
        restart: always
        image: quay.io/sharelatex/sharelatex-pro:4.0.1
        container_name: server-pro-ha-1
        hostname: server-pro-ha-1
        depends_on:
            # إعداد التوسّع الأفقي الفعلي: احتفظ بهذا الإدخال.
            git-bridge:
                condition: service_started

            # إعداد التوسّع الأفقي الفعلي: احذف الإدخالات أدناه لأنها تعمل على مضيفين آخرين.
            mongo:
                condition: service_healthy
            redis:
                condition: service_started
            minio:
                condition: service_started
            mongo_replica_set_setup:
                condition: service_completed_successfully
            minio_setup:
                condition: service_completed_successfully
        stop_grace_period: 60s
        الأحجام:
            - /tmp/scratch-disk1:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment: &server-pro-ha-environment
            # إعداد التوسّع الأفقي الفعلي: قدّم نطاقك/اسم تطبيقك الخاص.
            OVERLEAF_SITE_URL: 'https://overleaf.example.com'
            OVERLEAF_APP_NAME: Server Pro Horizontal Scaling Demo

            OVERLEAF_MONGO_URL: mongodb://198.18.0.3/sharelatex
            OVERLEAF_REDIS_HOST: 198.18.0.4
            REDIS_HOST: 198.18.0.4

            ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file'
            EMAIL_CONFIRMATION_DISABLED: 'true'

            SANDBOXED_COMPILES: 'true'
            SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true'
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk1/data/compiles'

            # S3
            # إعداد التوسّع الأفقي الفعلي: اختر بيانات اعتماد آمنة.
            OVERLEAF_FILESTORE_BACKEND: s3
            OVERLEAF_FILESTORE_USER_FILES_BUCKET_NAME: overleaf-user-files
            OVERLEAF_FILESTORE_TEMPLATE_FILES_BUCKET_NAME: overleaf-template-files
            OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID: OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
            OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY: OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY
            OVERLEAF_FILESTORE_S3_ENDPOINT: http://198.18.0.5:9000
            OVERLEAF_FILESTORE_S3_PATH_STYLE: 'true'
            OVERLEAF_FILESTORE_S3_REGION: ''

            OVERLEAF_HISTORY_BACKEND: "s3"
            OVERLEAF_HISTORY_PROJECT_BLOBS_BUCKET: "overleaf-project-blobs"
            OVERLEAF_HISTORY_CHUNKS_BUCKET: "overleaf-chunks"
            OVERLEAF_HISTORY_S3_ACCESS_KEY_ID: "OVERLEAF_HISTORY_S3_ACCESS_KEY_ID"
            OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY: "OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY"
            OVERLEAF_HISTORY_S3_ENDPOINT: http://198.18.0.5:9000
            OVERLEAF_HISTORY_S3_PATH_STYLE: 'true'
            OVERLEAF_HISTORY_S3_REGION: ''
            # /S3

            # git-bridge
            GIT_BRIDGE_ENABLED: 'true'
            GIT_BRIDGE_HOST: 198.18.0.6
            GIT_BRIDGE_PORT: 8000
            # مطلوب فقط على النسخة الشقيقة من git-bridge
            V1_HISTORY_URL: "http://server-pro-ha-1:3100/api"
            # /git-bridge

            # التوسّع الأفقي
            # إعداد التوسّع الأفقي الفعلي: اختر بيانات اعتماد آمنة.
            WEB_API_PASSWORD: WEB_API_PASSWORD
            STAGING_PASSWORD: V1_HISTORY_PASSWORD
            V1_HISTORY_PASSWORD: V1_HISTORY_PASSWORD
            CRYPTO_RANDOM: CRYPTO_RANDOM
            OT_JWT_AUTH_KEY: OT_JWT_AUTH_KEY
            OVERLEAF_BEHIND_PROXY: 'true'
            # الإعداد الفعلي للتوسّع الأفقي: عناوين IP لموازنات التحميل
            TRUSTED_PROXY_IPS: 198.18.0.1,198.18.0.2
            # /التوسّع الأفقي

        # الإعداد الفعلي للتوسّع الأفقي: شغّل على المضيف 198.18.1.1 واعرض المنافذ
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.1

    # إعداد التوسّع الأفقي الفعلي: شغّل هذه الحاوية على مضيف منفصل.
    server-pro-ha-2:
        <<: *server-pro-ha-config
        hostname: server-pro-ha-2
        container_name: server-pro-ha-2
        الأحجام:
            - /tmp/scratch-disk2:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        البيئة:
            <<: *server-pro-ha-environment
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk2/data/compiles'
            V1_HISTORY_URL: "http://localhost:3100/api"

        # الإعداد الفعلي للتوسّع الأفقي: شغّل على المضيف 198.18.1.2 واعرض المنافذ
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.2

    # إعداد التوسّع الأفقي الفعلي: شغّل هذه الحاوية على مضيف منفصل.
    server-pro-ha-3:
        <<: *server-pro-ha-config
        hostname: server-pro-ha-3
        container_name: server-pro-ha-3
        الأحجام:
            - /tmp/scratch-disk3:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        البيئة:
            <<: *server-pro-ha-environment
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk3/data/compiles'
            V1_HISTORY_URL: "http://localhost:3100/api"

        # الإعداد الفعلي للتوسّع الأفقي: شغّل على المضيف 198.18.1.3 واعرض المنافذ
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.3

    # إعداد التوسّع الأفقي الفعلي: شغّل هذه الحاوية على مضيف منفصل.
    minio:
        image: minio/minio:RELEASE.2023-05-18T00-05-36Z
        container_name: minio
        command: server /data
        الأحجام:
            # الإعداد الفعلي للتوسّع الأفقي: شغّل minio مع عدة أقراص، راجع وثائق minio.
            - ~/minio_data:/data
        البيئة:
            # إعداد التوسّع الأفقي الفعلي: اختر بيانات اعتماد آمنة.
            MINIO_ROOT_USER: MINIO_ROOT_USER
            MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD

        # الإعداد الفعلي للتوسّع الأفقي: شغّل على المضيف 198.18.0.5 واعرض المنفذ
        # ports:
        #     - "9000:9000"
        networks:
            default:
                ipv4_address: 198.18.0.5

    # الإعداد الفعلي للتوسّع الأفقي: شغّل هذا الإعداد مرة واحدة على مضيف منفصل.
    minio_setup:
        depends_on:
            - minio
        image: minio/mc:RELEASE.2023-05-18T16-59-00Z
        entrypoint: sh
        الأمر:
            - '-c'
            # إعداد التوسّع الأفقي الفعلي: اختر بيانات اعتماد آمنة.
            - |
                mc alias set s3 http://198.18.0.5:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
                || sleep 10 && \
                mc alias set s3 http://198.18.0.5:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
                || sleep 10 && \
                mc alias set s3 http://198.18.0.5:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
                || sleep 10 && \
                mc alias set s3 http://198.18.0.5:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD

                mc mb --ignore-existing s3/overleaf-user-files
                mc mb --ignore-existing s3/overleaf-template-files
                mc admin user add s3 \\
                  OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID \\
                  OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY

                mc mb --ignore-existing s3/overleaf-project-blobs
                mc mb --ignore-existing s3/overleaf-chunks
                mc admin user add s3 \\
                  OVERLEAF_HISTORY_S3_ACCESS_KEY_ID \\
                  OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY

                echo '
                  {
                    "Version": "2012-10-17",
                    "Statement": [
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:ListBucket"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-user-files"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:PutObject",
                          "s3:GetObject",
                          "s3:DeleteObject"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-user-files/*"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:ListBucket"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-template-files"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:PutObject",
                          "s3:GetObject",
                          "s3:DeleteObject"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-template-files/*"
                      }
                    ]
                  }' > policy-filestore.json

                echo '
                  {
                    "Version": "2012-10-17",
                    "Statement": [
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:ListBucket"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-project-blobs"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:PutObject",
                          "s3:GetObject",
                          "s3:DeleteObject"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-project-blobs/*"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:ListBucket"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-chunks"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:PutObject",
                          "s3:GetObject",
                          "s3:DeleteObject"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-chunks/*"
                      }
                    ]
                  }' > policy-history.json

                # ضع محتويات السياسة من القسم السابق في policy-filestore.json
                # تذكير: استبدل أسماء الحِزم وفقًا لذلك.
                mc admin policy create s3 overleaf-filestore policy-filestore.json
                mc admin policy attach s3 overleaf-filestore \\
                  --user=OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID || true

                mc admin policy create s3 overleaf-history policy-history.json
                mc admin policy attach s3 overleaf-history \\
                  --user=OVERLEAF_HISTORY_S3_ACCESS_KEY_ID || true

    # إعداد التوسّع الأفقي الفعلي: شغّل هذه الحاوية على مضيف منفصل.
    mongo:
        restart: always
        image: mongo:4.4
        container_name: mongo
        command: "--replSet overleaf"
        expose:
            - 27017
        الأحجام:
            - ~/mongo_data:/data/db
        healthcheck:
            test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
            interval: 10s
            timeout: 10s
            retries: 5

        # الإعداد الفعلي للتوسّع الأفقي: شغّل على المضيف 198.18.0.3 واعرض المنفذ
        # ports:
        #     - "27017:27017"
        networks:
            default:
                ipv4_address: 198.18.0.3

    mongo_replica_set_setup:
        image: mongo:4.4
        entrypoint: sh
        depends_on:
            mongo:
                condition: service_healthy
        الأمر:
            - '-c'
            - |
                mongo 198.18.0.3 --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"198.18.0.3:27017\" } ] })"

    # إعداد التوسّع الأفقي الفعلي: شغّل هذه الحاوية على مضيف منفصل.
    redis:
        restart: always
        image: redis:6.2
        container_name: redis
        expose:
            - 6379
        الأحجام:
            - ~/redis_data:/data

        # الإعداد الفعلي للتوسّع الأفقي: شغّل على المضيف 198.18.0.4 واعرض المنفذ
        # ports:
        #     - "6379:6379"
        networks:
            default:
                ipv4_address: 198.18.0.4
```

</details>

#### العتاد

نوصي باستخدام مواصفات العتاد نفسها لجميع مثيلات Server Pro التي تشارك في التوسّع الأفقي.

التوصيات العامة بشأن [مواصفات العتاد](/on-premises/ar/albda/requirements/hardware-requirements.md) تنطبق على مثيلات Server Pro.

#### ترقية Server Pro

كجزء من عملية الترقية، يقوم Server Pro تلقائيًا بتشغيل ترحيلات قاعدة البيانات. هذه الترحيلات **لا** مصممة للتشغيل من عدة مثيلات بالتوازي.

يجب أن تنتهي الترحيلات قبل بدء تطبيق الويب الفعلي. يمكنك إما التحقق من السجلات بحثًا عن إدخال `انتهت الترحيلات` أو الانتظار حتى يبدأ التطبيق في قبول الحركة.

تبدو عملية الترقية هكذا:

1. جدولة نافذة صيانة
2. إيقاف جميع مثيلات Server Pro
3. خذ نسخة احتياطية متسقة كما هو موضح في [الوثائق](/on-premises/ar/alsyanh/data-and-backups.md#performing-a-consistent-backup)
4. ابدأ مثيلًا واحدًا من Server Pro بالإصدار الجديد
5. تحقق من أن المثيل الجديد يعمل كما هو متوقع
6. شغّل المثيلات الأخرى بالإصدار الجديد


---

# 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/alsyanh/horizontal-scaling.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.
