Dies ist die archivierte Version des Blogs vom 05.01.2017. Aktuelle Beiträge findest du unter thomas-leister.de
 

Prosody ist ein inzwischen weit verbreiteter, moderner und meinen Erfahrungen nach zuverlässiger XMPP-Server, der durch zahlreiche Module erweitert werden kann. Geschrieben ist Prosody in der Skriptsprache Lua. Zur Installation habe ich vor 3 Jahren schon einmal eine Anleitung geschrieben. Dieser Beitrag soll die etwas veraltete Version ersetzen.

Voraussetzungen

  • vServer oder Rootserver mit Ubuntu 14.04 oder höher
  • Möglichkeit, valide TLS-Zertifikate auszustellen, z.B. über Let’s Encrypt
  • Eigene Domain + Zugriff auf zugehörige DNS-Records
  • Grundkenntnisse im Umgang mit Ubuntu Server, DNS, TLS-Zertifikaten, MySQL

Annahmen

  • Verwendete XMPP-Domain: xmppserver.tld (ergibt XMPP-IDs nach dem Muster: benutzer@xmppserver.tld)
  • Verwendete XMPP-Domain für Konferenzen / Chatrooms: conference.xmppserver.tld

Installation

Oftmals ist die Software aus den Ubuntu-Repositories veraltet. Aus diesem Grund wird Prosody nicht aus den offiziellen Ubuntu-Repos installiert, sondern aus dem Debian-Repo der Prosody-Entwickler. Das Repo muss zunächst hinzugefügt werden:

wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -
echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/prosody.list

… dann wird die aktuelle, stabile Prosody-Version inkl. einiger Lua-Module installiert:

apt update && apt install prosody lua-dbi-mysql lua-sql-mysql lua-sec

Datenbank-Konfiguration

Bevor es an die Konfiguration von Prosody geht, muss zunächst eine MySQL-Datenbank für den XMPP-Server eingerichtet werden. Ich gehe davon aus, dass bereits ein MySQL-Server installiert und konfiguriert ist. Wenn nicht, holt das bitte nach. Loggt euch dann in die MySQL-Kommandozeile ein…

mysql -u root -p

… und erstellt einen neuen Benutzer „prosody“:

create user 'prosody'@'localhost' identified by 'prosodypasswort';

… wobei „prosodypasswort“ selbstverständlich durch ein eigenes Passwort ersetzt werden muss. Für Prosody wird nun eine eigene Datenbank erstellt, auf die der Prosody-Benutzer vollen Zugriff erhält:

create database prosody;
grant all on prosody.* to 'prosody'@'localhost';

Die Einrichtung der Datenbank wäre damit erledigt. Ihr könnt die MySQL-Kommandozeile wieder verlassen:

quit;

Prosody Konfiguration

Prosody wird über die Konfigurationsdatei /etc/prosody/prosody.cfg.lua konfiguriert. Die Datei ist nichts anderes als ein Lua-Script, also muss sich an die Lua-Syntax gehalten werden. Das bedeutet beispielsweise, dass Kommentare nicht mit einem „#“ beginnen, sondern durch einen doppelten Bindestrich: „–„. Am besten leert ihr die Konfigurationsdatei mit dem folgenden Kommendo komplett. Wir werden eine eigene, neue Konfiguration nutzen:

cd /etc/prosody/
> prosody.cfg.lua

Für eine bessere Übersicht zeige ich euch an dieser Stelle gleich die komplette Konfigurationsdatei mit Kommentaren. Stellen, die angepasst werden müssen, habe ich blau markiert.

pidfile = "/var/run/prosody/prosody.pid"

--
-- Datenbankanbindung
---------------------------------

storage = "sql"

sql = {
    driver = "MySQL";
    database = "prosody";
    host = "localhost";
    username = "prosody";
    password = "prosodypasswort";
}


--
-- Authentifizierung
---------------------------------

-- Passwörter gehashed abspeichern
authentication = "internal_hashed"

-- Admin-Account festlegen
admins = { "admin@xmppserver.tld" }


--
-- TLS Konfiguration
---------------------------------

-- Verschlüsselte Verbindungen zu Clients und Servern erzwingen
c2s_require_encryption = true;
s2s_require_encryption = true;

-- Server müssen keine anerkannten, gültigen Zertifikate vorweisen (erlaubt Self-Signed zertifikate auf anderen Servern)
-- Alternativ: auf "true" setzen und ggf. s2s_insecure_domains angeben (siehe Prosody Doku)
s2s_secure_auth = false;
-- Die folgenden Server müssen immer gültige Zertifikate vorweisen können:
s2s_secure_domains = { "trashserver.net", "jabber.org", "xmpp.org", "einfachjabber.de", "jabber.at", "jabber.de" };

ssl = {
    options = { "no_sslv2", "no_sslv3", "no_compression" };
    
    dhparam = "/etc/myssl/dh2048.pem";
    key = "/etc/myssl/privkey.pem";
    certificate = "/etc/myssl/fullchain.pem";
}


--
-- Prosody Module
---------------------------------

-- Pfad zu den Prosody-Modulen
plugin_paths = { "/opt/prosody-modules" }

-- Aktivierte Module (global, für alle vHosts)
modules_enabled = {
    -- Wichtige Module
    "roster";
    "saslauth";
    "tls";
    "dialback";
    "disco";

    -- Empfohlene Module
    "private";
    "vcard";
    "offline";
    "admin_adhoc";
    "http";

    -- Nice to have
    "legacyauth";
    "version";
    "uptime";
    "time";
    "ping";
    "register_web";
    "register";
    "posix";
    "bosh";
    "announce";
    "proxy65";
    "pep";
    "smacks";
    "carbons";
    "blocking";
    "http_upload";
    "csi";
    "mam";
    "lastlog";
    "cloud_notify";
    "compat_dialback";
};


--
-- Logging
----------------------------------
log = {
 debug = "/var/log/prosody/prosody.log";
 error = "/var/log/prosody/prosody.err";
}


--
-- Register Web Template files
-- (Kann auch entfernt werden, dann wird Standard-Template genutzt)
----------------------------------

register_web_template = "/etc/prosody/register-templates/Prosody-Web-Registration-Theme";


--
-- MAM settings
-- (Chats nicht standardmäßig loggen, nach einem Monat vom Server löschen)
----------------------------

default_archive_policy = false;
archive_expires_after = "1m";


--
-- HTTP Config
----------------------------------

http_default_host = "xmppserver.tld"

http_paths = {
    register_web = "/register";
}

-- BOSH-Funktionalität auch für Clients auf anderen Domains freigeben
-- BOSH steht unter https://xmppserver:5281/http-bind/ zur Verfügung
cross_domain_bosh = true;


--
-- Service Discovery
----------------------------------

-- Multi-User-Chat (MUC) soll als verfügbarer XMPP Dienst aufgeführt werden
disco_items = {
    { "conference.xmppserver.tld", "The xmppserver.tld MUC" };
}


--
-- XMPP VirtualHosts
------------------------------------

-- xmppserver.tld als einziger XMPP-vHost
VirtualHost "xmppserver.tld"
    allow_registration = true
    min_seconds_between_registrations = 60
   
    http_host = "xmppserver.tld"

    -- Einstellungen zum MUC
    Component "conference.xmppserver.tld" "muc"
        name = "Xmppserver.tld Chatrooms"
        restrict_room_creation = false
        max_history_messages = 100

Bevor die neue Konfiguration aktiviert werden kann, müssen noch ein paar Dinge erledigt werden …

Modul-Repository herunterladen

plugin_paths = { "/opt/prosody-modules" }

gibt den Pfad zu dem Verzeichnis an, das alle Prosody-Module enthält. Dieses Modulverzeichnis ist noch nicht vorhanden und muss zuerst heruntergeladen werden. Dafür muss Mercurial installiert sein:

apt install hg

Dann wird in das /opt Verzeichnis gewechselt und das Modul-Repository heruntergeladen:

cd /opt/
hg clone https://hg.prosody.im/prosody-modules/ prosody-modules

Damit Prosody auf das Verzeichnis zugreifen kann, werden die Gruppenberechtigungen entsprechend gesetzt:

