← All docs

Running a self-hosted GitHub Actions Runner

There's very little to it; you're following the GitHub instructions, but then doing a little bit of systemd work to make sure the runner keeps running.

First, create a new VM with ssh exe.dev new. This will create a new VM. SSH into it with ssh vmname.exe.xyz. The trickiest bit is to find the GitHub URLs. Replace the placeholders in the following:

Copy and paste the instructions from GitHub's instructions into your shell session. It's pretty quick and easy until "run.sh".

To make sure the runner restarts after a reboot, we can create a systemd service:

Create the service file at /home/exedev/actions-runner/gh-actions-runner.service:

cat > /home/exedev/actions-runner/gh-actions-runner.service << 'EOF'
[Unit]
Description=GitHub Actions Runner
After=network.target

[Service]
Type=simple
User=exedev
WorkingDirectory=/home/exedev/actions-runner
ExecStart=/home/exedev/actions-runner/run.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

Then copy the service file to systemd directory

sudo cp /home/exedev/actions-runner/gh-actions-runner.service /etc/systemd/system/

And start the service:

sudo systemctl daemon-reload
sudo systemctl enable --now gh-actions-runner.service

Verify the service is running

sudo systemctl status gh-actions-runner.service

gh-actions-runner.service - GitHub Actions Runner
     Loaded: loaded (/etc/systemd/system/gh-actions-runner.service; enabled; preset: enabled)
     Active: active (running) since Sun 2025-11-09 04:33:28 UTC; 41s ago
   Main PID: 1151 (run.sh)
      Tasks: 15 (limit: 2384)
     Memory: 93.2M (peak: 101.6M)
        CPU: 1.447s
     CGroup: /system.slice/gh-actions-runner.service
             /bin/bash /home/exedev/actions-runner/run.sh
             /bin/bash /home/exedev/actions-runner/run-helper.sh
             /home/exedev/actions-runner/bin/Runner.Listener run

Nov 09 04:33:30 ...exe.dev run.sh[1159]: Connected to GitHub
Nov 09 04:33:31 ...exe.dev run.sh[1159]: Current runner version: '2.329.0'
Nov 09 04:33:31 ...exe.dev run.sh[1159]: 2025-11-09 04:33:31Z: Listening for Jobs

You're all set!