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

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

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

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

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

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

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

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

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

#### Τα κοντέινερ MongoDB και Redis

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

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

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

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

{% hint style="info" %}
Αυτή η σελίδα περιγράφει τη διαδικασία μεταγλώττισης με Sandboxed Compiles όπως είναι διαθέσιμη μόνο στο Overleaf Pro. Στο Server CE, η διαδικασία μεταγλώττισης χρησιμοποιεί απλές υποδιεργασίες — αντικαταστήστε τα στοιχεία που αναφέρονται σε ένα **κοντέινερ** με ένα μόνο στοιχείο **εκτέλεση μεταγλώττισης σε υποδιεργασία**.
{% 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 λεπτά από το τελευταίο flush (ανά έγγραφο):
    * **document-updater**: flush του εγγράφου από το Redis στη MongoDB
* **πρόγραμμα επεξεργασίας**: στέλνει περισσότερες ενημερώσεις
  * κάθε 100 ενημερώσεις (ανά έγγραφο):
    * **document-updater**: flush του ιστορικού εγγράφου από το Redis στη MongoDB
* **χρήστης**: εγκαταλείπει το πρόγραμμα επεξεργασίας/κλείνει την καρτέλα του περιηγητή
  * 5 λεπτά αργότερα
    * **real-time**: ελέγχει για άλλους συνεργάτες, αν δεν υπάρχουν:
      * **real-time** -> **document-updater**: κάνει flush των εγγράφων από το Redis στη MongoDB

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

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

**Flush από το Redis στη MongoDB**

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

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

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

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

* **πρόγραμμα επεξεργασίας**: στέλνει αίτημα μεταγλώττισης με τη λειτουργία συγχρονισμού ορισμένη σε "incremental"
* **web** -> **document-updater**: λήψη τυχόν εγγράφων από το Redis
  * το hash της "κατάστασης του έργου" αποθηκεύεται επίσης στο Redis
  * **web** στέλνει το hash του δέντρου αρχείων στο `document-updater` και `document-updater` μπορεί να μετατρέψει την αυξητική μεταγλώττιση σε πλήρη μεταγλώττιση σε περίπτωση ασυμφωνίας
    * δείτε τη διαδικασία μεταγλώττισης όπως εκτελείται όταν ο επεξεργαστής ζήτησε "full" μεταγλώττιση
* **web** -> **clsi**: το αίτημα μεταγλώττισης στέλνεται στο `clsi`, συμπεριλαμβανομένων:
  * της λειτουργίας συγχρονισμού
  * ένα hash του δέντρου αρχείων -> η "κατάσταση του έργου"
  * όλα τα έγγραφα από το Redis με το περιεχόμενό τους -> υπόκειται σε όριο 7MB για το σώμα του αιτήματος
  * χωρίς δυαδικά αρχεία
* **clsi**: έλεγχος της κατάστασης στον δίσκο με τη λειτουργία συγχρονισμού και την "κατάσταση του έργου"
  * αυτός είναι αυξητικός συγχρονισμός, οπότε η "κατάσταση του έργου" πρέπει να ταιριάζει
  * σε ασυμφωνία: απάντηση με 409, αφήστε τον περιηγητή να δοκιμάσει ξανά με συγχρονισμό "full"
    * δείτε τη διαδικασία μεταγλώττισης όπως εκτελείται όταν ο επεξεργαστής ζήτησε "full" μεταγλώττιση
* **clsi**: εγγραφή των ενημερωμένων εγγράφων στον κατάλογο μεταγλώττισης
* **clsi**: διασφαλίζει ότι υπάρχει κοντέινερ Docker με την επιθυμητή ρύθμιση
  * κατασκευή επιλογών κοντέινερ, περιλαμβάνει την έκδοση texlive
  * επιλογές κατακερματισμού
  * όνομα κοντέινερ: `project-<project-id>-<user-id>-<hash>`
* **clsi**: εκκινεί το κοντέινερ και ρέει το stdout/stderr στη μνήμη -> όριο 2MB
* **clsi**: αφήνει πίσω το σταματημένο κοντέινερ -> καθαρίζεται μετά από 24 ώρες
* **clsi**: εγγραφή του stdout/stderr στον δίσκο
* **clsi**: αντιγραφή των αρχείων εξόδου σε μοναδικό κατάλογο εξόδου
  * build-id αποτελούμενο από 8 τυχαία bytes συν χρονική σήμανση με ακρίβεια ms
  * διαγραφή όλων εκτός από τους τελευταίους 3 (ανώνυμος) / τελευταίο 1 (συνδεδεμένος χρήστης) φακέλους build
* **clsi**: η μεταγλώττιση ήταν αποτυχία/λήξη χρόνου
  * διαγραφή της προσωρινής μνήμης μεταγλώττισης — μπορεί να έχει μερικά αρχεία/κατεστραμμένη προσωρινή μνήμη
* **πρόγραμμα επεξεργασίας**: κάνει λήψη των 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://overleaf-pro.ayaka.space/on-premises/el/ksekinontas/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.
