$Justin Hoffmann

📦 Infrastructure as Code & Observability

Rebuilt my Docker host from scratch — provisioned by Terraform, configured by Ansible, monitored by Prometheus, Grafana, and Loki. No more clicking through a UI and hoping I remember what I did.

TerraformAnsiblePrometheusGrafanaLokigitleaksDocker Compose

Overview

My lab worked, but nothing about it was reproducible. VMs were created by clicking through Proxmox. Containers were started by hand. If a host died, rebuilding it meant remembering what I did months ago. This phase replaced that with code.

Architecture

Workstation (WSL) ├── Terraform ──► Proxmox API ──► provisions VM └── Ansible ──► SSH ──► configures VM docker-host (VM 100 — SERVERS VLAN, 10.0.20.10) ├── Homepage — lab dashboard ├── Portainer — container management └── Observability ├── Prometheus ◄─ node-exporter (host metrics) │ ◄─ cAdvisor (container metrics) ├── Grafana — dashboards ├── Loki ◄─ Promtail (Docker socket) └── Uptime Kuma — up/down checks + email alerts

Technologies Used

Highlights

Challenges

What I Learned

Destroying a working VM felt wrong until I realized I could not confidently rebuild it — which meant it was already fragile. Infrastructure I cannot recreate from a file is infrastructure I do not really control. The observability work made the same point from the other direction: I had been finding problems by noticing them, which only works while you are looking.

Next Steps

← Back to all projects