> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# TeX Live Full-Images automatisch aktualisieren

> Verwenden Sie cron, um die TeX Live-Docker-Images zu aktualisieren, die der Overleaf-kompatible Sandbox-Compiler nutzt.

Im Allgemeinen aktualisiert [using-the-toolkit](/de/on-premises/installation/using-the-toolkit "mention") bei jedem Ausführen von `bin/up` automatisch unser TeX Live Full-Image. Um manuelle Aktualisierungen zu vermeiden, können Sie die Aktualisierung Ihres TeX Live-Sandbox-Images mit dem folgenden Skript automatisieren. Fügen Sie es als Cronjob hinzu und stellen Sie sicher, dass der Cron-Benutzer die Berechtigung hat, `docker` auszuführen. Führen Sie `crontab -e` aus und fügen Sie die folgende Zeile am Ende hinzu.

```cron title="crontab -e" theme={null}
0 * * * * /usr/bin/flock -n /tmp/pull-texlive.lock /usr/local/bin/pull-texlive.sh
```

`flock -n` überspringt einen Lauf, solange der vorherige noch die Sperre hält, sodass sich langsame Pull-Vorgänge nie aufstauen.

<Tabs>
  <Tab title="Direkte Verbindung">
    ```bash title="/usr/local/bin/pull-texlive.sh" theme={null}
    #!/usr/bin/env bash
    set -uo pipefail

    IMAGE="ghcr.io/ayaka-notes/texlive-full"
    TAGS=(2020.1 2021.1 2022.1 2023.1 2024.1 2025.1 2026.1)
    LOG=/var/log/pull-texlive.log

    exec >>"$LOG" 2>&1

    # Hours since the epoch, modulo the tag count: one tag per hour,
    # so all 7 tags are refreshed every 7 hours.
    idx=$(( $(date +%s) / 3600 % ${#TAGS[@]} ))
    tag="${TAGS[$idx]}"

    echo "===== $(date -Is) pulling $tag (idx=$idx) ====="

    if timeout 50m docker pull "$IMAGE:$tag"; then
      echo "OK   $tag"
    else
      echo "FAIL $tag (exit $?)"
    fi

    docker image prune -f
    docker system df | tail -n +2
    ```
  </Tab>

  <Tab title="Mirror-Site verwenden">
    ```bash title="/usr/local/bin/pull-texlive.sh" theme={null}
    #!/usr/bin/env bash
    set -uo pipefail

    MIRROR="ghcr.nju.edu.cn"
    CANONICAL="ghcr.io"
    REPO="ayaka-notes/texlive-full"
    TAGS=(2020.1 2021.1 2022.1 2023.1 2024.1 2025.1 2026.1)
    LOG=/var/log/pull-texlive.log

    exec >>"$LOG" 2>&1

    # Hours since the epoch, modulo the tag count: one tag per hour,
    # so all 7 tags are refreshed every 7 hours.
    idx=$(( $(date +%s) / 3600 % ${#TAGS[@]} ))
    tag="${TAGS[$idx]}"

    echo "===== $(date -Is) pulling $tag (idx=$idx) via $MIRROR ====="

    if timeout 50m docker pull "$MIRROR/$REPO:$tag"; then
      # Retag to the canonical name the compiler is configured with. This only
      # adds a second name for the same layers; nothing is copied.
      docker tag "$MIRROR/$REPO:$tag" "$CANONICAL/$REPO:$tag"
      echo "OK   $tag"
    else
      echo "FAIL $tag (exit $?)"
    fi

    docker image prune -f
    docker system df | tail -n +2
    ```
  </Tab>
</Tabs>

**Warum stündliche Rotation, statt alles auf einmal herunterzuladen**: Der Tag wird aus der Uhrzeit abgeleitet (Stunden seit der Epoche modulo der Anzahl der Tags), daher ist der Job zustandslos – nichts speichert, „wo wir aufgehört haben", und der Zyklus richtet sich nach einem Neustart oder einer verpassten Stunde von selbst wieder aus. Jeder Lauf betrifft nur einen einzigen Tag; hat sich der Digest in der Registry nicht geändert, ist der Pull nur eine Manifest-Prüfung (`Image is up to date`) und ist in Sekunden erledigt. Eine echte Aktualisierung lädt höchstens ein Image pro Stunde herunter, begrenzt durch `timeout 50m`, und `docker image prune -f` entfernt die Layer, die durch das Verschieben des Tags verwaist sind.

So prüfen Sie, ob die Synchronisierung einwandfrei funktioniert:

```bash theme={null}
tail -20 /var/log/pull-texlive.log     # each run ends with "OK <tag>" or "FAIL <tag>"
grep -c '^FAIL' /var/log/pull-texlive.log
```

Wenn ein neues TeX Live-Release veröffentlicht wird, fügen Sie dessen Tag dem Array `TAGS` hinzu – die Länge der Rotation passt sich automatisch an. Stunden, in denen der Host ausgeschaltet ist, werden übersprungen und nicht nachgeholt; die betroffenen Tags werden einfach beim nächsten Durchlauf aktualisiert.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.