LOW←TECH MAGAZINE

Ich habe schon lange ein Faible für Low-Tech. Ich möchte, dass die diversen Sachen um mich herum möglichst einfach funktionieren und ohne Schnörkel einfach das tun, was sie sollen. Das ist der Grund, warum es bei uns Lichtschalter gibt und keine Steuerung via Home Assistant oder schlimmer noch mit Cloud-Abhängigkeit. Es geht nur darum, gelegentlich das Licht an und wieder auszumachen. Sonst nichts. Wobei mein Nerd-Ich solche Spielereien ja doch mag. Da hilft es sich im Netz umzusehen, ob es nicht etwas gibt, wo sich auch mein Nerd-Ich freut. Und ich habe was gefunden.

In Barcelona steht seit 2018 ein solarbetriebener Server des LOW←TECH MAGAZINE mit jeder Menge Informationen zum Thema. Wenn die Sonne lange nicht scheint, ist er auch mal offline. Aber auch dagegen kann man was tun und in drei Bänden den Inhalt als Bücher kaufen und gänzlich ohne Strom lesen. Das ist auch einer der Formen, wie die Site sich finanziert.

Aktueller Anlass meines wiedererwachten Interesses an Low-Tech ist der Winter. Wie lassen sich Heizkosten sparen? Vor längerer Zeit las ich dazu was im Techniktagebuch. Und der gleiche Tipp, den Kathrin Passig dort gibt, findet sich auch im Low-tech Magazine: Menschen beheizen, nicht Räume.

Mal schauen, was draus wird. Und wenn es mir zu langweilig wird, gibt es ja auch noch das No Tech Magazine.

Verdandi 1.6.0

Ich habe ein kleines bisschen am Theme gebastelt, um ein Problem zu lösen. Ich benutze das ActivityPub-Plugin von Matthias Pfefferle, um das Blog mit dem Fediverse zu verbinden. Aber da Verdandi ein klassisches Theme ist und Matthias sein Plugin primär für Block-Themes gebaut hat, fehlen mir unter den Artikeln die Likes. Die kommen nämlich über einen Block, bzw. ein Widget. Um also alle Reaktionen aus dem Fediverse anzeigen zu können, brauche ich einen neuen Sidebar pro Post. Sein Inhalt wird zwischen dem eigentlichen Text des Posts und den Kommentaren eingeblendet.

Wenn man die Sache passend konfiguriert (der Post-Sidebar ist nur sichtbar und konfigurierbar, wenn man einen einzelnen Post auswählt) und das entsprechende Widget auswählt, zeigen sich auch die Likes.

Vom Styling her passt das nicht ganz, aber mit etwas CSS-Übersteuerung sieht es ganz OK aus. Das hier verwende ich (ist nicht im Theme!)

.activitypub-reactions h6 {
  border-top: none;
  font-size: 1.4rem;
  margin:0;
}
Code-Sprache: CSS (css)

Und damit man sieht, wie das Ganze aussieht, habe ich mich dann gleich mal selbst gelikt.

Holzhammer

Seit August versuche ich diese Site aus den Indices von Gogle, Bing etc. herauszubekommen. Ich habe dabei gelernt, das noindex und Direktiven in der robots.txt witzlos sind. Daher probiere ich es jetzt mal direkt mit einem 404 für diese Crawler. Im apache2 mit aktiviertem mod_rewrite sieht das so aus:

RewriteCond %{HTTP_USER_AGENT} Google [NC,OR]   
RewriteCond %{HTTP_USER_AGENT} bing [NC,OR]   
RewriteCond %{HTTP_USER_AGENT} Baidu [NC,OR] 
RewriteCond %{HTTP_USER_AGENT} chatgpt [NC,OR]   
RewriteCond %{HTTP_USER_AGENT} Yandex [NC]   
RewriteRule ^ - [R=404,L]

Mehr als ein „hier gibt es nichts zu sehen“ direkt in die Schnauze des Crawlers fällt mir dann aber erst mal auch nicht mehr ein.

Local first

Nachdem die Oligarchen in den USA anscheinend endgültig die Macht übernommen haben, war es für mich mal an der Zeit darüber nachzudenken, wo überall sich meine Daten herumtreiben. Etwa gleichzeitig fiel mir ein Artikel über local first in die Hände. Besonders der erste Teil davon ergab interessante Anregungen für eine neue Strategie, mit meinen Daten umzugehen. Und dann war ich noch genervt davon, wie viele Angriffe gegen mein WordPress und meinen Server via ssh laufen.

