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

# Mikroservis

Cara yang direkomendasikan untuk menerapkan dan mengelola instans Overleaf Server CE dan Overleaf Pro adalah dengan menggunakan Toolkit.

Toolkit menyederhanakan pembuatan instans Overleaf Anda melalui penggunaan beberapa skrip kustom yang mengabstraksi orkestrasi mikroservice yang diperlukan. Cukup jalankan skrip inisialisasi yang disertakan, berikan beberapa opsi konfigurasi seperti jalur penyimpanan persisten Anda, dan Toolkit akan menangani penyediaan dan penghubungan mikroservice yang menyusun instans Overleaf Server CE atau Pro Anda.

Dengan ini Anda bebas fokus pada penyesuaian pengalaman pengguna dan penerapan fitur spesifik yang menyusun instans on-premise Anda. Toolkit menangani semua kompleksitas di balik layar, memungkinkan penerapan instans Overleaf Anda yang disederhanakan.

{% hint style="info" %}
Untuk alasan kompatibilitas lama, kontainer utama Overleaf disebut `sharelatex`, dan berbasis pada `sharelatex/sharelatex` image Docker. Ini karena teknologi ini didasarkan pada basis kode ShareLaTeX, yang digabungkan ke dalam Overleaf. Lihat [artikel blog iniarrow-up-right](https://www.overleaf.com/blog/518-exciting-news-sharelatex-is-joining-overleaf) untuk detail selengkapnya. Pada suatu saat di masa depan, ini akan diubah namanya agar sesuai dengan skema penamaan Overleaf.
{% endhint %}

#### Arsitektur

Di dalam kontainer Overleaf, perangkat lunak berjalan sebagai sekumpulan mikroservice, yang dikelola oleh `runit`. Beberapa file yang lebih menarik di dalam kontainer adalah:

* `/etc/service/`: file inisialisasi untuk mikroservice.
* `/var/log/overleaf/`: log untuk setiap mikroservice.
* `/overleaf/services/`: kode untuk berbagai mikroservice.
* `/var/lib/overleaf/`: titik mount untuk data persisten (sesuai dengan direktori yang ditunjukkan oleh `OVERLEAF_DATA_PATH` di host).

#### Kontainer MongoDB dan Redis

Overleaf bergantung pada dua basis data eksternal: MongoDB dan Redis. Secara bawaan, Toolkit akan menyediakan sebuah kontainer untuk masing-masing basis data ini, selain kontainer Overleaf, sehingga totalnya tiga kontainer Docker.

{% hint style="info" %}
Jika Anda lebih suka terhubung ke instans MongoDB atau Redis yang sudah ada, Anda dapat melakukannya dengan mengatur pengaturan yang sesuai di [overleaf.rc](https://ayakaleaf-pro.ayaka.space/on-premises/id/memulai/pages/35874e9d931b0bd5e3c63cd948dbd9be0d29bf28#the-overleaf.rc-file) file konfigurasi.
{% endhint %}

#### Editor dan proses kompilasi

Bagian ini memberikan gambaran umum tentang penanganan dokumen dan proses kompilasi.

{% hint style="info" %}
Halaman ini menjelaskan proses kompilasi dengan Sandboxed Compiles yang tersedia hanya di Overleaf Pro. Di Server CE, proses kompilasi menggunakan subproses sederhana — ganti item yang merujuk pada sebuah **kontainer** dengan satu item **jalankan kompilasi dalam subproses**.
{% endhint %}

Komponen / Pelaku:

* `pengguna` — Seorang pengguna aplikasi
* `editor` — Aplikasi klien yang berjalan di browser
* `clsi` — Mikroservice yang digunakan untuk mengompilasi PDF
* `document-updater` — Mikroservice yang digunakan untuk memproses pembaruan dokumen
* `filestore` — Mikroservice yang menangani file biner
* `real-time` — Mikroservice yang digunakan untuk menangani soket web
* `web` — Mikroservice (yang tidak terlalu) mikro yang digunakan untuk menangani permintaan API

**Penyimpanan cache Redis**

* **pengguna**: memuat halaman editor
* **editor**: membuka soket web
* **editor**: mengirim permintaan untuk membuka dokumen melalui soket web
  * **real-time** -> **document-updater**: dokumen dimuat dari MongoDB ke Redis
* **editor**: mengirim pembaruan dokumen melalui soket web
  * **real-time** -> **document-updater**: dokumen diperbarui di Redis
* **editor**: mengirim lebih banyak permintaan kompilasi
  * Setelah 5 menit berlalu sejak flush terakhir (per dokumen):
    * **document-updater**: flush dokumen dari Redis ke MongoDB
* **editor**: mengirim lebih banyak pembaruan
  * setiap 100 pembaruan (per dokumen):
    * **document-updater**: flush riwayat dokumen dari Redis ke MongoDB
* **pengguna**: meninggalkan editor/menutup tab browser
  * 5 menit kemudian
    * **real-time**: memeriksa kolaborator lain, jika tidak ada:
      * **real-time** -> **document-updater**: melakukan flush dokumen dari Redis ke MongoDB

**Membaca dari MongoDB ke Redis**

* **document-updater** -> **web** -> **docstore**: membaca dari MongoDB

**Flush dari Redis ke MongoDB**

* **document-updater** -> **web** -> **docstore**: menulis ke MongoDB

**Kompilasi — mode sinkronisasi "penuh"**

* **editor**: mengirim permintaan kompilasi dengan sync-mode disetel ke "full"
* **web** -> **document-updater**: setiap dokumen di-flush dari Redis ke MongoDB
* **web** -> **docstore**: semua dokumen diunduh dari MongoDB
* **web** -> **clsi**: permintaan kompilasi dikirim ke `clsi`, termasuk:
  * sync-mode
  * sebuah hash dari pohon file -> "status proyek"
  * semua dokumen beserta isinya -> tunduk pada batas ukuran body permintaan 7 MB
  * URL file biner untuk diunduh terpisah
* **clsi**: memeriksa status di disk dengan sync-mode dan "status proyek"
  * ini adalah sinkronisasi penuh, jadi status di disk sebelumnya dapat diabaikan
* **clsi**: membersihkan direktori kompilasi
* **clsi**: menulis semua dokumen ke direktori kompilasi
* **clsi**: menulis semua file biner ke direktori kompilasi
  * `clsi` menyalin file dari cache lokal per-proyek
  * saat cache miss:
    * **clsi** -> **filestore**: mengunduh file
* **clsi**: menulis "status proyek"
* **clsi**: memastikan kontainer docker ada dengan konfigurasi yang diinginkan
  * membangun opsi kontainer, termasuk versi texlive
  * membuat hash opsi
  * nama kontainer: `project-<project-id>-<user-id>-<hash>`
* **clsi**: memulai kontainer dan men-stream stdout/stderr ke memori -> batas 2 MB
* **clsi**: meninggalkan kontainer yang berhenti -> dibersihkan setelah 24 jam
* **clsi**: menulis stdout/stderr ke disk
* **clsi**: menyalin file keluaran ke direktori keluaran unik
  * build-id terdiri dari 8 byte acak ditambah stempel waktu dengan presisi ms
  * hapus semua kecuali 3 folder build terakhir (anonim) / 1 folder build terakhir (pengguna yang masuk)
* **clsi**: kompilasi gagal/timeout
  * hapus cache kompilasi — mungkin ada file parsial/cache rusak
* **editor**: mengunduh output.log dan output.pdf

**Kompilasi — mode sinkronisasi "inkremental"**

* **editor**: mengirim permintaan kompilasi dengan sync-mode disetel ke "incremental"
* **web** -> **document-updater**: ambil dokumen apa pun dari Redis
  * hash "status proyek" juga disimpan di Redis
  * **web** mengirim hash pohon file ke `document-updater` dan `document-updater` dapat mengubah kompilasi inkremental menjadi kompilasi penuh saat tidak cocok
    * lihat proses kompilasi sebagaimana dilakukan ketika editor meminta kompilasi "penuh"
* **web** -> **clsi**: permintaan kompilasi dikirim ke `clsi`, termasuk:
  * sync-mode
  * sebuah hash dari pohon file -> "status proyek"
  * semua dokumen dari Redis beserta isinya -> tunduk pada batas ukuran body permintaan 7 MB
  * tidak ada file biner
* **clsi**: memeriksa status di disk dengan sync-mode dan "status proyek"
  * ini adalah sinkronisasi inkremental, jadi "status proyek" harus cocok
  * jika tidak cocok: balas dengan 409, biarkan web mencoba ulang dengan sinkronisasi "penuh"
    * lihat proses kompilasi sebagaimana dilakukan ketika editor meminta kompilasi "penuh"
* **clsi**: menulis dokumen yang diperbarui ke direktori kompilasi
* **clsi**: memastikan kontainer docker ada dengan konfigurasi yang diinginkan
  * membangun opsi kontainer, termasuk versi texlive
  * membuat hash opsi
  * nama kontainer: `project-<project-id>-<user-id>-<hash>`
* **clsi**: memulai kontainer dan men-stream stdout/stderr ke memori -> batas 2 MB
* **clsi**: meninggalkan kontainer yang berhenti -> dibersihkan setelah 24 jam
* **clsi**: menulis stdout/stderr ke disk
* **clsi**: menyalin file keluaran ke direktori keluaran unik
  * build-id terdiri dari 8 byte acak ditambah stempel waktu dengan presisi ms
  * hapus semua kecuali 3 folder build terakhir (anonim) / 1 folder build terakhir (pengguna yang masuk)
* **clsi**: kompilasi gagal/timeout
  * hapus cache kompilasi — mungkin ada file parsial/cache rusak
* **editor**: mengunduh output.log dan output.pdf

**Kompilasi — berpindah antara mode**

* **editor**: mengamati kegagalan kompilasi, kompilasi berikutnya adalah kompilasi "penuh"
* **editor**: mengamati kompilasi berhasil, kompilasi berikutnya adalah kompilasi "inkremental"


---

# 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/id/memulai/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.
