The simplest solution is to simply serve your Ractive app from on any non-service uri. Then whatever handles client-side routing can, I usually use page.js, can pick it up from there. Google can index such SPA-ish sites just fine, and there are hooks for doing analytics and whatnot if you need them from your routing library. Bing doesn't seem to like SPAs yet, and you can't do stuff like AMP with this approach.
If you need correct server-side responses, you can run your SPA on the server and use Ractive's toHTML function to serve the matching HTML injected into your wrapper template. If you're using edge, you can use the enhance flag to tell Ractive to try to use existing DOM that was served with the initial request and (mostly) avoid flashes.
FWIW, I typically go with the SPA approach, where the server only handles serving the app files and fielding service requests.