Skip to content

Docs pages deploy#1

Merged
postgresql007 merged 2 commits into
mainfrom
docs-pages-deploy
Jun 22, 2026
Merged

Docs pages deploy#1
postgresql007 merged 2 commits into
mainfrom
docs-pages-deploy

Conversation

@cybertec-adrian

@cybertec-adrian cybertec-adrian commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

The docs workflow built and validated the site (strict mkdocs + linkcheck) but never published it. This adds a deploy job that publishes the rendered site/ to GitHub Pages so the docs serve at the canonical domain docs.pghardstorage.org (docs/CNAME + site_url were already in place). The deploy job is gated to push-on-main, so PRs — including from forks — only build and preview, never publish.

Type

  • Bug fix
  • New feature
  • Refactor (no behaviour change)
  • Documentation
  • Test infrastructure
  • Packaging / release

Tests

  • make check passes locally (vet + race tests)
  • New tests added for the changed behaviour, or there's a clear reason none exist
  • Integration tests pass (make test-integration) where touched

Compatibility

  • No on-disk manifest schema changes (or: schema bumped + 24-month back-read preserved)
  • No CLI / API contract changes (or: documented + bumped)
  • No new external dependencies (or: justified in the description)

Checklist

  • Maintainer-attribution authoring (Author: Hans-Jürgen Schönig <hs@cybertec.at>)
  • No AI-attribution lines anywhere
  • CHANGELOG.md updated under the unreleased section
  • Comments explain WHY (not WHAT) where the code isn't self-evident

