> 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/enarksi/microservices.md).

# Μικροϋπηρεσίες

Ο συνιστώμενος τρόπος για την ανάπτυξη και διαχείριση των στιγμιοτύπων Overleaf Server CE και Overleaf Pro είναι μέσω της χρήσης του Toolkit.

Το Toolkit απλοποιεί τη δημιουργία του στιγμιοτύπου Overleaf σας μέσω της χρήσης ορισμένων προσαρμοσμένων scripts που αφαιρούν την ανάγκη ενορχήστρωσης των απαιτούμενων μικροϋπηρεσιών. Απλώς εκτελέστε το ενσωματωμένο script αρχικοποίησης, δώστε μερικές επιλογές ρύθμισης όπως τις διαδρομές μόνιμης αποθήκευσής σας, και το Toolkit θα αναλάβει την παροχή και τη σύνδεση των μικροϋπηρεσιών που αποτελούν το στιγμιότυπο Overleaf Server CE ή Pro σας.

Έτσι είστε ελεύθεροι να επικεντρωθείτε στην προσαρμογή της εμπειρίας χρήστη και στην υλοποίηση των συγκεκριμένων λειτουργιών που αποτελούν το on-premise στιγμιότυπό σας. Το Toolkit χειρίζεται όλη την πολυπλοκότητα στο παρασκήνιο, επιτρέποντας μια απλοποιημένη ανάπτυξη του στιγμιοτύπου Overleaf σας.

