Hubzilla mit einem YunoHost-Server betreiben

Wer einen Server (egal ob zu Hause, oder auf einem gemieteten VPS- oder Rootserver) mit YunoHost betreibt, hat es einfach. Die Software nimmt einem sehr viel Verwaltungsarbeit im Detail ab und bietet unzählige Applikationen, die man mit wenig Aufwand installieren, in Betrieb nehmen und pflegen kann.

Auch Hubzilla gehört zu den Apps, die bei YunoHost angeboten werden. Hubzilla ist mit wenigen Eingaben und Voraussetzungen installiert.

Man benötigt eine eigene Domain oder Subdomain. Dabei ist darauf zu achten, dass unter dieser Domain noch keine andere Fediverse-Software installiert war. Das ist eine "Besonderheit" des Fediverse. Einmal verwendete Domains sind für das Fediverse "verbrannt", wenn man unter ihnen eine neue oder andere Fedi-Software installieren möchte. Aber egal... wir nehmen einmal an, wir haben eine frische, "jungfräuliche" Domain. Dann ist die Installation mit wenigen Klicks und Eingaben erledigt.

Leider ist es inzwischen aber so, dass die App "Hubzilla" bei YunoHost nicht mehr wirklich aktiv betreut wird. Das führt dazu, dass Updates (auch wichtige, sicherheitsrelevante, die zeitnah durchgeführt werden müssten) nur sehr verzögert Einzug halten. Derzeit (Ende März 2024) liegt das letzte Update über zwei Monate zurück und es gab seither schon vier Updates... davon zwei sicherheitsrelevante, für welche ein Update ausdrücklich empfohlen wurde.

Aus genau diesem Grund, habe ich nun Hubzilla unter YunoHost auf eine andere Art installiert. Die Vorteile, die einem YunoHost bietet, bleiben dabei erhalten (einfache Backups, kein händisches Einrichten von Reverse Proxy, Aktualität des zugrundeliegenden Systems, Einrichtung einer Datenbank etc.).

Und so funktioniert das:

YunoHost bietet eine "Universal-App", die als "My Webapp" bezeichnet wird. Mit dieser kann eine benutzerdefinierte Webanwendung installiert werden. Sie bietet SFTP-Zugriff, bei Bedarf eine Datenbank und PHP. Es wird unter /var/www ein Verzeichnis angelegt, welches über die bei Installation gewählte Domain erreichbar ist.

hzyh01

Also der optimale Ort für eine Hubzilla-Installation.

