Repository navigation
v0.6.0
Fixes from a security review and a billing audit, plus dashboard screens for subscriptions whose billing is failing. No database migration.
Before you upgrade
- Set
METRICS_TOKENif you scrape/metricsin production. WithAPP_ENV=productionand no token,/metricsnow answers 401. The Compose stack runs in production mode. - Check three settings. Velox now refuses to start on an
APP_ENVsuch asprod(it must beproduction), aTRUST_PROXYentry that is not an IP or CIDR, or aDB_*pool setting that is not a whole number. GET /health/readyno longer fails when the billing scheduler stalls. It answers 503 only while draining or when the database ping fails. Alert onvelox_scheduler_last_run_timestamp_secondsinstead.- A cancel can answer 409
unbilled_periodwhen a billing period has ended and cannot be invoiced. Retry billing, then cancel again. If you script cancels, handle this code. - Several endpoints answer 404 or 422 for an id that is not yours, where they used to answer 2xx.
- Webhook endpoints in
100.64.0.0/10are refused. Some private overlay networks use that range. - Images are signed with cosign 3. Verifying an image from this release needs cosign 3 or newer.
What changed
Billing
- A subscription cancelled after its billing period ended, and before the billing run invoiced it, is now billed for that period. Before, that period's usage and base fee were never invoiced. (#991)
- Cancelling just after a renewal no longer voids the previous period's usage on a plan billed in advance.
- Usage ingest answers 503, not 422 "not found", when the database cannot look up the customer or meter. A client that treats a 4xx as final dropped that usage.
Dashboard
- Subscriptions whose billing is failing are marked in the list, with a
Billing failingfilter. The subscription page shows the reason, which attempt failed, when the next one is, and aRetry billingbutton. (#960) - A price box left blank no longer saves a $0 rate.
- A failed load on the customer page shows an error with Retry, not "$0.00" or a blank setup form.
Security
- Eleven endpoints accepted the id of an object in another tenant, or in the same tenant's other mode (live or test), and wrote a row under the caller's tenant pointing at it. They now refuse it and write nothing. The customer's owner got no spendable credit from this. The changelog lists the endpoints and says how to find rows written earlier.
- Webhook deliveries check the address they connect to, not only the host name.
/metricsrequires a bearer token in production.- The readiness check no longer returns database error text.
- A sent email's database row no longer keeps its link token or PDF. Rows from before this release are not cleaned up.
- A failure at the end of an API key rotation answers a logged 500, not a 422 carrying the error text.
- The dashboard image is now scanned and signed, and moves from nginx 1.27 to 1.30.
- A network error while sending no longer marks the customer's address as bounced.
Docs
- Billing thresholds are described as what they are: an early invoice, once per period, at the next hourly billing run. They do not stop usage. The page said "hard cap".
Every change, with its reasoning: CHANGELOG.