Skip to main content

Installation Ejabberd 25.07 auf Debian 12 mit Datenbank Postgresql + Audio/Video Funktion

Öffnen wir in das Terminal:

Wir machen ein Update unseres Servers damit alle Pakte aktuell sind. Nun installieren Wir Postgresql und das Erlang Paket welches wir für unseren Ejabberd Server benötigen.

sudo apt update && apt upgrade -y
sudo apt install postgresql erlang-p1-pgsql mc curl unp wget -y
Bearbeiten pg_hba.conf:

Wir müssen die Posgresql hba.conf bearbeiten. Zeile 7 wie hier in dem Code müssen wir umstellen von "peer" auf "scram-sha-256".

sudo nano /etc/postgresql/15/main/pg_hba.conf
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     scram-sha-256 ##<<<-von peer auf scram-sha-256
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256
Postgresql restart:

Wir müssen sicherstellen das die Änderung übernommen wird, starten wir Postgresql neu.

sudo systemctl restart postgresql
Ejabberd Download:

Wir downloaden uns nun Ejabberd "Standalone" für unsere entsprechende Architektur, bei mir ist es x86 von hier:

---> Ejabberd Download <---

wget https://static.process-one.net/ejabberd/downloads/25.07/ejabberd-25.07-1-linux-x64.run
Installer ausführbar machen:

Wir machen das Installationsskript mit folgenden Befehl ausführbar.

chmod +x ejabberd-25.07-1-linux-x64.run
Ejabberd installieren:

Wir installieren Ejabberd mit folgenden Befehl: Während das Script ausgeführt wird, wird uns angezeigt wo es installiert wird und betätigen die Installation mit y.

sudo ./ejabberd-*.run

Schauen wir uns kurz an wo es installiert ist. Am besten wir machen uns gleich ein Backup der ejabberd.yml zur Sicherheit.

eja.png

Enablen Service Ejabberd:

Wir enablen den Dienst Ejabberd damit es bei einem Neustart des Servers automatisch gestartet wir. Ich mache das nur zur Sicherheit, denn bei der Installation von Ejabberd hat das Einrichtung-Script das schon automatisch erledigt.

sudo systemctl enable ejabberd
Stoppen von Ejabberd:

wir stoppen für den weiteren Verlauf erstmal den Ejabberd Server.

sudo systemctl stop ejabberd
Upload Verzeichnis erstellen:

Um später auch Bilder, Video und Dateien versenden zu können benötigen Wir ein Upload Verzeichnis welches in der ejabberd.yml definiert wird. Wir erstellen es unter /opt nennen es "ejabberd_uploads". Wir vergeben die Berechtigungen für den User ejabberd darin lesen und schreiben zu können.

sudo cd /opt
sudo mkdir ejabberd_uploads
sudo chown ejabberd:ejabberd ejabberd_uploads
Postgresql Shell User und Datenbank anlegen:

Mit folgenden Befehl wechseln wir in die Posgresql Shell.

sudo -u postgres psql

Zuerst sollten wir prüfen ob schon eine Datenbank und ein User für Ejabberd angelegt wurde, eventuell von einer früheren Installation, nur zur Sicherheit, und sollten diese mit folgenden Befehlen löschen. Bei einer Neuinstallation müssen wir diesen Schritt nicht machen.

DROP DATABASE IF EXISTS ejabberd;
DROP USER IF EXISTS ejabberd_user;

Nun legen wir einen neuen User "ejabberd_user" mit einem Passwort "IhrSicheresPasswort" an. Diese Angaben müssen später in den Block "Datenbank" in der ejabberd.yml eingetragen werden. Zum Schluss verlassen wir die Postgresql Shell mit dem Befehl \q.

CREATE USER ejabberd_user WITH PASSWORD 'IhrSicheresPasswort';
CREATE DATABASE ejabberd OWNER ejabberd_user;
\q
Import der Postgresql Datenbank:

Wir befinden uns wieder im Terminal und importieren nun die Postgresql Datenbank die während der Installation mit dem Installation-Script unter folgenden Ort abgelegt wurde "/opt/ejabberd-25.07/lib/ejabberd-25.7.0/priv/sql/pg.sql". Führen Sie den Import aus.

