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

# Mikropalvelut

Suositeltu tapa ottaa käyttöön ja hallita Overleaf Server CE- ja Overleaf Pro -instansseja on käyttää Toolkitia.

Toolkit yksinkertaistaa Overleaf-instanssisi luomista käyttämällä mukautettuja skriptejä, jotka abstrahoivat tarvittavien mikropalvelujen orkestroinnin. Suorita vain mukana toimitettu alustuskomentosarja, anna muutama määritysvaihtoehto, kuten pysyvän tallennuksen polut, ja Toolkit huolehtii Overleaf Server CE- tai Pro -instanssisi muodostavien mikropalvelujen provisioinnista ja yhdistämisestä.

Tämä jättää sinut vapaaksi keskittymään käyttäjäkokemuksen räätälöintiin ja niiden erityisominaisuuksien toteuttamiseen, joista omalla palvelimella oleva instanssisi koostuu. Toolkit hoitaa kaiken taustalla olevan monimutkaisuuden, mikä mahdollistaa Overleaf-instanssisi yksinkertaistetun käyttöönoton.

{% hint style="info" %}
Yhteensopivuussyistä pääasiallista Overleaf-säilöä kutsutaan `sharelatex`, ja se perustuu `sharelatex/sharelatex` Docker-kuvaan. Tämä johtuu siitä, että teknologia perustuu ShareLaTeX-koodipohjaan, joka yhdistettiin Overleafiin. Katso [tätä blogikirjoitusta nuoli ylös oikealle](https://www.overleaf.com/blog/518-exciting-news-sharelatex-is-joining-overleaf) lisätietoja. Jossain vaiheessa tulevaisuudessa tämä nimetään uudelleen vastaamaan Overleafin nimeämiskäytäntöä.
{% endhint %}

#### Arkkitehtuuri

Overleaf-säilössä ohjelmisto toimii mikropalvelujen joukkona, joita hallitsee `runit`. Säilön sisällä joitakin mielenkiintoisempia tiedostoja ovat:

* `/etc/service/`: mikropalvelujen alustustiedostot.
* `/var/log/overleaf/`: kunkin mikropalvelun lokit.
* `/overleaf/services/`: eri mikropalvelujen koodi.
* `/var/lib/overleaf/`: pysyvän datan liitoskohta (vastaa hakemistoa, joka on määritetty `OVERLEAF_DATA_PATH` isännässä).

#### MongoDB- ja Redis-säilöt

Overleaf on riippuvainen kahdesta ulkoisesta tietokannasta: MongoDB:stä ja Redisistä. Oletusarvoisesti Toolkit luo säilön kullekin näistä tietokannoista Overleaf-säilön lisäksi, yhteensä kolme Docker-säilöä.

{% hint style="info" %}
Jos haluat mieluummin muodostaa yhteyden olemassa olevaan MongoDB- tai Redis-instanssiin, voit tehdä niin määrittämällä sopivat asetukset [overleaf.rc](https://overleaf-pro.ayaka.space/on-premises/fi/aloittaminen/pages/57ab130a4f77245cc4b99f983c24243edca07f9f#the-overleaf.rc-file) asetustiedostossa.
{% endhint %}

#### Editori ja käännösprosessi

Tämä osio tarjoaa yleiskatsauksen asiakirjojen käsittelystä ja käännösprosessista.

{% hint style="info" %}
Tämä sivu kuvaa käännösprosessia hiekkalaatikkokäännöksillä, jotka ovat saatavilla vain Overleaf Prossa. Server CE:ssä käännösprosessi käyttää yksinkertaisia aliprosesseja — korvaa kohteet, jotka viittaavat **säiliön sisällä** yhdellä kohteella **suorita käännös aliprosessissa**.
{% endhint %}

Komponentit / toimijat:

* `käyttäjä` — sovelluksen käyttäjä
* `editori` — selaimessa toimiva asiakassovellus
* `clsi` — mikropalvelu, jota käytetään PDF-tiedostojen kääntämiseen
* `document-updater` — mikropalvelu, jota käytetään asiakirjapäivitysten käsittelyyn
* `filestore` — mikropalvelu binääritiedostojen käsittelyyn
* `real-time` — mikropalvelu, jota käytetään web-socketien käsittelyyn
* `web` — (ei niin) mikropalvelu API-pyyntöjen käsittelyyn

**Redis-välimuisti**

* **käyttäjä**: lataa editorisivun
* **editori**: avaa web-socketin
* **editori**: lähettää pyynnön asiakirjan avaamiseksi web-socketin kautta
  * **real-time** -> **document-updater**: asiakirja ladataan MongoDB:stä Redisiiin
* **editori**: lähettää asiakirjapäivityksen web-socketin kautta
  * **real-time** -> **document-updater**: asiakirja päivitetään Redisissä
* **editori**: lähettää lisää käännöspyyntöjä
  * Kun viimeisestä tyhjennyksestä on kulunut 5 minuuttia (asiakirjaa kohden):
    * **document-updater**: tyhjentää asiakirjan Redisistä MongoDB:hen
* **editori**: lähettää lisää päivityksiä
  * joka 100 päivityksen välein (asiakirjaa kohden):
    * **document-updater**: tyhjentää asiakirjan historian Redisistä MongoDB:hen
* **käyttäjä**: poistuu editorista/sulkee selainvälilehden
  * 5 minuuttia myöhemmin
    * **real-time**: tarkistaa muut yhteistyökumppanit, jos niitä ei ole:
      * **real-time** -> **document-updater**: tyhjentää asiakirjat Redisistä MongoDB:hen

**Lukeminen MongoDB:stä Redisiiin**

* **document-updater** -> **web** -> **docstore**: luetaan MongoDB:stä

**Tyhjentäminen Redisistä MongoDB:hen**

* **document-updater** -> **web** -> **docstore**: kirjoitetaan MongoDB:hen

**Käännös — "full"-synkronointitila**

* **editori**: lähettää käännöspyynnön, jossa synkronointitilaksi on asetettu "full"
* **web** -> **document-updater**: mahdolliset asiakirjat tyhjennetään Redisistä MongoDB:hen
* **web** -> **docstore**: kaikki asiakirjat ladataan MongoDB:stä
* **web** -> **clsi**: käännöspyyntö lähetetään kohteeseen `clsi`, mukaan lukien:
  * synkronointitila
  * tiedostopuun tiiviste -> "projektin tila"
  * kaikki asiakirjat sisällönsä kanssa -> 7 Mt:n pyyntörunkorajoituksen alainen
  * binääritiedostojen URL-osoitteet erillistä latausta varten
* **clsi**: tarkistaa levyllä olevan tilan synkronointitilan ja "projektin tilan" perusteella
  * tämä on täysi synkronointi, joten aiempi levytila voidaan jättää huomiotta
* **clsi**: tyhjentää käännöshakemiston
* **clsi**: kirjoittaa kaikki asiakirjat käännöshakemistoon
* **clsi**: kirjoittaa kaikki binääritiedostot käännöshakemistoon
  * `clsi` kopioi tiedostot projektikohtaisesta paikallisesta välimuistista
  * välimuistihukassa:
    * **clsi** -> **filestore**: lataa tiedostot
* **clsi**: kirjoittaa "projektin tilan"
* **clsi**: varmistaa, että Docker-säilö on olemassa halutulla kokoonpanolla
  * rakentaa säilövaihtoehdot, sisältää texlive-version
  * hajautusasetukset
  * säilön nimi: `project-<project-id>-<user-id>-<hash>`
* **clsi**: käynnistää säilön ja suoratoistaa stdout/stderr:n muistiin -> raja 2 Mt
* **clsi**: jättää pysäytetyn säilön paikoilleen -> siivotaan 24 tunnin kuluttua
* **clsi**: kirjoittaa stdout/stderr:n levylle
* **clsi**: kopioi tulostetiedostot yksilölliseen tuloshakemistoon
  * build-tunnus koostuu 8 satunnaisesta tavusta sekä aikaleimasta millisekunnin tarkkuudella
  * poistaa kaikki paitsi viimeiset 3 (anonyymi) / viimeisen 1 (kirjautunut käyttäjä) build-hakemistoa
* **clsi**: käännös epäonnistui/aikakatkaistiin
  * poista käännösvälimuisti — siinä voi olla osittaisia tiedostoja/korruptoitunut välimuisti
* **editori**: lataa output.log:n ja output.pdf:n

**Käännös — "incremental"-synkronointitila**

* **editori**: lähettää käännöspyynnön, jossa synkronointitilaksi on asetettu "incremental"
* **web** -> **document-updater**: noutaa kaikki asiakirjat Redisistä
  * "projektin tila" -tiiviste tallennetaan myös Redisiiin
  * **web** lähettää tiedostopuun tiivisteen kohteeseen `document-updater` ja `document-updater` voi muuttaa inkrementaalisen käännöksen täydeksi käännökseksi, jos ne eivät täsmää
    * katso käännösprosessi sellaisena kuin se suoritetaan, kun editori pyysi "full"-käännöstä
* **web** -> **clsi**: käännöspyyntö lähetetään kohteeseen `clsi`, mukaan lukien:
  * synkronointitila
  * tiedostopuun tiiviste -> "projektin tila"
  * kaikki asiakirjat Redisistä sisällönsä kanssa -> 7 Mt:n pyyntörunkorajoituksen alainen
  * ei binääritiedostoja
* **clsi**: tarkistaa levyllä olevan tilan synkronointitilan ja "projektin tilan" perusteella
  * tämä on inkrementaalinen synkronointi, joten "projektin tilan" on täsmättävä
  * täsmäämättömyyden tapauksessa: vastaa 409:llä, anna webin yrittää uudelleen "full"-synkronoinnilla
    * katso käännösprosessi sellaisena kuin se suoritetaan, kun editori pyysi "full"-käännöstä
* **clsi**: kirjoittaa päivitetyt asiakirjat käännöshakemistoon
* **clsi**: varmistaa, että Docker-säilö on olemassa halutulla kokoonpanolla
  * rakentaa säilövaihtoehdot, sisältää texlive-version
  * hajautusasetukset
  * säilön nimi: `project-<project-id>-<user-id>-<hash>`
* **clsi**: käynnistää säilön ja suoratoistaa stdout/stderr:n muistiin -> raja 2 Mt
* **clsi**: jättää pysäytetyn säilön paikoilleen -> siivotaan 24 tunnin kuluttua
* **clsi**: kirjoittaa stdout/stderr:n levylle
* **clsi**: kopioi tulostetiedostot yksilölliseen tuloshakemistoon
  * build-tunnus koostuu 8 satunnaisesta tavusta sekä aikaleimasta millisekunnin tarkkuudella
  * poistaa kaikki paitsi viimeiset 3 (anonyymi) / viimeisen 1 (kirjautunut käyttäjä) build-hakemistoa
* **clsi**: käännös epäonnistui/aikakatkaistiin
  * poista käännösvälimuisti — siinä voi olla osittaisia tiedostoja/korruptoitunut välimuisti
* **editori**: lataa output.log:n ja output.pdf:n

**Käännös — tilojen vaihtaminen**

* **editori**: havaitsee käännösvirheen, seuraava käännös on "full"-käännös
* **editori**: havaitsee käännöksen onnistuneen, seuraava käännös on "incremental"-käännös


---

# 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/fi/aloittaminen/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.
