Multiple Dendrite instances

Hosting multiple Dendrite instances on one server

As mentioned in my [previous post](matrix-hosting-basics.html), I'm running [Dendrite](https://github.com/matrix-org/dendrite) as my Matrix homeserver.

As well as my [ideclon.uk](https://matrix.to/#/@me:ideclon.uk) Matrix instance, I'm running other instances of Dendrite in the same VM for other purposes. Each of these instances are running as a separate SystemD service.

Here's the basics of setting up another Dendrite instance on a server already running one.

Note that I am **not using Docker**.

# Configuration
Each instance will need it's own config file and storage directory. I'm using `/etc/dendrite/[DOMAIN]`.

## Config file
You can just copy the [default config file](https://github.com/matrix-org/dendrite/blob/main/dendrite-sample.monolith.yaml) and replace:

* `server_name`

* `private_key`

* `database` -> `connection_string`

`private_key` is the Matrix signing key you'll generate below.

For the `connection_string`, you just need to replace the database name.

# Ports
Dendrite listens on port 8008 on all interfaces by default. You can override this with the CLI flag `--http-bind-address`. Multiple Dendrite instances won't be able to listen on the same interface/port combo, so you could have Dendrite listen on a different port (as I do - 8008, 8018, 8028...), or on the same port on different IPs (if you have them).

As mentioned in my previous post, other Matrix servers (and clients) will expect to find your server on port 8448. You can deal with this via delegation (see that post), or run a proxy server like [Traefik](https://traefik.io) in front of your server and forward based on hostnames.

# Keys
Generate a new Matrix signing key:
`$ ./bin/generate-keys --private-key [NEW_KEY_NAME].pem`

# Database
Each instance will need it's own database. Assuming you're using PostgreSQL (as is recommended in the docs), you can just run `$ sudo -u postgres createdb -O dendrite -E UTF-8 dendrite_[DOMAIN]` to create a new database called `dendrite_[DOMAIN]`, owned by the `dendrite` role.

# SSL / TLS
As mentioned above, this post assumes you've set up a Dendrite server before (on the same server you'll be running this one). This is not a guide on setting up / configuring Matrix. I'm just going to point to [the docs](https://matrix-org.github.io/dendrite/installation/domainname#tls-certificates) on this.

# SystemD service
The SystemD service broadly needs to do the following:

* Run as `dendrite:dendrite`

* Run in your new storage directory

* Run after `network-online.target` and `postgres.service`.

Here's an example:

`[Unit]
Description=[DOMAIN] Dendrite (Matrix Homeserver)
After=syslog.target
After=network-online.target
After=postgresql.service

[Service]
Environment=GODEBUG=madvdontneed=1
RestartSec=2s
Type=simple
User=dendrite
Group=dendrite
WorkingDirectory=/etc/dendrite/[DOMAIN]/
ExecStart=/usr/local/bin/dendrite-monolith-server -config /etc/dendrite/[DOMAIN]/dendrite.monolith.yml --http-bind-address :[PORT]
Restart=always
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target`

# CLI Administration
When running the `./bin/create-account` binary, you'll need to make sure to point it at the correct config file - so `-config /etc/dendrite/[DOMAIN]/dendrite.monolith.yml`.

---

And I think that's it!

Please do let me know if this helped you, or if there's anything I got wrong.

Mastodon: [@[email protected]](https://tilde.zone/@ideclon)
Matrix: [@me:ideclon.uk](https://matrix.to/#/@me:ideclon.uk)

tags: matrix,dendrite,systemd,self-hosting,proxy-server