Installation Ejabberd 25.07 auf Debian 12 mit Datenbank Postgresql + Audio/Video Funktion
Gehen wir in das Terminal:
sudo apt update && apt upgrade -y
sudo apt install postgresql erlang-p1-pgsql mc curl unp wget -y
Bearbeiten wir die pg_hba.conf wie folgt:
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
# 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
Starten wir Postgresql neu:
sudo systemctl restart postgresql
Passenden Installer von der Seite runterladen 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, es wir unter /opt installiert:
sudo ./ejabberd-*.run
Wir enablen den Service Ejabberd das er beim start des Servers automatisch startet:
sudo systemctl enable ejabberd
Danach stoppen wir Ejabberd:
sudo systemctl stop ejabberd
Wir legen noch schnell das Upload Verzeichnis an und setzen den Eigentümer:
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!!!!
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