dev-ops

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 & Configuraties

api/Dockerfile
dockerfile
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/Dockerfile
dockerfile
FROM nginx:1.25
COPY . /usr/share/nginx/html
Statische frontend (Nginx)
~/examen-todo/.env
properties
STORAGE=mongodbMONGODB_HOST=db
MONGODB_DB=examen
MONGODB_USER=examen
MONGODB_PWD=examenwachtwoord
Environment variabelen voor de API connectie
~/traefik/docker-compose.yml
yaml
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.yml
yaml
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!