Learn DevOps from zero to production.
313 small steps on one real app. You finish ready for mid and senior DevOps work.
Thanks, there. You are on the list. You get one email when the first phases open.
- 000-046 Your laptop Linux, networking, Git, Python
- 047-058 One VPS, by hand systemd, nginx, TLS, backups
- 059-099 Containers and pipelines Docker, GitHub Actions, zero-downtime deploys
- 100-123 Infrastructure as code Ansible, Terraform, Packer
- 124-188 Kubernetes on your VPS k3s, Helm, Argo CD, observability, security
- 189-219 AWS, GCP, Azure EKS, GKE, AKS, one session each
- 220-312 Own servers, then senior work reliability, platform, FinOps, consulting
One app for the whole course
Courier is a small parcel-tracking SaaS. You never write its features. You make it ship, scale, survive and cost less.
web
Node, Next.js
Tracking page and shop dashboard
api
Python, FastAPI
REST API, auth, shipments. Postgres, Redis, RabbitMQ
worker
Go
Sends notifications and updates statuses from the queue
carrier-mock
Go
Fake carrier that floods webhooks when a step needs it
Failure knobs built in
Every service reads flags that break it on purpose, so incidents in the course are real ones.
FAIL_RATE=0.2- 20% of requests return 500
LATENCY_MS=800- every request waits 800 ms
LEAK_MB_PER_MIN=50- memory grows until OOMKilled
SLOW_QUERY=1- an unindexed query on the shipment list
Syllabus: 313 steps in 26 phases
Each step adds one idea and takes 30 to 60 minutes. Nothing points forward to a step you have not done.
Show steps for an exam
No step matches. Try a shorter word.
Foundations
Linux, networking, Git and scripting, on your laptop.
000-046
P00 5 steps
- 000 What a DevOps engineer does all day Follow one code change from a laptop to a paying customer
- 001 How this course works Use the step format, the hint ladder and the check script
- 002 Set up your laptop Install a terminal, package manager, editor and Docker Desktop
- 003 Meet Courier Read the architecture of the app you will run for the whole course
- 004 Run Courier the naive way Start all 4 services by hand and feel the pain
P01 18 steps
- 005 Files, paths and the shell prompt Navigate the filesystem with cd, ls, pwd and tab completion LFCS
- 006 Reading and editing files Use cat, less, head, tail and nano or vim to change a config LFCS
- 007 Users, groups and sudo Create a user, add it to a group and give it limited sudo LFCS
- 008 Permissions and ownership Read rwx bits, fix a 403 caused by chmod and chown LFCS
- 009 Processes and signals Find a process with ps and kill it with the right signal LFCS
- 010 systemd services Write a unit file and keep a service running after reboot LFCS
- 011 Logs with journalctl Find why a service failed using journalctl filters LFCS
- 012 Packages and repositories Install, pin and remove packages with apt LFCS
- 013 Disks, mounts and space Find what filled the disk with df, du and lsblk LFCS
- 014 Environment variables Set variables for a shell, a service and a single command LFCS
- 015 Bash scripts: first script Write a script with arguments and an exit code
- 016 Bash: conditions and loops Loop over servers and branch on command results
- 017 Bash: functions and safe defaults Use set -euo pipefail, traps and functions
- 018 Text tools: grep, sed, awk Pull numbers out of an access log in one pipeline LFCS
- 019 JSON and YAML on the command line Query and edit JSON with jq and YAML with yq
- 020 Scheduled jobs Run a backup script with cron and with a systemd timer LFCS
- 021 Server health in 60 seconds Read load, memory, disk and I/O with top, free, vmstat, iostat LFCS
- 022 Linux troubleshooting drill Fix a broken server from 3 symptoms using a checklist LFCS
P02 11 steps
- 023 IP addresses and ports Read ip addr and ss output and say what listens where LFCS
- 024 TCP, UDP and the handshake Watch a TCP handshake and a timeout with tcpdump
- 025 DNS from the inside Trace a lookup with dig from root to answer LFCS
- 026 HTTP by hand Send requests with curl and read status codes and headers
- 027 TLS and certificates Inspect a certificate chain with openssl and spot an expired cert
- 028 Subnets and CIDR Split a /16 into subnets on paper and check with ipcalc
- 029 Routing and NAT Read a routing table and explain how a private IP reaches the internet
- 030 Firewalls Allow only 22, 80 and 443 with ufw and verify with nmap LFCS
- 031 Reverse proxies and load balancers Explain L4 vs L7 balancing and where nginx sits
- 032 SSH in depth Use keys, ssh config, jump hosts and port forwarding LFCS
- 033 Network troubleshooting toolkit Debug a slow request with mtr, dig, curl -w and ss
P03 7 steps
- 034 Git basics Commit, view history and undo safely
- 035 Branches and merges Create a branch, merge it and resolve a conflict
- 036 Rebase and clean history Rebase a branch and squash fixup commits
- 037 Pull requests and code review Open a PR, review one and request changes
- 038 Branching strategies Compare trunk-based and GitFlow and pick one for Courier
- 039 Versioning and changelogs Tag releases with semver and conventional commits
- 040 Pre-commit hooks Block secrets and broken YAML before they reach the repo
P04 6 steps
- 041 Python for ops: first script Read a log file and print a summary
- 042 Python: calling APIs Query the GitHub API and handle errors and retries
- 043 Python: a real CLI tool Build a CLI with arguments, config and tests
- 044 Reading Go and Node code Find the config, ports and health endpoint in unfamiliar code
- 045 Makefiles as a task runner Wrap build, test and run in make targets
- 046 Config formats and templating Generate configs from templates with envsubst and Jinja
Ship
A real server by hand, then containers, CI and CD.
047-099
P05 12 steps
- 047 Rent a VPS and connect Create a 5 euro VPS and log in with a key
- 048 Harden the server Disable root and password login, add fail2ban and auto updates
- 049 Install runtimes Install Python, Node, Go and Postgres on the server
- 050 Run Courier with systemd Run all services as units with restart policies
- 051 nginx in front Route web and API through one nginx config
- 052 Domain and DNS records Point a domain at the VPS with A and CNAME records
- 053 HTTPS with Let's Encrypt Get a certificate with certbot and renew it automatically
- 054 Logs and rotation Keep logs from filling the disk with logrotate
- 055 Postgres backups Dump the database nightly and prove a restore works
- 056 Your first outage Recover Courier after a full disk and write what happened
- 057 Your first runbook Write the runbook a teammate needs at 3 a.m.
- 058 Count the manual work List every manual step and estimate the hours per month
P06 16 steps
- 059 Why containers Explain images, containers and namespaces with a demo
- 060 docker run Run, inspect, exec into and stop containers CKAD
- 061 Images and layers Read layers with docker history and use the build cache CKAD
- 062 Dockerfile for the Python API Write a Dockerfile and build the API image CKAD
- 063 Dockerfile for the Node web app Containerize the web app and pass build-time config CKAD
- 064 Multi-stage build for the Go worker Ship a 15 MB worker image CKAD
- 065 Smaller and safer images Use slim and distroless bases and run as non-root CKS
- 066 Volumes and data Keep Postgres data across container restarts
- 067 Container networking Connect containers on a user network by name
- 068 Docker Compose for Courier Start the whole stack with docker compose up
- 069 Config and secrets in Compose Use env files and Compose secrets without leaking them
- 070 Healthchecks and startup order Make the API wait for a healthy database
- 071 Registries and tags Push images to GHCR with an immutable tagging scheme
- 072 Scan images for vulnerabilities Find and fix CVEs with Trivy CKS
- 073 Deploy Compose to the VPS Replace the systemd setup with Compose on the server
- 074 Container debugging drill Fix a container that exits, cannot resolve DNS and runs out of memory CKAD
P07 15 steps
- 075 What CI is for Explain the feedback loop CI shortens
- 076 First GitHub Actions workflow Run a job on every push
- 077 Lint and format checks Fail the build on lint errors in 3 languages
- 078 Unit tests in CI Run Python, Node and Go tests in parallel jobs
- 079 Matrix builds Test against 2 runtime versions with a matrix
- 080 Caching dependencies Cut pipeline time with dependency and Docker layer caches
- 081 Build and push images in CI Publish images to GHCR from the pipeline
- 082 Integration tests with services Test the API against a real Postgres in CI
- 083 Branch protection and required checks Block merges that fail CI
- 084 Secrets in CI Store secrets safely and keep them out of logs
- 085 OIDC instead of long-lived keys Let CI get short-lived credentials without stored keys DOP
- 086 Reusable workflows Share one pipeline across 4 services
- 087 Self-hosted runners Run jobs on your own VPS and know the risks
- 088 GitLab CI and Jenkins Port the pipeline to GitLab CI and read a Jenkinsfile
- 089 Pipeline speed Find the slowest stage and halve the total time
P08 10 steps
- 090 Delivery vs deployment Pick continuous delivery or deployment for each service
- 091 Deploy from CI over SSH Deploy to the VPS when main turns green
- 092 Staging and production Run two environments with promotion between them
- 093 Database migrations in deploys Run migrations safely before new code starts
- 094 Zero-downtime rolling deploys Replace containers one at a time behind nginx
- 095 Blue/green on one server Switch traffic between two stacks and back
- 096 Rollbacks Roll back a bad release in under 2 minutes
- 097 Release automation Generate versions and changelogs from commits
- 098 Feature flags Ship dark code and turn it on for 10% of users
- 099 Measure DORA metrics Track deploy frequency, lead time, change failure rate and restore time DOP
Automate
Servers, clusters and deploys exist only as reviewed code.
100-158
P09 9 steps
- 100 Why configuration management Compare scripts, Ansible and images for server setup
- 101 Ansible inventory and ad-hoc commands Run a command on many hosts at once
- 102 Your first playbook Install and configure nginx with a playbook
- 103 Idempotency Run a playbook twice and prove nothing changed the second time
- 104 Variables, templates and handlers Template the nginx config and reload only on change
- 105 Roles Split the setup into reusable roles
- 106 Ansible Vault Keep secrets encrypted in the repo
- 107 Rebuild the VPS from scratch Wipe the server and restore Courier with one command
- 108 Testing Ansible Test roles with Molecule
P10 15 steps
- 109 Why IaC Explain state, drift and plan before apply TFA
- 110 Terraform and OpenTofu basics Write a provider and one resource TFA
- 111 Plan, apply, destroy Create and delete a VPS with Terraform TFA
- 112 Variables and outputs Make the config reusable across environments TFA
- 113 State and why it matters Read state and recover from a lost state file TFA
- 114 Remote state and locking Store state in a bucket with locking TFA
- 115 Modules Write a module for a Courier server TFA
- 116 Environments Run staging and production from one codebase TFA
- 117 Import existing infrastructure Bring a hand-made resource under Terraform TFA
- 118 Drift detection Detect and fix changes made outside Terraform TFA
- 119 Lint and policy for IaC Catch bad config with tflint and Checkov in CI TFA
- 120 Testing infrastructure Test a module with terraform test
- 121 Terraform in CI Plan on pull request, apply on merge TFA
- 122 Machine images with Packer Bake a hardened base image
- 123 Pulumi and Crossplane at a glance Know when a team picks them over Terraform
P11 27 steps
- 124 Why orchestration Explain what Kubernetes does that Compose does not CKA
- 125 Your first cluster Create a local cluster with kind and use kubectl CKA
- 126 Pods Run, inspect and delete a pod CKAD
- 127 Deployments and ReplicaSets Scale a deployment and watch self-healing CKAD
- 128 Services Reach pods through ClusterIP and NodePort CKA
- 129 Labels and selectors Find and group objects with labels CKAD
- 130 ConfigMaps and Secrets Move Courier config out of images CKAD
- 131 Probes Add liveness, readiness and startup probes CKAD
- 132 Requests and limits Set resources and see OOMKilled and throttling CKAD
- 133 Namespaces Split environments and teams by namespace CKA
- 134 Ingress and Gateway API Route a domain to the web and API services CKA
- 135 Persistent volumes Give a stateful app storage that survives restarts CKA
- 136 StatefulSets Run Postgres in the cluster and learn why most teams do not CKA
- 137 Jobs and CronJobs Run migrations and nightly tasks in the cluster CKAD
- 138 Rolling updates and rollbacks Ship and undo a release with kubectl rollout CKAD
- 139 Horizontal Pod Autoscaler Scale the API on CPU and custom metrics CKA
- 140 RBAC Give a developer read-only access to one namespace CKA
- 141 Network policies Allow only the API to talk to the database CKS
- 142 Helm: using charts Install ingress-nginx and Redis with Helm
- 143 Helm: writing a chart for Courier Package all services in one chart
- 144 Kustomize Patch base manifests per environment CKAD
- 145 Debugging pods Fix CrashLoopBackOff, ImagePullBackOff and Pending pods CKA
- 146 Debugging the cluster Find a broken node, DNS and control plane problems CKA
- 147 k3s on your VPS Move Courier from Compose to a single-node k3s
- 148 cert-manager and external-dns Automate certificates and DNS records from the cluster
- 149 Operators and CRDs Install a Postgres operator and read its custom resources CKA
- 150 Upgrading a cluster Upgrade Kubernetes with no downtime CKA
P12 8 steps
- 151 GitOps idea Explain pull-based deploys and reconciliation
- 152 Argo CD Sync Courier from a Git repo into the cluster
- 153 App of apps and environments Promote a release from staging to production by pull request
- 154 Secrets in GitOps Encrypt secrets with SOPS or Sealed Secrets
- 155 External Secrets Operator Pull secrets from a secret store into the cluster
- 156 Canary releases Send 10% of traffic to a new version with Argo Rollouts
- 157 Automated analysis Roll back a canary automatically when errors rise
- 158 Flux at a glance Compare Flux with Argo CD
Operate
See, secure and run Courier in 3 clouds and on your own metal.
159-241
P13 16 steps
- 159 Monitoring vs observability Name the 4 golden signals for each Courier service PCDE
- 160 Prometheus Scrape metrics from Courier and the cluster
- 161 Instrumenting code Add request metrics to the API, web and worker
- 162 PromQL Write queries for rate, errors and latency percentiles
- 163 Grafana dashboards Build one dashboard per service as code
- 164 Structured logging Log JSON with request IDs in 3 languages
- 165 Centralized logs with Loki Search logs from every pod in one place
- 166 Distributed tracing with OpenTelemetry Trace one request across web, API and worker PCDE
- 167 Collector pipelines Route metrics, logs and traces through the OpenTelemetry Collector
- 168 SLIs and SLOs Set availability and latency targets for Courier PCDE
- 169 Error budgets Decide when to stop shipping features PCDE
- 170 Alerting with Alertmanager Route alerts to Telegram and email with silences
- 171 Burn-rate alerts Alert on SLO burn, not on CPU PCDE
- 172 Synthetic checks Probe Courier from outside like a user
- 173 Profiling and eBPF Find a hot function with continuous profiling and eBPF tools
- 174 Alert hygiene Cut alert noise by half and write a runbook link for each alert
P14 14 steps
- 175 Threat model a pipeline List how an attacker could reach production through CI CKS
- 176 Least privilege everywhere Remove admin rights that nobody needs CKS
- 177 Secrets management with Vault Issue dynamic database credentials from Vault
- 178 Static analysis in CI Run SAST and secret scanning on every PR
- 179 Dependency scanning and updates Keep dependencies patched with Renovate or Dependabot
- 180 SBOMs Generate an SBOM for every image with Syft CKS
- 181 Signing images Sign and verify images with cosign CKS
- 182 Provenance and SLSA Attach build provenance and verify it before deploy CKS
- 183 Admission policies Block unsigned or root images with Kyverno or OPA CKS
- 184 Pod Security Standards Enforce the restricted profile on a namespace CKS
- 185 Runtime security Detect a shell in a container with Falco CKS
- 186 CIS benchmarks Scan a node and cluster with kube-bench CKS
- 187 Patch cadence Set a monthly rebuild and patch routine for images and nodes
- 188 Compliance basics Map controls to SOC 2, ISO 27001, GDPR and NIS2
P15 5 steps
- 189 What a cloud actually sells Map compute, storage, network and managed services across providers
- 190 Shared responsibility Say what the provider secures and what you secure
- 191 Pricing models Read a price page and estimate a monthly bill
- 192 Budgets and billing alerts Set a hard spending alert before creating anything
- 193 One Terraform layout for many clouds Design a repo that can target AWS, GCP, Azure and a VPS
P16 17 steps
- 194 AWS accounts and Organizations Set up a management account and a sandbox account SAA
- 195 IAM Write a least-privilege policy and test it SAA DOP
- 196 VPC Build public and private subnets with Terraform SAA
- 197 EC2 Launch an instance from your Packer image SAA
- 198 S3 Store backups with lifecycle rules and encryption SAA
- 199 RDS for Postgres Move the database to RDS with automated backups SAA
- 200 ECR Push Courier images to a private registry DOP
- 201 Load balancers and Route 53 Put an ALB and a domain in front of Courier SAA
- 202 Certificates with ACM Issue TLS certificates for the ALB SAA
- 203 ECS on Fargate Run Courier without managing servers DOP
- 204 EKS Create a cluster with Terraform and deploy the Helm chart DOP
- 205 Pod identity on EKS Give pods AWS permissions without keys DOP
- 206 CloudWatch Ship logs and metrics and set an alarm DOP
- 207 Secrets Manager and Parameter Store Feed secrets to Courier from AWS SAA
- 208 Lambda and events Run a small event-driven task next to Courier SAA
- 209 AWS cost review Find the 3 biggest costs and cut one SAA
- 210 Tear down cleanly Destroy everything and confirm the bill stops
P17 9 steps
- 211 GCP projects and IAM Set up a project, service accounts and roles PCDE
- 212 GKE and Artifact Registry Run Courier on GKE PCDE
- 213 Cloud SQL and Workload Identity Connect pods to a managed database without keys PCDE
- 214 Cloud Logging and Monitoring Read Courier logs and SLOs in Google Cloud PCDE
- 215 Azure subscriptions and Entra ID Set up a resource group and identities AZ-400
- 216 AKS and ACR Run Courier on AKS AZ-400
- 217 Azure Database and managed identity Connect pods to Postgres with managed identity AZ-400
- 218 Azure Monitor Read logs and set alerts in Azure AZ-400
- 219 Compare the three clouds Write a one-page comparison for a client
P18 7 steps
- 220 When to self-host Decide cloud vs own servers with numbers
- 221 A 3-node k3s cluster Build a highly available cluster on 3 VPS
- 222 Load balancing on bare metal Expose services with MetalLB or a floating IP
- 223 Storage on your own nodes Add replicated storage with Longhorn
- 224 Private registry Run Harbor with image scanning
- 225 Private networking Join clouds and servers with WireGuard
- 226 Air-gapped installs Install Courier where the internet is not allowed
P19 15 steps
- 227 RTO and RPO Set recovery targets with the business
- 228 Backups that restore Back up the cluster with Velero and restore it to a new one
- 229 Point-in-time recovery Restore Postgres to one minute before a bad query
- 230 Database operations Run expand-and-contract migrations and connection pooling
- 231 Load testing with k6 Find the request rate where Courier breaks
- 232 Capacity planning Predict when you need more nodes
- 233 Event-driven autoscaling Scale the worker on queue length with KEDA
- 234 Node autoscaling Add and remove nodes with Cluster Autoscaler or Karpenter
- 235 Caching and CDN Put a CDN in front of static files and measure the gain
- 236 Queues and backpressure Keep the worker alive when the queue explodes
- 237 Multi-region basics Run a warm standby in a second region
- 238 Chaos engineering Kill pods and nodes on purpose with Chaos Mesh
- 239 Incident response Run an incident with roles, a channel and a timeline
- 240 Blameless postmortems Write a postmortem with causes and actions
- 241 On-call that people survive Design a rotation, escalation and handover
Lead
Platform, cost, AI, consulting, real outages and the job hunt.
242-312
P20 8 steps
- 242 From DevOps team to platform team Explain team topologies and the platform as a product
- 243 Golden paths Write a template that creates a new service with CI, chart and dashboards
- 244 Internal developer portal Run Backstage with a service catalog
- 245 Self-service environments Let a developer create a preview environment per pull request
- 246 Infrastructure APIs with Crossplane Let teams request a database with a YAML file
- 247 Multi-tenancy Share one cluster safely between teams
- 248 Developer experience metrics Measure onboarding time and wait time with DORA and SPACE
- 249 Docs as code Publish runbooks and ADRs from the repo
P21 7 steps
- 250 Cost visibility Tag every resource and see cost per team
- 251 Kubernetes cost Measure cost per namespace with OpenCost
- 252 Rightsizing Shrink overprovisioned pods and nodes from real usage
- 253 Spot and preemptible capacity Run the worker on spot nodes safely
- 254 Commitments Decide between savings plans, reservations and on-demand
- 255 Storage and transfer costs Cut data transfer and storage costs
- 256 Unit economics Report cost per customer and per order
P22 6 steps
- 257 Where AI helps and where it hurts List tasks to give an agent and tasks to keep
- 258 Agents writing infrastructure Review agent-written Terraform with plan and policy gates
- 259 AI in incident triage Summarize logs and alerts with an LLM and check its claims
- 260 Guardrails for AI in pipelines Limit what an agent can run, read and change
- 261 MCP servers for ops Give an agent read-only access to the cluster
- 262 Serving a model on Kubernetes Run a small inference service with GPU scheduling basics
P23 13 steps
- 263 Assess a company Run a DevOps maturity interview with 10 questions
- 264 Value stream mapping Map idea-to-production and find the longest wait
- 265 Baseline DORA metrics Measure the 4 metrics from Git and incident data
- 266 Find the toil List repetitive manual work and its cost per month
- 267 ROI of automation Calculate payback time for one automation
- 268 Write a proposal Turn findings into a priced proposal a CTO can sign
- 269 90-day roadmap Plan quick wins first and big moves after
- 270 Migrating legacy Move a monolith on one server to containers in stages
- 271 Change management Get developers and ops to adopt the new way
- 272 ADRs and RFCs Write a decision record that survives the next hire
- 273 Choosing vendors Compare 3 tools with a weighted matrix
- 274 Presenting to leadership Explain risk, cost and speed in 5 slides
- 275 Running a DevOps consulting engagement Scope, price and close a fixed-scope project
P24 26 steps
- 276 GitLab 2017: deleted production database Recover after rm -rf on the wrong host and find the dead backups
- 277 AWS S3 2017: one typo in a command Limit the blast radius of an ops command
- 278 Knight Capital 2012: half-finished deploy Catch a deploy that reached 7 of 8 servers
- 279 Cloudflare 2019: one regex eats the CPU Stop a config change that pins every core
- 280 GitHub 2018: split brain after 43 seconds Recover a database cluster after a network partition
- 281 Facebook 2021: BGP takes the company offline Keep out-of-band access when your own network is gone
- 282 Fastly 2021: one customer config Roll back a global config push
- 283 Roblox 2021: 73 hours of Consul Debug a coordination service under load
- 284 Let's Encrypt 2021: root certificate expiry Find clients that break when a root expires
- 285 Atlassian 2022: 883 customer sites deleted Restore many tenants without a bulk restore tool
- 286 Datadog 2023: an OS update kills networking Stage OS updates so they cannot hit every node
- 287 CrowdStrike 2024: one content update Ship config with the same gates as code
- 288 Google Cloud 2025: a policy change without a flag Guard new code paths with flags and safe defaults
- 289 AWS us-east-1 2025: a DNS race condition Find a race in automation that manages DNS
- 290 Cloudflare 2025: a feature file doubles in size Validate generated config before it ships
- 291 Leap second 2012: a clock stops a fleet Test time edge cases in production systems
- 292 Expired certificates Catch a certificate that expires on a Sunday
- 293 DNS TTL trap Migrate a domain without hours of downtime
- 294 Disk full at 3 a.m. Recover a node where logs ate the disk
- 295 Runaway cloud bill Stop a loop that costs 5,000 dollars overnight
- 296 left-pad 2016: a package disappears Pin and mirror dependencies
- 297 Codecov 2021: a compromised script in CI Detect a tampered tool in the pipeline
- 298 xz-utils 2024: a backdoor in a library Verify what you build from
- 299 tj-actions 2025: a compromised GitHub Action Pin actions by commit and limit token scope
- 300 Leaked cloud keys on GitHub Rotate keys and clean history in under an hour
- 301 Kubernetes etcd out of space Recover a control plane that refuses writes
P25 11 steps
- 302 How DevOps and SRE interviews work Know the 5 interview types and how each is scored
- 303 Linux troubleshooting interview Talk through a broken server out loud
- 304 Kubernetes live debugging interview Fix a broken cluster under time pressure
- 305 Infrastructure system design Design CI/CD and hosting for a 50-person company
- 306 Terraform and cloud interview Answer state, modules and IAM questions
- 307 Incident stories with STAR Tell 3 incident stories from your War Room work
- 308 Your portfolio Publish Courier as a public portfolio with diagrams
- 309 CV and LinkedIn for DevOps Write bullets with numbers from your course work
- 310 Which certifications and when Pick a cert order that matches the jobs you want
- 311 Capstone: one week on call Run Courier for 7 days with injected incidents
- 312 Capstone: consulting case Audit a sample company and present a 90-day plan
Built so you do not get stuck
One idea per step
If a step needs more than 3 new terms, it gets split in two.
Every command is tested
Copy, paste, and compare with the expected output printed under it.
A script checks your work
Green means done. Red tells you which line of the task failed.
Errors are part of the lesson
Each step breaks something on purpose and lists the 3 errors people hit most.
Hints come one rung at a time
5 rungs from "where to look" to the full solution, which you then explain back.
---
num: "062"
phase: P06
title: Dockerfile for the Python API
runs_on: laptop
time_min: 45
cost: "0"
certs: [CKAD]
---
# 062. Dockerfile for the Python API
## Goal & why
## Recall -> steps 059, 060, 061
## What's new -> 3 new terms, no more
## Do it -> commands + expected output
## Break it -> change one line, read the error
## Check -> bash checks/062.sh
## If you're stuck -> 3 real errors and fixes
## Trade-offs
## Hint ladder -> rungs 0 to 5
What practice costs you
Under about 10 dollars a month. Cloud steps start with a budget alert and end with a teardown.
- 000-046 0 Laptop only. 16 GB of RAM is enough for the whole course.
- 047-188 ~5 EUR / month One small VPS. k3s runs on it too.
- 189-219 free tier AWS, GCP and Azure credits. Each cluster lives for one session.
- 220-226 1-2 weeks Three small VPS for the self-hosted cluster, then deleted.
War Room: 26 real outages, rebuilt small
You reproduce the failure mode of famous incidents on your own stack, stop it, and write the postmortem.
- GitLab 2017: deleted production database
- AWS S3 2017: one typo in a command
- Knight Capital 2012: half-finished deploy
- Cloudflare 2019: one regex eats the CPU
- GitHub 2018: split brain after 43 seconds
- Facebook 2021: BGP takes the company offline
- Fastly 2021: one customer config
- Roblox 2021: 73 hours of Consul
- Let's Encrypt 2021: root certificate expiry
- Atlassian 2022: 883 customer sites deleted
- Datadog 2023: an OS update kills networking
- CrowdStrike 2024: one content update
- Google Cloud 2025: a policy change without a flag
- AWS us-east-1 2025: a DNS race condition
- Cloudflare 2025: a feature file doubles in size
- Leap second 2012: a clock stops a fleet
- Expired certificates
- DNS TTL trap
- Disk full at 3 a.m.
- Runaway cloud bill
- left-pad 2016: a package disappears
- Codecov 2021: a compromised script in CI
- xz-utils 2024: a backdoor in a library
- tj-actions 2025: a compromised GitHub Action
- Leaked cloud keys on GitHub
- Kubernetes etcd out of space
Questions
Do I need any experience?
No. Step 005 starts with cd and ls. If you can install an app on your laptop, you can start.
Do I need LinuxPath first?
No. DevOpsPath has its own Linux, networking and bash phases, cut to what DevOps work uses. LinuxPath goes deeper if you want more.
How long does it take?
About 235 hours at 45 minutes a step. At 7 hours a week that is roughly 8 months.
Does it prepare me for certifications?
Steps are tagged with the exam they cover: LFCS, CKAD, CKA, CKS, Terraform Associate, 2 AWS exams, Google Cloud DevOps and Azure AZ-400. Do a practice exam before you book.
Where does AI fit in?
You do everything by hand up to mid level. Phase P22 then teaches agents for Terraform, incident triage and reviews, with guardrails.
Will it get me a job?
Nobody can promise that. You finish with a public portfolio of Courier, 26 incident write-ups and an interview phase. That is what hiring managers ask about.
When does it open and what does it cost?
No date and no price yet. People on the waitlist hear first.
Get the first phases first
One email when the first phases open. No newsletter.
Thanks, there. You are on the list. You get one email when the first phases open.