Skip to main content

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

Öffen wir in das Terminal:

Wir machen ein Update unseres Servers damit alle Pakte aktuell sind. Nun installieren Wir Postgresql und das Erlang Paket für welches wir benötignen 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
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:
chmod +x ejabberd-25.07-1-linux-x64.run
Ejabberd installieren:

mit folgenden Befehl:

sudo ./ejabberd-*.run

Schauen wir uns kurz an wo es installiert ist. Am besten wir machen uns geleich ein Backup zur Sicherheit.

eja.png

Enablen Service Ejabberd:

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

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 später in der ejabberd.yml definiert wird. Wir erstellen es unter /opt nennen es "ejabberd_uploads" und vergeben die Berechtigungen für ejabberd darin lesen und schreiben zu können.

sudo cd /opt
sudo mkdir ejabberd_uploads
sudo chown ejabberd:ejabberd ejabberd_uploads
Wir wechseln in die Postgresql Shell und entfernen gegebenenfalls vorhandene User und Datenbanken und legen einen neuen User an:
sudo -u postgres psql
DROP DATABASE IF EXISTS ejabberd;
DROP USER IF EXISTS ejabberd_user;
CREATE USER ejabberd_user WITH PASSWORD 'IhrSicheresPasswort';
CREATE DATABASE ejabberd OWNER ejabberd_user;
\q

Wir importieren nun die Ejabberd Datenbank in Postgresql, Sie werden währen des Importes nach Ihrem Passwort gefragt das sie weiter oben im Schritt angelegt haben 'IhrSicheresPasswort':

psql -h localhost -U ejabberd_user -d ejabberd -f /opt/ejabberd-25.07/lib/ejabberd-25.7.0/priv/sql/pg.sql
Bearbeiten wir nun die ejabbed.yml.
Sie können sie löschen oder ein Backup erstellen, oder schauen Sie sich mal an, ich werde Ihnen nachfolgend meine ejabberd.yml zeigen.
Ich verwende einen VPS Server mit ISPconfig und einer bestehenden Domain daher verwende ich das Let'sencrypt Zertifikat von meiner Domain. Um nur ein Zertifikat zu verwenden habe ich Subdomains für Confernce, Upload, Proxy und Pubsub anglegt die kein eigenes Let'sencrypt verwenden sondern das von der Hauptdomain, das ist wichtig denn sonst geht es nicht.
Wenn Sie das ohne ISpConfig machen, also ein "Purer" VPS Server ist, dann stellen sie einfach nur per DNS sicher das Wildcards *.IhreDomain auf Ihren Server Zeigen dann macht das eingebaute ACME bei Ejabberd die Zertifikate für Ihre Domain und für Confernce, Upload, Proxy und Pubsub automatisch!!! Sie brauchen sich darum nicht mehr zu kümmern! Den Zertifikats Verweis in der ejabberd können Sie dann entfernen.

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!!!

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"
Hier noch eine Konfiguration eines VPS "Sandalone" Servers wo sich ACME um die Zertifikate selber kümmert.
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"

Wenn das alles erledigt ist starten Sie Ejabberd:

sudo systemctl start ejabberd

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

cd /opt/ejabberd-25.07
./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

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
Vergessen Sie nicht Ihre Firewall Regeln anzupassen!!!!

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: