My friends are open to leaving Discord which has finally given me a reason to look into Element/Matrix. I found the install instructions and am immediately put off. Is this it? No official docker compose? 😞
Element has no gif keyboard just so you’re aware. Huge dealbreaker.
I’ve never encountered a gif keyboard that worked well so no big loss.
I mean, discord gifs work perfectly…and my friends rely HEAVILY it.
Firstly, I wish you the best of luck in your community’s journey away from Discord. This may be a good time to assess what your community needs from a new platform, since Discord targeted various use-cases that no single replacement platform can hope to replace in full. Instead, by identifying exactly what your group needs and doesn’t need, that will steer you in the right direction.
As for Element, bear in mind that their community and paid versions do not exactly target a hobbyist self-hosting clientele. Instead, Element is apparently geared more for enterprise on-premises deployment (like Slack, Atlassian JIRA, Asterisk PBX) and that’s probably why the community version is also based on Kubernetes. This doesn’t mean you can’t use it, but their assumptions about deployments are that you have an on-premises cloud.
Fortunately, there are other Matrix homeservers available, including one written in Rust that has both bare metal and Docker deployment instructions. Note that I’m not endorsing this implementation, but only know of it through this FOSDEM talk describing how they dealt with malicious actors.
As an aside, I have briefly considered Matrix before as a group communications platform, but was put off by their poor E2EE decisions, for both the main client implementation and in the protocol itself. Odd as it sounds, poor encryption is worse than no encryption, because of the false assurance it gives. If I did use Matrix, I would not enable E2EE because it doesn’t offer me many privacy guarantees, compared to say, Signal.
If you’re proficient it’s 30minutes
Something like this for server.
generate config
docker run -it --rm \ -v <your-data-path>:/data \ -e SYNAPSE_SERVER_NAME=<your-public-address-subdomain> \ -e SYNAPSE_REPORT_STATS=no \ matrixdotorg/synapse:v1.136.0 generaterun
docker run -d \ --restart=always \ --name synapse \ -e SYNAPSE_REPORT_STATS=no \ -v <your-data-path>:/data \ -p 8008:8008 matrixdotorg/synapse:v1.136.0register user
docker exec -ti synapse register_new_matrix_user http://localhost:8008/ -c /data/homeserver.yaml -u <username> -p <password> --exists-okProxy it using ex. openresty / nginx
location / { proxy_pass http://127.0.0.1:8008/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-for $remote_addr; proxy_connect_timeout 600; proxy_read_timeout 86400; }For UI if you want element on your domain, download and unpack tar.gz from.
https://github.com/element-hq/element-web/releasesPoint this location to your proxy server ex. openresty / nginx
location / { root /opt/element-v1.11.109; index index.html; }Modify
config.jsoninside/opt/element-v1.11.109to point location to<your-public-address-subdomain>By default it’s using sqlite if you want postgres or other database then modify
homeserver.yamlto use postgresIf you like compose files: https://www.composerize.com/
docker run -it --rm -v <your-data-path>:/data -e SYNAPSE_SERVER_NAME=<your-public-address-subdomain> -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:v1.136.0 generate:name: <your project name> services: synapse: stdin_open: true tty: true volumes: - <your-data-path>:/data environment: - SYNAPSE_SERVER_NAME=<your-public-address-subdomain> - SYNAPSE_REPORT_STATS=no image: matrixdotorg/synapse:v1.136.0 command: generatedocker run -d --restart=always --name synapse -e SYNAPSE_REPORT_STATS=no -v <your-data-path>:/data -p 8008:8008 matrixdotorg/synapse:v1.136.0:name: <your project name> services: synapse: restart: always container_name: synapse environment: - SYNAPSE_REPORT_STATS=no volumes: - <your-data-path>:/data ports: - 8008:8008 image: matrixdotorg/synapse:v1.136.0I don’t like compose files :)
How do you manage your containers?
I have a git repo with some directory convention and bash scripts. Ex stop is just
#!/bin/bash name=synapse docker stop $name docker rm $nameetc. depending on what actions I need to do against container I have bash script for that and if I need to perform same action against other container I just copy paste this file and change name variable. I pull this repo to my containers host and just type ./bin/synapse/stop and I stop synapse.
Hope that makes sense.
Helm is what is used for real world software deployments. It has its problems but it’s better than Docker Compose.
Out of curiosity, what makes it better?
A quick search says it’s a package manger for kubernetes. Besides plex, everything I selfhost is just for me. Would you say helm/kubernetes is worth looking into for a hobbyist who doesn’t work in the tech field?
I deal with kubernetes daily for my job and it manages to melt my brain at least a few times a week. It’s not bad… it’s actually great… it’s just… a lot. Like, a lot a lot.
For what it’s worth, I do not use it at home, because I prefer to be getting paid when my brain is melting.
Kubernetes is much more complicated and powerful than Docker, and Docker Compose is more similar to the way you work directly with Kubernetes than it is to Helm, which adds in a templating system. Basically, from a Docker perspective, Helm allows you to configure your compose file, but not just by substituting variables. Helm can make structural changes such as completely adding or removing sections based on the variables used when loading the chart. The output of Helm is YAML, sort of like a compose file.
Kubernetes has a much more complicated system for describing workloads and their resources than Docker Compose, and it is extensible. For example, if you are running on AWS you can have Kubernetes attach EBS volumes to your pods, or if you’re on bare metal you might use LVM, and it’s not limited to things that Kubernetes natively understands like storage volumes: Cert Manager is a common piece of software that is deployed into Kubernetes that takes care of issuing and renewing TLS certificates for other software in Kubernetes.
I used to run Kubernetes at home with ArgoCD, but I’ve moved on to NixOS instead. NixOS is less powerful because it doesn’t have dynamic workload scheduling, but I don’t actually need dynamic workload scheduling or all the configuration necessary to facilitate dynamic workload scheduling in my house, and Nix is much nicer to work with than Helm’s gotmpl templating. Unless you like this kind of stuff or want to get into Kubernetes, you probably want to avoid it for running a few things on one host.
12 pages of detailed documentation
Home Gamer: Is this it?
Fair criticism. I just don’t have a lot of free time. I can invest in Element but I wanted to crowd source information to see if it was worth it or if there was an easier way. It doesn’t get much easier than Docker



