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

backend/Dockerfile
dockerfile
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/Dockerfile
dockerfile
FROM nginx:1.25
COPY . /usr/share/nginx/html
De 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: true
De 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:
- backend
volumes:
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