> 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/no/vedlikehold/oppdatere-tex-live-full-bilder-automatisk.md).

# Oppdatere TeX Live Full-bilder automatisk

Vanligvis, hver gang du kjører `bin/up`, [Bruke Toolkit](/on-premises/no/installasjon/using-the-toolkit.md) vil automatisk oppdatere vårt TeX Live full-bilde. For å unngå manuelle oppdateringer kan du automatisere oppdateringer til ditt TeX Live Sandbox-bilde ved hjelp av følgende skript. Legg det til som en cron-jobb, og sørg for at cron-brukeren har tillatelse til å kjøre `docker`. Kjør `crontab -e` for å legge til følgende linje på slutten.

{% code title="crontab -e" %}

```cron
0 * * * * /usr/bin/flock -n /tmp/pull-texlive.lock /usr/local/bin/pull-texlive.sh
```

{% endcode %}

`flock -n` hopper over en kjøring mens den forrige fortsatt holder låsen, så en treg pull hoper seg aldri opp.

{% tabs %}
{% tab title="Direkte tilkobling" %}
{% code title="/usr/local/bin/pull-texlive.sh" %}

```bash
#!/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

# Timer siden epoch, modulo antallet tagger: én tag per time,
# så alle 7 taggene oppdateres hver 7. time.
idx=$(( $(date +%s) / 3600 % ${#TAGS[@]} ))
tag="${TAGS[$idx]}"

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

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

docker image prune -f
docker system df | tail -n +2
```

{% endcode %}
{% endtab %}

{% tab title="Bruk av speilserver" %}
{% code title="/usr/local/bin/pull-texlive.sh" %}

```bash
#!/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

# Timer siden epoch, modulo antallet tagger: én tag per time,
# så alle 7 taggene oppdateres hver 7. time.
idx=$(( $(date +%s) / 3600 % ${#TAGS[@]} ))
tag="${TAGS[$idx]}"

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

if timeout 50m docker pull "$MIRROR/$REPO:$tag"; then
  # Merk på nytt med det kanoniske navnet kompilatoren er konfigurert med. Dette bare
  # legger til et ekstra navn for de samme lagene; ingenting kopieres.
  docker tag "$MIRROR/$REPO:$tag" "$CANONICAL/$REPO:$tag"
  echo "OK   $tag"
else
  echo "FEIL $tag (exit $?)"
fi

docker image prune -f
docker system df | tail -n +2
```

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

**Hvorfor timevis rotasjon i stedet for å hente alt på én gang**: taggen er avledet fra klokken på veggen (timer siden epoch, modulo antallet tagger), så jobben er stateless — ingenting registrerer "hvor vi slapp", og syklusen justerer seg automatisk etter en omstart eller en mistet time. Hver kjøring berører én enkelt tag; når registry-digesten ikke har endret seg, er pull-en bare en manifestsjekk (`Bildet er oppdatert`) og fullføres på sekunder. En faktisk oppdatering laster ned høyst ett bilde per time, begrenset av `timeout 50m`, og `docker image prune -f` fjerner lagene som blir foreldreløse når taggen flyttes.

For å sjekke at synkroniseringen er sunn:

```bash
tail -20 /var/log/pull-texlive.log     # hver kjøring ender med "OK <tag>" eller "FEIL <tag>"
grep -c '^FAIL' /var/log/pull-texlive.log
```

Når en ny TeX Live-utgivelse publiseres, legg taggen til i `TAGS` arrayet — rotasjonslengden tilpasser seg automatisk. Timer når verten er slått av, blir hoppet over, ikke satt i kø; de berørte taggene oppdateres ganske enkelt neste gang de kommer opp.


---

# 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/no/vedlikehold/oppdatere-tex-live-full-bilder-automatisk.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.
