T06: optimization-case schema, fail-closed evaluator, cadence and decision template. Every option including the baseline must present all ten decision fields; one unknown blocks the comparison. Validated on the storage case (Hetzner computes and loses to Scaleway by EUR 29.14/month on operator labour; Host Europe blocks on four named gaps) and on the non-storage reef-railiance k3s rightsizing case (low utilization is real, but nothing is costable while the railiance01 price is unknown). T07: portfolio report over coverage, lifecycle, utilization, cost, renewals, risks, open cases, and next actions, derived only from committed evidence. Portfolio spend is reported null rather than as a partial sum, unattributed cost is a named list rather than a spread, and unmeasurable resources are reported rather than dropped. RESOURCE-WP-0003 is finished; both cases remain blocked_on_evidence against live delegated records in other repositories. RESOURCE-WP-0002 is untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
54 lines
2.7 KiB
Markdown
54 lines
2.7 KiB
Markdown
# PostgreSQL backup demand and cost model — 2026-08-10
|
||
|
||
## Observed baseline
|
||
|
||
A read-only query against `platform-pg-1` at `2026-08-10T15:54:12Z` measured
|
||
39,573,871 bytes across connectable databases. `pg_stat_wal` reported
|
||
19,744,568 bytes since `2026-08-10T13:37:53Z`, an extrapolated 0.208 GB/day.
|
||
The cluster is less than one day old, so this is a seed observation rather than
|
||
a representative trend. No credential value was read or recorded.
|
||
|
||
The governed requirements are a 30-day recovery window, daily physical base
|
||
backup, continuous WAL archive, one monthly restore drill, and a complete exit
|
||
calculation. The scenario inputs live in
|
||
`data/demand/platform-audit-storage.json` and deliberately floor demand above
|
||
the tiny initial observation:
|
||
|
||
| Scenario | Initial DB | Monthly growth | WAL/day | Restore egress | Labor/month |
|
||
| --- | ---: | ---: | ---: | ---: | ---: |
|
||
| low | 1 GB | 5% | 0.25 GB | 1 GB | 0.5 h |
|
||
| base | 5 GB | 10% | 1 GB | 5 GB | 1 h |
|
||
| high | 20 GB | 20% | 5 GB | 20 GB | 2 h |
|
||
|
||
The conservative stored-byte formula is `30 × current database size + 30 ×
|
||
daily WAL`. It does not claim compression savings. Operator labor is valued at
|
||
€60/hour; provider-specific labor floors capture relative operational effort.
|
||
The exit event adds full stored-byte egress plus four operator hours.
|
||
|
||
Run `make forecast` for all 12 months, scenarios, and providers. A `null` total
|
||
is intentional: it means a required price is unknown and prevents an unknown
|
||
from silently becoming free.
|
||
|
||
The catalog also includes self-managed Garage on 1–3 Host Europe/Hetzner VMs
|
||
and managed AWS, Azure, Google Cloud, and STACKIT price points. See
|
||
`RESOURCE-WP-0002-expanded-storage-comparison-2026-08-10.md` for assumptions
|
||
and topology warnings.
|
||
|
||
Calculator rows split `monthly_infrastructure_eur` from
|
||
`monthly_internal_labor_eur` and split internal setup labor from external setup
|
||
services. The top-level `comparison_320gb` array provides a normalized running
|
||
cost at 320 GB using the base request and restore pattern.
|
||
|
||
## Initial comparison
|
||
|
||
- Scaleway Standard Multi-AZ is fully calculable at €0.01606/GB-month, with
|
||
75 GB/month free egress then €0.01/GB. Prices exclude tax.
|
||
- Hetzner is calculable while usage remains inside its €6.49 monthly minimum,
|
||
which includes 1 TB storage and 1 TB egress. Excess unit prices still need to
|
||
be captured before high-growth or exit usage crosses the included quota.
|
||
- Host Europe cannot be calculated until it confirms that the historical S3
|
||
Cloud Storage product is currently orderable and supplies a current quote.
|
||
|
||
Because labor dominates this very small workload, selection should emphasize
|
||
restore compatibility, independent failure domain, encryption, and exit proof
|
||
before sub-euro storage differences.
|