← All courses
Track Β· DevOps Β· Beginner β†’ Intermediate

Ship software the way real teams ship it.

From the command line to a full CI/CD pipeline running containers in the cloud. No prior experience needed β€” we start at zero and build up to work you can put on a CV.

Start learning See the labs
Level
Beginner β†’ Intermediate
Lessons
24 notes
Labs
8 hands-on
Pace
Self-paced
Price
Free to read
Your progress0%
The curriculum

Read, do, complete, move on.

Open a lesson, read the notes, then mark it complete. Your progress is saved on this device.

Level 1 Β· Beginner

Foundations: the toolkit every engineer shares

Before pipelines and clusters, you need the ground floor: the terminal, Git, and your first container. Everything later stands on this.

01

The developer’s terminal

Foundations
β€ΊWhat DevOps actually isβœ“

DevOps is not a tool and not a job title you buy with a certificate. It is a way of working where the people who write software and the people who run it stop throwing work over a wall and instead own it together, end to end.

Dev + OpsPlanCodeBuildTestReleaseDeployOperateMonitorone team owns it end to end, continuously
DevOps: build, ship & run as one loop

The old way: developers wrote code, zipped it up, and handed it to an operations team who tried to make it run in production. When it broke at 2am, each side blamed the other. DevOps collapses that wall. The same team builds it, tests it automatically, ships it automatically, and watches it in production.

Three ideas carry the whole field:

  • Automate everything that repeats β€” building, testing, deploying.
  • Make small changes often β€” ten tiny safe releases beat one terrifying big one.
  • Measure what happens β€” you cannot fix what you cannot see.
For us: A Douala fintech that deploys once a quarter lives in fear of every release. The same team on a DevOps workflow ships a fix the same afternoon a bug is found. For a small African team competing with bigger players, speed and reliability is the edge β€” you do not need a 50-person ops department, you need good automation.
β€ΊLiving in the command line (Linux basics)βœ“

Servers do not have a mouse. Almost every server on earth runs Linux, and you talk to it by typing. The terminal feels intimidating for a week, then becomes the fastest tool you own.

The commands you will use every single day:

  • pwd β€” where am I? (print working directory)
  • ls -la β€” list everything here, including hidden files
  • cd projects β€” move into a folder; cd .. goes back up
  • cat file.txt β€” print a file; less file.txt to scroll
  • mkdir, cp, mv, rm β€” make, copy, move, remove
  • grep "error" app.log β€” search inside files
Example: Find every line containing the word failed in today’s log and count them: grep failed app.log | wc -l. The | (pipe) feeds the output of one command into the next β€” this chaining is the heart of the Unix way.
For us: You can practise all of this free on your own laptop with WSL on Windows, or on a cheap VPS. You do not need expensive hardware β€” a $4/month server teaches you more than any video.
β€ΊFiles, permissions and packagesβœ“

Two things trip up every beginner on Linux: permissions and installing software.

Permissions

Every file has an owner and a set of permissions: read (r), write (w), execute (x). When a script "won’t run", it usually just needs permission: chmod +x deploy.sh makes it executable. When you see Permission denied, you either need sudo (run as administrator) or you are touching a file you do not own.

Packages

You do not download installers on Linux β€” you use a package manager. On Ubuntu/Debian that is apt:

  • sudo apt update β€” refresh the catalogue
  • sudo apt install git β€” install software
Example: Set up a fresh server for work in three lines: sudo apt update && sudo apt install -y git curl docker.io. The -y answers "yes" to prompts so it runs unattended.
02

Version control with Git

Core skill
β€ΊWhy Git, and the three-step rhythmβœ“

Git is the time machine for your code. It records every change so you can go back, see who changed what and when, and let many people work on the same project without overwriting each other.

Working diryour editsaddStagingchosen changescommitCommitpushGitHub
Git: add β†’ commit β†’ push

Working without Git β€” final.js, final_v2.js, final_REAL_final.js β€” is a nightmare you will never go back to.

