Export Alle Cheat Sheets

Hieronder staan alle cheat sheets achter elkaar. Klik op de knop om ze als één groot PDF-boek op te slaan.

DevOps

Docker Basics

Commando's en configuratie voor de Nginx oefening.

Stap 1: Container Starten

docker pull nginx
Download de officiële Nginx image
docker run -d -p 80:80 --name devops-nginx nginx
Start container (poort 80->80, naam 'devops-nginx')

Stap 2: Aanpassen

docker exec -it devops-nginx bash
Open een interactieve shell in de container
apt-get update && apt-get install -y nano
Update packages en installeer nano editor (in container)
nano /usr/share/nginx/html/index.html
Bewerk index.html en voeg de tekst 'Ik kan docker!' toe
exit
Verlaat de container shell en keer terug naar de host

Stap 3: Opslaan

docker commit devops-nginx devops-image
Maak een nieuwe image van de gewijzigde container
docker save -o ~/mijnimage.tar devops-image
Exporteer de image naar een .tar bestand in je home directory
DevOps

Examen URL Shortener

Deploy een NodeJS API en Nginx Frontend met Redis storage achter een Traefik v3 reverse proxy.

Stap 1: Traefik (Infrastructure)

mkdir -p ~/traefik && cd ~/traefik
Maak de map voor de reverse proxy aan
docker network create traefik
Maak het gedeelde netwerk aan voor de proxy
nano docker-compose.yml
Maak de Traefik configuratie aan (zie Files voor inhoud)
docker compose up -d
Start de Traefik reverse proxy

Stap 2: Dockerfiles Bouwen

cd ~/examen-url-shortener/backend
Ga naar de backend map
nano Dockerfile
Maak de Dockerfile aan voor de backend (zie Files)
cd ~/examen-url-shortener/frontend
Ga naar de frontend map
nano Dockerfile
Maak de Dockerfile aan voor de frontend (zie Files)

Stap 3: Applicatie Opzetten

cd ~/examen-url-shortener
Ga terug naar de root van het project
nano docker-compose.yml
Maak de main compose file aan (zie Files)
nano .env
Maak het secrets bestand aan (zie Files)

Stap 4: Starten & Testen

docker compose up -d
Start de applicatie (API + Frontend + Redis)
docker compose down -v && docker compose up -d --build
Gebruik dit als je wijzigingen maakt aan Dockerfiles of config

Bestanden

backend/Dockerfiledockerfile
FROM node:20-bullseye
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 4000
CMD ["node", "index.js"]
De NodeJS backend (Port 4000)
frontend/Dockerfiledockerfile
FROM nginx:1.25
COPY . /usr/share/nginx/html
De Nginx frontend
~/traefik/docker-compose.ymlyaml
services:
traefik:
image: traefik:v3.6.7
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`{{domain-2}}`)"
- "traefik.http.routers.dashboard.service=api@internal"
networks:
traefik:
external: true
De Reverse Proxy configuratie
~/examen-url-shortener/docker-compose.ymlyaml
services:
backend:
build: ./backend
env_file: .env
networks:
- traefik
- backend
labels:
- "traefik.enable=true"
- "traefik.http.routers.backend.rule=Host(`{{domain-1}}`) && PathPrefix(`/api`)"
- "traefik.http.services.backend.loadbalancer.server.port=4000"
frontend:
build: ./frontend
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`{{domain-1}}`)"
redis:
image: redis:7
volumes:
- redis-data:/data
networks:
- backend
volumes:
redis-data:
networks:
traefik:
external: true
backend:
De hoofdapplicatie (Services + Redis)
~/examen-url-shortener/.envproperties
STORAGE=redis
REDIS_HOST=redis
REDIS_PORT=6379
De hoofdapplicatie .env
DevOps

Examen Blog

Full stack met NodeJS, Postgres, en beveiligde Admin via Traefik.

Stap 1: Traefik Setup

mkdir ~/traefik && cd ~/traefik
Maak de map voor de proxy
docker network create traefik
Maak het publieke netwerk
nano docker-compose.yml
Maak de config (zie Files sectie)
docker compose up -d
Start de proxy server

Stap 2: Dockerfiles

