# Castaldi Family Homelab > **A GitOps-managed, Ansible-automated infrastructure running media services, container orchestration, and hypervisor management across distributed ARM and x86 nodes.** [![GitOps](https://img.shields.io/badge/GitOps-Komodo-blue?style=flat-square)](https://komo.do) [![Automation](https://img.shields.io/badge/Automation-Ansible-red?style=flat-square)](#automation) [![Infrastructure](https://img.shields.io/badge/Infrastructure-Multi--Node-green?style=flat-square)](#architecture) [![Documentation](https://img.shields.io/badge/Docs-KBAs%20%2B%20SOPs-orange?style=flat-square)](documentation/) --- ## πŸš€ Why This Homelab? - **Zero-Touch Deployments:** Push to Git β†’ Auto-deploy via webhooks β†’ Containers update automatically - **Ansible Automation:** All nodes managed by Ansible from watchtower control plane - **Infrastructure as Code:** Services defined in `compose.yaml` + infrastructure managed with Ansible playbooks - **GPU Transcoding:** Hardware-accelerated media streaming with NVIDIA GTX 1060 Mobile - **Distributed Architecture:** Services across physical servers with Proxmox hypervisor ready for VM deployment - **Self-Hosted Git:** No external dependenciesβ€”Gitea runs on-premise with automated backups - **Production-Grade Networking:** Traefik reverse proxy with automatic SSL (Cloudflare DNS challenge) - **Hypervisor Management:** Proxmox VE ready for VM orchestration with automated post-install configuration --- ## πŸ—οΈ Architecture ```mermaid graph TB subgraph Internet CF[Cloudflare DNS] end subgraph "Heimdall - Physical Server (10.0.0.151)" Traefik[Traefik Reverse Proxy
:80, :443] Komodo[Komodo Core
Container Orchestrator] Gitea[Gitea
Self-Hosted Git] Redis[Redis Cache] Trek[Trek] Vault[Vaultwarden] end subgraph "Waldorf - Physical Server (10.0.0.251)" Plex[Plex Media Server
GPU Transcoding] Tunarr[Tunarr
IPTV Channels] GPU[NVIDIA GTX 1060 Mobile
6GB VRAM] KomodoW[Komodo Periphery] end subgraph "Watchtower - Physical Server (10.0.0.200)" Ansible[Ansible Control Node
Infrastructure Automation] KomodoP[Komodo Periphery] VSCode[VS Code Server] end subgraph "PVE01 - Physical Server (10.0.0.201)" PVE[Proxmox VE 9.1.7
Hypervisor Platform] end subgraph "TerraMaster NAS (10.0.0.250)" NFS[NFS Storage
Volume1: /appdata
Volume2: /media] end CF -->|HTTPS| Traefik Traefik --> Gitea Traefik --> Komodo Traefik --> Plex Traefik --> Tunarr Komodo <-->|WebSocket| KomodoW Komodo <-->|WebSocket| KomodoP Gitea -->|Webhook| Komodo Ansible -.->|SSH| PVE Ansible -.->|SSH| Traefik Ansible -.->|SSH| Plex Plex --> GPU Tunarr --> GPU Traefik -.->|NFS v4| NFS Plex -.->|NFS v4| NFS Ansible -.->|NFS v3| NFS style NFS fill:#f9a825,color:#000 style PVE01 fill:#e57000,color:#fff ``` --- ## πŸ“¦ Infrastructure Inventory | Node | IP | Hardware | Platform/OS | Role | Services | |------|------|----------|----------|------|----------| | **PVE01** | `10.0.0.201` | Physical Server
Intel i5-13500T (14c), 15GB RAM | Proxmox VE 9.1.7 | Hypervisor | VM orchestration platform | | **Heimdall** | `10.0.0.151` | Physical Server
Intel N100 (4c), 15GB RAM | Ubuntu 24.04 | Core Services | Komodo Core, Gitea, Traefik, Redis, Trek, Vaultwarden | | **Waldorf** | `10.0.0.251` | Physical Server
i7-7820HQ (8c), GTX 1060, 16GB | Ubuntu 24.04 | Media Processing | Plex, Tunarr (GPU transcoding), Komodo Periphery | | **Watchtower** | `10.0.0.200` | Physical Server
ARM Cortex-A76 (4c), 16GB | Debian Trixie | Control Plane | Ansible, Komodo Periphery, VS Code Server | | **TerraMaster** | `10.0.0.250` | NAS | TOS | Shared Storage | NFS (Volume1: `/appdata`, Volume2: `/media`) | --- ## ⚑ Quick Start ### Prerequisites - SSH access to nodes - Git configured with credentials: ```bash git config --global credential.helper wincred # Windows git config --global core.autocrlf true ``` ### Clone & Deploy ```bash # Clone from self-hosted Gitea git clone https://git.castaldifamily.com/nathan/homelab.git cd homelab # Deploy a service (via Komodo UI or SSH) ssh chester@10.0.0.251 cd /etc/komodo/stacks/tunarr docker compose up -d ``` ### Automated GitOps Workflow 1. **Edit** `nodes/{node}/{service}/compose.yaml` locally 2. **Commit** and push to Gitea: `git add . && git commit -m "feat: update service" && git push` 3. **Webhook** triggers Komodo Core (heimdall) 4. **Auto-deploy** pulls latest code and restarts containers 5. **Monitor** via Komodo UI at `http://10.0.0.151:9000` --- ## βš™οΈ Automation ### Ansible Control Plane **Watchtower** (10.0.0.200) manages all infrastructure via Ansible: ```bash # SSH into control node ssh chester@10.0.0.200 cd ~/homelab/ansible # Test connectivity to all nodes ansible all -m ping # Gather live system facts ansible-playbook playbooks/gather-node-facts.yml # Deploy Proxmox post-install config ansible-playbook playbooks/onboard-proxmox.yml --limit pve01 # Run commands across node groups ansible docker_nodes -m command -a "docker ps" ansible proxmox_cluster -m command -a "pveversion" ``` ### Managed Node Groups ```yaml control_plane: watchtower docker_nodes: heimdall, waldorf proxmox_cluster: pve01 nfs_clients: heimdall, waldorf core_services: heimdall media_services: waldorf ``` --- ## 🎯 Active Missions > **Traffic Light System:** 🟒 Complete | 🟑 In Progress | πŸ”΄ Blocked | Status | Mission | Details | |--------|---------|---------| | 🟒 | **Komodo GitOps** | All stacks migrated to Git sources with webhook automation | | 🟒 | **GPU Transcoding** | GTX 1060 Mobile accessible in Plex/Tunarr containers | | 🟒 | **Documentation Structure** | KBAs and SOPs organized in `documentation/` | | 🟒 | **Ansible Automation** | All 4 nodes onboarded and managed by Ansible from Watchtower | | 🟒 | **Proxmox Post-Install** | PVE01 configured: subscription nag removed, repos optimized | | 🟑 | **Hardware Transcoding Validation** | Monitor Plex for `(hw)` indicator during active streams | | 🟒 | **NFS Mount Stability** | NFSv3 on Pi, NFSv4 on x86 nodes | --- ## πŸ“‚ Repository Structure ``` homelab/ β”œβ”€β”€ ansible/ # Ansible automation (active) β”‚ β”œβ”€β”€ inventory/ # Managed hosts and groups β”‚ β”‚ β”œβ”€β”€ hosts.ini # 4-node inventory β”‚ β”‚ └── host_vars/ # Per-node configuration β”‚ β”œβ”€β”€ playbooks/ # Automation workflows β”‚ β”‚ β”œβ”€β”€ onboard-nodes.yml # Node SSH key deployment β”‚ β”‚ β”œβ”€β”€ onboard-proxmox.yml # Proxmox post-install β”‚ β”‚ └── gather-node-facts.yml # System discovery β”‚ β”œβ”€β”€ roles/ # Reusable automation β”‚ β”‚ └── proxmox_post_install/ # Nag removal, repo config β”‚ └── group_vars/ # Global variables β”œβ”€β”€ nodes/ # Service definitions per node β”‚ β”œβ”€β”€ heimdall/ # Core infrastructure (Physical) β”‚ β”‚ β”œβ”€β”€ core/ # Komodo, Traefik, Redis β”‚ β”‚ β”œβ”€β”€ trek/ # Trek service β”‚ β”‚ β”œβ”€β”€ vaultwarden/ # Password manager β”‚ β”‚ └── (gitea via Komodo) # Self-hosted Git β”‚ β”œβ”€β”€ waldorf/ # Media services (Physical) β”‚ β”‚ β”œβ”€β”€ plex/ # Media server + GPU β”‚ β”‚ └── tunarr/ # IPTV channels + GPU β”‚ └── watchtower/ # Control plane (Pi 5) β”‚ └── vscode/ # Remote development β”œβ”€β”€ documentation/ # Technical knowledge base β”‚ β”œβ”€β”€ KBAs/ # Troubleshooting guides β”‚ β”œβ”€β”€ SOPs/ # Operational procedures β”‚ β”œβ”€β”€ plans/ # Implementation roadmaps β”‚ └── TECHNICAL_RUNBOOK.md # Emergency reference └── scripts/ # Utility scripts β”œβ”€β”€ bootstrap.sh # Day-0 node initialization └── lib/ # Shared function libraries ``` --- ## πŸ”§ Common Operations ### Deploy a New Stack ```bash # 1. Create directory structure mkdir -p nodes/waldorf/sonarr # 2. Create compose.yaml cat > nodes/waldorf/sonarr/compose.yaml <