Introduction
Matrix is a decentralized communication protocol. Each Matrix server has its own set of users and its own set of rules, you can host your own Matrix server on a RouterOS device using Containers. You can create federation between Matrix servers and communicate with users on different Matrix servers securely. You can also use Matrix bridges to relay messages from other chat platforms such as WhatsApp, Discord, Signal, Telegram and other platforms and only use a single App such as Element and be able to communicate with users on different platforms.
Configuration
To setup a Matrix server on your RouterOS device, follow the steps below.
Make sure you have created a Container network before proceeding.
- Create PostgreSQL Container environment variables:
/container/envs/add name=postgres_synapse_envs key=POSTGRES_DB value="synapse" /container/envs/add name=postgres_synapse_envs key=POSTGRES_PASSWORD value="<POSTGRES_PASSWORD_HERE>" /container/envs/add name=postgres_synapse_envs key=POSTGRES_USER value="synapse_user" /container/envs/add name=postgres_synapse_envs key=PGDATA value="/var/lib/postgresql/data/pgdata" /container/envs/add name=postgres_synapse_envs key=POSTGRES_INITDB_ARGS value="--encoding='UTF8' --lc-collate='C' --lc-ctype='C'" /container/envs/add name=postgres_synapse_envs key=PGPORT value=5433
- Create PostgreSQL Container mounts:
/container/mounts/add name=synapse_postgres_data src=disk1/synapse-postgres-data dst=/var/lib/postgresql/data
- Create a PostgreSQL Container:
/container/add remote-image=postgres:17.2-alpine interface=veth1 root-dir=disk1/postgres-17.2-synapse mounts=synapse_postgres_data envlist=postgres_synapse_envs name=postgresql_synapse
- Create Synapse Container environment variables:
/container/envs/add name=synapse_envs key=SYNAPSE_CONFIG_DIR value="/data" /container/envs/add name=synapse_envs key=SYNAPSE_CONFIG_PATH value="/data/homeserver.yaml" /container/envs/add name=synapse_envs key=SYNAPSE_SERVER_NAME value="test.mt.lv" /container/envs/add name=synapse_envs key=SYNAPSE_REPORT_STATS value="yes"
- Create Synapse Container mounts:
/container/mounts/add name=synapse_data src=disk1/synapse-data dst=/data
- Create a Synapse Container for generating required data:
/container/add remote-image=matrixdotorg/synapse:latest interface=veth1 cmd="generate" root-dir=disk1/synapse mounts=synapse_data envlist=synapse_envs name=synapse
- Start and stop the Synapse Container to allow it to generate required files:
/container/start [find where name=synapse] /container/stop [find where name=synapse]
- Remove the
cmd
parameter from the Synapse Container:/container/set [find where name=synapse] cmd=""
- Connect to your RouterOS device using a SFTP client (for example, WinSCP if using Microsoft Windows) and adjust the
disk1/synapse-data/homeserver.yaml
file:database: name: psycopg2 args: user: synapse_user password: <POSTGRE_PASSWORD_HERE> dbname: synapse host: localhost port: 5433 cp_min: 5 cp_max: 10 keepalives_idle: 10 #optional keepalives_interval: 10 #optional keepalives_count: 3 #optional
- Start the PostgreSQL Container:
/container/start [find where name=postgresql_synapse]
- Start the Synapse Container:
/container/start [find where name=synapse]
- Enter the Synapse Container's shell and register a new user:
register_new_matrix_user -c /data/homeserver.yaml
- You should now be able to access your Matrix server using your RouterOS device's address.
Make sure you check the official documentation for Synapse to get the latest configuration steps.
Discord bridge
- Create PostgreSQL Discord bridge Container environment variables:
/container/envs/add name=postgres_discord_envs key=POSTGRES_DB value="synapse-discord" /container/envs/add name=postgres_discord_envs key=POSTGRES_PASSWORD value="<POSTGRE_BRIDGE_PASSWORD_HERE>" /container/envs/add name=postgres_discord_envs key=POSTGRES_USER value="synapse_discord" /container/envs/add name=postgres_discord_envs key=PGDATA value="/var/lib/postgresql/data/pgdata" /container/envs/add name=postgres_discord_envs key=POSTGRES_INITDB_ARGS value="--encoding='UTF8' --lc-collate='C' --lc-ctype='C'" /container/envs/add name=postgres_synapse_envs key=PGPORT value=5434
- Create PostgreSQL Discord bridge Container mounts:
/container/mounts/add name=discord_postgres_data src=disk1/discord-postgres-data dst=/var/lib/postgresql/data
- Create a PostgreSQL Container for Discord bridge:
/container/add remote-image=postgres:17.2-alpine interface=veth1 root-dir=disk1/postgres-17.2-discord mounts=discord_postgres_data envlist=postgres_discord_envs name=postgresql_discord
- Follow the guide for HAProxy Container and setup a reverse proxy for port
8080
- sdaCreate Discord bridge Container mount points:
/container/mounts/add name=synapse_discord_data src=disk1/synapse-discord-data dst=/data
- Create a Discord Bridge Container:
/container/add remote-image=litetex/mau.mautrix.discord:latest interface=veth1 root-dir=disk1/synapse-discord mounts=synapse_discord_data name=synapse_discord
- Start and stop the Discord bridge Container to generate files:
/container/start [find where name=synapse_discord] /container/stop [find where name=synapse_discord]
- Connect to your RouterOS device using SFTP client (for example, WinSCP when using Microsoft Windows) and adjust the file
disk1/dynapse-discord/config.yaml
:homeserver address: http://localhost:8008 domain: test.mt.lv software: standard async_media: true appservice address: leave default hostname: leave default port: leave default database: type: postgres uri: postgres://synapse_discord:<POSTGRE_DISCORD_PASSWORD_HERE>@172.17.0.2:5434/synapse-discord?sslmode=disable bridge: encryption: allow: true permissions: "*": relay "@your_admin_user1:test.mt.lv": admin "@your_admin_user2:test.mt.lv": admin
- Start and stop the Discord bridge Container again:
/container/start [find where name=synapse_discord] /container/stop [find where name=synapse_discord]
- Download the file
disk1/synapse-discord/registration.yaml
and upload it as filedisk1/synapse-data/mautrix-discord-registration.yaml
- Connect to your RouterOS device using a SFTP client (for example, WinSCP when using Microsoft Windows) and add the following lines to
disk1/synapse-data/homeserver.yaml
:... app_service_config_files: - /data/mautrix-discord-registration.yaml
- Start and stop the Synapse and Discord bridge Containers:
/container/start [find where name=synapse_discord] /container/stop [find where name=synapse_discord] /container/start [find where name=synapse] /container/stop [find where name=synapse]
- Your Matrix server should not have a new user called "Discord bridge bot". Follow the official documentation to create bridged rooms.