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

# Sandboxed Compiles

Το Overleaf Pro συνοδεύεται από την επιλογή να εκτελεί μεταγλωττίσεις σε ένα ασφαλές περιβάλλον sandbox για ασφάλεια επιπέδου enterprise. Αυτό το επιτυγχάνει εκτελώντας κάθε έργο στο δικό του ασφαλές περιβάλλον docker.

### Βελτιωμένη ασφάλεια

Οι μεταγλωττίσεις σε sandbox (Sandboxed Compiles) είναι η προτεινόμενη προσέγγιση για το Server Pro, λόγω του ότι πολλά έγγραφα LaTeX απαιτούν/έχουν τη δυνατότητα να εκτελούν αυθαίρετες εντολές shell ως μέρος της διαδικασίας μεταγλώττισης PDF. Αν χρησιμοποιείτε Sandboxed Compiles, κάθε μεταγλώττιση εκτελείται σε ξεχωριστό Docker container με περιορισμένες δυνατότητες που δεν μοιράζονται με κανέναν άλλο χρήστη ή έργο και δεν έχει πρόσβαση σε εξωτερικούς πόρους, όπως το δίκτυο του host.

{% hint style="warning" %}
Αν προσπαθήσετε να εκτελέσετε το Overleaf Pro **χωρίς** Sandboxed Compiles, η μεταγλώττιση εκτελείται παράλληλα με άλλες ταυτόχρονες μεταγλωττίσεις μέσα στο κύριο Docker container και οι χρήστες έχουν πλήρη πρόσβαση ανάγνωσης και εγγραφής στους `sharelatex` πόρους του container (σύστημα αρχείων, δίκτυο και μεταβλητές περιβάλλοντος) κατά την εκτέλεση μεταγλωττίσεων LaTeX.
{% endhint %}

### Ευκολότερη διαχείριση πακέτων

Για να αποφύγετε τη μη αυτόματη εγκατάσταση πακέτων, συνιστούμε να ενεργοποιήσετε το Sandboxed Compiles. Πρόκειται για μια ρυθμιζόμενη ρύθμιση στο Server Pro που θα παρέχει στους χρήστες σας πρόσβαση στο ίδιο περιβάλλον TeX Live με αυτό στο overleaf.com, αλλά μέσα στη δική σας τοπική εγκατάσταση. Οι εικόνες TeX Live που χρησιμοποιούνται από το Sandboxed Compiles περιέχουν τα πιο δημοφιλή πακέτα και γραμματοσειρές που έχουν δοκιμαστεί με τα πρότυπα της γκαλερί μας, διασφαλίζοντας μέγιστη συμβατότητα με έργα τοπικής εγκατάστασης.

Η ενεργοποίηση του Sandboxed Compiles σάς επιτρέπει να ρυθμίσετε ποιες εκδόσεις TeX Live μπορούν να επιλέγουν οι χρήστες μέσα από το έργο τους, καθώς και να ορίσετε μια προεπιλεγμένη έκδοση εικόνας TeX Live για νέα έργα.

{% hint style="info" %}
Αν προσπαθήσετε να εκτελέσετε το Overleaf Pro χωρίς Sandboxed Compiles, η εγκατάστασή σας θα χρησιμοποιεί από προεπιλογή μια βασική έκδοση σχήματος του TeX Live για μεταγλωττίσεις. Αυτή η βασική έκδοση είναι ελαφριά και περιέχει μόνο ένα πολύ περιορισμένο υποσύνολο πακέτων LaTeX, κάτι που πολύ πιθανό θα οδηγήσει σε σφάλματα ελλειπόντων πακέτων για τους χρήστες σας, ειδικά αν προσπαθήσουν να χρησιμοποιήσουν έτοιμα πρότυπα.
{% endhint %}

