Prod fuehrt Phase 1 als Quadlet unter
~/.config/containers/systemd/wurzelwerk-ingest.container; Phase 2 legt
sich daneben. Damit faellt die eigene .service-Unit weg - zwei Wege,
dasselbe zu tun, sind einer zuviel.
Drei Dinge, die dabei nicht offensichtlich sind:
Type=oneshot Quadlet setzt sonst Type=notify, und die Unit
gaelte als gestartet, sobald der Container
laeuft, nicht wenn er durch ist.
kein RemainAfterExit Das Handbuch empfiehlt es fuer oneshot, aber bei
Timer-Aktivierung bliebe der Auftrag im Zustand
"started" und der Timer loeste ihn nie wieder
aus.
--env-file EnvironmentFile= im Abschnitt [Container] ist
nicht systemds EnvironmentFile=. Quadlet reicht
die Datei an podman weiter, und podman entfernt
keine Anfuehrungszeichen um Werte.
Network=bebop-net steht jetzt direkt in der Unit; P2_NETZ entfaellt.
Type=oneshot schaltet ausserdem die Startzeitgrenze ab, womit der Grund
fuer TimeoutStartSec=1800 wegfaellt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NupWEBPzsyohVPG47HsTz8
64 lines
2.6 KiB
INI
64 lines
2.6 KiB
INI
# Phase 2 als Quadlet, neben wurzelwerk-ingest.container.
|
|
#
|
|
# cp deploy/wurzelwerk-p2.container ~/.config/containers/systemd/
|
|
# cp deploy/wurzelwerk-p2.timer ~/.config/systemd/user/
|
|
# systemctl --user daemon-reload
|
|
#
|
|
# Quadlet erzeugt daraus wurzelwerk-p2.service; der Timer traegt denselben
|
|
# Namen und findet sie deshalb ohne Unit=-Zeile.
|
|
#
|
|
# Kein [Install]: die Unit soll nicht beim Anmelden starten, sondern nur,
|
|
# wenn der Timer sie faellig macht.
|
|
|
|
[Unit]
|
|
Description=Wurzelwerk Phase 2 (Aufbereitung)
|
|
# Nicht Requires: laeuft Postgres gerade nicht, soll der Slot ausfallen und
|
|
# beim naechsten Mal ueber --aufholen nachgeholt werden, nicht die
|
|
# Abhaengigkeit neu starten.
|
|
After=postgres.service
|
|
|
|
[Container]
|
|
Image=localhost/wurzelwerk-p2
|
|
# Das Abbild hat ENTRYPOINT python3; Exec= liefert nur das Argument.
|
|
Exec=phase2.py --aufholen
|
|
|
|
# Ohne dieses Netz loest der Rechnername "postgres" aus DATABASE_URL nicht
|
|
# auf. Der Fehler waere dann eine Namensaufloesung, keine Anmeldung.
|
|
Network=bebop-net
|
|
|
|
# Zwei Dateien, in dieser Reihenfolge - die spaetere gewinnt bei gleichem
|
|
# Schluessel. database.env haelt die Datenbankverbindung und gehoert Phase 1
|
|
# mit; sie wird hier nur gelesen, nicht angefasst. p2.env traegt, was nur
|
|
# Phase 2 angeht.
|
|
#
|
|
# Achtung, anderer Mechanismus als bei EnvironmentFile= im Abschnitt
|
|
# [Service]: Quadlet reicht diese Dateien als "podman run --env-file" weiter.
|
|
# Podman entfernt keine Anfuehrungszeichen. Steht in database.env
|
|
# DATABASE_URL="postgresql://..." mit Anfuehrungszeichen, landen sie im Wert
|
|
# und die Verbindung scheitert. systemd wuerde sie entfernen, podman nicht.
|
|
EnvironmentFile=%h/.config/wurzelwerk/database.env
|
|
EnvironmentFile=%h/.config/wurzelwerk/p2.env
|
|
|
|
# 2,2 GB Modellgewichte. Muessen ein Volume sein, sonst waeren sie bei jedem
|
|
# Neubau des Abbilds weg.
|
|
Volume=wurzelwerk-modelle:/cache:U
|
|
|
|
Memory=8g
|
|
ShmSize=1g
|
|
|
|
[Service]
|
|
# Der Container laeuft und ist fertig; nichts bleibt stehen. Ohne diese Zeile
|
|
# setzt Quadlet Type=notify, und die Unit gaelte als gestartet, sobald der
|
|
# Container laeuft - nicht, wenn er durch ist.
|
|
#
|
|
# Kein RemainAfterExit=yes, obwohl das Handbuch es fuer oneshot sonst
|
|
# empfiehlt: bei Timer-Aktivierung bliebe der Auftrag im Zustand "started"
|
|
# stehen und der Timer koennte ihn nie wieder ausloesen.
|
|
#
|
|
# Type=oneshot schaltet die Startzeitgrenze ab. Der Erstbestand ueber den
|
|
# gesamten Korpus - rund 17 Minuten je 5000 Items - liefe hier also nicht in
|
|
# TimeoutStartSec. Trotzdem gehoert er von Hand gefahren, siehe
|
|
# INBETRIEBNAHME.md: beim ersten Lauf werden 2,2 GB Modellgewichte geladen,
|
|
# und das will man sehen, nicht im Journal nachlesen.
|
|
Type=oneshot
|