> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 3. نشر MongoDB وRedis

> شغّل MongoDB كمجموعة نسخ متماثلة (replica set) وRedis مع الاستمرارية، أو وجّه إلى الخدمات الخاصة بك.

يحتاج Ayakaleaf Pro إلى ما يلي:

* **MongoDB 8** على هيئة **مجموعة نسخ متماثلة (replica set)** (لأنه يستخدم المعاملات). تصمد ثلاثة أعضاء موزّعة على ثلاث عقد أمام فقدان عقدة واحدة؛ ويعمل أيضًا عضو واحد.
* **Redis 7**، خادم واحد مع استمرارية AOF. يحتفظ Redis بالتعديلات التي لم تُكتب بعد إلى MongoDB، والجلسات، والرسائل بين خدمات Overleaf. يتصل Overleaf بخادم Redis واحد: لا يُدعم Sentinel ولا Redis Cluster.

> [!NOTE]
>
> يمكنك استخدام خدمات مُدارة بدلًا من ذلك، مثل MongoDB Atlas أو Redis الذي توفّره منصتك السحابية. تخطَّ هذه الصفحة واضبط `OVERLEAF_MONGO_URL` و`OVERLEAF_REDIS_HOST` عليها في [الخطوة 4](https://ayakaleaf-pro.mintlify.site/ar/on-premises/installation/using-kubernetes/4.-personalizing-your-instance.md).

**1. MongoDB**

```yaml title="10-mongo.yaml" wrap theme={null}
apiVersion: v1
kind: Service
metadata:
  name: mongo
  namespace: overleaf
spec:
  clusterIP: None                 # headless: gives mongo-0.mongo, mongo-1.mongo, ...
  publishNotReadyAddresses: true  # members must resolve each other before the set is initiated
  selector:
    app: mongo
  ports:
    - name: mongo
      port: 27017
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongo
  namespace: overleaf
spec:
  serviceName: mongo
  replicas: 3
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  app: mongo
              topologyKey: kubernetes.io/hostname
      containers:
        - name: mongo
          image: mongo:8.0
          args:
            - --replSet=overleaf
            - --bind_ip_all
            - --wiredTigerCacheSizeGB=0.25   # default is 50% of (RAM - 1 GB); size it for your nodes
          # env:
          #   - name: GLIBC_TUNABLES        # only on kernel 6.19+ (SERVER-121912)
          #     value: glibc.pthread.rseq=1
          ports:
            - containerPort: 27017
          readinessProbe:
            tcpSocket:
              port: 27017
          resources:
            requests:
              cpu: 100m
              memory: 384Mi
            limits:
              memory: 768Mi
          volumeMounts:
            - name: data
              mountPath: /data/db
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ReadWriteOnce]
        resources:
          requests:
            storage: 5Gi
---
# Initiates the replica set once. Safe to re-run: it does nothing when the set exists.
apiVersion: batch/v1
kind: Job
metadata:
  name: mongo-init-replica-set
  namespace: overleaf
spec:
  backoffLimit: 20
  template:
    spec:
      restartPolicy: OnFailure
      containers:
        - name: init
          image: mongo:8.0
          command:
            - mongosh
            - --quiet
            - --host=mongo-0.mongo
            - --eval
            - |
              try {
                rs.status()
                print('replica set already initiated')
              } catch (e) {
                rs.initiate({
                  _id: 'overleaf',
                  members: [
                    { _id: 0, host: 'mongo-0.mongo.overleaf.svc.cluster.local:27017' },
                    { _id: 1, host: 'mongo-1.mongo.overleaf.svc.cluster.local:27017' },
                    { _id: 2, host: 'mongo-2.mongo.overleaf.svc.cluster.local:27017' },
                  ],
                })
              }
```

```bash theme={null}
kubectl apply -f 10-mongo.yaml
kubectl -n overleaf rollout status statefulset/mongo
kubectl -n overleaf wait --for=condition=complete job/mongo-init-replica-set --timeout=5m
kubectl -n overleaf exec mongo-0 -- mongosh --quiet --eval 'rs.status().members.map(m => m.name + " " + m.stateStr)'
```

بعد بضع ثوانٍ، يجب أن يكون أحد الأعضاء `PRIMARY` والآخرون `SECONDARY`. يعيد الـ Job المحاولة إلى أن تستجيب كل الأعضاء، لذا من الطبيعي أن تفشل بعض الـ pods الخاصة بالـ Job.

* تحتاج الـ Service من النوع headless إلى `publishNotReadyAddresses: true`: إذ يجب أن تعثر الأعضاء على بعضها بالاسم قبل أن توجد مجموعة النسخ المتماثلة.
* تُضاف الأعضاء بأسمائها الثابتة (`mongo-0.mongo.overleaf.svc.cluster.local`)، وليس أبدًا بعناوين IP الخاصة بالـ pods، والتي تتغيّر عند كل إعادة تشغيل.
* لعضو واحد، اضبط `replicas: 1` وأبقِ `mongo-0` فقط في الـ Job.

**2. Redis**

```yaml title="20-redis.yaml" wrap theme={null}
apiVersion: v1
kind: Service
metadata:
  name: redis
  namespace: overleaf
spec:
  selector:
    app: redis
  ports:
    - name: redis
      port: 6379
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
  namespace: overleaf
spec:
  serviceName: redis
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: redis:7.4
          args: [--appendonly, "yes"]
          ports:
            - containerPort: 6379
          readinessProbe:
            tcpSocket:
              port: 6379
          resources:
            requests:
              cpu: 50m
              memory: 128Mi
            limits:
              memory: 512Mi
          volumeMounts:
            - name: data
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: [ReadWriteOnce]
        resources:
          requests:
            storage: 2Gi
```

```bash theme={null}
kubectl apply -f 20-redis.yaml
kubectl -n overleaf rollout status statefulset/redis
```

### أسئلة وأجوبة

> [accordion] يتعطّل MongoDB 8 عند بدء التشغيل على نواة حديثة. لماذا؟
>
> **الإجابة:** يفشل MongoDB 8 على نواة Linux بالإصدار 6.19 وما بعده ([SERVER-121912](https://jira.mongodb.org/browse/SERVER-121912)). أزل علامة التعليق عن متغيّر البيئة `GLIBC_TUNABLES` في `10-mongo.yaml`.

> [accordion] ما مقدار الذاكرة الذي يحتاج إليه MongoDB؟
>
> **الإجابة:** افتراضيًا يستخدم MongoDB نصف ذاكرة العقدة ناقص 1 GB لذاكرته المؤقتة، وهو يرى ذاكرة العقدة، وليس حدّ الذاكرة الخاص بالـ pod. اضبط `--wiredTigerCacheSizeGB` بما يناسب العقد لديك؛ فقد أبقت القيمة `0.25` كل عضو عند نحو 200 إلى 260 MiB على عقد الاختبار لدينا ذات الـ 4 GB.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.