Ausflug zu Pixelfed mit Docker im November 2019

Intro

Dieses Wochenende habe ich mir mal Pixelfed angesehen - eine Art Instagram-Klon. Dieser Blogeintrag dient dazu, die recherchierten Informationen mal alle zusammenzutragen, weil die Dokumentation zu wünschen übrig lässt.

Pixelfed ist ein mit Laravel in PHP erstelltes Projekt. Neben PHP hat es noch weitere Abhängigkeiten zu einer Datenbank: MySQL, PGSQL und sqlite werden wohl unterstützt, wobei MySQL im Moment also default vorgesehen ist. Außerdem kommt noch Redis dazu.

Das klingt super, um es in Docker Container zu packen. Erste Aktivitäten bzgl. Docker sind in dem Projekt auch schon gestartet. Leider nutzt der Initiator des Projekts, Daniel, nicht Docker. Daher ist alles rund um Docker etwas stiefmütterlich gepflegt. Das führt also zu diesem Blog und ein paar Änderungen für Docker, die auch schon in das Projekt eingeflossen sind.

Installation

Wie in der Installtionsdokumentation geschrieben, lädt man sich zunächst eine Kopie des Projekts und erstellt die Produktionsumgebung:

git clone -b dev https://github.com/pixelfed/pixelfed.git pixelfed
cd pixelfed
cp .env.example .env

Die Datei .env passt man entsprechend den eigenen Anforderungen an. Hierbei gibt es zu beachten, dass man den APP_KEY mit exakt 32 zufälligen Zeichen befüllt. Der eigentliche Weg wäre gewesen, dieses Feld leer zu lassen und mit dem Befehl php artisan key:generate einen Key zu erstellen. Doch das befüllte bei mir dieses Feld mit einem base64 codierten Schlüssel, mit dem die Applikation nichts anfangen konnte. Also habe ich kurzerhand KeepassXC bemüht, mir 32 Zeichen Zufall zu geben und diese manuall eingetragen. Ich habe noch nicht herausgefunden, welchen Nebeneffekt das haben könnte. Außerdem habe ich das mit key:generate noch mit der Version v0.10.6 getestet. Mittlerweile habe ich auf den heutigen Stand vom dev Branch gewechselt, wo ich nicht noch einmal ausprobiert habe, ob das Problem noch exisitiert.

Wenn die .env stimmig ist, kann man die Container starten und die Datenbank erstellen:

docker-compose up
docker-compose exec app php artisan migrate --force

Feintuning

Administrator

Im Prinzip ist man damit fertig und man kann Pixelfed aufrufen, sich registrieren und es nutzen. Evtl. möchte man noch einen Adminnutzer bestimmen. Das geht mit docker-compose mit dem folgenden Kommando: docker-compose exec app php artisan user:admin ADMINUSER, wobei ADMINUSER durch den Nutzernamen ersetzt wird, der die Rolle zugeteilt bekommen soll.

App Unterstützung

Pixelfed unterstützt mobile Apps (noch nicht vollständig). Um die generelle Unterstützung für mobile Apps zu aktivieren, muss man laut Release Notes von v0.10.6 folgenden Schritte durchführen.

docker-compose exec app php artisan passport:keys

In die Datei .env wird die Zeile OAUTH_ENABLED=true hinzugefügt und anschließend die Änderung dieser Datei neu in den Cache geladen:

docker-compose exec app php artisan config:cache

Das hat bei mir aber nicht ausgereicht, sodass ich die Container mittels down und up neustarten musste. Ein restart hat nicht gereicht:

docker-compose down
docker-compose up

Welche App unterstützt wird, habe ich weiter unten aufgeschrieben.

Orte

Die neue sog. “ComposeUI v4 BETA” für das Hochladen von Bilder unterstützt seit Release v0.10.1, dass man den Ort, wo das Foto erstellt wurde, festlegen kann. Um die Unterstützung für dieses Feature zu aktivieren muss man einmalig folgendes Kommando ausführen während die Docker Container laufen:

docker-compose exec app php artisan import:cities

Damit kann man beim Beitrag erstellen den Ort festlegen. Die Suche nach Orten beachtet die Groß- und Kleinschreibung.

Dateigröße für Uploads

Da ich einen nginx als Proxy für den Docker Container nutze, muss der nginx so konfiguriert werden, dass der Standwert iHv. 1 MB erhöht wird. Man sollte den Wert so erhöhen, dass er größer gleich dem Wert für Uploads ist, der in der Datei .env eingestellt ist.

v0.10.7?

Da das Release v0.10.7 im Moment noch auf sich warten lässt, wurde verkündet, dass man den dev Branch, der bereits 145 Commits neuer als v0.10.6 ist, nutzen soll.

Andere Benutzer finden