Sie werden währen des Importes nach Ihrem Passwort gefragt welches Sie mit 'IhrSicheresPasswort' angelegt hatten.

psql -h localhost -U ejabberd_user -d ejabberd -f /opt/ejabberd-25.07/lib/ejabberd-25.7.0/priv/sql/pg.sql

Der Import ist nun abgeschlossen. Die Postgresql Datenbank ist nun bereit für den Einsatz Ihres Ejabberd Servers.

Ejabberd einrichten, bearbeiten der ejabber.yml:
Im Voraus noch etwas Grundsätzliches im Umgang mit ACME und der Verwaltung von Zertifikaten in Ejabberd.
Das Modul ACME in Ejabberd verwaltet die Zerifikate vollständig automatisch, was wirklich super Toll ist, denn es erspart einem viel Arbeit! Aber!, jetzt kommt das aber;) Dies ist nur gegeben wenn man Ejabberd auf einem Server installiert auf welchen nur EJabberd läuft, sprich eine Art von "Standalone" Server. Bei vielen ist das aber nicht so.
Meistens, um Ressourcen auch voll nutzen zu wollen, laufen noch verschiedene andere Dienste auf dem Server, zum Beispiel ISPConfig oder andere Panels die Webspace Verwalten. Da wird es schwierig, weil dort auch meist schon ACME verwendet wird und käme mit dem Modul von ACME von Ejabberd in Konflikt, deswegen sollte man dort auf des Modul von ACME verzichten und die Pfade für die Zertifikate von Hand eintragen, welche für die Domain die Ejabberd verwendet zeigen.
Ich gebe Ihnen 2 Beispiele an die Hand die Sie verwenden können.
In diesen Beispiel nehmen wir die Version "Standalone" und verwenden das Ejabberd Modul ACME zu vollständigen Verwaltung unseres Zertifikate. Wir müssen hier nur sicherstellen das für unsere "Hauptdomain" im DNS Ihres Anbieters eine Wildcard * für Ihre Domain angelegt ist also "*.Hauptdomain.xyz".
AMCE prüft dann Automatisch ob es Zertifikate für folgende Subdomains erstellen kann: upload, proxy, pubsub und conference. Wenn nicht kommt es zu einem Fehler und es werden keine Zertifikate ausgestellt. Sollte es erfolgreich sein müssen wir lediglich noch in der Weboberfläche von Ejabberd uns ein Zertifikat für die Hauptdomain erstellen, danach der Ejabberd Server stoppen, in der ejabberd.yml Zeile ca_file: und certfiles: # auskommentieren. Ejabberd wieder starten, das war es.
ca_file: /opt/ejabberd/conf/cacert.pem
certfiles:
  - /opt/ejabberd/conf/server.pem
zu 
#ca_file: /opt/ejabberd/conf/cacert.pem
#certfiles:
# - /opt/ejabberd/conf/server.pem
Bei dem Beispiel wo Ejabberd auf einen Server mit ISPConfig oder anderen Verwaltung-Tools laufen soll, sollten sie sicherstellen das alles Subdomains angelegt worden sind und das selbe Zertifikat wie die Hauptdomain nutzen! Die Pfade zu den Zertifikaten müssen Sie anpassen. Das Modul ACME sollte dann nach dem ersten Start deaktiviert werden und die Pfade müssen eingebunden sein.
certfiles:
  - "/pfad/zu/.crt"
  - "/pfad/zu.key"
#acme:
#  contact: "mailto:admin@yyy.yyy"
#  ca_url: "https://acme-v02.api.letsencrypt.org/directory"
Für nachfolgenden Konfigurationen:
Wichtig!! Geben sie Ihre Domain an den richtigen Stellen ein! Das gleiche gilt für Ihre IP! Vergessen sie nicht den Admin in die ACL einzutragen!!!
Beispiel-Konfiguration Ejabberd auf ein VPS Server mit ISPConfig, Zertifikate werden von ISPConfig bereitgestellt, Modul AMCE ist deaktiviert.
hosts:
  - IhreDomain