The daily rhythm is three steps:

  • git add . β€” stage your changes (choose what goes in)
  • git commit -m "Add login form" β€” save a snapshot with a message
  • git push β€” send it to the shared server (GitHub)
Example: Start tracking any folder: git init, then git add ., then git commit -m "First version". You now have a complete history you can return to forever.
For us: Git works fully offline β€” commit all day on a slow or dropped connection, then push once when the network is good. For anyone working with unreliable internet, this is a gift.
β€ΊBranches: working without fearβœ“

A branch is a parallel copy of your project where you can try something without touching the working version. This is what lets teams move fast without breaking things.

mainfeature branchmerge back
Branch off, work safely, merge back

The pattern: main is always the stable, working code. To add a feature you branch off, do your work, then merge back when it is ready.

  • git checkout -b feature/payments β€” create and switch to a new branch
  • work, add, commit as normal
  • git checkout main then git merge feature/payments β€” bring it back in
Example: You are mid-way through a risky change when a client reports a bug in production. No problem β€” your risky work is on its own branch. Switch to main, fix the bug, ship it, then switch back and carry on. Nothing collided.
β€ΊGitHub and pull requestsβœ“

GitHub is where your Git history lives online so a team can share it. It adds one hugely important idea on top of Git: the pull request (PR).

A pull request says: "here is my branch, please review it before it goes into main." A teammate reads the changes, comments, and approves. This review step is where quality and knowledge-sharing happen β€” and later, where automated tests run before anything merges.

Example: You push feature/payments and open a PR titled "Add MTN MoMo checkout". A reviewer spots that you forgot to handle a failed payment, you fix it in the same branch, the PR updates automatically, they approve, you merge. The bug never reached a customer.
For us: A public GitHub profile full of real PRs is the strongest CV a young African developer can have. Employers abroad cannot see your diploma, but they can see your code. This is how people get hired remotely from YaoundΓ© or Buea.
03

Containers with Docker

Game-changer
β€ΊWhat a container is (and why it changed everything)βœ“

"It works on my machine" is the oldest excuse in software. Docker killed it.

Virtual machinesContainersAppGuest OSheavy, GBsAppGuest OSheavy, GBsShared host OS / kernelApplight, MBsApplight, MBsApplight, MBs
Container vs virtual machine

A container packages your application with everything it needs β€” the code, the runtime, the libraries, the settings β€” into one sealed box that runs identically on your laptop, a colleague’s laptop, and a server in a data centre.

People confuse containers with virtual machines. A VM carries a whole operating system (heavy, slow to start, gigabytes). A container shares the host’s kernel and carries only your app (light, starts in a second, megabytes). You can run dozens of containers where you could run two or three VMs.

For us: Containers mean a Cameroonian developer’s app behaves exactly the same on a laptop in Limbe as on a server in Europe. No more "but it ran fine here" when you deploy. That reliability is worth a fortune to a small team.
β€ΊImages, Dockerfile, build and runβœ“

Two words to keep straight: an image is the recipe (a saved blueprint); a container is a running instance of that image. You build an image once and run many containers from it.

You describe the image in a Dockerfile β€” a plain list of steps:

  • FROM node:20 β€” start from an official Node.js image
  • COPY . /app β€” copy your code in
  • RUN npm install β€” install dependencies
  • CMD ["node","server.js"] β€” how to start it
Example: Build and run in two commands: docker build -t myapp . then docker run -p 3000:80 myapp. The -p 3000:80 maps your laptop’s port 3000 to the container’s port 80 β€” now open the browser and your app is live.
β€ΊDocker Compose: many services at onceβœ“

Real apps are not one container. A typical web app is a frontend, a backend API, and a database β€” three containers that must talk to each other. Starting and wiring them by hand is painful.

Docker Compose lets you describe the whole stack in one docker-compose.yml file and start it all with one command: docker compose up.

