AppArmor und Vivaldi

Weiß nicht ob das ein KDE6 oder Vivaldi oder sonst irgendwo anders gelagertes Problem ist aber ich habe einen ganzen Haufen AppArmor Fehler bekommen wenn ich aus Vivaldi etwas heruntergeladenes starten wollte (wenn das Programm in /etc/apparmor.d/abstractions/open-some-applications enthalten ist) – alle rund um /run/user/meine_uid.

Im audit.log habe ich dann viele Einträge mit “failed name lookup – deleted entry” gefunden und bin darauf gestoßen.

Ist vermutlich völlig falsch und viel zu global aber das mediate_deleted aufs top level profil in /etc/apparmor.d/opt.vivaldi-stable gepfropft und schon hats funktioniert:

profile vivaldi-stable /opt/vivaldi/vivaldi-bin flags=(attach_disconnected,mediate_deleted) {

Yen Zeichen statt Backslash im Browser

Hatte unter Linux/in Vivaldi (vermutlich aber in allen Browsern) Yen Zeichen statt Backslashes auf Webseitenteilen die mit Courier New gearbeitet haben.

Lösung: ~/.config/fontconfig/fonts.conf (oder ~/.fonts.conf oder systemweit in /etc/fonts/local.conf einfügen) – hier Verbiegung auf “Hack Nerd Font Mono”:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">

<fontconfig>
 <!-- Replace Courier with a better-looking font -->
 <match target="pattern" name="family">
   <test name="family" qual="any"><string>Courier New</string></test>
   <edit name="family" mode="assign">
     <string>Hack Nerd Font Mono</string>
   </edit>
 </match>
</fontconfig>

Quellen:
https://wiki.archlinux.org/title/Font_configuration
https://askubuntu.com/questions/28419/how-to-most-elegantly-replace-courier-new-with-another-font-system-wide

WordPress an Fediverse andocken

Wer seinen Blog ans Fediverse andocken will: https://wordpress.org/plugins/activitypub/, aus irgendeinem Grund werden die Simple Permalinks (/?p=nnn) nicht akzeptiert – hab daher auf die Variante mit Postname als URL-Teil umgestellt und damit alle gespeicherten Permalinks vernichten müssen 🙁

Im Fediverse kann man auf alle Fälle jetzt über blog@roman.gallauner.at oder https://roman.gallauner.at/@blog folgen 🙂

Dreist geklaut von: https://vkc.sh/activitypub-activate/

Dependency aus DEB entfernen

Da der TP-Link Omada Controller auf ein JSVC (Java Daemon Starter) beharrt welches es unter Bullseye (und auch Bookworm) nicht gibt habe ich hier beschrieben wie man diese Dependency umgeht (und passende JSVC Version baut).

Problem: Man kann dann nicht mehr das OS updaten weil apt die fehlende Dependency bemeckert.

Lösung: Omada DEB umbauen: Als root in ein Verzeichnis auspacken (dpkg-deb -R), control File editieren und mit dpkg-deb -b das neue Paket bauen.

sudo su
mkdir omada
cp ./Omada_SDN_Controller_v5.13.30.8_linux_x64.deb ./omada
cd omada
mkdir tmp
dpkg-deb -R Omada_SDN_Controller_v5.13.30.8_linux_x64.deb tmp
cd tmp/DEBIAN
vi control
# hier dependency entfernen
# und version anpassen (ich hab ~roman angehängt)
cd ../..
dpkg-deb -b tmp Omada_SDN_Controller_v5.13.30.8~roman_linux_x64.deb

Danach ganz normal mit dpkg -i installieren.

Wireshark DNS A-Query Display Filter

Aufgabe: Nur Pakete anzeigen die eine DNS Query nach einem A-Record darstellen – ohne die Pakete mit der Response (die ja auch Queries sind halt mit einem Response-Segment).

dns && dns.flags.response==0 && dns.flags.opcode==0 && dns.qry.type==1  

dns = klar
response = ohne Response
opcode=query
type=A

Mastodon auf URL ungleich Domäne

Wer Mastodon Server so wie ich auf Server der nicht wie Domäne heißt betreibt (Server: social.galluner.fun, Domäne für User: gallauner.fun, also z.B. @roman – also WEB_DOMAIN != LOCAL_DOMAIN) aber auch nicht gleich die Domäne 1:1 auf Mastodon weiterleiten will weil vielleicht für andere Webseite benutzt funktionieren für mich bisher folgende Weiterleitungen (natürlich inklusive allem was im Originalrequest in der URI hinten dran stand):

# für federation
/.well-known/*
# für following von anderen Instanzen
/authorize_interaction
# falls jemand auf die Idee kommt Standard <domäne>/users/<user>
/users/*

Bin mir ziemlich sicher dass da noch was dazu kommt 🙂

WordPress Preview Cards in Mastodon

Mein aktuelles Theme hat in Mastodon Preview Cards ohne Bild und Text erzeugt, Lösung ist dass Mastodon keine rich oEmbeds erlaubt daher im WordPress Thema in function.php gemäß Anleitung auf link only umgebaut.

Codeteil der in function.php vom Theme einzubauen ist (irgendwo):

/* Return link instead of rich oembed data */
function filter_oembed_response_data($data) {
  if ($data['type'] === 'rich') {
    $data['type'] = 'link';
    unset($data['html']);
  }
  /* While we're at it, remove single quotes html entities */
  $data["title"] = str_replace("&rsquo;","'", $data["title"]);

  return $data;
}
add_filter('oembed_response_data', 'filter_oembed_response_data', 11, 4);

Quelle: https://www.colino.net/wordpress/en/archives/2022/11/27/wordpress-fix-thumbnail-on-mastodons-preview-cards/

Single User Mastodon mit rootless Podman auf Debian

Voraussetzungen:

  • Server mit Zugang von und zum Internetz 🙂
  • public DNS Record (A/CNAME) für Webserver
  • Podman 4.x mit netavark als Network Backend, siehe auch hier.

Mastodon von Github clonen

git clone https://github.com/tootsuite/mastodon

Änderungen im docker-compose.yml:

  • Da Podman nicht per Default auf docker.io nach den Images sucht im docker-compose.yml postgres und redis Image auf docker.io/postgres:.. bzw. docker.io/redis:… ändern.
  • Optional: web/redis/db/etc. sind etwas generisch wenn man mehrere Dienste hinter dem folgenden Caddy verstecken will – daher Container- und Netzwerknamen mit mastodon_ prefixieren

Images ziehen, da wir Caddy dann in anderem Deployment starten und die Netzwerke sonst vom Namen her unterschiedlich wären (podman-compose nimmt per Default Verzeichnisnamen als Prefix was man über die Angabe eines Projekts übersteuern kann, im Beispiel “ext”):

podman-compose -p ext pull

Mastodon Setup starten:

podman-compose -p ext run mastodon_web bundle exec rake mastodon:setup

Die Fragen:

  • Domäne ist der Name mit dem die Instanz aufscheinen soll – muss NICHT der Webservername sein wie ich ursprünglich angenommen habe. Also z.B. whatever.at wenn Webserver social.whatever.at heissen soll. Die Fediverse Usernamen sind dann @whoever@whatever.at.
  • Single User Mode: No – stellen wir später um nachdem wir interaktiv ersten Account angelegt haben (auch über tootctl möglich dann könnte man hier schon Yes verwenden)
  • Postgres/Redis: Bis auf Rechnername (wenn wie oben mit mastodon_ prefixiert) ohne Änderung übernehmen.
  • Attachments werden nicht in einer Cloud gespeichert.
  • Mailing nicht über localhost – passende SMTP Settings angeben.
  • An dieser Stelle werden die Settings ausgegeben – in Datei .env.production speichern.
  • DB erstellen lassen
  • KEINEN Admin erstellen, Setup läuft hier sonst in einen Fehler

Alle laufenden Container entfernen.

In .env.production einbauen damit Webserver nicht gleich Instanzname sein muss:

WEB_DOMAIN=social.whatever.at

Das Ganze starten:

podman-compose -p ext up -d

Damit man Attachments oder auch z.B. Avatarbilder raufladen kann muss man Security von einem Folder noch ändern (die Start ID in /etc/subuid für den podman ausführenden User + 990 – absolut keine Ahnung warum 990 wenn die UID des mastodon Users im Container 991 ist 🙂 ):

chown -R 100990:100990 ./public/system

An dieser Stelle haben wir auf 127.0.0.1:3000 Webserver und auf 127.0.0.1:4000 API Server laufen, mit Caddy in einem zweiten podman-compose Deployment bringen wir das samt Lets Encrypt ins Internetz.

docker-compose.yml (unter der Annahme dass Container+Netze mit mastodon_ prefixiert wurden):

version: '3'
services:
 caddy:
   image: docker.io/caddy:latest
   container_name: caddy
   ports:
     - 80:80
     - 443:443
   volumes:
     - ./Caddyfile:/etc/caddy/Caddyfile
     - ./caddy-data/certs:/data
   restart: always
   depends_on:
     - mastodon_web
     - mastodon_streaming
   networks:
     - mastodon_external_network
     - mastodon_internal_network

networks:
 mastodon_external_network:
 mastodon_internal_network:
   internal: true

Caddyfile:

https://social.whatever.at {
  handle /api/v1/streaming*    {
     reverse_proxy mastodon_streaming:4000
  }

  handle    {
     reverse_proxy mastodon_web:3000
  }
}

