Table of Contents

Setting up a Prosody XMPP chat server


Firewall

The following ports have to be opened in your firewall:

5222/tcp  # XMPP Client-to-Server
5269/tcp  # XMPP Server-to-Server
5281/tcp  # XMPP HTTPS (for file sharing)


Prosody

Prosody (formerly lxmppd) is a cross-platform XMPP server written in Lua. Its development goals include low resource usage, ease of use, and extensibility.


Installation

sudo apt install prosody prosody-modules lua-unbound

Add the prosody user to the ssl-cert group:

sudo usermod -aG ssl-cert prosody


Configuration

Create a virtual host configuration:

/etc/prosody/conf.avail/quietlife.nl.cfg.lua
VirtualHost "quietlife.nl"
 
admins = { "user1@quietlife.nl" }
 
modules_enabled = {
		"carbons";
		"cloud_notify";
		"mam";
		"seclabels";
		"smacks";
}
 
ssl = {
		certificate = "/etc/prosody/certs/quietlife.nl.crt";
		key = "/etc/prosody/certs/quietlife.nl.key";
		protocol = "tlsv1_2+";
		ciphers = "EECDH+AESGCM:EDH+AESGCM";
		dhparam = "/etc/ssl/dhparams.pem";
}
 
Component "conference.quietlife.nl" "muc"
Component "upload.quietlife.nl" "http_file_share"
http_file_share_size_limit = 100000000

Enable the configuration:

cd /etc/prosody/conf.d/
sudo ln -s ../conf.avail/quietlife.nl.cfg.lua .


SSL certificate creation

Generate a certificate with certbot that contains your base hostname and subdomains conference and upload:

sudo certbot certonly -d quietlife.nl -d conference.quietlife.nl -d upload.quietlife.nl

If your base hostname is on a subdomain, use sub-subdomains:

sudo certbot certonly -d chat.quietlife.nl -d conference.chat.quietlife.nl -d upload.chat.quietlife.nl

If you already have a certificate for your base hostname, you can expand it to include these subdomains:

sudo certbot certonly --expand -d quietlife.nl -d conference.quietlife.nl -d upload.quietlife.nl


DH parameters generation

If you don't have one already, generate dhparams.pem with openssl:

cd /tmp/
openssl dhparam -out dhparams.pem 4096
sudo mv dhparams.pem /etc/ssl/
sudo chown root:ssl-cert /etc/ssl/dhparams.pem
sudo chmod 640 /etc/ssl/dhparams.pem


SSL certificate import

Unlike Apache, nginx, Dovecot and Postfix, Prosody does not shortly run as root when started in order to read from /etc/letsencrypt/. So certificates have to be copied to the /etc/prosody/certs/ directory:

sudo prosodyctl --root cert import quietlife.nl /etc/letsencrypt/live


SSL certificate renewal

If you use Let's Encrypt, you have to renew your certificates every three months. They also have to be re-imported by Prosody after every renewal. This can be automated with a script you put in /etc/letsencrypt/renewal-hooks/post/:

/etc/letsencrypt/renewal-hooks/post/prosody.sh
#!/bin/sh
prosodyctl --root cert import quietlife.nl /etc/letsencrypt/live

Make it executable:

sudo chmod +x /etc/letsencrypt/renewal-hooks/post/prosody.sh


Restart Prosody

sudo systemctl restart prosody.service


Add users

sudo prosodyctl adduser user1@quietlife.nl
sudo prosodyctl adduser user2@quietlife.nl
...