Files
David BurkeandClaude Opus 5 2613d6273e feat(ci): replace MinIO with Garage and cover S3 for real
MinIO's open-source server and client are archived upstream: the Docker
Hub repositories no longer resolve and dl.min.io returns 410, so
test-latest fails during container setup and compose.minio.yml breaks on
a fresh pull. Garage replaces it in both CI and local development.

Garage needs a config file -- it has no configless mode, even with
--single-node -- and GitLab CI services cannot mount files while the
upstream image is `scratch` with no shell to write one. garage/Dockerfile
bakes the config in, which is the only way to run it as a CI service.
`--single-node --default-bucket` then provisions the cluster layout,
access key and bucket at startup, so nothing has to be bootstrapped.

One bucket now serves both file uploads and cold storage, which is a
layout a self-hoster may well run: the two live under disjoint prefixes
(uploads/ and cold_storage/), so they share a bucket without colliding.

Adds the integration coverage that was missing entirely. Every existing
cold-storage test patches the backend to a local FileSystemStorage, so
nothing exercised enumeration over ListObjectsV2 or DuckDB reading back
over s3://. The new tests run against whatever AWS_S3_ENDPOINT_URL points
at and skip when unset.

They caught a real bug on the first run: DuckDB was never told which
region to sign with, so it built an empty credential scope
("<date>//s3/aws4_request"). MinIO ignored it; stricter servers reject it
as AuthorizationHeaderMalformed, which would have broken cold storage
against them. get_duckdb_connection now sets s3_region from the storage
backend.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 09:56:54 -04:00
..