Deploy YAML — examples
Copy-paste starting points. Validate any of them with pdctl validate <file>.
Minimal static site
The smallest valid manifest — one static site on one existing server, no DNS, SSL or env.
apiVersion: podmaker.sh/v1alphakind: Sitemetadata: name: hellotargets: - server: demo-01source: type: git repo: https://github.com/podmaker/hello-static.gitruntime: type: staticNode fullstack with vault + blue-green
Custom domain via Cloudflare, Let’s Encrypt, DB URL and session secret pulled from vault, a pre-deploy migration hook, and firewall ports opened.
apiVersion: podmaker.sh/v1alphakind: Sitemetadata: name: acme-web workspace: acme tags: [production, web, eu]targets: - server: prod-eu-web-01source: type: git repo: git@github.com:acme/web.git branch: mainruntime: type: node version: "20" package_manager: pnpm build: command: pnpm install --frozen-lockfile && pnpm build output_dir: dist hosted: true start: command: node server.js port: 3000 healthcheck: /healthzdomains: - hostname: acme.com dns: { provider: cloudflare, proxy: true } ssl: { provider: letsencrypt, challenge: http-01 }env: NODE_ENV: production DATABASE_URL: { from_vault: secret/acme/webdb#url } SESSION_SECRET: { from_vault: secret/acme/web#session }deploy: strategy: blue-green rollback_on_failure: true hooks: pre_deploy: ["./scripts/migrate.sh"] health: timeout: 90s retries: 5firewall: inbound: - { port: 80, source: "0.0.0.0/0" } - { port: 443, source: "0.0.0.0/0" }Prebuilt container image
Image built elsewhere, deployed to every server tagged web + eu, recreate
strategy, no build step on podmaker.
apiVersion: podmaker.sh/v1alphakind: Sitemetadata: name: api workspace: acmetargets: - server_selector: tags: [web, eu] min: 2source: type: image image: registry.podmaker.sh/acme/api:v1.4.2runtime: type: container start: port: 8080 healthcheck: /healthzdomains: - hostname: api.acme.com ssl: { challenge: http-01 }env: LOG_LEVEL: info DATABASE_URL: { from_vault: secret/acme/api#db_url }deploy: strategy: recreateMulti-component stack
Two components plus shared Postgres and Redis.
apiVersion: podmaker.sh/v1alphakind: Stackmetadata: name: acme-platformstack: components: - name: web source: { type: git, repo: git@github.com:acme/web.git } runtime: { type: node, version: "20", start: { port: 3000 } } domains: [{ hostname: acme.com }] depends_on: [api] - name: api source: { type: image, image: registry.podmaker.sh/acme/api:v1.4.2 } runtime: { type: container, start: { port: 8080 } } env: DATABASE_URL: { from_vault: secret/acme/api#db_url } shared_services: database: { engine: postgres, version: "16", plan: small } cache: { engine: redis, version: "7" }