What this lab does
This lab reproduces, in a throwaway environment, the guide to migrating from MinIO to Garage with Docker. We start from a MinIO with the app-data bucket and 300 objects, bring up Garage v2.4.1 in the same Compose project, copy with rclone 1.75.1 and check the result with rclone check --download: 0 differences and 300 matching files.
The source MinIO uses cgr.dev/chainguard/minio, because minio/minio no longer pulls from Docker Hub. If you ran into that error, the pull access denied for minio/minio guide covers the alternatives. The Chainguard image runs as user 65532 and only publishes latest on its free tier.
How Garage is configured for the migration
The lab’s garage.toml follows the Garage quick start with two changes: the us-east-1 region, which MinIO clients already use, and the data under /var/lib/garage. The secrets are generated with openssl into a .env file, as in the Docker secrets management lab. The --single-node option creates the cluster layout on first start, so garage health already shows a healthy cluster.
Copy, verification and key switch
rclone copies from one S3 server to the other over the Compose network, using the provider = Other template from the Garage client documentation. Verifying with rclone check and --download compares the content of each object, not just its ETag. Finally we stop MinIO and import the application’s key into Garage with garage key import --yes: the same key reads the 300 objects from port 3900.
Garage has no versioning, object lock or bucket policies; the written guide details what you lose and when it is not a fit. If you would rather keep those features, see the MinIO to RustFS migration. And before any migration, keep a copy of the data as in the Docker volume backup lab.
FAQ
Do you need to configure the cluster layout in Garage v2.4.1?
Not with a single node. Since v2.3.0, garage server –single-node creates the layout on first start and keeps it on later starts. In the lab, garage health shows the cluster HEALTHY and all 256 partitions with quorum without running garage layout.
Why use rclone check with –download?
Because without –download rclone compares size and MD5 sum, and objects uploaded in parts have an ETag that is not the MD5 of the content. With –download it fetches both sides and compares the bytes; in the lab it ends with 0 differences and 300 matching files.
Can my applications keep using their MinIO keys on Garage?
Yes, with garage key import –yes, as long as the ID has at least 8 characters and the secret at least 16. Then grant permissions with garage bucket allow. Use it as a bridge for switchover day and rotate those keys later.
Which S3 region should I set in Garage when migrating from MinIO?
The one your clients already use. MinIO with no region configured accepts almost any, but Garage only accepts its s3_region. This lab uses us-east-1 in garage.toml and in rclone.conf so they match.