> 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/konfigurasi/overleaf-toolkit/sandboxed-compiles.md).

# Kompilasi Sandbox

Overleaf Pro dilengkapi opsi untuk menjalankan kompilasi dalam lingkungan sandbox yang aman demi keamanan tingkat enterprise. Ini dilakukan dengan menjalankan setiap proyek di lingkungan Docker aman miliknya sendiri.

### Keamanan yang ditingkatkan

Sandboxed Compiles adalah pendekatan yang direkomendasikan untuk Server Pro karena banyak dokumen LaTeX memerlukan/memiliki kemampuan untuk menjalankan perintah shell arbitrer sebagai bagian dari proses kompilasi PDF. Jika Anda menggunakan Sandboxed Compiles, setiap kompilasi berjalan di dalam container Docker terpisah dengan kapabilitas terbatas yang tidak dibagikan kepada pengguna atau proyek lain 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 berjalan bersamaan di dalam container Docker utama dan pengguna memiliki akses baca-tulis penuh ke `sharelatex` sumber daya container (filesystem, jaringan, dan variabel lingkungan) saat menjalankan kompilasi LaTeX.
{% endhint %}

### Manajemen paket yang lebih mudah

Untuk menghindari pemasangan paket secara manual, kami merekomendasikan mengaktifkan Sandboxed Compiles. Ini adalah pengaturan yang dapat dikonfigurasi di Server Pro yang akan memberi pengguna Anda akses ke lingkungan TeX Live yang sama seperti di overleaf.com tetapi dalam instalasi on-premise Anda sendiri. Image TeX Live yang digunakan oleh Sandboxed Compiles berisi paket dan font paling populer yang telah diuji terhadap template galeri kami, sehingga memastikan kompatibilitas maksimum 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 image 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 mengakibatkan kesalahan paket hilang bagi pengguna Anda, terutama jika mereka mencoba menggunakan template bawaan.
{% 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 pemindahan template dari overleaf.com kami: [/pages/c47180bb8a0ba68611dc7f5b64a2bc9a299f5c96#transferring-templates-from-overleaf.com](https://ayakaleaf-pro.ayaka.space/on-premises/id/konfigurasi/overleaf-toolkit/pages/c47180bb8a0ba68611dc7f5b64a2bc9a299f5c96#transferring-templates-from-overleaf.com "mention").

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

## Cara kerjanya

Saat Sandboxed Compiles diaktifkan, soket Docker akan di-mount dari mesin host ke dalam `sharelatex` container, sehingga layanan compiler di dalam container dapat membuat container Docker baru di host. Lalu, untuk setiap eksekusi compiler di setiap proyek, layanan compiler LaTeX (CLSI) akan melakukan hal berikut:

* Menulis file proyek ke lokasi di dalam `OVERLEAF_DATA_PATH`.
* Menggunakan soket Docker yang di-mount untuk membuat sebuah `texlive` container untuk proses kompilasi.
* Meminta `texlive` container membaca data proyek dari lokasi di bawah `OVERLEAF_DATA_PATH`.
* Kompilasi proyek di dalam `texlive` container.

### Mengaktifkan Sandboxed Compiles

#### Untuk Pengguna Toolkit

Untuk mengaktifkan kompilasi sandboxed (juga dikenal sebagai Sibling containers), 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 (mis. `SHARELATEX_MONGO_URL` bukan `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 Image TexLive

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

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

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

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

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

{% tabs %}
{% tab title="instalasi umum" %}
Konfigurasi berikut menginstal semua image Docker TeX Live penuh dari 2025 hingga 2026. Kami merekomendasikan memiliki setidaknya 80 GB penyimpanan yang tersedia sebelum menggunakan konfigurasi ini.

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

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

{% endcode %}
{% endtab %}

{% tab title="instalasi penuh" %}
Konfigurasi berikut menginstal semua image Docker TeX Live penuh dari 2020 hingga 2026. Kami merekomendasikan memiliki setidaknya 256 GB penyimpanan yang tersedia sebelum menggunakan konfigurasi ini.

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

```dotenv
ALL_TEX_LIVE_DOCKER_IMAGES=ghcr.io/ayaka-notes/texlive-full:2026.1,ghcr.io/ayaka-notes/texlive-full:2025.1,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
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=Texlive 2026,Texlive 2025,Texlive 2024,Texlive 2023,Texlive 2022,Texlive 2021,Texlive 2020
TEX_LIVE_DOCKER_IMAGE=ghcr.io/ayaka-notes/texlive-full:2026.1
```

{% endcode %}
{% endtab %}
{% endtabs %}

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

### Image TeX Live yang tersedia

Ini adalah serangkaian image TeX Live yang dioptimalkan khusus untuk Overleaf, dan juga dapat ditambahkan ke `TEX_LIVE_DOCKER_IMAGE` dan `ALL_TEX_LIVE_DOCKER_IMAGES`:

* `ghcr.io/ayaka-notes/texlive-full:2026.1` (Juga `latest` tag)
* `ghcr.io/ayaka-notes/texlive-full:2025.1`
* `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 image **harus** diberi tag (regex berikut berlaku `^[0-9]+.[0-9]+`, di mana angka pertama menentukan tahun TeX Live dan angka kedua versi patch).
{% endhint %}

### Dapatkah Saya Menggunakan Registry Image Lain

> Beberapa orang mungkin bertanya-tanya apakah saya bisa mengganti `ghcr.io` dengan situs mirror lain, atau mengganti texlive ke image lain dari Docker Hub?

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

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

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

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

{% endcode %}

Lalu, Anda perlu memastikan semua image 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 detail, baca kode sumber di bawah untuk memahami cara kami memproses variabel env Anda:

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

```mjs
if (process.env.SANDBOXED_COMPILES === 'true') {
  // Tetapkan root image default jika belum 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 image lengkap
  // Nama lengkapnya akan seperti: ghcr.io/ayaka-notes/texlive-2023:latest

  // Tetapkan nama image default jika belum 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 image untuk proyek yang baru dibuat
  Settings.currentImageName = process.env.TEX_LIVE_DOCKER_IMAGE
}
```

{% endcode %}

### Masalah yang Diketahui

Ini adalah kasus nyata dari komunitas Overleaf:

> Menggunakan `6.0.1-ext-v3.3`, saya memiliki pengaturan berikut 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 mengunduh image texlive lain `danteev/texlive:2025-10-15` dan mengubah kedua variabel ini ke nama image baru, tetapi tidak berfungsi:
>
> ```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) tidak ada container seperti itu - Tidak ada image: texlive/texlive:latest-full ","name":"Error","stack":"Error: (HTTP code 404) tidak ada container seperti itu - Tidak ada image: texlive/texlive:latest-full ... 
> ```
>
> {% endcode %}
>
> Sepertinya pengaturan yang diperbarui di `variables.env` tidak berlaku. Kompilasi masih mencoba menjalankan `texlive/texlive:latest-full` image lama, bukan image baru.
>
> Saya mencoba reboot, menghapus container, dan menjalankannya ulang, tetapi masalahnya tetap sama.
>
> Ada solusi?

Karena beberapa keterbatasan teknis, jika Anda hanya menyiapkan satu image Docker TeXLive, seperti `texlive-fullA:latest`

```
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 waktu, Anda mungkin ingin mengubah image 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 image TeXLive-Full (untuk kompilasi sandbox) di setiap proyek disimpan secara permanen di basis data. *Hanya ketika pengguna mengganti versi TeXLive proyeknya, misalnya dari 2024 ke 2025, nama image akan diubah di basis data*.

Saat CLSI mengompilasi proyek, ia menggunakan nama image container yang ditemukan di basis data untuk langsung mengompilasi proyek.

Jika Anda hanya menyediakan satu image Docker, pengguna tidak akan dapat mengubah image yang digunakan untuk mengompilasi proyek. Dalam kasus ini, Anda perlu menulis skrip untuk **memodifikasi secara manual** image 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://ayakaleaf-pro.ayaka.space/on-premises/id/konfigurasi/overleaf-toolkit/sandboxed-compiles.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.
