> 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/el/syntirisi/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 για συνολικά 1.000 χρήστες έχει στηθεί με επιτυχία χρησιμοποιώντας έναν μόνο διακομιστή με δύο επεξεργαστές 4 πυρήνων και 32GB μνήμης συστήματος. Δείτε την [απαιτήσεις υλικού](/on-premises/el/ksekinontas/requirements/hardware-requirements.md) τεκμηρίωση για συστάσεις.

Μια ανάπτυξη του Server Pro με οριζόντια κλιμάκωση περιλαμβάνει ένα σύνολο εξωτερικών στοιχείων, όπως έναν Load Balancer και ένα backend αποθήκευσης συμβατό με 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/el/rythmisi/overleaf-toolkit/s3.md).
  * Για οριζόντια κλιμάκωση, **μόνο** υποστηρίζουμε συστήματα αποθήκευσης δεδομένων συμβατά με S3.<br>

  **Σημαντικό:** Το NFS/Amazon EFS/Amazon EBS **μην** υποστηρίζονται για οριζόντια κλιμάκωση. Δείτε την ενότητα [αποθήκευση υλικού](/on-premises/el/ksekinontas/requirements/hardware-requirements.md#storage) απαιτήσεων για την κλιμάκωση της αποθήκευσης στο Server Pro για περισσότερες λεπτομέρειες.
* **Εφήμερα αρχεία**
  * Οι μεταγλωττίσεις LaTeX χρειάζεται να εκτελούνται σε γρήγορους, τοπικούς δίσκους για βέλτιστη απόδοση. Το αποτέλεσμα της μεταγλώττισης δεν χρειάζεται να αποθηκεύεται μόνιμα ή να δημιουργείται αντίγραφο ασφαλείας.
  * Η προσωρινή αποθήκευση νέων μεταφορτώσεων αρχείων και η δημιουργία αρχείων zip έργου ωφελούνται επίσης από τη χρήση τοπικού δίσκου.

{% hint style="danger" %}
Σας συμβουλεύουμε έντονα να χρησιμοποιείτε τοπικό δίσκο. Η χρήση οποιουδήποτε είδους δικτυωμένου δίσκου (όπως NFS ή EBS) μπορεί να οδηγήσει σε απροσδόκητα σφάλματα μεταγλώττισης και άλλα προβλήματα απόδοσης.
{% endhint %}

#### **Git-bridge**

{% hint style="info" %}
Το Git-bridge είναι διαθέσιμο στο Server Pro από την έκδοση 4.0.1.
{% endhint %}

Τα αποθετήρια git αποθηκεύονται τοπικά στον δίσκο. Δεν υπάρχουν διαθέσιμες επιλογές αναπαραγωγής. Το Git-bridge θα πρέπει να εκτελείται ως **singleton**. Για βέλτιστη απόδοση, συνιστούμε τη χρήση τοπικού δίσκου για τα δεδομένα του git-bridge. Ο δίσκος δεδομένων του git-bridge θα πρέπει να δημιουργεί τακτικά αντίγραφα ασφαλείας.

Για την αποθήκευση δεδομένων με οριζόντια κλιμάκωση, χρειάζεστε:

* μια κεντρική εγκατάσταση MongoDB που είναι προσβάσιμη από όλες τις εγκαταστάσεις του Server Pro
* μια κεντρική εγκατάσταση Redis που είναι προσβάσιμη από όλες τις εγκαταστάσεις του Server Pro
* ένα κεντρικό backend αποθήκευσης συμβατό με S3 για τα αρχεία έργων και ιστορικού
* έναν τοπικό δίσκο σε κάθε εγκατάσταση για εφήμερα αρχεία
* έναν τοπικό δίσκο στην εγκατάσταση που φιλοξενεί το κοντέινερ git-bridge για τα δεδομένα του git-bridge

#### Απαιτήσεις load balancer

* **Επίμονη δρομολόγηση**, π.χ. χρησιμοποιώντας cookie

  Αυτή η απαίτηση προκύπτει από αυτά τα στοιχεία:

  * Η δυνατότητα επεξεργασίας σε πραγματικό χρόνο στο Server Pro χρησιμοποιεί WebSockets με εναλλακτική λύση το XHR polling. Κάθε συνεδρία επεξεργασίας έχει τοπική κατάσταση στην πλευρά του διακομιστή και τα αιτήματα μιας δεδομένης συνεδρίας επεξεργασίας πρέπει πάντα να δρομολογούνται στην ίδια εγκατάσταση Server Pro. Η λειτουργία συνεργασίας χρησιμοποιεί Redis [Pub/Sub](https://redis.io/docs/latest/develop/interact/pubsub/) για την κοινή χρήση ενημερώσεων μεταξύ πολλών εγκαταστάσεων Server Pro.
  * Η μεταγλώττιση LaTeX διατηρεί το αποτέλεσμα και την cache μεταγλώττισης τοπικά για βέλτιστη απόδοση. Μόλις σταλεί ένα αίτημα μεταγλώττισης σε μία εγκατάσταση Server Pro, τα ακόλουθα αιτήματα λήψης PDF/log πρέπει να δρομολογούνται στην ίδια εγκατάσταση Server Pro.
* **Μεγάλα χρονικά όρια αιτημάτων** για την υποστήριξη της μεταγλώττισης μεγάλων εγγράφων LaTeX
* **Υποστήριξη WebSocket** για βέλτιστη απόδοση
* **μέγεθος payload POST 50MB**
* **Χρονικό όριο keep-alive** πρέπει να είναι μικρότερο από το χρονικό όριο keep-alive του Server Pro

  Το χρονικό όριο keep-alive στο Server Pro μπορεί να ρυθμιστεί χρησιμοποιώντας τη μεταβλητή περιβάλλοντος `NGINX_KEEPALIVE_TIMEOUT`. Η προεπιλεγμένη τιμή είναι 65s.

  Με την προεπιλογή, ένα χρονικό όριο keep-alive 60s στον load balancer λειτουργεί.

  Με `NGINX_KEEPALIVE_TIMEOUT=120`, ο load balancer θα μπορούσε να επιλέξει 115s.
* **IP πελατών**

  Ορίστε την κεφαλίδα αιτήματος `X-Forwarded-For` στο IP του πελάτη.
* Όταν **τερματισμός SSL**

  Ο load balancer χρειάζεται να προσθέσει την κεφαλίδα αιτήματος `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 connect, όχι για απαντήσεις HTTP status 500
  retries                 3

  # Συνεδρία διατήρησης για 24 ώρες αδράνειας -- το αποτέλεσμα της μεταγλώττισης διαγράφεται μετά από 24 ώρες
  cookie                  server-pro-ha insert maxidle 24h

  # Προσπάθεια σύνδεσης σε οποιοδήποτε backend για 1 λεπτό, έπειτα επιστροφή 503
  timeout queue           1m
  # Δώστε στις εγκαταστάσεις Server Pro 15s για εκκίνηση
  timeout connect         15s

  # Απόρριψη αιτημάτων από πολύ αργούς πελάτες (επιτρέψτε 1 λεπτό αδράνειας κατά την ανάγνωση ενός αιτήματος)
  timeout client          1m

  # Επιτρέψτε αργές μεταγλωττίσεις -- το σκληρά κωδικοποιημένο όριο στο clsi είναι 10 λεπτά
  timeout server          10m

  # Αποσύνδεση του επεξεργαστή μετά από 23 ώρες -- 1 ώρα μπροστά από την τελευταία τους χρήση χθες
  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` (για cookie συνεδρίας)
* `OT_JWT_AUTH_KEY` (έλεγχος ταυτότητας ιστορικού)

Όλα αυτά τα μυστικά πρέπει να ρυθμιστούν με τη δική τους μοναδική τιμή και να κοινοποιούνται μεταξύ των εγκαταστάσεων.

Όταν δεν έχουν ρυθμιστεί και τα αιτήματα των χρηστών δρομολογούνται σε διαφορετικές εγκαταστάσεις Server Pro, το αίτημά τους θα αποτυγχάνει στους ελέγχους ταυτοποίησης και είτε θα ανακατευθύνονται συχνά στη σελίδα σύνδεσης είτε οι ενέργειές τους στο UI θα αποτυγχάνουν με απρόβλεπτους τρόπους.

Όταν δεν έχουν ρυθμιστεί, το Server Pro χρησιμοποιεί μια νέα τυχαία τιμή για κάθε μυστικό βασισμένη σε 32 τυχαία bytes από `/dev/urandom` (256 τυχαία bits).

{% 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/el/rythmisi/overleaf-toolkit/s3.md) για λεπτομέρειες.

**Εφήμερα αρχεία**

Η προεπιλεγμένη προσάρτηση ενός τοπικού SSD στο `/var/lib/overleaf` (`/var/lib/sharelatex` για εκδόσεις `4.x` και παλαιότερες) θα είναι επαρκής. Φροντίστε να δείξετε το `SANDBOXED_COMPILES_HOST_DIR` στο σημείο προσάρτησης στον host.

{% hint style="danger" %}
Σας συμβουλεύουμε έντονα να χρησιμοποιήσετε τοπικό δίσκο. Η χρήση οποιουδήποτε είδους δικτυωμένου δίσκου (όπως NFS ή EBS) μπορεί να οδηγήσει σε απρόσμενα σφάλματα μεταγλώττισης και άλλα προβλήματα απόδοσης.
{% endhint %}

**Ρύθμιση proxy**

* Ορίστε `OVERLEAF_BEHIND_PROXY=true` (`SHARELATEX_BEHIND_PROXY` για εκδόσεις `4.x` και παλαιότερες) για ακριβείς IP πελατών.
* Ορίστε `TRUSTED_PROXY_IPS` στην IP του load balancer (Μπορούν να καθοριστούν πολλαπλά 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 δίνει URLs λήψης για την υπηρεσία ιστορικού στο git-bridge. Πρέπει να ρυθμίσουμε αυτά τα URLs ιστορικού ώστε να είναι προσβάσιμα από το κοντέινερ 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` στον προσαρτημένο με bind δίσκο δεδομένων του git-bridge, π.χ. `/data/git-bridge`

<details>

<summary>Δείγμα ρύθμισης docker-compose.yml</summary>

Η ακόλουθη ρύθμιση δείχνει μια αυτοτελή εγκατάσταση. Για να λειτουργήσει το demo, πρέπει να παρέχετε έγκυρο κλειδί/πιστοποιητικό SSL και να προσαρμόσετε το `OVERLEAF_SITE_URL` (`SHARELATEX_SITE_URL` για εκδόσεις `4.x` και παλαιότερες). Για μια πραγματική εγκατάσταση, πρέπει να αντικαταστήσετε τα δοκιμαστικά μυστικά με πραγματικά μυστικά, όπως σημειώνεται εντός. Για μια πραγματική εγκατάσταση, πρέπει να μεταφέρετε τα επιμέρους κοντέινερ σε αφιερωμένους κόμβους και να προσαρμόσετε τις διευθύνσεις IP στη δική σας ρύθμιση δικτύου.

```yaml
version: '2.2'

# Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: επιλέξτε το δικό σας δίκτυο και αντικαταστήστε τις IP στη ρύθμιση.
networks:
    default:
        ipam:
            config:
                # Αυτό το subnet αποτελεί μέρος ενός δεσμευμένου subnet που χρησιμοποιείται για benchmarking
                # https://tools.ietf.org/html/rfc2544
                # Το πλήρες subnet είναι 198.18.0.0/15
                # Χρησιμοποιήστε 198.18.0.0/24 για lb και dbs
                # Χρησιμοποιήστε 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 σε ξεχωριστό host.
    lb:
        image: haproxy:2.6
        container_name: lb
        user: root
        logging:
            driver: local
            options:
                max-size: 10g
                max-file: '100'
        volumes:
            - ./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": χρησιμοποιήστε το host network για να αποφύγετε το overhead του docker-proxy
        network_mode: host

        # Εναλλακτική του "network_mode: host": χρησιμοποιήστε docker-proxy για απομόνωση δικτύου
        # ports:
        #     - "80:80"
        #     - "443:443"
        # networks:
        #     default:
        #         ipv4_address: 198.18.0.2

        # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: αφαιρέστε αυτά καθώς εκτελούνται σε άλλους hosts.
        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
        # Το tag πρέπει να ταιριάζει με το tag του κοντέινερ `server-pro-ha-1`.
        image: quay.io/sharelatex/git-bridge:4.0.1
        volumes:
            # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: δείξτε το /data/git-bridge σε ένα αφιερωμένο τοπικό ssd.
            - ~/git_bridge_data:/data/git-bridge
        container_name: git-bridge
        environment:
            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"]

        # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε σε host 198.18.0.6 και εκθέστε την θύρα
        # ports:
        #     - "8000:8000"
        networks:
            default:
                ipv4_address: 198.18.0.6

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτό το κοντέινερ σε ξεχωριστό host.
    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

            # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: αφαιρέστε τις παρακάτω καθώς εκτελούνται σε άλλους hosts.
            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
        volumes:
            - /tmp/scratch-disk1:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment: &server-pro-ha-environment
            # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: δώστε το δικό σας domain/app name.
            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
            # Απαιτείται μόνο στο αδελφό instance του 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 των load balancers
            TRUSTED_PROXY_IPS: 198.18.0.1,198.18.0.2
            # /Οριζόντια κλιμάκωση

        # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε στον host 198.18.1.1 και εκθέστε τις θύρες
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.1

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτό το κοντέινερ σε ξεχωριστό host.
    server-pro-ha-2:
        <<: *server-pro-ha-config
        hostname: server-pro-ha-2
        container_name: server-pro-ha-2
        volumes:
            - /tmp/scratch-disk2:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            <<: *server-pro-ha-environment
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk2/data/compiles'
            V1_HISTORY_URL: "http://localhost:3100/api"

        # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε στον host 198.18.1.2 και εκθέστε τις θύρες
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.2

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτό το κοντέινερ σε ξεχωριστό host.
    server-pro-ha-3:
        <<: *server-pro-ha-config
        hostname: server-pro-ha-3
        container_name: server-pro-ha-3
        volumes:
            - /tmp/scratch-disk3:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            <<: *server-pro-ha-environment
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk3/data/compiles'
            V1_HISTORY_URL: "http://localhost:3100/api"

        # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε στον host 198.18.1.3 και εκθέστε τις θύρες
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.3

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτό το κοντέινερ σε ξεχωριστό host.
    minio:
        image: minio/minio:RELEASE.2023-05-18T00-05-36Z
        container_name: minio
        command: server /data
        volumes:
            # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε το minio με πολλαπλούς δίσκους, δείτε τα docs του minio.
            - ~/minio_data:/data
        environment:
            # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: επιλέξτε ασφαλή διαπιστευτήρια.
            MINIO_ROOT_USER: MINIO_ROOT_USER
            MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD

        # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε στον host 198.18.0.5 και εκθέστε τη θύρα
        # ports:
        #     - "9000:9000"
        networks:
            default:
                ipv4_address: 198.18.0.5

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτή τη ρύθμιση μία φορά σε ξεχωριστό host.
    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
                # Υπενθύμιση: Αντικαταστήστε ανάλογα τα ονόματα των buckets.
                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

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτό το κοντέινερ σε ξεχωριστό host.
    mongo:
        restart: always
        image: mongo:4.4
        container_name: mongo
        command: "--replSet overleaf"
        expose:
            - 27017
        volumes:
            - ~/mongo_data:/data/db
        healthcheck:
            test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
            interval: 10s
            timeout: 10s
            retries: 5

        # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε στον host 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\" } ] })"

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτό το κοντέινερ σε ξεχωριστό host.
    redis:
        restart: always
        image: redis:6.2
        container_name: redis
        expose:
            - 6379
        volumes:
            - ~/redis_data:/data

        # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε στον host 198.18.0.4 και εκθέστε τη θύρα
        # ports:
        #     - "6379:6379"
        networks:
            default:
                ipv4_address: 198.18.0.4
```

</details>

#### Υλικό

Συνιστούμε να χρησιμοποιήσετε τις ίδιες προδιαγραφές υλικού για όλα τα instances του Server Pro που συμμετέχουν στην οριζόντια κλιμάκωση.

Οι γενικές συστάσεις για [προδιαγραφές υλικού](/on-premises/el/ksekinontas/requirements/hardware-requirements.md) για τα instances του Server Pro ισχύουν.

#### Αναβάθμιση του Server Pro

Ως μέρος της διαδικασίας αναβάθμισης, ο Server Pro εκτελεί αυτόματα μετεγκαταστάσεις βάσης δεδομένων. Αυτές οι μετεγκαταστάσεις είναι **μην** σχεδιασμένες ώστε να εκτελούνται από πολλαπλά instances παράλληλα.

Οι μετεγκαταστάσεις πρέπει να ολοκληρωθούν πριν εκκινήσει η πραγματική web εφαρμογή. Μπορείτε είτε να ελέγξετε τα logs για μια καταχώριση του `Ολοκληρώθηκαν οι μετεγκαταστάσεις` ή να περιμένετε μέχρι η εφαρμογή να δέχεται κίνηση.

Η διαδικασία αναβάθμισης έχει ως εξής:

1. Προγραμματίστε ένα παράθυρο συντήρησης
2. Σταματήστε όλα τα instances του Server Pro
3. Πάρτε ένα συνεπές αντίγραφο ασφαλείας όπως περιγράφεται στο [τεκμηρίωση](/on-premises/el/syntirisi/data-and-backups.md#performing-a-consistent-backup)
4. Εκκινήστε ένα μόνο instance του Server Pro με τη νέα έκδοση
5. Επαληθεύστε ότι το νέο instance λειτουργεί όπως αναμένεται
6. Εκκινήστε τα υπόλοιπα instances με τη νέα έκδοση


---

# 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/el/syntirisi/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.