Verzeichnis caddy-data erzeugen und schon kanns losgehen, wichtig gleiches Projekt wegen Netzwerknamen:

podman-compose -p ext up -d

An dieser Stelle sollte (sofern Caddy Zertifikat lösen konnte) https://social.whatever.at aufrubar sein – Account erstellen und aktivieren (Aktivierungslink via Mail), danach zum Admin machen (wiederum – unter der Annahme dass Projekt “ext” verwendet und Container/Netzwerke mit “mastodon_” prefixiert wurden):

podman exec -it ext_mastodon_web_1 /bin/bash

Im Container dann (Annahme neuer Account = whoever, casing bei Admin wichtig):

tootctl account modify whoever -- role=Admin

Danach die Instanz stoppen (web bleibt gerne hängen) und in .env.production auf Single User Mode ändern:

SINGLE_USER_MODE=true

Danach wie wieder starten. Fertig 😀

Provider ohne IPv6 prefix delegation: NAT66

Solange A1 am VDSL Modem keine IPv6 Prefix Delegation zulässt (es werden nur /64 Adressen geliefert) muss man für halbnativen IPv6 Zugriff (und vorhersagbare/die Möglichkeit von statischen lokalen Adressen) in die Trickkiste greifen und NAT66 von den lokalen ULAs (fd::/8) auf die öffentliche GUA am Modem konfigurieren. Hier am Beispiel OpenWrt (alles LuCI, Stand 23.05.2):

