MinIO is abandoned upstream and its images are gone from the registries,
so the object store cannot be rebuilt or updated. Garage takes its
place.
This is the first step: Garage runs as one node next to MinIO, with the
same three buckets and one key per app, and is not routed yet. MinIO
keeps serving s3.asxp.io and is no longer bootstrapped, so its users
stay as they are until the data is copied and the apps are switched.
Garage only accepts keys in its own format. The bootstrap hashes the
existing secrets into that format, as the apps' deploys will, so no
secret has to change for the move; a secret already in Garage's format
is used as it is.
Garage has no anonymous S3 access. The public bucket is marked as a
website instead, to be served through Garage's web endpoint.
Assisted-by: Claude:fable-5-2
minio/minio and minio/mc no longer exist on Docker Hub or Quay, so
docker compose pull fails and, with script_stop, ends every deploy
before anything is applied.
Ignore pull failures. Postgres is still updated; MinIO and its init
container run from the copies cached on the host.
Assisted-by: Claude:fable-5-2
There was no way to share a file by link: both buckets are private and
the bootstrap forces anonymous access off on every run.
Add a bucket named public whose objects anyone can GET by key, with no
anonymous listing or writes, and an optional user that may only put and
delete there, so a leaked uploader key reads nothing and reaches no
other bucket.
Assisted-by: Claude:fable-5-2
The public bingo site is moving out of the asxpio container and only
needs to read the bingo tables and the bingo/ photos. Give it a role
limited to SELECT on those two tables (with read-only transactions by
default) and a MinIO user limited to GetObject under
asxpio-invoices/bingo/, instead of reusing asxpio's read-write
credentials.
Both steps are skipped while the BINGO_* secrets are unset, so this
deploys safely before they exist. Tables missing on a fresh install
are granted on the next deploy.
Assisted-by: Claude:opus-5