Health and logs
The containers
Section titled “The containers”| Container | What it is |
|---|---|
quasar-postgres |
All state. Users, apps, hosts, GPUs, sessions, entitlements. |
quasar-control-plane |
The Go service. API, signaling, scheduler, and it serves the web app. Applies database migrations at startup. |
quasar-node-agent |
The Rust agent. Runs with host networking, drives the compositor and encoder, launches app containers. |
During a session you will also see the app container itself and a PulseAudio sidecar, both launched by the agent as siblings. They are not in the Compose file.
Health checks
Section titled “Health checks”Control plane:
curl http://localhost:8080/health{"status":"ok","db":"ok"}Deliberately excluded from the HTTPS redirect so it works before certificates are sorted.
Node agent, on the host it runs on:
curl http://127.0.0.1:9091/health{"status":"ok","sessions":0,"connected":true}connected is whether the agent’s WebSocket to the control plane is up. False
means the agent is alive but isolated.
Container states:
docker compose -f deploy/docker-compose.yml psdocker compose -f deploy/docker-compose.yml logs -f quasar-control-planedocker compose -f deploy/docker-compose.yml logs -f quasar-node-agentErrors only from the node-agent service:
docker compose -f deploy/docker-compose.yml logs --tail 2000 quasar-node-agent \ | grep -iE '\b(error|fatal|panic)\b'Log lines worth recognising
Section titled “Log lines worth recognising”render_node <raw> -> <canonical> means the agent resolved a by-path render node
symlink. Exactly what you want on a multi-GPU host.
EGL hardware-acceleration enabled confirms the compositor got hardware
acceleration.
codec resolved logs the codec decision for a session, including what was
considered and why the winner won. This is the first place to look when a session
got an unexpected codec.
no VA H264 encoder found means the VA encoder did not register. Usually a stale
GStreamer registry, or software Mesa being forced by an environment variable that
should not be set.
quasar-renderer-degraded means a hardware frame import fell back to software
rendering. Two of these within 30 seconds fails the session, unless
QUASAR_REQUIRE_HW_RENDER=0.
media path interrupted is a catch-all for the media path breaking. The real
cause is usually a few lines above it. Common ones are the app container exiting
immediately, or an app that needs network access not having it.
Steam needs to be in the log means Steam could not start, and almost always
means the container has no network. See The Steam library.
no migration found for version N in the control plane is the rollback
crash-loop. See Upgrading.
no command specified on a container means an overlay cleared the command on an
image that has no entrypoint of its own.
Reading a session, not a log
Section titled “Reading a session, not a log”For anything about a specific session, the admin session detail is better than the logs. It has the metrics time series and the event stream already correlated. See Sessions and audit log and Diagnostics.
Checking the whole stack quickly
Section titled “Checking the whole stack quickly”The repository ships a diagnostic script that collects the state of everything in one pass: git revision, container states, health endpoints and recent errors from each container, with secrets redacted.
make diagnoseFor something shareable:
make diagnose-bundleMetric retention
Section titled “Metric retention”Running sessions keep a rolling hour of telemetry. At a terminal state the remaining telemetry is frozen and retained for 24 hours by default. Capture results remain with the session row. Take or export a diagnostic bundle before the post-mortem window expires if you need a longer-lived record.