Most FloxHub services expose an HTTP health endpoint, and most of those are
liveness probes: they tell you the process is up and its HTTP stack is
serving, and they make no call to the database or to any other service. The
few that report more are called out below, as are the components that report
nothing at all.
Read this page alongside
Monitor FloxHub for the
wider set of signals — logs, catalog freshness, and background jobs.
Endpoints
The ports below are the defaults. If you have overridden the matching
FLOXHUB_SITE_* variable, probe your own value instead.
/health, /healthz, and /api/health/status are liveness probes: a 200
means the process is up and its HTTP stack is serving, and nothing more. The
accounts and factory responses carry the service version, which is what
tells you which generation is running after an upgrade.
Three paths report more than liveness — catalog-server’s
/status/healthcheck and /status/catalog, and build-coordinator’s
/health. One reports less than it appears to: web-bff’s
/api/health/details. All four are described below.
accounts, factory, and build-coordinator also expose a /ready path
beside their /health path. It returns {"status": "ready"} unconditionally
and checks nothing; see Limits.
dex has no health endpoint. Probe its OIDC discovery document instead:
nginx has no dedicated health route. Any successful response through the
front door shows that it is serving.
floxem-scheduler and the catalog updater expose nothing: both are loops
rather than servers, so no probe reports on them. The updater records each
successful run as a Unix timestamp, which is the only positive signal it
emits:
The scheduler leaves only its log output. For both, see
Log system.
Checks that do real work
catalog-server’s /api/v1/catalog/status/healthcheck runs a package
show, a search, and a resolve as the anonymous user, and reports each one’s
outcome with its elapsed time in milliseconds:
The timings make it worth polling: a catalog that is answering but slow shows
up here and nowhere else.
catalog-server’s /api/v1/catalog/status/catalog returns the catalog
database’s status counts, and 500 when the database does not answer. It is
the cheapest proof that catalog-server has a working database connection.
build-coordinator’s /v1/coordinator/health returns 503, naming the
finished tasks, when any background loop has exited:
Those loops are meant to run until shutdown cancels them, so a finished one
means the coordinator can no longer observe builds. Only a restart brings it
back.
web-bff details
/api/health/details is guarded by HTTP basic auth, and returns 503 when
any dependency is unhealthy.
On-prem it reports no dependencies. Its only dependency check is against a
service the on-prem deployment does not use, so the endpoint answers 200
with an empty dependencies list on every on-prem deployment, whatever the
state of the identity or database components. Treat it as a second liveness
probe, not a dependency report.
Check from the host
Every service answers on FLOXHUB_SITE_BIND_HOST (127.0.0.1 by default),
so you can reach the complete set from inside an activation:
This is the authoritative check. It reaches every service directly, including
the ones the front door does not route.
Check through the front door
One health endpoint is reachable without a credential:
So are the two discovery documents, which show that the front door is serving
and that sign-in is available:
The second is served from a rendered file rather than proxied, so it answers
even when the identity broker is stopped. A 404 there means your deployment
has the broker disabled, which the Flox CLI reads as “no login here”.
The catalog, factory, environment, and account prefixes all sit behind the
front door’s authentication check. An unauthenticated probe of those paths
returns 401. That 401 is itself useful — it shows the front door is
serving and the credential resolver answered — but it tells you nothing about
the service behind the prefix.
build-coordinator, openfga, floxem-gitolite, and the credential
verification routes are not routed through the front door at all. Probe them
on the host.
Limits
A 200 from most of these endpoints means only that a process is running.
Do not treat it as confirmation that the deployment is working.
A 200 is not readiness. Most endpoints return a fixed literal. They
prove the process is running and its HTTP stack answers; they do not prove
the database is reachable, that migrations have run, or that any downstream
service is up. The /ready paths on accounts, factory, and
build-coordinator are placeholders that return ready unconditionally —
they carry no more information than /health.
factory answers healthy before it can build. It depends on the base
catalog being populated. Until that has happened,
/api/v1/factory/health returns 200 while builds fail. Catalog freshness
is a separate signal; see
Monitor FloxHub.
A disabled component refuses connections by design. Several components
are gated on site configuration, and one whose gate is off idles instead of
serving. Connection refused on its port is the expected state for a component
you have turned off, not a failure.
Process supervision is a separate question. flox services status tells
you whether each service process is running, which is not what these
endpoints answer. A service can be Running with its HTTP listener broken,
and a service that crashed answers nothing at all.
Startup is not reported. Several services wait on PostgreSQL and run
migrations before they bind. During that window the port refuses connections,
which looks identical to a service that failed to start.