Het systeem is ontworpen om te draaien op Hetzner Cloud servers met Ubuntu, en bevat geautomatiseerde data aggregatie en cleanup om database opslag efficiënt te beheren. Mijn achtergrond is in business intelligence, dus het bouwen van data pipelines en dashboards is wat ik doe voor de kost, maar ik wilde een paar tools gebruiken die ik niet vaak tegenkom bij mijn huidige klanten om mijn vaardigheden bij te houden in een snel evoluerende markt. Ik heb de grote stukken python en SQL code weggelaten om de leesbaarheid te verbeteren, als je de volledige technische specs wilt kun je ze hier vinden in het Medium artikel dat ik schreef over dit hobby project.
Creëer Twee Servers:
Ik gebruik de kleinste servers hiervoor van type CX22. Ze hebben 2 CPU's, 4GB RAM en 40GB SSD voor 3,29€ per maand. Ik maak ook regelmatig snapshots van mijn servers in Hetzner om ervoor te zorgen dat ik een recente versie heb om te herstellen wanneer er iets misgaat - wat gebeurde bij het proberen te installeren van HTTPS op de Metabase server.
Het gebruiken van twee servers in plaats van één is een design keuze die verschillende voordelen biedt, met name wat betreft schaalbaarheid, security en performance. Echter, het is niet strikt noodzakelijk, en je kunt absoluut alles draaien op één server als je vereisten bescheiden zijn. Laten we de redenering achter het gebruiken van twee servers verkennen en wanneer het zinvol kan zijn om alles te consolideren op één.
De primaire reden voor het gebruiken van twee servers is de separation of concerns. Door PostgreSQL en de Python scripts te draaien op één server, houd je de data processing en storage layer geïsoleerd van de visualisatie layer, die wordt behandeld door Metabase op de tweede server. Deze scheiding maakt het gemakkelijker om resources te beheren, performance te optimaliseren en problemen op te lossen. Bijvoorbeeld, als Metabase onder zware load staat vanwege meerdere gebruikers die dashboards benaderen, zal het de performance van de database of de Python scripts die data ophalen en verwerken niet beïnvloeden.
Performance optimalisatie is een andere sleutelfactor. Zowel PostgreSQL als Metabase kunnen resource-intensief zijn, vooral onder load. Het draaien ervan op aparte servers vermijdt concurrentie voor CPU, geheugen en disk I/O. Dit zorgt ervoor dat de database data ingestion en queries efficiënt kan hanteren, terwijl Metabase dashboards kan serveren zonder het systeem te vertragen.
Security is ook een significante overweging. Door Metabase te isoleren op een aparte server, reduceer je het attack surface. Als Metabase wordt blootgesteld aan het internet voor dashboard toegang, minimaliseert het geïsoleerd houden ervan van de database server het risico van ongeautoriseerde toegang tot je data. Je kunt strengere firewall regels configureren voor de database server, alleen toegang toestaan van de Metabase server en de Python script server.
Schaalbaarheid is een ander voordeel van het gebruiken van twee servers. Als je systeem groeit - bijvoorbeeld, als je meer data bronnen, gebruikers of complexe queries toevoegt - maakt het hebben van aparte servers het gemakkelijker om horizontaal te schalen. Je kunt meer resources toevoegen aan de database server als opslag of query performance een bottleneck wordt, of Metabase onafhankelijk schalen als meer gebruikers de dashboards gaan benaderen.
Ten slotte zijn onderhoud en updates eenvoudiger met een twee-server setup. Het updaten of herstarten van één service, zoals Metabase, zal de andere niet beïnvloeden, zoals PostgreSQL. Dit is bijzonder nuttig tijdens onderhoud of troubleshooting, omdat je problemen op één server kunt aanpakken zonder het hele systeem te verstoren.
Dat gezegd hebbende, zijn er scenario's waar het gebruiken van één server zinvol is. Als je workload licht is, met kleine hoeveelheden data en weinig gebruikers, kan één server alles hanteren zonder problemen. Kosten zijn een andere factor - het draaien van twee servers verdubbelt je infrastructuur uitgaven, dus als je een krap budget hebt, kan het consolideren van alles op één server geld besparen. Bovendien is het beheren van één server eenvoudiger dan het beheren van twee, omdat je je geen zorgen hoeft te maken over networking, firewalls of inter-server communicatie.
Als je besluit om één server te gebruiken, kun je de setup aanpassen door alle services - PostgreSQL, Python en Metabase - te installeren op dezelfde Ubuntu server. Pas firewall regels aan om toegang tot Metabase vanaf het internet toe te staan terwijl je PostgreSQL beperkt tot localhost of specifieke IP's. Monitor resource gebruik nauwlettend om ervoor te zorgen dat de server de gecombineerde workload aankan. Je kunt ook een reverse proxy zoals Nginx gebruiken om HTTPS terminatie te hanteren en verkeer naar Metabase te routeren, waardoor de setup wordt vereenvoudigd.
Concluderend biedt het gebruiken van twee servers betere performance, security en schaalbaarheid, maar het komt tegen de kosten van verhoogde complexiteit en hogere infrastructuur uitgaven. Als je workload licht is of je begint net, is één server een perfect geldige en kosteneffectieve keuze. Naarmate je systeem groeit, kun je altijd later migreren naar een twee-server setup.
1. Installeer PostgreSQL
2. Creëer een Database en User
3. Installeer pgAdmin4
4. Creëer Tabellen
Je kunt tabellen ook creëren vanaf de command line, maar we installeerden pgAdmin4 om onze databases handiger te beheren.
Gebruik pgAdmin4 om te verbinden met je PostgreSQL database en creëer de tabellen die nodig zijn om de data van de API op te slaan.
1. Haal Data op van Stad Gent API
Installeer Vereiste Python Libraries op de database server
pip install requests psycopg2-binary
2. Python Script om Data op te Halen en Op te Slaan
Ik voegde uitgebreide logging toe aan het script om enkele van de velden te identificeren die niet correct werden opgehaald. Ik besloot om de velden die ik niet gemakkelijk aan het werk kon krijgen in commentaar te zetten, omdat ik ze niet echt nodig had in de context van het dashboard dat ik wilde bouwen.
De data in de api wordt elke 5 minuten vernieuwd. Om ervoor te zorgen dat ik de laatste updates krijg gebruik ik een cron job om dit script elke 5 minuten uit te voeren.
Ruimte voor verbetering
Eén verbetering zou zijn om uit te zoeken waarom sommige van de velden niet correct laden. Een andere heeft te maken met de manier waarop ik deze job schedule om te draaien. Bij het schrijven van deze tutorial ontdekte ik dat ik ook de python library Schedule had kunnen gebruiken en het script als een service had kunnen draaien. Dit is zeker iets wat ik zal bekijken de volgende keer dat ik een hobby project zoals dit bouw.
3. Aggregatie Script
Om het mogelijk te maken om trends in het verleden te analyseren, zonder alle data die elke vijf minuten wordt gecreëerd te moeten bewaren, aggregeerde ik de data per uur. Ik voegde ook een trend toe: komen mensen aan of vertrekken mensen?
4. Het derde python script dat ik creëerde is het delete script
Om ervoor te zorgen dat de server niet te snel vol loopt, houd ik alleen het volledige detail van de data van de laatste 48 uur.
Ik gebruik cron
om deze scripts elke vijf minuten, elk uur en elke dag uit te voeren.
Voeg het IP-adres 11.22.33.44/32 van de Metabase server toe aan het pg_hba.conf bestand op de database server om toegang tot de data toe te staan. Herstart de postgres service om deze verandering van kracht te laten worden.
1. Installeer Metabase
2. Configureer HTTPS
3. Converteer het certificaat naar een Java KeyStore (JKS)
4. Draai Metabase als een Service
Creëer een systemd service bestand op deze locatie met de nano tekst editor:sudo nano /etc/systemd/system/metabase.service
Na het modificeren van het service bestand, moet je de systemd manager configuratie herladen om de veranderingen toe te passen. Dan kun je de service starten en enablen.
1. Verbind Metabase met PostgreSQL:
2. Stel de url in op HTTPS:
3. Bouw de objecten en visualisaties die je wilt gebruiken in je dashboard:
Bijvoorbeeld de hourly trend:
Metabase stelt je in staat om data op een kaart te zetten als je de coördinaten in je data hebt, wat we hebben:
Natuurlijk sloeg ik hier en daar enkele details over, maar dit zou je een solide begrip moeten geven van wat er nodig is om je eigen Metabase dashboard te bouwen verbonden met een open dataset API. Nu heb ik een volledig geautomatiseerd systeem dat parking data van Stad Gent ophaalt, opslaat, aggregeert en visualiseert. Dus, wanneer mijn vrienden me vragen waar ze hun auto kunnen parkeren voordat we erop uit gaan, stuur ik ze simpelweg deze link naar mijn dashboard, en we zijn klaar om te gaan! Ik hoop dat dit je inspireert om je eigen data te verkennen - veel plezier met bouwen!