A Kubernetes-based home server setup running on ODROID-M2 with 16GB RAM. This repository contains Helm charts and configurations for a complete self-hosted infrastructure including DNS ad-blocking, a customizable dashboard, push notifications, distributed storage, and a full monitoring stack.
- AdGuard Home - Network-wide ad & tracker blocking DNS server
- Homepage - Modern, customizable application dashboard
- ntfy - Self-hosted push notification service
- Longhorn - Cloud-native distributed storage
- cert-manager DNS Lexicon Webhook - DNS-01 ACME challenge solver
- WireGuard VPN - Secure remote access to your home network
- Prometheus - Metrics collection and storage (incl. node-exporter & kube-state-metrics)
- Grafana - Dashboards, visualization, and alerting (with ntfy integration)
- Loki - Log aggregation
- Grafana Alloy - Log shipping from Kubernetes pods to Loki
- ODROID-M2 (or compatible ARM64 device)
- Ubuntu Server (or compatible Linux distribution)
- Basic knowledge of Kubernetes and Helm
Use this command to install the latest version:
snap install microk8s --classicTo install a specific version see MicroK8s Snap Channels.
microk8s enable dns
microk8s enable ingress
microk8s enable cert-manager
microk8s enable metrics-serverAdd kubectl aliases and enable autocompletion:
alias kubectl="microk8s.kubectl"
alias k="kubectl"
source <(kubectl completion zsh | sed "s/kubectl/microk8s.kubectl/g")
source <(k completion zsh | sed "s/k/microk8s.kubectl/g")Add helm alias and enable autocompletion:
alias helm="microk8s.helm3"
source <(helm completion zsh | sed "s/helm/microk8s.helm3/g")k9s is a terminal-based UI for managing Kubernetes clusters.
Go to the release page, download the latest arm64 binary:
wget https://github.com/derailed/k9s/releases/download/v0.40.10/k9s_Linux_arm64.tar.gz
tar -xvzf k9s_Linux_arm64.tar.gz
sudo mv k9s /usr/local/bin
# Clean up
rm k9s_Linux_arm64.tar.gz README.md LICENSE To use shell access in pods via k9s, create a kubectl wrapper:
sudo tee /usr/local/bin/kubectl > /dev/null << 'EOF'
#!/bin/bash
exec /snap/bin/microk8s.kubectl "$@"
EOF
sudo chmod +x /usr/local/bin/kubectlNote: A symbolic link doesn't work in this case.
Add this to your .zshrc or .bashrc:
export KUBECONFIG=/var/snap/microk8s/current/credentials/client.configcd platform
helm dependency updateCreate a platform/values.yaml file with your configuration. See the individual chart READMEs for available options:
- AdGuard Configuration
- Homepage Configuration
- ntfy Configuration
- Longhorn Configuration
- cert-manager DNS Lexicon Webhook Configuration
- Prometheus Configuration
- Grafana Configuration
- Loki Configuration
- Grafana Alloy Configuration
helm install odroid-platform ./platform -f platform/values.yamlhelm upgrade odroid-platform ./platform -f platform/values.yamlβββ charts/ # Individual Helm charts
β βββ adguard/ # AdGuard Home DNS ad-blocker
β βββ alloy/ # Grafana Alloy log shipper
β βββ cert-manager-dns-lexicon-webhook/ # DNS-01 ACME solver
β βββ grafana/ # Grafana dashboards & alerting
β βββ homepage/ # Application dashboard
β βββ loki/ # Log aggregation
β βββ longhorn/ # Distributed storage
β βββ ntfy/ # Push notification service
β βββ prometheus/ # Metrics collection & storage
βββ platform/ # Umbrella chart combining all services
β βββ Chart.yaml # Dependencies definition
β βββ templates/ # Platform-wide resources
β β βββ clusterissuer.yaml # Let's Encrypt configuration
β β βββ namespace.yaml # Namespace definitions
β β βββ recurring-job.yaml # Longhorn backup jobs
β β βββ secret.yaml # DNS provider credentials
β β βββ storageclass.yaml # Longhorn storage class
β βββ values.yaml # Your configuration (gitignored)
βββ wireguard/ # WireGuard VPN setup guide
Each chart and the platform provide a values.schema.json that enables IDE validation and autocompletion when editing values.yaml files. The schemas are generated from TypeScript type definitions (values.schema.ts) using ts-json-schema-generator.
node --version # requires 24.x
npm installnpm run generate:adguard
npm run generate:alloy
npm run generate:cert-manager-dns-lexicon-webhook
npm run generate:grafana
npm run generate:homepage
npm run generate:loki
npm run generate:longhorn
npm run generate:ntfy
npm run generate:prometheus
npm run generate:platformnpm run generate:allAfter modifying any values.schema.ts file, re-run the corresponding script to keep the values.schema.json in sync.
- The
platform/values.yamlfile is gitignored as it contains sensitive configuration - DNS provider credentials are stored in Kubernetes secrets
- TLS certificates are automatically managed via cert-manager
- Consider using sealed-secrets for GitOps workflows
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Feel free to open issues or submit pull requests.