Een navigatie-API opzetten met Open Street Map

Openrouteservice.org biedt een gratis API voor het berekenen van routes van het ene punt naar het andere op een kaart. Deze dienst gebruikt OpenStreetMap gegevens om routes te berekenen. OpenRouteService biedt een cloud API-oplossing die gratis kan worden
gebruikt, out of the box. Deze API is beperkt tot een aantal verzoeken per dag, dus als u deze limiet overschrijdt, is het een optie om het op uw eigen servers te installeren.

De documentatie op de openrouteservice.org website is OK. Maar met de docker-compose instructies van de website zal
de service niet out of the box draaien (op het moment van schrijven). Deze blogpost helpt om de service snel
en zonder problemen te starten met de juiste configuratie en de kaart die u wilt gebruiken (uw land of stad).

Introductie

De OpenRouteService Docker image bevat een API en de engine die routegegevens genereert voor de API. Het maakt gebruik van een osm.pbf bestand dat kan worden gedownload via (bijvoorbeeld) Geofabrik.

Als je de OpenRouteService Docker container voor het eerst start, begint hij met het genereren van de richtinggegevens voor het opgegeven osm.pbf bestand. Dit duurt enige tijd, in de tussentijd is de API niet beschikbaar voor gebruik. Je moet gewoon wachten.

Nadat de richtinggegevens gegenereerd zijn, kun je de API gebruiken.

Denk eraan:

  • Het genereren van navigatiegegevens is intensief. Hoe groter de kaart (osm.pbf), hoe meer systeemresources er nodig zijn. Vooral geheugen. Voor het genereren van richtingen van de hele wereld heb je niet minder dan 128Gb geheugen op je server nodig.
  • Het genereren van routes kan enige tijd duren. Voor een stad kan het ongeveer 1 minuut duren. Voor de hele wereld kan het enkele dagen duren. Dit hangt ook af van de beschikbare hardware.
  • Standaard, met de documentatie van de website, start de dienst met het genereren van gegevens voor de stad Heidelberg waar de makers van deze software zijn gevestigd.
  • Als u een routebeschrijving wilt maken voor een regio die u zelf selecteert, moet je de configuraties aanpassen.
  • Het is mogelijk om een routebeschrijving te genereren op een server en deze te verplaatsen naar een andere server. Je kunt dus de routebeschrijving genereren op een zware machine thuis of op een server die u voor korte tijd huurt. Daarna kun je de gegenereerde inhoud verplaatsen naar een lichtere server.
  • De dienst kan routebeschrijvingen genereren voor:
    • Auto's
    • Hicking
    • Wandelen
    • Rolstoel
    • Fietsen (gewoon/elektrisch/mountainbike/weg)
    • Vrachtwagens

De docker instellen

Ik ben een fan van het gebruik van een docker-compose.yml voor het opzetten van mijn docker-containers. Daarom zal deze tutorial zich richten op een OpenRouteService setup die docker-compose.yml gebruikt. Als je het nooit gebruikt hebt, geen probleem, alles wordt hier uitgelegd.

Ik neem aan dat je in een Linux of Mac omgeving werkt. Het uitvoeren van deze oplossing op Windows geeft
problemen. Op mijn Windows machine liep het generatie-proces eindeloos door zonder ooit te eindigen, ik heb niet onderzocht wat de bron van dit probleem was. Er is een oplossing beschikbaar is, kijk daarvoor op het ondersteuningsgedeelte van de OpenRouteService website.

Configuration

  1. Maak een directory aan op je server. Open de directory en maak een aantal subdirectories aan:
1mkdir osr
2cd osr
3mkdir -p {elevation_cache,graphs,conf,logs/ors,logs/tomcat}
  1. elevation_cache en graphs deze zullen straks de gegevens van de gegenereerde routes bevatten.
  2. Maak een docker-compose.yml bestand aan in de root directory met de volgende inhoud:
 1version: '2.4'
 2services:
 3  ors-app:
 4    container_name: ors-app
 5    ports:
 6      - "8080:8080"
 7      - "9001:9001"
 8    image: openrouteservice/openrouteservice:latest
 9    user: "${ORS_UID:-0}:${ORS_GID:-0}"
