From c43d8496bfd84945855898b8988f412e36586509 Mon Sep 17 00:00:00 2001 From: irrlicht Date: Fri, 4 Sep 2026 20:28:57 +0200 Subject: [PATCH] Branding auf Wurzelwerk (SWP) umstellen, Deployment systemagnostisch machen Ersetzt "Lagebild" durch den Projektnamen Wurzelwerk (Stinkwurzpresse) in allen Units, Configs und Docs. Entfernt konkrete Hostnamen (Bebop, Pi 5, Debby) aus README/NOTES zugunsten generischer Rollenbezeichnungen. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_013vHZCwcCJnz4LKNgvT4bxv --- NOTES.md | 40 +++++++++---------- README.md | 40 ++++++++++--------- ingest.env.example | 6 +-- lagebild.network | 6 --- poller.py | 8 ++-- ...t.container => wurzelwerk-ingest.container | 16 ++++---- ...obots.service => wurzelwerk-robots.service | 6 +-- ...ld-robots.timer => wurzelwerk-robots.timer | 4 +- wurzelwerk.network | 6 +++ 9 files changed, 68 insertions(+), 64 deletions(-) delete mode 100644 lagebild.network rename lagebild-ingest.container => wurzelwerk-ingest.container (66%) rename lagebild-robots.service => wurzelwerk-robots.service (62%) rename lagebild-robots.timer => wurzelwerk-robots.timer (57%) create mode 100644 wurzelwerk.network diff --git a/NOTES.md b/NOTES.md index fd2b6ab..49a0259 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1,4 +1,4 @@ -# Ingest +# Wurzelwerk — Ingest Stufe 0 und 1 der Pipeline: Quellenregister und Roh-Erfassung. Keine Kodierung — was hier landet, soll sich beliebig oft neu kodieren lassen. @@ -10,54 +10,54 @@ Kodierung — was hier landet, soll sich beliebig oft neu kodieren lassen. | `sources.toml` | Quellenregister, einzige Wahrheit ueber die Quellen | | `schema.sql` | Postgres-Schema (`quellen`, `raw_items`, `codings`, `poll_laeufe`) | | `poller.py` | Poller, zwei Senken: Postgres und gzip-JSONL | -| `Containerfile` | Image fuer Bebop | -| `lagebild-ingest.container`, `lagebild.network` | Quadlet-Units, rootless | +| `Containerfile` | Image fuer den Produktivbetrieb | +| `wurzelwerk-ingest.container`, `wurzelwerk.network` | Quadlet-Units, rootless | | `ingest.env.example` | Vorlage fuer die Zugangsdaten | -## Bebop +## Deploy mit Postgres + Podman/Quadlet (rootless) ```sh # 1. Schema einspielen psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f schema.sql # 2. Image bauen -podman build -t localhost/lagebild-ingest:latest . +podman build -t localhost/wurzelwerk-ingest:latest . # 3. Konfiguration ablegen -mkdir -p ~/.config/lagebild -cp ingest.env.example ~/.config/lagebild/ingest.env -cp sources.toml ~/.config/lagebild/sources.toml -chmod 600 ~/.config/lagebild/ingest.env -$EDITOR ~/.config/lagebild/ingest.env +mkdir -p ~/.config/wurzelwerk +cp ingest.env.example ~/.config/wurzelwerk/ingest.env +cp sources.toml ~/.config/wurzelwerk/sources.toml +chmod 600 ~/.config/wurzelwerk/ingest.env +$EDITOR ~/.config/wurzelwerk/ingest.env # 4. Quadlet installieren mkdir -p ~/.config/containers/systemd -cp lagebild-ingest.container lagebild.network ~/.config/containers/systemd/ +cp wurzelwerk-ingest.container wurzelwerk.network ~/.config/containers/systemd/ systemctl --user daemon-reload -systemctl --user start lagebild-ingest -journalctl --user -u lagebild-ingest -f +systemctl --user start wurzelwerk-ingest +journalctl --user -u wurzelwerk-ingest -f # Damit der Dienst ohne offene Sitzung weiterlaeuft: loginctl enable-linger "$USER" ``` `sources.toml` ist eingehaengt, nicht ins Image gebacken: eine neue Quelle ist -ein `systemctl --user restart lagebild-ingest`, kein Neubau. +ein `systemctl --user restart wurzelwerk-ingest`, kein Neubau. -## Pi 5 — Schatten-Ingest +## Schatten-Ingest auf einem Zweitgeraet Ohne Postgres, ohne Container: ```sh -python3 poller.py --sink jsonl:/var/lib/lagebild/schatten +python3 poller.py --sink jsonl:/pfad/zu/deinem/ablageordner ``` Legt `/YYYYMMDD/YYYYMMDDHHMMSS.jsonl.gz` an, dedupliziert ueber eine SQLite daneben. Als `systemd --user`-Unit mit `Restart=always` einrichten. Der Sinn ist nicht Redundanz um ihrer selbst willen: RSS-Feeds haben kein -Archiv. Steht Bebops Poller einen Tag still, ist dieser Tag unwiederbringlich -weg. Kodierungen lassen sich wiederholen, Rohdaten nie. +Archiv. Steht der Produktiv-Poller einen Tag still, ist dieser Tag +unwiederbringlich weg. Kodierungen lassen sich wiederholen, Rohdaten nie. ## Betrieb @@ -130,5 +130,5 @@ spiegel | derstandard | 0.92 | Niederlage fuer Donald Trump - Gericht in Missou - Telegram-Fetcher (Telethon/MTProto). Register ist vorbereitet, Eintraege stehen auf `aktiv = false`. Die Bot-API kann fremde Kanaele nicht lesen. - Ersatz-URL fuer den BR24-Feed (aktuell 404). -- Quellenpool von 12 auf ~40 erweitern; Regionalzeitungen ueber SearXNG auf - Debby suchen. +- Quellenpool von 12 auf ~40 erweitern; Regionalzeitungen ueber SearXNG + suchen. diff --git a/README.md b/README.md index 13e98bb..ea86677 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,48 @@ -# swp-01-ingest +# swp-01-ingest — Wurzelwerk -Stufe 0/1 der Lagebild-Pipeline: Quellenregister und Roh-Erfassung -(RSS-Poller, Senken Postgres oder gzip-JSONL). Details zu Betrieb, -Verhalten und offenen Punkten stehen in [`NOTES.md`](NOTES.md). +Stufe 0/1 der Wurzelwerk-Pipeline (Stinkwurzpresse, SWP): Quellenregister +und Roh-Erfassung (RSS-Poller, Senken Postgres oder gzip-JSONL). Details zu +Betrieb, Verhalten und offenen Punkten stehen in [`NOTES.md`](NOTES.md). -## Deploy (Bebop, Postgres + Podman/Quadlet) +## Deploy (Server mit Postgres + Podman/Quadlet) ```sh # 1. Schema einspielen psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -f schema.sql # 2. Image bauen -podman build -t localhost/lagebild-ingest:latest . +podman build -t localhost/wurzelwerk-ingest:latest . # 3. Konfiguration ablegen -mkdir -p ~/.config/lagebild -cp ingest.env.example ~/.config/lagebild/ingest.env -cp sources.toml ~/.config/lagebild/sources.toml -chmod 600 ~/.config/lagebild/ingest.env -$EDITOR ~/.config/lagebild/ingest.env +mkdir -p ~/.config/wurzelwerk +cp ingest.env.example ~/.config/wurzelwerk/ingest.env +cp sources.toml ~/.config/wurzelwerk/sources.toml +chmod 600 ~/.config/wurzelwerk/ingest.env +$EDITOR ~/.config/wurzelwerk/ingest.env # 4. Quadlet installieren mkdir -p ~/.config/containers/systemd -cp lagebild-ingest.container lagebild.network ~/.config/containers/systemd/ +cp wurzelwerk-ingest.container wurzelwerk.network ~/.config/containers/systemd/ systemctl --user daemon-reload -systemctl --user start lagebild-ingest -journalctl --user -u lagebild-ingest -f +systemctl --user start wurzelwerk-ingest +journalctl --user -u wurzelwerk-ingest -f # Damit der Dienst ohne offene Sitzung weiterlaeuft: loginctl enable-linger "$USER" ``` `sources.toml` ist eingehaengt, nicht ins Image gebacken: eine neue Quelle -ist ein `systemctl --user restart lagebild-ingest`, kein Neubau. +ist ein `systemctl --user restart wurzelwerk-ingest`, kein Neubau. -## Deploy (Pi 5, ohne Postgres/Container) +## Deploy (Zweitgeraet ohne Postgres/Container, z. B. als Schatten-Ingest) + +Fuer ein schlankes Zweitsystem ohne Postgres und ohne Container genuegt +Python 3.11+ mit den Paketen aus `requirements.txt`: ```sh -python3 poller.py --sink jsonl:/var/lib/lagebild/schatten +python3 poller.py --sink jsonl:/pfad/zu/deinem/ablageordner ``` Als `systemd --user`-Unit mit `Restart=always` einrichten (siehe -`lagebild-robots.service` / `.timer` fuer den woechentlichen Robots-Check). +`wurzelwerk-robots.service` / `.timer` fuer den woechentlichen +Robots-Check). diff --git a/ingest.env.example b/ingest.env.example index daeae8b..763dcb6 100644 --- a/ingest.env.example +++ b/ingest.env.example @@ -1,10 +1,10 @@ -# Nach ~/.config/lagebild/ingest.env kopieren und ausfuellen (chmod 600). +# Nach ~/.config/wurzelwerk/ingest.env kopieren und ausfuellen (chmod 600). # # Bei rootless Podman erreichen sich Container ueber ein gemeinsames Netz per # Containername. Liegt Postgres bereits in einem Netz, dort denselben Namen # eintragen wie in der Zeile Network= der Quadlet-Datei. -DATABASE_URL=postgresql://lagebild:GEHEIM@lagebild-pg:5432/lagebild +DATABASE_URL=postgresql://wurzelwerk:GEHEIM@wurzelwerk-pg:5432/wurzelwerk # Kontaktadresse gehoert in den User-Agent: wer unsere Abrufe sieht, soll # wissen, wen er anschreiben kann. -INGEST_USER_AGENT=lagebild-ingest/0.1 (+https://DEINE-DOMAIN/lagebild; kontakt@DEINE-DOMAIN) +INGEST_USER_AGENT=wurzelwerk-ingest/0.1 (+https://stinkwurzpresse.de/wurzelwerk; kontakt@stinkwurzpresse.de) diff --git a/lagebild.network b/lagebild.network deleted file mode 100644 index 26916bb..0000000 --- a/lagebild.network +++ /dev/null @@ -1,6 +0,0 @@ -# Ablegen unter ~/.config/containers/systemd/lagebild.network -[Unit] -Description=Lagebild internes Netz - -[Network] -NetworkName=lagebild diff --git a/poller.py b/poller.py index 1014b45..17d3ee1 100755 --- a/poller.py +++ b/poller.py @@ -6,8 +6,8 @@ jedes neue Item roh ab. Bewusst ohne Kodierung: was hier landet, soll sich beliebig oft neu kodieren lassen. Zwei Senken: - --sink postgres://... Bebop, die eigentliche Datenbank - --sink jsonl:/pfad/dir Pi 5, Schatten-Ingest als gzip-JSONL pro Slot + --sink postgres://... Produktivbetrieb, die eigentliche Datenbank + --sink jsonl:/pfad/dir Schatten-Ingest als gzip-JSONL pro Slot Aufrufe: poller.py --sink "$DATABASE_URL" # Dauerbetrieb, 15-Minuten-Takt @@ -38,7 +38,7 @@ from email.utils import parsedate_to_datetime HIER = pathlib.Path(__file__).parent USER_AGENT = os.environ.get( "INGEST_USER_AGENT", - "lagebild-ingest/0.1 (+https://example.org/lagebild; kontakt@example.org)", + "wurzelwerk-ingest/0.1 (+https://stinkwurzpresse.de/wurzelwerk; kontakt@stinkwurzpresse.de)", ) TAKT = 15 * 60 # Slotlaenge in Sekunden, wie bei GDELT VERSATZ = 30 # Sekunden nach der Slotgrenze, nicht exakt darauf @@ -184,7 +184,7 @@ class JsonlSenke: """Schatten-Ingest fuer den Pi: gzip-JSONL, ein Verzeichnis pro Tag. Kein Schema, keine Abfragen - nur die Garantie, dass die Rohdaten noch - da sind, wenn Bebop einen Tag lang stillstand. Die SQLite daneben haelt + da sind, wenn der Produktiv-Poller einen Tag lang stillstand. Die SQLite daneben haelt nur die gesehenen Schluessel, damit nicht bei jedem Slot der komplette Feed erneut geschrieben wird. """ diff --git a/lagebild-ingest.container b/wurzelwerk-ingest.container similarity index 66% rename from lagebild-ingest.container rename to wurzelwerk-ingest.container index dd8d75a..155825b 100644 --- a/lagebild-ingest.container +++ b/wurzelwerk-ingest.container @@ -1,29 +1,29 @@ # Quadlet-Unit fuer rootless Podman. -# Ablegen unter ~/.config/containers/systemd/lagebild-ingest.container, -# danach: systemctl --user daemon-reload && systemctl --user start lagebild-ingest +# Ablegen unter ~/.config/containers/systemd/wurzelwerk-ingest.container, +# danach: systemctl --user daemon-reload && systemctl --user start wurzelwerk-ingest # # Der Poller laeuft dauerhaft und taktet sich selbst auf die 15-Minuten-Grenzen. # Deshalb kein systemd-Timer: ein Timer wuerde den bedingten GET-Zustand # (ETag/Last-Modified) bei jedem Start neu aufbauen muessen. [Unit] -Description=Lagebild Ingest-Poller +Description=Wurzelwerk Ingest-Poller After=network-online.target Wants=network-online.target [Container] -Image=localhost/lagebild-ingest:latest -ContainerName=lagebild-ingest +Image=localhost/wurzelwerk-ingest:latest +ContainerName=wurzelwerk-ingest AutoUpdate=local -EnvironmentFile=%h/.config/lagebild/ingest.env +EnvironmentFile=%h/.config/wurzelwerk/ingest.env # Quellenregister von aussen einhaengen: eine neue Quelle ist dann ein # Neustart, kein Neubau des Images. -Volume=%h/.config/lagebild/sources.toml:/app/sources.toml:ro,Z +Volume=%h/.config/wurzelwerk/sources.toml:/app/sources.toml:ro,Z # Dasselbe Netz wie der Postgres-Container. -Network=lagebild.network +Network=wurzelwerk.network NoNewPrivileges=true ReadOnly=true diff --git a/lagebild-robots.service b/wurzelwerk-robots.service similarity index 62% rename from lagebild-robots.service rename to wurzelwerk-robots.service index 1e10e34..9d74b5d 100644 --- a/lagebild-robots.service +++ b/wurzelwerk-robots.service @@ -3,11 +3,11 @@ # damit systemd den Fehlerzustand sichtbar haelt. [Unit] -Description=Lagebild - robots.txt der Quellen pruefen +Description=Wurzelwerk - robots.txt der Quellen pruefen [Service] Type=oneshot ExecStart=/usr/bin/podman run --rm \ --network=host \ - -v %h/.config/lagebild/sources.toml:/app/sources.toml:ro \ - localhost/lagebild-ingest:latest --check-robots + -v %h/.config/wurzelwerk/sources.toml:/app/sources.toml:ro \ + localhost/wurzelwerk-ingest:latest --check-robots diff --git a/lagebild-robots.timer b/wurzelwerk-robots.timer similarity index 57% rename from lagebild-robots.timer rename to wurzelwerk-robots.timer index 41a9077..5e20f87 100644 --- a/lagebild-robots.timer +++ b/wurzelwerk-robots.timer @@ -1,8 +1,8 @@ # Nach ~/.config/systemd/user/ ablegen, dann: -# systemctl --user enable --now lagebild-robots.timer +# systemctl --user enable --now wurzelwerk-robots.timer [Unit] -Description=Lagebild - woechentliche robots.txt-Pruefung +Description=Wurzelwerk - woechentliche robots.txt-Pruefung [Timer] OnCalendar=Mon 05:30 diff --git a/wurzelwerk.network b/wurzelwerk.network new file mode 100644 index 0000000..437792a --- /dev/null +++ b/wurzelwerk.network @@ -0,0 +1,6 @@ +# Ablegen unter ~/.config/containers/systemd/wurzelwerk.network +[Unit] +Description=Wurzelwerk internes Netz + +[Network] +NetworkName=wurzelwerk