Platform operations
Your job is to make the developer experience boring—in the good way. Platform engineers run Pagifier, publish the golden paths, connect shared services, and hand teams small scoped credentials. Developers own their application source and project file; they should not need Kubernetes, registry, cloud, or Git-provider credentials.
The platform/developer handshake
| Platform engineers provide | Developers provide |
|---|---|
| A stable Pagifier URL and scoped API tokens | Application source and tests |
| Git connection IDs and protected-ref policy | A project config and, for Git delivery, a small control manifest |
| Runtime images, templates, and environment profiles | Explicit start command, port, health path, and app-specific settings |
| Storage, registry, DNS, secrets integration, and observability | A reviewed artifact pin when production promotion is separate |
| Security defaults, approval policy, and audit retention | Fixes for application build and readiness failures |
Bring it up in this order
- Install Pagifier with PostgreSQL, object storage, and an OCI registry.
- Connect Git, back up the credential key, and issue narrow tokens.
- Publish templates and environment profiles so teams start from a safe default.
- Lock down the storage and IAM boundaries.
- Review security and RBAC, then add canary analysis when Prometheus is ready.
Everything behavioral about applications lives in the config bucket, owned by the platform team. Publishing a document changes future deployments without an operator rebuild. Configuration resolves into an immutable Release snapshot, so a template change never silently rewrites running applications.
The config bucket is the platform's control plane. Version it, access-log it, and restrict writes to the platform team. A bad template cannot touch running apps, but it fails every subsequent upload of projects that use it.
What each document type controls
| Document | Controls | Details |
|---|---|---|
platform/defaults.yaml | Baseline port, resources, probes, caching, security profile | Schema |
runtime-images/*.yaml | Which base image apps run on and which toolchain builds them | Schema |
templates/* | The golden path per framework | Templates |
defaults/<env>.yaml | Replicas, HA, rollout policy, autoscaling, canary strategy per environment | Templates & profiles |
security/*.yaml | Response-header bundles behind security: <profile> | Security |
middleware/authentication-*.yaml | Ingress annotations enforcing oidc/jwt/oauth2-proxy | Always override project annotations |
analysis/*.yaml | Metric gates behind analysis: [name] | Canary analysis |
cdn/*.yaml | Edge annotations behind cdn = "<provider>" | Domains, DNS & CDN |
Seed content for the whole tree ships in examples/platform-config/;
make sync-platform-config CONFIG_BUCKET=... uploads it.
What runs where
The API and operator are stateless deployments configured through Helm. PostgreSQL stores history, audit, principals, tokens, Git connections, pipeline state, and deduplication records. Object storage holds immutable source archives and the platform library. Build jobs turn archives into digest-addressed OCI images.
See Architecture for the full request path and Installation for the production values, including shared BuildKit caching, concurrency limits, release retention, Prometheus, notifications, and preview domains.