Skip to content

Operational Architecture

pH7x Systems edited this page Jul 21, 2026 · 5 revisions

Operational Architecture

Sardine is where the site is managed; the public site is served elsewhere. Publication is a cycle, never a one-off export: edit in the panel → build → publish to the configured destination → the destination serves the public site → further changes republish to the same destination.

flowchart LR
    A[Admin panel<br/>editors, workflow, preview] --> B[(Editorial storage<br/>SQLite / PostgreSQL / MySQL / MSSQL)]
    B --> C[Deterministic build<br/>same content, same bytes]
    C --> D[Deployment target / provider<br/>host extras + transport]
    D --> E[Public hosting<br/>SWA, Nginx, S3, Pages, Netlify, …]
    E -.->|readers| F((Public site))
    A -->|republish after every change| C
Loading

The five pieces

Piece Role Notes
Admin panel Where content is created, edited, reviewed and published Never needs to serve the public site; can live on a laptop or private network
Editorial storage The working store behind the panel Four engines, one conformance-tested contract; the portable JSON/Markdown export stays the source of truth
Build Editorial state → static artifact Deterministic: same content + same clock → identical bytes; validation gates publication
Deployment target / provider Shapes and transports the artifact Targets swa, nginx, generic and providers filesystem, swa bundled; extensions add destinations (sardine-target-<name>, sardine-deploy-<name>)
Public hosting Serves the site Azure Static Web Apps, your own Nginx, S3/CloudFront, GitHub Pages, Netlify, any static host

Provider phases

All five phases ship for two reference providers behind one contract: filesystem/Nginx (immutable releases, atomic symlink activation, health check with automatic rollback) and Azure Static Web Apps (authenticated upload, deployment tracking, health verification, rollback by re-sending a kept release; the token lives only in the environment). Publish, unpublish and scheduled windows deploy automatically; every operation is audited.

Providers resolve through a registry: [deploy] provider = "<name>" selects one, the contract version and interface are validated at selection time, and the panel adapts to each provider's declared capabilities. Extensions ship further destinations (S3, GitHub Pages, Netlify, SSH…) via Extension.deploy_providers with zero core changes — a conformance suite runs the contract's rules against any provider. Authoring guide and host-specific examples: the repository's docs/DEPLOYMENT.md.

Clone this wiki locally