Self-hosting GitHub Runner the easy way

Self-hosting GitHub Runner the easy way

Yulei Chen - Content-Engineerin bei sliplane.ioYulei Chen
6 min

GitHub 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 repo scope (for repository-level runners) or admin:org scope (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.

SliplaneDeploy GitHub Runner >
  1. Click the deploy button above
  2. Fill in your ACCESS_TOKEN (GitHub PAT) and REPO_URL (e.g. https://github.com/your-org/your-repo)
  3. Select a server (If you just signed up you get a 48-hour free trial server)
  4. 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 /runner so work data survives restarts
  • Pre-configured for repository-level runners (RUNNER_SCOPE=repo)
  • Default label self-hosted so you can target this runner in your workflows
  • Runner name prefix set to sliplane-runner for 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:

VariableDefaultDescription
ACCESS_TOKEN(required)GitHub Personal Access Token
REPO_URL(required)Repository URL, e.g. https://github.com/org/repo
RUNNER_SCOPErepoSet to org for organization-level runners
ORG_NAME(empty)Required when RUNNER_SCOPE is org
RUNNER_NAME_PREFIXsliplane-runnerPrefix for the runner name in GitHub
LABELSself-hostedComma-separated labels for targeting in workflows
RUNNER_WORKDIR/runner/workWorking directory for job execution

Organization-level runners

To register the runner at the organization level instead of a single repository:

  1. Set RUNNER_SCOPE to org
  2. Set ORG_NAME to your GitHub organization name
  3. Make sure your PAT has the admin:org scope

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:

ProvidervCPURAMDiskMonthly CostNote
Sliplane22 GB40 GB€9 (~$10.65)Flat rate, 1 TB bandwidth, SSL included
Fly.io22 GB40 GB~$18Disk and bandwidth billed separately
Render12 GB40 GB~$35100 GB bandwidth, Disk billed separately
Railway22 GB40 GB~$67 + $20 planPro 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-2x 2 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.

Self-host GitHub Runner now - It's easy!

Sliplane gives you all the tools you need to run a self-hosted GitHub Actions runner without server hassle.