Requirements and sizing
Resource limits and measurements recorded for the application, worker, router and graph build.
Recommended server by scenario
Measured on 20 October 2026 by emulating each server size with Docker on an AMD Ryzen 9 7945HX: the router and the calculation shared the same pinned hardware threads (one per vCPU, as on most VPS offers) with memory limits. Every run was a whole calculation under the 180 s job deadline with the 5 s solver budget, on fictional workloads, twice each. A server CPU can be slower per thread than this desktop CPU: keep a margin.
| Use | Recommended server | Notes |
|---|---|---|
| Up to about 100 deliveries a day in one city | 2 vCPU / 8 GB | Île-de-France graph; address lookup does not fit alongside |
| Up to 250 deliveries in a dense city area | 2 vCPU / 8 GB works; 4 vCPU / 16 GB for margin | 45–47 s on 2 vCPU, 38 s on 4, 30 s on 8 |
| Up to 250 deliveries across a region | 8 vCPU / 32 GB | 94–102 s. 4 vCPU / 16 GB passes only just (152–158 s): raise JOB_TIMEOUT_SECONDS if you use it. 2 vCPU fails at the 180 s deadline |
| France-wide installation with address lookup | 8 vCPU / 32 GB | France router up to 7.7 GiB and address index about 5.2 GiB; build the France graph on a 16 GB machine if the server has less |
| Scenario | 2 vCPU / 8 GB | 4 vCPU / 16 GB | 8 vCPU / 32 GB | Router peak |
|---|---|---|---|---|
| Starter: 2 vehicles, 10 deliveries | 0.4–2.6 s | 0.4–4.1 s | 0.5–4.0 s | 0.7–1.5 GiB |
| Small fleet: 5 vehicles, 50 deliveries | 3.5–4.6 s | 3.4–5.2 s | 2.6–4.0 s | 1.8–3.6 GiB |
| Medium fleet: 10 vehicles, 100 deliveries | 9.4–9.8 s | 8.3–8.7 s | 7.0–7.3 s | 1.8–3.6 GiB |
| Large city: 25 vehicles, 250 deliveries, dense Paris | 45–47 s | 38 s | 30 s | 1.9–3.7 GiB |
| Regional: 25 vehicles, 250 deliveries, Île-de-France graph | fails at 180 s | 154–157 s | 94–95 s | 3.3–6.6 GiB |
| The same regional day on the France graph | fails at 180 s | 152–158 s | 99–102 s | 4.0–7.7 GiB |
Almost all of the time goes to the road matrix (87 of 94 s on the 8 vCPU regional day); the solver uses its 5 s budget and routing and validation take about 2 s. Router memory grows with its threads (2 on the 2 vCPU size, 4 on the others). The calculation itself peaked at 112 MiB; with one calculation's data the API used 79 MiB, the worker 59 MiB and PostgreSQL 41 MiB.
For disk, the images take about 1.1 GB and the Île-de-France graph 0.32 GB. A France-wide installation adds 4.1 GB of graph, 1.1 GB of geocoder images and 3.2 GB of address data, plus about 20 GB free while the France graph is built on the server. Add the operating system, logs and backups, which grow with your data.
One worker runs one calculation at a time, so waiting calculations run one after another. The kit's scripts/benchmark_sizing.py repeats these measurements on your own machine.
What these numbers are
The figures below come from the kit's Compose files and from measurements recorded with fictional workloads. Compose limits are caps, not measured use. Measure your own workload before relying on an installation: a small VPS may run the application without being suitable for graph building or 250-delivery calculations.
The kit targets Linux AMD64 and needs Python 3.11+, Docker and Compose 2.24.4+.
Calculation limits
| Limit | Value |
|---|---|
| Vehicles per calculation | 25 |
| Deliveries per calculation | 250 |
| Distinct points, depot included | 251 |
| Distance between two points of one calculation | MATRIX_MAX_KM, default 200 km, equal to the graph build |
| Exact truck profiles per calculation | 3 |
| Planning period | One Europe/Paris day with hard time windows |
| Whole calculation deadline | JOB_TIMEOUT_SECONDS, default 180 s (1–600), saving included |
| Solver budget | 1–60 s |
| Waiting or running calculations | At most 5 per company |
An installation has a single worker, which runs one calculation at a time; a second worker exits. Do not scale the worker service.
Container limits in the Compose files
| Service | Memory | CPU | Notes |
|---|---|---|---|
postgres | 1 GiB | — | PostgreSQL 16 |
setup | 512 MiB | — | Runs before the API and worker, then exits |
api | 1 GiB | — | |
worker | 2 GiB | 2 | The calculation child process is limited to 1.5 GiB of address space |
https (HTTPS overlay) or edge (behind an existing proxy) | 128 MiB | — | |
valhalla (routing overlay) | ROUTING_MEMORY, default 4 GiB | — | ROUTING_THREADS, default 2 |
addok-redis (geocoder overlay) | GEOCODER_MEMORY, default 8 GiB | — | Address index; addok needs at least 6 GB |
addok (geocoder overlay) | 1 GiB | — | GEOCODER_WORKERS, default 2 |
Leaving out setup, which exits, the limits add up to about 4.1 GiB without the router and about 8.1 GiB with the routing overlay's default. The geocoder overlay adds about 9 GiB with its defaults. Each container keeps at most three 10 MiB log files.
Measured calculations
| Workload | Resources | Measured |
|---|---|---|
| Regional Île-de-France, 250 deliveries, queued job | Separate router with 8 CPUs, 8 GiB and 4 routing workers, MATRIX_CONCURRENCY=4; application 2 CPUs, 2 GiB | 118–123 s per job, saving included |
| Dense Paris, 250 deliveries | Router with 4 CPUs, an 8 GiB quota and 4 routing workers; application 2 CPUs, 2 GiB | 48.94–60.20 s per calculation; router peak memory 6.07 GiB |
A router with two CPUs and 2 GiB did not meet the regional timing in these tests. A router with 2 GiB, two CPUs and two threads is the kit's example for the initial ten-delivery check. The routing overlay's default (4 GiB, two threads) has no recorded 250-delivery measurement.
Graph build
| Step | Recorded resources |
|---|---|
| Île-de-France extract | 338,509,338 bytes, downloaded 22 September 2026, hash pinned in deploy/engines.json |
| Regional graph build | Container limited to 6 GiB and 2 CPUs |
| Restriction test graph | Container limited to 2 GiB and 2 CPUs |
| Duration and disk | Several minutes and several GB |
| France extract | 5.1 GB, data of 18 October 2026, hash pinned in deploy/engines.json |
| France graph build | About 11 minutes with 8 threads in a container limited to 16 GB, on a 32-CPU machine, inside a Docker volume; 4.1 GB of tiles; keep about 20 GB free |
| France router | Held 6.1 GiB after the real-engine suite; allow 8 GB |
Graph preparation can require more resources than the application. The router can run on another private machine, as described in installation.
Address lookup
The Base Adresse Nationale bundle is about 2.5 GB to download and 3.2 GB unpacked. Loading its index takes one to two minutes after each start. With the 19 October 2026 bundle, one lookup took 4–28 ms inside the stack, for Paris, Lyon and Marseille addresses.
Not measured
- Larger days on a real VPS: the sizes above were emulated on one desktop machine. On a real 2 vCPU / 8 GB VPS shared with Coolify, only the ten-delivery sample was calculated (3.3–4.6 s; at rest afterwards, Tournevia used about 1.1 GB, 0.9 GB of it the router); see Install on a VPS, step by step.
- Growth of the database and of backups over time.
- Simultaneous users.
- Calculation timing and route quality for deliveries outside Île-de-France: on the France graph, the timed regional day used Île-de-France points; elsewhere only routing checks and a ten-delivery Lyon plan were run.
- Workloads beyond the limits above.