> 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/on-premises-cs/zaciname/microservices.md).

# Mikroslužby

Doporučený způsob nasazení a správy instancí Overleaf Server CE a Overleaf Pro je prostřednictvím Toolkitu.

Toolkit zjednodušuje vytvoření vaší instance Overleaf pomocí několika vlastních skriptů, které abstrahují orchestrace požadovaných mikroslužeb. Stačí spustit přiložený inicializační skript, zadat několik konfiguračních voleb, například cesty k trvalému úložišti, a Toolkit se postará o zajištění a propojení mikroslužeb, které tvoří vaši instanci Overleaf Server CE nebo Pro.

To vám ponechává volnost soustředit se na přizpůsobení uživatelského prostředí a implementaci konkrétních funkcí, které tvoří vaši lokální instanci. Toolkit se postará o veškerou složitost v pozadí a umožní zjednodušené nasazení vaší instance Overleaf.

{% hint style="info" %}
Z historických důvodů se hlavní kontejner Overleaf nazývá `sharelatex`, a je založen na `sharelatex/sharelatex` obrazu Dockeru. Je to proto, že tato technologie vychází ze základního kódu ShareLaTeX, který byl sloučen do Overleafu. Viz [tento blogový příspěvekarrow-up-right](https://www.overleaf.com/blog/518-exciting-news-sharelatex-is-joining-overleaf) pro více podrobností. V budoucnu bude tento název změněn tak, aby odpovídal pojmenovacímu schématu Overleafu.
{% endhint %}

#### Architektura

Uvnitř kontejneru Overleaf běží software jako sada mikroslužeb, spravovaných pomocí `runit`. Některé zajímavější soubory uvnitř kontejneru jsou:

* `/etc/service/`: inicializační soubory mikroslužeb.
* `/var/log/overleaf/`: logy každé mikroslužby.
* `/overleaf/services/`: kód jednotlivých mikroslužeb.
* `/var/lib/overleaf/`: přípojný bod pro trvalá data (odpovídá adresáři určenému `OVERLEAF_DATA_PATH` na hostiteli).

#### Kontejnery MongoDB a Redis

Overleaf závisí na dvou externích databázích: MongoDB a Redis. Ve výchozím nastavení Toolkit zřídí kromě kontejneru Overleaf také kontejner pro každou z těchto databází, celkem tedy tři kontejnery Dockeru.

{% hint style="info" %}
Pokud byste se raději připojili k existující instanci MongoDB nebo Redis, můžete to udělat nastavením příslušných voleb v [overleaf.rc](https://ayakaleaf-pro.ayaka.space/on-premises/on-premises-cs/zaciname/pages/21ca43688c5d85b1e3c259e5f0a2d3ff07651168#the-overleaf.rc-file) konfiguračním souboru.
{% endhint %}

#### Editor a proces kompilace

Tato sekce poskytuje obecný přehled zpracování dokumentů a procesu kompilace.

{% hint style="info" %}
Tato stránka popisuje proces kompilace s Sandboxed Compiles, které jsou k dispozici pouze v Overleaf Pro. V Server CE používá proces kompilace jednoduché podprocesy — nahraďte položky odkazující na a **kontejneru** jednou položkou **spustit kompilaci v podprocesu**.
{% endhint %}

Složky / aktéři:

* `uživatel` — Uživatel aplikace
* `editor` — Klientská aplikace běžící v prohlížeči
* `clsi` — Mikroslužba používaná pro kompilaci PDF
* `document-updater` — Mikroslužba používaná pro zpracování aktualizací dokumentů
* `filestore` — Mikroslužba zpracovávající binární soubory
* `real-time` — Mikroslužba používaná pro zpracování websocketů
* `web` — (ne tak) mikroslužba používaná pro zpracování požadavků API

**Mezipaměť Redis**

* **uživatel**: načte stránku editoru
* **editor**: otevře websocket
* **editor**: odešle požadavek na otevření dokumentu přes websocket
  * **real-time** -> **document-updater**: dokument se načte z MongoDB do Redis
* **editor**: odešle aktualizaci dokumentu přes websocket
  * **real-time** -> **document-updater**: dokument se aktualizuje v Redis
* **editor**: odešle další požadavky na kompilaci
  * Po uplynutí 5 minut od posledního zápisu (na dokument):
    * **document-updater**: zapíše dokument z Redis do MongoDB
* **editor**: odešle další aktualizace
  * po každých 100 aktualizacích (na dokument):
    * **document-updater**: zapíše historii dokumentu z Redis do MongoDB
* **uživatel**: opustí editor/zavře kartu prohlížeče
  * o 5 minut později
    * **real-time**: zkontroluje další spolupracovníky, pokud žádní nejsou:
      * **real-time** -> **document-updater**: zapíše dokumenty z Redis do MongoDB

**Čtení z MongoDB do Redis**

* **document-updater** -> **web** -> **docstore**: čtení z MongoDB

**Zápis z Redis do MongoDB**

* **document-updater** -> **web** -> **docstore**: zápis do MongoDB

**Kompilace — režim synchronizace „full“**

* **editor**: odešle požadavek na kompilaci s režimem synchronizace nastaveným na „full“
* **web** -> **document-updater**: všechny dokumenty z Redis jsou vyprázdněny do MongoDB
* **web** -> **docstore**: všechny dokumenty jsou staženy z MongoDB
* **web** -> **clsi**: požadavek na kompilaci je odeslán do `clsi`, včetně:
  * režimu synchronizace
  * hash stromu souborů -> „stav projektu“
  * všechny dokumenty s jejich obsahem -> podléhá limitu 7 MB na tělo požadavku
  * URL binárních souborů pro samostatné stahování
* **clsi**: zkontroluje stav na disku s režimem synchronizace a „stavem projektu“
  * jde o úplnou synchronizaci, takže předchozí stav na disku lze ignorovat
* **clsi**: vyčistí adresář kompilace
* **clsi**: zapíše všechny dokumenty do adresáře kompilace
* **clsi**: zapíše všechny binární soubory do adresáře kompilace
  * `clsi` kopíruje soubory z místní mezipaměti pro daný projekt
  * při chybě v mezipaměti:
    * **clsi** -> **filestore**: stáhne soubory
* **clsi**: zapíše „stav projektu“
* **clsi**: zajistí existenci kontejneru Docker s požadovanou konfigurací
  * vytvoří možnosti kontejneru, zahrnuje verzi texlive
  * hashuje možnosti
  * název kontejneru: `project-<project-id>-<user-id>-<hash>`
* **clsi**: spustí kontejner a streamuje stdout/stderr do paměti -> limit 2 MB
* **clsi**: ponechá zastavený kontejner -> po 24 h bude vyčištěn
* **clsi**: zapíše stdout/stderr na disk
* **clsi**: zkopíruje výstupní soubory do jedinečného výstupního adresáře
  * build-id se skládá z 8 náhodných bajtů plus časového razítka s přesností na ms
  * smaže všechny složky sestavení kromě posledních 3 (anonymní uživatel) / poslední 1 (přihlášený uživatel)
* **clsi**: kompilace selhala / vypršel časový limit
  * smaže mezipaměť kompilace — může obsahovat částečné soubory / poškozenou mezipaměť
* **editor**: stáhne output.log a output.pdf

**Kompilace — režim synchronizace „incremental“**

* **editor**: odešle požadavek na kompilaci s režimem synchronizace nastaveným na „incremental“
* **web** -> **document-updater**: načte všechny dokumenty z Redis
  * hash „stavu projektu“ je také uložen v Redis
  * **web** odešle hash stromu souborů do `document-updater` a `document-updater` může při nesouladu převést inkrementální kompilaci na úplnou kompilaci
    * viz proces kompilace prováděný při tom, když editor požádal o „full“ kompilaci
* **web** -> **clsi**: požadavek na kompilaci je odeslán do `clsi`, včetně:
  * režimu synchronizace
  * hash stromu souborů -> „stav projektu“
  * všechny dokumenty z Redis s jejich obsahem -> podléhá limitu 7 MB na tělo požadavku
  * žádné binární soubory
* **clsi**: zkontroluje stav na disku s režimem synchronizace a „stavem projektu“
  * jde o inkrementální synchronizaci, takže „stav projektu“ musí odpovídat
  * při nesouladu: odpovědět 409, nechat web zopakovat s „full“ synchronizací
    * viz proces kompilace prováděný při tom, když editor požádal o „full“ kompilaci
* **clsi**: zapíše aktualizované dokumenty do adresáře kompilace
* **clsi**: zajistí existenci kontejneru Docker s požadovanou konfigurací
  * vytvoří možnosti kontejneru, zahrnuje verzi texlive
  * hashuje možnosti
  * název kontejneru: `project-<project-id>-<user-id>-<hash>`
* **clsi**: spustí kontejner a streamuje stdout/stderr do paměti -> limit 2 MB
* **clsi**: ponechá zastavený kontejner -> po 24 h bude vyčištěn
* **clsi**: zapíše stdout/stderr na disk
* **clsi**: zkopíruje výstupní soubory do jedinečného výstupního adresáře
  * build-id se skládá z 8 náhodných bajtů plus časového razítka s přesností na ms
  * smaže všechny složky sestavení kromě posledních 3 (anonymní uživatel) / poslední 1 (přihlášený uživatel)
* **clsi**: kompilace selhala / vypršel časový limit
  * smaže mezipaměť kompilace — může obsahovat částečné soubory / poškozenou mezipaměť
* **editor**: stáhne output.log a output.pdf

**Kompilace — přepínání mezi režimy**

* **editor**: zaznamená selhání kompilace, příští kompilace je „full“ kompilace
* **editor**: zaznamená úspěch kompilace, příští kompilace je „incremental“ kompilace


---

# 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/on-premises-cs/zaciname/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.
