# tower-of-joy Makefile # Common operations for home server infrastructure management .PHONY: help status health gpu-check disk backup cleanup deploy-% stop-% logs-% update-% # Default target - show help help: @echo "tower-of-joy Infrastructure Management" @echo "" @echo "Common Commands:" @echo " make status - Show project status and running containers" @echo " make health - Run comprehensive health check" @echo " make gpu-check - Verify GPU passthrough" @echo " make disk - Show disk usage report" @echo " make backup - Backup all Docker configs" @echo " make cleanup - Clean up unused Docker resources" @echo "" @echo "Stack Management:" @echo " make deploy- - Deploy a stack (e.g., make deploy-portainer)" @echo " make stop- - Stop a stack" @echo " make logs- - Show stack logs" @echo " make update- - Update stack to latest images" @echo "" @echo "Available Stacks:" @echo " - portainer, nginx-proxy-manager, ollama" @echo " - headscale, uptime-kuma, netdata, heimdall" @echo " - watchtower, maintenance" @echo " - jellyfin, nextcloud, samba" @echo "" @echo "Setup Commands:" @echo " make setup-dirs - Create all required directories" @echo " make mount-media - Mount the 4TB media drive" @echo "" @echo "Examples:" @echo " make deploy-portainer # Deploy Portainer" @echo " make logs-ollama # View Ollama logs" @echo " make update-jellyfin # Update Jellyfin to latest" # Show current status status: @echo "=== tower-of-joy Status ===" @echo "" @echo "Running Containers:" @docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" 2>/dev/null || echo "Docker not running" @echo "" @echo "Disk Usage:" @df -h / /mnt/media 2>/dev/null | grep -E "Filesystem|/dev" || echo "Unable to check disk" @echo "" @echo "GPU Status:" @nvidia-smi --query-gpu=name,utilization.gpu,memory.used,memory.total --format=csv,noheader 2>/dev/null || echo "GPU not detected" # Comprehensive health check health: @./scripts/health-check.sh # GPU verification gpu-check: @./scripts/gpu-check.sh # Disk usage report disk: @./scripts/disk-usage.sh # Backup configs backup: @./scripts/backup-configs.sh # Cleanup unused resources cleanup: @./scripts/cleanup.sh # Deploy a stack deploy-%: @if [ ! -f stacks/$*.yml ]; then \ echo "❌ Stack not found: $*"; \ echo "Available stacks:"; \ ls -1 stacks/*.yml | xargs -n 1 basename | sed 's/.yml$$//' | sed 's/^/ - /'; \ exit 1; \ fi @echo "Deploying $*..." @docker compose -f stacks/$*.yml up -d @echo "✅ $* deployed" @echo "Checking status..." @sleep 2 @docker compose -f stacks/$*.yml ps # Stop a stack stop-%: @if [ ! -f stacks/$*.yml ]; then \ echo "❌ Stack not found: $*"; \ exit 1; \ fi @echo "Stopping $*..." @docker compose -f stacks/$*.yml down @echo "✅ $* stopped" # Show logs for a stack logs-%: @if [ ! -f stacks/$*.yml ]; then \ echo "❌ Stack not found: $*"; \ exit 1; \ fi @docker compose -f stacks/$*.yml logs -f # Update a stack update-%: @./scripts/update-stacks.sh $* # Setup directories setup-dirs: @echo "Creating directory structure..." @mkdir -p ~/docker-data/{portainer,nginx-proxy-manager,ollama,headscale,uptime-kuma,netdata,heimdall,jellyfin,nextcloud,samba} @mkdir -p /mnt/media/{jellyfin,nextcloud,game-servers,backups,downloads} @echo "✅ Directories created" @echo "" @echo "SSD directories: ~/docker-data/" @ls -la ~/docker-data/ @echo "" @echo "HDD directories: /mnt/media/" @ls -la /mnt/media/ 2>/dev/null || echo "⚠️ Media drive not mounted" # Mount media drive mount-media: @echo "Mounting 4TB media drive..." @if mountpoint -q /mnt/media; then \ echo "✅ Media drive already mounted"; \ else \ sudo mount /dev/sdb /mnt/media && echo "✅ Media drive mounted" || echo "❌ Failed to mount media drive"; \ fi @df -h /mnt/media 2>/dev/null || echo "Unable to verify mount" # Quick deploy - Phase 1 infrastructure deploy-phase1: @echo "=== Deploying Phase 1: Foundation ===" @echo "" @echo "[1/3] Deploying Portainer..." @make deploy-portainer @sleep 5 @echo "" @echo "[2/3] Deploying Nginx Proxy Manager..." @make deploy-nginx-proxy-manager @sleep 5 @echo "" @echo "[3/3] Deploying Ollama..." @make deploy-ollama @echo "" @echo "=== Phase 1 Complete ===" @echo "" @echo "Access services:" @echo " Portainer: http://localhost:8080" @echo " NPM: http://localhost:8000" @echo " Ollama: http://localhost:11434" # Quick deploy - Phase 2 networking deploy-phase2: @echo "=== Deploying Phase 2: Networking ===" @echo "" @make deploy-headscale @echo "" @echo "=== Phase 2 Complete ===" @echo "" @echo "Configure Headscale:" @echo " 1. Generate config: docker exec headscale headscale config generate" @echo " 2. Create user: docker exec headscale headscale users create homelab" @echo " 3. Generate key: docker exec headscale headscale preauthkeys create --user homelab" # Quick deploy - Phase 3 monitoring deploy-phase3: @echo "=== Deploying Phase 3: Monitoring ===" @echo "" @echo "[1/3] Deploying Uptime Kuma..." @make deploy-uptime-kuma @sleep 3 @echo "" @echo "[2/3] Deploying Netdata..." @make deploy-netdata @sleep 3 @echo "" @echo "[3/3] Deploying Heimdall..." @make deploy-heimdall @echo "" @echo "=== Phase 3 Complete ===" @echo "" @echo "Access monitoring:" @echo " Uptime Kuma: http://localhost:3001" @echo " Netdata: http://localhost:19999" @echo " Heimdall: http://localhost:8888" # Quick deploy - Phase 4 optimization deploy-phase4: @echo "=== Deploying Phase 4: Optimization ===" @echo "" @echo "[1/2] Deploying Watchtower..." @make deploy-watchtower @sleep 3 @echo "" @echo "[2/2] Deploying Maintenance Container..." @make deploy-maintenance @echo "" @echo "=== Phase 4 Complete ===" @echo "" @echo "Automated backups configured (daily at 3 AM)" # Quick deploy - Applications deploy-apps: @echo "=== Deploying Applications ===" @echo "" @echo "[1/3] Deploying Jellyfin..." @make deploy-jellyfin @sleep 5 @echo "" @echo "[2/3] Deploying Nextcloud..." @make deploy-nextcloud @sleep 5 @echo "" @echo "[3/3] Deploying Samba..." @make deploy-samba @echo "" @echo "=== Applications Deployed ===" @echo "" @echo "Access applications:" @echo " Jellyfin: http://localhost:8096" @echo " Nextcloud: http://localhost:8082" @echo " Samba: \\\\tower-of-joy\\Media" # Full deployment (all phases) deploy-all: @echo "⚠️ This will deploy ALL services. This may take 10-15 minutes." @read -p "Continue? (y/N) " -n 1 -r; \ echo; \ if [[ $$REPLY =~ ^[Yy]$$ ]]; then \ make deploy-phase1 && \ make deploy-phase2 && \ make deploy-phase3 && \ make deploy-phase4 && \ make deploy-apps && \ echo "" && \ echo "=== All Services Deployed ===" && \ make status; \ else \ echo "Deployment cancelled"; \ fi # Development helpers dev-setup: @echo "Setting up development environment..." @chmod +x scripts/*.sh @echo "✅ Scripts made executable" @echo "✅ Development setup complete" # Show all containers ps: @docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # Show all stacks stacks: @echo "Available stacks:" @ls -1 stacks/*.yml | xargs -n 1 basename | sed 's/.yml$$//' | sed 's/^/ /'