Skip to content

Garage

Metadata

Field Value
Purpose S3 object storage for Loki and Mimir
Cluster / namespace cc-obs-kube / garage
Last reviewed 2026-10-24

1. Service Overview

Garage replaces the inaccessible external S3 backend with fresh buckets approved by the owner. It stores three copies on separate Jelastic worker disks.

2. Architecture Diagram

Loki (loki, loki-ruler, loki-admin) --+
                                   +--> garage:3900 --> garage-{0,1,2}
Mimir (mimir, mimir-tsdb) -----------+                   one per worker

Browser --> Traefik + Authelia --> garage-webui:3909
                                   +--> garage-admin:3903 (admin API)
                                   +--> garage:3900       (objects)

3. Deployment Specifications

garage/fleet.yaml targets cc-obs-kube with overlays/jls. Native Kubernetes resources run dxflrs/garage:v2.4.1: three StatefulSet replicas, required worker anti-affinity, six static retained local PVs, and garage-local StorageClass. Each worker supplies 50 GiB data and 1 GiB metadata, giving approximately 50 GiB usable object capacity with replication factor 3. Local directories share the worker root disk; these sizes are placement allocations, not filesystem quotas. The PDB requires two available pods. Requests are 100m CPU / 512Mi per pod; limits are 1000m / 1Gi, starting from the upstream small-deployment guidance.

The stateless administration Deployment runs khairul169/garage-webui:1.1.0 with one replica. It initially uses the same requests/limits as a Garage pod; measure browsing/upload use before tuning. It has HTTP readiness/liveness checks, a read-only root filesystem, an ephemeral upload scratch volume and no PVC. The UI NetworkPolicy allows ingress-worker IPs on port 3909 only.

4. Configuration Guide

garage/overlays/jls/garage.toml selects SQLite, consistent quorum operation, region garage, and stable peer DNS with public node IDs. RPC addresses use the existing Weave pod subnet. The RPC secret is injected through GARAGE_RPC_SECRET from garage-rpc; no admin master token is configured. CLI administration uses internal authenticated RPC. Bootstrap scripts hold generated values in memory and create application Secrets directly through kubectl stdin.

bootstrap.py webui-credentials creates a dedicated, non-expiring dynamic admin token with full scope in garage/garage-webui-admin (admin-token). The UI receives it only as API_ADMIN_KEY; its separate browser-visible webui.toml contains no credentials. Existing valid credentials are reused; a missing Secret with an existing named token requires operator recovery. No Garage master token or StatefulSet configuration change is required.

5. Access Protocols

Internal S3: http://garage.garage.svc.cluster.local:3900 for Loki and Mimir. External S3: https://s3.mutana.site for authorized S3 clients, using region garage, SigV4 and path-style requests. The garage IngressRoute uses websecure, preserves the Host header and path, and forwards to port 3900 with the existing default-security-headers middleware. Authentication uses Garage keys directly; browser SSO and basic auth would interfere with S3 clients. TLS uses Traefik's default Cloudflare Origin certificate, with DNS routed through the cluster's existing Cloudflare-proxied ingress.

NetworkPolicy allows S3 ingress from garage, loki and mimir namespaces, plus the three host-network Traefik worker IPs (172.16.8.168, 172.16.8.170, 172.16.8.174). These addresses permit node-originated S3 traffic and must be updated when ingress workers change. RPC and admin traffic remain restricted to garage. The admin API is reachable through the private garage-admin ClusterIP Service and has no direct public IngressRoute. Application keys grant read/write on their own buckets, without bucket creation or owner permissions.

Administration UI: https://garage.mutana.site, Traefik websecure with authelia@file and security headers. The existing wildcard Authelia policy requires external users to complete 2FA; its trusted-network and OPTIONS bypass rules also apply. Admitted users have full Garage administrative access via the UI's backend proxy, including application objects and key management. The browser uses the UI origin for API/object operations; only the UI backend connects to the private admin and S3 Services.

6. Operations and Observability

The readiness probe checks /health; TCP RPC probes check process liveness. bootstrap.py health must report healthy, three storage nodes up, and all 256 partitions OK. verify-s3.py verifies CRUD across peers and credential isolation. Watch worker free disk, resync queues, pod restarts, application upload failures and snapshot growth. See the runbook.

7. Backup and Recovery Notes

PVCs, PVs and namespace are retained. Worker-local data survives pod replacement on the same worker, but does not automatically move to a replacement worker. Automatic six-hour metadata snapshots stay on that disk. They are not an off-cluster backup. Preserve runtime Secrets securely using the operator's backup process; no independent backup destination was supplied for this rollout.

8. Release and Change Notes

2026-10-24: add the Authelia-protected administration UI at garage.mutana.site, private admin Service and out-of-band dynamic-token bootstrap.

2026-10-24: add Traefik HTTPS S3 access at s3.mutana.site and S3-only NetworkPolicy allowances for the host-network ingress workers.

2026-10-20: deploy Garage and switch the jls Loki/Mimir clients to fresh internal S3 buckets. Existing application PVCs and old credential generators are retained for an explicit rollback; reverting configuration does not migrate new objects.