> 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/konfigurasi/overleaf-toolkit/kompilasi-dalam-sandbox.md).

# Kompilasi dalam sandbox

Overleaf Pro dilengkapi opsi untuk menjalankan kompilasi di lingkungan sandbox yang aman untuk keamanan perusahaan. Hal ini dilakukan dengan menjalankan setiap proyek di lingkungan Docker yang aman miliknya sendiri.

### Keamanan yang ditingkatkan

Sandboxed Compiles adalah pendekatan yang direkomendasikan untuk Server Pro karena banyak dokumen LaTeX memerlukan/memiliki kemampuan untuk mengeksekusi perintah shell arbitrer sebagai bagian dari proses kompilasi PDF. Jika Anda menggunakan Sandboxed Compiles, setiap kompilasi berjalan dalam kontainer Docker terpisah dengan kemampuan terbatas yang tidak dibagikan dengan pengguna atau proyek lain mana pun dan tidak memiliki akses ke sumber daya luar seperti jaringan host.

{% hint style="warning" %}
Jika Anda mencoba menjalankan Overleaf Pro **tanpa** Sandboxed Compiles, kompilasi berjalan bersama kompilasi lain yang berlangsung bersamaan di dalam kontainer Docker utama dan pengguna memiliki akses baca dan tulis penuh ke `sharelatex` sumber daya kontainer (filesystem, jaringan, dan variabel lingkungan) saat menjalankan kompilasi LaTeX.
{% endhint %}

### Pengelolaan paket yang lebih mudah

Untuk menghindari pemasangan paket secara manual, kami merekomendasikan untuk mengaktifkan Sandboxed Compiles. Ini adalah pengaturan yang dapat dikonfigurasi di Server Pro yang akan memberikan pengguna Anda akses ke lingkungan TeX Live yang sama seperti di overleaf.com tetapi di dalam instalasi on-premise milik Anda sendiri. Citra TeX Live yang digunakan oleh Sandboxed Compiles berisi paket dan font paling populer yang telah diuji terhadap template galeri kami, memastikan kompatibilitas maksimal dengan proyek on-premise.

Mengaktifkan Sandboxed Compiles memungkinkan Anda mengonfigurasi versi TeX Live mana yang dapat dipilih pengguna di dalam proyek mereka, sekaligus menetapkan versi citra TeX Live default untuk proyek baru.

{% hint style="info" %}
Jika Anda mencoba menjalankan Overleaf Pro tanpa Sandboxed Compiles, instance Anda secara default akan menggunakan versi skema dasar TeX Live untuk kompilasi. Versi dasar ini ringan dan hanya berisi subset paket LaTeX yang sangat terbatas, yang kemungkinan besar akan menyebabkan kesalahan paket hilang bagi pengguna Anda, terutama jika mereka mencoba menggunakan template yang sudah dibuat sebelumnya.
{% endhint %}

