Run your own worker
Join a worker to Ciresk CI: your own machine, a Linux box at home, WSL2, or an instance in your cloud account.
A worker only calls out, over HTTPS, to the cell and its object store; nothing connects to it. Your worker runs the tasks, but the tree they run on, their logs, artifacts and cache entries still travel through presigned URLs into the cell's own object store in the EU. What a worker is and which tasks it may run is in Workers and trust.
Enrol and join
Two steps, the same everywhere:
join writes /etc/ciresk-ci/worker.toml, registers the worker with its labels and exchanges the secret for a worker token (valid 24 hours and renewed by the worker, scoped to this worker only) in /var/lib/ciresk-ci/state.json (mode 0600); the secret is used once and not stored. The server URL is the cell, https://ci.eu.ciresk.com.
ciresk ci workers listYour own machine
The shortest path to a fast ciresk ci check: your own Linux machine (or a PC under WSL2) runs the worker with warm workspaces, joined to Ciresk CI. No port, no public address, no VPN.
On a host where you are already signed in (ciresk ci auth login), ciresk ci workers add does all of it, enrolment included.
Linux with systemd, by hand
The service runs as root because it creates per-task scopes under another uid, manages cgroups and may stop the host; every task runs as run_user (ciresk-run) with CPU and memory caps, and state.json is the only root-held file.
A Linux box at home, over Tailscale
A machine behind a home router or an office firewall needs no public DNS, no port forwarding and no static address: the worker only calls out. Tailscale is how you reach the box to install and operate it, not something the worker needs.
What that box gives you:
| Property | Detail |
|---|---|
| Warm workspaces | With warm_workspaces = true (the default) the first ciresk ci check from a repository creates its workspace under /var/lib/ciresk-ci/workspaces/warm/<repo_id>/; every later job updates it in place and keeps target/, node_modules/ and the other workspace.keep globs. |
| Who may use it | Only your organization's jobs, and by default only trusted_interactive and trusted_ci ones; untrusted work (fork PRs) does not land on it unless you label it disposable. |
| Auto-update | With auto_update = true (the default) the worker downloads the version the server wants between two jobs, verifies the release directory's signature under the Ciresk release key compiled into it (no key to configure, nothing can replace it) and restarts; it never moves to an older release than the one it runs. |
| Idle | idle_stop_secs = 0 (never) is the default for a static host; the box stays up and costs nothing to the cell when idle. |
| What reaches the box | The task lease (command, hashed env values, presigned URLs for your organization's prefix); never another organization's data, never the cell's database. |
Windows and WSL2
| Shape | How |
|---|---|
| WSL2 (Ubuntu or any systemd-enabled distribution) | Set systemd=true in /etc/wsl.conf, then follow the Linux steps inside the distribution. Keep the workspaces on the Linux filesystem (/var/lib/ciresk-ci), never under /mnt/c. Cgroup CPU and memory caps apply inside the WSL VM. |
| Native Windows | Not available yet: worker releases are Linux only. Run the worker under WSL2. |
A WSL2 worker is a static worker with isolation: process: the Windows host can read the Linux filesystem and there is no VM per job, so it serves your own organization's interactive and CI work and refuses untrusted tasks.
In your own AWS account
Any EC2 instance with a public address and no inbound rules works like an office box with the steps above: the worker calls out over 443 and needs no NAT gateway.
Updates
| Setting | Behavior |
|---|---|
auto_update = true (default) | Registration and every heartbeat return the version the server wants; the worker finishes its current task, downloads the signed binary from the release directory (release_url), verifies the signature under the compiled-in release key and the trusted comment ciresk-ci-worker v<version>, swaps the binary and restarts. A wanted version older than the running one is logged and never installed. |
auto_update = false | The worker logs the wanted version and keeps running; you replace the binary yourself. |
| Compatibility | Server and worker accept protocol versions N and N-1, so they upgrade in any order; a worker two versions behind is refused at registration with the upgrade hint. |
Every setting of worker.toml is in Configuration.