프로젝트 소개
전체 클러스터를 Infrastructure-as-Code로 취급하는 개인 홈랩 저장소입니다. 스택은 k3s에서 실행되며, Ansible 플레이북, 역할(roles) 및 인벤토리가 편집 가능한 단일 진실 공급원(source of truth) 역할을 합니다. 렌더링된 Docker Compose 디렉토리는 Raspberry Pi 호스트에만 존재합니다. 이 저장소는 2026-08-14에 메인 서버 노드에서 Docker를 제거하며 Docker Compose에서 k3s로의 마이그레이션이 완료되었음을 기록하고 있으며, 단계별 기록은 아카이브 폴더에 이력으로 보관되어 있습니다.
세 대의 호스트가 설명되어 있습니다. daniel-box는 k3s 컨트롤 플레인이며 Traefik 엣지, Authelia SSO 및 OIDC 발행자, Pi-hole DNS, Longhorn 스토리지, CrowdSec, 공용 WireGuard 엔드포인트를 포함한 거의 모든 워크로드를 실행합니다. Ansible 또한 여기서 실행됩니다. daniel-server는 k3s 에이전트 노드로, Jellyfin/Tdarr 트랜스코딩을 위한 Intel iGPU, LVM 스토리지 및 UPS/NUT 종료 처리를 담당합니다. daniel-pi는 유일하게 남은 Docker 호스트로, LAN 전용으로 유지되며 두 번째 WireGuard 인스턴스와 소규모 유틸리티 스택을 실행합니다.
인그레스는 Traefik에 중앙 집중화되어 IngressRoute CRD를 통해 라우팅되며, Authelia가 forward-auth 미들웨어를 통해 보호된 경로를 제어하고 이를 지원하는 앱에 OIDC 토큰을 발행합니다. Cloudflare가 공용 호스트 이름을 프록시하고, 로컬 이름은 LAN의 Pi-hole에 의해 해석됩니다. README에는 네트워크 분할이 일괄적으로 강제되지 않음이 명시되어 있습니다. 일부 역할만 NetworkPolicies를 정의하며, 정책이 존재하는 경우에도 클러스터 CNI에 의해 인그레스 규칙만 강제됩니다.
배포는 Docker 플레이와 k8s 플레이로 나뉘며, 둘 다 각 호스트의 containers_list에 의해 구동됩니다. Docker 플레이는 커스텀 toposort 필터와 역할별 meta/deps.yml 상위 선언을 사용하여 의존성 그래프를 해결하므로, 의존성 서비스가 먼저 실행되고 태그된 실행 시 충족되지 않은 의존성을 함께 가져옵니다. k8s 플레이는 역할을 위상 정렬(toposort)하고, 역할 템플릿 자체에서 Traefik(CRD 설치용) 및 Authelia(미들웨어용)로의 엣지를 도출하며, 템플릿에 없는 엣지는 명시적인 depends_on을 사용합니다. 필터는 pre-commit 훅에서 pytest를 통해 단위 테스트됩니다. 단일 서비스 배포, 드라이 런, 전체 배포, Pi 타겟 배포 명령과 별도의 bring-up 및 bootstrap 플레이북이 문서화되어 있습니다.
공통 관심사로는 런타임에 복호화되는 SOPS/age 암호화 비밀값(pre-commit의 gitleaks 및 별도 키 백업 포함), 코드로 프로비저닝된 대시보드를 갖춘 Prometheus, Grafana, Loki, Tempo 관측성 스택, 볼륨별 티어링 및 재해 복구 절차가 문서화된 Backblaze B2로의 Longhorn 예약 백업, 고정된 이미지 버전 및 훅 리비전을 위한 Renovate 기반 풀 리퀘스트, 그리고 Authelia TOTP/OIDC, 노드별 에이전트를 갖춘 CrowdSec, fail2ban 및 UFW 기본 인바운드 거부 등의 보안 도구가 포함됩니다.
품질 게이트는 YAML/JSON 린트, ansible-lint, gitleaks, 렌더링된 템플릿 검증, 비밀값 로테이션 레지스트리 동기화, ruff 및 pytest를 포함하는 pre-commit 도구를 통해 실행됩니다. Deployment/Service/IngressRoute/PVC 매니페스트를 렌더링하는 k8s 역할 또는 Pi를 위한 Docker 역할로 새로운 서비스를 추가하는 방법에 대한 가이드가 포함되어 있습니다.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.