Channel Apps

navigation

BlogAnleitungen/TutorialsLese-Log
Es gibt gesamt 11 Artikel
Du bist in Kategorie Hubzilla
📊 Artikel pro Kategorie: - Android: 1 Artikel - Datenbank: 5 Artikel - Fediverse: 1 Artikel - GrapheneOS: 1 Artikel - Hubzilla: 11 Artikel - Nextcloud: 1 Artikel - Tutorials: 11 Artikel

Bei Lima-City, wo meine Hubzilla-Instanz auch gehostet wird, gibt es ein Webhosting-Paket für 1€ die ersten 3 Monate, danach 3,50€. Das Paket lässt sich auch monatlich kündigen wenn ihr doch keine Lust mehr haben solltet

Produktdetails:
★eine Domain inklusive (.de, .at, .eu, .com, .info, .biz, .net, .org, .ch)
★30 GB Speicherplatz
★Traffic unbegrenzt
★kostenlose, automatische SSL-Zertifikate per Let's Encrypt
★5 GB MySQL-Speicher, unbegrenzt MySQL-Datenbanken
10 GB E-Mail-Speicher, unbegrenzt Postfächer & Weiterleitungen

Webhosting, Domains und Cloud von lima-city (Ref-Link)

Man kann sich über den Lima-City Support aber auch ein kostenloses, für den Anfang ausreichendes Paket freischalten lassen und dann später das Paket einfach upgraden:

Lima-City Support

Installation:

Ich werde erst die für Anfänger einfachere Installations-Methode beschreiben, danach dann die für GIT:

Zuerst lädt man die Hubzilla-Core als Zip herunter: https://framagit.org/hubzilla/core

Bildschirmfoto vom 2026-02-27 12-48-33.png

Nun richtet man sich einen FTP-Zugang bei Lima-City ein:

Bildschirmfoto vom 2026-02-27 13-25-58.png

Die Login-Daten gibt man jetzt in einem FTP-Programm ein damit man die Filezilla-Dateien auf den Webserver laden kann, ich benutze gerne FileZilla - The free FTP solution

Bildschirmfoto vom 2026-02-27 13-33-44.png

Hat man seinen FTP-Zugang fertig eingerichtet und ist verbunden, erstellt man einen Ordner auf dem FTP und lädt den Inhalt des Ordners "core-master" hoch. Weil das viele Dateien sind und etwas dauert kann man sich in der Zwischenzeit nen Kaffee machen, ne Runde schlafen, die Blumen gießen oder direkt eine Domain oder Subdomain einrichten unter der Hubzilla erreichbar sein soll

Bildschirmfoto vom 2026-02-27 13-49-33.png

Hat man das 1€-Paket bei Lima-City.de gebucht, hat man direkt eine richtige www-Adresse für die man sich da einen schicken Namen einrichten kann. Beim kostenlosen Paket macht man sich einfach eine kostenlose Subdomain

Bildschirmfoto vom 2026-02-27 13-50-46.png

Dort klickt man dann "ein vorhandenes Verzeichnis auf dem Webspace auswählen" an und und wählt das Verzeichnis aus das man eben im FTP erstellt hat in das man die "core-master" geladen hat. Damit die Subdomain weiß welches Verzeichnis sie aufrufen soll

Jetzt braucht man nur noch eine MySQL-Datenbank, keine Sorge, ganz easy

Bildschirmfoto vom 2026-02-27 14-07-33.png

Genauso wie im Screenshot alles anklicken (Benutzer erstellen, localhost, Admin-Zugriff). Für den Benutzernamen vergibt man in dem Feld eine Nummer, ich hab einfach die 10 genommen weil ich schon viele Datenbanken habe :) Dann noch eben ein Passwort eingeben, dass brauchen wir gleich für Hubzilla

Bildschirmfoto vom 2026-02-27 14-10-51.png

