About Professional
How I Build How I Build Meet the Team
Technology Homelab App Showcase Case Studies
Maverick & Luke Say Hello

Case study · April–May 2026

Building Push-to-Deploy CI/CD for a Whole Self-Hosted App Fleet

I replaced per-app manual SSH-and-restart deploys with a self-hosted CI runner and a small set of canonical per-architecture workflow templates, so a push to the dev branch auto-syncs and restarts the app, and rolled it across a heterogeneous app fleet with narrowly-scoped runner privileges and a fail-loud secrets pattern.


The challenge

I run a self-hosted homelab. Deploys to the development server were fully manual: for every app, I opened a terminal, SSH'd in, cd'd to the app directory, pulled the branch, and restarted the service, a per-app runbook that scaled linearly with the app count. Two earlier automation attempts (webhooks and cron SSH polling) had failed and been abandoned. And the fleet was growing, so the manual toil kept getting worse.

The box also has an unusual constraint that shapes everything: it runs the dev branch as its live environment (automated pushes only ever target dev; the main branch is reserved for promotion to the real production machines).

The goal: stand up push-to-deploy across the whole fleet. A push to dev should automatically sync the code and restart the service, with a repeatable, documented per-app bootstrap so every new and existing app conforms to one canonical pattern rather than a hand-improvised workflow.

Approach: "template the pipeline per architecture; scope the runner narrowly"

Results

What this demonstrates