Matrix is a free/libre API and protocol for chat and voice communication; Think DIY Discord, except without all the spyware. One can setup their own Matrix homeserver using either the Matrix-Synapse or Dendrite software; A Matrix server supports messaging, encrypted messaging, voice and video calls (once a turn server is set up), and many other services.

Initial Server Setup

This section covers base installation and setup of Matrix-Synapse, about enough to get the homeserver running; If you wish to actually register an account to the instance and use it, consult the further server configuration part.


  • Debian 10 or newer

  • NGINX installed

  • Ports 80, 443 and 8448 port-forwarded on your router/modem

  • Your own domain with an A DNS entry set to the public IPv4 address of your server

  • Basic UNIX knowledge

Webserver Configuration

Before you install any packages, there has to be an appropriate configuration for Matrix-Synapse in your /etc/nginx/sites-available directory. Here's an example configuration:

server {
        server_name YOUR_DOMAIN;

        listen 80;
        listen [::]:80;

        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;
        listen 8448 ssl http2 default_server;
        listen [::]:8448 ssl http2 default_server; 
	location ~* ^(\/_matrix|\/_synapse|\/_client) {
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
        client_max_body_size 50M;

	location /.well-known/matrix/client {
        return 200 '{"m.homeserver": {"base_url": "https://YOUR_DOMAIN"}}';
        default_type application/json;
        add_header Access-Control-Allow-Origin *;

        location /.well-known/matrix/server {
        return 200 '{"m.server": "YOUR_DOMAIN:443"}';
        default_type application/json;
        add_header Access-Control-Allow-Origin *;

(This example configuration file contains all configuration needed to utilize both federation and client Well-Known URI)

This configuration file should be placed in /etc/nginx/sites-available and then symbolically linked to /etc/nginx/sites-enabled:

sudo ln -s /etc/nginx/sites-available/YOUR_DOMAIN /etc/nginx/sites-enabled

Installing packages

To actually install Matrix-Synapse on Debian, first add the official Matrix Debian repo to your system:

sudo apt install -y lsb-release wget apt-transport-https
sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" |
    sudo tee /etc/apt/sources.list.d/matrix-org.list

Then update the repository database and install the matrix-synapse-py3 package:

sudo apt update
sudo apt install matrix-synapse-py3

Now simply reload the following services with systemctl:

 sudo systemctl restart nginx matrix-synapse

And you've done it! Matrix-Synapse is now successfully installed;

Further Server Configuration

Now that the Matrix-Synapse server has been installed and some basic configuration has been done, it's highly recommended to further configure it to enable things such as SSL encryption, a PostgreSQL database, and user registration.

Encryption with Certbot

Begin by installing Certbot to your Debian system, along with the NGINX extension:

sudo apt install python3-certbot python3-certbot-nginx

As shown in the NGINX page on this wiki, Let's Encrypt's Certbot tool can be used to not only generate an encryption certificate for your domain, but also write the appropriate configuration to the server entry in /etc/nginx/sites-available.

We can do all this with the following command:

 sudo certbot --nginx -d YOUR_DOMAIN

And success! You've generated an encryption certificate and enabled encryption for your Matrix homeserver.

Enabling PostgreSQL

It's highly recommended to use PostgreSQL as the database for your Matrix homeserver instead of the default SQLite database configuration; To set this up, begin by installing PostgreSQL:

sudo apt install postgresql

Now start the daemon:

sudo systemctl start postgresql

Now to create a database for your Matrix homeserver, first switch to the postgres user:

sudo su - postgres

(If the user has no password, create one for it by using sudo passwd postgres)

Now create a new PostgreSQL user, in this case named synapse_user:

createuser --pwprompt synapse_user

Now run the >psql command to access the PostgreSQL shell interface, and create a new database named synapse, setting synapse_user as it's owner:

 OWNER synapse_user;

Now edit the database configuration in /etc/matrix-synapse/homeserver.yaml and comment out the following lines for the previous SQLite configuration:

= database:
  = name: sqlite3
  = args:
    = database: DATADIR/homeserver.db

(Note: The example above is how yours should look like after it's commented out.)

Then, uncomment the following configuration above, and set the appropriate entries:

  name: psycopg2
    user: synapse_user
    password: secretpassword
    database: synapse
    host: localhost
    cp_min: 5
    cp_max: 10

Ensure that synapse is set to your database name, synapse_user is set to that database's owner, and that secretpassword is set to that user's password.

Now restart the martix-synapse service:

sudo systemctl restart matrix-synapse

And congratulations! Your Matrix homeserver now uses a PostgreSQL database!

Enabling user registration

Enabling user registration means anyone will be able to register a Matrix account to your instance; This includes yourself, and enabling this feature is required to register an admin account. Please note, Matrix accounts cannot be deleted, only "deactivated".

Enabling registration is as simple as uncommenting and changing one line in the /etc/matrix-synapse/homeserver.yaml file:

enable_registration: true

To be able to create users from your homeserver with the register_new_matrix_user command, you also need to uncomment this line in your matrix config:

 registration_shared_secret: ???

Then simply restart Matrix-Synapse with:

sudo systemctl restart matrix-synapse

Now, use the register_new_matrix_user command, which is installed alongside the matrix-synapse-py3 package, to create a new admin user on your server:

sudo register_new_matrix_user -u YOUR_USERNAME -p YOUR_PASSWORD -a -c /etc/matrix-synapse/homeserver.yaml https://YOUR_DOMAIN:8448

(If you are running this on your own server, there is no need to add the https://YOUR_DOMAIN:8448 part of this command.)

Client Well-Known URI

An optional but recommended aspect to configure is the client Well-Known URI, which allows any user to simply type in their matrix username, for example @denshi:denshi.org, into any Matrix client, and have this automatically resolve their homeserver, skipping the homeserver setting step entirely;

This is already setup in the NGINX configuration previously stated in this guide.


As mentioned before in the Initial Setup section of this page, the NGINX example configuration contains all the lines needed for federation to successfully work under it; No further configuration necessary!

You can test the federation here.

However, some extra features can be enabled to increase the usability of your homeserver over federation. In homeserver.yaml, the following lines can be edited:

allow_public_rooms_over_federation: true

This can be un-commented to allow users to add your homserver to their list of servers (in a client like Element) and see a list of all the public rooms.

allow_public_rooms_without_auth: true

This can be un-commented to enable guests to see public rooms without authenticating.

URL Previews

Matrix-Synapse supports URL previews; To enable them, change this line to true in /etc/matrix-synapse/homeserver.yaml:

url_preview_enabled: true

And make sure to uncomment the url_preview_ip_range_blacklist: section; Otherwise, Synapse will refuse to start up again!