
Self-hosting GitHub Runner the easy way
Yulei ChenGitHub Actions is one of the most popular CI/CD platforms out there, but the hosted runners come with limits. Free plans cap you at 2,000 minutes per month, and paid plans charge per minute. If you're running lots of workflows, those costs add up quickly.
Sliplane lets you deploy a self-hosted GitHub Actions runner in minutes. You get unlimited CI/CD minutes for a flat monthly price, with no server setup or maintenance required.
Prerequisites
Before deploying, you need:
- A Sliplane account (free trial available)
- A GitHub Personal Access Token (PAT) with the
reposcope (for repository-level runners) oradmin:orgscope (for organization-level runners)
To create a PAT, go to GitHub Settings > Developer settings > Personal access tokens and generate a new token with the required scope.
Quick start
Sliplane provides one-click deployment with presets.
- Click the deploy button above
- Fill in your
ACCESS_TOKEN(GitHub PAT) andREPO_URL(e.g.https://github.com/your-org/your-repo) - Select a server (If you just signed up you get a 48-hour free trial server)
- Click Deploy!
After deployment, the runner automatically registers itself with your GitHub repository. You can verify it under Settings > Actions > Runners in your GitHub repo.
About the preset
The one-click deploy above uses Sliplane's GitHub Runner preset. Here's what it includes:
- Uses the myoung34/github-runner Docker image (version 2.334.0)
- Persistent storage mounted at
/runnerso work data survives restarts - Pre-configured for repository-level runners (
RUNNER_SCOPE=repo) - Default label
self-hostedso you can target this runner in your workflows - Runner name prefix set to
sliplane-runnerfor easy identification
This is a non-public service since the runner only makes outbound connections to GitHub. It doesn't expose any HTTP endpoints.
Next steps
Once the runner is deployed, it will register with GitHub and start polling for jobs. You can target it in your workflow files by using the self-hosted label:
jobs:
build:
runs-on: self-hosted
steps:
- uses: actions/checkout@v4
- run: echo "Running on my self-hosted runner!"
Environment variables
Here are the key environment variables you can customize in your service settings on Sliplane:
| Variable | Default | Description |
|---|---|---|
ACCESS_TOKEN | (required) | GitHub Personal Access Token |
REPO_URL | (required) | Repository URL, e.g. https://github.com/org/repo |
RUNNER_SCOPE | repo | Set to org for organization-level runners |
ORG_NAME | (empty) | Required when RUNNER_SCOPE is org |
RUNNER_NAME_PREFIX | sliplane-runner | Prefix for the runner name in GitHub |
LABELS | self-hosted | Comma-separated labels for targeting in workflows |
RUNNER_WORKDIR | /runner/work | Working directory for job execution |
Organization-level runners
To register the runner at the organization level instead of a single repository:
- Set
RUNNER_SCOPEtoorg - Set
ORG_NAMEto your GitHub organization name - Make sure your PAT has the
admin:orgscope
Custom labels
You can add custom labels to target specific runners in your workflows. Set the LABELS variable to a comma-separated list, for example: self-hosted,linux,sliplane. Then use those labels in your workflow:
jobs:
build:
runs-on: [self-hosted, sliplane]
Logging
The runner logs are available directly in Sliplane's built-in log viewer. You'll see registration messages, job pickups, and execution output. For tips on working with Docker logs, check out our guide on how to use Docker logs.
Cost comparison
You can also self-host a GitHub Actions runner with other cloud providers. Here is a pricing comparison for the most common ones:
| Provider | vCPU | RAM | Disk | Monthly Cost | Note |
|---|---|---|---|---|---|
| Sliplane | 2 | 2 GB | 40 GB | €9 (~$10.65) | Flat rate, 1 TB bandwidth, SSL included |
| Fly.io | 2 | 2 GB | 40 GB | ~$18 | Disk and bandwidth billed separately |
| Render | 1 | 2 GB | 40 GB | ~$35 | 100 GB bandwidth, Disk billed separately |
| Railway | 2 | 2 GB | 40 GB | ~$67 + $20 plan | Pro plan floor, usage-based, bandwidth billed separately |
Click here to see how these numbers were calculated.
(Assuming an always-on instance running 730 hrs/month)
- Sliplane: flat €9/month for the Base server. Unlimited services on the same server, 1 TB egress and SSL included.
- Fly.io:
shared-cpu-2x2 GB = $11.83/mo + 40 GB volume × $0.15/GB = $6 -> ~$17.83/mo. Egress billed separately ($0.02/GB in EU). - Render: closest match is Standard ($25, 1 vCPU / 2 GB) plus 40 GB disk × $0.25/GB = $10 -> ~$35/mo. Stepping up to Pro (2 vCPU / 4 GB) costs $85/mo + disk.
- Railway (Pro plan): CPU 2 × $0.00000772/s × 2,628,000 s = $40.57; RAM 2 × $0.00000386/s × 2,628,000 s = $20.29; volume 40 × $0.00000006/s × 2,628,000 s = $6.31 -> ~$67/mo compute, plus the $20/mo Pro plan floor and $0.05/GB egress.
Bandwidth costs can add up fast on usage-based providers. Use our bandwidth cost comparison tool to see what your egress would cost on each platform.
FAQ
How does a self-hosted runner compare to GitHub-hosted runners?
GitHub-hosted runners are convenient but limited. You get 2,000 free minutes per month on the Free plan, and each additional minute costs $0.008 (Linux). With a self-hosted runner on Sliplane, you pay a flat €9/month and get unlimited minutes. Self-hosted runners also give you full control over the environment, pre-installed tools, and access to private network resources.
Can I run multiple runners on the same server?
Yes. On Sliplane, you can deploy multiple runner services on the same server. Each one registers as a separate runner with GitHub. Just give each service a different RUNNER_NAME_PREFIX so they don't collide. Since Sliplane charges per server (not per service), running multiple runners on the same server doesn't cost extra.
How do I update the runner?
Change the image tag in your service settings on Sliplane and redeploy. Check Docker Hub for the latest stable version. The runner will re-register with GitHub automatically after the update.
Are there alternatives to self-hosted GitHub runners?
If you're looking for managed CI/CD, options include GitLab CI, CircleCI, and Buildkite. If you want to self-host your entire Git platform, check out how to deploy Gitea or Forgejo on Sliplane.
Can I use Docker-in-Docker with this runner?
The default Sliplane preset does not mount the Docker socket, so Docker commands inside your workflows won't work out of the box. If your CI/CD workflows only run scripts, tests, or builds (without needing Docker), the runner works perfectly. For workflows that need Docker (like building images), you'd need to set up a [VPS with Docker socket access](/blog/Building a Pipeline to Deploy Docker Containers to a VPS) instead.