Run devstack doctor first — it runs the real probe matrix (daemon, compose,
git, filesystem, trust, dns) and prints a one-line remediation for each problem.
devstack doctor --json emits the machine-readable contract.
- "docker daemon not reachable" (preflight). Start Docker / fix
DOCKER_HOSTor the activedocker context.devstack doctorconfirms the context the ledger is keyed by. - A shared service never goes healthy.
upfails fast and inlines the last log lines of the failing service plus the failing healthcheck. Slow stateful images (Postgres/MinIO) on Docker Desktop/WSL2 may need a largerstartPeriodin the service'shealthcheck:. - "dependsOn cycle: a → b → a". A
dependsOnloop is reported with the full path at generate time — break the cycle. - "condition: healthy … declares no healthcheck". A
dependsOnedge withcondition: healthyrequires the target to define ahealthcheck:. Add one or usecondition: started.
- Stale ref counts after a crash or manual
docker rm. Reconcile:devstack shared doctor(prunes refs for projects no longer live). Every command also self-heals lazily. - Corrupt or lost
state.db.devstack doctor --rebuild-statereconstructs the shared-service + ref rows from live container labels + your config. A backup is written before any migration. - WSL2 "database is locked" / flaky locking. Keep
XDG_STATE_HOMEandXDG_RUNTIME_DIRon the Linux filesystem (ext4/tmpfs), not/mnt/*(9p).devstack doctorwarns when they're on an unreliable filesystem.
Two terminals running devstack at once is safe: only the four mutating points
(network-ensure, port allocation, ref rows, CREATE ROLE) briefly serialize on
the machine-global lock; everything else interleaves.
*.localhostdoesn't resolve.*.localhostis not zero-config everywhere (WSL2/minimal Ubuntu lack systemd-resolved; macOS ≤15 resolves it only in browsers; Firefox ignores/etc/hosts). Runsudo devstack dns setupto write the marker-fenced/etc/hostsblock;devstack dns statusshows what's missing.- Browser shows an untrusted cert.
sudo devstack trust install(needsmkcert;certutilfromlibnss3-toolsfor Firefox).devstack trust statusprints the exact missing tool. On WSL2 the CA must also be imported into the Windows store (browsers run on Windows).
- A
secret://value isn't reaching the container. Generated files only ever carry the key name (the value is injected at runtime) — that's by design (no secret value is ever written to disk). Check the provider is declared inworkspace.yaml secrets.providersand that its kind's backend is reachable. - SOPS+age: ensure
SOPS_AGE_KEY_FILEpoints at your key (devstack secrets keygen -o <file>generates one) and thesopsbinary is on PATH.
- A new-release notice may print after a command. Suppress it with
DEVSTACK_NO_UPDATE_NOTIFIER=1. The check is throttled (once/day) and never blocks or fails a command.