MinIO added to docker-compose: local S3-compatible storage, no R2 credentials needed
juanjo adds MinIO to `docker-compose.yml` so a fresh clone can run end-to-end without real Cloudflare R2 credentials. The storage client change is six lines in `backend/src/lib/storage.ts`; the rest is compose services, env defaults, and docs.
The compose file gains two services (ef16e3a). minio runs minio/minio:latest with the S3 API on port 9000 and the web console on 9001, persisted to the named volume mike_minio_data. Credentials are parameterised via ${MINIO_ROOT_USER:-minioadmin} to match the existing Postgres service convention. minio-init is a one-shot minio/mc:latest sidecar that waits on MinIO's healthcheck then runs mc mb --ignore-existing local/mike to create the bucket. It exits 0 on success - that Exited (0) status in docker compose ps is the expected success state, not an error.
The actual code change (ea0707d) adds two env vars to backend/src/lib/storage.ts's getClient():
region: process.env.R2_REGION ?? "auto",
forcePathStyle: process.env.R2_FORCE_PATH_STYLE === "true",
Both default to their existing R2-correct values, so production behaviour is unchanged when the vars are unset. For MinIO you set R2_REGION to the N. Virginia default and R2_FORCE_PATH_STYLE=true; the latter matters because <bucket>.localhost:9000 has no wildcard DNS, so path-style addressing is required.
The env example files are updated to ship MinIO defaults (720353f). frontend/src/lib/storage.ts is deleted (2a1cc6f) - it was an unused 132-line duplicate of the backend module with no importers. Its associated @aws-sdk/client-s3 and @aws-sdk/s3-request-presigner frontend dependencies are removed (aad90da), which also surfaces a next/opennextjs peer-dep conflict that's tracked in docs/deferred.md.
A follow-up cleanup commit (596ee51) removes the resend package from both packages, adds a note that LLM keys are optional for first-run exploration, and adds a --legacy-peer-deps note to the frontend install instructions.
Two known issues are documented in the ADR: minio/minio:latest and minio/mc:latest are unpinned image tags (MinIO has had breaking releases before), and the R2_* env var prefix is now technically a misnomer but renaming was deferred.
Spotted something wrong? Or know the PR text has fresher detail than the writeup above?