Commit 1d586d1
committed
feat(ops): compose-managed vm-watchdog sidecar, replacing the host cron watchdog
psyb0t's review: the crash-recovery failure mode is real, but a host cron job
is the wrong vehicle — it needs a machine-specific checkout path and cron setup,
and the fixed cooldown cannot prevent a restart loop. This replaces
scripts/watchdog.sh with a Compose-managed vm-watchdog sidecar that ships in
docker compose up -d.
- scripts/vm-watchdog.py: stdlib-only loop that polls Docker health through the
mounted unix socket. Scoped to this compose project (self-discovered from its
own labels) plus the dockurr/windows image, so it only ever restarts VM
containers. Uses Docker's State.Health.FailingStreak as the source of truth,
keeps a per-container state record on a named volume (last restart, attempts,
healthy-since), enforces exponential backoff (5m -> 15m -> 1h), stops after
WATCHDOG_MAX_ATTEMPTS failed recoveries with a loud log, and resets the
attempt budget only after the VM has stayed healthy for a meaningful period.
Fixes the two correctness issues in the old script by construction: the loop
never exits with a "recovered" error, and backoff is exponential, not a fixed
cooldown. Uses docker restart (not recreate), preserving the owner container
ID and therefore wickworks sidecar netns attachment.
- docker-compose.yml.j2/.example: vm-watchdog service (socket + script mounts,
named vm-watchdog-state volume), like the log-rotator, one per project.
- tests/test_vm_watchdog.py: behavioural coverage for healthy/starting
exclusion, sustained-unhealthy restart, image/label scoping, exponential
backoff, bounded retries, reset after stable health, dry-run, and project
self-discovery — against a fake Docker transport, so it runs offline.
- docs/operations.md: Auto-recovery section rewritten for the sidecar; cron
instructions removed.
- Dockerfile.test: COPY the new script so the offline suite exercises it.1 parent c15546e commit 1d586d1
7 files changed
Lines changed: 681 additions & 179 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
91 | 91 | | |
92 | 92 | | |
93 | 93 | | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
94 | 118 | | |
95 | 119 | | |
96 | 120 | | |
| |||
198 | 222 | | |
199 | 223 | | |
200 | 224 | | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
120 | 120 | | |
121 | 121 | | |
122 | 122 | | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
123 | 147 | | |
124 | 148 | | |
125 | 149 | | |
| |||
229 | 253 | | |
230 | 254 | | |
231 | 255 | | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
262 | 262 | | |
263 | 263 | | |
264 | 264 | | |
265 | | - | |
266 | | - | |
267 | | - | |
268 | | - | |
269 | | - | |
270 | | - | |
271 | | - | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
272 | 270 | | |
273 | 271 | | |
274 | 272 | | |
275 | | - | |
276 | | - | |
277 | | - | |
278 | | - | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
279 | 277 | | |
280 | 278 | | |
281 | 279 | | |
282 | 280 | | |
283 | 281 | | |
284 | 282 | | |
285 | | - | |
286 | | - | |
287 | | - | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
288 | 295 | | |
289 | | - | |
290 | | - | |
291 | | - | |
292 | | - | |
293 | | - | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
294 | 304 | | |
295 | 305 | | |
296 | 306 | | |
| |||
0 commit comments