Skip to content

Releases: amayer1983/docksentry

v1.41.0 — Self-update failure diagnostics

Choose a tag to compare

@amayer1983 amayer1983 released this 07 Jul 17:37

Added

  • Self-update failure diagnostics (#43, @LeeNX). When a self-update recreate fails (seen repeatedly on rootless Podman) the reason used to vanish — the helper container runs --rm, so its stderr was gone before anyone could read it. The helper now also mounts Docksentry's /data host directory (resolved from our own inspect Mounts) and redirects its whole swap-script output there. On the next boot, if the recreate rolled back, Docksentry reports the captured helper output — so the actual docker run rejection is finally visible instead of a silent brick. On success the log is consumed silently. (This is the diagnostic that should finally reveal why the Podman recreate fails; the v1.38.2 recovery-net already made it survivable.)

Full 25-script regression sweep green.

v1.40.1 — Compose project-directory fix + contract linter

Choose a tag to compare

@amayer1983 amayer1983 released this 04 Jul 18:20

Fixed

  • Compose recreates now pass --project-directory when the stack was originally started from a different directory than the compose file's location. Found via a static-analysis audit: the update path accepted the com.docker.compose.project.working_dir label but never used it — so a recreate could resolve .env interpolation / env_file: paths differently than the original up did. Same recreate-fidelity class as #27/#29.

Changed

  • Permanent contract linter (scripts/lint_contracts.py, wired into the pre-commit check): flags functions mixing literal return shapes and same-named methods across classes with conflicting return contracts — the exact class of the v1.37.1 _wait_healthy cascade crash. Verified against a synthetic reproduction of that historical bug. Plus lint cleanup (unused imports/vars, one zip(strict=True)).

Full 24-script regression sweep green.

v1.40.0 — /checkimages + revived selfupdate hint

Choose a tag to compare

@amayer1983 amayer1983 released this 03 Jul 19:03

Added

  • /checkimages (#2, @famewolf) — dry-run counterpart to /cleanup. Reports how much disk space /cleanup would reclaim right now (unused images + build cache, from docker system df) and calls out the AUTO_CLEANUP status. Useful when you're not on auto-cleanup and want to check on demand instead of waiting for the disk warning to fire.

Fixed

  • /check didn't surface the Docksentry-update hint anymore (#2, @famewolf). Since v1.17.4 the hint was gated on Docksentry appearing in the results — but get_running_containers explicitly filters ourselves out ("Skipped (self)"; a normal-flow update on ourselves can't work — PID 1 can't replace its own container). So the hint has been silently dead since the self-filter existed. /check now asks the checker directly (has_selfupdate_available() — digest-only registry compare, no pull), so a newer Docksentry image on the registry surfaces the "run /selfupdate" hint again.

Full 24-script regression sweep green.

v1.39.1 — Retry symmetry: Discord + Webhook (audit)

Choose a tag to compare

@amayer1983 amayer1983 released this 03 Jul 13:11

Fixed

  • Discord and generic webhook notifications could silently drop on a transient network blip — proactive audit follow-up to v1.38.1. _discord_post and _webhook_send did a single urlopen in a try/except, the same structural gap that ate NotRetarded's Telegram notification right after a self-update restart. Zero reports of Discord/webhook loss so far, but the code was one bad blip away from the same symptom on either channel. A shared _post_json_with_retry now covers all three channels: 3 attempts with 2s/4s backoff on transient network failures, no retry on HTTP status codes (server rejection ≠ transient blip).

Note: for a generic webhook pointing at an automation (Home Assistant, ntfy, custom script), the tiny edge case where a delivered send timed out on read can yield a duplicate delivery — prefer idempotent handlers.

Full 23-script regression sweep green.

v1.39.0 — Actionable disk warning

Choose a tag to compare

@amayer1983 amayer1983 released this 03 Jul 09:12

Changed

  • Disk-space warning is now actionable (#2, @famewolf). A bare ⚠️ Disk usage at 88% — 5.3 GB free. used to get lost in the noise (famewolf's 215 GB-of-orphaned-images lesson: the warning did fire, he just glossed over it while wrestling with LLM disk pressure). The warning now tells you how much space /cleanup could reclaim (from docker system df — unused images / build cache) and, if DISK_WARN_AUTO_CLEANUP is OFF, a one-line nudge to turn it on. So the message becomes "🧹 21.3 GB reclaimable via /cleanup — auto-cleanup is OFF, set DISK_WARN_AUTO_CLEANUP=true to reclaim automatically next time." Hard to ignore.

Full 22-script regression sweep green.

v1.38.2 — Self-update recovery net

Choose a tag to compare

@amayer1983 amayer1983 released this 02 Jul 19:00

Fixed

  • A failed self-update recreate could leave Docksentry dead (#43, @LeeNX). The helper ran stop && rename→_old && run && rm _old; if the docker run recreate failed (a flag the runtime rejects — seen on rootless Podman), the chain stopped with the container renamed to _old and stopped, and no new container — Docksentry was down with no recovery. The recreate is now guarded: on failure it removes any partial new container, renames _old back and starts it, so the bot survives on the previous version. rm _old runs only after a successful run. (Why the Podman recreate fails is still being gathered — the recovery net makes it non-fatal either way.)

Full 21-script regression sweep green.

v1.38.1 — Retry transient Telegram API timeouts

Choose a tag to compare

@amayer1983 amayer1983 released this 30 Jun 04:31

Fixed

  • Transient Telegram API timeouts silently dropped notifications (#2, @NotRetarded). Right after a self-update restart the network can still be settling; a single urlopen timed out on the Telegram API meant the notification was lost (while Discord/webhook, a moment later, got through). api_call now retries transient network failures up to 3× with short backoff (2s, 4s). The long-poll (getUpdates) is exempt, and HTTP 4xx bodies are still returned unretried. Trade-off: a read-timeout after Telegram already accepted a send could produce a duplicate — preferable to a dropped notification.

Full 20-script regression sweep green.

v1.38.0 — Installable Web UI (PWA) + cross-channel version badge

Choose a tag to compare

@amayer1983 amayer1983 released this 29 Jun 19:29

Added

  • Installable Web UI (PWA) — a web app manifest + icon so Docksentry can be added to a phone's home screen and run standalone, complementing the touch polish in v1.37.0 (#2). Served via the existing /static route; theme-color + apple-touch meta included. No new dependencies.
  • Version badge on Discord / webhook / e-mail (#44, @LeeNX) — the 🔖 v_old → v_new info added to the Telegram "updates available" notification in v1.36.0 now also appears on the other channels: Discord embeds (per container), the generic webhook payload (old_version / new_version fields), and the e-mail summary. Empty when the image has no org.opencontainers.image.version label.

Full 19-script regression sweep green.

v1.37.1 — Fix dependents-cascade crash

Choose a tag to compare

@amayer1983 amayer1983 released this 29 Jun 18:55

Fixed

  • Restart-dependents cascade crashed with cannot unpack non-iterable bool object (#2, @famewolf). A group head (e.g. gluetun) updated fine, then kicking its dependents threw — the head showed a second, bogus ❌ line. A stray bot-local _wait_healthy returning a bool shadowed the checker's canonical 3-tuple (outcome, state, health), so outcome, _, _ = self._wait_healthy(...) tried to unpack a bool. The cascade now uses the checker's 3-tuple _wait_healthy; the duplicate bool method is removed. The regression test was masking it (it stubbed a 3-tuple onto the bot) and now stubs the checker, exercising the real path.

Full 19-script regression sweep green.

v1.37.0 — Web UI: Auto column + icon legend + static asset extraction

Choose a tag to compare

@amayer1983 amayer1983 released this 29 Jun 18:14

Added

  • Dedicated "Auto" column in the container table (#2, @NotRetarded). The auto-update flag was a name-cell badge that wrapped under long container names; it now has its own column.
  • Touch-friendly icon legend under the table (#2). The action buttons have hover tooltips, but those don't work on touch devices — a small legend now spells out each icon (update / pin / auto / major-confirm / stop).

Changed

  • Web UI CSS/JS moved out of Python string literals into real static files (app/static/app.css, app/static/app.js), served via a /static route with ?v=VERSION cache-busting. Still zero external dependencies (pure stdlib). This kills the class of bug where a stray character in the embedded _BASE_JS string broke the whole UI (#40) and makes the front-end lintable. Purely internal — no behaviour change.

Verified live (page + assets 200 with correct content-types, path-traversal 404); full 19-script regression sweep green.