dev-ops

Examen - Distributed Telemetry Archival Platform (DTAP™)

NodeJS (Poort 4000), PostgreSQL (12.22), InfluxDB (2.7) en Nginx Frontend achter Traefik.

Stap 1: Traefik (Infrastructure)

mkdir ~/traefik && cd ~/traefik
Maak de map voor de proxy
docker network create traefik
Maak het publieke netwerk aan (indien nog niet bestaat)
nano docker-compose.yml
Maak de Traefik config (zie Files)
docker compose up -d
Start Traefik (v3.6.7)

Stap 2: Dockerfiles

cd ~/examen-telemetry-platform
Ga naar de projectmap
nano api/Dockerfile
API Image: Node 20-bullseye, Poort 4000
nano frontend/Dockerfile
Frontend Image: Nginx 1.25

Stap 3: Applicatie Config & Data

nano .env
Definieer secrets (Postgres & Influx Credentials)
nano docker-compose.yml
Definieer services: api, frontend, postgres, influxdb
INFLUX_TOKEN=...
Tip: Zet een vast token in de Influx setup vars!

Stap 4: Starten & Verifiëren

docker compose up -d --build
Start de stack
docker compose logs -f api
Check of API connectie maakt met beide DB's
docker compose ps
Controleer of alles 'Up' is

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 (NodeJS)
frontend/Dockerfile
dockerfile
FROM nginx:1.25
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 Proxy Configuratie
.env (Project Root)
properties
# Postgres Config
POSTGRES_USER=myuser
POSTGRES_PWD=mypassword
POSTGRES_DB=telemetry
# InfluxDB Config
INFLUX_USER=admin
INFLUX_PWD=adminpassword123
INFLUX_ORG=helios
INFLUX_BUCKET=metrics
INFLUX_TOKEN=my-super-secret-admin-token
Secrets voor de applicatie. Zorg dat API en DB variabelen matchen.
docker-compose.yml (Project Root)
yaml
services:
api:
build: ./api
networks:
- traefik
- backend
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`{{domain-1}}`) && PathPrefix(`/api`)"
- "traefik.http.services.api.loadbalancer.server.port=4000"
- "traefik.docker.network=traefik"
environment:
- STORAGE_MODE=telemetry
- POSTGRES_HOST=postgres
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PWD=${POSTGRES_PWD}
- INFLUX_URL=http://influxdb:8086
- INFLUX_TOKEN=${INFLUX_TOKEN}
- INFLUX_ORG=${INFLUX_ORG}
- INFLUX_BUCKET=${INFLUX_BUCKET}
depends_on:
- postgres
- influxdb
frontend:
build: ./frontend
networks:
- traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.frontend.rule=Host(`{{domain-1}}`)"
- "traefik.docker.network=traefik"
postgres:
image: postgres:12.22
volumes:
- postgres-data:/var/lib/postgresql/data
- ./postgres-init.sql:/docker-entrypoint-initdb.d/postgres-init.sql:ro
networks:
- backend
environment:
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PWD}
influxdb:
image: influxdb:2.7
volumes:
- influx-data:/var/lib/influxdb2
networks:
- backend
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=${INFLUX_USER}
- DOCKER_INFLUXDB_INIT_PASSWORD=${INFLUX_PWD}
- DOCKER_INFLUXDB_INIT_ORG=${INFLUX_ORG}
- DOCKER_INFLUXDB_INIT_BUCKET=${INFLUX_BUCKET}
- DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=${INFLUX_TOKEN}
volumes:
postgres-data:
influx-data:
networks:
traefik:
external: true
backend:
De volledige stack configuratie. Let op InfluxDB 2.7 init variabelen.