I’ve been really fascinated by Matrix lately – it’s a set of APIs that makes it super easy to have decentralised chat rooms – even across disparate services like WhatsApp, Discord, Telegram, and Mattermost. I wanted to set it up and see the performance on a VM running Docker. Here’s how I configured the connection in a few simple steps.
Provisioning the VM
First I provisioned the Virtual Machine that would run the Synapse container.
Download Debian, verify signature, and set up a KVM in headless mode with port forwarding.
cd ~ mkdir iso hdd wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.6.0-amd64-netinst.iso -O iso/debian-10.6.0-amd64-netinst.iso wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/SHA1SUMS -O iso/SHA1SUMS wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/SHA1SUMS.sign -O iso/SHA1SUMS.sign gpg SHA1SUMS.sign gpg --keyserver keyring.debian.org --recv-keys DF9B9C49EAA9298432589D76DA87E80D6294BE9B gpg --verify SHA1SUMS.sign SHA1SUMS sha1sum iso/debian-10.6.0-amd64-netinst.iso qemu-img create -f qcow2 hdd/debian-docker-root.qcow2 64G -o nocow=on qemu-system-x86_64 -m 8G -enable-kvm -cpu host -sandbox on -smp 2 -name 'docker-host' -hda $HOME/hdd/debian-docker-root.qcow2 -cdrom $HOME/iso/debian-10.6.0-amd64-netinst.iso -netdev user,id=net0 -device e1000,netdev=net0
Run through the installation process. I set 8GB of RAM so the installer automatically creates a reasonable swap partition. I usually prefer to go through the process manually and then snapshot the rootfs. I didn’t see any advantage of using OVMF UEFI firmware for this demo.
I set my hostname to ‘dkr’ and domain name to redshift7. I disabled root by not entering a password. For partitioning, I used the entire disk with all files in a single partition with a ext4 filesystem. I created a 4G swap partition.
Next, I created a snapshot of the root filesystem so I could have a base image for the virtual machine.
qemu-img create -f qcow2 -b hdd/debian-docker-root.qcow2 debian-docker-root-s1.qcow2 -o nocow=on
I launched the VM again, this time with the new derivative image. I also exposed a port for SSH to work on the external interface so I could install docker using an Ansible playbook.
qemu-system-x86_64 -m 8G -enable-kvm -cpu host -sandbox on -smp 2 -name 'docker-host' -hda $HOME/hdd/debian-docker-root-s1.qcow2 -netdev user,id=net0,hostfwd=tcp::20022-:22 -device e1000,netdev=net0
Next, I installed Docker using the below lines.
sudo apt update sudo apt install git apt-transport-https ca-certificates wget software-properties-common gnupg2 curl python-apt sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" sudo apt update sudo apt install docker-ce sudo gpasswd -a local docker sudo systemctl start docker sudo systemctl enable docker sudo systemctl start containerd sudo systemctl enable containerd sudo wget https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64 -o /usr/bin/local/docker-compose sha256sum /usr/bin/docker-compose # check for 04216d65ce0cd3c27223eab035abfeb20a8bef20259398e3b9d9aa8de633286d sudo chmod a+rx /usr/local/bin/docker-compose
Next I followed the excellent Synapse guide for getting the basic server configured. I chose a server name population3 and the storage as SQLite. I also changed the default system version of Python to Python 3.
sudo apt install virtualenv build-essential python3-dev libffi-dev python3-pip python3-setuptools sqlite3 libssl-dev virtualenv libjpeg-dev libxslt1-dev mkdir ~/synapse virtualenv -p python3 ~/synapse/env source ~/synapse/env/bin/activate pip install --upgrade pip pip install --upgrade setuptools pip install matrix-synapse # this command shows some crazy graphs cd ~/synapse python -m synapse.app.homeserver --server-name localhost --config-path homeserver.yaml --generate-config --report-stats=no synctl start
Next, I edited the produced homeserver.yaml file to make it a bit easier to debug the initial setup.
server_name: “localhost:8008”
As I’m running this in a virtual machine, I opened the QEMU monitor and added an additional port for redirection. You can check existing port forwards in the monitor by using “info network“ and “info usernet“ and edit them by using “hostfwd_add tcp::8008-:8008“.
Next you should be able to access your instance via http://localhost:8008
Pending sections
- Isolating instance from the federation.
- Own identity server.
- Give /dev/urandom so initialisation using host random.