HomeLab Infrastructure

HomeLab Infrastructure

유휴 노트북 한 대로 시작한 홈서버를, 베어메탈 미니PC + Proxmox + 멀티노드 Kubernetes + ArgoCD GitOps 파이프라인으로 발전시켜 운영했던 인프라입니다. 2026년 10월 운영을 종료하고, 호스팅하던 블로그·위키는 Cloudflare Pages로 이전했습니다.
담당: 하드웨어 구성, Proxmox/K8s 클러스터 구축, GitOps 파이프라인 구성, 운영, 이전

1. Overview

운영 종료 (2026.10)
이 홈랩은 2026년 10월에 운영을 종료했습니다. 블로그(kpryu.cloud)와 위키(wiki.kpryu.cloud)는 Cloudflare Pages로 옮겨 계속 서비스하고 있으며, 아래 내용은 운영 당시의 구성 기록입니다. 이전 과정은 아래 7. Retirement에 정리했습니다.

유휴 노트북 한 대로 Nginx + Self-hosted Runner 기반 CI/CD 서버를 구축한 것을 시작으로, 이후 미니PC(Ryzen 7 4700U, 16GB RAM)에 Proxmox VE 하이퍼바이저를 설치하고 멀티 노드 Kubernetes 클러스터로 발전시켰습니다.

운영 기간 동안 GitHub Actions(CI) + ArgoCD(CD) + Kustomize 기반 GitOps 파이프라인으로, 코드 푸시만으로 도커 이미지 빌드부터 프로덕션 배포까지 완전 자동화했습니다.


2. Phase 1: Idle Laptop CI/CD Server

Home-Server Architecture

Home Server Architecture

Home-Server CICD Architecture

Architecture of the self-hosted CI/CD pipeline

  • GitHub Actions Self-hosted Runner를 이용해 60초 안에 빌드-배포가 완료되는 CI/CD 파이프라인 구축
  • Nginx로 정적 사이트 호스팅, rsync --delete로 변경 파일만 동기화
  • TLS(Let’s Encrypt, SSL Labs A+), iptables 기본 DROP, Fail2Ban, Google OTP 2FA. 이 구성은 Phase 2로 넘어오며 Kubernetes 기반으로 대체됨

3. Phase 2: Proxmox K8s GitOps Platform (~2026.10)

Architecture


HomeServer

User → Public IP (kpryu.cloud, Cloudflare DNS + DDNS)
     → LG U+ Router (Port Forwarding 80/443)
     → MetalLB VIP (192.168.219.240)
     → Nginx Ingress Controller
     → Services (kpryu.cloud, wiki.kpryu.cloud, lab.kpryu.cloud)

Infrastructure Layer

구성요소기술
HypervisorProxmox VE 9.x
K8sMulti-node cluster (1 Master + 2 Worker)
Load BalancerMetalLB (L2 mode)
IngressNginx Ingress Controller
TLScert-manager + Let’s Encrypt, Cloudflare DNS-01 와일드카드 (자동 갱신)
DNSCloudflare DNS + 클러스터 내 DDNS 파드(공인 IP 갱신), Pi-hole(집 안 Split-Horizon)
VPNTailscale (원격 관리)

CI/CD Pipeline (GitOps)

단계도구
SourceGitHub Monorepo (paths 필터로 독립 빌드)
BuildGitHub Actions Self-hosted Runner (AMD64 VM)
RegistryDocker Hub
ManifestKustomize (별도 매니페스트 레포)
DeployArgoCD (Pull-based Sync)

Hosted Applications

서비스프레임워크경로
Main BlogJekyll (Hydejack)kpryu.cloud
Tech WikiHugo (PaperMod)wiki.kpryu.cloud
HomeLab DashboardHomepage (gethomepage)lab.kpryu.cloud, LAN .242

4. Key Troubleshooting

