Commit graph

18 commits

Author SHA1 Message Date
bb9f713ced deps: Update postgres Docker tag to v18 2026-11-12 21:48:08 +00:00
95d863d421 Merge pull request 'Configure Renovate' (#1) from renovate/configure into main
All checks were successful
Deploy storage stack / deploy (push) Successful in 20s
Reviewed-on: #1
2026-11-12 20:35:54 +00:00
a49d1ff0de deps: add renovate.json 2026-11-12 20:33:11 +00:00
25ad601754
garage-bootstrap: let asxpio write to the public bucket
All checks were successful
Deploy storage stack / deploy (push) Successful in 19s
asxpio's admin is getting a page for uploading files meant for public
use. They belong in the public bucket, which so far only the
public-upload key could write to. Grant asxpio's existing key put and
delete there instead of handing the app a second set of credentials.

Write-only is enough: the app keeps its own index of what it uploaded
and never reads the objects back.

Assisted-by: Claude:fable-5-2
2026-11-12 05:46:48 +04:00
cc3405fe34
.env.example: describe Garage, not MinIO
All checks were successful
Deploy storage stack / deploy (push) Successful in 20s
The MinIO root account is gone and the public bucket's uploader was
missing.

Assisted-by: Claude:fable-5-2
2026-11-11 04:28:34 +04:00
e9388c0b0d
Remove MinIO
All checks were successful
Deploy storage stack / deploy (push) Successful in 20s
Garage serves all three buckets and both apps, and a last comparison
found nothing in MinIO that Garage lacks. Drop the MinIO service, its
bootstrap and its root credentials from the deploy, and let compose
remove the leftover containers.

The storage_minio_data volume is left on the host. All images can be
pulled again, so the deploy goes back to failing on a pull error.

Document Garage in the README and SECRETS, including the key format and
how the existing secrets map to it, and swap the MinIO client in the
flake for awscli and rclone.

Assisted-by: Claude:fable-5-2
2026-11-11 03:55:18 +04:00
bdfc028ca1
Route s3.asxp.io to Garage
All checks were successful
Deploy storage stack / deploy (push) Successful in 20s
The data is copied and verified and both apps sign with their Garage
keys, so send s3.asxp.io to Garage's S3 API. MinIO loses its route and
stays up, unrouted, as the way back.

Garage answers no anonymous S3 request. Unsigned GET and HEAD of
/public/<key> go to its web endpoint instead, with the Host header the
endpoint picks the bucket by, so the links handed out so far keep
working. Signed requests for that bucket still reach the S3 API.

Assisted-by: Claude:fable-5-2
2026-11-11 03:44:37 +04:00
dc04ff3cce
Add Garage beside MinIO
All checks were successful
Deploy storage stack / deploy (push) Successful in 25s
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
2026-11-11 03:41:03 +04:00
5619e8e11b
deploy: do not fail when the MinIO images cannot be pulled
All checks were successful
Deploy storage stack / deploy (push) Successful in 47s
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
2026-11-11 03:24:59 +04:00
10c620e796
minio-init: add a public bucket with a put-only uploader
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
2026-11-11 03:24:59 +04:00
d009d2c3d2
postgres-init: grant the bingo monitor tables to bingo
asxpio's migration 017 adds bingo_monitor_targets, _samples and
_buckets for datacenterbingo's status page. The migration grants them
itself; list them here too so a fresh install gets the same grants.

Assisted-by: Claude:opus-5-5
2026-10-18 10:31:01 +04:00
c849e253f9
Drop the bingo photo migration from minio-init
All checks were successful
Deploy storage stack / deploy (push) Successful in 18s
All photos are in datacenterbingo-photos and both apps use it, so stop
mirroring from asxpio-invoices/bingo/ and take away the bingo user's
read access there.

Assisted-by: Claude:opus-5
2026-10-12 04:25:20 +04:00
63283b1c47
minio-init: check the bingo prefix without grep
All checks were successful
Deploy storage stack / deploy (push) Successful in 21s
The minio/mc image has no grep, so the emptiness check always failed and
the photos were never mirrored into datacenterbingo-photos.

Assisted-by: Claude:opus-5
2026-10-12 04:15:58 +04:00
61e93b64c8
Give the bingo photos their own bucket
All checks were successful
Deploy storage stack / deploy (push) Successful in 20s
The datacenter bingo photos sat under bingo/ in asxpio-invoices, next to
the invoice PDFs, guarded only by a prefix policy. Move them to a
datacenterbingo-photos bucket: asxpio's user gets read-write for the
admin's uploads, the bingo user read-only on the whole bucket.

Existing objects are mirrored over with their keys unchanged, so the
database rows stay valid. Both users keep their old access until the
apps are switched and the old prefix is removed.

Assisted-by: Claude:opus-5
2026-10-12 04:07:41 +04:00
b6bcc9f882
Provision read-only credentials for datacenterbingo
All checks were successful
Deploy storage stack / deploy (push) Successful in 19s
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
2026-10-12 03:47:57 +04:00
459ee15f00
postgres-init: enable citext extension on asxpio db
All checks were successful
Deploy storage stack / deploy (push) Successful in 14s
Needed for case-insensitive email columns in the asxpio users table.
Runs as the Postgres superuser inside the init container; idempotent.
2026-05-26 19:07:16 +03:00
f8627e65f7
Fix rsync args in deploy workflow to copy init scripts as files
All checks were successful
Deploy storage stack / deploy (push) Successful in 12s
2026-05-26 17:19:46 +03:00
479e3d5cf9
Initial commit
All checks were successful
Deploy storage stack / deploy (push) Successful in 24s
2026-05-26 17:13:14 +03:00