> 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/cs/udrzba/automaticka-aktualizace-plnych-obrazu-tex-live.md).

# Automatická aktualizace plných obrazů TeX Live

Obecně pokaždé, když spustíte `bin/up`, [Používání Toolkitu](/on-premises/cs/instalace/using-the-toolkit.md) automaticky aktualizuje náš plný obraz TeX Live. Abyste se vyhnuli ručním aktualizacím, můžete aktualizace obrazu TeX Live Sandbox automatizovat pomocí následujícího skriptu. Přidejte jej jako úlohu cron a ujistěte se, že uživatel cron má oprávnění spouštět `docker`. Spusťte `crontab -e` a přidejte na konec následující řádek.

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

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

{% endcode %}

`flock -n` přeskočí spuštění, dokud předchozí stále drží zámek, takže se pomalé stahování nikdy nenakupí.

{% tabs %}
{% tab title="Přímé připojení" %}
{% 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

# Hodiny od epochy modulo počtu tagů: jeden tag za hodinu,
# takže všech 7 tagů se obnoví každých 7 hodin.
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
```

{% endcode %}
{% endtab %}

{% tab title="Použití zrcadlového serveru" %}
{% 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

# Hodiny od epochy modulo počtu tagů: jeden tag za hodinu,
# takže všech 7 tagů se obnoví každých 7 hodin.
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
  # Přeznačte na kanonický název, se kterým je překladač nakonfigurován. Tím se pouze
  # přidá druhý název ke stejným vrstvám; nic se nekopíruje.
  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
```

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

**Proč hodinová rotace místo stahování všeho najednou**: tag je odvozen od hodinových údajů (hodiny od epochy modulo počet tagů), takže úloha je bezstavová — nic neukládá, „kde jsme skončili“, a cyklus se po restartu nebo zmeškané hodině sám znovu vyrovná. Každé spuštění se dotkne jediného tagu; když se digest registru nezměnil, stahování je jen kontrola manifestu (`Obraz je aktuální`) a skončí během několika sekund. Skutečná aktualizace stáhne nejvýše jeden obraz za hodinu, omezeno pomocí `timeout 50m`, a `docker image prune -f` odstraní vrstvy osiřelé přesunutím tagu.

Pro kontrolu, že synchronizace funguje správně:

```bash
tail -20 /var/log/pull-texlive.log     # každé spuštění končí buď "OK <tag>", nebo "FAIL <tag>"
grep -c '^FAIL' /var/log/pull-texlive.log
```

Když je vydána nová verze TeX Live, přidejte její tag do `TAGS` pole — délka rotace se automaticky přizpůsobí. Hodiny, kdy je host vypnutý, se přeskočí, neřadí se do fronty; dotčené tagy se jednoduše obnoví při svém dalším tahu.


---

# 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/cs/udrzba/automaticka-aktualizace-plnych-obrazu-tex-live.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.
