• v0.6.0 5c325e3132

    v0.6.0 — OAuth state survives a redeploy
    All checks were successful
    CI / gate (push) Successful in 1m8s
    CI / image (push) Successful in 52s
    Stable

    joeyr released this 2026-08-09 13:35:06 -05:00 | 104 commits to main since this release

    Added

    • OAuth state now persists across redeploys. The connector was signed out by every
      single stack update. FASTMCP_HOME is set explicitly to /var/lib/fastmcp — in the
      image and in the stack — and the stack mounts an NFS volume there, so the encrypted
      file store OAuthProxy was already writing survives a service update.

      Set explicitly rather than left to platformdirs, because the default is derived from
      the container user and $HOME: a base-image change would relocate the store silently,
      and a moved store is indistinguishable from a lost one. The volume is inline rather
      than external: true for the reason named_volumes_guide.md gives — Portainer here
      cannot target a node and there is no SSH to the Pis, so an external volume exists on
      exactly one node, and a task landing anywhere else gets an empty one. That would bring
      the sign-out back intermittently, which is worse than constantly. It sits on
      volume1 (NVMe) rather than volume2 (HDD): a tree of tiny files rewritten on every
      token refresh is exactly the small-random-write case the guide reserves the NVMe for.

      This does not raise the replica ceiling. A file store is per-container-filesystem,
      so replicas: 1 still stands under AUTH_MODE=oauth. See docs/oauth-persistence.md.

    • An oauth_storage preflight check, and fastmcp_home on the boot line.
      OAuthProxy mkdirs its storage in its constructor, so an unwritable path was a
      PermissionError during app construction — a crash loop whose traceback named
      fastmcp, pathlib and a hashed directory, and mentioned neither the volume nor its
      owner. That is the likely first failure here: the local NFS driver never contacts the
      server until a container mounts it, so a missing export directory or wrong ownership
      produces a perfectly healthy-looking volume and fails only at start. The check runs
      before the app is built and names it in one line. An unset FASTMCP_HOME is advisory,
      not a failure — it is legal, just drift waiting to happen.

    Downloads