Key concepts
How a worker connects
The connection is established once at startup and then kept alive for the lifetime of the process:- The worker starts and reads its connection settings.
- It authenticates to the platform with the workspace API key.
- It registers with the platform and starts pulling scan jobs.
- It executes each job’s steps, reporting progress and results back.
- The platform’s job registry tracks the job through each stage: waiting, running, and then finished successfully, failed, or cancelled.
A worker that cannot connect is almost always a credential problem: an invalid, revoked, or missing workspace API key. Check the worker logs first — they name the failing request and the platform’s response.
Connector tools on a worker
Not every tool is built into the worker. A connector is an external security tool packaged as a container image. When a job targets a connector, the worker acts as a container supervisor:- The platform sends the run to the worker with the connector’s container image, its per-run inputs, and the resolved configuration.
- The worker pulls the image if it is not already cached, then starts the container.
- The container starts the connector, which dials back to the worker over a private endpoint. The connector never listens for inbound connections.
- The connector registers, runs the scan, and streams findings back to the worker, which persists them through the platform.
- When the run finishes, the outcome is recorded in the job registry.
Connector runtime requirements
- A container runtime. The worker needs access to a Docker daemon to start connector containers. In the production Compose stack the worker runs in
nodemode with the Docker socket mounted — see Deployment. - A reachable dial address. Connector containers must be able to reach the worker at
WORKER_CONNECTOR_ADDR(host:port). If the address is empty and autodetect is not enabled, the worker stops at startup rather than starting containers that could never connect. - Optional authentication. Set
WORKER_CONNECTOR_TOKENfor a shared-secret handshake, or enable mTLS on the connector endpoint.
Mounting the Docker socket gives the worker root-equivalent control of its host. Only run connector images you trust, and keep the worker host dedicated to scanning.
Connect a worker
Prerequisites
- A running platform that the worker can reach.
- A workspace API key. Generate or copy one from Settings → API Keys — see API keys.
Always use a real workspace API key. A worker running with a placeholder value cannot connect to your workspace.
Step-by-step
1
Generate or obtain a workspace API key
Open Settings → API Keys in the Console. If no key exists yet, click Rotate to create one and copy it immediately — the key is shown once and cannot be retrieved later. Treat it like a password.
2
Configure the connection settings on the worker host
Set the worker’s connection settings — at minimum the workspace API key. The remaining settings have sensible defaults for a standard deployment.
3
Start the worker
Run the worker in the way that fits your environment — as a container, a system service, or the local CLI.
4
Verify the worker appears as connected
Open Workers in the sidebar (under Management) and switch to the Workspace tab. The worker should appear with a green connected status badge. If it does not, follow the troubleshooting steps below.
Run a worker with Docker Compose
The simplest path is the worker service shipped in the platform’s Docker Compose deployment. Configure the workspace API key and the connection settings for the platform, then start the worker service. The shipped worker runs in node mode: it mounts the host Docker socket so it can start connector containers, and publishes the connector port so those containers can dial back to it. The stack also mounts a shared tools folder where the built-in scanning tools are installed once and cached, so tool installation does not repeat for every job.Run a worker from the Console
On the Workers page, use the Connect worker button. It shows a ready-to-run command for your environment, pre-filled with the workspace API key and the host you are browsing from. Options are available for running from source (DevMode), on Linux, and on Windows.Worker scope
Each worker operates under a scope that determines which jobs it may pull: The Workers page shows workers under Global and Workspace tabs. A worker bound to a workspace serves that workspace’s jobs; a Global worker has access to jobs from any workspace.Scaling workers
Workers scale horizontally without shared state — add instances and the platform distributes jobs among whoever is ready.- Run more instances. Launch additional worker instances using the same workspace API key. Each pulls the next available job when it has capacity.
- Allow more parallel jobs on powerful hosts. The default concurrency setting bounds how many jobs one worker executes at once. Treat it as a per-host budget: raise it when the host has spare CPU and memory, lower it when jobs share tools or targets and you see timeouts.
- Prefer more instances over extreme concurrency. More instances spread load across machines; a very high concurrency value saturates one machine.
Workers that run connector containers each need their own reachable connector endpoint. The production Compose stack publishes a single connector port, so scale by giving each worker a distinct connector address and port rather than running several replicas behind one address.
Connection settings
Workers authenticate with the workspace API key and read a small set of connection settings that point them at the platform and control how many jobs they run in parallel. The defaults match a standard deployment; change them only when your setup differs. Workers that run connector containers read a few connector settings on top of these:Troubleshooting
Jobs stay stuck in the waiting stage
Jobs stay stuck in the waiting stage
A job only leaves the waiting stage when a connected worker picks it up. If jobs accumulate, check that at least one worker shows a connected status on the Workers page, then check the worker logs for registration errors. See Jobs for the full lifecycle.
The worker shows no connected status after starting
The worker shows no connected status after starting
Confirm the API key is valid and belongs to the workspace: rotate it in Settings → API Keys if in doubt, update the worker’s connection settings, and restart the worker. Then check that the worker can reach the platform from its host.
The API key was rotated — the worker stopped pulling jobs
The API key was rotated — the worker stopped pulling jobs
Rotation invalidates the previous key immediately, so the worker’s connection is rejected. Update the worker’s connection settings with the new key and restart the worker. Rotate keys on a schedule and update every worker (and other API consumers) before the old key is needed again.
The worker cannot reach the platform
The worker cannot reach the platform
Verify network connectivity from the worker host to the platform. In a Docker Compose deployment, the worker must be on the same network as the platform service.
Connector jobs fail to start
Connector jobs fail to start
Connector runs need a worker that can start containers. Check that the worker has access to a Docker daemon, that its connector dial address is set, and that the connector image can be pulled from its registry. The worker log names the failing step — image pull, container start, or the connector’s registration.
Connector containers keep running after a job finishes
Connector containers keep running after a job finishes
This is the warm pool keeping an idle container ready for the next job. Idle containers are stopped and removed after the idle timeout; lower the timeout if you want them cleared sooner.
Related
API keys
Generate and rotate the workspace API key that workers authenticate with
Jobs
Watch jobs move from waiting to finished in the registry
Tools & Connectors
The built-in tools and connector containers workers execute