10    volumes:
11      - ./graphs:/ors-core/data/graphs
12      - ./elevation_cache:/ors-core/data/elevation_cache
13      - ./logs/ors:/var/log/ors/
14      - ./logs/tomcat:/usr/local/tomcat/logs
15      - ./conf:/ors-conf
16      - ./#MY_OSM_PBF#:/ors-core/data/osm_file.pbf
17    environment:
18      - BUILD_GRAPHS=True  # Forces the container to rebuild the graphs, e.g. when PBF is changed
19      - "JAVA_OPTS=-Djava.awt.headless=true -server -XX:TargetSurvivorRatio=75 -XX:SurvivorRatio=64 -XX:MaxTenuringThreshold=3 -XX:+UseG1GC -XX:+ScavengeBeforeFullGC -XX:ParallelGCThreads=4 -Xms1g -Xmx2g"
20      - "CATALINA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9001 -Dcom.sun.management.jmxremote.rmi.port=9001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost"
  1. Vervang #MY_OSM_PBF# door uw eigen osm.pbf dat je hier kunt downloaden. Zet het bestand in de root, op dezelfde plaats als het docker-compose.yml bestand. Zorg ervoor dat u een klein bestand kiest, zoals een stad. Beginnen met een groot gebied, zal resulteren in geheugenproblemen als je je systeem niet goed aanpast. Later in deze post vind je meer info over het tweaken van het geheugen.
  2. Maak een nieuw bestand met de naam ors-config.json. Plaats dit bestand in de conf directory. Dit bestand bevat de volledige OpenRoutingMap configuratie. Voeg de volgende inhoud toe:
  1{
  2    "ors": {
  3      "info": {
  4        "base_url": "https://openrouteservice.org/",
  5        "swagger_documentation_url": "https://api.openrouteservice.org/",
  6        "support_mail": "support@openrouteservice.org",
  7        "author_tag": "openrouteservice",
  8        "content_licence": "LGPL 3.0"
  9      },
 10      "services": {
 11        "matrix": {
 12          "enabled": true,
 13          "maximum_routes": 100,
 14          "maximum_routes_flexible": 25,
 15          "maximum_search_radius": 5000,
 16          "maximum_visited_nodes": 100000,
 17          "allow_resolve_locations": true,
 18          "attribution": "openrouteservice.org, OpenStreetMap contributors"
 19        },
 20        "isochrones": {
 21          "enabled": true,
 22          "maximum_range_distance": [
 23            {
 24              "profiles": "any",
 25              "value": 50000
 26            },
 27            {
 28              "profiles": "driving-car, driving-hgv",
 29              "value": 100000
 30            }
 31          ],
 32          "maximum_range_time": [
 33            {
 34              "profiles": "any",
 35              "value": 18000
 36            },
 37            {
 38              "profiles": "driving-car, driving-hgv",
 39              "value": 3600
 40            }
 41          ],
 42          "fastisochrones": {
 43            "maximum_range_distance": [
 44              {
 45                "profiles": "any",
 46                "value": 50000
 47              },
 48              {
 49                "profiles": "driving-car, driving-hgv",
 50                "value": 500000
 51              }
 52            ],
 53            "maximum_range_time": [
 54              {
 55                "profiles": "any",
 56                "value": 18000
 57              },
 58              {
 59                "profiles": "driving-car, driving-hgv",
 60                "value": 10800
 61              }
 62            ],
 63            "profiles": {
 64              "default_params": {
 65                "enabled": false,
 66                "threads": 1,
 67                "weightings": "recommended",
 68                "maxcellnodes": 5000
 69              },
 70              "profile-hgv": {
 71                "enabled": false,
 72                "threads": 1,
 73                "weightings": "recommended, shortest",
 74                "maxcellnodes": 5000
 75              }
 76            }
 77          },
 78          "maximum_intervals": 10,
 79          "maximum_locations": 2,
 80          "allow_compute_area": true
 81        },
 82        "routing": {
 83          "enabled": true,
 84          "_mode": "preparation",
 85          "mode": "normal",
 86          "routing_description": "This is a routing file from openrouteservice",
 87          "routing_name": "openrouteservice routing",
 88          "sources": [
 89            "/ors-core/data/osm_file.pbf"
 90          ],
 91          "init_threads": 1,
 92          "attribution": "openrouteservice.org, OpenStreetMap contributors",
 93          "elevation_preprocessed": false,
 94          "profiles": {
 95            "active": [
 96              "car",
 97              "hgv",
 98              "bike-regular",
 99              "bike-mountain",
100              "bike-road",
101              "bike-electric",
102              "walking",
103              "hiking",
104              "wheelchair"
105            ],
106            "default_params": {
107              "encoder_flags_size": 8,
108              "graphs_root_path": "/ors-core/data/graphs",
109              "elevation_provider": "multi",
110              "elevation_cache_path": "/ors-core/data/elevation_cache",
111              "elevation_cache_clear": false,
112              "instructions": true,
113              "maximum_distance": 100000,
114              "maximum_distance_dynamic_weights": 100000,
115              "maximum_distance_avoid_areas": 100000,
116              "maximum_waypoints": 50,
117              "maximum_snapping_radius": 400,
118              "maximum_avoid_polygon_area": 200000000,
119              "maximum_avoid_polygon_extent": 20000,
120              "maximum_distance_alternative_routes": 100000,
121              "maximum_alternative_routes": 3,
122              "maximum_distance_round_trip_routes": 100000,
123              "maximum_speed_lower_bound": 80,
124              "preparation": {
125                "min_network_size": 200,
126                "min_one_way_network_size": 200,
127                "methods": {
128                  "lm": {
129                    "enabled": true,
130                    "threads": 1,
131                    "weightings": "recommended,shortest",
132                    "landmarks": 16
133                  }
134                }
135              },
136              "execution": {
137                "methods": {
138                  "lm": {
139                    "disabling_allowed": true,
140                    "active_landmarks": 8
141                  }
142                }
143              }
144            },
145            "profile-car": {
146              "profiles": "driving-car",
147              "parameters": {
148                "encoder_flags_size": 8,
149                "encoder_options": "turn_costs=true|block_fords=false|use_acceleration=true",
150                "maximum_distance": 100000,
151                "elevation": true,
152                "maximum_snapping_radius": 350,
153                "preparation": {
154                  "min_network_size": 200,
155                  "min_one_way_network_size": 200,
156                  "methods": {
157                    "ch": {
158                      "enabled": true,
159                      "threads": 1,
160                      "weightings": "fastest"
161                    },
162                    "lm": {
163                      "enabled": false,
164                      "threads": 1,
165                      "weightings": "fastest,shortest",
166                      "landmarks": 16
167                    },
168                    "core": {
169                      "enabled": true,
170                      "threads": 1,
171                      "weightings": "fastest,shortest",
172                      "landmarks": 64,
173                      "lmsets": "highways;allow_all"
174                    }
175                  }
176                },
177                "execution": {
178                  "methods": {
179                    "ch": {
180                      "disabling_allowed": true
181                    },
182                    "lm": {
183                      "disabling_allowed": true,
184                      "active_landmarks": 6
185                    },
186                    "core": {
187                      "disabling_allowed": true,
188                      "active_landmarks": 6
189                    }
190                  }
191                },
192                "ext_storages": {
193                  "WayCategory": {},
194                  "HeavyVehicle": {},
195                  "WaySurfaceType": {},
196                  "RoadAccessRestrictions": {
197                    "use_for_warnings": true
198                  }
199                }
200              }
201            },
202            "profile-hgv": {
203              "profiles": "driving-hgv",
204              "parameters": {
205                "encoder_flags_size": 8,
206                "encoder_options": "turn_costs=true|block_fords=false|use_acceleration=true",
207                "maximum_distance": 100000,
208                "elevation": true,
209                "preparation": {
210                  "min_network_size": 200,
211                  "min_one_way_network_size": 200,
212                  "methods": {
213                    "ch": {
214                      "enabled": true,
215                      "threads": 1,
216                      "weightings": "recommended"
217                    },
218                    "core": {
219                      "enabled": true,
220                      "threads": 1,
221                      "weightings": "recommended,shortest",
222                      "landmarks": 64,
223                      "lmsets": "highways;allow_all"
224                    }
225                  }
226                },
227                "execution": {
228                  "methods": {
229                    "ch": {
230                      "disabling_allowed": true
231                    },
232                    "core": {
233                      "disabling_allowed": true,
234                      "active_landmarks": 6
235                    }
236                  }
237                },
238                "ext_storages": {
239                  "WayCategory": {},
240                  "HeavyVehicle": {
241                    "restrictions": true
242                  },
243                  "WaySurfaceType": {}
244                }
245              }
246            },
247            "profile-bike-regular": {
248              "profiles": "cycling-regular",
249              "parameters": {
250                "encoder_options": "consider_elevation=true|turn_costs=true|block_fords=false",
251                "elevation": true,
252                "ext_storages": {
253                  "WayCategory": {},
254                  "WaySurfaceType": {},
255                  "HillIndex": {},
256                  "TrailDifficulty": {}
257                }
258              }
259            },
260            "profile-bike-mountain": {
261              "profiles": "cycling-mountain",
262              "parameters": {
263                "encoder_options": "consider_elevation=true|turn_costs=true|block_fords=false",
264                "elevation": true,
265                "ext_storages": {
266                  "WayCategory": {},
267                  "WaySurfaceType": {},
268                  "HillIndex": {},
269                  "TrailDifficulty": {}
270                }
271              }
272            },
273            "profile-bike-road": {
274              "profiles": "cycling-road",
275              "parameters": {
276                "encoder_options": "consider_elevation=true|turn_costs=true|block_fords=false",
277                "elevation": true,
278                "ext_storages": {
279                  "WayCategory": {},
280                  "WaySurfaceType": {},
281                  "HillIndex": {},
282                  "TrailDifficulty": {}
283                }
284              }
285            },
286            "profile-bike-electric": {
287              "profiles": "cycling-electric",
288              "parameters": {
289                "encoder_options": "consider_elevation=true|turn_costs=true|block_fords=false",
290                "elevation": true,
291                "ext_storages": {
292                  "WayCategory": {},
293                  "WaySurfaceType": {},
294                  "HillIndex": {},
295                  "TrailDifficulty": {}
296                }
297              }
298            },
299            "profile-walking": {
300              "profiles": "foot-walking",
301              "parameters": {
302                "encoder_options": "block_fords=false",
303                "elevation": true,
304                "ext_storages": {
305                  "WayCategory": {},
306                  "WaySurfaceType": {},
307                  "HillIndex": {},
308                  "TrailDifficulty": {}
309                }
310              }
311            },
312            "profile-hiking": {
313              "profiles": "foot-hiking",
314              "parameters": {
315                "encoder_options": "block_fords=false",
316                "elevation": true,
317                "ext_storages": {
318                  "WayCategory": {},
319                  "WaySurfaceType": {},
320                  "HillIndex": {},
321                  "TrailDifficulty": {}
322                }
323              }
324            },
325            "profile-wheelchair": {
326              "profiles": "wheelchair",
327              "parameters": {
328                "encoder_options": "block_fords=true",
329                "elevation": true,
330                "maximum_snapping_radius": 50,
331                "ext_storages": {
332                  "WayCategory": {},
333                  "WaySurfaceType": {},
334                  "Wheelchair": {
335                    "KerbsOnCrossings": "true"
336                  },
337                  "OsmId": {}
338                }
339              }
340            }
341          }
342        }
343      },
344      "logging": {
345        "enabled": true,
346        "level_file": "DEBUG_LOGGING.json",
347        "location": "/var/log/ors",
348        "stdout": true
349      },
350      "system_message": [
351        {
352          "active": false,
353          "text": "This message would be sent with every routing bike fastest request",
354          "condition": {
355            "request_service": "routing",
356            "request_profile": "cycling-regular,cycling-mountain,cycling-road,cycling-electric",
357            "request_preference": "fastest"
358          }
359        },
360        {
361          "active": false,
362          "text": "This message would be sent with every request for geojson response",
363          "condition": {
364            "api_format": "geojson"
365          }
366        },
367        {
368          "active": false,
369          "text": "This message would be sent with every request on API v1 from January 2020 until June 2050",
370          "condition": {
371            "api_version": 1,
372            "time_after": "2020-01-01T00:00:00Z",
373            "time_before": "2050-06-01T00:00:00Z"
374          }
375        },
376        {
377          "active": false,
378          "text": "This message would be sent with every request"
379        }
380      ]
381    }
382  }