loglevel: info


### DATENBANK
default_db: sql
sql_type: pgsql
sql_server: "localhost"
sql_database: "ejabberd"
sql_username: "ejabberd_user"
sql_password: "IhrSicheresPasswort"
auth_method: [sql]
sql_pool_size: 10 

###Pfad zu Ihren Cert's oder AMCE machen lassen, statt crt und key kann es auch eine pem sein
certfiles:
  - "/pfad/zu *.crt"
  - "/pfad/zu *.key"
listen:
  -
    port: 5222
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls_required: true
  -
    port: 5223
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    tls: true
  -
    port: 5269
    ip: "::"
    module: ejabberd_s2s_in
    max_stanza_size: 524288
    shaper: s2s_shaper
  -
    port: 5443
    ip: "::"
    module: ejabberd_http
    tls: true
    request_handlers:
      /admin: ejabberd_web_admin
      /api: mod_http_api
      /bosh: mod_bosh
#      /captcha: ejabberd_captcha
      /upload: mod_http_upload
      /ws: ejabberd_http_ws
  -
    port: 3478
    transport: udp
    module: ejabberd_stun
    use_turn: true
    turn_min_port: 49152
    turn_max_port: 49352
    ## The server's public IPv4 address:
    turn_ipv4_address: IhrePublicIP
  -
    port: 5349
    transport: tcp
    module: ejabberd_stun
    use_turn: true
    tls: true
    turn_min_port: 49152
    turn_max_port: 65535
    ip: IhrePublicIP
    turn_ipv4_address: IhrePublicIP

s2s_use_starttls: optional

acl:
  admin: # <--- NEUE ZEILEN HIER HINZUFÜGEN
    user:
      - "admin@xxxxx.xxxx"
  local:
    user_regexp: ""
  loopback:
    ip:
      - 127.0.0.0/8
      - ::1/128

access_rules:
  local:
    allow: local
  c2s:
    deny: blocked
    allow: all
  announce:
    allow: admin
  configure:
    allow: admin
  muc_create:
    allow: local
  pubsub_createnode:
    allow: local
  trusted_network:
    allow: loopback

api_permissions:
  "console commands":
    from: ejabberd_ctl
    who: all
    what: "*"
  "webadmin commands":
    from: ejabberd_web_admin
    who: admin
    what: "*"
  "adhoc commands":
    from: mod_adhoc_api
    who: admin
    what: "*"
  "http access":
    from: mod_http_api
    who:
      access:
        allow:
          - acl: loopback
          - acl: admin
      oauth:
        scope: "ejabberd:admin"
        access:
          allow:
            - acl: loopback
            - acl: admin
    what:
      - "*"
      - "!stop"
      - "!start"
  "public commands":
    who:
      ip: 127.0.0.1/8
    what:
      - status
      - connected_users_number

shaper:
  normal:
    rate: 10000
    burst_size: 500000
  fast: 500000

shaper_rules:
  max_user_sessions: 10
  max_user_offline_messages:
    5000: admin
    100: all
  c2s_shaper:
    none: admin
    normal: all
  s2s_shaper: fast

