<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Operate on Strata Documentation</title><link>https://danchupin.github.io/strata/operate/</link><description>Recent content in Operate on Strata Documentation</description><generator>Hugo</generator><language>en</language><atom:link href="https://danchupin.github.io/strata/operate/index.xml" rel="self" type="application/rss+xml"/><item><title>Drain a cluster</title><link>https://danchupin.github.io/strata/operate/drain-cluster/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/drain-cluster/</guid><description>&lt;h1 id="drain-a-cluster"&gt;Drain a cluster&lt;a class="anchor" href="#drain-a-cluster"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Taking a data cluster out of rotation is a five-step workflow:
&lt;strong&gt;preview impact → drain → watch progress → wait for deregister-ready
→ remove from env&lt;/strong&gt;. Strata exposes each step through the admin API
and the operator console so you can drive the workflow from the
browser or from a shell script.&lt;/p&gt;
&lt;p&gt;This page is the day-2 runbook. The
&lt;a href="https://danchupin.github.io/strata/concepts/drain-rebalance/"&gt;Drain &amp;amp; rebalance concept&lt;/a&gt;
covers the lifecycle states; the
&lt;a href="https://danchupin.github.io/strata/best-practices/placement-rebalance/"&gt;Placement + rebalance best-practice&lt;/a&gt;
covers tuning the rebalance throughput and the cluster-state machine
in depth.&lt;/p&gt;</description></item><item><title>Monitoring</title><link>https://danchupin.github.io/strata/operate/monitoring/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/monitoring/</guid><description>&lt;h1 id="monitoring"&gt;Monitoring&lt;a class="anchor" href="#monitoring"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Strata exposes three observability surfaces and one operator console
embedded in the gateway binary:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Prometheus metrics&lt;/strong&gt; at &lt;code&gt;/metrics&lt;/code&gt; (every replica).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured slog logs&lt;/strong&gt; to stdout, JSON-shaped, correlated by
&lt;code&gt;request_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenTelemetry traces&lt;/strong&gt; exported via OTLP/HTTP, sampled tail-first
with an in-process ring buffer for failed-trace replay.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit log&lt;/strong&gt; in the metadata backend (&lt;code&gt;audit_log&lt;/code&gt; table or TiKV
prefix), one row per state-changing request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This page covers the wire-up; the
&lt;a href="https://danchupin.github.io/strata/architecture/observability/"&gt;Observability deep dive&lt;/a&gt;
covers the implementation rationale.&lt;/p&gt;</description></item><item><title>Alerts</title><link>https://danchupin.github.io/strata/operate/alerts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/alerts/</guid><description>&lt;h1 id="alerts"&gt;Alerts&lt;a class="anchor" href="#alerts"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Strata ships a curated alert rule set in &lt;code&gt;deploy/prometheus/alerts.yml&lt;/code&gt;.
The file declares &lt;strong&gt;47 rules&lt;/strong&gt; — 17 SLO recording rules, 18 single-window
alert rules, and 12 multi-window burn-rate alerts (Google SRE workbook
ch.5). This page is the operator-facing companion: what each alert means,
when it fires, and what to do.&lt;/p&gt;
&lt;p&gt;Validate the file via &lt;code&gt;make promtool-check&lt;/code&gt;. CI installs &lt;code&gt;promtool&lt;/code&gt; and
runs the target on every push; locally the target degrades to WARN when
the binary is missing (mirrors &lt;code&gt;make helm-lint&lt;/code&gt;). Lab Prometheus
auto-loads the file via the &lt;code&gt;rule_files: [alerts.yml]&lt;/code&gt; directive in
&lt;code&gt;deploy/prometheus/prometheus.yml&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>SLO / SLI</title><link>https://danchupin.github.io/strata/operate/slo/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/slo/</guid><description>&lt;h1 id="slo--sli"&gt;SLO / SLI&lt;a class="anchor" href="#slo--sli"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Strata ships three production SLOs as a starting point. Operators can
re-tune each target by editing one line in
&lt;code&gt;deploy/prometheus/alerts.yml&lt;/code&gt; — every single-window alert and
multi-burn-rate alert from
&lt;a href="https://danchupin.github.io/strata/operate/alerts/"&gt;/operate/alerts&lt;/a&gt; references the same
recording rule so the change ripples cleanly.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;SLO&lt;/th&gt;
 &lt;th style="text-align: right"&gt;Target&lt;/th&gt;
 &lt;th&gt;Window&lt;/th&gt;
 &lt;th&gt;SLI source&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Availability&lt;/td&gt;
 &lt;td style="text-align: right"&gt;99.9%&lt;/td&gt;
 &lt;td&gt;30 days&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;strata:availability:ratio_rate5m&lt;/code&gt; (recording rule)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Latency p99&lt;/td&gt;
 &lt;td style="text-align: right"&gt;GET/PUT &amp;lt; 500 ms, LIST &amp;lt; 2 s, multipart Complete &amp;lt; 1 s&lt;/td&gt;
 &lt;td&gt;30 days&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;strata:latency_get_put:p99_rate5m&lt;/code&gt; + per-op equivalents&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Durability&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0 non-OK terminal GC acks&lt;/td&gt;
 &lt;td&gt;90 days&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;strata:durability:error_rate5m&lt;/code&gt; (always-on; no inventory dep)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="availability"&gt;Availability&lt;a class="anchor" href="#availability"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;99.9% of S3 requests over a rolling 30-day window return a non-5xx