De directory met je route api zal er ongeveer zo uit zien:

1- conf
2  + ors-config.json
3- elevation_cache
4- graphs  
5- logs
6  - ors
7  - tomcat
8+ docker-compose.yml
9+ netherlands-latest.osm.pdf  

De Docker-container opstarten

We gaan de docker container draaien. Zorg ervoor dat je een kleine regio van de Geofabrik website selecteert om mee te beginnen. Als je direct groot wilt gaan, ga dan naar de volgende sectie.

  1. Begin met een klein bestand. Zoals een stad of een kleine staat of provincie.
  2. Start de docker container: docker-compose up -d.
  3. De docker container start nu in daemon modus. Je ziet niets, maar de docker-container is gestart.
  4. Om te kijken wat er gebeurt voer je het volgende commando in: docker-compose logs -f. Nu zie je dat de container is gestart met het genereren van routes. Om de logging af te sluiten druk je op CTRL+C. De container blijft draaien, maar je kunt nu de terminal gebruiken voor andere taken.
  5. De route-API is beschikbaar op poort 8080. Je kunt er hier toegang toe krijgen via: http://localhost:8080
  6. Geduld is een schone zaak, het is nu wachten tot de routes zijn gegenereerd. Als het proces is voltooid, ziet je zoiets als dit in de logging (docker-compose logs -f):
 1ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfile] - [9] Finished at: 2023-02-21 12:58:08.
 2ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfile] -                               
 3ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - Total time: 131.0s.
 4ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - ========================================================================
 5ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - ====> Recycling garbage...
 6ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - Before:  Total - 1.74 GB, Free - 746.34 MB, Max: 10 GB, Used - 1.01 GB
 7ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - After:  Total - 1.74 GB, Free - 1.19 GB, Max: 10 GB, Used - 562.85 MB
 8ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - ========================================================================
 9ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - ====> Memory usage by profiles:
10ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - [1] 25.03 MB (4.4%)
11ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - [2] 23.03 MB (4.1%)
12ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - [3] 20.03 MB (3.6%)
13ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - [4] 20.03 MB (3.6%)
14ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - [5] 20.03 MB (3.6%)
15ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - [6] 20.03 MB (3.6%)
16ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - [7] 18.03 MB (3.2%)
17ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - [8] 18.03 MB (3.2%)
18ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - [9] 18.03 MB (3.2%)
19ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - Total: 182.28 MB (32.4%)
20ors-app  | 21 Feb 12:58:08 INFO [routing.RoutingProfileManager] - ========================================================================
  1. Om er zeker van te zijn dat het generatieproces is voltooid, kunt u de volgende API-aanroep uitvoeren: http://localhost:8080/ors/v2/health. Het zal "klaar" of "niet klaar" retourneren.
  2. Wanneer de API klaar is, kunt u deze testen door een richtingsverzoek in te voeren. Zorg ervoor dat u een locatie selecteert die wordt gedekt door de kaart die u van GeoFabrik hebt geselecteerd. Een voorbeeld: http://localhost:8080/ors/v2/directions/driving-car?start=5.47,52.511603&end=5.461901,52.51005.

De meeste API's gebruiken de volgorde: [latitude],[longitude]. OpenRouteService gebruikt het andersom: [longitude],[latitude]. Als u het verkeerd doet, krijgt u het volgende resultaat:

 1{
 2    "error": {
 3        "code": 2010,
 4        "message": "Could not find routable point within a radius of 350.0 meters of specified coordinate 0: 52.0253728 4.6921885."
 5    },
 6    "info": {
 7        "engine": {
 8            "version": "6.7.0",
 9            "build_date": "2023-02-21T19:24:37Z"
10        },
11        "timestamp": 1677048897683
12    }
13}
  1. Nu je klaar bent, moet de volgend regel in het bestand docker-compose.yml worden gewijzigd om te voorkomen dat de docker-container dezelfde map opnieuw genereert nadat de container opnieuw is opgestart:
