That doesn’t look like a valid Caddyfile, there are server blocks with no labels.
I’m also not seeing a root, so for requests other than the proxy base paths, Caddy will just try to serve files out of the directory it was run from. If there’s no index files there, it will give you HTTP 404 errors.
Firstly, you’re proxying from /plex under example.com/plex, and you have no root in this definition block. That means to be routed to the upstream you need to request example.com/plex/plex, which I doubt is intended behaviour. A request for example.com/plex will be 404’d.
You could just throw all these proxies in the same definition block, no need for labels with subfolders.
Secondly, Plex isn’t going to play nicely under /plex. It wants /web and a whole lot of other folders too. My strong suggestion is to give it the site root of a subdomain instead. You might have some luck getting it working, but it will be a complicated setup.
I’m not sure. What you’ve got there looks good, generally speaking. Can you curl -i xxx.xxx.x.100:5000 successfully from the Caddy host? What output do you get curl dsm.example.com?