dev-ops
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 ~/traefikMaak de map voor de reverse proxy aan
docker network create traefikMaak het gedeelde netwerk aan voor de proxy
nano docker-compose.ymlMaak de Traefik configuratie aan (zie Files voor inhoud)
docker compose up -dStart de Traefik reverse proxy
Stap 2: Dockerfiles Bouwen
cd ~/examen-url-shortener/backendGa naar de backend map
nano DockerfileMaak de Dockerfile aan voor de backend (zie Files)
cd ~/examen-url-shortener/frontendGa naar de frontend map
nano DockerfileMaak de Dockerfile aan voor de frontend (zie Files)
Stap 3: Applicatie Opzetten
cd ~/examen-url-shortenerGa terug naar de root van het project
nano docker-compose.ymlMaak de main compose file aan (zie Files)
nano .envMaak het secrets bestand aan (zie Files)
Stap 4: Starten & Testen
docker compose up -dStart de applicatie (API + Frontend + Redis)
docker compose down -v && docker compose up -d --buildGebruik dit als je wijzigingen maakt aan Dockerfiles of config
Bestanden & Configuraties
backend/Dockerfile
dockerfile
FROM node:20-bullseyeWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 4000CMD ["node", "index.js"]De NodeJS backend (Port 4000)
frontend/Dockerfile
dockerfile
FROM nginx:1.25COPY . /usr/share/nginx/htmlDe Nginx frontend
~/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 configuratie
~/examen-url-shortener/docker-compose.yml
yaml
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: - backendvolumes: redis-data:networks: traefik: external: true backend:De hoofdapplicatie (Services + Redis)
~/examen-url-shortener/.env
properties
STORAGE=redis REDIS_HOST=redis REDIS_PORT=6379 De hoofdapplicatie .env