Skip to main content

🧠 Homelab Overview

A local-first infrastructure built for privacy and performance. Production and development environments are fully isolated on separate nodes. Public traffic routes through a VPS tunnel via Tailscale, keeping the home IP address private.

🏗️ Infrastructure Overview

  • 4 homelab nodes + 1 VPS for public ingress
  • Ubuntu 24.04 LTS (Noble Numbat) on all systems
  • Docker Engine 28.3.x in standalone mode
  • Portainer CE 2.24.1 for centralized management
  • Tailscale VPN tunnels traffic securely
  • Caddy on VPS handles TLS and reverse proxy
  • Home IP never exposed - all traffic via VPS tunnel

🖥️ Hardware Fleet

The cluster consists of 4 homelab nodes plus a cloud VPS:

johnsen-ci-01
Portainer Manager
AZW MINI S • Intel N100 • 4 cores • 16GB DDR4
johnsen-ci-02
Development / Previews
AZW MINI S • Intel N100 • 4 cores • 16GB DDR4
johnsen-ci-03
Production
AZW MINI S • Intel N100 • 4 cores • 16GB DDR4
johnsen-ci-04
CI Runners
HP Elite SFF 600 G9 • Intel i9-12900K • 24 threads • 64GB DDR5
ingress-01
Public Ingress (VPS)
DigitalOcean Droplet • 1 vCPU • 1GB RAM • NYC Region

🚀 GitHub Actions

Self-hosted runners for CI/CD workflows:

  • 6 runners on ci-04 only (mini PCs host services)
  • Organization-level runners (johnsenai org)
  • Ephemeral containers for security
  • Playwright pre-installed with browser cache
  • Labels: self-hosted, johnsen-ci-04, linux, x64
  • Image: myoung34/github-runner:ubuntu-noble
GitHub Actions Docker Playwright

🐳 Container Platform

  • Docker Engine 28.3.x on all nodes
  • Standalone mode (no Swarm orchestration)
  • 28 containers running across the cluster
  • Compose-based stack deployments via Portainer
  • Registries: Docker Hub + GitHub Container Registry
Docker Standalone BuildKit

🎛️ Management Platform

Portainer CE 2.24.1 provides centralized control:

  • Server on ci-01, agents on ci-02/03/04
  • Web UI on port 9443 (HTTPS)
  • Agent communication on port 9001
  • Compose stack deployment (standalone mode)
  • Container logs, stats, and monitoring
Portainer CE TLS Agents

Cluster Resources

Aggregate capacity across homelab + VPS:

  • Homelab CPU: 28 cores / 36 threads
  • Homelab RAM: 112 GB
  • Homelab Storage: 3.8 TB
  • VPS: 1 vCPU / 1 GB RAM
  • GitHub Runners: 6 concurrent
  • Network: 1 Gbps per homelab node
High Performance Hybrid Cloud

🔧 Key Services

Isolated environments with independent routing:

  • Caddy - Public reverse proxy (ingress-01 VPS)
  • Traefik - Preview routing (ci-02)
  • Nginx - Production static site (ci-03:8080)
  • Preview Dashboard - dev.johnsen.ai (ci-02)
  • Stats Agents - Metrics collection (all nodes)
  • Tailscale - VPN tunnel (ci-01, ci-02, ci-03, VPS)
  • BuildKit - Docker image builds (ci-04)
Caddy Traefik Tailscale

🌐 Network & Access

  • VPS Tunnel - Public traffic via Tailscale
  • No home ports exposed to internet
  • johnsen.ai → VPS → ci-03 (production)
  • *.dev.johnsen.ai → VPS → ci-02 (previews)
  • On-demand TLS for wildcard subdomains
  • Firewall: UFW on all nodes + VPS
Tailscale UFW WireGuard

🔒 VPS Security

Hardened VPS ingress with defense in depth:

  • Fail2ban - Automatic IP blocking for SSH attacks
  • Unattended Upgrades - Auto security patches
  • UFW Firewall - Only SSH/HTTP/HTTPS open
  • Reserved IP - Stable public address
  • WireGuard - Encrypted tunnel to homelab
  • Home IP never exposed publicly
Fail2ban UFW Auto Updates
Back to Research