Einbeck Stadtnachrichten

news.nerdbridge.de sammelt aus verschiedenen Quellen Nachrichten für Einbeck und Umgebung zusammen und stellt diese über eine Website und über eine JSON Schnittstelle bereit. Die Nachrichten werden ebenfalls über einen Bot auf Mastodon geposted.

Code

https://git.nerdbridge.de/nerdbridge/citynews

Architektur

Die einzelnen Komponenten laufen als Docker Container auf unserem primären Docker Host.

graph LR
  traefikapi["Traefik Proxy<br>news.nerdbridge.de<br>/api"] --> api["citynews Backend<br>.NET Core API"]
  traefikapp["Traefik Proxy<br>news.nerdbridge.de<br>/"] --> frontend["citynews Frontend<br>Angular"]
  frontend --> api
  api --> mongo["MongoDB"]
  cron["Cronjob<br>jede Stunde"] --> fetch["newssources<br>import.sh"]
  fetch --> mongo
  fetch --> forwarders["Mastodon<br>Forwarder"]

Frontend

Das Frontend ist mit Angular und Angular Material entwickelt und für die Nutzung auf Smartphones optimiert. Die Website kann als PWA auf einem Smartphone installiert werden. (Es sollte ein entsprechender Hinweis beim ersten öffnen der Website in Google Chrome erscheinen)

Backend

Das Backend ist eine in .NET Core entwickelte REST API mit einer MongoDB als Datenbank. Die API bietet einige simpel gehaltene Endpunkte:

Nachrichtenquellen

Für jede Nachrichtenquelle gibt es im Ordner newssources/ ein Script. Teilweise wird ein generisches Script zum Einsammeln von RSS Feeds verwendet, teilweise musste für eine Quelle ein individueller HTML Parser in Python programmiert werden.

Die Scripts bedienen jeweils exakt eine Quelle und geben für jeden gefundenen Nachrichtenartikel eine Zeile JSON Code aus:

{ 
    "source": "https://example.com/", 
    "source_slug": "einmopo", 
    "subsource": null, 
    "subsource_slug": null,
    "timestamp": "2024-01-08T16:02:08.070557",
    "title": "Titel des Nachrichtenbeitrags",
    "url": "https://example.com/news.html",
    "keywords": [ "important", "some-keyword" ]
}

(Der Lesbarkeit halber hier mit Zeilenumbrüchen, das Script muss ein JSON Object pro Nachrichtenbeitrag in einer eigenen Zeile ausgeben!)

Die Ausgaben des Scripts werden anschließend mit einer Shell Pipe an das eigentliche Import Script übergeben. Dieses verwendet die URL im JSON Object um zu verhindern, dass ein Beitrag mehrmals in die Datenbank eingetragen wird.

./newssource-example.py | ./helper-import-mongo.py

Forwarders

Ein Forwarder kann beliebig Beiträge aus der Datenbank an andere Systeme weiterleiten. Der aktuell einzige Forwarder postet jede Stunde maximal drei neue Nachrichtenbeiträge auf Mastodon.

Updates

GitLab baut automatisch neue Container Images aller Komponenten, wenn eine Änderung eingecheckt wird. Ausgerollt werden diese Container semi-manuell via Ansible. (Playbook muss händisch angestoßen werden)

TODOs

  • Die Interfaces zu den Daten von den newssource Scripts sind aktuell ein wenig inkonsequent. Teilweise wird die MongoDB direkt angesprochen, teilweise die API verwendet. Es sollte ausschließlich die API verwendet werden.
1 „Gefällt mir“