Zunächst muss man also eine entsprechende Domain in YunoHost anlegen und selbstverständlich auch ein Zertifikat erstellen (Let's Encrypt). Das funktioniert genau so, wie für die "normale" Hubzilla-Installation z.B. mit der Verwaltungsoberfläche von YunoHost.

Man wählt unter Applikationen → +Installieren aus dem Katalog die Anwendung "My Webapp".

hzyh02

Nun kann man eine Bezeichnung für das Label der Kachel (in der YH-Oberfläche) eingeben, die Domain/Subdomain auswählen. Beim URL-Pfad sollte man, um Probleme zu vermeiden, nur "/" stehen lassen. Für einen öffentlichen Hub, wählt man im Feld "Wer soll Zugriff auf diese App haben?" den Eintrag "Besucher".

Als PHP-Version für Hubzilla wählt man 8.2 aus und anschließend noch den Typ des Datenbank (MySQL oder Postgresql).

Dann startet man die Installation der Custom-Webapp.

Ist sie durchgelaufen, muss man sich per SSH am eigenen Server einloggen. Im Verzeichnis /var/www findet man nun ein neues Verzeichnis my_webapp und in diesem ein Unterverzeichnis www. Letzteres ist das Verzeichnis, welches beim Aufruf der Domain vom Webserver geliefert wird.

Nun kann man ganz einfach nach der offiziellen Installationsanleitung Hubzilla installieren. Im Root-Verzeichnis (my_webapp/www) findet man eine Datei db_access.txt, in welcher die Zugangsdaten für die Datenbank stehen. Wichtig: sichern! Die Daten (Datenbankname, Datenbanknutzer, Datenbankpasswort) benötigen wir für die Installation von Hubzilla noch.

Nun muss das Verzeichnis my_webapp/www geleert werden, also alle darin enthaltenen Dateien gelöscht, damit man das Hubzilla-Repo dorthin klonen kann.

Damit die Dateirechte sofort passen... und generell sowieso, empfiehlt es sich, an dieser Stelle als Benutzer "my_webapp" fortzufahren. Dafür gibt man

yunohost app shell my_webapp

ein.

Nun befindet man sich im Verzeichnis my_webapp. Mit

git clone https://framagit.org/hubzilla/core.git www

klont man das Repo an die richtige Stelle. Danach am besten sofort in das Verzeichnis www wechseln:

cd www

Es wird beim Klonen auch eine Datei .htaccess erzeugt. Diese dient der Konfiguration des Apache Webservers. Nun nutzt YunoHost aber nginx und nicht Apache, weshalb diese Datei nicht von Bedeutung ist.

Bei der Installation von My Webapp werden Konfigurationsdateien unter /etc/nginx/conf.d/<domain von my_webapp> erzeugt. Diese genügen aber den Ansprüchen von Hubzilla nicht. Die my_webapp.conf muss wie folgt aussehen:

#sub_path_only rewrite ^/$ / permanent;

location / {
  # Path to source
  alias /var/www/my_webapp/www/;
  if (!-e $request_filename) {
    rewrite ^(.*)$ /index.php?q=$1;
  }

  # Default indexes and catch-all
  index index.php;
  charset utf-8;

  # Common parameter to increase upload size limit in conjunction with dedicated php-fpm file
  client_max_body_size 50M;
  client_body_buffer_size 128k;
  location ~* \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php/php8.2-fpm-hubzilla.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

  # make sure webfinger and other well known services aren't blocked
  # by denying dot files and rewrite request to the front controller
  location ^~ /.well-known/ {
    allow all;
    if (!-e $request_filename) {
      rewrite ^(.*)$ /index.php?q=$1;
    }
  }

  # statically serve these file types when possible
  # otherwise fall back to front controller
  # allow browser to cache them
  # added .htm for advanced source code editor library
  # location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|map|ttf|woff|woff2|svg)$ {
  #  expires 30d;
  #  try_files $uri /index.php?q=$uri&$args;
  # }

  # block these file types
  location ~* \.(tpl|md|tgz|log|out)$ {
    deny all;
  }

  # deny access to all dot files
  location ~ /\. {
    deny all;
  }

  #deny access to store
  location ~ /store {
    deny all;
  }

  #deny access to util
  location ~ /util {
    deny all;
  }

  # Include SSOWAT user panel.
  include conf.d/yunohost_panel.conf.inc;
}

Für eine Hubzilla-Installation sind innerhalb des Hubzilla-Verzeichnisses (hier also my_webapp/www) einige Verzeichnisse mit entsprechenden Zugriffsrechten essenziell. Sie werden eigentlich bei der Installation über den Webbrowser angelegt (aber wohl nicht immer). Es ist aber sicherer und schadet nicht, wenn man mit

cd www

ins Hubzilla-Verzeichnis wechselt und diese mit

mkdir -p "store/[data]/smarty3"

chmod -R 777 store

anlegt.

Um auch die Hubzilla-Addons zu installieren, muss man noch

util/add_addon_repo https://framagit.org/hubzilla/addons.git hzaddons

util/update_addon_repo hzaddons

eingeben.

PHP-Extensions: Für Hubzilla ab Version 9 (aktuell) sind die PHP-Extensions sodium, gmp (oder bcmath) und intl erforderlich. Bei meiner YunoHost-installation waren sodium unf gmp vorhanden, intl hingegen fehlte.

Herausfinden, welche Extensions installiert und aktiviert sind kann man mit diesem Kommando:

php -m

Mit

sudo apt-get update

und

sudo apt-get install php8.2-intl

ist die fehlende Extension rasch installiert.

php -m | grep intl

sollte das nun auch anzeigen.

Jetzt ist der Moment gekommen, an welchem man im Webbrowser die URL der neuen Installation aufruft.

Eigentlich sollte alles nun problemlos durchlaufen (ansonsten auftretenden Fehlern ggf. gemäß der offiziellen Installationsanleitung auf den Grund gehen).

Jetzt ist es erforderlich, die frisch erzeugte .htconfig.php anzuschauen und dort den Pfad zu PHP anzupassen:

// Location of PHP command line processor
App::$config['system']['php_path'] = '/usr/bin/php8.2';

Wenn man nun noch immer als Benutzer my_webapp unterwegs ist, sollte man sich mit

php -v

die aktuell genutzte PHP-Version anzeigen lassen. Es sollte die Version 8.2 angezeigt werden.

HINWEIS:

Der Aufruf von php ohne Pfadangabe ruft /usr/bin/php auf. Dabei handelt es sich um einen symbolischen Link auf /etc/alternatives/php. Und dies wiederum ist ein symbolischer Link auf die im System generell verwendeten PHP-Programmdatei. Bei meiner Installation war es so, dass ich einmal eine App installiert hatte, die zwingend php7.4 benötigte. YunoHost hatte deshalb das php unter /etc/alternatives auf /usr/bin/php7.4 verlinkt. Eigentlich sollte das in der my_webapp-Umgebung aber kein Problem sein und auf php8.2 (wie bei Installation gewählt) verweisen. Bei mir war das anfangs aber nicht so (inzwischen schon, weshalb auch immer).

Um das zu "reparieren", habe ich den symbolischen Link /etc/alternatives/php auf /usr/bin/php8.2 umgebogen.

Das ist erforderlich, weil die PHP-Skripte aus util per shebang den Interpreter via

#!/usr/bin/env php

aufrufen und damit auf den Eintrag in /etc/alternatives zurückgreifen. Bei der Verwendung von Skripten aus util kommt es, wenn dieser auf php7.4 verweist, zum Programmabbruch mit der Fehlermeldung, dass eine zu alte PHP-Version verwendet wird.

Jetzt folgt noch ein weiterer, sehr wichtiger Schritt: das Anlegen eines Cronjobs für wichtige Hintergrunddienste.

Hierfür ruft man

crontab -e

auf und fügt die Zeile

*/10 * * * * cd /var/www/my_webapp/www; /usr/bin/php8.2 Zotlabs/Daemon/Master.php Cron > /dev/null 2>&1

zu.

Und nun sollte die Hubzilla-Installation unter YunoHost ordentlich laufen. Der Rest sollte bekannt sein (als erstes einen Account mit der zuvor angegebenen Mailadresse registrieren... das ist der Admin-Account) und dann einfach "benutzen". ;-)


WICHTIGER HINWEIS ZU UPDATES VON YUNOHOST:

Zumindest beim letzten Update der verwendeten my_webapp auf Version 1.0-ynh18, ich vermute aber auch bei jedem folgenden, wird die nginx-Konfigurationsdatei in /etc/nginx/conf.d/deinedomain.d/my_webapp.conf mit Standardeinstellungen überschrieben, was dazu führt, dass Hubzilla nicht mehr funktioniert.

Deshalb ist es sinnvoll, diese Konfigurationsdatei in einem separaten Backupverzeichnis auf dem Server vorzuhalten und die aktualisierte Datei damit zu überschreiben. Alternativ kann man sie auch aus der automatisch beim Update angelegten Backup-Datei von YunoHost extrahieren und sie wieder in o.g. Verzeichnis kopieren (überschreiben).