modules:
  mod_adhoc: {}
  mod_adhoc_api: {}
  mod_admin_extra: {}
  mod_announce:
    access: announce
  mod_avatar: {}
  mod_blocking: {}
  mod_bosh: {}
  mod_caps: {}
  mod_carboncopy: {}
  mod_client_state: {}
  mod_configure: {}
  mod_disco: {}
  mod_fail2ban: {}
  mod_http_api: {}
  mod_http_upload:
    docroot: "/opt/ejabberd_uploads"
    put_url: https://@HOST@:5443/upload
    max_size: 104857600 # Maximale Dateigröße in Bytes (hier: 100 MB)
    custom_headers:
      "Access-Control-Allow-Origin": "https://@HOST@"
      "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
      "Access-Control-Allow-Headers": "Content-Type"
  mod_last: {}
  mod_mam:
    ## Mnesia is limited to 2GB, better to use an SQL backend
    ## For small servers SQLite is a good fit and is very easy
    ## to configure. Uncomment this when you have SQL configured:
    db_type: sql
    assume_mam_usage: true
    default: always
  mod_mqtt: {}
  mod_muc:
    access:
      - allow
    access_admin:
      - allow: admin
    access_create: muc_create
    access_persistent: muc_create
    access_mam:
      - allow
    default_room_options:
      mam: true
  mod_muc_admin: {}
  mod_muc_occupantid: {}
  mod_offline:
    access_max_user_messages: max_user_offline_messages
  mod_ping: {}
  mod_privacy: {}
  mod_private: {}
  mod_proxy65:
    access: local
    max_connections: 5
  mod_pubsub:
    access_createnode: pubsub_createnode
    plugins:
      - flat
      - pep
    force_node_config:
      ## Avoid buggy clients to make their bookmarks public
      storage:bookmarks:
        access_model: whitelist
  mod_push: {}
  mod_push_keepalive: {}
  mod_register:
    ip_access: trusted_network
  mod_roster:
    versioning: true
  mod_s2s_bidi: {}
  mod_s2s_dialback: {}
  mod_shared_roster: {}
  mod_stream_mgmt:
    resend_on_timeout: if_offline
  mod_stun_disco:
    credentials_lifetime: 12h
    services:
        -
          host: IhrePublicIP
          port: 3478
          type: stun
          transport: udp
          restricted: false
        -
          host: IhrePublicIP
          port: 3478
          type: turn
          transport: udp
          restricted: true
        -
          host: IhreDomain
          port: 5349
          type: stuns
          transport: tcp
          restricted: false
        -
          host: IhreDomain
          port: 5349
          type: turns
          transport: tcp
          restricted: true

  mod_vcard: {}
  mod_vcard_xupdate: {}
  mod_version:
    show_os: false
###Wenn Sie ACME nutzen möchten müssen Sie das darunte stehende auskommentieren und anpassen,
#acme:
#  contact: "mailto:admin@xxxxx.xxx"
#  ca_url: "https://acme-v02.api.letsencrypt.org/directory"
Beispiel-Konfiguration eines EJabberd VPS "Sandalone" Servers, ACME Modul aktiv:

ACME Modul regelt die Zertifikatverwaltung automatisch.

hosts:
  - IhreDomain

loglevel: info

###Nach den ersten starten und wenn AMCE die Let' Encrypt Zertifikate angelegt hat kann das auskommentiert werden
#ca_file: /opt/ejabberd/conf/cacert.pem
###Nach den ersten starten und wenn AMCE die Let' Encrypt Zertifikate angelegt hat kann das auskommentiert werden
#certfiles:
#  - /opt/ejabberd/conf/server.pem
###Wichtig auch nach dem zweiten Start in die Adminoberfläche gehen und unter ACME noch das Zerifikat ür die Hauptdomain austellen, ###dann erst oben Auskommentieren!!!



### DATENBANK
default_db: sql
sql_type: pgsql
sql_server: "localhost"
sql_database: "ejabberd"
sql_username: "ejabberd_user"
sql_password: "IhrsicheresPasswort"
auth_method: [sql]
sql_pool_size: 10 

listen:
  -
    port: 5222
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls_required: true
  -
    port: 5223
    ip: "::"
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    tls: true
  -
    port: 5269
    ip: "::"
    module: ejabberd_s2s_in
    max_stanza_size: 524288
    shaper: s2s_shaper
  -
    port: 5443
    ip: "::"
    module: ejabberd_http
    tls: true
    request_handlers:
      /admin: ejabberd_web_admin
      /api: mod_http_api
      /bosh: mod_bosh
#      /captcha: ejabberd_captcha
      /upload: mod_http_upload
      /ws: ejabberd_http_ws
  -
    port: 80
    ip: "::"
    module: ejabberd_http
    request_handlers:
#      /admin: ejabberd_web_admin
      /.well-known/acme-challenge: ejabberd_acme

  -
    port: 3478
    transport: udp
    module: ejabberd_stun
    use_turn: true
    turn_min_port: 49152 
    turn_max_port: 65535
    ## The server's public IPv4 address:
    turn_ipv4_address: IhreIP
  -
    port: 5349
    transport: tcp
    module: ejabberd_stun
    use_turn: true
    tls: true
    turn_min_port: 49152
    turn_max_port: 65535
    ip: IhreIP
    turn_ipv4_address: IhreIP

s2s_use_starttls: optional

acl:
  admin: # <--- NEUE ZEILEN HIER HINZUFÜGEN
    user:
      - "admin@IhreDomain"
  local:
    user_regexp: ""
  loopback:
    ip:
      - 127.0.0.0/8
      - ::1/128

access_rules:
  local:
    allow: local
  c2s:
    deny: blocked
    allow: all
  announce:
    allow: admin
  configure:
    allow: admin
  muc_create:
    allow: local
  pubsub_createnode:
    allow: local
  trusted_network:
    allow: loopback

api_permissions:
  "console commands":
    from: ejabberd_ctl
    who: all
    what: "*"
  "webadmin commands":
    from: ejabberd_web_admin
    who: admin
    what: "*"
  "adhoc commands":
    from: mod_adhoc_api
    who: admin
    what: "*"
  "http access":
    from: mod_http_api
    who:
      access:
        allow:
          - acl: loopback
          - acl: admin
      oauth:
        scope: "ejabberd:admin"
        access:
          allow:
            - acl: loopback
            - acl: admin
    what:
      - "*"
      - "!stop"
      - "!start"
  "public commands":
    who:
      ip: 127.0.0.1/8
    what:
      - status
      - connected_users_number

shaper:
  normal:
    rate: 10000
    burst_size: 500000
  fast: 500000

shaper_rules:
  max_user_sessions: 10
  max_user_offline_messages:
    5000: admin
    100: all
  c2s_shaper:
    none: admin
    normal: all
  s2s_shaper: fast

modules:
  mod_adhoc: {}
  mod_adhoc_api: {}
  mod_admin_extra: {}
  mod_announce:
    access: announce
  mod_avatar: {}
  mod_blocking: {}
  mod_bosh: {}
  mod_caps: {}
  mod_carboncopy: {}
  mod_client_state: {}
  mod_configure: {}
  mod_disco: {}
  mod_fail2ban: {}
  mod_http_api: {}
  mod_http_upload:
    docroot: "/opt/ejabberd_uploads"
    put_url: https://@HOST@:5443/upload
    max_size: 104857600 # Maximale Dateigröße in Bytes (hier: 100 MB)
    custom_headers:
      "Access-Control-Allow-Origin": "https://@HOST@"
      "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
      "Access-Control-Allow-Headers": "Content-Type"
  mod_last: {}
  mod_mam:
    ## Mnesia is limited to 2GB, better to use an SQL backend
    ## For small servers SQLite is a good fit and is very easy
    ## to configure. Uncomment this when you have SQL configured:
    db_type: sql
    assume_mam_usage: true
    default: always
  mod_mqtt: {}
  mod_muc:
    access:
      - allow
    access_admin:
      - allow: admin
    access_create: muc_create
    access_persistent: muc_create
    access_mam:
      - allow
    default_room_options:
      mam: true
  mod_muc_admin: {}
  mod_muc_occupantid: {}
  mod_offline:
    access_max_user_messages: max_user_offline_messages
  mod_ping: {}
  mod_privacy: {}
  mod_private: {}
  mod_proxy65:
    access: local
    max_connections: 5
  mod_pubsub:
    access_createnode: pubsub_createnode
    plugins:
      - flat
      - pep
    force_node_config:
      ## Avoid buggy clients to make their bookmarks public
      storage:bookmarks:
        access_model: whitelist
  mod_push: {}
  mod_push_keepalive: {}
  mod_register:
    ip_access: trusted_network
  mod_roster:
    versioning: true
  mod_s2s_bidi: {}
  mod_s2s_dialback: {}
  mod_shared_roster: {}
  mod_stream_mgmt:
    resend_on_timeout: if_offline
  mod_stun_disco:
    credentials_lifetime: 12h
    services:
        -
          host: IhreIP
          port: 3478
          type: stun
          transport: udp
          restricted: false
        -
          host: IhreIP
          port: 3478
          type: turn
          transport: udp
          restricted: true
        -
          host: IhreDomain
          port: 5349
          type: stuns
          transport: tcp
          restricted: false
        -
          host: IhreDomain
          port: 5349
          type: turns
          transport: tcp
          restricted: true

  mod_vcard: {}
  mod_vcard_xupdate: {}
  mod_version:
    show_os: false