{% hint style="info" %}
Για λόγους συμβατότητας με παλαιότερες εκδόσεις, ο κύριος container του Overleaf ονομάζεται `sharelatex`, και βασίζεται στην `sharelatex/sharelatex` εικόνα Docker. Αυτό συμβαίνει επειδή η τεχνολογία βασίζεται στη βάση κώδικα του ShareLaTeX, η οποία συγχωνεύτηκε στο Overleaf. Δείτε [αυτή την ανάρτηση του blogarrow-up-right](https://www.overleaf.com/blog/518-exciting-news-sharelatex-is-joining-overleaf) για περισσότερες λεπτομέρειες. Κάποια στιγμή στο μέλλον, αυτό θα μετονομαστεί ώστε να ταιριάζει με το σχήμα ονοματοδοσίας του Overleaf.
{% endhint %}

#### Αρχιτεκτονική

Μέσα στο container του Overleaf, το λογισμικό εκτελείται ως ένα σύνολο μικροϋπηρεσιών, που διαχειρίζεται από `runit`. Μερικά από τα πιο ενδιαφέροντα αρχεία μέσα στο container είναι:

* `/etc/service/`: αρχεία αρχικοποίησης για τις μικροϋπηρεσίες.
* `/var/log/overleaf/`: αρχεία καταγραφής για κάθε μικροϋπηρεσία.
* `/overleaf/services/`: κώδικας για τις διάφορες μικροϋπηρεσίες.
* `/var/lib/overleaf/`: το σημείο προσάρτησης για τα μόνιμα δεδομένα (αντιστοιχεί στον κατάλογο που υποδεικνύεται από `OVERLEAF_DATA_PATH` στον host).

#### Τα containers MongoDB και Redis

Το Overleaf εξαρτάται από δύο εξωτερικές βάσεις δεδομένων: MongoDB και Redis. Από προεπιλογή, το Toolkit θα δημιουργήσει ένα container για καθεμία από αυτές τις βάσεις δεδομένων, επιπλέον του container του Overleaf, συνολικά τρία Docker containers.

{% hint style="info" %}
Αν προτιμάτε να συνδεθείτε σε ένα υπάρχον στιγμιότυπο MongoDB ή Redis, μπορείτε να το κάνετε ρυθμίζοντας τις κατάλληλες ρυθμίσεις στο [overleaf.rc](https://ayakaleaf-pro.ayaka.space/on-premises/el/enarksi/pages/acfbd86bb6e1014dff32b324de072a6e338a7669#the-overleaf.rc-file) αρχείο ρυθμίσεων.
{% endhint %}

#### Επεξεργαστής και διαδικασία μεταγλώττισης

Αυτή η ενότητα παρέχει μια γενική επισκόπηση της διαχείρισης εγγράφων και της διαδικασίας μεταγλώττισης.

{% hint style="info" %}
Αυτή η σελίδα περιγράφει τη διαδικασία μεταγλώττισης με τα Sandboxed Compiles, όπως είναι διαθέσιμα μόνο στο Overleaf Pro. Στο Server CE, η διαδικασία μεταγλώττισης χρησιμοποιεί απλές υποδιεργασίες — αντικαταστήστε τα στοιχεία που αναφέρονται σε ένα **container** με ένα μόνο στοιχείο **εκτέλεση της μεταγλώττισης σε υποδιεργασία**.
{% endhint %}

Συστατικά / Δρώντες:

* `χρήστης` — Ένας χρήστης της εφαρμογής
* `επεξεργαστής` — Η εφαρμογή-πελάτης που εκτελείται στο πρόγραμμα περιήγησης
* `clsi` — Η μικροϋπηρεσία που χρησιμοποιείται για τη μεταγλώττιση PDF
* `document-updater` — Η μικροϋπηρεσία που χρησιμοποιείται για την επεξεργασία ενημερώσεων εγγράφων
* `filestore` — Η μικροϋπηρεσία που χειρίζεται δυαδικά αρχεία
* `real-time` — Η μικροϋπηρεσία που χειρίζεται web sockets
* `web` — Η (όχι και τόσο) μικροϋπηρεσία που χρησιμοποιείται για τον χειρισμό αιτημάτων API

**Προσωρινή αποθήκευση Redis**

* **χρήστης**: φορτώνει τη σελίδα του επεξεργαστή
* **επεξεργαστής**: ανοίγει web socket
* **επεξεργαστής**: στέλνει αίτημα για άνοιγμα εγγράφου μέσω web socket
  * **real-time** -> **document-updater**: το έγγραφο φορτώνεται από το MongoDB στο Redis
* **επεξεργαστής**: στέλνει ενημέρωση εγγράφου μέσω web socket
  * **real-time** -> **document-updater**: το έγγραφο ενημερώνεται στο Redis
* **επεξεργαστής**: στέλνει περισσότερα αιτήματα μεταγλώττισης
  * Αφού περάσουν 5 λεπτά από την τελευταία εκκαθάριση (ανά έγγραφο):
    * **document-updater**: μεταφέρει το έγγραφο από το Redis στο MongoDB
* **επεξεργαστής**: στέλνει περισσότερες ενημερώσεις
  * κάθε 100 ενημερώσεις (ανά έγγραφο):
    * **document-updater**: μεταφέρει το ιστορικό του εγγράφου από το Redis στο MongoDB
* **χρήστης**: εγκαταλείπει τον επεξεργαστή/κλείνει την καρτέλα του προγράμματος περιήγησης
  * 5 λεπτά αργότερα
    * **real-time**: ελέγχει για άλλους συνεργάτες, αν δεν υπάρχουν:
      * **real-time** -> **document-updater**: μεταφέρει έγγραφα από το Redis στο MongoDB

**Ανάγνωση από το MongoDB στο Redis**

* **document-updater** -> **web** -> **docstore**: ανάγνωση από το MongoDB

**Μεταφορά από το Redis στο MongoDB**

* **document-updater** -> **web** -> **docstore**: εγγραφή στο MongoDB

**Μεταγλώττιση — λειτουργία συγχρονισμού "full"**

* **επεξεργαστής**: στέλνει αίτημα μεταγλώττισης με τη λειτουργία συγχρονισμού ρυθμισμένη σε "full"
* **web** -> **document-updater**: τυχόν έγγραφα μεταφέρονται από το Redis στο MongoDB
* **web** -> **docstore**: όλα τα έγγραφα κατεβαίνουν από το MongoDB
* **web** -> **clsi**: το αίτημα μεταγλώττισης αποστέλλεται στο `clsi`, συμπεριλαμβανομένων:
  * της λειτουργίας συγχρονισμού
  * ένα hash του δέντρου αρχείων -> η "κατάσταση του έργου"
  * όλα τα έγγραφα με το περιεχόμενό τους -> υπόκεινται σε όριο 7 MB στο σώμα του αιτήματος
  * URLs δυαδικών αρχείων για ξεχωριστή λήψη
* **clsi**: ελέγχει την κατάσταση στον δίσκο με τη λειτουργία συγχρονισμού και την "κατάσταση του έργου"
  * αυτός είναι πλήρης συγχρονισμός, οπότε η προηγούμενη κατάσταση στον δίσκο μπορεί να αγνοηθεί
* **clsi**: καθαρίζει τον κατάλογο μεταγλώττισης
* **clsi**: γράφει όλα τα έγγραφα στον κατάλογο μεταγλώττισης
* **clsi**: γράφει όλα τα δυαδικά αρχεία στον κατάλογο μεταγλώττισης
  * `clsi` αντιγράφει τα αρχεία από μια τοπική cache ανά έργο
  * σε αποτυχία cache:
    * **clsi** -> **filestore**: λήψη αρχείων
* **clsi**: γράφει την "κατάσταση του έργου"
* **clsi**: διασφαλίζει ότι υπάρχει Docker container με την επιθυμητή ρύθμιση
  * δημιουργεί επιλογές container, περιλαμβάνει την έκδοση TeX Live
  * hash των επιλογών
  * όνομα container: `project-<project-id>-<user-id>-<hash>`
* **clsi**: εκκινεί το container και διοχετεύει το stdout/stderr στη μνήμη -> όριο 2 MB
* **clsi**: αφήνει πίσω το σταματημένο container -> καθαρίζεται μετά από 24 ώρες
* **clsi**: γράφει το stdout/stderr στον δίσκο
* **clsi**: αντιγράφει τα αρχεία εξόδου σε μοναδικό κατάλογο εξόδου
  * build-id που αποτελείται από 8 τυχαία bytes συν χρονική σήμανση με ακρίβεια ms
  * διαγράφει όλους τους φακέλους build εκτός από τους τελευταίους 3 (ανώνυμους) / τον τελευταίο 1 (συνδεδεμένο χρήστη)
* **clsi**: η μεταγλώττιση απέτυχε/έληξε το χρονικό όριο
  * διαγράφει την cache μεταγλώττισης — μπορεί να περιέχει μερικά αρχεία/κατεστραμμένη cache
* **επεξεργαστής**: κάνει λήψη των output.log και output.pdf

**Μεταγλώττιση — λειτουργία συγχρονισμού "incremental"**

* **επεξεργαστής**: στέλνει αίτημα μεταγλώττισης με τη λειτουργία συγχρονισμού ρυθμισμένη σε "incremental"
* **web** -> **document-updater**: λαμβάνει τυχόν έγγραφα από το Redis
  * το hash της "κατάστασης του έργου" αποθηκεύεται επίσης στο Redis
  * **web** στέλνει το hash του δέντρου αρχείων στο `document-updater` και `document-updater` μπορεί να μετατρέψει την incremental μεταγλώττιση σε full μεταγλώττιση σε περίπτωση ασυμφωνίας
    * δείτε τη διαδικασία μεταγλώττισης όπως εκτελείται όταν ο επεξεργαστής ζήτησε "full" μεταγλώττιση
* **web** -> **clsi**: το αίτημα μεταγλώττισης αποστέλλεται στο `clsi`, συμπεριλαμβανομένων:
  * της λειτουργίας συγχρονισμού
  * ένα hash του δέντρου αρχείων -> η "κατάσταση του έργου"
  * όλα τα έγγραφα από το Redis με το περιεχόμενό τους -> υπόκεινται σε όριο 7 MB στο σώμα του αιτήματος
  * χωρίς δυαδικά αρχεία
* **clsi**: ελέγχει την κατάσταση στον δίσκο με τη λειτουργία συγχρονισμού και την "κατάσταση του έργου"
  * αυτός είναι incremental συγχρονισμός, οπότε η "κατάσταση του έργου" πρέπει να ταιριάζει
  * σε ασυμφωνία: απαντά με 409, αφήνει το web να δοκιμάσει ξανά με συγχρονισμό "full"
    * δείτε τη διαδικασία μεταγλώττισης όπως εκτελείται όταν ο επεξεργαστής ζήτησε "full" μεταγλώττιση
* **clsi**: γράφει τα ενημερωμένα έγγραφα στον κατάλογο μεταγλώττισης
* **clsi**: διασφαλίζει ότι υπάρχει Docker container με την επιθυμητή ρύθμιση
  * δημιουργεί επιλογές container, περιλαμβάνει την έκδοση TeX Live
  * hash των επιλογών
  * όνομα container: `project-<project-id>-<user-id>-<hash>`
* **clsi**: εκκινεί το container και διοχετεύει το stdout/stderr στη μνήμη -> όριο 2 MB
* **clsi**: αφήνει πίσω το σταματημένο container -> καθαρίζεται μετά από 24 ώρες
* **clsi**: γράφει το stdout/stderr στον δίσκο
* **clsi**: αντιγράφει τα αρχεία εξόδου σε μοναδικό κατάλογο εξόδου
  * build-id που αποτελείται από 8 τυχαία bytes συν χρονική σήμανση με ακρίβεια ms
  * διαγράφει όλους τους φακέλους build εκτός από τους τελευταίους 3 (ανώνυμους) / τον τελευταίο 1 (συνδεδεμένο χρήστη)
* **clsi**: η μεταγλώττιση απέτυχε/έληξε το χρονικό όριο
  * διαγράφει την cache μεταγλώττισης — μπορεί να περιέχει μερικά αρχεία/κατεστραμμένη cache
* **επεξεργαστής**: κάνει λήψη των output.log και output.pdf

**Μεταγλώττιση — εναλλαγή μεταξύ λειτουργιών**

* **επεξεργαστής**: παρατηρεί αποτυχία μεταγλώττισης, η επόμενη μεταγλώττιση είναι "full"
* **επεξεργαστής**: παρατηρεί επιτυχία μεταγλώττισης, η επόμενη μεταγλώττιση είναι "incremental"


---

# 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/enarksi/microservices.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.