Example: Your docker-compose.yml lists a web service, an api service, and a db service (PostgreSQL). One docker compose up starts all three, puts them on the same private network, and your API reaches the database just by the name db. A new teammate clones the repo and has the entire system running in 30 seconds.
04

Your first deployment

Make it live
β€ΊWhat CI/CD meansβœ“

Two abbreviations you will hear constantly. CI (Continuous Integration): every time someone pushes code, it is automatically built and tested, so broken code is caught in minutes, not weeks. CD (Continuous Delivery/Deployment): once tests pass, the code is automatically shipped to a server.

PushBuildTestDeploytest fails β†’ pipeline stops, nothing ships broken
A CI/CD pipeline

Together they form a pipeline: push β†’ build β†’ test β†’ deploy, with no human doing it by hand. Humans make mistakes when they deploy manually at midnight; a pipeline does the same safe steps every time.

For us: A pipeline is the great equaliser. A two-person startup in Bamenda with a good pipeline deploys more safely than a sloppy big company. It is free (GitHub Actions gives generous free minutes) and it is the single most valued DevOps skill on a CV.
β€ΊDeploying to a real serverβœ“

Let us get something on the internet. The simplest real deployment: a cheap Linux server (a VPS) running your container.

The steps, which you will later automate:

  • Rent a VPS (DigitalOcean, Hetzner, Contabo β€” from a few dollars a month)
  • Connect with ssh user@your-server-ip
  • Install Docker, copy your image across, docker run it
  • Point a domain name at the server’s IP
Example: Deploy a container and keep it running even after you log out: docker run -d --restart unless-stopped -p 80:3000 myapp. The -d runs it in the background; --restart unless-stopped brings it back automatically if the server reboots.
β€ΊEnvironments and secretsβœ“

Your app needs settings that differ between your laptop and production: database passwords, API keys, which URL to call. Two rules keep you safe.

Never hard-code secrets in your code. A password committed to Git is a password leaked forever β€” people scan GitHub for exactly this. Keep secrets in environment variables instead, loaded at runtime.

Keep environments separate. You want a development setup, maybe a staging copy for testing, and production for real users β€” each with its own config, so a test never touches real customer data.

Example: Pass a secret at run time instead of baking it in: docker run -e DB_PASSWORD="$DB_PASSWORD" myapp. The value comes from the server’s environment, never from the code, so your Git history stays clean.
Level 2 Β· Intermediate

Engineering: pipelines, clusters and infrastructure as code

Now we industrialise. You will automate the whole delivery flow, orchestrate containers at scale, define servers in code, and watch it all in production.

05

CI/CD pipelines with GitHub Actions

Automation
β€ΊYour first pipelineβœ“

GitHub Actions runs your pipeline for free, right where your code already lives. You describe it in a YAML file under .github/workflows/ and it triggers on events β€” most often "on every push".

PushBuildTestDeploytest fails β†’ pipeline stops, nothing ships broken
A CI/CD pipeline

A workflow is made of jobs, and each job is a list of steps. A step either runs a command or uses a pre-made action.

Example: A minimal workflow that checks out your code and runs tests on every push:
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install && npm test
β€ΊBuild, test, deploy stagesβœ“

A real pipeline has stages that run in order, and a later stage only runs if the earlier one passed. This is your safety net.

  • Build β€” compile the code, build the Docker image
  • Test β€” run automated tests; if any fail, stop here and alert
  • Deploy β€” only reached on the main branch, only if tests passed

You make jobs wait for each other with needs:, so deploy has needs: [build, test]. Broken code physically cannot reach production because the deploy step never runs.

For us: This is the discipline that lets a lean African team sleep at night. The machine enforces the rule "never ship untested code" far better than a tired human on a Friday evening.
β€ΊArtifacts, caching and secretsβœ“

Three things make pipelines fast and safe.

Caching: downloading dependencies on every run wastes minutes. Cache them so repeated runs are quick β€” a real cost saving on limited free minutes.

