Compose builds two images:
retrofrontier/backend:localretrofrontier/frontend:local
The frontend image builds apps/site and apps/play separately, then serves
the site at / and the play app at /play/.
/ -> apps/site/dist
/play/ -> apps/play/dist
/ws -> backend websocket
/health -> backend health through nginx
The backend image uses Deno 2.8.1 because server runtime code relies on native
Temporal. It handles SIGTERM directly so Docker stop/recreate flows shut the
server down cleanly.