OSM tile server#
Host your own OpenStreet Map server.
Via docker-compose#
See also
GitHub - Overv/openstreetmap-tile-server: Docker file for a minimal effort OpenStreetMap tile server [1]
follow the Docker instructions
create the jobs directories
mkdir -p /home/jobs/scripts/by-user/root/docker/osm-tile-server mkdir -p /home/jobs/services/by-user/root
create the directories for the volumes
mkdir -p /data/DOCKER_VOLUMES/openstreetmap-tile-server/db mkdir -p /data/DOCKER_VOLUMES/openstreetmap-tile-server/openstreetmap-rendered-tiles
database must be at least on SSDs to have decent performance, even better if they are on RAID 0. The faster the better: multiple fast NVME drives on RAID 0 with a fast filesystem for flash memory, such as F2FS, would be the best option.
If a disk breaks you can swap it and re-import the maps since it’s not vital data.
Mount the filesystems on the SSDs on
/data/DOCKER_VOLUMES/openstreetmap-tile-server/db
.I didn’t see any performace hit in putting the cache on normal HDDs. Put the cache in
/data/DOCKER_VOLUMES/openstreetmap-tile-server/openstreetmap-rendered-tiles
.Note
Importing Italy, for example, takes aroung 50GB of space for the database
download the pbf and poly files from geofabrik.de
cd /data/DOCKER_VOLUMES/openstreetmap-tile-server wget https://download.geofabrik.de/europe/italy-latest.osm.pbf wget https://download.geofabrik.de/europe/italy.poly https://download.geofabrik.de/europe/italy-latest.osm.pbf.md5 md5sum --check
change permissions on the cache directory so that Docker can mount it in the container
chown 1000:1000 /data/DOCKER_VOLUMES/openstreetmap-tile-server/openstreetmap-rendered-tiles
create a
Docker compose file
1version: '3.7' 2 3services: 4 map: 5 image: overv/openstreetmap-tile-server:v1.8.2 6 restart: always 7 shm_size: '8192m' 8 ports: 9 - "127.0.0.1:4006:80" 10 volumes: 11 - /data/media/DOCKER_VOLUMES/openstreetmap-tile-server/db:/var/lib/postgresql/12/main 12 13 # See 14 # https://github.com/Overv/openstreetmap-tile-server/issues/186 15 # chown -R 1000:1000 openstreetmap-rendered-tiles 16 - /data/media/DOCKER_VOLUMES/openstreetmap-tile-server/openstreetmap-rendered-tiles:/var/lib/mod_tile 17 environment: 18 - UPDATES=enabled 19 - THREADS=12 20 - OSM2PGSQL_EXTRA_ARGS=-C 8192 21 command: "run" 22 23 import: 24 image: overv/openstreetmap-tile-server:v1.8.2 25 # Do not start when using "docker-compose up". 26 # Profiles are compatible with at least docker-compose 1.28 27 # profiles: 28 # - import 29 restart: 'no' 30 shm_size: '8192m' 31 environment: 32 - UPDATES=enabled 33 volumes: 34 - /data/media/DOCKER_VOLUMES/openstreetmap-tile-server/db:/var/lib/postgresql/12/main 35 36 # See 37 # https://github.com/Overv/openstreetmap-tile-server/issues/186 38 # chown -R 1000:1000 openstreetmap-rendered-tiles 39 - /data/media/DOCKER_VOLUMES/openstreetmap-tile-server/italy-latest.osm.pbf:/data.osm.pbf 40 - /data/media/DOCKER_VOLUMES/openstreetmap-tile-server/italy.poly:/data.poly 41 command: "import"
import the data in the database. This operation takes a long time
cd /home/jobs/scripts/by-user/root/docker/osm-tile-server docker-compose up import
create a
Systemd unit file
. See also the Docker compose services section1[Unit] 2Requires=docker.service 3Requires=network-online.target 4After=docker.service 5After=network-online.target 6 7[Service] 8Type=simple 9WorkingDirectory=/home/jobs/scripts/by-user/root/docker/openstreetmap-tile-server 10 11ExecStart=/usr/bin/docker-compose up --remove-orphans map 12ExecStop=/usr/bin/docker-compose down --remove-orphans 13 14Restart=always 15 16[Install] 17WantedBy=multi-user.target
fix the permissions
chmod 700 /home/jobs/scripts/by-user/root/docker/osm-tile-server chmod 700 -R /home/jobs/services/by-user/root
run the deploy script
connect to http://127.0.0.1:4006 with a JavaScript supported browser. You should see a full screen planet map.
Rendering is very slow the first time.
Try zooming into a zone and wait until it’s fully rendered. Reload the browser page with CTRL+shift+R and go to the same zone. This time the rendering should be istantaneous
Add a virtual host in your webserver configuration using port
4006
as reverse proxy
Footnotes