Take the notes app from source code to a monitored, auto-deployed production system.
Module 12 · Everything from Modules 6–11, end to end. Your portfolio piece.
Project Capstone 4–8 hoursNo new tools this time. Your job is to assemble everything you've learned into one working pipeline: a developer pushes code, and minutes later a tested, containerized, monitored app is running on a cluster — with zero manual steps.
A teammate clones your repo, runs one command to bring it up locally, and a git push to main automatically tests, builds, publishes, and deploys the notes app — with a Grafana dashboard showing it's healthy.
This is the project you put on your résumé and GitHub. By the end you'll have a repo that demonstrates the entire DevOps lifecycle on a single, real application.
Here's how the pieces you've built across the course connect into one system:
6 Dockerfile · 7 Compose for local dev · 8 Kubernetes manifests · 9 CI/CD pipeline · 10 Terraform for infra · 11 Prometheus + Grafana. The capstone is wiring them into one repo.
Work through these in order. Each ends with a "Done when" test — don't move on until it passes. Most of the work is reusing the files you already built; the capstone is making them work together.
Make sure the notes app has a clean Dockerfile, a .dockerignore, and a /health + /metrics endpoint (added in Modules 9 & 11).
docker build -t notes-app:1.0 . succeeds and docker run -p 8080:5000 notes-app:1.0 serves the app, /health, and /metrics.
Your docker-compose.yml should bring up web + db + prometheus + grafana together, with the notes data persisted in a volume.
docker compose up launches all four services, you can add notes that survive a restart, and Grafana (:3000) shows live request metrics.
Collect your k8s/ manifests — Secret, db Deployment+Service, web Deployment (2 replicas) +Service. Deploy to Minikube.
kubectl apply -f k8s/ brings everything up, minikube service web opens the app, and deleting a web pod auto-heals back to 2.
Your .github/workflows/ci.yml runs pytest, then (only if green) builds the image and pushes it to GHCR, tagged with the commit SHA.
A push to main shows two green jobs in the Actions tab, and a fresh image appears in your GitHub Packages, tagged with the commit.
Add a deploy job that updates the running app to the new image. This is the step Module 9 deferred — here's the unifying pipeline:
GitHub's runners can't reach your local Minikube. To truly automate deployment you need a cluster the runner can reach — a cloud cluster (with a KUBECONFIG secret) or a self-hosted runner. Module 13 spins up a real one. For now, if you're on Minikube, run the kubectl set image step manually after the image is published — the muscle memory is identical.
Publishing a new image results in the cluster running it — automatically (cloud) or via the one documented manual command (local). kubectl rollout status reports success.
Confirm Prometheus is scraping the deployed app and build a Grafana dashboard with at least three panels: request rate, latency, and error rate (the golden signals).
Your Grafana dashboard shows live traffic, and generating load (or an error) visibly moves the graphs. Export the dashboard JSON into your repo.
A clean structure makes the project legible to anyone who finds it (including a hiring manager):
Tick every box. This is your acceptance test for the whole course:
docker compose up starts the full local stack (app + db + monitoring)main runs tests automaticallyYou built something real — now present it so it counts:
kubectl get pods, and your Grafana dashboard.Practice explaining the flow out loud: "On push, Actions runs the tests; if they pass it builds an image, pushes it to a registry, and rolls it out to Kubernetes, where Prometheus and Grafana monitor it." That sentence is a junior DevOps interview answer.
Want to go further? Pick any of these:
You've taken a single application through the entire DevOps lifecycle: built, containerized, orchestrated, automated, and monitored — using free, local, industry-standard tools. That's the real job.
One optional step remains: Module 13 — Real Cloud, where you take this exact project and deploy it to a free cloud tier, turning the manual deploy step into a fully automated one.