# Multi-stage: build the static bundle with Node, serve it with Caddy. # vu has no server-side logic — this container exists for operational # consistency with the rest of the hub (docker-compose + Ansible role + # systemd, same as eec/drip/bookshop), not because a live process is needed. FROM node:20-alpine AS build WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build FROM caddy:alpine COPY --from=build /app/dist /srv COPY Caddyfile /etc/caddy/Caddyfile