The ln -sf /data/reports /app/reports was creating the symlink INSIDE
/app/reports/ (since that dir already existed from COPY) instead of
replacing it. Result: sitespeed.io wrote to /app/reports/<id> and the
parser looked there too, but the volume was at /data/reports.
Fix: set REPORTS_DIR=/data/reports in Docker ENV and use it in both
runner.js (outputFolder) and app.js (static serving). No symlink needed.
Also add .dockerignore to exclude reports/, node_modules/, .git/.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sitespeed.io is not on PATH in the container -- the base image uses a
full absolute path for its ENTRYPOINT. We now run 'find' during the
Docker build, write the path to /sitespeed_env, and source it in
start.sh so SITESPEED_BIN is set before node app.js starts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The path /usr/local/lib/node_modules/... does not exist in the image.
runner.js already falls back to `which sitespeed.io` automatically.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Without Xvfb running, Chrome exits immediately with code 1.
The base sitespeedio image normally handles this via its own
entrypoint script; we now replicate that with start.sh.
Also drop --headless (breaks visual metrics) and add --disable-gpu
for stable Chrome rendering inside Docker.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Base image sitespeedio/sitespeed.io sets ENTRYPOINT=["sitespeed.io"],
causing our CMD ["node","app.js"] to be passed as args to sitespeed.io
which treated "node" as a URL to test.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sitespeed.io web UI with Express/Pug/SQLite — port 3132.
Includes job queue, SSE live log, full metrics dashboard,
site history, CO2/axe/CWV sections, and Docker support.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>