Daraus ergaben sich einige Konsequenzen:

  1. alle Daten werden zu Hause gehostet. Sie liegen nicht im Internet, sondern sind nur aus dem Heimnetz erreichbar. Das erspart mir, die eingesetzte Software feuersicher zu installieren, um sie gegen die allgegenwärtigen Angriffe zu schützen.
  2. Daten werden – soweit sinnvoll – mit den Endgeräten synchronisiert. Ich will z. B. alle Aufgaben und Notizen auf meinem Telefon haben. Sie sollen sich synchronisieren und auch offline zur Verfügung stehen. Die große Fotosammlung dagegen muss nur zu Hause zur Verfügung stehen.
  3. Falls ich mal unterwegs Zugriff auf heimische Daten brauche, muss einfach nur das VPN aktiviert werden.

Auftritt Diogenes, der kleine Raspberry Pi 4 im Schrank (bei mir werden alle Computer nach Philosophen benannt). Er hängt per Kabel an der Fritzbox und greift auf eine SSD als Massenspeicher zu. Der Softwarestack darauf ist naheliegend. Nextcloud mit Tasks, Notes, Bookmarks und dem obligaten Filesharing. Tasks und Notes lösen die entsprechenden Dienste bei Google ab. Das Filesharing ersetzt nicht nur Google Drive, sondern hostet jetzt auch als echte Dateien die paar wenige Tabellen, die ich bei Google Sheets pflegte. Bookmarks hatte ich bisher schon Datenschutz-freundlich mit Shaarli verwaltet, jetzt wird die Nextcloud Variante ausprobiert. Sie hat den Vorteil, dass ich Bookmarks mit Daniela teilen kann.

Instapaper hatte ich vor einiger Zeit durch Wallabag ersetzt. Das lag noch im Internet und wurde nun nach Hause geholt.

Aufgrund der local first Strategie gab es einen weiteren Umbau: Meine persönliche Knowledgebase war über viele Jahre ein Dokuwiki. Das war fein, aber die Inhalte ließen sich nicht brauchbar auf das Telefon replizieren. Kein Netz, keine Informationen. Noch blöder, wenn ich gerade an der Maschine schraube, auf der das Dokuwiki gehostet wird. Ersatz ist Obsidian mit remotly save. Es fühlte sich für mich in der Bedienung und bei der Synchronisation angenehmer an als Joplin.

Bleiben Mail, Kontakte und Kalender.

Da bin ich in einem Dilemma. Vor etwa 13 Jahren gab es mal die Möglichkeit kostenfrei die eigene Domain auf die Google Services zu schalten. Das war damals eine gute Idee, denn ich hatte einfach keine Lust mehr einen eigenen Mailserver zu betreiben (habe ich wirklich mal gemacht). Inzwischen hat sich mein Blick auf Google verändert. Aber da ich nicht der einzige Benutzer innerhalb von strathewerd.de wird ein Umzug etwas heikler. Er ist erstmal auf die lange Bank geschoben. Als Notlösung ziehe ich viele Mails auf eine alternative Domain, die bei Hetzer läuft. Immerhin etwas.

Ab jetzt läuft die Testphase. Irgendwann werde ich an dieser Stelle über die gewonnenen Erkenntnisse berichten.

Verdandi 1.5.1

In den letzten Wochen tat sich bis auf einige wenige kleine Bugfixes nichts am Theme. Gestern dann gab es tatsächlich eine kleine Neuerung, der gleich ein Minifix hinterhergeschoben wurde.

Verdandi unterstützt jetzt den Stil align-wide. Damit können einzelne Elemente wie Bilder breiter dargestellt werden als der eigentliche Text. Wahlweise ein bisschen oder über die gesamte Bildschirmbreite. Das funktioniert natürlich nur, wenn der Sidebar ausgeschaltet wird und die Widgets nach unten wandern. Auf Mobilgeräten ist das sowieso schon der Fall.

Mir gefällt die Dynamik, die dadurch entsteht.

Bei aktiviertem Sidebar ändert sich nichts. Fast nichts. In der Mobilansicht habe ich Bilder für alle Varianten auf volle Breite gezogen.

Der kleine Umbau lässt mich jetzt darüber nachdenken, wie ich optional das Suchwidget in den Header bekomme. Denn das hätte ich gerne oben und damit ohne scrollen beim Öffnen der Seite sofort im Zugriff.

Beiträge in WordPress sortieren

