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

# Layanan mikro

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 mengabstraksikan orkestrasi microservice yang diperlukan. Cukup jalankan skrip inisialisasi bawaan, berikan beberapa opsi konfigurasi seperti jalur penyimpanan persisten Anda, dan Toolkit akan menangani penyediaan serta penyambungan microservice yang membentuk instans Overleaf Server CE atau Pro Anda.

Ini membebaskan Anda untuk fokus pada penyesuaian pengalaman pengguna dan penerapan fitur spesifik yang membentuk instans on-premise Anda. Toolkit menangani semua kompleksitas di balik layar, sehingga memungkinkan penerapan instans Overleaf Anda yang lebih sederhana.

{% hint style="info" %}
Untuk alasan kompatibilitas lama, kontainer Overleaf utama disebut `sharelatex`, dan berbasis pada `sharelatex/sharelatex` image Docker. Ini karena teknologinya berbasis 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 lebih lanjut. Pada suatu saat di masa depan, ini akan diganti namanya agar sesuai dengan skema penamaan Overleaf.
{% endhint %}

#### Arsitektur

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

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

#### Kontainer MongoDB dan Redis

Overleaf bergantung pada dua basis data eksternal: MongoDB dan Redis. Secara bawaan, Toolkit akan menyediakan satu kontainer untuk masing-masing basis data ini, selain kontainer Overleaf, sehingga totalnya ada 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://overleaf-pro.ayaka.space/on-premises/id/memulai/pages/35874e9d931b0bd5e3c63cd948dbd9be0d29bf28#the-overleaf.rc-file) file konfigurasi.
{% endhint %}

#### Proses editor dan 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 ke sebuah **kontainer** dengan satu item **jalankan kompilasi dalam subproses**.
{% endhint %}

Komponen / Aktor:

* `pengguna` — Seorang pengguna aplikasi
* `editor` — Aplikasi klien yang berjalan di peramban
* `clsi` — Microservice yang digunakan untuk mengompilasi PDF
* `document-updater` — Microservice yang digunakan untuk memproses pembaruan dokumen
* `filestore` — Microservice yang menangani berkas biner
* `real-time` — Microservice yang digunakan untuk menangani soket web
* `web` — Microservice (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 peramban
  * 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**: baca dari MongoDB

**Melakukan flush dari Redis ke MongoDB**

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

**Kompilasi — mode sinkronisasi "full"**

* **editor**: mengirim permintaan kompilasi dengan sync-mode disetel ke "full"
* **web** -> **document-updater**: dokumen apa pun di-flush dari Redis ke MongoDB
* **web** -> **docstore**: semua dokumen diunduh dari MongoDB
* **web** -> **clsi**: permintaan kompilasi dikirim ke `clsi`, termasuk:
  * sync-mode
  * hash dari pohon berkas -> "status proyek"
  * semua dokumen beserta isinya -> tunduk pada batas ukuran badan permintaan 7 MB
  * URL berkas biner untuk unduhan 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 berkas biner ke direktori kompilasi
  * `clsi` menyalin berkas dari cache lokal per proyek
  * jika cache miss:
    * **clsi** -> **filestore**: mengunduh berkas
* **clsi**: menulis "status proyek"
* **clsi**: memastikan kontainer docker ada dengan konfigurasi yang diinginkan
  * membangun opsi kontainer, termasuk versi texlive
  * opsi hash
  * nama kontainer: `project-<project-id>-<user-id>-<hash>`
* **clsi**: memulai kontainer dan mengalirkan stdout/stderr ke memori -> batas 2 MB
* **clsi**: meninggalkan kontainer yang dihentikan -> dibersihkan setelah 24 jam
* **clsi**: menulis stdout/stderr ke disk
* **clsi**: menyalin berkas output ke direktori output unik
  * build-id terdiri dari 8 byte acak ditambah cap waktu dengan presisi ms
  * hapus semua kecuali 3 folder build terakhir (anonim) / 1 folder build terakhir (pengguna yang masuk)
* **clsi**: kompilasi gagal/kehabisan waktu
  * hapus cache kompilasi — mungkin ada berkas parsial/cache yang rusak
* **editor**: mengunduh output.log dan output.pdf

**Kompilasi — mode sinkronisasi "incremental"**

* **editor**: mengirim permintaan kompilasi dengan sync-mode disetel ke "incremental"
* **web** -> **document-updater**: mengambil dokumen apa pun dari Redis
  * hash "status proyek" juga disimpan di Redis
  * **web** mengirim hash dari pohon berkas ke `document-updater` dan `document-updater` dapat mengubah kompilasi inkremental menjadi kompilasi penuh jika terjadi ketidakcocokan
    * lihat proses kompilasi sebagaimana dilakukan ketika editor meminta kompilasi "full"
* **web** -> **clsi**: permintaan kompilasi dikirim ke `clsi`, termasuk:
  * sync-mode
  * hash dari pohon berkas -> "status proyek"
  * semua dokumen dari Redis beserta isinya -> tunduk pada batas ukuran badan permintaan 7 MB
  * tidak ada berkas 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 lagi dengan sinkronisasi "full"
    * lihat proses kompilasi sebagaimana dilakukan ketika editor meminta kompilasi "full"
* **clsi**: menulis dokumen yang diperbarui ke direktori kompilasi
* **clsi**: memastikan kontainer docker ada dengan konfigurasi yang diinginkan
  * membangun opsi kontainer, termasuk versi texlive
  * opsi hash
  * nama kontainer: `project-<project-id>-<user-id>-<hash>`
* **clsi**: memulai kontainer dan mengalirkan stdout/stderr ke memori -> batas 2 MB
* **clsi**: meninggalkan kontainer yang dihentikan -> dibersihkan setelah 24 jam
* **clsi**: menulis stdout/stderr ke disk
* **clsi**: menyalin berkas output ke direktori output unik
  * build-id terdiri dari 8 byte acak ditambah cap waktu dengan presisi ms
  * hapus semua kecuali 3 folder build terakhir (anonim) / 1 folder build terakhir (pengguna yang masuk)
* **clsi**: kompilasi gagal/kehabisan waktu
  * hapus cache kompilasi — mungkin ada berkas parsial/cache yang rusak
* **editor**: mengunduh output.log dan output.pdf

**Kompilasi — beralih antar mode**

* **editor**: mengamati kegagalan kompilasi, kompilasi berikutnya adalah kompilasi "full"
* **editor**: mengamati keberhasilan kompilasi, kompilasi berikutnya adalah kompilasi "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/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.
