resource-control/docs/evidence/RESOURCE-WP-0002-primary-selection-2026-08-14.md
tegwick 644d5391bd retarget: T04 backup key is resource-control, not Barman
Handle becomes secret:railiance-platform/backup. IAM application is
resource-control; policy and API key are Scoped backup access.
2026-08-14 19:19:56 +02:00

91 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RESOURCE-WP-0002 T03 — primary object-store selection
Date: 2026-08-14
Status: **approved and purchased — cost alert still human**
Resource: `resource:platform:audit-storage`
Procuring / consuming entity: `entity:railiance` (self-use, no 20 % markup)
Operating reef: `reef-storage` (not `reef-railiance`)
Human financial authority approved the purchase in session 2026-08-14
(“lets do it”, then “key into OpenBao first”). Bootstrap key is in OpenBao
(`platform/workloads/railiance/scaleway/bootstrap`, KV v2). After the
Object Storage policy attached, list/get succeeded. Private bucket
`railiance-platform-pg-backup` exists in `nl-ams` (created
2026-08-14T16:21:56Z), versioning on, 30-day lifecycle applied, ACL
owner-only. Live attributes are in
`reef-storage/substrate/object-stores/platform-audit-storage.yaml`.
Founder set a Scaleway billing alert (email). Scaleway has no euro
hard-stop that refuses usage; that gap is accepted. Scoped backup key
is T04.
## Recommendation
| Role | Choice | Why |
| --- | --- | --- |
| **Primary** | Scaleway Object Storage, Standard Multi-AZ, region `nl-ams` (NL, EU) | Only A/B/C candidate that is orderable, S3/SigV4 documented, Multi-AZ, published durability, **managed encryption at rest**, and an independent failure domain from Host Europe `railiance01`. Lowest comparable 320 GB running cost among managed options that meet acceptance. |
| **Independent secondary copy** | Host Europe Backup Storage (SFTP/SCP) or the existing governed Nextcloud lane (T06) | Not S3; not a Barman primary. Keeps a second copy off Scaleway and off the same API credential. |
Do **not** put the primary bucket on `reef-railiance`. S3 is a
provider-delegated capability; `reef-storage` is the substrate.
## Ranking (A / B / C)
Evidence: demand/cost model 2026-08-10, expanded comparison 2026-08-10,
due diligence 2026-08-10. Labor €60/h. Tax excluded. Running totals at
the normalized 320 GB + 5 GB restore-drill point.
| Criterion | A Host Europe Cloud Storage | B Scaleway Multi-AZ `nl-ams` | C Hetzner Object Storage |
| --- | --- | --- | --- |
| Total cost (320 GB) | unknown (no current S3 quote) | **€65.14**/mo (€5.14 infra + €60 labor) | €96.49/mo (€6.49 min + €90 labor) |
| Compatibility (CNPG/Barman S3) | unknown / not orderable on evidence | documented S3 + SigV4; live preflight still required | documented S3; live preflight still required |
| Resilience | same provider as compute | **different provider**; Multi-AZ; 99.999999999% durability claim | different provider; no quantified storage SLA |
| Sovereignty | DE if it existed | NL / EU | DE / EU |
| Operational effort | unknown | 1 h/mo planned; no rail to run | 1.5 h/mo; SSE-C custody if we accept no default at-rest encryption |
| Exit cost | unknown | egress €0.01/GB after 75 GB free + 4 h labor | inside 1 TB included until quota exceeded |
| Blocking gap | current S3 **not confirmed orderable** | live Barman preflight; contract/tax on the paying account | **no default at-rest encryption** (SSE-C only) |
Self-managed Garage on 23 VMs is €240€336/mo at 320 GB and fails closed
before month-12 base volume. It is not a primary candidate at this
workload.
## What we are buying (if approved)
- Product: Scaleway Standard Multi-AZ Object Storage
- Region: `nl-ams`
- Commitment: **none** (usage-based)
- Payer: Railiance (`entity:railiance`); transfer price = delivered cost
- Public access: disabled
- Identity: narrowest key, bucket/prefix only
- Versioning: on
- Lifecycle: 30-day recovery window (match demand)
- Cost alert: on the Scaleway project
- Owner in inventory: `resource-control`
- Attribute home: `reef-storage/substrate/object-stores/platform-audit-storage.yaml`
- Credential home (after T04): `secret:railiance-platform/backup`
- Consumer potential: `rapp-postgres`
- Consumer actual: none until WAL flows
## What human financial authority must approve
1. Create or reuse a Scaleway project paid as Railiance (or GmbH Hauptkonto
until the Railiance account exists).
2. Accept Scaleways contract/tax treatment for that account.
3. Accept that Host Europe S3 stays out of the race until written
orderability exists.
4. Accept Hetzner only as a price comparator unless SSE-C custody is
explicitly chosen later.
5. Spend: expected **~€3€10/mo infrastructure** at current size, plus
~1 h operator labor; not a committed term.
After **yes**: create private bucket, scoped key, versioning/lifecycle,
cost alert; fill `reef-storage` attributes (endpoint, bucket, prefix,
project ref); flip inventory `proposed → ordered`; then T04/T05.
After **no**: write the rejection on this record; do not invent another
primary without a new decision.
## Authority
Recommended by: resource-control (this file)
Approved by: human financial authority (Bernd Worsch, chat 2026-08-14)
Approved on: 2026-08-14