Manchmal sind Lösungen so trivial, dass ich erst einmal daran vorbeirenne.

Ich wollte die Blogeinträge, die jeweils zu einer Reise gehören, zusammen präsentieren. Da war mir auch die Lösung gleich klar. Einfach alle Posts der Reise mit einem dafür reservierten neuen Tag auszeichnen, z.B. nordfrankreich2024. Aber ich wollte die Einträge auch chronologisch haben und nicht in der üblichen Blogreihenfolge vom Neusten zum Ältesten. Also suchte ich beherzt nach Codeschnipseln, Artikeln zum Thema und Plugins. Eher zufällig fand ich die Lösung. Es reicht, den Parameter order=asc an die URL anzuhängen.

Das Ergebnis sieht so aus: https://scaldra.net/tag/nordfrankreich2024/?order=asc

Trivial.

WordPress absichern

In der letzten Zeit war ich – auch als Nebeneffekt von vielen Basteleien – etwas schludrig, was die Sicherheit dieses Servers anging. Daher mal für mein zukünftiges Ich ein paar Basics zur Sicherheit von WordPress.

Was könnte passieren, wenn ich mir ein Skript einfange (durch z.B. ein unterwandertes WordPress-Plugin oder ein allzu naiv ausprobiertes PHP-Projekt, das gerade meine Aufmerksamkeit erweckte) und übles im Sinn hat? Ohne Vorkehrungen kann es mit den Rechten des Webservers (www-data) Systembefehle ausführen, Dateien erzeugen, gefundene Daten publik machen und allerlei anderen Schabernack treiben.

Um das auszuschließen, sollte man PHP verbieten, bestimmte Funktionen auszuführen. Dazu gehört unter anderem eval, mit dem sich beliebige Systembefehle ausführen lassen. Das lässt sich einfach in der php.ini mit der Anweisung disable_functions=... machen. Ein auskommentiertes Beispiel ist standardmäßig immer dabei.

Die nächste Schutzschicht sind die Dateirechte. Der Webserver und damit PHP sollten nach Möglichkeit nur Leserechte, aber keine Schreibrechte haben. Zunächst werden dazu alle Rechte einem anderen, z.B. dem eigenen User (hier naheliegenderweise rolf) übertragen:

shopt -s dotglob
chown -R rolf.rolf  /srv/www/scaldra.net/*
shopt -u dotglobCode-Sprache: Bash (bash)

Das shopt ist notwendig, damit chown auch alle hidden-Dateien erfasst.
Danach werden alle Dateien auf Minimalrechte zurückgesetzt (Ich darf alles und der Webserver nur lesen):

find   /srv/www/scaldra.net -type d -exec chmod 755 {} \;
find  /srv/www/scaldra.net -type f -exec chmod 644 {} \;Code-Sprache: Bash (bash)

Damit ich weiterhin in meine Posts Bilder verwenden kann, muss das Upload-Verzeichnis dann doch noch ein paar Rechte mehr bekommen:

find   /srv/www/scaldra.net/htdocs/wp-content/uploads -type d -exec chmod 777 {} \;
find  /srv/www/scaldra.net/htdocs/wp-content/uploads -type f -exec chmod 666 {} \;Code-Sprache: Bash (bash)

Das Gleiche gilt für das Cache-Verzeichnis:

find   /srv/www/scaldra.net/htdocs/wp-content/cache -type d -exec chmod 777 {} \;
find  /srv/www/scaldra.net/htdocs/wp-content/cache -type f -exec chmod 666 {} \;Code-Sprache: Bash (bash)

Jetzt habe ich eine WordPress-Installation, die recht gut gegen viele Angriffe abgesichert ist. Allerdings lassen sich jetzt auch keine Themes oder Plugins mehr installieren. Wenn ich das will, und das ist ja eher selten, muss ich zunächst dem Webserver wieder Schreibrechte geben:

shopt -s dotglob
chown -R www-data.www-data  /srv/www/scaldra.net/*
shopt -u dotglobCode-Sprache: Bash (bash)

Dann wird fröhlich installiert und danach werden die Rechte wieder auf den eigenen Benutzer zurückgedreht.

Die Rechteänderung bringt leider mit sich, dass das Autoupdate an den Dateirechten scheitert. WordPress wird im Website-Zustand darauf hinweisen, dass nicht auf das Dateisystem zugegriffen werden kann. Was ja auch stimmt, das darf ja nicht mehr www-data, sondern nur noch rolf.

Da ich nun keine Lust habe alle Updates ab jetzt manuell durchzuführen, muss ich etwas tiefer in WordPress einsteigen und die WP-CLI installieren

Mit ihr lassen alle Wartungsjobs, die normalerweise per Klick in der GUI gemacht werden, durch einen Commandline-Aufruf ersetzen. Auf diese Weise lassen sich auch alle zeitgesteuerten Aufgaben mit dem persönlichen User (hier also rolf) durchführen. Es braucht lediglich ein Job in der /etc/cron.d, der bei mir wordpress heißt und zwei Zeilen enthält

*/5 * * * * rolf wp --path=/srv/www/scaldra.net/htdocs cron event run --due-now >>/home/rolf/wpv.log
11 8 * * * rolf /home/rolf/wp-update >>/home/rolf/wp.logCode-Sprache: Bash (bash)