Um Nutzer anderer Pixelfed-Instanzen hinzuzufügen, muss man die komplette URL zu dem jeweiligen Profil in das Suchfenster in Pixelfed eingeben. Dann findet Pixelfed den Nutzer der anderen Instanz und man kann ihn hinzufügen.

Offene Punkte

Filter

Was im Moment noch nicht funktioniert, ist die Vorschau von einem Bild für verschiedene Filter. Diese Vorschau sieht man direkt nach dem Upload eines Bildes und sollte eigentlich das Originalbild anzeigen wie es mit verschiedenen Filtern aussieht. Diese Filterbilder können im Moment aber nicht angezeigt werden und die URL auf diese Bilder gibt vom Webserver ein 404 zurück.

PostgreSQL

Wenn man pgsql als Datenbank wählt, kommt man momentan nicht weit, da diese noch nicht richtig unterstützt wird.

Welche App wird unterstützt?

Ich habe Fedilab und Fedilab Lite erfolglos getestet. Die Ansage ist aber, dass Fedilab Lite ab Version 2.23.0 Pixelfed untersützt. Nur doof, dass in F-Droid das Update immer noch nicht angekommen ist. Dort ist Version 2.22.2 noch die aktuellste. 😞

Mein Pixelfed Konto

Wer bis hier gelesen hat und mich auf Pixelfed hinzufügen möchte, kann mich unter folgender Adresse finden: https://pixel.strubbl.de/strubbl

Benutzer im Dockerfile hinzufügen

In Alpine Linux basierten Dockerfiles kann man einen neuen Nutzer mit Standardbenutzerprivilegien wie folgt hinzufügen:

addgroup myuser && adduser -D -G myuser myuser
chown -R myuser: /home/myuser

In Ubuntu/Debian geht das wie folgt:

useradd -ms /bin/bash myuser

Schließlich kann man den Nutzer im Dockerfile mit USER aktivieren und sein Home-Verzeichnis als WORKDIR einstellen:

USER myuser
WORKDIR /home/myuser

NTFS schreiben in Mac OS X via ntfs-3g (mit Homebrew installiert)

Um auf NTFS Dateisysteme in Mac OS X schreiben zu können, kann man ntfs-3g installieren. Zunächst installiert man die Abhängigkeit [FUSE for macOS] 1 und anschließend direkt [ntfs-3g] 2.

brew cask install osxfuse
brew install ntfs-3g

Hierbei schlägt bei mir der brew link Schritt fehl, sodass ich den mkntfs-Befehl nicht im Pfad habe. Aber das ist okay für mich, weil mein USB-Stick schon mit NTFS formatiert ist.

Als nächstes darf man in Windows-Manier erstmal neustarten.

Nach dem Neustart kann endlich ein USB-Stick, der mit NTFS formatiert ist, gemountet werden:

sudo mkdir /Volumes/NTFS
sudo umount /dev/disk2s1
sudo /usr/local/Cellar/ntfs-3g/2017.3.23/bin/ntfs-3g /dev/disk2s1 /Volumes/NTFS -olocal -oallow_other

Der erste Befehl erstellt das Zielverzeichnis, wo der USB-Stick eingehangen werden soll. Danach wird der automatisch eingehangene, nur lesbare USB-Stick ausgehangen und schließlich mit dem dritten Befehl beschreibbar unter das Zielverzeichnis eingehangen. Doch dann kommen diverse Popups bzgl. der Sicherheitseinstellungen, die auf Risiken hinweisen.

Durch die klickt man sich und erlaubt ntfs-3g.

Schließlich wiederholt man den letzten Befehl und hat nun unter dem Pfad /Volumes/NTFS den USB-Stick zum Beschreiben eingehangen.

sudo /usr/local/Cellar/ntfs-3g/2017.3.23/bin/ntfs-3g /dev/disk2s1 /Volumes/NTFS -olocal -oallow_other

Wenn man den USB-Stick automatisch eingehangen haben möchte, sobald man einen USB-Stick einsteckt, muss man in den Recovery-Modus booten und [der Anleitung] 3 folgen.

Macosx Mojave Brew Upgrade Fehler: missing xcrun

Bei meinem letzten brew upgrade trat folgender Fehler auf:

$ brew upgrade
==> Upgrading 5 outdated packages, with result:
vim 8.1.0400 -> 8.1.0450, go 1.11 -> 1.11.1, sqlite 3.25.1 -> 3.25.2, git 2.19.0_1 -> 2.19.0_2
==> Upgrading sqlite
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Error: Failure while executing; `git config --local --replace-all homebrew.private true` exited with 1.

Die ergooglete Lösung für mich war folgende Xcode Installation:

$ xcode-select --install
xcode-select: note: install requested for command line developer tools

Anschließend lief das brew upgrade ohne weitere Komplikationen durch.