knuspermagier.de

Since 2005.

Web Push im iOS 16.4 Safari leicht gemacht

Seit ein paar Wochen unterstützt der mobile Safari nun ja auch Push Notifications. Natürlich musste ich das direkt mal ausprobieren und natürlich klappte es nicht sofort, daher hier nochmal kurz zusammengefasst, was man braucht:

  1. Erstmal braucht man VAPID Keys, das ist einfach nur ein Keypair, das man sich selber generieren kann, da muss man sich nirgendwo für Anmelden, oder so. Ich verlinke mal keine dieser shady Seiten, wo man das in einem Web-Formular machen kann.
  2. Einen Service-Worker. Tatsächlich habe ich mich bisher auch immer sehr gut um dieses Thema drücken können. Das ist so ein bisschen JavaScript, das eine Seite registrieren kann und was der Browser im Hintergrund ausführen kann, auch wenn die Seite nicht offen ist. Das ist essentiell, denn der Service-Worker bekommt die Notification vom System übermittelt und muss selbst dafür sorgen, dass und wie sie angezeigt wird. Hier eine Beispielimplementierung.
  3. Ein bisschen JavaScript, dass den Service-Worker registriert und die Anmeldung für Push-Notifications übernimmt. Unter iOS ist hier wichtig, dass die Nachfrage nach den Permissions in einem onclick-Handler passiert und nicht direkt beim Öffnen der Seite
  4. Ein Backend, das die Endpoints und Tokens speichert, die man vom Browser bekommen hat.
  5. Die App muss auf den Homescreen installiert sein und braucht eine manifest.json. Ich nutzte standalone für das display-Feld im Manifest, sonst klappte es nicht, aber kann sein, dass es auch ohne geht.
  6. Eine Backend-Komponente um Pushs zu verschicken. Für PHP benutzte ich da die minishlik/web-push Library.

Fertig, damit funktioniert es! Wenn man weiß wie, ist es ganz einfach.

Hetzner hat jetzt auch VMs mit ARM-Chips im Angebot. Natürlich drei Tage, nachdem ich gerade meine große Server-Umstellung machte. Zum Glück baute ich ja aber alles so, dass ich problemlos innerhalb von Sekunden umschwenken könnte. Mal sehen, ob ich da Lust dazu habe. Wäre ja schon einen Euro billiger für einen Core und 4GB RAM mehr.

20230311-085914-pwa-0435.jpg

Star

20230406-104301-pwa-0900.jpg
20230406-104309-pwa-0906.jpg
20230406-104310-pwa-0907.jpg

Ist er nicht hübsch?

Die große Server-Konsolidierung 2023

Ich gebe es zu, ich bin Server-Messi. Spätestens seitdem Hetzner mit seinem Cloud-Angebot durchgestartete und man nur so drei Euro für eine CPU und ein bisschen Speicher zahlte, fing ich an für alles mögliche eine neue VM anzulegen. Zuletzt versuchte ich vor etwa einem Jahr dem Chaos Herr zu werden, leider ohne größeren Erfolg. Am Ende hatte ich noch einen Server mehr.

Aktuell sind es ca. 15 und ich zahle dafür um die 50€ im Monat. Denn, wie alles, sind auch die VMs teurer geworden, spätestens seitdem Hetzner für die kostbaren IPv4-Adressen nochmal extra kassiert. Zu recht natürlich. Ich redete es mir immer schön, in dem ich mir sagte, dass es ewig dauern würde, bis sich der Arbeitsaufwand amortisieren wird. Was sind schon gesparte 5€ für einen Server im Monat! Macht man sich die Mühe und multipliziert das mal mit 12 kommt man allerdings schon auf 60€ und das nochmal mit der Anzahl der Server multipliziert, die man abstellen könnte. Plötzlich kommt man auf einen beträchtlichen Betrag, den man sparen könnte. Davon könnte man sich einige Packungen Kippen kaufen, wenn man rauchen würde!

In diesem Post erzähle ich euch nun ein wenig davon, wie ich dieses Projekt angegangen bin, welche Probleme ich hatte und was das Ergebnis ist. Natürlich habe ich währenddessen mal wieder zu wenige Notizen gemacht und schreibe alles schnell in einer Nacht-und-Nebel-Aktion zusammen, daher werden sicher ein paar Sachen fehlen. Vielleicht ergänze ich sie später, wenn sie mir einfallen!

Weiterlesen →

Flask

Gestern Abend wollte ich schnell einen Rezepte-Import in meine Re-Implementierung vom Speiseplaner packen. Ich hatte in den letzten Monaten öfter Github-Repositories gesehen, die sowas anbieten. recipe-scrapers sah ziemlich umfassend aus, ist aber leider in Python geschrieben.

Nun hätte ich sicher Python in mein Docker-Image ziehen können, das alles installieren und per exec drauf zugreifen können, doch ich dachte mir, warum machst du das nicht kurz in sauber und baute eine Flask-App darum. Wobei, bauen kann man das nun wirklich nicht nennen, ich änderte ungefähr eine Zeile aus der Hello World-Beispielapp:

from flask import Flask
from flask import request
from recipe_scrapers import scrape_me

app = Flask(__name__)

@app.route("/")
def hello_world():
    url = request.args.get('url', '')
    scraper = scrape_me(url, wild_mode=True)
    return scraper.to_json()

Dazu diese kurze Dockerfile und fertig ist die Rezepte-Scraping-API.

FROM python:3-alpine

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py ./

CMD [ "flask", "--app", "app", "run", "--host=0.0.0.0"]

Jetzt war es ein leichtes, das Import-Feature in den Speiseplaner zu implementieren, quasi nur noch ein API-Aufruf und fertig. Da freut man sich doch, wie leicht mittlerweile vieles geworden ist.

20230330-115910-pwa-0807.jpg
20230330-115225-pwa-0757.jpg

mey v2

Im Zuge meiner Server-Konsolidierung musste ich mal wieder auch meinen Last.fm-Ersatz mey anfassen, da er sich leider nicht leicht zu SQLite konvertieren ließ. Immerhin sieht es nun auch ein bisschen hübscher aus!

Leider muss ich nochmal ran, denn die damals importierten Daten sind echt etwas… Lückenhaft. Vielleicht aber auch egal, hauptsache es läuft im Docker Container und ist still.

mey_login.png
mey_start.png
may_song.png

Wordpress mit SQLite

Nur eine kurze Notiz, für alle, die noch ein oder zwei Wordpresse rumfliegen haben, aber keine Lust dazu haben einen MySQL-Server dafür zu betreiben, weil eh fast kein Traffic drauf ist:

Es existiert diese One-File-Lösung auf Github, die man einfach in wp-content ablegt und schon supported Wordpress SQLite. Verrückt. Um einen bestehenden MySQL-Dump so umzubiegen, dass er in SQLite zu importieren geht, kann man dieses Script benutzen.

Das ganze packt man ins Docker-Image und muss sich nie wieder damit auseinandersetzen, hoffentlich.