Multi-stage build (node build -> nginx:alpine serve), docker-compose
with a configurable HOST_PORT (default 47174, an unusual port left
free for nginx proxy manager to front later), and a Gitea Actions
workflow that builds/pushes the image on push to main.
Verified: image builds, container serves the app and all art assets
on port 47174.