• v1.8.1 f52dc8525a

    Ghost released this 2026-08-06 19:16:52 -04:00 | 36 commits to main since this release

    Summary

    • cache successful public list responses for /v0/servers and
      /v0.1/servers at ingress-nginx for 30 seconds
    • give only those exact cached paths a 600 RPM per-controller budget
    • preserve the existing 180 RPM limit for publish, auth, mutation,
      detail, and other routes
    • expose X-Registry-Cache to make cache MISS/HIT behavior directly
      observable

    Why

    Production ingress logs show that the current 180 RPM per-controller
    limit rejects legitimate bulk pagination before it reaches the
    application. The affected traffic is overwhelmingly registry-list reads,
    not publishing.

    A ten-minute production sample contained 17,836 successful list
    responses but only 3,188 unique URLs: 82.1% were repeated requests,
    representing roughly 1 GB of duplicate response bodies. Raising the list
    limit without caching would increase pressure on the application and its
    shared PostgreSQL pool. The short ingress cache absorbs repeated
    cursor-page reads before raising their scoped client budget.

    Publish latency is a separate concern. Reducing read pressure may help
    indirectly, but slow external package validation is intentionally out of
    scope for this PR.

    Relates to #826.

    Safety

    • caching is limited to exact public GET list paths and keyed by host
      plus full request URI
    • only 200 responses are cached
    • cache lifetime is 30 seconds; newly published entries can therefore
      take up to 30 seconds to appear on a cached page
    • cache locking coalesces simultaneous misses
    • stale cached responses may be served while refreshing or during
      transient upstream 5xx/timeouts
    • each ingress replica uses at most 1 GB of ephemeral on-disk cache

    Validation

    • go test ./... in deploy/
    • go vet ./... in deploy/
    • git diff --check
    • ingress-nginx chart 4.13.0 in a disposable kind cluster
    • generated NGINX configuration passed nginx -t
    • repeated list request verified X-Registry-Cache: MISS followed by
      HIT
    • non-list route verified uncached
    • exact list locations verified with the higher rate zone while the
      catch-all retained 180 RPM

    Nothing was applied to production during investigation or validation.

    Downloads