Skole projekt
Februar 2025
IoT API hosted med docker
Et centralt API, hostet med Docker, sørgede for kommunikationen mellem IoT-enhederne og serveren.
Vi har i et skoleprojekt udviklet en IoT-indeklimaopsætning, hvor alle enheder skulle gemme deres data på en central server. Til det formål skrev jeg et API i ExpressJS. API’et skulle være letvægts, da det skulle køre på en Raspberry Pi, og derfor valgte jeg Express som framework. Jeg brugte Docker til at administrere Express-serveren på Pi’en, hvilket samtidig gjorde det nemmere at opsætte en Zero-downtime-konfiguration, når nye versioner af API’et blev rullet ud.
01
Sikkerhed
Autentificeringen til API'et bestod af simple API-nøgler, da de IoT-enheder, vi arbejdede med, havde en begrænset mængde hukommelse. Jeg brugte Zod til at validere alle typer data, der blev sendt til API'et – lige fra API-nøglen til temperaturmålingerne.
const result = apiKeySchema.safeParse({ apiKey: apiKey });
if (!result.success) {
res.status(400).json(result.error.flatten().fieldErrors);
return;
}
02
Deployment
Systemet skulle køre på en Raspberry Pi, og jeg syntes, det var en oplagt mulighed for at øve mig lidt i Docker. Jeg brugte en kombination af Nginx, Docker og et CI/CD-script til at opsætte en Blue-Green Deployment – eller en Zero-downtime-opsætning – som samtidig ikke taber nogen requests. Når en ny version af API'et er klar, kan man køre scriptet. Det bygger et nyt image og starter det i en ny container. Derefter opdateres Nginx' reverse proxy-konfiguration, så trafikken peger over på den nye container. Når den nye container er taget i brug, og den gamle er færdig med at besvare eventuelle igangværende requests, bliver den gamle lukket ned og fjernet fra Pi'en. Dette sikrer, at vi aldrig mister data fra sensorerne, når systemet opdateres.
Links