acme:
  contact: "mailto:admin@IhreDomain"
  ca_url: "https://acme-v02.api.letsencrypt.org/directory"
Konfiguration abgeschlossen Ejabberd Start:
sudo systemctl start ejabberd
Fehlerbehandlung:

Sollte es Fehler geben oder Ejabberd startet nicht, starten Sie Ejabberd im Vordergrund:

systemctl stop ejabberd
cd /opt/ejabberd-25.07/bin/
./ejabberdctl foreground

Zur Fehleranalyse starten Sie gegebenenfalls ein zweites Terminal und führen Sie folgenden Befehl aus:

tail -f /opt/ejabberd/logs/ejabberd.log
oder diesen
tail -f /opt/ejabberd/logs/error.log
Admin User anlegen:
Läuft alles normal und er startet ohne Fehler legen wir jetzt noch den Admin User an damit sie ich auf der Webseite von Ejabberd einloggen können.
sudo /opt/ejabberd-25.07/bin/ejabberdctl register admin IhreDomain IhrSicheresPasswort
ACME Zertifikat für Hauptdomain anlegen:

Legen wir jetzt noch das Zertifikat für die Hauptdomain in der Weboberfläche des Ejabberd Servers an, für pubsub, proxy, upload und conference hat es ACME schon getan. Danach muss man gegebenenfalls die Webseite aktualisieren, Cache leeren oder F5 drücken.

acme1.png

acme.png


Firewall Regeln:

Vergessen Sie nicht die Firewall Regeln anzupassen, das ist für einen funktionierenden Ejabberd Server wichtig!!!

In diesen Bild sehen sie die Regeln, wobei Port 22 und Port 2654 SSH Port sind, die nichts mit Ejabberd zu tun haben!

Wichtigste ejabberd-Ports:

5222 (TCP): Dies ist der Standardport für die Verbindung von XMPP-Clients mit dem Server, entweder unverschlüsselt oder mit STARTTLS zur Verschlüsselung.[1][2]

5223 (TCP): Eine ältere Methode für Client-Verbindungen, die SSL verwenden.

5269 (TCP): Wird für die Kommunikation zwischen verschiedenen XMPP-Servern verwendet (Server-zu-Server oder s2s).[1][2][3]

5280 / 5443 (TCP): Diese Ports werden für HTTP- und HTTPS-Dienste verwendet, einschließlich der Web-Administrationsoberfläche und für BOSH (eine Methode, um XMPP über HTTP zu tunneln).

7777 (TCP): Port wird für einen SOCKS5-Proxy für Dateiübertragungen genutzt. Bei mir nicht in Betrieb

3478 (TCP/UDP) / 5349 (TCP): Diese Ports werden für STUN- und TURN-Dienste verwendet, um bei der Kommunikation mit Clients zu helfen, die sich hinter einem NAT-Router befinden.[1]

Zusätzliche Ports:

Bei mir nicht verwendet.

4369 (TCP): Wird vom Erlang Port Mapper Daemon (epmd) genutzt, der für die Kommunikation zwischen den Erlang-Knoten in einem Cluster und für die Verwendung von ejabberdctl (dem ejabberd-Admin-Tool) unerlässlich ist.

1883 / 8883 (TCP): Werden für den MQTT-Dienst verwendet.


fw2.png

Deinstallation Ejabberd:
# To uninstall ejabberd, first remove the service. If you're using systemd:
systemctl --now disable ejabberd
rm -f /etc/systemd/system/ejabberd.service

# Remove the binary files:
rm -rf /opt/ejabberd-25.07

# If you want to remove your configuration, database and logs:
rm -rf /opt/ejabberd
rm -rf /opt/ejabberd_uploads/
# To remove the user running ejabberd:
userdel ejabberd
Video Anleitung dazu: