A long long time ago I wrote something for the company I was with to allow for pre-merge staging environments (preview environments but I didn't have a name for them then)
Used docker-compose + git for application servers, and docker-compose + sync for static sites.
Actually worked pretty well! There's bound to be better options nowadays.