Karena Overleaf Pro dirancang untuk bekerja secara offline, tidak ada cara otomatis untuk mengintegrasikan template galeri overleaf.com ke instalasi on-premise Anda; namun, hal ini dapat dilakukan secara manual per template. Untuk informasi lebih lanjut tentang cara kerjanya, silakan lihat panduan kami untuk memindahkan template dari overleaf.com: [/pages/c47180bb8a0ba68611dc7f5b64a2bc9a299f5c96#transferring-templates-from-overleaf.com](https://overleaf-pro.ayaka.space/on-premises/id/konfigurasi/overleaf-toolkit/pages/c47180bb8a0ba68611dc7f5b64a2bc9a299f5c96#transferring-templates-from-overleaf.com "mention").

{% hint style="info" %}
Sandboxed Compiles mengharuskan `sharelatex` kontainer memiliki akses ke socket Docker pada mesin host (melalui bind mount) sehingga dapat mengelola kontainer kompilasi saudara ini.
{% endhint %}

## Cara kerjanya

Saat Sandboxed Compiles diaktifkan, socket Docker akan di-mount dari mesin host ke `sharelatex` kontainer, sehingga layanan compiler di dalam kontainer dapat membuat kontainer Docker baru di host. Kemudian untuk setiap kali compiler dijalankan di setiap proyek, layanan compiler LaTeX (CLSI) akan melakukan hal berikut:

* Menulis file-file proyek ke lokasi di dalam `OVERLEAF_DATA_PATH`.
* Menggunakan socket Docker yang di-mount untuk membuat `texlive` kontainer baru untuk proses kompilasi.
* Membuat `texlive` kontainer membaca data proyek dari lokasi di bawah `OVERLEAF_DATA_PATH`.
* Mengompilasi proyek di dalam `texlive` kontainer.

### Mengaktifkan Sandboxed Compiles&#xD;

#### Untuk Pengguna Toolkit

Untuk mengaktifkan sandboxed compiles (juga dikenal sebagai kontainer saudara/sibling), atur opsi konfigurasi berikut di `overleaf-toolkit/config/overleaf.rc`:

{% code title="config/overleaf.rc" %}

```dotenv
SERVER_PRO=true
SIBLING_CONTAINERS_ENABLED=true
```

{% endcode %}

#### Untuk Pengguna Docker Compose <a href="#docker-compose-example" id="docker-compose-example"></a>

{% hint style="danger" %}
Mulai dari Overleaf CE/Server Pro `5.0.3` variabel lingkungan telah diganti mereknya dari `SHARELATEX_*` menjadi `OVERLEAF_*`.
{% endhint %}

Jika Anda menggunakan `4.x` versi (atau yang lebih awal) pastikan variabel diberi awalan yang sesuai (misalnya `SHARELATEX_MONGO_URL` bukannya `OVERLEAF_MONGO_URL`).

<pre class="language-yml"><code class="lang-yml">version: '2'
services:
    sharelatex:
        #...
        volumes:
            - /data/overleaf_data:/var/lib/overleaf
<strong>            - /var/run/docker.sock:/var/run/docker.sock
</strong>        environment:
            #...
<strong>            DOCKER_RUNNER: "true"
</strong><strong>            SANDBOXED_COMPILES: "true"
</strong><strong>            SANDBOXED_COMPILES_HOST_DIR: "/data/overleaf_data/data/compiles"
</strong>            #...
        #...
</code></pre>

### Mengubah Citra TexLive

{% hint style="info" %}
Untuk pengguna daratan Tiongkok, Anda dapat menggunakan `ghcr.nju.edu.cn` untuk mempercepat unduhan Anda.&#x20;
{% endhint %}

Overleaf Pro menggunakan tiga variabel lingkungan untuk menentukan citra TeX Live mana yang akan digunakan untuk Sandboxed Compiles:

* `TEX_LIVE_DOCKER_IMAGE` **(diperlukan),** Citra TeX Live default yang digunakan untuk mengompilasi proyek baru. Citra ini harus disertakan dalam `ALL_TEX_LIVE_DOCKER_IMAGES`.
* `ALL_TEX_LIVE_DOCKER_IMAGE_NAMES` **(diperlukan),** Daftar nama ramah yang dipisahkan dengan koma untuk citra, digunakan untuk opsi frontend.
* `ALL_TEX_LIVE_DOCKER_IMAGES` **(diperlukan),** Daftar citra TeX Live yang dipisahkan dengan koma untuk digunakan. Jika Overleaf Toolkit digunakan untuk deployment, citra ini akan diunduh atau diperbarui. Untuk melewati pengunduhan, atur `SIBLING_CONTAINERS_PULL=false` di `config/overleaf.rc`.

Saat memulai instance Overleaf Pro Anda menggunakan `bin/up` perintah, Toolkit akan secara otomatis menarik semua citra yang tercantum dalam `ALL_TEX_LIVE_DOCKER_IMAGES`.

Berikut contohnya, di mana kami menetapkan TeX Live 2025 sebagai default untuk proyek baru, dan tetap menggunakan 2024 untuk proyek yang sudah ada.

{% code title="config/variables.env" overflow="wrap" %}

```dotenv
ALL_TEX_LIVE_DOCKER_IMAGES=ghcr.io/ayaka-notes/texlive-full:2025.1, ghcr.io/ayaka-notes/texlive-full:2024.1
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=Texlive 2025, Texlive 2024
TEX_LIVE_DOCKER_IMAGE=ghcr.io/ayaka-notes/texlive-full:2025.1
```

{% endcode %}

{% hint style="danger" %}
Sangat disarankan untuk menetapkan **setidaknya 2 citra texlive-full**. Untuk alasan terperinci, lihat [#known-issues](#known-issues "mention")
{% endhint %}

### Citra TeX Live yang tersedia

Ini adalah serangkaian citra TeX Live yang dioptimalkan khusus untuk Overleaf, juga dapat ditambahkan ke `TEX_LIVE_DOCKER_IMAGE` dan `ALL_TEX_LIVE_DOCKER_IMAGES`:&#x20;

* `ghcr.io/ayaka-notes/texlive-full:2025.1` (Juga `terbaru` tag)
* `ghcr.io/ayaka-notes/texlive-full:2024.1`
* `ghcr.io/ayaka-notes/texlive-full:2023.1`
* `ghcr.io/ayaka-notes/texlive-full:2022.1`
* `ghcr.io/ayaka-notes/texlive-full:2021.1`
* `ghcr.io/ayaka-notes/texlive-full:2020.1`

{% hint style="warning" %}
Ada skema ketat mengenai bagaimana citra **harus** diberi tag (regex berikut berlaku `^[0-9]+.[0-9]+`, yang angka pertama menentukan tahun TeX Live dan angka kedua versi patch).
{% endhint %}

### Bisakah Saya Menggunakan Registry Citra Lain

> Beberapa orang mungkin bertanya apakah saya bisa mengganti `ghcr.io` dengan situs mirror lain, atau mengganti texlive ke citra lain dari docker hub?

Tidak, kami tidak merekomendasikannya karena konfigurasinya relatif rumit. Jika Anda mengunduh dari situs mirror, Anda dapat mengganti nama citra Anda menjadi `ghcr.io/ayaka-notes/texlive-full`.

Namun, jika Anda benar-benar ingin menggunakan Image Registry Anda sendiri, silakan tambahkan:

{% code title="config/variables.env" overflow="wrap" %}

```dotenv
IMAGE_ROOT=hub.your.com/your-repo
```

{% endcode %}

Kemudian, Anda perlu memastikan semua citra texlive berada di `your-repo`, seperti

* `hub.your.com/your-repo/texlive-full:2025.1`
* `hub.your.com/your-repo/texlive-full:2024.1`

Untuk informasi terperinci, baca kode sumber di bawah ini untuk memahami bagaimana kami memproses variabel lingkungan Anda:

{% code title="sandboxed-compiles/index.mjs" overflow="wrap" expandable="true" %}

```mjs
if (process.env.SANDBOXED_COMPILES === 'true') {
  // Tetapkan root citra default jika tidak disediakan
  let imageRootPath = process.env.IMAGE_ROOT || "ghcr.io/ayaka-notes";
  // Ekspor imageRoot ke Settings
  Settings.imageRoot = imageRootPath

  // allowedImageNames seharusnya:
  // [
  //  { imageName: "texlive-2023:latest", imageDesc: "TeX Live 2023" },
  //  { imageName: "texlive-2022:latest", imageDesc: "TeX Live 2022" },
  // ]
  Settings.allowedImageNames = parseTextExtensions(process.env.ALL_TEX_LIVE_DOCKER_IMAGES)
    .map((texImage, index) => ({
      imageName: texImage.split("/")[texImage.split("/").length - 1],
      imageDesc: parseTextExtensions(process.env.ALL_TEX_LIVE_DOCKER_IMAGE_NAMES)[index]
        || texImage.split(':')[1],
    }))
  
  // Pada akhirnya, imageName akan digabungkan dengan imageRoot untuk membentuk path citra lengkap
  // Nama lengkapnya akan seperti: ghcr.io/ayaka-notes/texlive-2023:latest

  // Tetapkan nama citra default jika tidak disediakan
  if(!process.env.TEX_LIVE_DOCKER_IMAGE) {
    process.env.TEX_LIVE_DOCKER_IMAGE = imageRootPath + "/" + Settings.allowedImageNames[0].imageName
  }

  // Ekspor currentImageName ke Settings
  // Ini adalah nama citra dari proyek yang baru dibuat
  Settings.currentImageName = process.env.TEX_LIVE_DOCKER_IMAGE
}
```

{% endcode %}

### Masalah yang Diketahui

> Menggunakan `6.0.1-ext-v3.3`, saya memiliki pengaturan ini di `variables.env`:
>
> ```dotenv
> TEX_LIVE_DOCKER_IMAGE=texlive/texlive:latest-full
> ALL_TEX_LIVE_DOCKER_IMAGES=texlive/texlive:latest-full
> ```
>
> Ini berfungsi dengan baik dengan `texlive/texlive:latest-full`. Namun, saya menarik citra texlive lain `danteev/texlive:2025-10-15` dan mengubah kedua variabel ini ke nama citra yang baru tetapi tidak berhasil:
>
> ```dotenv
> TEX_LIVE_DOCKER_IMAGE=danteev/texlive:2025-10-15
> ALL_TEX_LIVE_DOCKER_IMAGES=danteev/texlive:2025-10-15
> ```
>
> Di log, saya melihat hal berikut:
>
> {% code overflow="wrap" %}
>
> ```
> {"name":"clsi","level":50,"err":{"message":"(HTTP code 404) no such container - No such image: texlive/texlive:latest-full ","name":"Error","stack":"Error: (HTTP code 404) no such container - No such image: texlive/texlive:latest-full ... 
> ```
>
> {% endcode %}
>
> Sepertinya pengaturan yang diperbarui di `variables.env` tidak diterapkan. Kompilasi masih mencoba menjalankan `texlive/texlive:latest-full` citra tersebut, bukan citra baru.
>
> Saya sudah mencoba me-reboot, menghapus kontainer, dan menjalankan ulang, tetapi masalahnya tetap sama.
>
> Ada solusi?

Karena beberapa keterbatasan teknis, jika Anda hanya menyiapkan satu citra Docker TeXLive, seperti `texlive-fullA:latest`&#x20;

```
ALL_TEX_LIVE_DOCKER_IMAGES=texlive/texliveA:latest-full
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=TeXLiveA
TEX_LIVE_DOCKER_IMAGE=texlive/texliveA:latest-full
```

Dan setelah menjalankan instance overleaf Anda selama beberapa saat, Anda mungkin ingin mengubah citra TeXLive menjadi `texlive-fullB:latest`. Maka, Anda akan melihat bahwa pengguna Anda tidak dapat mengompilasi semua proyek.

```
ALL_TEX_LIVE_DOCKER_IMAGES=texlive/texliveA:latest-full
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=TeXLiveA
TEX_LIVE_DOCKER_IMAGE=texlive/texliveA:latest-full
```

Ini karena nama citra TeXLive-Full (untuk kompilasi sandbox) di setiap proyek disimpan secara persisten di database. *Hanya ketika pengguna mengganti versi TeXLive proyeknya, misalnya dari 2024 ke 2025, nama citra akan diubah di database*.

Saat CLSI mengompilasi sebuah proyek, ia menggunakan nama citra kontainer yang ditemukan di database untuk langsung mengompilasi proyek tersebut.

Jika Anda hanya menyediakan satu citra Docker, pengguna tidak akan dapat memodifikasi citra yang digunakan untuk mengompilasi proyek. Dalam kasus ini, Anda perlu menulis skrip untuk **memodifikasi secara manual** citra TeXLive untuk semua proyek pengguna di mongoDB.

### Debug

Jalankan perintah berikut untuk memeriksa log clsi dari toolkit:

{% code overflow="wrap" %}

```bash
bin/logs clsi
```

{% endcode %}


---

# 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/konfigurasi/overleaf-toolkit/kompilasi-dalam-sandbox.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.
