I've been self-hosting a federated Matrix homeserver since 2018. It's small (about 20 active users), but it was enough like Discord and Slack that the less technically-inclined in the group have had little trouble adjusting to it. The main friction points have been the UI changes in Riot/Element over time ("where do I put the homeserver URL thingy again?"), and the fact that my friends seem to constantly forget their passwords and (this is really a separate issue from Synapse itself) setting up an account for transactional emails is a pain in the ass.

Amusingly, two of my co-workers from a previous job also run their own homeservers, one a smaller private instance similar to mine and the other a single-user node that bridges many different chat systems together for personal use. The two of them also interact with the users on my homeserver on a regular basis in various public and private channels.

I should note that only one of the active users in the channels on my server is from matrix.org - everyone else is from the same server or federated instances run by other people. Matrix.org could go down tomorrow and things for us would mostly keep running just fine.

I do wish Synapse had a proper account invite system for private servers, and not the "spin up a matrix.org account and chuck the hapless fool in the hopefully-federated room" method that was there the last time I tried.

How do you deal with the complexity of hosting Matrix?

I was in the same position, wanted to set one up - decided it was too much work.

There's not much complexity really. This handbook takes care of most stuff for you:

https://github.com/spantaleev/matrix-docker-ansible-deploy/

Been hosting it alongside some bridges(like irc) for a while now.