// self-managed gitlab
Your instance came with CI and no runners. Get dedicated build compute registered against your own GitLab in about four minutes, without installing or patching a single machine.
48-hour free trial · works with GitLab CE and EE
// the missing piece
You installed GitLab, the CI/CD section is right there in the sidebar, and your first pipeline sat pending until it timed out. Nothing is broken. A self-managed instance gives you the whole CI/CD system and none of the machines that execute it.
GitLab's shared runners belong to GitLab.com. They are a hosted service, not part of the software you installed, and they do not come across when you run your own instance. That is why the runners page on a fresh install is empty, and why every pipeline you write stays queued until you supply compute yourself.
So somewhere between installing GitLab and shipping anything through it, there is a job nobody told you about: find a machine, install GitLab Runner on it, register it against your instance, choose an executor, and then keep that machine alive and patched for as long as you use CI. RocketRunner does that part for you, against your instance, while everything else stays where you put it.
// why it's empty
You run your own GitLab for a reason. A client contract, an auditor's question about where source lives, a policy about company code on someone else's SaaS. Whatever it was, it was almost certainly not a wish to maintain build machines. That part came attached.
It is worth separating them, because they are genuinely different questions. Where the repository lives is what compliance cares about: source, full history, issues, merge requests, access control, backups. That is the system of record, and it is what a data residency clause is written against.
Where builds run is infrastructure. A runner clones a repo, executes a job, reports back, and holds nothing permanently. Most teams answer both questions at once, keep both, and then spend their Tuesdays on the second one. Keeping the instance in-house and renting the compute is a supported combination, not a compromise.
// your options
Every self-hosting team solves this one of three ways. All three work. They differ in how much of your attention they keep asking for after the first pipeline goes green.
A box and a package manager
Setup
Install, register, configure executor
Time to first green pipeline
An afternoon, if nothing surprises you
Who patches the machine
You, forever
Isolation between clients
One box, shared unless you build more
When a contract ends
Remember to decommission it
Real cost
Server, plus your Tuesdays
Kubernetes, autoscaling, IaC
Setup
Terraform or scripts you write
Time to first green pipeline
Days, then it's repeatable
Who patches the machine
You, forever
Isolation between clients
Whatever you engineered
When a contract ends
Destroy the stack, hope it's clean
Real cost
Server, plus the platform you built
RocketRunner
Setup
Connect instance, pick a size
Time to first green pipeline
About 3 to 4 minutes
Who patches the machine
We do
Isolation between clients
One VM per runner, by default
When a contract ends
Delete the runner, billing stops
Real cost
Per-minute, capped monthly
Installing one runner on a spare server is genuinely the cheapest option on day one, and for a single project that never changes it may stay that way. The cost shows up later, in upgrades you postpone, disks that fill with old build caches, and the one machine everybody has forgotten how to rebuild.
Building a fleet is the right answer at real scale, and if you already run Kubernetes you probably should. It is a platform project, though, with a platform project's maintenance. Renting sits in between: the isolation of your own machine, none of the lifecycle.
// how it works
The connection runs the same way it does for GitLab.com, except the authorization happens on your server. You stay the identity provider throughout.
01
Enter your GitLab URL. It needs to be reachable on public https, which covers most company and agency instances.
02
An admin creates an OAuth application on your instance once, or you use a personal access token. The credentials stay on your side.
03
A dedicated VM comes online, installs the runner, and registers it against your instance. Your next pipeline picks it up.
The OAuth application lives on your GitLab. You created it, you can see it in your admin area, and you can revoke it there without asking us or waiting for a support ticket. If you would rather not create an application at all, a personal access token works too.
From there the runner behaves like any other runner registered against your instance. It shows up on your runners page, respects your tags, and runs the jobs you point at it. Delete it from RocketRunner and the VM is destroyed and billing stops the same minute.
// when this doesn't fit
Your GitLab has to be reachable from the runner over the public internet, on https, with a valid certificate. That is not a preference, it is how the connection works: the runner polls your instance for jobs and we call your instance's API to register it. Instance URLs that resolve to private or internal addresses are rejected.
That covers most self-managed instances at companies and agencies, which sit on a real domain behind a real certificate. It does not cover an air-gapped instance, a VPN-only instance, or one bound to a private network. If that is you, keep running runners inside your perimeter. No hosted runner service can help, and any that claims otherwise is worth a second look.
The other honest point: a runner clones your source in order to build it. That is true of every runner ever created, including the one you would install yourself. What differs is the machine. A shared runner is multi-tenant, on hardware you did not choose, after work you cannot see. A dedicated runner is a single-tenant VM in a region you picked, used by nobody else, and destroyed on deletion. That is a posture you can describe to a client security review.
// the case this fits best
Agencies and consultancies hit this hardest, because the problem repeats per client. Run work for eight clients, several on their own GitLab instances, and self-assembly means eight runner fleets, eight sets of credentials, eight machines to patch, and an uncomfortable question every time an engagement ends about what is still sitting on that box.
One isolated runner per client, billed separately and destroyed at the end of the contract, is a much cleaner story for you and for your client's security review. That kind of isolation is difficult to retrofit and easy to get subtly wrong, which is exactly the sort of thing worth not building yourself.
// pricing
Nothing here is tied to your GitLab licence or your seat count, because your instance stays entirely yours. You are paying for a machine and the work of keeping it alive.
CI/CD Runner
// ci-cd
from
/hr
per minute, capped monthly by size
Persistent Docker layer caches
Cheaper than GitLab CI minutes
EU & US regions
// server sizes
Small
4 GB · 2 vCPU · 40 GB
$0.018/hr
≤ $10.59/mo
Medium
8 GB · 4 vCPU · 160 GB
$0.049/hr
≤ $28.89/mo
Large
16 GB · 8 vCPU · 240 GB
$0.076/hr
≤ $45.12/mo
AI Agent Runner
// agent
/hr
capped at ~$21/mo
Bring your own Claude subscription or API key
Code stays on your private server
Delete anytime, billing stops
// no per-seat tax
Point your own Claude subscription at every project on the runner. No AI seats to buy.
// faq
No. A self-managed GitLab instance, Community or Enterprise Edition, installs the CI/CD system but no runners at all. GitLab's shared runner fleet belongs to GitLab.com and is not part of the package you install. Until you register at least one runner, every pipeline you define sits pending and nothing executes it.
One click to set up on your own private runner. Flat, capped pricing. 48-hour free trial.