Artifacts: the output of a build (a compiled app, a built image) can be saved and passed to the next job instead of rebuilt.

Secrets: your deploy needs a server key or a registry password. Store these in GitHub’s encrypted Secrets, never in the YAML. Reference them as ${{ secrets.SSH_KEY }} β€” they are masked in logs so they never leak.

06

Orchestration with Kubernetes

Scale
β€ΊWhy orchestration existsβœ“

One container on one server is easy. But what happens when that server dies at 3am? Or when traffic triples during a campaign and one container cannot cope? Or when you need to update without downtime?

Desired state: 3 replicasPod 1Pod 2crashesPod 3K8s restarts it automatically
Kubernetes self-healing

Kubernetes (K8s) is the system that manages containers across many servers for you. You tell it the desired state β€” "I want 3 copies of my app running at all times" β€” and it makes that true and keeps it true. A container crashes? It starts a new one. A server dies? It moves the work elsewhere. This is called self-healing.

For us: Kubernetes has a real learning curve, and not every project needs it β€” a small site is fine on one VPS with Docker. But it is the most in-demand DevOps skill globally, and remote employers pay well for it. Learning it opens the international market from wherever you are.
β€ΊPods, deployments and servicesβœ“

Three core objects run almost everything in Kubernetes.

Desired state: 3 replicasPod 1Pod 2crashesPod 3K8s restarts it automatically
Kubernetes self-healing
  • A Pod is the smallest unit β€” usually one running container.
  • A Deployment manages Pods: it keeps the number you asked for running and handles rolling updates.
  • A Service gives your Pods a stable address, because individual Pods come and go. It also load-balances traffic across them.
Example: You declare a Deployment with replicas: 3. Kubernetes runs three Pods. You push a new version; Kubernetes replaces them one at a time (a rolling update) so your users never see downtime. Delete a Pod by hand and watch a replacement appear within seconds β€” that is the desired-state engine at work.
β€ΊConfig, secrets and health checksβœ“

To run safely in production, Kubernetes needs to know three more things.

ConfigMaps hold non-secret settings (which API to call, feature flags). Secrets hold sensitive values (passwords, keys), kept separate from your images.

Health checks (probes) let Kubernetes know if a Pod is actually healthy. A liveness probe asks "are you alive?" β€” if not, restart it. A readiness probe asks "are you ready for traffic?" β€” if not, hold traffic back until it is. Without these, Kubernetes would send users to a Pod that is still starting up or silently frozen.

07

Infrastructure as Code with Terraform

Repeatable
β€ΊWhy define infrastructure in codeβœ“

Clicking around a cloud console to create servers, networks and databases works once β€” and is a disaster to repeat, document or recover. Infrastructure as Code (IaC) means you write down your infrastructure as text files, version it in Git, and let a tool build it.

Code (text files)main.tfplan/applyTerraformServersNetwork, DBversion it in Git β†’ rebuild with one command
Infrastructure as Code

Terraform is the most popular IaC tool. You describe what you want (resources); Terraform figures out how to create, change or destroy them to match.

For us: If a whole environment lives in a few text files, rebuilding after a disaster is one command, not a week of remembering what you clicked. And you can spin up an identical staging copy to test safely β€” huge for a small team with no room for mistakes in production.
β€ΊProviders, resources and stateβœ“

Three concepts run Terraform.

  • A provider is the plugin for a given platform (AWS, GCP, Azure, DigitalOcean).
  • A resource is one thing you want to exist β€” a server, a database, a DNS record.
  • The state file is Terraform’s memory of what it has already built, so it knows the difference between "create new" and "change existing".
Example: A few lines declare a server: resource "digitalocean_droplet" "web" { name = "web-1"; size = "s-1vcpu-1gb"; region = "fra1" }. Terraform reads this and creates exactly that server. Change size and re-apply, and it resizes the existing one β€” it does not make a second.
β€ΊPlan, apply, and modulesβœ“

The Terraform workflow is deliberately safe.

  • terraform plan β€” shows you exactly what will change before anything happens. Always read this.
  • terraform apply β€” makes the changes.
  • terraform destroy β€” tears it all down cleanly (great for temporary test environments, and for not paying for idle servers).

Modules let you package a reusable piece of infrastructure (say, "a standard web server + firewall") and use it many times with different inputs β€” the same don’t-repeat-yourself principle as functions in code.

08

Monitoring and the capstone

See it all
β€ΊMetrics, logs and the golden signalsβœ“

Once your app is live, you are flying blind unless you watch it. Two kinds of data matter: metrics (numbers over time β€” CPU, memory, request rate) and logs (the detailed text record of what happened).

LatencyTrafficErrorsSaturationwatch these four on any live service
The four golden signals

Prometheus collects metrics; Grafana turns them into dashboards you can actually read. The four golden signals to watch on any service:

  • Latency β€” how slow are responses?
  • Traffic β€” how much demand?
  • Errors β€” how many requests fail?
  • Saturation β€” how full are your resources?
β€ΊAlerting without the noiseβœ“

A dashboard nobody looks at is useless at 3am. Alerting pushes a message (email, SMS, Slack) when something crosses a threshold β€” "errors above 5% for 5 minutes".

The art is to alert on symptoms users feel, not on every twitch. Alert on "the site is returning errors", not on "CPU hit 80% for 10 seconds". Too many false alarms and your team learns to ignore alerts β€” the most dangerous failure of all, called alert fatigue.

For us: A simple, well-tuned alert that texts you when the site is actually down is worth more than a wall of fancy graphs. Start small: know first and fast when something real breaks.
β€ΊCapstone: the full pipelineβœ“

Here is where everything connects. Your capstone project ties the whole course into one real system:

PushBuildTestDeploytest fails β†’ pipeline stops, nothing ships broken
A CI/CD pipeline
  • Code lives in Git, reviewed through pull requests
  • A GitHub Actions pipeline builds, tests and ships on every merge to main
  • The app runs as a Docker container, orchestrated by Kubernetes
  • The infrastructure is defined in Terraform
  • Prometheus and Grafana watch it, with one real alert wired up

When you can point an employer at this β€” "I built this, here is the repo, here is the live dashboard" β€” you are no longer learning DevOps. You are doing it.

Where you actually build

Eight labs that build one real pipeline

Reading is free and open. The labs are where it becomes real, so they live behind a free account, which keeps your progress and gives you a certificate.

Create a free Kaevor account to launch any lab and earn your certificate. One account, all your courses.

Create free account
πŸ”’

Lab 1 β€” Command the terminal

Navigate a Linux filesystem, chain commands with pipes, and write your first bash script.

Linux Β· Bash
πŸ”’

Lab 2 β€” Your first repo and PR

Initialise a repo, branch, commit, push to GitHub and open a pull request.

Git Β· GitHub
πŸ”’

Lab 3 β€” Dockerise an app

Write a Dockerfile, build an image, and run your app in a container.

Docker
πŸ”’

Lab 4 β€” A Compose stack

Run a web app, API and database together with one docker-compose.yml.

Docker Compose
πŸ”’

Lab 5 β€” Build a pipeline

Write a GitHub Actions workflow that builds and tests on every push.

GitHub Actions
πŸ”’

Lab 6 β€” Deploy to a server

Ship your container to a real VPS and point a domain at it.

SSH Β· VPS
πŸ”’

Lab 7 β€” Terraform a server

Define a cloud server in code and bring it up with plan and apply.

Terraform
πŸ”’

Lab 8 β€” Watch it live

Stand up Prometheus and Grafana and build a dashboard with one real alert.

Prometheus Β· Grafana
Where this takes you

Two levels, one path

Level 1

Beginner

Terminal, Git, Docker and your first live deployment. The toolkit every engineer shares.

Level 2

Intermediate

CI/CD, Kubernetes, Terraform and monitoring β€” the full professional delivery pipeline.