1environment:
2      - BUILD_GRAPHS=True  # Forces the container to rebuild the graphs, e.g. when PBF is changed
3      
4to
5
6environment:
7      - BUILD_GRAPHS=False  # Forces the container to rebuild the graphs, e.g. when PBF is changed
  1. Om de container te stoppen voer je het volgende commando uit: docker-compose down

Grote kaarten genereren en geheugen beheren

Als je een grotere kaart wilt gebruiken dan alleen een stad of een kleine provincie, moet je ervoor zorgen dat de docker container voldoende geheugen heeft. Om bijvoorbeeld de volledige kaart van Nederland (netherlands-latest.osm.pbf) te genereren, heb ik ontdekt dat minstens 11Gb RAM nodig is. Om dit geheugen te voorzien moet je 2 dingen veranderen:

  1. De geheugentoewijzingsinstelling van Java in de docker-compose.yml.
  2. Het beschikbare geheugen binnen je docker host configuratie.

Als je niet genoeg geheugen hebt, zal het genereren van de aanwijzingen plotseling stoppen met vreemde fouten, zoals:

  • HEAP overflow
  • /ors-core/docker-entrypoint.sh: line 39: 128 Killed /usr/local/tomcat/bin/catalina.sh run

Je kunt het geheugengebruik en de limiet van de docker-container controleren met het volgende commando:

