Solution

VPS for self-hosted CI/CD runners (GitHub Actions, GitLab, Woodpecker)

Cutter 16 · $62/moClipper 16 · $92/mo
Short answer

Self-hosted runners pay for themselves quickly: a Cutter 16 at $62 a month replaces several thousand hosted CI minutes and builds faster because the cache is local. Four to six dedicated cores and 16 GB handle most build matrices. Use NVMe — dependency installation and container layer extraction are almost entirely IO-bound.

What you need

Specification floor for ci/cd runners
ResourceWhat you actually need
CPU4–8 dedicated cores; builds parallelise well
RAM16 GB for a typical matrix, 32 GB for large monorepos
Disk320 GB NVMe — caches, images and artefacts accumulate
KernelNested virtualisation for container and VM-based jobs

Recommended plans

Cutter

Cutter 16

$ 62 /month
vCPU
6 × dedicated
RAM
16 GB
Storage
320 GB NVMe SSD
Transfer
15 TB
IPv4 / IPv6
1 / /64 routed
Configure
Clipper

Clipper 16

$ 92 /month
vCPU
8 × dedicated
RAM
16 GB
Storage
400 GB NVMe Gen4 SSD
Transfer
30 TB
IPv4 / IPv6
1 / /64 routed
Configure
Clipper

Clipper 32

$ 174 /month
vCPU
12 × dedicated
RAM
32 GB
Storage
800 GB NVMe Gen4 SSD
Transfer
40 TB
IPv4 / IPv6
1 / /64 routed
Configure

Recommended locations

Location is usually the decision that matters most for this workload — either because latency dominates, or because jurisdiction does.

Why OnionVPS for this

  • Nested virtualisation means Docker-based and VM-based jobs both work.
  • Local dependency caches on NVMe cut typical build times substantially versus a cold hosted runner.
  • Flat monthly pricing instead of per-minute billing that punishes a busy week.
  • No account verification, so a runner can be provisioned by a script at three in the morning.

How to set it up

  1. Deploy a Cutter 16 with Ubuntu 24.04

    Six cores and 16 GB covers most projects.

  2. Install the runner agent

    GitHub Actions runner, gitlab-runner, or Woodpecker depending on your forge.

  3. Run jobs in ephemeral containers

    A fresh container per job stops one build poisoning the next.

  4. Persist the package caches outside the container

    Mount host directories for npm, cargo, pip and Docker layers.

  5. Register the runner and tag it

    Tags let you route heavy jobs here and leave light ones on hosted runners.

Frequently asked questions

Is a self-hosted CI runner cheaper than hosted minutes?

Almost always past a few thousand minutes a month. A $62 instance runs continuously; hosted CI bills by the minute and re-downloads dependencies on every cold start.

Can I run Docker builds on a self-hosted runner?

Yes. Nested virtualisation and full root mean buildx, Docker-in-Docker and rootless builds all work.

Are self-hosted runners safe for public repositories?

Only with ephemeral, isolated runners. A public repository can execute arbitrary code from a pull request, so never give such a runner access to secrets or your internal network.