Jae's Website
Random Beeps'n Boops

Logo

Setting up your on Matrix server using Synapse

Greetings everybody.
Today, we're gonna learn how to setup your own Matrix server using Synapse.

Pre-requisites:

  • Some time
  • A server (preferably Debian)
  • Docker installed
  • A reverse-proxy (in this example, Caddy)
  • A domain/subdomain (as long as you can host a .well-known on the domain)

Caddy is used here because of its ease of use and maintenance (auto-renews and requests SSL for instance & super easy config files).

DNS Setup

First, setup your root to your server and also the matrix subdomain.
The zone should look like this (replace the IPs by yours or use the web panel of your domain; dummy addresses from my own network are shown):

@ 300 IN A 88.218.40.1
@ 300 IN AAAA 2001:67c:2724:e000:b::1
matrix 300 IN A 88.218.40.1
matrix 300 IN AAAA 2001:67c:2724:e000:b::1

Compose setup

Setting up a Matrix server is really simple.
There, we will setup:

  • The Matrix server itself
  • The reverse proxy

The docker-compose.yml file will look something like this:

version: "3.9"

services:
  caddy:
    image: caddy:2
    volumes:
      - ./caddy/data:/data
      - ./caddy/web:/web
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
    ports:
      - 80:80
      - 443:443
    
  synapse:
    image: matrixdotorg/synapse
    volumes:
      - ./synapse:/data

Generation of the server

After creating this file, we can generate the configuration and keys for the actual server:

docker run -it --rm \
    -v $(pwd)/synapse:/data \
    -e SYNAPSE_SERVER_NAME=my.tld \
    -e SYNAPSE_REPORT_STATS=no \
    matrixdotorg/synapse:latest generate

Also, edit the synapse/homeserver.yaml file and set the following config to avoid people registering on your personal server:

enable_registration: false

Reverse proxy configuration

Then, let's create the reverse proxy configuration (in caddy/Caddyfile):

https://my.tld {
    root * /web/website
    file_server
}

https://matrix.my.tld {
    reverse_proxy synapse:8008
}

Now you can create caddy/web/website and put your website into it.
You will also have to create the directory .well-known with mkdir -p caddy/web/website/.well-known/matrix and now, edit caddy/web/website/.well-known/matrix to contain:

{
    "m.server": "matrix.my.tld:443"
}

First run

To start your newly created server, you just have to issue docker compose up -d.
You can use the Matrix federation tester to test if your server federates correctly.

If so, to register a user, you can issue these commands:

docker compose exec synapse bash
register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008

Follow the on-screen prompt and register your user.

Updating

To update your server, you need to issue those commands:

docker compose pull
docker compose up -d

Additionally, you can cleanup the unused images afterwards:

docker system prune -a

All done, you can now talk with other Matrix servers!