Network/Interfaces/Global network options: Check ob “IPv6 ULA-Prefix” vorhanden ist (der ausgewürfelte /48 prefix für die lokalen fd:: Adressen)

Network/Interfaces/Interfaces/Interface der Wahl/DHCP Server/IPv6 Settings: RA-Service auf “server mode” (DHCP Server und NDP Proxy bleibt disabled)

Darauf erscheint Zusatztab “IPv6 RA Settings”: “Default Router” auf “on available prefix”

Ist das angewendet gibts unter Network/Interfaces/Interfaces/Interfache der Wahl/General Settings neue Felder für die IPv6 Adresse (nur das Default Interface “lan” erhält eine Adresse mit dem ULA Prefix und fdxx:xxxx:xxxx::1/60, dort ist dann naturgemäß nichts zu tun) – dort dann passende IPv6 Adresse eintragen (z.B. VLAN hinter dem /48 Teil der vorgegeben ist für /60 Netz – im Beispiel VLAN 20):

Network/Interfaces/Interfaces/wan6/Advanced Settings/IPv6 source routing disablen

Network/Firewall/Zones/der Zeile mit wan => REJECT (die mit Masquerading=enabled)/Advanced Settings/IPv6 Masquerading enablen

Damit hat man all das mühsam nachgebaut was mit IPv6 eigentlich der Vergangenheit angehören hätte sollen…. 🙁

Das alles ist im OpenWrt Wiki beschrieben:

# Enable IPv6 masquerading aka NAT66 on the WAN zone.
# ---------------------------------------------------
uci set firewall.@zone[1].masq6="1"
uci commit firewall
service firewall restart

# Announce IPv6 default route for the ULA prefix.
# (replace ".lan." with your interface to change)
# -----------------------------------------------
uci set dhcp.lan.ra_default="1"
uci commit dhcp
service odhcpd restart

# Disable IPv6 source filter on the upstream interface.
# -----------------------------------------------------
uci set network.wan6.sourcefilter="0"
uci commit network
service network restart

Debian Dependency ignorieren

Problem: Custom .DEB mit einer Dependency die in Debian nicht enthalten ist oder die Dependency ist falsch weil eine höhere Version der Dependency benötigt wird aber nicht in Debian enthalten ist
[TP-Link Omada Controller DEB mit JRE 17 verlangt JSVC >=1.0.8 aber 1.1.x ist tatsächlich notwendig, siehe hier]

Lösung (grauslich aber es wirkt): /var/lib/dpkg/status editieren und beim entsprechenden Paket (welches z.B. bei apt upgrade dann die fehlende Dependency einfordert und –fix-broken vorschlägt was zwar apt glücklich machen würde aber Omada bricht) bei “Depends:” die irrgeleitete Dependency entfernen.