Nun ruft man im Browser seine erstellt Subdomain auf und klickt unten auf Next. Die Hubzilla-Installation beginnt :)

Bildschirmfoto vom 2026-02-27 14-05-44.png

Jetzt will Hubzilla wissen wie er sich mit der eben erstellten Datenbank verbinden kann. Also die Daten eingeben. Wichtig sind auch die ersten beiden Einträge "Database Server Name" und "Database Port". Dort localhost und 3306 eintippen

Bildschirmfoto vom 2026-02-27 14-43-37.png

Zack, Hubzilla ist installiert, jetzt müssen wir noch unsere Email und ein Passwort für den Hubzilla-Account festlegen. Als Default Timezone am besten Berlin

Bildschirmfoto vom 2026-02-27 14-48-25.png

Tadaaa 🥳🥳🥳

Bildschirmfoto vom 2026-02-27 14-51-46.png

Über den Register-Link auf der Seite erstellt man sich jetzt einen Account mit dem man dann auf seiner Hubzilla-Instanz unterwegs ist

Viel Spaß...

#Hubzilla #Datenbank #MySQL #Lima-City.de
Nach der Hubzilla-Installation kann man noch die ganzen Standard-Addons hinzuzufügen. Das ist wichtig wenn man sich mit ActivityPub, also den ganzen anderen Diensten aus dem Fediverse verbinden möchte. Dadurch wird es möglich, z.B. die Beiträge der Mastodon-User zu empfangen. Oder die von Friendica, Pixelfed, Lemmy, Misskey usw. Anderfalls hat man nur Beiträge aus dem Zot-Netzwerk, also die anderer Hubzilla-User. Und da ist leider noch wenig los. Außerdem kann man ja mit dem Addon "PubCrawl" die Hubzilla-Instanz als viel leichter zu installieren und administrierende Mastodon-Instanz verwenden. ;)

Außerdem sind da noch wichtige Addons wie SuperBlock, Lesezeichen, Karten, Gallerie drin.

Da meine Hubzilla-Instanz von Lima-City.de gehostet wird und auch mein letzter Artikel auf Lima-City basiert benötigt man für die Addon-Installation einen SSH-Zugang zu seinem Webserver. Wie das funktioniert ist auf Lima-City gut dokumentiert und auch einfach: SSH-Zugang einrichten Natürlich hat so gut wie jeder Webhoster SSH, ich sags nur wegen den Anleitungen hier. :)

Zuerst setzt man im FTP-Programm die Rechte des Ordners in seinem Hubzilla-Ordner auf 755 falls er das nicht schon ist.

Dann loggt man sich in seiner SSH-Konsole ein, wechselt in seinen Ordner (bei mir hubtest) mit der Hubzilla-Installation:
cd hubtest

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

Zur Sicherheit oder für später kann man den Update-Befehl noch machen:
util/update_addon_repo hzaddons

Bildschirmfoto vom 2026-02-27 16-49-43.png

#Hubzilla #Tutorials #Fediverse #Lima-City.de

Diesmal werden alle vorhandenen Kategorien einzeln ausgezählt und sortiert angezeigt, folgender Code teil muss angepasst werden:

$params[$ph] = "https://voidofxulub.com/cards/warzazel?cat={$cat}";
}

Screenshot der Ausgabe, es werden alle Kategorienamen namentlich angezeigt und dahinter jeweils die gezählten Einträge

/* --------------------------------------------------------------
Verbindung zur Datenbank (wie bisher)
-------------------------------------------------------------- */
$host = 'localhost';
$dbname = '...';
$user = '...';
$password = '...';

try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$user,
$password,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
} catch (PDOException $e) {
die('Verbindung fehlgeschlagen: ' . $e->getMessage());
}

/* --------------------------------------------------------------
Welche Kategorien willst du zählen?
Einfach das Array erweitern, wenn du neue hinzufügst.
-------------------------------------------------------------- */
$categories = [
'Belletristik',
'Holocaust',
'Krimi',
'Psychothriller',
'Thriller'
];

