summaryrefslogtreecommitdiff
path: root/content/ejabberd.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/ejabberd.md')
-rw-r--r--content/ejabberd.md310
1 files changed, 310 insertions, 0 deletions
diff --git a/content/ejabberd.md b/content/ejabberd.md
new file mode 100644
index 0000000..eff3b36
--- /dev/null
+++ b/content/ejabberd.md
@@ -0,0 +1,310 @@
+---
+title: "ejabberd"
+date: 2022-03-29
+icon: 'ejabberd.png'
+tags: ['service']
+short_desc: "A chat server based on XMPP."
+---
+
+[Ejabberd](https://ejabberd.im) is a server for the XMPP protocol written in Erlang. It's more scalable, and easier to setup than [Prosody](/prosody) due to having most of its modules built-in and pre-configured by default.
+
+## Prerequisites
+
+### Subdomains
+
+Ejabberd presumes that you have already created all the **required and optional subdomains** for its operation prior to running it.
+
+Depending on the usecase, you may need any or all of the following domains for XMPP functionality:
+
+- **example.org** - Your XMPP hostname
+- **conference.example.org** - For `mod_muc`, Multi User Chats (MUCs)
+- **upload.example.org** - For `mod_http_upload`, file upload support
+- **proxy.example.org** - For `mod_proxy65`, SOCKS5 proxy support
+- **pubsub.example.org** - For `mod_pubsub`, publish-subscribe support (A fancier RSS)
+
+Only the **example.org** domain is required for basic, private chat usage.
+If you do **not** wish to use a certain domain, just disable it's associated module and ejabberd won't complain when it can't find it's associated certificate.
+For example, if you don't want [Publish-Subscribe](https://xmpp.org/extensions/xep-0060.html) support, just comment out the `mod_pubsub` config in `/etc/ejabberd.yml`:
+
+```yml
+## 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
+```
+
+This guide will assume **all these subdomains** have been created.
+
+#### Custom Subdomains
+
+If you wish to customize any of these domains, edit `/etc/ejabberd.yml` and under every appropriate module that needs a subdomain, add the following setting:
+```yml
+mod_muc:
+ host: {{<hl>}}muc.example.org{{</hl>}}
+```
+
+## Installation
+
+To get the latest version of ejabberd, you need to first setup the ejabberd apt repositories:
+
+```sh
+curl -o /etc/apt/sources.list.d/ejabberd.list https://repo.process-one.net/ejabberd.list
+curl -o /etc/apt/trusted.gpg.d/ejabberd.gpg https://repo.process-one.net/ejabberd.gpg
+```
+
+Then update the repositories and install the `ejabberd` package:
+
+```sh
+apt update
+apt install ejabberd
+```
+
+## Configuration
+
+The ejabberd server is configured in `/etc/ejabberd/ejabberd.yml`.
+Changes are only applied by restarting the ejabberd daemon in systemd:
+
+```sh
+systemctl restart ejabberd
+```
+
+### Hostnames
+
+The **XMPP hostname** is specified in the `hosts` section of
+`ejabberd.yml`:
+
+```yml
+hosts:
+ - {{<hl>}}example.org{{</hl>}}
+```
+
+### Certificates
+
+Unlike [Prosody,](https://prosody.im) ejabberd doesn\'t come equipped
+with a script that can automatically copy over the relevant certificates
+to a directory where the ejabberd user can read them.
+
+One way of organizing certificates for ejabberd is to have them stored
+in `/etc/ejabberd/certs`, with each domain having a separate directory
+for both the fullchain cert and private key.
+
+Using certbot, this process can be easily automated with these commands:
+
+```bash
+DOMAIN={{<hl>}}example.org{{</hl>}}
+
+# Set the domain names you want here
+declare -a subdomains=("" "conference." "proxy." "pubsub." "upload.")
+
+for i in "${subdomains[@]}"; do
+ certbot --nginx -d $i$DOMAIN certonly
+ mkdir -p /etc/ejabberd/certs/$i$DOMAIN
+ cp /etc/letsencrypt/live/$i$DOMAIN/fullchain.pem /etc/ejabberd/certs/$i$DOMAIN
+ cp /etc/letsencrypt/live/$i$DOMAIN/privkey.pem /etc/ejabberd/certs/$i$DOMAIN
+done
+```
+*Note: Just like with Prosody, you might want to write this script to a file and setup a [cronjob](/cron) to run it periodically. This should help prevent your certificates from expiring.*
+
+Make sure all the certificates are readable by the `ejabberd` user:
+```sh
+chown -R ejabberd:ejabberd /etc/ejabberd/certs
+```
+
+To enable the use of all these certificates in ejabberd, the following
+configuration is necessary:
+
+```yml
+certfiles:
+ - "/etc/ejabberd/certs/*/*.pem"
+```
+
+### Admin User
+
+The **admin user** can be specified in `ejabberd.yml` under the `acl`
+section:
+
+```yml
+acl:
+ admin:
+ user: admin
+```
+
+This would make **admin@example.org** the user with administrator
+privileges.
+
+### File Uploads
+
+To ensure full compliance with XMPP standards, add the following configuration to `mod_http_upload`:
+
+```yaml
+mod_http_upload:
+ put_url: https://@HOST@:5443/upload
+ docroot: {{<hl>}}/var/www/upload{{</hl>}}
+ custom_headers:
+ "Access-Control-Allow-Origin": "https://@HOST@"
+ "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
+ "Access-Control-Allow-Headers": "Content-Type"
+```
+
+Make sure to create and give the `ejabberd` user ownership of `/var/www/upload` or any other directory you choose to use for file uploads:
+
+```sh
+chown -R ejabberd:ejabberd /var/www/upload
+```
+
+### Message Archives
+
+The ejabberd server supports keeping archives of messages through its `mod_mam` module. This can be enabled by uncommenting the following lines:
+
+```yml
+mod_mam:
+ assume_mam_usage: true
+ default: always
+```
+
+## Database
+
+### Why use a database?
+
+We can find the following comment in the `mod_mam` section of `/etc/ejabberd.yml`:
+
+```yml
+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
+```
+
+As these comments imply, an **SQL backend** is strongly recommended if you wish to use your ejabberd server for anything more than just testing. Ejabberd supports **MySQL, SQLite** and **PostgreSQL.** For the purpose of efficiency, this guide will use **PostgresSQL** because other server software like [Matrix](/matrix) and [PeerTube](/peertube) support it.
+
+### Installing PostgreSQL
+
+PostgreSQL is available in the Debian repositories:
+
+```sh
+apt install postgresql
+```
+
+In addition, you will have to install the **appropriate headers for Erlang,** the language ejabberd is written in, so it can actually interact with the PostgreSQL server:
+```sh
+apt install erlang-p1-pgsql
+```
+
+Start the PostgreSQL daemon to begin using it:
+
+```sh
+systemctl start postgresql
+```
+
+### Creating the Database
+
+To create the database, first create a PostgreSQL user for ejabberd:
+
+```sh
+su -c "createuser --pwprompt ejabberd" postgres
+```
+
+Then, create the database and make `ejabberd` its owner:
+
+```sh
+su -c "psql -c 'CREATE DATABASE ejabberd OWNER ejabberd;'" postgres
+```
+
+### Importing Database Scheme
+
+Ejabberd does **not** create the database scheme by default; It has to be imported into the database before use.
+
+```sh
+su -c "curl -s https://raw.githubusercontent.com/processone/ejabberd/master/sql/pg.sql | psql ejabberd" postgres
+```
+
+### Configuring ejabberd to use PostgreSQL
+
+Finally, add the following configuration to `ejabberd.yml`:
+
+```yml
+sql_type: pgsql
+sql_server: "localhost"
+sql_database: "{{<hl>}}ejabberd{{</hl>}}"
+sql_username: "{{<hl>}}ejabberd{{</hl>}}"
+sql_password: "{{<hl>}}psql_password{{</hl>}}"
+
+default_db: sql
+```
+That line at the end sets **every module's database** to default to the `sql` backend. This includes the `mod_mam` module, so all our data is being stored with PostgreSQL.
+
+### Voice and Video Calls
+
+Ejabberd supports the **TURN** and **STUN** protocols to allow internet users behind NATs to perform voice and video calls with other XMPP users. **This is enabled by default using [ejabberd_stun](https://docs.ejabberd.im/admin/configuration/listen#ejabberd-stun-1).**
+
+**However,** if you plan on running ejabberd alongside **other applications** that require TURN and STUN, such as Matrix, then you'll have to setup your own external TURN server using Coturn.
+
+#### Setup with Coturn and `mod_stun_disco`
+
+Firstly, setup a TURN and STUN server with [Coturn,](/coturn) using an **authentication secret.**
+
+Then, edit `mod_stun_disco` to contain the appropriate information for
+your turnserver:
+
+```yml
+ mod_stun_disco:
+ secret: "{{<hl>}}your_auth_secret{{</hl>}}"
+ services:
+ -
+ host: {{<hl>}}turn.example.org{{</hl>}}
+ type: stun
+ -
+ host: {{<hl>}}turn.example.org{{</hl>}}
+ type: turn
+```
+
+
+## Using ejabberd
+
+### Registering the Admin User
+
+To begin using ejabberd, firstly start the ejabberd daemon:
+
+```sh
+systemctl restart ejabberd
+```
+
+Then, using `ejabberdctl` as the ejabberd user, register the admin user which is set in `ejabberd.yml`:
+
+```sh
+su -c "ejabberdctl register {{<hl>}}admin example.org password{{</hl>}}" ejabberd
+```
+
+This will create the user **admin@example.org.**
+
+### Using the Web Interface
+
+By default, ejabberd has a web interface accessible from **http://example.org:5280/admin**. When accessing this interface, you will be prompted for the admin credentials:
+
+{{< img src="/pix/ejabberd-login.webp" >}}
+
+After signing in with the admin credentials, you will be able to manage
+your ejabberd server from this web interface:
+
+{{< img src="/pix/ejabberd-admin.webp" >}}
+
+## Further Configuration
+
+For a deeper look into all the modules and options, have a look at the following ejabberd documentation:
+- Ejabberd's [Listen Modules](https://docs.ejabberd.im/admin/configuration/listen/) and [Listen Options](https://docs.ejabberd.im/admin/configuration/listen-options/)
+- Ejabberd's [Top-Level Options](https://docs.ejabberd.im/admin/configuration/toplevel/)
+- Ejabberd's [Modules' Options](https://docs.ejabberd.im/admin/configuration/modules/)
+
+*And with that, you've successfully setup your ejabberd XMPP server!*
+
+---
+
+Written by [Denshi.](https://denshi.org)
+Donate Monero at:
+`48dnPpGgo8WernVJp5VhvhaX3u9e46NujdYA44u8zuMdETNC5jXiA9S7JoYMM6qRt1ZcKpt1J3RZ3JPuMyXetmbHH7Mnc9C`