chgrp -R prosody prosody-modules
chmod -R 770 prosody-modules

Modul-Repository updaten

Von Zeit zu Zeit sollte das Repository geupdated werden. Dazu wechselt man in das Verzeichnis:

cd /opt/prosody-modules

… und führt ein

hg pull --update

aus. Für neu hinzugekommene Dateien müssen die Rechte passend vergeben werden. Es empfiehlt sich daher, nach jedem Update die folgenden Kommandos erneut auszuführen:

chgrp -R prosody /opt/prosody-modules
chmod -R 770 /opt/prosody-modules

Nach jedem Update muss Prosody neu gestartet werden:

prosodyctl restart

TLS-Konfiguration

Neben den Pfaden zu eurer Zertifikatsdatei „fullchain.pem“ (enthält auch evtl vorhandene Intermediate-Zertifikate) und dem Zertifikatsschlüssel „privkey.pem“ wird auch der Pfad zur Diffie-Hellman-Datei „dh2048.pem“ angegeben. Diese Datei wird via

openssl dhparam 2048 -out /etc/myssl/dh2048.pem

erzeugt und sollte über einen Cronjob immer wieder erneuert werden.

Das TLS-Zertifikat muss für alle Domains und Subdomains gültig sein, mit denen der Server arbeitet, also in diesem Beispiel:

  • xmppserver.tld
  • conference.xmppserver.tld

„Register Web Template“

In meiner Beispielkonfiguration setze ich via

register_web_template = "/etc/prosody/register-templates/Prosody-Web-Registration-Theme";

ein eigenes Template für die Web-Registrierungsseite, die via https://xmppserver.tld:5281/register/ verfügbar sein wird. Wie man ein solches Template installiert, habe ich in einem anderen Beitrag bereits beschrieben. Wenn das Standard-Template genutzt werden soll, kann die „register_web_template“-Zeile entfernt werden.

DNS-Einträge

Für einen XMPP-Server muss es mindestens einen A-Record geben, der von der genutzten Domain (xmppserver.tld)  auf den Prosody-Server zeigt. Besser ist es, zusätzlich passende SRV-Records anzulegen. Für meinen trashserver.net-Server habe ich beispielsweise folgenden DNS-Records angelegt:

_xmpp-client._tcp.trashserver.net. 3600 IN SRV 1 0 5222 h-sirius.650thz.de.
_xmpp-server._tcp.trashserver.net. 3600 IN SRV 1 0 5269 h-sirius.650thz.de.

h-sirius.650thz.de ist der Host, auf dem Prosody läuft. Auf das Beispiel bezogen wäre das z.B. xmppserver.tld – beim Record den Punkt am Ende nicht vergessen!), z.b. so:

_xmpp-client._tcp.xmppserver.tld. 3600 IN SRV 1 0 5222 xmppserver.tld.
_xmpp-server._tcp.xmppserver.tld. 3600 IN SRV 1 0 5269 xmppserver.tld.

Neben den DNS-Records zur Hauptdomain muss auch ein CNAME- oder A-Record für conference.xmppserver.tld angelegt werden:

conference.xmppserver.tld. 3600 IN CNAME xmppserver.tld.

Mehr zu den DNS-Einträgen könnt ihr unter https://prosody.im/doc/dns nachlesen. Es kann – wie immer – einige Zeit dauern, bis Änderungen an DNS-Zonefiles im Internet bekannt sind.

Prosody kontrollieren

Prosody bediene ich am liebsten über das prosodyctl-Kommando, also z.B.

prosodyctl start
prosodyctl stop
prosodyctl restart

Bei der Installation wurde zwar auch ein Service-Skript mitgeliefert, sodass sich Prosody auch über die service prosody {start, stop, restart…} Kommandos steuern lassen sollte, doch das hat sich in der Vergangenheit nicht als besonders zuverlässig erwiesen.

Wenn die Konfiguration komplett und angepasst ist, kann Prosody neu gestartet und der Admin-Account über die Registrierung erstellt werden. Das kann entweder über das erwähnte Webinterface geschehen oder über die sog. „In-Band-Registration“, also die Registrierung via XMPP-Client. Auch über die Kommandozeile können neue Benutzer angelegt werden:

