On Linux, we are using ndm github.com/npm/ndm
Timestamps are taken from the local file and not from existing folders. Allows rollback, fast version switching, etc.
It's also possible with PM2 too, but PM2 has its own dependencies on a specific Node version. That's why we skip PM2 and use NDM.
It's still not zero-down-time like it's done on Erlang/Elixir, but it's quite close too.
Another alternative I've started yesterday is by using Nginx & nginScript. With the current approach, it's still possible to lose some requests (chances are quite low because stopping the process, starting a new one is done in less than ~20ms). Erlang routes requests from one PID to another, losing 0 requests - always. This is what I am trying to achieve now with Nginx & nginScript. Route requests based the on the content of the timestamp file. Currently, I'm clashing with base router rules config and nginScript code. But when I've tamed the beast, then we shouldn't lose any request.