dev-ops
Examen Todo
NodeJS API (poort 4000), Statische Nginx Frontend & MongoDB achter Traefik v3.
Stap 1: Traefik (Infrastructure)
mkdir ~/traefik && cd ~/traefikMaak de map aan
docker network create traefikMaak het publieke netwerk
nano docker-compose.ymlMaak de Traefik config (zie Files)
docker compose up -dStart de proxy server
Stap 2: Dockerfiles Bouwen
cd ~/examen-todo/backendGa naar de backend map
nano DockerfileMaak de API Dockerfile (Node 20, Poort 4000)
cd cd ~/examen-todo/frontendGa naar de frontend map
nano DockerfileMaak de Frontend Dockerfile (Nginx 1.25)
Stap 3: Configureren
cd ~/examen-todoTerug naar project root
nano docker-compose.ymlMaak de applicatie stack aan (zie Files)
nano .envMaak het secrets bestand aan
Stap 4: Starten & Testen
docker compose up -d --buildBouw en start de applicatie
docker compose logs -f apiCheck of API verbindt met MongoDB
Bestanden & Configuraties
api/Dockerfile
dockerfile
FROM node:20-bullseyeWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 4000CMD ["node", "index.js"]Backend image. Let op EXPOSE 4000!
frontend/Dockerfile
dockerfile
FROM nginx:1.25COPY . /usr/share/nginx/htmlStatische 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: trueDe 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: - backendvolumes: mongodb-data:networks: gateway: external: true backend:De applicatie stack. Let op de 'mongo-init.js' mount!