cd ~/examen-blog/backend
Ga naar de backend map
nano Dockerfile
Maak de API Dockerfile (zie Files: API Dockerfile)
cd ../frontend
Ga naar de frontend map
nano Dockerfile
Maak de Frontend Dockerfile (zie Files: Frontend Dockerfile)

Stap 3: Authenticatie & Config

sudo apt-get install apache2-utils
Installeer htpasswd tool (indien niet aanwezig)
htpasswd -nb bloemkool SuperLekkerEten!
Genereer de hash voor Traefik labels
nano .env
Maak het environment bestand aan

Stap 4: Starten

docker compose up -d --build
Bouw images en start alles op
docker compose logs -f api
Debug: Check database connectie

Bestanden

api/Dockerfiledockerfile
FROM node:20-bullseye
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8000
CMD ["node", "index.js"]
Backend luistert op poort 8000
frontend/Dockerfiledockerfile
FROM node:20-bullseye
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 4000
CMD ["node", "index.js"]
Frontend luistert op poort 4000
~/traefik/docker-compose.ymlyaml
services:
traefik:
image: traefik:v3.6.7
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`{{domain-2}}`)"
- "traefik.http.routers.dashboard.service=api@internal"
networks:
traefik:
external: true
De infrastructuur layer (Traefik v3)
~/examen-blog/docker-compose.ymlyaml
services:
# --- Backend API ---
backend:
build: ./backend
networks:
- traefik
- backend
env_file: .env
labels:
- "traefik.enable=true"
- "traefik.http.routers.backend.rule=Host(`{{domain-1}}`) && PathPrefix(`/api`)"
- "traefik.http.services.backend.loadbalancer.server.port=8000"
- "traefik.docker.network=traefik"
# --- Frontend (Node EJS) ---
frontend:
build: ./frontend
networks:
- traefik
- backend
environment:
- API_URL=http://backend:8000
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`{{domain-1}}`)"
- "traefik.http.services.frontend.loadbalancer.server.port=4000"
- "traefik.docker.network=traefik"
# --- Admin (Static Nginx) ---
admin:
image: nginx:1.25
volumes:
# Mount ./admin naar /usr/share/nginx/html/admin
# Hierdoor werkt de URL /admin vanzelf zonder StripPrefix problemen
- ./admin:/usr/share/nginx/html/admin
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.admin.rule=Host(`{{domain-1}}`) && PathPrefix(`/admin`)"
# Pas aan met output van: htpasswd -nb bloemkool SuperLekkerEten!
- "traefik.http.middlewares.admin-auth.basicauth.users=bloemkool:$$apr1$$..."
- "traefik.http.routers.admin.middlewares=admin-auth"
# --- Database ---
db:
image: postgres:12.22
volumes:
- postgres-data:/var/lib/postgresql/data
- ./postgres-init.sql:/docker-entrypoint-initdb.d/postgres-init.sql
networks:
- backend
env_file: .env
volumes:
postgres-data:
networks:
traefik:
external: true
backend:
De applicatie configuratie. Let op: postgres-init.sql moet actief zijn.
~/examen-blog/.envproperties
STORAGE=postgres
POSTGRES_HOST=db
POSTGRES_USER=postgres
POSTGRES_PWD=mysecret
POSTGRES_DB=blog
Environment variabelen.
DevOps

Examen Todo

NodeJS API (poort 4000), Statische Nginx Frontend & MongoDB achter Traefik v3.

Stap 1: Traefik (Infrastructure)

mkdir ~/traefik && cd ~/traefik
Maak de map aan
docker network create traefik
Maak het publieke netwerk
nano docker-compose.yml
Maak de Traefik config (zie Files)
docker compose up -d
Start de proxy server

Stap 2: Dockerfiles Bouwen

cd ~/examen-todo/backend
Ga naar de backend map
nano Dockerfile
Maak de API Dockerfile (Node 20, Poort 4000)
cd cd ~/examen-todo/frontend
Ga naar de frontend map
nano Dockerfile
Maak de Frontend Dockerfile (Nginx 1.25)

Stap 3: Configureren

cd ~/examen-todo
Terug naar project root
nano docker-compose.yml
Maak de applicatie stack aan (zie Files)
nano .env
Maak het secrets bestand aan

Stap 4: Starten & Testen

docker compose up -d --build
Bouw en start de applicatie
docker compose logs -f api
Check of API verbindt met MongoDB

Bestanden

