Files
mikeandClaude Sonnet 5 ae415b17b4 Document the sulaco DB copy and netatmocollect/fuw cron hand-off
Separate from the router README since it's not part of narcissus's
router role — it's a copy of the user's personal sulaco server's
databases plus two cron scripts moved over, kept here anyway since
it's simpler than a second repo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 11:10:34 +02:00

6.3 KiB

sulaco → narcissus: Datenbank-Kopie & Cron-Umzug

Dieses Dokument ist bewusst nicht Teil der eigentlichen Router-Doku (README.md) — es hält fest, was zusätzlich auf narcissus gelandet ist, weil es praktischer war, es hier mit abzulegen, als ein eigenes Repo dafür aufzumachen. Betrifft sulaco, den privaten Home-Automation-Server des Nutzers (nicht narcissus' Router-Rolle).

Hintergrund: sulaco

  • sulaco.rz-berlin.mpg.de, 141.14.128.56, SSH-Port 2234 (per SSH-Config-Alias sulaco erreichbar).
  • Ubuntu 18.04.6 LTS (EOL) mit MySQL 5.7.42 (EOL) — trotz des Namens "mariadb" im ursprünglichen Auftrag tatsächlich MySQL.
  • Ist selbst ein Router: WAN eno1 im selben Institutsnetz wie narcissus (141.14.128.0/20), eigenes LAN enp1s0 10.0.1.0/24 (eigene, von narcissus' 10.0.1.0/24-Zone unabhängige Adressierung — reiner Zufall, keine Verbindung zwischen beiden Netzen).
  • An sulacos eigenem LAN hängen Sensoren (Aquarium-Überwachung, iSpindel-Hydrometer), die teils direkt per IP auf MySQL zugreifen.
  • Läuft seit Jahren (älteste Spuren 2017) mit ~20 selbstgeschriebenen Perl/Python-Skripten unter /db/bin/ (Aquarium-Alarm/-Power, Wetterdaten, Tasmota-Steuerung, Backups, u.a.) plus einer Apache/PHP-App.

Was auf narcissus gemacht wurde (2026-08-21)

1. MariaDB-Kopie (kein Cutover)

Bewusste Entscheidung: nur eine Kopie der Daten, sulaco bleibt unverändert der Produktivserver für alles außer den zwei unten genannten Cronjobs.

  • MariaDB 11.8 auf narcissus installiert, bind-address 127.0.0.1 (kein Netzwerkzugriff von außen).
  • Alle fünf App-Datenbanken kopiert: aqua, aqua2, monitor (größte, ~253 MB), myapi, weather (~305 MB insgesamt, ausschließlich InnoDB/MyISAM, latin1_swedish_ci, keine Views/Trigger/Routinen).
  • Die App-User (aqua, aqua2, monitor, myapi, weather, mybackup) wurden mit identischen Passwort-Hashes neu angelegt, aber nur @localhost — die sulaco-spezifischen IP-gebundenen Grants (für Geräte in sulacos eigenem LAN) wurden nicht übernommen, die ergeben auf narcissus keinen Sinn. ispindel wurde ausgelassen (zugehörige DB existiert gar nicht mehr auf sulaco).
  • Verifiziert per exaktem COUNT(*) pro Tabelle (nicht nur die ungefähren information_schema.tables.table_rows-Schätzwerte) — alles deckungsgleich bis auf 1-Zeile-Differenzen auf 3 Live-Tabellen (durch Cronjobs auf sulaco, die während des Dumps weiterliefen — erwartet, kein Datenverlust).

Erneut kopieren (einmaliger Dump, keine laufende Synchronisation eingerichtet):

ssh -p 2234 sulaco "mysqldump --single-transaction --quick --routines --triggers \
  --databases aqua aqua2 monitor myapi weather" | mariadb

Läuft direkt gegen die Live-DB auf sulaco, ohne Zwischendatei. Bei Bedarf --no-tablespaces ergänzen, falls die Meldung Access denied ... PROCESS privilege(s) ... tablespaces stört — sie ist harmlos (mysqldump dumpt trotz dieser Fehlermeldung normal weiter), aber unterdrückbar.

2. Cron-Umzug: netatmocollect + fuw

Zwei einzelne Sammel-Skripte laufen jetzt nur noch auf narcissus, nicht mehr auf sulaco (dort in der root-Crontab auskommentiert, nicht gelöscht):

Skript Zweck Zeitplan Schreibt in
/db/bin/netatmocollect Netatmo-Wetterstation abfragen alle 5 Min monitor.mwxatmo_module/mwxatmo_device (lokal) + externer Spiegel-Server
/db/bin/fuw FU-Berlin-Wetterdaten scrapen alle 10 Min monitor.berlin + http://monitor.rz-berlin.mpg.de/telemetry.php

Das war ein bewusster, einzeln bestätigter Hand-off pro Skript, kein vollständiger Cutover von sulaco — die übrigen ~18 Skripte unter /db/bin/ auf sulaco laufen unverändert weiter dort.

Netatmo-OAuth-Falle: netatmocollect nutzt /root/.netatmo.credentials (CLIENT_ID/CLIENT_SECRET/REFRESH_TOKEN), 1:1 von sulaco kopiert. Die zugrundeliegende Bibliothek (lnetatmo.py, liegt neben dem Skript in /db/bin/, nicht über pip installiert) schreibt bei jedem Lauf ein potenziell neues Refresh-Token in diese Datei zurück. Läuft dasselbe Credential-File gleichzeitig auf zwei Hosts, kann ein Token-Rotate auf der einen Seite die andere ungültig machen — deshalb wurde sulacos Cron-Eintrag vor dem ersten Testlauf auf narcissus deaktiviert, nicht parallel weiterlaufen gelassen. Falls das Skript je wieder auf sulaco laufen soll: zuerst narcissus deaktivieren, dann prüfen ob die Credentials-Datei noch synchron ist (diff /root/.netatmo.credentials /db/sulaco/root/.netatmo.credentials — Mirror ist allerdings nur eine Momentaufnahme vom 2026-08-21, siehe unten).

3. /db/sulaco/ — Dateisystem-Mirror

/db/sulaco/ auf narcissus ist ein rsync-Abzug von sulacos komplettem Dateisystem (Stand 2026-08-21), u.a. genutzt um lnetatmo.py und die Netatmo-Credentials zu holen, ohne extra auf sulaco zuzugreifen. Keine laufende Synchronisation — bei Bedarf erneut abziehen.

4. Umgebungslücken beim Portieren alter Skripte

sulacos Skripte sind auf Ubuntu 18.04 / Python 3.6 gewachsen, narcissus hat Debian 13 / Python 3.13. Beim Lauffähig-Machen von netatmocollect aufgetreten (vermutlich nicht die letzten beiden Fälle, falls weitere /db/bin/-Skripte migriert werden):

  • mysql.connector (Oracle-Paket) gibt es nicht mehr im Debian-Repo → pip install --break-system-packages mysql-connector-python.
  • imghdr wurde in Python 3.13 aus der Standardbibliothek entfernt (PEP 594) → offizieller Nachfolger pip install --break-system-packages standard-imghdr. Betraf nur einen ungenutzten Kamera-Codepfad in lnetatmo.py, das Skript selbst musste nicht angepasst werden.

Beide Fixes sind Umgebungs-, keine Skript-Änderungen — die kopierten Skripte selbst sind byte-identisch zu sulaco.

Offene Punkte / bewusst nicht gemacht

  • Kein vollständiger Cutover von sulaco. Die restlichen /db/bin/-Skripte, die Apache/PHP-App und die direkten Geräte-Zugriffe aus sulacos LAN laufen weiter ausschließlich dort.
  • Keine automatische/wiederkehrende Synchronisation der DB-Kopie eingerichtet.
  • MariaDB auf narcissus ist bewusst nicht von außen erreichbar (127.0.0.1-only) — falls das mal gebraucht wird (z.B. für einen echten Cutover), muss das bewusst geöffnet und mit passenden nftables-Regeln abgesichert werden.