Service templates¶
What this is¶
A service template is a versioned recipe for a Docker stack: compose files, variables (including secrets and volumes), operator checklist, and deploy rules. Templates live under top-nav Catalog → tab Templates (/templates), sharing Catalog chrome with Integrations, Certificates, and Network.
You create and edit templates separately from deploying them to a host.
Why it exists¶
Copy-pasting docker-compose.yml across Pis drifts immediately. Templates give you:
- One definition for NPM, Kuma, Pi-hole, Grafana (and your own stacks)
- Parameterised ports, passwords, and volume modes
- Encrypted secret storage in PiHerder + locked-down host
.env - Desired state, redeploy, and drift detection after deploy
- Desired files browser, always-write
.env, and Accept host as desired for intentional host-only edits
End-to-end: from zero to a running stack¶
- Ensure a host has Docker enabled and working (Add a server · Docker).
- Open Catalog → Templates and pick an OOTB pack (or create / from-host).
- Deploy through variables → host → preview → wait modal.
- Complete the post-deploy checklist (DNS, first login).
- Optional: connect the matching integration.
- Later: open the deployment page for redeploy, drift, Accept host as desired, import host
.env, or the host file editor.
Full journey: Operator scenarios — Journey D.
OOTB pack¶
| Slug | Service | Typical why |
|---|---|---|
npm | Nginx Proxy Manager | TLS / reverse proxy edge |
uptime-kuma | Uptime Kuma | Monitor fleet URLs and SSH |
pihole | Pi-hole | LAN DNS + blocking |
grafana | Grafana | Metrics dashboards |
Defaults use named volumes; deploy can switch to project folder or host path.
Operator ownership¶
The catalog groups templates when both kinds are present and shows a short badge on each card and detail page:
| Badge | Internal source | Behaviour |
|---|---|---|
| OOTB | builtin (also starter) | Seeded from disk service_templates/; refreshed if still builtin and checksum changes |
| Yours | user (after Save / from-host) | Never auto-overwritten by disk |
| Imported | zip import path | Editable as operator-owned |
| Git | git catalog (when used) | Operator-owned sync |
Editing an OOTB template and saving marks it Yours so release refresh will not clobber your changes.
Variable types¶
| Type | Deploy UI | Notes |
|---|---|---|
| string / port / int / url / email | Normal fields | Ports 1–65535 |
| password | Secret field | Optional auto-generate |
| boolean | Yes / No | true_value / false_value |
| volume | Storage mode + name/path | named · ./ project · absolute host path |
Volume and boolean vars are never secrets (no step-up 2FA).
Host-specific strings from from host often appear as plain string / url vars, for example:
| Variable | Typical use |
|---|---|
NODE_NAME | Short host label in logs/metrics (e.g. promtail host:) |
HOST_FQDN | Full hostname when different from the short label |
LOKI_URL (or similar) | Remote service URL found in sidecar configs |
Additional files¶
Templates are not limited to docker-compose.yml + .env. The editor Additional files section stores sidecars (e.g. promtail-config.yaml) that deploy writes next to compose. From-host imports them when compose bind-mounts ./that-file:…. Placeholders like {{NODE_NAME}} work in those files the same as in compose.
Next¶
- Deploy a template
- From host — capture running stacks + configs
- Secrets model
- Developer schema