You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
chore(consul-postgres-ha): drop implementation-process labels from docs + code
Removes the "Stage 1 / Stage 2 / Stage 4 / Phase 0" labels that crept
into comments, doc titles, and inline notes during development. Those
were process markers for ourselves, not vocabulary anyone reading
this example cold should care about. Substantive content (what's a
workaround, what's the principled fix, where to find the design)
preserved verbatim — only the labels are gone.
Also: coordinator/docker-compose.yaml was referencing a deleted
`../phase0/icetest` build context for the signaling service. Repointed
to the published GHCR image (`consul-postgres-ha-signaling:latest`),
matching how the rest of the example pulls its images.
Verified: mesh-conn tests pass, bootstrap-secrets/signaling/quic-on-ice
all build, terraform validate clean, shell entrypoints parse.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: consul-postgres-ha/ROBUSTNESS.md
+8-8Lines changed: 8 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -51,7 +51,7 @@ ours, they're the parts that *must* be made robust by hand.
51
51
| Coordinator host dies | New peers can't bootstrap. **Existing ICE pairs keep working** (no data flows through this box once handshake is done). New retries from existing peers fail until it's back. | bring it back; peers reconnect on their own. |
52
52
| Coordinator ufw / network change | Same as above. | restore ports 3478/udp+tcp, 5349/tcp, 7000/tcp, 49152-49999/udp. |
53
53
| TURN shared secret leaks | Anyone can use the box as an open TURN relay (cost / abuse risk). | rotate `TURN_SHARED_SECRET` in coordinator + every CVM env, redeploy. |
54
-
| Signalling broker is unauthenticated | Any external actor can publish/poll messages, spoof candidates, intercept ICE handshakes. Currently low-impact only because we're solo. | gate `/publish` + `/poll` on attestation-derived identity (Stage 4 work). |
54
+
| Signalling broker is unauthenticated | Any external actor can publish/poll messages, spoof candidates, intercept ICE handshakes. Currently low-impact only because we're solo. | gate `/publish` + `/poll` on attestation-derived identity. |
55
55
| dstack provider NAT changes type (e.g. cone → symmetric) | ICE picks TURN relay path. ~150 ms RTT instead of ~6 ms. **Functionality unchanged.**| none needed; coturn covers this fallback. |
56
56
| Underlying CVM dies | That peer's services drop out. Consul will mark it `failed` after gossip timeout, Envoy LB removes it within seconds. | redeploy; the rest of the cluster is unaffected. |
57
57
@@ -200,7 +200,7 @@ The mitigations are mostly testing discipline:
200
200
| Envoy sidecar dies | All in-flight mTLS connections through it drop. App's calls to `127.0.0.1:19000` get connection refused. | container restart. ~5 s downtime per peer. |
201
201
| Connect CA root expiry | All sidecar leaf certs go invalid; whole mesh stops. |`consul connect ca set-config` to rotate root, or default 5-year root won't bite us in this experiment. |
202
202
| Connect intention misconfigured (e.g. accidental deny) | Some traffic blocked silently. Sidecar denies are reported as `RBAC: access denied` in Envoy logs. | rotate intention; xDS picks it up in seconds (already demoed). |
203
-
|**RPC TLS not set**| RPC is plaintext on the overlay. Threat is bounded by the QUIC overlay below it (peer ⇄ peer end-to-end encrypted), so on-the-wire taps don't see it; in-CVM containers that bind `127.0.0.1` to the agent's RPC port would. |Stage-2 work: derive a small CA from attestation-rooted material and configure Consul TLS using it. |
203
+
|**RPC TLS not set**| RPC is plaintext on the overlay. Threat is bounded by the QUIC overlay below it (peer ⇄ peer end-to-end encrypted), so on-the-wire taps don't see it; in-CVM containers that bind `127.0.0.1` to the agent's RPC port would. |Derive a small CA from attestation-rooted material and configure Consul TLS using it — design lives in `design/attestation-admission.md`. |
204
204
| ttl.sh image expiry | After 24h, a CVM restart can't pull our images. New deploys silently fail to pull. | move to a real registry (GHCR, Phala internal, local registry on the public box). |
205
205
206
206
### Risk shape
@@ -232,13 +232,13 @@ depth.
232
232
-**Real registry** — Sigstore-attested GHCR images via
233
233
`.github/workflows/consul-postgres-ha-publish.yml`. See
234
234
`PUBLISHING.md`.
235
-
-**Gossip key wired in (Stage-1 workaround)** — `cluster.tf`
235
+
-**Gossip key wired in (workaround)** — `cluster.tf`
236
236
generates a `random_bytes` and broadcasts it to every CVM via
237
237
env; `mesh-sidecar/entrypoint.sh` passes it as
238
238
`consul agent -encrypt=…`. Same shape used for the Patroni
239
239
superuser + replication passwords. The keys live in
240
240
`terraform.tfstate`; eliminating that exposure is part of the
241
-
Stage-2 attestation-admission work
241
+
attestation-admission work
242
242
(`design/attestation-admission.md`).
243
243
244
244
## Cross-layer concerns
@@ -312,7 +312,7 @@ are the next plateau.
312
312
313
313
The deeper open question — **anyone with `terraform.tfstate` can
314
314
read the cluster's gossip key and Patroni passwords** — is
315
-
deliberately deferred to Stage 2 (attestationadmission), where
315
+
deliberately deferred to the attestation-admission work, where
316
316
peers prove TEE residency and shared cluster material is rooted
317
317
in attestation rather than handed in by the deployer.
318
318
@@ -328,9 +328,9 @@ in attestation rather than handed in by the deployer.
328
328
-**Real registry** — Sigstore-attested GHCR images via
0 commit comments