Skip to content

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/v1alpha
kind: Site
metadata:
name: hello
targets:
- server: demo-01
source:
type: git
repo: https://github.com/podmaker/hello-static.git
runtime:
type: static

Node 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/v1alpha
kind: Site
metadata:
name: acme-web
workspace: acme
tags: [production, web, eu]
targets:
- server: prod-eu-web-01
source:
type: git
repo: git@github.com:acme/web.git
branch: main
runtime:
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: /healthz
domains:
- 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: 5
firewall:
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/v1alpha
kind: Site
metadata:
name: api
workspace: acme
targets:
- server_selector:
tags: [web, eu]
min: 2
source:
type: image
image: registry.podmaker.sh/acme/api:v1.4.2
runtime:
type: container
start:
port: 8080
healthcheck: /healthz
domains:
- hostname: api.acme.com
ssl: { challenge: http-01 }
env:
LOG_LEVEL: info
DATABASE_URL: { from_vault: secret/acme/api#db_url }
deploy:
strategy: recreate

Multi-component stack

Two components plus shared Postgres and Redis.

apiVersion: podmaker.sh/v1alpha
kind: Stack
metadata:
name: acme-platform
stack:
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" }