api/Dockerfiledockerfile
FROM node:20-bullseye
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 4000
CMD ["node", "index.js"]
Backend image. Let op EXPOSE 4000!
frontend/Dockerfiledockerfile
FROM nginx:1.25
COPY . /usr/share/nginx/html
Statische frontend (Nginx)
~/examen-todo/.envproperties
STORAGE=mongodbMONGODB_HOST=db
MONGODB_DB=examen
MONGODB_USER=examen
MONGODB_PWD=examenwachtwoord
Environment variabelen voor de API connectie
~/traefik/docker-compose.ymlyaml
services:
traefik:
image: traefik:v3.6.7
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`{{domain-2}}`)"
- "traefik.http.routers.dashboard.service=api@internal"
networks:
traefik:
external: true
De Reverse Proxy setup (Traefik v3)
~/examen-todo/docker-compose.ymlyaml
services:
backend:
build: ./backend
env_file: .env
networks:
- traefik
- backend
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.backend.rule=Host(`{{domain-1}}`) && PathPrefix(`/api`)"
- "traefik.http.services.backend.loadbalancer.server.port=4000"
frontend:
build: ./frontend
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.frontend.rule=Host(`{{domain-1}}`)"
db:
image: mongo:4.4.6
environment:
- MONGO_INITDB_DATABASE=examen
volumes:
- mongodb-data:/data/db
# Zorg dat dit bestand bestaat in je map (uit de opdracht files)
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
networks:
- backend
volumes:
mongodb-data:
networks:
gateway:
external: true
backend:
De applicatie stack. Let op de 'mongo-init.js' mount!
DevOps

Voorbeeldexamen - ChatBox

MongoDB (4.4), Node API (poort 3000) en Nginx Frontend.

Stap 1: Traefik (Infrastructure)

mkdir ~/traefik && cd ~/traefik
Maak de map voor de proxy
docker network create traefik
Maak het publieke netwerk
nano docker-compose.yml
Maak de config (zie Files)
docker compose up -d
Start Traefik (v3.6.7)

Stap 2: Dockerfiles

cd chatAPI
Ga naar de backend map
nano Dockerfile
Maak API image (Node 20, Poort 3000)
cd ../frontend
Ga naar de frontend map
nano Dockerfile
Maak Frontend image (Nginx)

Stap 3: Applicatie Config

cd ..
Ga terug naar de root van het project
nano docker-compose.yml
Maak de stack aan (zie Files)
MONGO_URL=mongodb
Let op: Service naam moet 'mongodb' zijn!

Stap 4: Starten

docker compose up -d --build
Start de ChatBox
docker compose logs -f api
Debug database connectie

Bestanden

chatAPI/Dockerfiledockerfile
FROM node:20-bullseye
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
Backend (Let op: Poort 3000)
frontend/Dockerfiledockerfile
FROM nginx
COPY . /usr/share/nginx/html
Frontend (Nginx)
~/traefik/docker-compose.ymlyaml
services:
traefik:
image: traefik:v3.6.7
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`{{domain-2}}`)"
- "traefik.http.routers.dashboard.service=api@internal"
networks:
traefik:
external: true
Traefik v3 configuratie
docker-compose.yml (Project Root)yaml
services:
chatapi:
build: ./chatAPI
networks:
- traefik
- backend
labels:
- "traefik.enable=true"
- "traefik.http.routers.backend.rule=Host(`{{domain-1}}`) && PathPrefix(`/api`)"
- "traefik.http.services.backend.loadbalancer.server.port=3000"
- "traefik.docker.network=traefik"
environment:
- MONGO_USER=${MONGO_USER}
- MONGO_PWD=${MONGO_PWD}
- MONGO_URL=${MONGO_URL}
frontend:
build: ./frontend
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`{{domain-1}}`)"
- "traefik.docker.network=traefik"
mongodb:
image: mongo:4.4
volumes:
- mongo-data:/data/db
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
networks:
- backend
environment:
- MONGO_INITDB_ROOT_USERNAME=${MONGO_USER}
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_PWD}
volumes:
mongo-data:
networks:
traefik:
external: true
backend:
De applicatie stack. Let op service naam 'mongodb', environment variables en Mongo versie 4.4.
.env (Project Root)yaml
MONGO_USER=admin
MONGO_PWD=S3cret
MONGO_URL=mongodb
De applicatie .env.