/* --------------------------------------------------------------
Platzhalter für das IN‑Statement bauen
-------------------------------------------------------------- */
$placeholders = [];
$params = [];

foreach ($categories as $i => $cat) {
$ph = ":cat$i";
$placeholders[] = $ph;
// Vollständige URL, wie sie in deiner Tabelle steht
$params[$ph] = "https://voidofxulub.com/cards/warzazel?cat={$cat}";
}

/* --------------------------------------------------------------
SQL‑Abfrage: Gruppiere nach URL und zähle pro Gruppe
-------------------------------------------------------------- /
$sql = "
SELECT url, COUNT(
) AS anzahl
FROM term
WHERE url IN (" . implode(', ', $placeholders) . ")
GROUP BY url
";

$stmt = $pdo->prepare($sql);

/* --------------------------------------------------------------
Parameter sicher binden
-------------------------------------------------------------- */
foreach ($params as $ph => $val) {
$stmt->bindValue($ph, $val, PDO::PARAM_STR);
}

/* --------------------------------------------------------------
Ausführen und Ergebnis verarbeiten
-------------------------------------------------------------- */
$stmt->execute();

/* --------------------------------------------------------------
Ergebnis in ein übersichtliches Array packen
-------------------------------------------------------------- */
$counts = []; // Schlüssel = Kategorie, Wert = Anzahl
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// URL wieder in die reine Kategorie zurückübersetzen
// (wir gehen davon aus, dass das Muster immer gleich ist)
preg_match('/cat=([^&]+)/', $row['url'], $m);
$category = $m[1] ?? 'unbekannt';
$counts[$category] = (int)$row['anzahl'];
}

/* --------------------------------------------------------------
Ausgabe
-------------------------------------------------------------- */
echo "📊 Ergebnisse pro Kategorie:\n";
foreach ($categories as $cat) {
$anz = $counts[$cat] ?? 0; // falls keine Einträge gefunden wurden
echo "- $cat: $anz Einträge\n";
}

#Hubzilla #Datenbank #MySQL

Als ich mir grade nochmal die Spalte "term" in der Hubzilla-Datenbank angeschaut habe ist mir aufgefallen das der vorherige Code ziemliche Probleme beim zusammenzählen machen kann. Das Problem ist das die Einträge aller User die man auf seinem Hub, also alle aus jedem Stream, Activitypub, Zot, sieht dort gespeichert werden. Und wenn da nur einer denselben Kategorienamen verwendet wie ihr wird der mit gezählt. Dummerweise finde ich in der Spalte aber auch keine eindeutigen Werte wie eine absolute User-ID, mit der man die Kategorie abgleichen mittels AND abgleichen könnte.

Man könnte seiner Kategorie eine lange Nummer geben aber das sähe ja blöd aus.

Also fällt mir grade für die App Karten und Artikel nur folgender Code ein, hier wird einfach die komplette Hub-Domain mitsamt dem Usernamen als Kategoriename abgefragt, das ist eindeutig genug:

$host = 'localhost';
$dbname = '...';
$user = '...';
$password = '...';

try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$user,
$password,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
} catch (PDOException $e) {
die('Verbindung fehlgeschlagen: ' . $e->getMessage());
}

$sql = "SELECT COUNT(*) AS anzahl FROM term WHERE url = :status";
$stmt = $pdo->prepare($sql);

// ==== Hier den Eintrag anpassen ====
$status = 'https://voidofxulub.com/cards/warzazel?cat=Lese-Log';
$stmt->bindParam(':status', $status, PDO::PARAM_STR);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

// ==== Ergebnis ausgeben ====
echo "Es gibt {$row['anzahl']} Einträge";

Den Teil wo die Suchvariable eingelesen wird, ändert man einfach wie folgt:

Für Karten:

