# Self-Hosted Runners: Set Up Computer to Work With It All

**URL:** <https://hub.infinito.nexus/t/self-hosted-runners-set-up-computer-to-work-with-it-all/582>\
**Category:** General\
**Created:** [June 25, 2026, 4:56pm UTC](https://hub.infinito.nexus/t/self-hosted-runners-set-up-computer-to-work-with-it-all/582 "2026-06-25T16:56:25Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![alexromanibanez](https://hub.infinito.nexus/letter_avatar_proxy/v4/letter/a/3e96dc/32.png) [@alexromanibanez](https://hub.infinito.nexus/u/alexromanibanez)\
**Post date:** [June 25, 2026, 4:56pm UTC](https://hub.infinito.nexus/t/self-hosted-runners-set-up-computer-to-work-with-it-all/582/1 "2026-06-25T16:56:25Z")

</div>

# 🖥 Self-Hosted Runners — Part 3: Turn a Computer into a Runner Host

_Tutorial · Getting Started · written for the hub Tutorials category_

_Series: Part 1 — Local · Part 2 — CI · Part 3 — The Computer_

* * *

👋 Got a spare box, an old workstation, or a VM gathering dust? Let’s turn **that computer** into Infinito.Nexus CI runners so it picks up real deploy jobs from GitHub. You drive the whole thing **from your laptop over SSH** — you never log into the runner box directly. 🚀

> 🧰 This is the _dedicated runner machine_ guide. For setting up **your own** dev machine, that’s Part 1. For deploy basics, see the Deploy Guide.

* * *

## 🧱 What you’re building

The `svc-runner` role drops **N ephemeral runner containers** onto one host. Each is a GitHub Actions self-hosted runner; when it gets a job it builds the Infinito image and runs a full app deploy + tests in an isolated sandbox, then re-registers fresh for the next job.

```auto
🖥️ the runner computer
 ├─ runner-1 (subnet 172.30.1.x, project runner-1) ┐
 ├─ runner-2 (subnet 172.30.2.x, project runner-2) ├─ each runs ONE job at a time,
 └─ runner-N (subnet 172.30.N.x, project runner-N) ┘ fully isolated from the others

```

## ✅ What you need

### On your control machine

_(your laptop — the one set up in Part 1)_

- A checkout with `make install` done

- 🔑 A **GitHub Personal Access Token** (`repo` scope) as `RUNNER_API_TOKEN` (or `GH_TOKEN`)

- `gh` CLI logged in, and SSH key access to the runner box

### On the runner computer

- 🐧 Clean Linux — **Debian, Ubuntu, Arch, or Fedora/CentOS**

- 🐳 Docker with a reachable socket

- 💾 Disk for image builds — budget tens of GB

> 💡 The runner box can even be _the same machine_ you work on — it just needs Docker + SSH.

## 🚀 Step 1 — Provision

One command, from your control machine:

```auto
RUNNER_API_TOKEN=ghp_... make runner-ci-deploy HOST=runner.example.com DISTRO=ubuntu

```

On a **fork** , add your username so runners register against _your_ repo (never upstream):

```auto
RUNNER_API_TOKEN=ghp_... make runner-ci-deploy HOST=runner.example.com DISTRO=ubuntu OWNER=youruser

```

Follow the live log in another terminal:

```auto
tail -f /tmp/infinito-runner-deploy.log

```

| Parameter | Default | Notes |
| --- | --- | --- |
| `HOST` | — (required) | hostname/IP of the runner box |
| `DISTRO` | — (required) | `debian` / `ubuntu` / `archlinux` / `fedora` / `centos` |
| `COUNT` | `15` (CLI auto = vCPUs ÷ 2) | number of runner instances |
| `PORT` | 22 | SSH port |
| `OWNER` | `infinito-nexus` | GitHub user/org to register with |
| `REPO` | `core` | repository to register with |

## 🔍 Step 2 — Verify they showed up

```auto
gh api repos/youruser/infinito-nexus/actions/runners -q '.runners[].name'

```

They should appear as **Idle** 🟢 at:

```auto
github.com/<owner>/infinito-nexus/settings/actions/runners

```

## 🎚 Step 3 — Switch CI over to them

_(That’s Part 2 — short version:)_

```auto
make runner-ci-enable COUNT=2 [OWNER=youruser] # 🟢 activate

make runner-ci-disable [OWNER=youruser] # 🔴 panic button

```

Push a commit → jobs targeting `[self-hosted, linux]` now land on your box. 🎉

## 🛡 Why it’s safe to run (the isolation story)

- **DooD:** runner containers mount the host Docker socket; jobs run on the host engine, **namespaced** per instance.

- **Per-instance everything:** subnet `172.30.<N>.0/24`, compose project `runner-<N>`, own volume dir, own registration. Keyed on instance number → parallel jobs **cannot collide**.

- **Ephemeral:** one job per instance, then re-register fresh.

- **Sandboxed deploys:** each app deploy runs in a sealed throwaway daemon, torn down after — the host’s own stack is never touched.

So you can run these on a shared machine without fear of them stepping on each other or other workloads. 👌

## ♻ Bonus: reuse it for other projects

The runner image bakes only a toolchain (no Infinito code) — point it at a different repo by re-running `runner-ci-deploy` with another `OWNER`/`REPO`. A `provider: gitea` flavor (register against a self-hosted Gitea instead of GitHub) is on the roadmap — **ticket #585**. 🔮

## 👉 The rest of the series

- **Part 1:** Try the runner on your own machine

- **Part 2:** Plug runners into CI

- 📖 Deep reference: `roles/svc-runner/README.md`

## 🧾 Cheat sheet

```auto
RUNNER_API_TOKEN=ghp_... make runner-ci-deploy HOST=<host> DISTRO=ubuntu [OWNER=youruser]

tail -f /tmp/infinito-runner-deploy.log

gh api repos/<owner>/infinito-nexus/actions/runners -q '.runners[].name' # expect 🟢 Idle

make runner-ci-enable COUNT=2 [OWNER=youruser]

make runner-ci-disable [OWNER=youruser]

```