Die erste Zeile führt alle fünf Minuten die üblichen zeitgesteuerten Aufgaben in WordPress durch. Die zweite Zeile kümmert sich morgens um 8:11 darum, dass die gesamte Installation auf Stand bleibt. Sie ruft dazu ein kleines bash-Skript auf, das die diversen Aktualisierungen anstößt:

#!/bin/bash
wp --path=/srv/www/scaldra.net/htdocs  plugin update --all  > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  core update  > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  theme update --all > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  language theme --all update > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  language plugin --all update > /dev/null 2>&1
wp --path=/srv/www/scaldra.net/htdocs  language core update  > /dev/null 2>&1
Code-Sprache: Bash (bash)

Das sind zunächst die Plugins, WordPress selbst und die Themes. Aber das reicht noch nicht ganz. Mit den letzten drei Zeilen des Skripts werden die Übersetzungen von Themes und Plugins aktualisiert.

Insgesamt funktioniert das sehr gut. Dass der Website-Zustand mich jetzt an mault, dass WordPress nicht schreiben kann, ist für mich verschmerzbar. Allerdings musste ich Matomo entfernen und durch ein anderes Statistiktool ersetzen. Es orientierte sich an der Meldung zum Website-Zustand und wollte daher nicht mehr mitspielen.

Zum Schluss noch ein paar weiterführende Links:

Nachtrag 4.10.2024

Im Website-Zustand fand sich in den letzten Tagen hartnäckig der Hinweis, dass die Übersetzungen nicht aktuell seien. Durch diesen Hack ließ sich das Problem beseitigen:

wp --path=/srv/www/scaldra.net/htdocs  eval "require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; (new Language_Pack_Upgrader(new Language_Pack_Upgrader_Skin(['url' => 'update-core.php?action=do-translation-upgrade', 'nonce' => 'upgrade-translations', 'title' => __('Update Translations'), 'context' => WP_LANG_DIR])))->bulk_upgrade();";   > /dev/null 2>&1Code-Sprache: Bash (bash)

Schön geht anders. Hier noch der Link zur Lösung: How do you update all translations using wp-cli?

Raus aus dem Index

Schon länger frage ich mich, warum ich mit diesem Blog noch im Index von Google oder Microsoft gelistet sein will. Zu diesem sehr persönlichen Kraut-und-Rüben-Durcheinander findet nur selten eine versprengte Seele über Google und Bing. Es bringt mir also nicht viel, denn die Besucher finden über andere Kanäle hierher, in die ich in Zukunft mehr Energie investieren werde.

Dazu kam vor einem Jahr etwas, das mich massiv ärgert: der Inhalt von scaldra.net wurde ungefragt zum Training von ChatGPT benutzt. Und heute stolperte ich über diesen Artikel über die Zukunft der Googlesuche. Damit hat die Indizierung für mich bezogen auf dieses Blog endgültig ihren Sinn verloren.

Ab jetzt sind Suchmaschinen ausgesperrt.

Nachtrag 8.11.2024

Bei Google sank die Anzahl der indizierten Seiten zunächst, jetzt steigt sie wieder. Und Bing ist völlig desinteressiert am noindex.

Jetzt probiere ich es zusätzlich mit einem Header, der mit jeder Datei geschickt wird. In der apache-conf sieht das so aus:

Header Set X-Robots-Tag "noindex, noarchive, nosnippet"Code-Sprache: Apache (apache)

Und die robots.txt ergänzt um

User-agent: Googlebot
Disallow: /
User-agent: Bingbot
Disallow: /Code-Sprache: HTTP (http)

Ich bin gespannt, ob er wirkt.