$status = 'https://deine_hub_domain/cards/dein_nickname?cat=Deine_Kategorie';

Für Artikel:

$status = 'https://deine_hub_domain/articles/dein_nickname?cat=Deine_Kategorie';

Die steht aber auch im Browser-Adressfeld wenn man auf die jeweilige Kategorie klickt oder mit Rechtsklick kopiert

#Hubzilla #Datenbank #MySQL
@Der Pepe (Hubzilla) ⁂
@𝓒𝓱𝓻𝓲𝓼

Hey es gibt ne Änderung 😅 Ganz schön durchheinander gewürfelt die Datenbank 🤷‍♂️

Man kann sich in Hubzilla mit PHP jeden Wert aus der Datenbank holen, in einem Block ablegen und als Widget auf der Seite anzeigen lassen. Dazu muss die Hubzilla-App "Webseiten" installiert sein und die App "PDL Editor". Dann muss man auf seinem Kanal noch einstellen das Code zugelassen wird. Das aktiviert man unter Administration - Kanäle - Checkbox des Kanals anklicken - Code erlauben

Dann klickt man auf Webseiten - Blöcke - Erstellen - Art des Seiteninhalts - PHP

Als Blockname vergibt man einen Namen unter dem man den Block später im PDL Editor unter Items findet

Translated with DeepL.com (free version)

In Hubzilla, you can use PHP to retrieve any value from the database, store it in a block and display it as a widget on the page. To do this, you need to install the Hubzilla app "Websites" and the app "PDL Editor". Then you have to set your channel to allow code. This can be activated under Administration - Channels - Click the channel checkbox - Allow code

Then click on Websites - Blocks - Create - Type of page content - PHP

Assign a name to the block that you can later find in the PDL Editor under Items.

Bildschirmfoto vom Blockeditor

Hier der Code zum kopieren:

Here is the code to copy:

$host = 'localhost';
$dbname = 'Name der Datenbank'; //=== Anpassen ===
$user = 'Name des Datenbankusers'; //=== Anpassen ===
$password = 'Datenbank-Passwort'; //=== Anpassen ===

try {
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$user,
$password,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
} catch (PDOException $e) {
die('Verbindung fehlgeschlagen: ' . $e->getMessage());
}

$sql = "SELECT COUNT(*) AS anzahl FROM term WHERE term = :status";
$stmt = $pdo->prepare($sql);
$status = 'Kategoriename'; //=== Anpassen ===
$stmt->bindParam(':status', $status, PDO::PARAM_STR);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

// ==== Ergebnis ausgeben ====
echo "Es gibt {$row['anzahl']} Artikel";

Anmerkung: Es müssen 4 Werte angepasst werden, wichtig ist der "Kategoriename", denn die Anzahl derer wird aus der Datenbank zusammengezählt. Ich habe gestern noch keine anderen Werte in der riesigen Tabelle "term" gefunden wo scheinbar wirklich alles drin abgelegt wird woraus sich z.B. die Kategorie Artikel raus ableiten ließe.

Deswegen ist es wichtig, seinen Artikeln zusätzlich einen einzigartigen Kategorienamen zu geben der garantiert nicht anderweitig benutzt wird. Das sollte aber auch mit allem funktionieren was sich unter Kategorien ablegen lässt, z.B. Karten oder normale Posts, weil wie gesagt alles in der Tabelle Term abgelegt wird. Meine "term" hat nach 1 Woche bereits über 37.000 Einträge.

Ist das erledigt, geht man in den PDL Editor, wählt unter Modules die Seite aus, auf der der Block angezeigt werden soll, z.B. articles und unter items ist der Block dann zu finden:

Note: Four values need to be adjusted, the most important being the "category name", as the number of these is calculated from the database. Yesterday, I couldn't find any other values in the huge "term" table, which seems to contain everything, from which the category "articles" could be derived, for example.