Adds a push-on-main-gated deploy job (upload-pages-artifact +
deploy-pages) so the site serves at docs.pghardstorage.org. PRs still
only build + preview. Needs Pages source = GitHub Actions in settings.
@postgresql007 postgresql007 merged commit a9c50fb into main Jun 22, 2026
28 checks passed
@cybertec-adrian cybertec-adrian deleted the docs-pages-deploy branch June 24, 2026 08:04
postgresql007 added a commit that referenced this pull request Jun 24, 2026
… container publishing (v1.0.3) (#10)

* docs: correct false managed-DBaaS support claims

The docs repeatedly claimed pg_hardstorage "works against managed PG"
(RDS, Aurora, Cloud SQL, Azure Database, Aiven, Supabase, Neon) — the
comparison page even sold it as the #1 reason to choose the tool. That
is false: the data plane is physical replication (a physical slot plus
BASE_BACKUP), and fully-managed DBaaS do not expose BASE_BACKUP /
physical replication to customers, so it cannot take a physical base
backup of them. This contradicted the README and the site's
how-it-works page, and a prospective user flagged it.

Standardise every page on the truth: pg_hardstorage targets PostgreSQL
you run yourself (bare metal, VMs, containers, Patroni, CloudNativePG).
The genuine architectural advantage is no SSH / no OS access / no
archive_command on the host — not managed-DBaaS support. Managed DBaaS
are explicitly out of scope.

Also fixes the CLI long-description source (internal/cli/wal.go) so the
generated reference page does not regress.

* docs: broad correctness sweep — counts, versions, CLI, crypto, status

Follow-on to the managed-DBaaS fix. Five parallel audits cross-checked
doc claims against the code; corrected every verifiable mismatch:

Counts/versions:
- storage backends "five"->"six" (scp was omitted); LLM providers
  "eight"->one (only the OpenAI-compatible client + a test mock are
  registered); CLI page count 202->216; KMS 4-vs-5 wording reconciled.
- PG support: faq had PG18 "first-class from v0.9" backwards (15/16/17
  are required in CI; 18 is allow-failure); release notes said the
  default sandbox is PG17 (it is PG18).

Nonexistent/renamed CLI in tutorials & ops guides:
- llm propose backup-schedule (->llm ask), restore --confirm (->--force),
  backup --no-compression (removed), doctor --json (->-o json),
  agent status (->status <deployment>), agent --step-down (planned),
  verify --sandbox-backend/--firecracker-* (yaml, not flags),
  audit export-bundle -o (->--out), `pg_hardstorage simple`
  (->pg_hardstorage_simple). Dropped the fictional restore second-prompt.

Overstated readiness:
- "wal push/fetch/list/repair are scaffold for now" — they are fully
  implemented (removed, source + generated page).
- CNPG-I marked as shipped in the comparison + a runnable tutorial —
  it is v0.5 roadmap; added roadmap markers/admonition.
- skill cosign-signing and --allow-unsigned-skill described as present —
  signing is roadmap; reworded.

Crypto/signing:
- AES-256-GCM-SIV claimed as the default/shipping cipher across ~12
  pages — the code ships plain AES-256-GCM (repo's own SPEC_DRIFT and
  release notes confirm). Reframed: GCM ships today, GCM-SIV is the
  planned default. Kept the FIPS "BoringCrypto lacks GCM-SIV" rationale.
- audit/evidence bundles and skill signatures described as cosign —
  they are Ed25519 (agent keyring); cosign is for release artefacts.
- SLSA page aligned to the real pipeline: provenance via
  slsa-github-generator (.intoto.jsonl) not `cosign attest`; container
  images + FIPS image marked not-yet-shipped (release runs --skip=docker).
- transparency-log anchoring framed as self-hosted today, external
  Rekor as roadmap.

Source: removed the stale "scaffold" line from internal/cli/wal.go
(gofmt-clean, builds).

* docs(faq): record verified per-provider basis + what is not verified

Web-checked (June 2026) each named managed provider against its own
replication documentation; all six withhold customer-reachable
BASE_BACKUP / physical replication:
- RDS, Aurora: external physical replication / pg_basebackup unsupported
- Cloud SQL, Azure Database: only logical replication/decoding to
  external consumers; physical is internal managed-HA
- Neon: custom pageserver storage, no traditional pg_basebackup
- Supabase (hosted): can publish logically, cannot be a physical replica

Added to the FAQ: the per-provider rationale, the general BASE_BACKUP
test, and an explicit "What we have not verified" admonition (list not
exhaustive, vendor behaviour changes, run `wal preflight` to confirm;
self-hosted distributions including self-hosted Supabase are supported).

* docs: normalise stale version references to the v1.0.1 release

Cross-checked all version references after a reviewer spotted v0.9.2 in
the docs. Shipped packages are already correct (goreleaser versions
every artifact from the git tag via {{ .Version }}). The stale strings
were all in the docs/examples:

- SLSA + PCI-DSS verification examples: v0.9.2 artifact/image names ->
  1.0.1 (tarball, sbom, ghcr image tags).
- getting-started install: v0.1.1 download URL / .deb / .rpm / docker
  pull / `version` output -> 1.0.1, and the tarball asset name corrected
  to the real versioned form pg_hardstorage_1.0.1_linux_amd64.tar.gz.
- `version`-output examples (build-from-source, fips-variant) and the
  ldflags example: v0.9.x / v0.9.0-dev -> v1.0.x / v1.0.0-dev.
- "ships / installed" capability statements (kms long-desc + generated
  page, source/llm-provider/tier2 plugin contracts, getting-started-
  simple prereq, control-plane example agent version): de-versioned or
  -> v1.0.

Left intentionally: v1.0 release-notes historical narrative ("since
v0.9"), schema-since lineage markers, the miekg/pkcs11@v1.1.1 dependency
pin, and example-plugin/skill versions — none are shipped-package
versions.

* docs: parameterise download/verify examples with a VERSION variable

So the install / SLSA / SBOM / cosign / docker examples never go stale
again: each command block now sets `VERSION=1.0.1` once (with a pointer
to the latest-release page) and references ${VERSION} in artifact names,
release tags, and image tags. Sample `version`-*output* lines stay
literal (a variable doesn't apply to printed output).

Also fixed an `audit export-bundle -o` -> `--out` in the PCI-DSS
evidence-bundle example (same flag bug already corrected elsewhere; -o
is the output-format selector, not a file path).

Files: tutorials/getting-started.md, compliance/slsa-l3-provenance.md,
compliance/pci-dss.md.

* release: wire GHCR container publishing + prep v1.0.3 docs

Container publishing (gated, safe-by-default):
- release.yml: add docker/setup-qemu + setup-buildx and gate the
  `--skip=docker` removal on a PUBLISH_CONTAINERS repo variable, so the
  release still ships binaries/.deb/.rpm/Homebrew when GHCR isn't yet
  enabled, and publishes signed multi-arch images once it is.
- .goreleaser.yaml: add `docker_signs` (keyless cosign image signatures).
- ci.yml: add a `goreleaser check` step so the release config is
  validated on every push (the packaging job previously only shellcheck
  + helm lint).

Docs for v1.0.3:
- SLSA page: container-images section reframed from "not yet shipped" to
  "wired, gated on GHCR enablement"; cosign image signatures documented
  as shipping once enabled, image-level SLSA provenance kept as roadmap.
- CHANGELOG: new [1.0.3] — 2026-06-24 section (doc-correctness sweep +
  container publishing).
- Example default VERSION bumped 1.0.1 -> 1.0.3; sample version outputs
  updated.

Broken in-repo path claims fixed (file-existence audit):
- pkcs11-variant.md: internal/plugin/encryption/pkcs11 -> .../kms/pkcs11
- CONTRIBUTING.md: docs/SPEC.md -> SPEC.md (repo root)
- SECURITY.md: docs/operator-guide.md -> docs/operations/operator-guide.md
- firecracker-sandbox.md: dropped the non-existent scripts/
  firecracker-rootfs.sh claim
- reference/plugins/index.md: dropped non-existent cmd/pg_hardstorage_fips

* docs: regenerate CLI page + man pages from source (docs-regen)

The wal/kms long-description edits changed the source; regenerate the
generated artefacts so the docs-regen drift gate passes (man pages for
kms/wal now reflect the source; wal.md canonical spacing restored).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants