And we put a ton of effort into making the upgrades, even for major releases like this, be a single command that Just Works for almost everyone.
I know this because I personally respond to every single report of issues installing/upgrading Zulip and have been making changes (even if the issue is basically user error) after most of them to help ensure they don't happen again for a few years now.
That said, if you don't want to deal with doing that work, Zulip Cloud is very reasonably priced for situations where all the users are employees (compared to payroll, it's effectively free) and for other use cases, we have steep discounts (e.g. free for open source, a huge discount for education, etc.).
Adding custom keywords -- Zulip calls them linkifiers -- took a fair amount of time, but we have about 25 of them and few of them resembled each other much.
Since install day, it really hasn't required much maintenance.
I just upgraded to 2.0 and was so damn impressed with upgrade code. I run Zulip in a VM with an NFS root, and hit some random NFS bug that resulted in this error:
Found existing installation: cryptography 2.3
Successfully uninstalled cryptography-2.3
Could not install packages due to an EnvironmentError: [Errno 16] Device or resource busy: '.nfs00000000016cef5200000f9e'
`pip install` failed; retrying...
Then it succeeded, all by itself.