Sample self-hosted stacks and a scheduled job used to populate a wireops demo environment for screenshots and docs. Not meant for production use — image tags and ports are chosen for a local screenshot pass, not for real deploys.
stacks/uptime-monitor— Uptime Kuma, single service, minimalwireops.yaml.stacks/docs-site— nginx + whoami, static page injected via inlineconfigs:(no bind mounts — the worker only ever receives the rendered compose file, never the rest of the repo, so relative bind mounts to sibling repo files don't resolve on deploy).stacks/metrics-stack— Prometheus + Grafana + node-exporter, multi-service with named volumes, an inlineconfigs:scrape config, and aworker.tagsexample.stacks/gitea— Gitea + Postgres + Redis + a runner, 4 services on 2 networks with adepends_onchain (runner → gitea → db/cache) and 4 named volumes — good for showing off the dependency graph.stacks/paperless— Paperless-ngx + Postgres + Redis + Gotenberg + Tika, 5 services, 2 networks, 6 named volumes, deepest dependency chain of the set.stacks/nginx-configs-demo— nginx serving a static page. Nowireops.yamlinvolvement at all: the service annotatesdev.wireops.config.<name>: <repo-relative source>:<in-container target>directly, and wireops resolves the source straight from this repo checkout and synthesizes the composeconfigs:block into the rendered file at deploy time. Two annotations show both source shapes:nginx-confmaps a single file (files/nginx.conf), andhtmlmaps a whole directory (files/html/) — a directory source is expanded recursively, every file under it becomes its own config entry mounted under the declared target. Unlikedocs-site/metrics-stackabove (which hand-author a nativeconfigs:block with inline content directly indocker-compose.yml), this raw compose file never mentionsconfigs:at all — no bind mounts, no stub/placeholder entries, no copy-pasting config content into YAML.
jobs/nightly-backup— daily,once, tars a volume and prunes old backups.jobs/healthcheck-ping— every 15 min,once_all(fans out to every matching worker), curls each demo stack's exposed port.jobs/gitea-db-vacuum— weekly,once, runsVACUUM ANALYZEagainst the gitea stack's Postgres, targets the gitea stack's compose network directly.jobs/prune-docker— weekly,once_all, demo docker cleanup job.jobs/config-demo-report— daily,once, demonstratesjob.yaml'sconfigs:(name+path+target):files/report.shis a plain git file, resolved server-side and bind-mounted read-only into the job container at/scripts/report.sh— the worker never clones this repo, it only receives the resolved script content in the dispatch command.
All stacks and jobs target worker.tags: [local, node] — match those tags on
whichever worker you connect to this demo.
Point a wireops repository record at this repo, add a stack per stacks/*
subdirectory (or a wildcard import), and schedule each jobs/*/job.yaml.