For services only I depend on, I have production-only. Since I can only inflict damage on myself, and can often work around problems.
For the XMPP server my friends and family also depend on, I have a dedicated nonprod VPS. My services are driven by ansible playbooks, so I’ll tweak the playbook with whatever change I want to make works in nonprod, before running the same playbook against prod.
Whenever there’s a new Debian Stable release, I’ll rebuild the servers completely, to try and prevent “drift” between the nonprod and prod versions (not that I change things often enough for this to become a big problem). This is also the big test of my backups, which so far haven’t been needed in a “real” emergency 🤞
I host Synapse using this playbook. I can highly recommend it - the instructions are very clear and detailed and ongoing maintenance is straightforward too (just git pull and redeploy, and 5% of the time modify a deprecated variable).
As for how to delegate to a subdomain - that’s covered here. Basically - you set it up on
matrix.example.eu
and then have a “well known” file hosted atexample.eu
that tells other clients/servers where to look.