prosodyctl adduser admin@xmppserver.tld

 

Anmerkung: Diese Anleitung konnte ich als ganzes am Stück noch nicht testen, da sich noch keine Gelegenheit ergeben hat, einen XMPP-Server komplett neu aufzusetzen. Sollte es bei der Installation Probleme geben oder solltet ihr noch Anmerkungen haben, schreibt mir bitte in die Kommentare.


Post published on 20. März 2016 | Last updated on 29. Juli 2016
Tags:           

Diesen Blog unterstützen

Wenn Dir der Beitrag gefallen hat, freue ich mich über einen kleinen Obolus :-) Bitcoin QR Code

PayPal-Seite: https://www.paypal.me/ThomasLeister
Meine Bitcoin-Adresse: 15z8 QkNi dHsx q9WW d8nx W9XU hsdf Qe5B 4s

Siehe auch: Unterstützung

Informationen zum Autor

Thomas Leister

Geb. 1995, Kurzhaar-Metaller, Geek und Blogger. Nutzt seit Anfang 2013 ausschließlich Linux auf Desktop und Servern. Student der Automobilinformatik an der Hochschule für angewandte Wissenschaften in Landshut.

25 thoughts on “Prosody XMPP Server unter Ubuntu Server 14.04 installieren

  • Hallo Thomas,
    oben schreibst du XMPP *CLIENT* …
    Kleiner Verschreiber.

    LG
    Frank

  • „apt install hg“ und nicht „apt-get install hg“?

  • Hilfreich! Vielen Dank.
    Fehlt in der MySQL-Konfiguration am Ende ein „FLUSH PRIVILEGES“?

  • Vielen Dank, das ging ja schnell. :)

  • Sry für Doppelpost.
    Was genau macht „list_inactive“;? Dazu konnte ich nichts finden.
    Als Ergänzung zu CSI hört sich mod_throttle_presence (https://modules.prosody.im/mod_throttle_presence.html) nicht schlecht an.

    Weiß jemand, ob „cloud_notify“; schon von einem iOS-Client unterstützt wird?
    In meiner Familie wird auch iOS benutzt, die Lage für xmpp ist dort ja gerade zu katastrophal. :( Mit meinem Bruder habe ich es auch nicht geschafft die iOS App „Monal“ einzurichten, die hat wohl als einziger xmpp-Client einen dauerhaften Hintergrundbetrieb (hat der Entwickler mal geschrieben).

    • Hi,

      list_inactive war noch ein Überbleibsel aus meiner persönlichen Config. Hab es wieder rausgenommen, weil weniger wichtig. Das Modul ermöglicht es, inaktive User in einem bestimmten Zeitraum zu erkennen. Throttle_presence hört sich gut an. Werde es mal testen.

      Zu iOS kann ich nicht sagen – außer, dass ich dir die katastrophale Situation bestätigen kann.

      LG Thomas

  • Alles klar, danke für die Ergänzung.

    Zum Thema iOS habe ich gerade noch mal bissl geschaut. Die Macher von Chatsecure arbeiten an einer Implementierung von XEP-0357. Hoffentlich ist die bald fertig. https://github.com/ChatSecure/ChatSecure-iOS/issues/367

  • Moin,
    ich habe Prosody jetzt länger im Einsatz und folgende Probleme konnte ich bisher nicht lösen:
    – die Avatare, also Profilbilder, der Benutzer werden bei anderen Benutzern nicht zuverlässig angezeigt/gesynct (alles in Conversations)

    – http_upload funktioniert auf dem Desktop mit Gajim nicht. In Conversations klappt alles, in Gajim wird nur die URL des Bildes/der Datei angezeigt, aber bei Bildern keine Vorschau generiert. Klicke ich auf den Link, meckert Chromium wegen dem Self-Signed-Certificate, was man wg HSTS nicht umgehen kann. Das auskommentieren der Zeile
    Header add Strict-Transport-Security „max-age=15768000“
    in der ssl-conf hat nichts geändert (außer, dass Owncloud jetzt wegen deaktiviertem HSTS rummeckert). Effektiv kann ich also am Desktop keine Bilder/Dateien ansehen/empfangen.

    – kein Desktop Client konnte mich bisher überzeugen. Gajim kann offenbar am meisten, besonders angenehm zu verwenden ist es aber nicht. Es fängt beim hässlichen Icon des Programms an und hört noch nicht beim nicht-Anzeigen der Benutzerbilder auf. Z.B. habe ich eingestellt, dass es bei Statusänderungen keine Benachrichtigung gibt. Die Einstellung wird ignoriert oder meint etwas anderes als ich darunter verstehe. Ich kann förmlich am Sound nachvollziehen, wenn mein Bruder im Zug unterwegs ist und die entsprechenden Töne (offline, online, offline, online…) gespamt werden

    – alle über Prosody versendeten Dateien werden kryptisch umbenannt, Beispiel: 03eea90c-3ea8-4b4f-ac91-67e221c699d5.jpg, sehr nervig

    Jemand ne Idee zu den genannten Sachen?

  • Hallo Thomas,

    ich habe deine Anleitung befolgt. Wenn ich nun allerdings meine XMPP-Seite aufrufe ( https://xmpp.rezensionaer.de ) erhalte ich einen Error 404. Wenn ich einen Benutzer über die Konsole registriere, funktioniert das auch nicht (im Client steht dann, wenn ich mich anmelde, „Verbindungsfehler“).

    Viele Grüße
    Benjamin

  • Hallo Thomas,

    vielen Dank für die tolle Anleitung.
    Eine kleine Frage habe ich noch: Gab es für Dich einen speziellen Grund, als XMPP-Server „prosody“ einzusetzen?
    Hast Du Dir auch mal andere Produkte angeschaut, z.B. „eJabberd“ oder „jabberd2“?

    Liebe Grüße aus Nürnberg,

    Roland

    • Hi Roland,

      Prosody ist im Gegensatz zur Konkurrenz ein ziemlich moderner, neuer Client, der durch eine Fülle an Modulen sehr einfach erweitert werden kann. Zudem wird sich bei der Entwicklung des Android-Clients „Conversations“ vor allem auf das Zusammenspiel mit Prosody konzentriert, sodass Prosody in den letzten Monaten und Jahren zu einem sehr beliebten und zuverlässigen Server geworden ist. Ejabberd hatte ich vor 4 Jahren mal laufen, allerdings hatte ich damit ziemlichen Ärger… u.A., weil total veraltet.

      LG Thomas

  • Hi Thomas,

    Ich bin Deiner Anleitung gefolgt — hat super funktioniert, danke! Wenn ich den Server auf xampp.net teste, steht dort jedoch, dass der Server keine forward-secret cipher anbietet. Ich habe zusätzlich in der Konfiguration folgende Zeile im ssl Block hinzugefügt:

    ciphers = „ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS“;

    Hast Du eine Idee, woran das liegt?

    Außerdem legt trotz Konfiguration prosody bei mir keine Logdateien an. Weißt Du, woran das liegt?

    Prosody Version 0.9.10, Debian 7.11 wheezy

    • Habe das Problem mit PFS mittlerweile gelöst: Es lang an einer zu alten Version von luasec. Ein Update brachte Unterstützung für PFS.
      Das Problem, dass prosody keine logs anlegt, konnte ich allerdings nicht lösen…

  • das ist doch kein standard-wordpres-kommentar oder?

  • Die ganze Anleitung funktioniert auch unter Debian 8 Jessie, nur bei hg (Mercurial) existiert das Paket nicht. Hier sollte neben der Ubuntu-Variante auch das Debian-Paket stehen: apt install mercurial mercurial-common

    Sonst funktioniert die Anleitung einwandfrei

  • Danke für diese Anleitung. Eine Anleitung für einen Facebook Transport unter Prosody wäre sehr toll.

  • Hey Thomas,

    danke für dass tolle Tutorial. Es ist sehr hilfreich und ausführlich Beschrieben.

    Gruß Alex

    PS Website ist noch in Arbeit!!!!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.