That is why it is important to give your articles a unique category name that is guaranteed not to be used elsewhere. However, this should also work with everything that can be stored under categories, e.g. cards or normal posts, because, as I said, everything is stored in the Term table. After one week, my "term" already has over 37,000 entries.

Once this is done, go to the PDL Editor, select the page on which the block is to be displayed under Modules, e.g. articles, and the block can then be found under items:

Bildschirmfoto des Blocks mit Ausgabe der Anzahl der Artikel

Wichtig/Important
https://voidofxulub.com/item/053efe40-7d7b-4bd4-ace1-f165f8d9ee54

#Hubzilla #Datenbank #MySQL

Wer von Mastodon kommt, kennt die einfache Möglichkeit Hashtags zu folgen um seine Timeline dank fehlender Algorithmen interessant zu füllen. Bei Hubzilla geht das auch, über einen kleinen Umweg mit noch viel besseren Einstellmöglichkeiten.

Zuerst definiert man einen Link dem man den gewünschten Tag anhängt auf https://relay.fedi.buzz/tag/

Sieht dann so aus, für beispielsweise dem Hashtag "hubzilla:

https://relay.fedi.buzz/tag/hubzilla

Dann geht man auf seiner Instanz auf "Verbindungen"

Translated with DeepL.com (free version)

Anyone who comes from Mastodon knows how easy it is to follow hashtags to fill their timeline with interesting content thanks to the lack of algorithms. This is also possible with Hubzilla, via a small detour with even better settings options.

First, define a link to which you attach the desired tag on https://relay.fedi.buzz/tag/

It will then look like this, for example, for the hashtag "hubzilla:

https://relay.fedi.buzz/tag/hubzilla

Then go to “Connections” on your instance.

Screenshot des Verbindungsdialogs

Dort gibt man die eben erstellte Channeladresse ein und klickt auf das Plus woraufhin sich ein neues Fenster öffnet:

Enter the channel address you just created and click on the plus sign, which will open a new window:

Screenshot des Verbindungsdialogs Filter für den Inhalt

Interessant ist hierbei das Feld "Filter für den Inhalt" - "Nur Beiträge mit diesem Text importieren" und "Beiträge mit diesem Text nicht importieren"

The “Filter for content” field is interesting here - “Only import posts with this text” and “Do not import posts with this text.”

Screenshot des Verbindungsdialogs Filter für den Inhalt

Mit "lang=de" werden nur deutsche hubzilla-Beiträge angezeigt. Man kann zwar an anderer Stelle in der Administration auch einstellen das nur deutsche Beiträge angezeigt werden sollen, aber vielleicht will man woanders ja auch englische haben. Hier gilt das nur für den definierten Hashtag.

Beim Feld darunter könnte man mit "lang=cn" alle Sprachen abrufen außer chinesisch. Hier findet man weitere Ländercodes: Ländercodes nach ISO-3166

Mit ein bischen rumprobiererei kann man sich seinen Feed perfekt anpassen. Die Felder Rollen und Privacygruppen kann man hier vernachlässigen weil der Hashtag keine Userrechte braucht, er agiert ja nicht.

With “lang=de,” only German Hubzilla posts are displayed. You can also set other areas of the administration to display only German posts, but you may want to have English posts elsewhere. Here, this only applies to the defined hashtag.

In the field below, you could use “lang=cn” to display all languages except Chinese. You can find more country codes here: Country codes according to ISO-3166

With a little trial and error, you can customize your feed perfectly. The fields “Roles” and “Privacy groups” can be ignored here because the hashtag does not require user rights; it does not take action.


#Hubzilla #Mastodon #Hashtags

Da Hubzilla ja alles, auch Bilder, Videos, Dokumente als Blob (Binary Large OBject) in der Datenbank ablegt schwillt die in kurzer Zeit ziemlich an. Meine z.B. hat nach 4 Tagen eine Größe von 1,2Gb. Ich hab 2 Wege gefunden das Problem zu lösen:

