Je eigen geocoder API met Docker
Voor een van mijn projecten heb ik een API nodig voor het automatisch aanvullen van geografische gegevens. Dus als iemand bijvoorbeeld "Hudsonlaan Gou" dat het "Hudsonlaan, Zuid Holland Gouda" teruggeeft in een opgemaakte manier inclusief de geografische locatie.
Google en andere dienstverleners bieden dit soort API's aan. Maar uiteindelijk gaat dat gepaard met kosten per request. Tegenwoordig is niets gemakkelijker dan het zelf uitvoeren. Je hebt wat Docker kennis nodig, maar als je die hebt, kun je een geocoder API draaien in minder dan 10 minuten.
In deze blogpost leg ik uit hoe je met Docker een geocoder API opzet op basis van Open Street Map data. Ik zal elke stap uitleggen. En ik verzeker je dat het gemakkelijk te doen is.
Ok, laten we beginnen. Wat info:
- We gaan Komoot Photon (zie voorbeeld) gebruiken als de Geocoder API.
- Ik veronderstel dat je een lokaal systeem of VPS hebt dat Docker draait.
A. De benodigde sources
Ik heb een project aan GitHub toegevoegd
- Kloon dit Photon Github project:
git clone https://github.com/tonsnoei/photon-docker
B. (Optioneel) Bouw uw eigen docker image
Je kunt deze stap overslaan. Maar, als in de toekomst de gebruikte Docker image om een of andere reden verloren gaat, dan kun je hem hiermee zelf bouwen:
- Maak een Docker hub account aan op de [Docker Hub website] (https://hub.docker.com)
- Ga naar de directory waar je het GitHub project hebt geplaatst en voer de volgende commando's uit:
- (Optioneel) Open de
Dockerfile
en controleer dephoton.jar
bestandsversie die wordt gebruikt. - (Optioneel) Controleer de beschikbare laatste release hier
https://github.com/komoot/photon/releases/
en verander deDockerfile
dienovereenkomstig aan - Bouw de docker image van Photon API
docker build -t <DOCKER HUB USERNAME>/docker-photon:latest -f Dockerfile .
- Push de docker image naar de docker hub:
docker push <DOCKER HUB USERNAME>/docker-photon:latest
. - Wijzig het
docker-compose.yml
bestand om deze nieuwe docker image te gebruiken:
1version: '2'
2services:
3 photon:
4 build:
5 context: .
6 dockerfile: Dockerfile
7>>> image: tonsnoei/photon-geocoder:latest
8 volumes:
9 - data:/photon/photon_data
10 ports:
11 - 2322:2322
12
13volumes:
14 data:
15 driver: local
C. Bereid je docker voor
- Zorg dat je in de map bent waar
https://github.com/tonsnoei/photon-docker
is gekloond. - Maak een directory "data" aan:
mkdir data
- Via de standaardsetup is de hele wereld beschikbaar binnen de API. Dit betekent dat je een relatief zware server nodig hebt. Dit betekent minstens 4 cores met minstens 16Gb RAM.
- Als je slechts één land wilt hosten, kun je het bestand [entrypoint.sh](https://github. com/tonsnoei/photon-docker/blob/master/entrypoint.sh) aanpassen om alleen een extract van 1 land te gebruiken. Extracten zijn hier te vinden. De uitleg ove het wijzigen van het entrypoint.sh is te vinden in het bestand entrypoint.sh.
- Voer uit:
docker-compose build
. Dit zorgt ervoor dat de docker image opnieuw wordt aangemaakt op basis van de
Dockerfile
. Dit is vooral belangrijk wanneer je wijzigingen hebt aangebracht in de entrypoint.sh. - Nu je helemaal klaar bent, voer je uit:
docker-compose up -d && docker-compose logs -f
. - Het zal nu beginnen met het downloaden van het extract van het web als eerste stap.
- Als je de docker container halverwege stopt tijdens het downloaden van de gegevens, maak dan eerst de
data
directory leeg voordat je verder gaat. - Nadat het extract is gedownload, zal de API beschikbaar zijn via http://localhost:2322/api?q=amsterdam
- Als je een ander regio-extract wilt gebruiken:
- Stop de docker container:
docker-compose down
- Wijzig het bestand entrypoint.sh
- Voer
docker-compose build
uit. - Voer
docker-compose up -d && docker-compose logs -f
uit
- Stop de docker container:
Om dit op een productieomgeving uit te voeren, gebruik je een reverse proxy zoals Nginx of Traefik om het HTTP(S)-verkeer af te handelen.
Dat was het. Veel plezier.