Generate a diagnostics bundle
Capture a single, secret-free .zip of your Ringleader install: local status, the daemon log, and every workstation, ready to share with the Ringleader team.
A diagnostics bundle is one .zip file describing your Ringleader install, made to
be sent to us as-is. It gathers everything you would otherwise collect by hand (what
rl troubleshoot prints, the log, and the state of each workstation) and it is built to
contain no login tokens, secret values or private keys.
It is the first thing we ask for when you get in touch about a problem.
Make one
From the desktop app
The macOS app and the Windows app both have a Troubleshoot pane with a Generate bundle button.
- Open the app’s settings and go to the Troubleshoot pane.
- If you can, raise the daemon’s log level and reproduce the problem first, so the
log has the detail we need. To raise it, run
rl daemon log-level debugin a terminal. - Click Generate bundle.
The app writes ringleader-diagnostics.zip into your Ringleader data directory,
shows its path in the pane, and opens it. Attach that file to an email or a chat.
If some items could not be collected, the bundle is still written and opened, and it
notes what was skipped.
The pane also shows the command it runs, if you would rather run it yourself.
From the command line
rl troubleshoot --all --diagnosticsThe desktop button runs this command with its own output path. Run from a
terminal, it writes ./ringleader-diagnostics-<timestamp>.zip in the current
directory and prints the absolute path it wrote.
| Command | What it captures |
|---|---|
rl troubleshoot --diagnostics | Local diagnostics only (no workstation info). |
rl troubleshoot --all --diagnostics | Local diagnostics plus every workstation. |
rl troubleshoot my-box --diagnostics | Local diagnostics plus just my-box. |
rl troubleshoot --diagnostics=out.zip | Write to an explicit path instead of the default. |
rl troubleshoot --diagnostics --log-since=6h | Widen the bundled daemon log to reach at least 6 hours back. |
--all connects to every workstation over SSH, so with many workstations it takes a
little longer.
Check the log reaches back far enough
diagnostics/COLLECTION.md. If it starts too late,
run the command again with --log-since=<duration>, for example --log-since=6h, and
it reaches further back.What’s inside
README.md what this bundle is, how it was made, and the privacy guarantee
diagnostics/
host.md OS, version, virtualization, CPU/cores, RAM, disk usage, architecture, timezone, network interfaces
daemon.md the local daemon: running? since when? version, PID, heartbeat, last log line, restarts in the log tail
origins.md per origin: name, URL, user, backend version, token validity (no tokens)
localbindings.yaml every device-local LocalBinding: what this device forwards, and what it is actually holding
seeded-bindings.md which workstations the daemon has already auto-seeded a binding for
cloudidentities.yaml every CloudIdentity in the namespaces the captured workstations live in, including the fact that a namespace has none
versions.md the rl CLI version and build
daemon.log the daemon log, trimmed to its most recent tail (across rotated backups)
COLLECTION.md every item the bundle tried to collect: OK / FAILED / SKIPPED with the reason, and the daemon log's covered time range
workstations/
<namespace>__<name>/
troubleshoot.txt the `rl troubleshoot <name>` output (controller view + egress + forwarding + probes + timeline)
workstation.yaml the Workstation object (spec + status + conditions)
config-<name>.yaml one per WorkstationConfig this workstation's status says it applied
report.json the raw in-VM provisioning ledger, when one was captured
vz-host-logs.txt a vz workstation's helper, network and console logs, with the previous run's copies, when it is on vz
hcs-host-logs.txt an hcs workstation's network log and its console output from the current and previous start, when it is on hcsThe workstations/ folder is present only when you captured with --all or named
a workstation. localbindings.yaml and cloudidentities.yaml are absent when the
control-plane store could not be opened; seeded-bindings.md is always present. A
*.error file next to an expected entry means that item failed to collect; its content
is the error.
A bundle is written even when parts of it fail. A workstation that is powered
off, or a check that cannot run, does not stop the rest. Every failure is recorded
three times over: on your terminal, in diagnostics/COLLECTION.md inside the zip, and
in the command’s exit code. A partial bundle is still useful to us, so send it.
That also makes it the command for when everything is broken: if Ringleader itself cannot start on your machine, the bundle still captures the machine, the daemon’s state and, most importantly, the log, and records why the rest is missing.
How to read one
If you are the one reading a bundle, start at the top:
diagnostics/COLLECTION.md: what was and was not captured.diagnostics/host.mdanddiagnostics/daemon.md: is the environment sane and is the daemon alive?diagnostics/origins.md: is the user logged in, and is the token still valid?workstations/<…>/troubleshoot.txt: the per-workstation controller view, egress checks, device-local forwarding, live probes, and provisioning timeline.- For a “my ports are not forwarded” report:
diagnostics/localbindings.yaml(is there a binding at all, and what is its status?), thendiagnostics/seeded-bindings.md(if there is none, was one ever seeded?). - For a “my configuration did not apply” report:
workstations/<…>/config-<name>.yaml, each configuration the workstation says it applied, and, for a cloud box that never came up,diagnostics/cloudidentities.yaml.
Privacy
The bundle is built to be safe to share:
- No credentials. It carries no login tokens, secret values or private keys. Where it reports on your logins, it says only whether each is still valid and until when.
- The log is trimmed and redacted. Only the most recent part is included, and anything in it that looks like a token or a private key is blanked out.
- Secrets stay as references. A workstation’s configuration may refer to a secret
by name, as
${secret:NAME}. The bundle contains the name, never the value.
The redaction is a second line of defense. The first is that Ringleader never writes a
credential into the bundle to begin with. Even so, if your environment is known to log
sensitive data, glance through diagnostics/daemon.log before you send it.
See also
rl troubleshoot: the full command and every flag.- Troubleshooting overview: local status, a stuck workstation, and the logs.