dev-ops

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

chatAPI/Dockerfile
dockerfile
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/Dockerfile
dockerfile
FROM nginx
COPY . /usr/share/nginx/html
Frontend (Nginx)
~/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
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.