# 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