1docker stats

Het resultaat ziet er zo uit:

1CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O       PIDS
2658b31de2d5f   ors-app   193.45%   8.554GiB / 17.58GiB   48.65%    222MB / 2.15MB   44MB / 1.18GB   49

Changing the Java memory limit

Pas de volgende regel in het docker-compose.yml-bestand aan:

1"JAVA_OPTS=-Djava.awt.headless=true -server -XX:TargetSurvivorRatio=75 -XX:SurvivorRatio=64 -XX:MaxTenuringThreshold=3 -XX:+UseG1GC -XX:+ScavengeBeforeFullGC -XX:ParallelGCThreads=4 -Xms1g -Xmx2g"

De parameters -Xms1g and -Xmx2g vertellen Java hoeveel geheugen er mag worden gebruikt. De Xms1g parameter vertelt Java te starten met 1Gb RAM. Deze parameter hoeft niet te worden aangepast. De Xmx2g parameter zegt Java wat de maximale hoeveelheid geheugen is die mag worden gebruikt. 2Gb RAM in dit voorbeeld. Verander dit in een hogere wanneer u problemen ondervindt bij het genereren. Geef nooit een hogere waarde op dan er op systeem beschikbaar is.

Het beschikbare Docker-geheugen aanpassen

Als je Docker draait met behulp van een UI (Docker Desktop), zoals op een Mac dan moet je het beschikbare geheugen aanpassen onder de resources sectie van het Docker dashboard. Je kan deze veranderen zodat deze overeenkomt met de Java instelling. Sluit alle docker containers af voordat je deze waarde aanpast.

img.png

Lees hier meer over het aanpassen van de geheugenresources via de terminal.

De productieomgeving

Om de API in een productieomgeving te draaien, wil je niet dat de dienst op een gewone HTTP-poort draait. De dienst moet draaien via HTTPS en waarschijnlijk basic auth om ongeoorloofd gebruik te voorkomen. Gebruik daarom een reverse proxy. Een goede is Traefik. Dit is ook een Docker container en kan Let's Encrypt certificaten beheren voor HTTPS, maakt allerlei andere zaken mogelijk zoalsrate limiting, load balancing, berichtcompressie en natuurlijk basic auth. Een uitstekende tutorial over Traefik en Docker is hier te vinden .

Errors

/ors-core/docker-entrypoint.sh: line 39: 128 Killed /usr/local/tomcat/bin/catalina.sh run

Dit gebeurt wanneer je docker te weinig geheugen heeft. Lees de blogpost hierboven om erachter te komen hoe je het geheugen van je systeem kunt afstemmen.

Veel plezier!

Vertalingen: