ejabberd mit MySQL auf Uberspace installieren

Es ist möglich ejabberd auf einem Uberspace zu installieren. Darauf gestoßen bin ich über ein Pull-Request in Uberspace Lab Repository. Die dort beigetragene Anleitung funktioniert, geht aber wenig in die Tiefe. Neuerdings biete Uberspace 7 von Haus aus Erlang an. Das wurde bei dieser Anleitung schon beachtet.

Ab einem bestimmten Punkt der ejabberd-Konfiguration ist die interne Mnesia Datenbank nicht mehr ausreichend. Uberspace stellt standartmäßig eine MySQL Datenbank bereit. Die können wir doch wunderbar benutzen.

Wenn die ejabberd Anleitung offiziell im Uberspace Lab Repository gelandet ist, werde ich diese, etwas anspruchsvollere, Anleitung auch irgendwie dort mit hinzufügen.

Weil ich Teile des Pull-Requests hier übernehmen werde, fällt der ganze Artikel unter CC BY-NC-SA 4.0. Die ursprüngliche Anleitung stammt von fm0de und SalocinHB.

Was wir benötigen

  • eine Domain und einen entsprechenden Nameserver in dem man A, AAAA, CNAME und SRV Einträge setzen darf
  • eine Uberspace

Installation von LibYAML

LibYAML wird von ejabberd benötigt.

[isabell@stardust ~]$ wget https://pyyaml.org/download/libyaml/yaml-0.2.2.tar.gz
[isabell@stardust ~]$ tar xf yaml-0.2.2.tar.gz
[isabell@stardust ~]$ cd yaml-0.2.2/
[isabell@stardust yaml-0.2.2]$./configure --prefix=$HOME/libyaml
[isabell@stardust yaml-0.2.2]$ make install

Installation von ejabberd

Damit der Compiler von ejabberd gleich weiß, wo er LibYAML findet, speichern wir die entsprechenden Pfade in die entsprechenden Umgebungsvariablen.

[isabell@stardust ~]$ export CFLAGS=-I$HOME/libyaml/include
[isabell@stardust ~]$ export CPPFLAGS=-I$HOME/libyaml/include
[isabell@stardust ~]$ export LDFLAGS=-L$HOME/libyaml/lib

Nun laden wir uns ejabberd runter und generieren eine Konfiguration für den folgenden Installationsschritt.

[isabell@stardust ~]$ wget https://github.com/processone/ejabberd/archive/19.09.1.tar.gz
[isabell@stardust ~]$ tar xf 19.09.1.tar.gz
[isabell@stardust ~]$ cd ejabberd-19.09.1/
[isabell@stardust ejabberd-19.09.1]$ ./autogen.sh
[isabell@stardust ejabberd-19.09.1]$ ./configure --enable-user=$USER --prefix=$HOME/ejabberd --enable-mysql --enable-new-sql-schema

Und installieren:

[isabell@stardust ejabberd-19.09.1]$ make install

ejabberdctl in unseren Pfad einfügen:

[isabell@stardust ~]$ ln -s ~/ejabberd/sbin/ejabberdctl ~/bin/ejabberdctl

Datenbank vorbereiten

Wir erstelle eine Datenbank für unseren XMPP Server:

[isabell@stardust ~]$ mysql -e "CREATE DATABASE ${USER}_ejabberd"

Und laden das SQL Schema:

[isabell@stardust ~]$ wget https://raw.githubusercontent.com/processone/ejabberd/master/sql/mysql.new.sql
[isabell@stardust ~]$ mysql -D ${USER}_ejabberd < mysql.new.sql

Domains eintragen und Zertifikate generieren

Für ejabberd gibt es eine ganze Stange an Standart-Domains. Diese müssen wir nun alle unserem Uberspace beibrigen:

[isabell@stardust ~]$ uberspace web domain add isabell.example
[isabell@stardust ~]$ uberspace web domain add conference.isabell.example
[isabell@stardust ~]$ uberspace web domain add upload.isabell.example
[isabell@stardust ~]$ uberspace web domain add pubsub.isabell.example
[isabell@stardust ~]$ uberspace web domain add proxy.isabell.example

Entprechend muss für jede Domain der A, AAAA bzw CNAME Record gesetzt werden.

Im Anschluss besuchen wir jede dieser Domains im Webbrowser, damit die SSL Zertifikate erstellt werden. Alternativ kann man das auch im Terminal tun.

[isabell@stardust ~]$ curl https://isabell.example
[isabell@stardust ~]$ curl https://conference.isabell.example
[isabell@stardust ~]$ curl https://upload.isabell.example
[isabell@stardust ~]$ curl https://pubsub.isabell.example
[isabell@stardust ~]$ curl https://proxy.isabell.example

Ports freigeben

XMPP benötigt jeweils einen Port für Client to Server (c2s) und Server to Server (s2s). Zudem wollen wir jeweils auch dedizierte Ports anbieten, auf dem explizit verschlüsselt kommuniziert wird. Außerdem arbeitet die Datei Transport Proxy auf einem eigenen Port.

Wir lassen uns also 5 Ports geben:

[isabell@stardust ~]$ uberspace port add
[isabell@stardust ~]$ uberspace port add
[isabell@stardust ~]$ uberspace port add
[isabell@stardust ~]$ uberspace port add
[isabell@stardust ~]$ uberspace port add

Welche Ports nun uns gehören können wir auch nochmal anschauen:

[isabell@stardust ~]$ uberspace port list

Konfiguration

Praktisch haben wir nun ein lauffähiges ejabberd. Nun müssen wir ihm sagen, was er tun soll. Das tun wir mittles der Konfigurations Datei ejabberd.yml

[isabell@stardust ~]$ nano ejabberd/etc/ejabberd/ejabberd.yml

Hosts

Unsere Domain, auf der unser XMPP laufen soll:

hosts:
  - "isabell.example"
  

Zertifikate

Für usere Domains haben wir Zertifikate generiert. Diese müssen wir nun ejabberd beibrigen:

certfiles:
  - "/home/isabell/etc/certificates/*"

Datenbank

Wir teilen unsere Datenbank mit:

sql_type: mysql
sql_server: "localhost"
sql_database: "isabell_ejabberd"
sql_username: "isabell"
sql_password: "passwort"

Das Passwort für den Datenbankbenutzer bekommen wir per

[isabell@stardust ~]$ my_print_defaults client

Außerdem wollen wir, dass alle Module automatisch diese Datenbank als Speicher verwenden, deshalb setzen wir:

default_db: sql

Ports

Die Ports, die wir uns vorhin besorgt haben tragen wir nun hier der Reihe nach ein. Nicht vergessen, zu merken, welcher Port zu welchem Dienst gehört. Das brauchen wir nachher.

listen:
  - # c2s
    port: <port-1>
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls_required: true
  - # 'secure' c2s
    port: <port-2>
    ip: "::"
    module: ejabberd_c2s
    tls: true
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
  - # s2s
    port: <port-3>
    ip: "::"
    module: ejabberd_s2s_in
    max_stanza_size: 524288
  - # 'secure' s2s
    port: <port-4>
    ip: "::"
    module: ejabberd_s2s_in
    tls: true
    max_stanza_size: 524288

Einige Diensten laufen über den http-Server von ejabberd. Dort lassen wir den Port einfach so wie er ist. Das überlassen wir nachher dem Web Backend von Uberspace. Aus diesem Grund muss auch tls abgeschaltet werden.

  - # Web frontend
    port: 5443
    ip: "::"
    module: ejabberd_http
#    tls: true
    request_handlers:
      "/upload": mod_http_upload

Admin

Nicht alles wollen wir per Konsole einstellen. Deshalb deklarieren wir einen Administrator:

acl:
  admin:
    user:
      - "admin@isabell.example"

Http Upload

Beim Http Upload nehmen wir den Port der URL der put_url weg und passen den docroot an.

  mod_http_upload:
    put_url: "https://upload.isabell.example/upload"
    file_mode: "0640"
    dir_mode: "2750"
    max_size: 10487600 # 100MB
    access: local
    thumbnail: false
    docroot: "/home/isabell/ejabberd/upload"
    secret_length: 64

Proxy

So wie die Datei Transport Proxy normalerweise arbeiten möchte, kann sie das auf einem Uberspace leider nicht. An dieser Stelle kommt dann auch unser letzter Port zum Zug.

  mod_proxy65:
#    access: local
    max_connections: 5
    host: "proxy.isabell.example"
    name: "File Transfer Proxy"
    ip: "::"
    port: <port-5>

Auth

Zuletzt noch die Nutzerverwaltung auf sql stellen und Passwörter verschlüsseln lassen.

auth_method: sql
auth_password_format: scram

SRV Einträge

Folgende SRV Einträge müssen noch im DNS gesetzt weden, damit XMPP-Clients und -Server unseren Dienst finden:

_xmpp-client._tcp.isabell.example. 86400 IN SRV 5 0 <port-1> isabell.example.
_xmpps-client._tcp.isabell.example. 86400 IN SRV 4 0 <port-2> isabell.example.
_xmpp-server._tcp.isabell.example. 86400 IN SRV 5 0 <port-3> isabell.example.
_xmpps-server._tcp.isabell.example. 86400 IN SRV 4 0 <port-4> isabell.example.

HTTP aufschalten

Für den Datei-Upload wird HTTP verwendet. Das müssen wir noch dem Backend des Uberspaces beibringen.

[isabell@stardust ~]$ uberspace web backend set upload.isabell.example/ --http --port 5443

Service erstellen

Wir erstellen eine Service Datein und fügen eine entsprechende Konfiguration ein:

[isabell@stardust ~]$ nano etc/services.d/ejabberd.ini
[program:ejabberd]
command=%(ENV_HOME)s/ejabberd/sbin/ejabberdctl foreground
autostart=yes
autorestart=yes
stopasgroup=true
killasgroup=true
stopsignal=INT

Im Anschluss neu einlesen und laden:

[isabell@stardust ~]$ supervisorctl reread
[isabell@stardust ~]$ supervisorctl update
[isabell@stardust ~]$ supervisorctl status

Admin Nutzer erstellen

[isabell@stardust ~]$ ejabberdctl register admin isabell.example <passwort>
Kommentare anzeigen