Administration - Seite - ganz nach unten scrollen:

Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) Inhalte ablaufen sollen

und

Lass keine Beiträge verfallen die Kommentare haben, die jünger als diese Anzahl von Tagen sind

Dabei werden Instanzfremde Inhalte mit denen deine Instsnz nicht agiert hat nach X Tagen gelöscht. Ich habe beide Werte auf 7 Tage eingestellt.

Translated with DeepL.com (free version)

Since Hubzilla stores everything, including images, videos, and documents, as blobs (Binary Large Objects) in the database, it swells up quite quickly. Mine, for example, has a size of 1.2 GB after 4 days. I have found two ways to solve the problem:

Administration - Page - scroll all the way down:

Set the period (in days) after which imported (from the network) content should expire

and

Do not let posts expire that have comments younger than this number of days

Content from other instances that your instance has not interacted with will be deleted after X days. I have set both values to 7 days.


Screenshoot aus dem Adminmenü

Außerdem kann man mit folgendem Befehl seine Datenbank optimieren:

You can also optimize your database with the following command:

mysqloptimize -A

Der Befehl ist ein praktisches Hilfsmittel, das alle Datenbanken deines MySQL‑Servers durchgeht und für jede Tabelle ein OPTIMIZE TABLE ausführt. Kurz gesagt:

Was passiert dabei?

Fragmentierte Daten‑ und Indexdateien werden neu angeordnet.

Nicht mehr genutzter Speicherplatz wird freigegeben.

Die Zugriffs‑Performance kann sich verbessern, weil die Daten jetzt kompakter liegen.

Warum ist das nützlich?

Wenn du häufig INSERT/UPDATE/DELETE‑Operationen hast, können Tabellen im Laufe der Zeit „ausgelutscht“ werden. Das Optimieren hilft, die Performance wieder zu stabilisieren. Es reduziert die Größe deiner Datenbank‑Dateien, was gerade bei begrenztem Speicher praktisch sein kann.

The command is a handy tool that goes through all the databases on your MySQL server and runs OPTIMIZE TABLE for each table. In short:

What happens?

Fragmented data and index files are reorganized.

Unused storage space is freed up.

Access performance may improve because the data is now more compact.

Why is this useful?

If you frequently perform INSERT/UPDATE/DELETE operations, tables can become “worn out” over time. Optimizing helps to stabilize performance again. It reduces the size of your database files, which can be useful, especially when memory is limited.


#Hubzilla #Datenbank #MySQL

Ah durch Zufall grade in Hubzilla wieder was Neues entdeckt 😁 Mit dem kleinen unauffälligen Button kann man durch die Kommentare scrollen.

Translated with DeepL.com (free version)

Ah, just discovered something new on Hubzilla by chance 😁 With the small, inconspicuous button, you can scroll through the comments.

#Hubzilla

Screenshot_20260225-143832_1_1.png

Wenn man in Hubzilla mit einem Bild auf einen Kommentar antworten möchte muss man diese Option vorher noch aktivieren. Ich habe die Einstellung selber erst gefunden, als ich im Hubzilla-Hilfeforum nachgefragt hatte, Danke nochmal ^^ Zu finden ist sie unter Einstellungen - Privacy-Einstellungen - Enable OCAP access Danach kann man dann wie gewohnt im Editor auf das Bild-Icon klicken und ein Bild aus den eigenen Hubzilla-Dateien auswählen.

Translated with DeepL.com (free version)

If you want to reply to a comment with an image in Hubzilla, you have to activate this option first. I only found the setting myself when I asked about it in the Hubzilla help forum, thanks again ^^ You can find it under Settings - Privacy settings - Enable OCAP access After that, you can click on the image icon in the editor as usual and select an image from your own Hubzilla files.


Bildschirmfoto der Einstellung Enable OCAP-Access

#Hubzilla