> 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/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/enarksi/requirements/hardware-requirements.md) τεκμηρίωση για συστάσεις.

Μια ανάπτυξη του Server Pro με οριζόντια κλιμάκωση περιλαμβάνει ένα σύνολο εξωτερικών στοιχείων, όπως έναν εξισορροπητή φορτίου και ένα backend αποθήκευσης συμβατό με S3.

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

  **Σημαντικό:** NFS/Amazon EFS/Amazon EBS **να μην** υποστηρίζονται για οριζόντια κλιμάκωση. Δείτε την [αποθήκευση υλικού](/on-premises/el/enarksi/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 θα πρέπει να εκτελείται ως **μοναδικό στιγμιότυπο**. Για βέλτιστη απόδοση, συνιστούμε τη χρήση τοπικού δίσκου για τα δεδομένα του git-bridge. Ο δίσκος δεδομένων του git-bridge θα πρέπει να δημιουργείται τακτικά αντίγραφο ασφαλείας.

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

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

#### Απαιτήσεις εξισορροπητή φορτίου

* **Μόνιμη δρομολόγηση**, π.χ. χρησιμοποιώντας ένα 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 στον εξισορροπητή φορτίου λειτουργεί.

  Με `NGINX_KEEPALIVE_TIMEOUT=120`, ο εξισορροπητής φορτίου θα μπορούσε να επιλέξει 115s.
* **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 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 στο αδελφό container του 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/diamorfosi/overleaf-toolkit/s3.md) για λεπτομέρειες.

**Προσωρινά αρχεία**

Το προεπιλεγμένο bind-mount ενός τοπικού SSD στο `/var/lib/overleaf` (`/var/lib/sharelatex` για εκδόσεις `4.x` και παλαιότερες) θα είναι επαρκές. Βεβαιωθείτε ότι ορίζετε το `SANDBOXED_COMPILES_HOST_DIR` στο σημείο προσάρτησης στον host.

{% 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 %}

Το container git-bridge χρειάζεται ένα αδελφό container Server Pro για τη διαχείριση των εισερχόμενων αιτημάτων git. Αυτό το αδελφό container μπορεί επίσης να εξυπηρετεί κανονική κίνηση χρηστών. Στη δείγμα ρύθμιση, το πρώτο στιγμιότυπο λειτουργεί ως αδελφό container για το git-bridge, αλλά στην πραγματικότητα οποιοδήποτε στιγμιότυπο θα μπορούσε να λειτουργήσει έτσι.

Γιατί πρέπει να ορίσουμε ένα container Server Pro ως αδελφό για το git-bridge; Το Server Pro δίνει URL λήψης για την υπηρεσία ιστορικού στο git-bridge. Πρέπει να ρυθμίσουμε αυτά τα URL ιστορικού ώστε να είναι προσβάσιμα από το container git-bridge.

Ρύθμιση container Server Pro:

* Ορίστε `GIT_BRIDGE_ENABLED` σε `'true'`
* Ορίστε `GIT_BRIDGE_HOST` σε `<όνομα container git-bridge>` π.χ. `git-bridge`
* Ορίστε `GIT_BRIDGE_PORT` σε `8000`
* Ορίστε `V1_HISTORY_URL` σε `http://<όνομα αδελφού container server-pro>:3100/api`.

  Σημείωση: Αυτό είναι απαραίτητο μόνο στο αδελφό container για το container git-bridge. Τα άλλα στιγμιότυπα μπορούν να χρησιμοποιήσουν URL localhost, το οποίο είναι το προεπιλεγμένο.

Ρύθμιση container git-bridge:

* Ορίστε `GIT_BRIDGE_API_BASE_URL` σε `http://<όνομα αδελφού container server-pro>/api/v0`, π.χ. `http://server-pro-ha-1/api/v0`
* Ορίστε `GIT_BRIDGE_OAUTH2_SERVER` σε `http://<όνομα αδελφού container server-pro>`, π.χ. `http://server-pro-ha-1`
* Ορίστε `GIT_BRIDGE_POSTBACK_BASE_URL` σε `http://<όνομα container git-bridge>:8000`, π.χ. `http://git-bridge:8000`
* Ορίστε `GIT_BRIDGE_ROOT_DIR` στον προσαρτημένο με bind δίσκο δεδομένων του git-bridge, π.χ. `/data/git-bridge`

<details>

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

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

```yaml
version: '2.2'

# Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: επιλέξτε το δικό σας δίκτυο και αντικαταστήστε τις IP στη ρύθμιση.
networks:
    default:
        ipam:
            config:
                # Αυτό το υποδίκτυο αποτελεί μέρος ενός δεσμευμένου υποδικτύου που χρησιμοποιείται για benchmarking
                # https://tools.ietf.org/html/rfc2544
                # Το πλήρες υποδίκτυο είναι 198.18.0.0/15
                # Χρησιμοποιήστε 198.18.0.0/24 για lb και dbs
                # Χρησιμοποιήστε 198.18.1.0/24 για server-pro
                # Χρησιμοποιήστε 198.18.0.128/25 για το προσωρινό container
                - 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

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτό το container δίπλα στο server-pro-ha-1.
    # Για το Server Pro 4.0 και μετά.
    git-bridge:
        restart: always
        # Το tag θα πρέπει να ταιριάζει με το tag του container `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

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτό το container σε ξεχωριστό 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/όνομα εφαρμογής.
            OVERLEAF_SITE_URL: 'https://overleaf.example.com'
            OVERLEAF_APP_NAME: Επίδειξη Οριζόντιας Κλιμάκωσης Server Pro

            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 των 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

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

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

    # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε αυτό το container σε ξεχωριστό host.
    minio:
        image: minio/minio:RELEASE.2023-05-18T00-05-36Z
        container_name: minio
        command: server /data
        volumes:
            # Πραγματική ρύθμιση οριζόντιας κλιμάκωσης: εκτελέστε το minio με πολλαπλούς δίσκους, δείτε την τεκμηρίωση του 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

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

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

#### Υλικό

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

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

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

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

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

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

1. Προγραμματίστε ένα παράθυρο συντήρησης
2. Σταματήστε όλα τα στιγμιότυπα του Server Pro
3. Πραγματοποιήστε ένα συνεπές αντίγραφο ασφαλείας όπως περιγράφεται στο [τεκμηρίωση](/on-premises/el/syntirisi/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://ayakaleaf-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.