Καθώς το Overleaf Pro έχει σχεδιαστεί για να λειτουργεί εκτός σύνδεσης, δεν υπάρχει αυτοματοποιημένος τρόπος ενσωμάτωσης των προτύπων της γκαλερί του overleaf.com στη δική σας τοπική εγκατάσταση· ωστόσο, είναι δυνατό να γίνει αυτό μη αυτόματα ανά πρότυπο. Για περισσότερες πληροφορίες σχετικά με το πώς λειτουργεί αυτό, δείτε τον οδηγό μας για τη μεταφορά προτύπων από το overleaf.com: [/pages/0ccb7c3011304e4a00d5682ba8daf59d82e2bd02#transferring-templates-from-overleaf.com](https://ayakaleaf-pro.ayaka.space/on-premises/el/diamorfosi/overleaf-toolkit/pages/0ccb7c3011304e4a00d5682ba8daf59d82e2bd02#transferring-templates-from-overleaf.com "mention").

{% hint style="info" %}
Το Sandboxed Compiles απαιτεί το `sharelatex` container να έχει πρόσβαση στο Docker socket στο σύστημα του host (μέσω ενός bind mount) ώστε να μπορεί να διαχειρίζεται αυτά τα αδελφικά containers μεταγλώττισης.
{% endhint %}

## Πώς λειτουργεί

Όταν το Sandboxed Compiles είναι ενεργοποιημένο, το Docker socket θα προσαρτηθεί από το host machine μέσα στο `sharelatex` container, ώστε η υπηρεσία μεταγλωττιστή μέσα στο container να μπορεί να δημιουργεί νέα Docker containers στον host. Στη συνέχεια, για κάθε εκτέλεση του μεταγλωττιστή σε κάθε έργο, η υπηρεσία μεταγλωττιστή LaTeX (CLSI) θα κάνει τα εξής:

* Γράφει τα αρχεία του έργου σε μια τοποθεσία μέσα στο `OVERLEAF_DATA_PATH`.
* Χρησιμοποιεί το προσαρτημένο Docker socket για να δημιουργήσει ένα νέο `texlive` container για την εκτέλεση της μεταγλώττισης.
* Κάνει το `texlive` container να διαβάσει τα δεδομένα του έργου από τη θέση κάτω από το `OVERLEAF_DATA_PATH`.
* Μεταγλωττίζει το έργο μέσα στο `texlive` container.

### Ενεργοποίηση του Sandboxed Compiles

#### Για χρήστες του Toolkit

Για να ενεργοποιήσετε τα sandboxed compiles (γνωστά και ως Sibling containers), ορίστε τις ακόλουθες επιλογές διαμόρφωσης στο `overleaf-toolkit/config/overleaf.rc`:

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

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

{% endcode %}

#### Για χρήστες του Docker Compose <a href="#docker-compose-example" id="docker-compose-example"></a>

{% hint style="danger" %}
Από το Overleaf CE/Server Pro και μετά `5.0.3` οι μεταβλητές περιβάλλοντος έχουν μετονομαστεί από `SHARELATEX_*` σε `OVERLEAF_*`.
{% endhint %}

Αν χρησιμοποιείτε μια `4.x` έκδοση (ή παλαιότερη) βεβαιωθείτε ότι οι μεταβλητές έχουν το κατάλληλο πρόθεμα (π.χ. `SHARELATEX_MONGO_URL` αντί `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>

### Αλλαγή της εικόνας TexLive

{% hint style="info" %}
Για χρήστες στην ηπειρωτική Κίνα, μπορείτε να χρησιμοποιήσετε το `ghcr.nju.edu.cn` για να επιταχύνετε τη λήψη σας.
{% endhint %}

Το Overleaf Pro χρησιμοποιεί τρεις μεταβλητές περιβάλλοντος για να καθορίσει ποιες εικόνες TeX Live θα χρησιμοποιήσει για το Sandboxed Compiles:

* `TEX_LIVE_DOCKER_IMAGE` **(απαιτείται),** Η προεπιλεγμένη εικόνα TeX Live που χρησιμοποιείται για τη μεταγλώττιση νέων έργων. Αυτή η εικόνα πρέπει να περιλαμβάνεται στο `ALL_TEX_LIVE_DOCKER_IMAGES`.
* `ALL_TEX_LIVE_DOCKER_IMAGE_NAMES` **(απαιτείται),** Μια λίστα φιλικών ονομάτων για τις εικόνες, διαχωρισμένων με κόμματα, που χρησιμοποιείται για επιλογές στο frontend.
* `ALL_TEX_LIVE_DOCKER_IMAGES` **(απαιτείται),** Μια λίστα εικόνων TeX Live προς χρήση, διαχωρισμένων με κόμματα. Αν χρησιμοποιείται το Overleaf Toolkit για ανάπτυξη, αυτές οι εικόνες θα ληφθούν ή θα ενημερωθούν. Για να παραλείψετε τη λήψη, ορίστε `SIBLING_CONTAINERS_PULL=false` στο `config/overleaf.rc`.

Όταν ξεκινάτε την εγκατάσταση του Overleaf Pro χρησιμοποιώντας την `bin/up` εντολή, το Toolkit θα κάνει αυτόματα pull όλες τις εικόνες που παρατίθενται στο `ALL_TEX_LIVE_DOCKER_IMAGES`.

Ακολουθεί ένα παράδειγμα όπου ορίζουμε ως προεπιλογή το TeX Live 2025 για νέα έργα και διατηρούμε το 2024 σε χρήση για υπάρχοντα έργα.

{% tabs %}
{% tab title="κοινή εγκατάσταση" %}
Η ακόλουθη διαμόρφωση εγκαθιστά όλες τις πλήρεις εικόνες TeX Live Docker από το 2025 έως το 2026. Συνιστούμε να έχετε τουλάχιστον 80 GB διαθέσιμου αποθηκευτικού χώρου πριν χρησιμοποιήσετε αυτήν τη διαμόρφωση.

{% 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="πλήρης εγκατάσταση" %}
Η ακόλουθη διαμόρφωση εγκαθιστά όλες τις πλήρεις εικόνες TeX Live Docker από το 2020 έως το 2026. Συνιστούμε να έχετε τουλάχιστον 256 GB διαθέσιμου αποθηκευτικού χώρου πριν χρησιμοποιήσετε αυτήν τη διαμόρφωση.

{% 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" %}
Συνιστάται ιδιαίτερα να ορίσετε **τουλάχιστον 2 εικόνες texlive-full**. Για αναλυτικό λόγο, δείτε [#known-issues](#known-issues "mention")
{% endhint %}

### Διαθέσιμες εικόνες TeX Live

Πρόκειται για μια σειρά εικόνων TeX Live που έχουν βελτιστοποιηθεί ειδικά για το Overleaf και μπορούν επίσης να προστεθούν στο `TEX_LIVE_DOCKER_IMAGE` και `ALL_TEX_LIVE_DOCKER_IMAGES`:

* `ghcr.io/ayaka-notes/texlive-full:2026.1` (Επίσης `latest` ετικέτα)
* `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" %}
Υπάρχει ένα αυστηρό σχήμα σχετικά με το πώς οι εικόνες **πρέπει** να επισημαίνονται (ισχύει το ακόλουθο regex `^[0-9]+.[0-9]+`, όπου ο πρώτος αριθμός καθορίζει το έτος TeX Live και ο δεύτερος την έκδοση διόρθωσης).
{% endhint %}

### Μπορώ να χρησιμοποιήσω άλλο registry εικόνων;

> Κάποιοι μπορεί να αναρωτιούνται αν μπορώ να αντικαταστήσω το `ghcr.io` με κάποιον άλλο mirror site ή να μεταφέρω το texlive σε άλλη εικόνα από το Docker Hub;

Όχι, δεν το συνιστούμε επειδή η διαμόρφωση είναι σχετικά περίπλοκη. Αν κάνετε λήψη από mirror site, μπορείτε να μετονομάσετε την εικόνα σας σε `ghcr.io/ayaka-notes/texlive-full`.

Αλλά, αν πραγματικά θέλετε να χρησιμοποιήσετε το δικό σας Image Registry, προσθέστε:

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

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

{% endcode %}

Στη συνέχεια, πρέπει να βεβαιωθείτε ότι όλες οι εικόνες του texlive βρίσκονται στο `your-repo`, όπως

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

Για λεπτομερείς πληροφορίες, διαβάστε τον παρακάτω πηγαίο κώδικα για να κατανοήσετε πώς αναλύουμε τη μεταβλητή περιβάλλοντός σας:

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

```mjs
if (process.env.SANDBOXED_COMPILES === 'true') {
  // Ορισμός προεπιλεγμένης ρίζας εικόνας αν δεν έχει δοθεί
  let imageRootPath = process.env.IMAGE_ROOT || "ghcr.io/ayaka-notes";
  // Εξαγωγή του imageRoot στις Ρυθμίσεις
  Settings.imageRoot = imageRootPath

  // Τα allowedImageNames θα πρέπει να είναι:
  // [
  //  { 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],
    }))
  
  // Στο τέλος, το imageName θα συνδυαστεί με το imageRoot για να σχηματίσει την πλήρη διαδρομή εικόνας
  // Το πλήρες όνομα θα είναι σαν: ghcr.io/ayaka-notes/texlive-2023:latest

  // Ορισμός προεπιλεγμένου ονόματος εικόνας αν δεν έχει δοθεί
  if(!process.env.TEX_LIVE_DOCKER_IMAGE) {
    process.env.TEX_LIVE_DOCKER_IMAGE = imageRootPath + "/" + Settings.allowedImageNames[0].imageName
  }

  // Εξαγωγή του currentImageName στις Ρυθμίσεις
  // Αυτό είναι το όνομα εικόνας για τα νεοδημιουργημένα έργα
  Settings.currentImageName = process.env.TEX_LIVE_DOCKER_IMAGE
}
```

{% endcode %}

### Γνωστά ζητήματα

Πρόκειται για πραγματική περίπτωση από την κοινότητα του Overleaf:

> Χρησιμοποιώντας `6.0.1-ext-v3.3`, έχω αυτές τις ρυθμίσεις στο `variables.env`:
>
> ```dotenv
> TEX_LIVE_DOCKER_IMAGE=texlive/texlive:latest-full
> ALL_TEX_LIVE_DOCKER_IMAGES=texlive/texlive:latest-full
> ```
>
> Αυτό λειτουργεί σωστά με το `texlive/texlive:latest-full`. Ωστόσο, τράβηξα μια άλλη εικόνα texlive `danteev/texlive:2025-10-15` και άλλαξα και τις δύο αυτές μεταβλητές στο νέο όνομα εικόνας, αλλά δεν λειτουργεί:
>
> ```dotenv
> TEX_LIVE_DOCKER_IMAGE=danteev/texlive:2025-10-15
> ALL_TEX_LIVE_DOCKER_IMAGES=danteev/texlive:2025-10-15
> ```
>
> Στα logs, βλέπω τα ακόλουθα:
>
> {% 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 %}
>
> Φαίνεται ότι οι ενημερωμένες ρυθμίσεις στο `variables.env` δεν εφαρμόζονται. Η μεταγλώττιση εξακολουθεί να προσπαθεί να εκτελέσει την `texlive/texlive:latest-full` εικόνα, όχι τη νέα εικόνα.
>
> Δοκίμασα επανεκκίνηση, διαγραφή των containers και επανεκτέλεση, αλλά παραμένει το ίδιο πρόβλημα.
>
> Υπάρχουν λύσεις;

Λόγω ορισμένων τεχνικών περιορισμών, αν ρυθμίσετε μόνο μία εικόνα Docker TeXLive, όπως `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
```

Και αφού εκτελέσετε την εγκατάσταση του overleaf για λίγο, ίσως θελήσετε να τροποποιήσετε την εικόνα TeXLive σε `texlive-fullB: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
```

Αυτό συμβαίνει επειδή το όνομα της εικόνας TeXLive-Full (για sandbox compile) σε κάθε έργο αποθηκεύεται στη βάση δεδομένων. *Μόνο όταν ο χρήστης αλλάξει την έκδοση TeXLive του έργου του, για παράδειγμα από το 2024 στο 2025, θα αλλάξει το όνομα της εικόνας στη βάση δεδομένων*.

Όταν το CLSI μεταγλωττίζει ένα έργο, χρησιμοποιεί το όνομα εικόνας του container που βρίσκεται στη βάση δεδομένων για να μεταγλωττίσει απευθείας το έργο.

Αν παρέχετε μόνο μία εικόνα Docker, οι χρήστες δεν θα μπορούν να τροποποιήσουν την εικόνα που χρησιμοποιείται για τη μεταγλώττιση του έργου. Σε αυτήν την περίπτωση, πρέπει να γράψετε ένα σενάριο για να **τροποποιήσετε χειροκίνητα** την εικόνα TeXLive για όλα τα έργα των χρηστών στη MongoDB.

### Αποσφαλμάτωση

Εκτελέστε την ακόλουθη εντολή για να ελέγξετε το log του clsi από το 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/el/diamorfosi/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.