#이슈원인해결
1Exit 139 (Segfault)Alpine musl libc vs Ruby C 확장 충돌Debian-slim 멀티 스테이지 빌드로 전환
2cert-manager 무한 PendingNAT Loopback - 공유기가 내부→공인IP→내부 차단CoreDNS에 Split-Horizon DNS 적용
3exec format errorMac(ARM64)에서 빌드 → 서버(AMD64) 불일치Self-hosted Runner VM에서 네이티브 빌드
4Nginx 403 on sub-pathIngress /wiki 경로와 컨테이너 내부 경로 불일치Docker COPY 목적지를 /html/wiki로 조정
5ArgoCD repo-server Unknown네트워크 순단으로 파드 좀비 상태--force --grace-period=0 강제 삭제 후 재동기화
6Dynamic IP TimeoutISP IP 변경 + DDNS 갱신 누락수동 갱신 후 Cloudflare DDNS 파드로 자동화 (2026-09)
7Ingress 어노테이션 거부ingress-nginx 웹훅이 permanent-redirect의 $request_uri 거부구 도메인 301을 앱 컨테이너 nginx에서 처리

5. Security

영역적용 내용
TLScert-manager + Let’s Encrypt, DNS-01 와일드카드 (자동 갱신)
노출 범위공개: 포트폴리오, 위키, 대시보드 / LAN 전용: ArgoCD, Proxmox, Pi-hole
대시보드 권한공개 대시보드의 K8s 위젯은 노드 메트릭만 읽는 ServiceAccount
시크릿Cloudflare API 토큰은 존 하나로 범위 제한, git 밖에서 Secret으로만 주입
원격 접근Tailscale (pve 호스트, subnet route)

6. Results

지표Phase 1Phase 2
배포 시간60초 (rsync)~3분 (GitOps 자동)
인프라노트북 1대, NginxProxmox + K8s 3노드
서비스블로그 1개블로그 + 위키 + 대시보드
무중단 갱신nginx reload (0초)Ingress 무중단 설정 변경 반영
클라우드 비용추가 비용 없음추가 비용 없음 (자가 호스팅, 전기/장비 비용 별도)
SSLCertbot A+cert-manager 자동 갱신

7. Retirement: Cloudflare Pages 이전

미니PC를 다른 용도로 쓰게 되면서 홈랩 운영을 종료했습니다. 외부에 공개하던 서비스는 정적 사이트였기 때문에, 서버 없이 운영할 수 있는 Cloudflare Pages로 옮겼습니다.

항목홈랩 (Phase 2)이전 후
빌드Self-hosted Runner에서 Docker 이미지 빌드GitHub-hosted Runner에서 jekyll build / hugo build
배포매니페스트 태그 갱신 → ArgoCD Syncwrangler pages deploy로 Cloudflare Pages에 직접 업로드
DNSCloudflare A 레코드 + 클러스터 DDNS 파드Pages 커스텀 도메인 (Cloudflare 관리)
TLScert-manager DNS-01 와일드카드Cloudflare 관리 인증서
서비스블로그 + 위키 + 대시보드블로그 + 위키 (대시보드는 종료)
  • 무중단 전환: *.pages.dev에서 먼저 검증하고, DDNS 대상에서 도메인을 뺀 뒤 DNS를 전환한 다음, 마지막으로 클러스터 리소스를 정리하는 순서로 진행
  • 정리: Docker 빌드 파일, 이미지 태그를 갱신하던 PAT 등 더 이상 쓰지 않는 시크릿과 홈 DNS(Pi-hole) 의존성 제거

8. Used Skills

  • Proxmox VE
  • Kubernetes (K3s → kubeadm)
  • MetalLB, Nginx Ingress Controller
  • cert-manager, Let’s Encrypt
  • GitHub Actions (Self-hosted Runner)
  • ArgoCD, Kustomize
  • Docker (Multi-stage Build)
  • Jekyll, Docusaurus, Nginx
  • Pi-hole (DNS), Tailscale (VPN)
  • iptables, Fail2Ban, Google OTP
  • DDNS (No-IP → Cloudflare)
  • Cloudflare Pages, Wrangler
  • Prometheus, Grafana