railiance-platform/docs/evidence/RAILIANCE-WP-0016-apps-pg-resource-evidence.md
codex 6033ae1aef
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Finish RAILIANCE-WP-0016 apps-pg resource evidence
Publish capacity, recovery, labor, and allocation-driver evidence for
resource:railiance:apps-pg so resource-control can forecast and allocate
without reading application data or inventing booked cost.
2026-08-14 02:05:25 +02:00

118 lines
5.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# apps-pg resource evidence
Work record: `RAILIANCE-WP-0016`
Resource: `resource:railiance:apps-pg`
Captured: `2026-08-14T00:04:19Z` (refresh:
`scripts/capture-apps-pg-evidence.py -o docs/evidence/RAILIANCE-WP-0016-apps-pg-observation.json`)
Machine-readable companion: `docs/evidence/RAILIANCE-WP-0016-apps-pg-observation.json`
This is the platform-owned evidence `RESOURCE-WP-0003-T04` asked for.
It does not contain credentials, DSNs, or application rows. It is not a
fin-hub ledger: no EUR amounts are invented here. resource-control can
forecast and allocate from these technical facts; booked spend stays in
fin-hub.
## T01 — Capacity and utilization
| Fact | Value | Kind | Source |
| --- | --- | --- | --- |
| Instances | 1 provisioned, 1 ready | declared + observed | Cluster `apps-pg` |
| Image | `ghcr.io/cloudnative-pg/postgresql:16` (live 16.13) | declared | Cluster spec / `version()` |
| Created | 2026-08-09T00:15:53Z | observed | Cluster metadata |
| Phase | Cluster in healthy state | observed | Cluster status |
| CPU / memory requests | unset (BestEffort) | declared | empty `spec.resources` |
| CPU / memory observed | 9m / 102Mi | observed | `kubectl top` |
| Storage provisioned | 10Gi, `local-path`, RWO | declared | PVC `apps-pg-1` |
| PGDATA used | 619083120 B (~590.4 MiB) | observed | `du -sb …/pgdata` |
| WAL since init | 587202560 B (~560 MiB) | observed | `pg_wal_lsn_diff` |
| max_connections | 100 | declared | `SHOW max_connections` |
| Sessions at capture | 7 (1 `postgres` + 6 background) | observed | `pg_stat_activity` |
Consumer catalogs, five days after commission:
| Database | Workload | Bytes | xact_commit | backends |
| --- | --- | --- | --- | --- |
| `coulomb_social_db` | coulomb-social | 8952855 | 14754 | 0 |
| `vergabe_db` | vergabe-teilnahme | 7668239 | 0 | 0 |
| `apps_meta` | platform bootstrap | 7830551 | 14374 | 0 |
| `postgres` | engine catalog | 7830551 | 146383 | 1 |
`vergabe_db` has never been used. `coulomb_social_db` is the only consumer
with writes (982 inserts). Cache hit on that database is >99.9%. There is
no I/O history older than cluster creation and no metrics retention;
saturation proxies are the snapshot above plus WAL growth.
Headroom: ~9.4 GiB of the 10Gi PVC is free. The instance has no CPU or
memory request, so it does not reserve cluster capacity. Observed use is
idle-class.
## T02 — Recovery and operations
| Check | Result |
| --- | --- |
| Cluster Ready | true since 2026-08-09T00:16:16Z |
| ContinuousArchiving | true — CNPG `wal-archive` to the instance manager, **on-node** |
| CNPG `Backup` / `ScheduledBackup` | none |
| Option A logical dump | **not a target**. Default list covers CoulombCore `apps-pg` and railiance01 `forgejo-db` / `net-kingdom-pg` / `state-hub-db` / `user-engine-pg` only |
| Restore drill for this cluster | none recorded |
| Replica / pooler | not configured (single instance) |
| Failure domain | `railiance01` + `local-path`. Host loss is data loss |
Recovery objectives: **RPO unbounded, RTO undefined**. This is unresolved
local-storage risk, not verified recovery. `docs/apps-pg.md` already said
backup was follow-up work; this observation confirms it has not landed for
the railiance01 cluster.
Maintenance: image tag `postgresql:16` is a major pin, not a patch pin.
The live minor is 16.13. No upgrade or incident record exists for this
cluster. Cadence is unscheduled.
Labor (high uncertainty, not a timesheet):
| Class | Estimate | Basis |
| --- | --- | --- |
| Setup | 6 operator-hours | RAILIANCE-WP-0003 cluster + two consumer onboardings + docs, 2026-08-09 |
| Recurring | 0.5 operator-hours / month | ad-hoc `make apps-pg-status`; no backup, restore, or upgrade job |
| Incidents | 0 recorded | none in workplans or Cluster conditions |
resource-control may convert hours at its own labor rate. Do not treat
these hours as booked cost.
## T03 — Allocation drivers
`apps-pg` is a shared platform service. The recommended first method is
the one resource-control already sketched, with the residual made
explicit.
**Method `apps-pg-dbbytes-v1`**
- Driver: `database_gb` = `pg_database_size` of each **declared consumer**
database.
- Denominator: sum of those consumer sizes (16621094 B at capture).
- Shares at capture: coulomb-social **0.5386**, vergabe-teilnahme **0.4614**.
- Residual: PGDATA minus all non-template databases = 586800924 B
(**94.8%** of used volume). Attribute to
`platform:apps-pg-overhead`. This is WAL plus engine catalogs, not
missing consumer data.
- Uncertainty: **high**. Five days of life, empty `vergabe_db`, no history.
Candidates considered and not selected as v1:
| Driver | Why not first |
| --- | --- |
| Connections | All consumers idle at capture; peak is our own `psql` |
| `xact_commit` / tuples | Would assign ~100% to coulomb-social and 0% to a reserved empty database |
| Equal instance share | Fair while data is tiny, but it hides growth; keep as fallback `apps-pg-instance-v1` if residual stays above 50% after the first month |
Shared overhead stays unattributed to a consumer on purpose. Converting
the residual into booked EUR is fin-hub / resource-control work. Adding a
third consumer is a new row in `consumers` plus a Database CR; the method
does not change.
## What this is not
- Not a cost figure. The host bill belongs to `resource:hosteurope:railiance01`.
- Not a backup program. Covering railiance01 `apps-pg` is a later platform
change, gated on the same object-store decision as `platform-pg`.
- Not application telemetry. No table counts, no tenant identifiers, no
Secret values.