259 lines
7.2 KiB
Makefile
259 lines
7.2 KiB
Makefile
# 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-<name> - Deploy a stack (e.g., make deploy-portainer)"
|
|
@echo " make stop-<name> - Stop a stack"
|
|
@echo " make logs-<name> - Show stack logs"
|
|
@echo " make update-<name> - 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/^/ /'
|