status. Admin paths (&lt;code&gt;bucket=&amp;quot;_admin&amp;quot;&lt;/code&gt;) excluded — admin error rate is
tracked separately under the per-tenant dashboard.&lt;/p&gt;</description></item><item><title>Profiling</title><link>https://danchupin.github.io/strata/operate/profiling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/profiling/</guid><description>&lt;h1 id="profiling"&gt;Profiling&lt;a class="anchor" href="#profiling"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Strata exposes the Go runtime&amp;rsquo;s standard &lt;code&gt;/debug/pprof/*&lt;/code&gt; endpoints when
&lt;code&gt;STRATA_PPROF_ENABLED=true&lt;/code&gt;. Profiles are protected by the same auth
chain that guards &lt;code&gt;/admin/v1/*&lt;/code&gt; (session cookie or SigV4). The
endpoints are &lt;strong&gt;opt-in&lt;/strong&gt; — defense-in-depth — because the heap profile
can leak the contents of in-flight buffers in error paths.&lt;/p&gt;
&lt;h2 id="quick-start"&gt;Quick start&lt;a class="anchor" href="#quick-start"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Boot Strata with pprof attached to the admin listener.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;STRATA_PPROF_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;STRATA_ADMIN_LISTEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;127.0.0.1:9001 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;STRATA_AUTH_MODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;required &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;STRATA_STATIC_CREDENTIALS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;AKADMIN:SKADMIN:admin &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; strata server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Capture a 30s CPU profile (SigV4 from go tool pprof via aws-cli sigv4 wrapper&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# OR from a pre-signed URL; for loopback dev use the admin session cookie).&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go tool pprof -seconds&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt; -http&lt;span class="o"&gt;=&lt;/span&gt;:7070 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -url &lt;span class="s1"&gt;&amp;#39;http://127.0.0.1:9001/debug/pprof/profile?seconds=30&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration"&gt;Configuration&lt;a class="anchor" href="#configuration"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Env var&lt;/th&gt;
 &lt;th&gt;TOML key&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;STRATA_PPROF_ENABLED&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pprof.enabled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Master switch. &lt;code&gt;true&lt;/code&gt; registers &lt;code&gt;/debug/pprof/*&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;STRATA_PPROF_LISTEN&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pprof.listen&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;empty&lt;/td&gt;
 &lt;td&gt;Optional dedicated listener (e.g. &lt;code&gt;127.0.0.1:9002&lt;/code&gt;). Empty → attach to &lt;code&gt;admin_listen.listen&lt;/code&gt;. One of the two MUST be set when enabled — pprof never attaches to the S3 hot path.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;STRATA_PPROF_BLOCK_RATE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pprof.block_rate&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;runtime.SetBlockProfileRate(N)&lt;/code&gt; argument. &lt;code&gt;0&lt;/code&gt; keeps block profile data empty.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;STRATA_PPROF_MUTEX_RATE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;pprof.mutex_rate&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;runtime.SetMutexProfileFraction(N)&lt;/code&gt; argument. &lt;code&gt;0&lt;/code&gt; keeps mutex profile data empty.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;STRATA_PPROF_ENABLED=true&lt;/code&gt; with neither &lt;code&gt;STRATA_PPROF_LISTEN&lt;/code&gt; nor
&lt;code&gt;STRATA_ADMIN_LISTEN&lt;/code&gt; set fails fast at boot — the gateway refuses to
silently expose profiling on the public S3 listener.&lt;/p&gt;</description></item><item><title>Per-bucket signing key rotation</title><link>https://danchupin.github.io/strata/operate/key-rotation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/key-rotation/</guid><description>&lt;h1 id="per-bucket-signing-key-rotation"&gt;Per-bucket signing key rotation&lt;a class="anchor" href="#per-bucket-signing-key-rotation"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Strata supports KMS-backed per-bucket SigV4 signing keys (US-001 /
US-002 of &lt;code&gt;ralph/auth-dx-trailer-lima&lt;/code&gt;). Each opted-in bucket carries a
32-byte DEK wrapped under a KMS CMK (AWS KMS / Vault Transit /
LocalHSMProvider) plus a creation timestamp. The auth middleware
unwraps on cache miss and uses &lt;code&gt;hex(DEK)&lt;/code&gt; as the SigV4 secret in place
of the IAM access-key secret.&lt;/p&gt;
&lt;p&gt;This page covers the day-2 rotation runbook. The
&lt;a href="https://danchupin.github.io/strata/reference/env-vars/"&gt;KMS provider reference&lt;/a&gt; lists
the per-provider env vars; the
&lt;a href="https://danchupin.github.io/strata/reference/admin-api/"&gt;admin API reference&lt;/a&gt; documents
the three rotation endpoints.&lt;/p&gt;</description></item><item><title>Scaling</title><link>https://danchupin.github.io/strata/operate/scaling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/scaling/</guid><description>&lt;h1 id="scaling"&gt;Scaling&lt;a class="anchor" href="#scaling"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Strata replicas are stateless gateways — they own no on-disk state, so
sizing is a function of three signals: peak request rate (RPS), the
working-set bytes the gateway holds in flight (RAM), and the cores the
SigV4 + crypto path consumes (CPU). The metadata + data tiers
(Cassandra / TiKV / RADOS) follow their own upstream sizing guides; this
page covers the gateway tier and points operators at the upstream
references.&lt;/p&gt;</description></item><item><title>Backup + restore</title><link>https://danchupin.github.io/strata/operate/backup-restore/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/backup-restore/</guid><description>&lt;h1 id="backup--restore"&gt;Backup + restore&lt;a class="anchor" href="#backup--restore"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Strata splits backup responsibility along the same tiers the gateway
splits state into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Metadata tier (Cassandra / TiKV):&lt;/strong&gt; the source of truth for
bucket / object / IAM rows. Backed up via the upstream tooling for
each backend.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data tier (RADOS / S3-over-S3):&lt;/strong&gt; chunk bytes. Backed up via Ceph
pool snapshots or the upstream S3 service&amp;rsquo;s native versioning /
replication.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-region replication (replicator worker):&lt;/strong&gt; ships object PUT /
DELETE events to a peer Strata cluster in near-real time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inventory worker:&lt;/strong&gt; writes manifest.json + CSV.gz pairs that
document every object in a bucket — useful as an audit ledger for
external backup tooling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This page is a backup-strategy overview. Implementation details live in
&lt;a href="https://danchupin.github.io/strata/architecture/workers/"&gt;Architecture — Workers&lt;/a&gt; (the
inventory + replicator workers) and the upstream docs for Ceph /
Cassandra / TiKV.&lt;/p&gt;</description></item><item><title>Reconcile + rebuild-index</title><link>https://danchupin.github.io/strata/operate/metadata-data-reconcile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/metadata-data-reconcile/</guid><description>&lt;h1 id="reconcile--rebuild-index"&gt;Reconcile + rebuild-index&lt;a class="anchor" href="#reconcile--rebuild-index"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Strata splits the S3-key→chunk map (&lt;strong&gt;meta&lt;/strong&gt; tier: TiKV / Cassandra)
from the chunk bytes (&lt;strong&gt;data&lt;/strong&gt; tier: RADOS / S3-over-S3). That split
is the scale advantage — but it drops the safety net RGW gets by
colocating its bucket index with the data. After you restore one tier
from a backup that is even slightly out of step with the other, the
two tiers diverge silently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Orphan chunks&lt;/strong&gt; — data has a chunk no manifest references. GC walks
meta→data, so it can never see them; they leak storage forever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dangling manifests&lt;/strong&gt; — meta has a manifest pointing at a chunk the
data tier no longer holds. The client discovers it as a &lt;code&gt;5xx&lt;/code&gt; on
&lt;code&gt;GET&lt;/code&gt;, not on the restore.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lost meta backup&lt;/strong&gt; — the bytes are intact in RADOS but unreadable,
because the key→chunk map is gone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This page is the post-restore runbook for realigning the two tiers.
It pairs with &lt;a href="https://danchupin.github.io/strata/operate/backup-restore/"&gt;Backup + restore&lt;/a&gt;
(how each tier is snapshotted) — run reconcile &lt;strong&gt;after&lt;/strong&gt; the restore
drill, before you promote traffic.&lt;/p&gt;</description></item><item><title>Capacity planning</title><link>https://danchupin.github.io/strata/operate/capacity-planning/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/capacity-planning/</guid><description>&lt;h1 id="capacity-planning"&gt;Capacity planning&lt;a class="anchor" href="#capacity-planning"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Capacity on a Strata deploy splits across three independently-scaled
tiers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gateway tier:&lt;/strong&gt; stateless replicas. Capacity = peak RPS / SigV4 +
routing budget per replica. Scale horizontally; see
&lt;a href="https://danchupin.github.io/strata/operate/scaling/"&gt;Scaling&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metadata tier:&lt;/strong&gt; Cassandra / TiKV. Capacity = total object-row
count × per-row overhead, plus the compare-and-set or pessimistic-txn
rate during writes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data tier:&lt;/strong&gt; RADOS / S3-over-S3. Capacity = total object bytes ×
pool replication factor, plus chunk fan-out overhead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This page covers the math; pair with
&lt;a href="https://danchupin.github.io/strata/operate/backup-restore/"&gt;Backup + restore&lt;/a&gt; for the
backup overhead and
&lt;a href="https://danchupin.github.io/strata/best-practices/gc-lifecycle-tuning/"&gt;GC + lifecycle tuning&lt;/a&gt;
for the drain rate.&lt;/p&gt;</description></item><item><title>TLS termination + backend mTLS</title><link>https://danchupin.github.io/strata/operate/tls-termination/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/tls-termination/</guid><description>&lt;h1 id="tls-termination--backend-mtls"&gt;TLS termination + backend mTLS&lt;a class="anchor" href="#tls-termination--backend-mtls"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This is the operator playbook for putting Strata on the wire securely.
The gateway can terminate TLS itself (recommended for prod) or sit behind
a load balancer that handles termination upstream. Backend connections
(Cassandra, TiKV, S3-upstream) each take an opt-in mutual-TLS bundle so a
network intruder cannot impersonate the gateway. RADOS is the one
exception: it authenticates via Ceph&amp;rsquo;s native cephx protocol and ignores
the TLS layer entirely (see &lt;a href="#rados-uses-cephx-not-tls"&gt;RADOS uses cephx&lt;/a&gt;
below).&lt;/p&gt;</description></item><item><title>Image verification</title><link>https://danchupin.github.io/strata/operate/image-verification/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/image-verification/</guid><description>&lt;h1 id="image-verification"&gt;Image verification&lt;a class="anchor" href="#image-verification"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Every Strata image published to &lt;code&gt;ghcr.io/danchupin/strata&lt;/code&gt; is signed,
attested, and inventoried by the release pipeline
(&lt;code&gt;.github/workflows/release-image.yml&lt;/code&gt;). This page is the operator
playbook for verifying that supply-chain evidence &lt;strong&gt;before&lt;/strong&gt; the image
reaches a node, plus two Kubernetes admission-control shapes that make
the check mandatory at deploy time.&lt;/p&gt;
&lt;p&gt;The pipeline produces four pieces of evidence, all anchored to the same
image digest:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Evidence&lt;/th&gt;
 &lt;th&gt;Producer&lt;/th&gt;
 &lt;th&gt;Story&lt;/th&gt;
 &lt;th&gt;Verified with&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;cosign signature (keyless OIDC)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;sigstore/cosign&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;US-008&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;cosign verify&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SLSA L3 provenance&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;slsa-github-generator&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;US-006&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;cosign verify-attestation&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SPDX 2.3 SBOM&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;anchore/sbom-action&lt;/code&gt; (syft)&lt;/td&gt;
 &lt;td&gt;US-007&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;grype&lt;/code&gt; / &lt;code&gt;trivy sbom&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;License inventory&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;go-licenses&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;US-009&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;go-licenses report&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="what-signing-buys-you"&gt;What signing buys you&lt;a class="anchor" href="#what-signing-buys-you"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Keyless signing gives you a &lt;strong&gt;non-repudiable provenance trail from source
to running image&lt;/strong&gt;: the GitHub Actions OIDC identity that built the image
is the signer, Fulcio issues a short-lived certificate bound to that
identity, and the signature lands in the Rekor public transparency log.
Because the signature covers the image &lt;strong&gt;digest&lt;/strong&gt; (not a mutable tag), a
verified image is tamper-proof — repush a different layer and the
signature no longer matches. There is &lt;strong&gt;no maintainer-held private key to
leak or rotate&lt;/strong&gt;; the trust root is GitHub&amp;rsquo;s OIDC issuer plus the public
Sigstore infrastructure. The Rekor entry is append-only and publicly
queryable, so a forensic investigation can prove exactly which workflow
run, at which commit, produced a given digest — even years later.&lt;/p&gt;</description></item><item><title>Pre-prod validation walkthrough</title><link>https://danchupin.github.io/strata/operate/pre-prod-validation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://danchupin.github.io/strata/operate/pre-prod-validation/</guid><description>&lt;h1 id="pre-prod-validation-walkthrough"&gt;Pre-prod validation walkthrough&lt;a class="anchor" href="#pre-prod-validation-walkthrough"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This is the release-owner runbook: a &lt;strong&gt;single documented pass&lt;/strong&gt; that brings
up both production labs and exercises the whole hardened object path so the
GO/NO-GO decision rests on observed behaviour, not story-by-story claims. It
is the operator-facing companion to the per-feature smokes — it composes them
into one walkthrough and records a pass/fail-per-leg readiness note.&lt;/p&gt;
&lt;p&gt;The composite is &lt;code&gt;scripts/smoke-architecture-hardening.sh&lt;/code&gt;, wired as
&lt;code&gt;make smoke-architecture-hardening&lt;/code&gt;. Each leg is independent: it WARN-skips
when its lab is down and only fails the run on a real assertion failure. Set
&lt;code&gt;REQUIRE_LAB=1&lt;/code&gt; to promote a down lab to a hard fail (use this in CI where the
labs are guaranteed up).&lt;/p&gt;</description></item></channel></rss>