A Docker Swarm platform for self-hosted services. Deploys 25+ pre-configured services with automatic SSL, centralized SSO, monitoring, and automated backups.
Infrastructure
- Technitium DNS — primary local DNS with optional Pi-hole secondary for failover
- Traefik — reverse proxy with automatic SSL via Cloudflare
- Authentik — identity provider and SSO
- Prometheus + Grafana + Loki — metrics, dashboards, and log aggregation
- Uptime Kuma — uptime monitoring
- Kopia — encrypted backups to Backblaze B2
Applications
- Homepage, Actual Budget, Home Assistant, Node-RED, CryptPad, Mealie, Excalidraw
- PhotoPrism, Immich, Emby
- Sonarr, Radarr, Prowlarr, Profilarr, qBittorrent, Deluge, SABnzbd, NZBGet
- Vaultwarden, LibreChat, Kiwix (offline Wikipedia + Stack Overflow)
- Docker with Compose v2
- Taskfile
- Domain name with Cloudflare DNS management
- Cloudflare API token for DNS-01 challenge
git clone https://github.com/chutch3/homelab.git
cd homelab
cp .env.example .env
nano .env # set your domain, Cloudflare token, and passwords
cp ansible/inventory/03-hosts.yml.example ansible/inventory/02-hosts.yml
nano ansible/inventory/02-hosts.yml # add your nodestask ansible:install # install Ansible and dependencies
task ansible:bootstrap # install Docker on all nodes
task ansible:cluster:init # initialize Docker Swarm
task ansible:deploy # deploy all servicesThen visit https://homepage.yourdomain.com.
# Deploy or redeploy a single service
task ansible:deploy:stack -- -e "stack_name=sonarr"
# Tear down a service (preserves data)
task ansible:teardown:stack -- -e "stack_name=sonarr"
# Configure DNS records
task ansible:dns:configure
# Check cluster status
task ansible:cluster:status
# Run tests and linting
task checkFull documentation: chutch3.github.io/homelab
MIT — see LICENSE.