• v0.11.0 c1f2e2d305

    v0.11.0
    All checks were successful
    release / release (push) Successful in 22s
    test / test (push) Successful in 26s
    Stable

    Ghost released this 2026-07-03 09:35:29 +00:00 | 5 commits to main since this release

    Codebase audit sweep (5 parallel agents: Python source, tests, deploy.sh, docs, infra) — fixes below.

    Added

    • Continuous CI — a test workflow runs the suite on every push to main, not only on tag releases
      (regressions between versions were previously unseen until the next tag).
    • web waits on a sync healthcheck (Caddyfile present) via depends_on: condition: service_healthy,
      so it no longer crash-loops against a missing config on first boot.
    • More tests — config validation (rate / sync_interval / packages), MikroTik URL-builder token guards,
      HTML-escaping of operator/changelog fields, and asset cache-busting; plus an autouse fixture that resets
      site.py globals between tests (removes order-dependent flakiness).

    Fixed

    • config: web.rate_limit.rate is now format-validated at load — a typo like 600/m used to pass
      silently and render an invalid Caddyfile (written before downloads, so it could wedge first boot).
    • sweep: a version pinned into several channels is downloaded once — it was submitted to the pool
      per-channel, causing redundant CDN fetches and a race on the shared .part file.
    • deploy.sh: operator name/email and GoAccess/basic-auth usernames are escaped/validated before
      being written into packagemini.yml (a " / / / | could corrupt it); cmd_status now exports
      LC_ALL (was an inert local) and restores set -e; the three divergent "is GoAccess enabled" greps
      are unified into one _goaccess_enabled helper; the dnf-automatic sed/mkdir writes are guarded;
      set-cert warns when openssl is missing; dead hf_perms_state removed; the then keyword-variable
      renamed.
    • docs: corrected the reboot_command behaviour in UPDATES.md (packagemini always overwrites it,
      not "kept if present"); DESIGN.md GoAccess row (own port + port key); "five → six" hardening measures
      in SYSTEM-HARDENING.md; marked shipped TODO items (footer toggle, reports-over-web) done; fixed stale
      /goaccess/… URLs in the compose file, env.example, and docs; documented PM_GOACCESS_PORT.

    Changed

    • Docstrings added to run_once, render_caddyfile, classify, same_bytes; Config dataclass type
      hints aligned (tuple[str, ...] / dict[str, ChannelCfg]); .coverage git-ignored.
    Downloads