docker: stabilize web-builder paths and bump builder Go to 1.26
Two related Dockerfile correctness fixes uncovered while validating the
review pass:
1. The web-builder stage used WORKDIR /web with vite's relative
outDir ../internal/server/web/dist resolving to /internal/server/web/dist
at the container root — working only by relative-path coincidence.
Mirror the host repo layout inside /src so the path is /src/internal/server/web/dist
in both stages, making the COPY --from explicit and stable against any
future WORKDIR or outDir change.
2. golang:1.25-alpine no longer compiles the codebase: the auxilia/culpa
dep uses errors.AsType which is in 1.26+. Bump the builder image to
golang:1.26-alpine and the go.mod directive from 1.25.0 to 1.26.0
so they agree on the actual minimum.
Verified: docker build (full multi-stage) green; produced binary runs.
server: embed web SPA at /, wire build pipeline
- Add internal/server/web/embed.go with //go:embed all:dist and a
SPA fallback shim: file-not-found → serve index.html at 200.
- Commit dist/.gitkeep and dist/index.html (placeholder) so go build
works on a fresh clone; real build output stays gitignored.
- Mount web.Handler() as GET /* catch-all in server.go after /api/v1
so API routes and probe endpoints shadow the wildcard.
- Add three server tests: ServesSPAAtRoot, SPAFallbackForNonAPIPath,
APIPathsBypassSPA; update NotFoundReturnsProblemJSON for SPA era.
- Extend Justfile with web-{install,dev,build,test,lint,clean} targets;
build now depends on web-build.
- Add node:20-alpine web-builder stage to Dockerfile; COPY dist into
the Go builder stage before compiling.