Skip to content

Commit 5906892

Browse files
committed
Initial version
0 parents  commit 5906892

File tree

6 files changed

+262
-0
lines changed

6 files changed

+262
-0
lines changed

Dockerfile

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
FROM ubuntu:18.04
2+
3+
# Based on
4+
# https://switch2osm.org/manually-building-a-tile-server-18-04-lts/
5+
6+
# Install dependencies
7+
RUN apt-get update
8+
RUN apt-get install -y libboost-all-dev git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-dev libgeotiff-epsg
9+
10+
# Set up environment and renderer user
11+
ENV TZ=UTC
12+
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
13+
RUN adduser --disabled-password --gecos "" renderer
14+
USER renderer
15+
16+
# Install latest osm2pgsql
17+
RUN mkdir /home/renderer/src
18+
WORKDIR /home/renderer/src
19+
RUN git clone https://github.com/openstreetmap/osm2pgsql.git
20+
WORKDIR /home/renderer/src/osm2pgsql
21+
USER root
22+
RUN apt-get install -y make cmake g++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 liblua5.2-dev
23+
USER renderer
24+
RUN mkdir build
25+
WORKDIR /home/renderer/src/osm2pgsql/build
26+
RUN cmake ..
27+
RUN make
28+
USER root
29+
RUN make install
30+
USER renderer
31+
32+
# Install and test Mapnik
33+
USER root
34+
RUN apt-get -y install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev libproj-dev gdal-bin libmapnik-dev mapnik-utils python-mapnik
35+
USER renderer
36+
RUN python -c 'import mapnik'
37+
38+
# Install mod_tile and renderd
39+
WORKDIR /home/renderer/src
40+
RUN git clone -b switch2osm https://github.com/SomeoneElseOSM/mod_tile.git
41+
WORKDIR /home/renderer/src/mod_tile
42+
RUN ./autogen.sh
43+
RUN ./configure
44+
RUN make
45+
USER root
46+
RUN make install
47+
RUN make install-mod_tile
48+
RUN ldconfig
49+
USER renderer
50+
51+
# Configure stylesheet
52+
WORKDIR /home/renderer/src
53+
RUN git clone https://github.com/gravitystorm/openstreetmap-carto.git
54+
WORKDIR /home/renderer/src/openstreetmap-carto
55+
USER root
56+
RUN apt-get install -y npm nodejs
57+
RUN npm install -g carto
58+
USER renderer
59+
RUN carto -v
60+
RUN carto project.mml > mapnik.xml
61+
62+
# Load shapefiles
63+
WORKDIR /home/renderer/src/openstreetmap-carto
64+
RUN scripts/get-shapefiles.py
65+
66+
# Install fonts
67+
USER root
68+
RUN apt-get install -y fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont
69+
USER renderer
70+
71+
# Configure renderd
72+
USER root
73+
RUN sed -i 's/renderaccount/renderer/g' /usr/local/etc/renderd.conf
74+
RUN sed -i 's/hot/tile/g' /usr/local/etc/renderd.conf
75+
USER renderer
76+
77+
# Configure Apache
78+
USER root
79+
RUN mkdir /var/lib/mod_tile
80+
RUN chown renderer /var/lib/mod_tile
81+
RUN mkdir /var/run/renderd
82+
RUN chown renderer /var/run/renderd
83+
RUN echo "LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so" >> /etc/apache2/conf-available/mod_tile.conf
84+
RUN a2enconf mod_tile
85+
COPY apache.conf /etc/apache2/sites-available/000-default.conf
86+
USER renderer
87+
88+
# Install PostgreSQL
89+
USER root
90+
RUN apt-get install -y postgresql postgresql-contrib postgis postgresql-10-postgis-2.4
91+
USER renderer
92+
93+
# Start running
94+
USER root
95+
RUN apt-get install -y sudo
96+
COPY run.sh /
97+
ENTRYPOINT ["/run.sh"]
98+
CMD []

Makefile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
.PHONY: build push test
2+
3+
build:
4+
docker build -t overv/openstreetmap-tile-server .
5+
6+
push: build
7+
docker push overv/openstreetmap-tile-server:latest
8+
9+
test: build
10+
docker volume create openstreetmap-data
11+
docker run -v openstreetmap-data:/var/lib/postgresql/10/main overv/openstreetmap-tile-server import
12+
docker run -v openstreetmap-data:/var/lib/postgresql/10/main -p 80:80 -d overv/openstreetmap-tile-server run

README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# openstreetmap-tile-server
2+
3+
This container allows you to easily set up an OpenStreetMap PNG tile server given a `.osm.pbf` file. It is based on the [latest Ubuntu 18.04 LTS guide](https://switch2osm.org/manually-building-a-tile-server-18-04-lts/) from [switch2osm.org](https://switch2osm.org/) and therefore uses the default OpenStreetMap style.
4+
5+
## Setting up the server
6+
7+
First create a Docker volume to hold the PostgreSQL database that will contain the OpenStreetMap data:
8+
9+
docker volume create openstreetmap-data
10+
11+
Next, download an .osm.pbf extract from geofabrik.de for the region that you're interested in. You can then start importing it into PostgreSQL by running a container and mounting the file as `/data.osm.pbf`. For example:
12+
13+
docker run -v luxembourg.osm.pbf:/data.osm.pbf -v openstreetmap-data:/var/lib/postgresql/10/main overv/openstreetmap-tile-server import
14+
15+
If the container exits without errors, then your data has been successfully imported and you are now ready to run the tile server.
16+
17+
## Running the server
18+
19+
Run the server like this:
20+
21+
docker run -p 80:80 -v openstreetmap-data:/var/lib/postgresql/10/main -d overv/openstreetmap-tile-server run
22+
23+
Your tiles will now be available at http://localhost:80/tile/{z}/{x}/{y}.png. If you open `leaflet-demo.html` in your browser, you should be able to see the tiles served by your own machine. Note that it will initially quite a bit of time to render the larger tiles for the first time.
24+
25+
## Preserving rendered tiles
26+
27+
Tiles that have already been rendered will be stored in `/var/lib/mod_tile`. To make sure that this data survives container restarts, you should create another volume for it:
28+
29+
docker volume create openstreetmap-rendered-tiles
30+
docker run -p 80:80 -v openstreetmap-data:/var/lib/postgresql/10/main -v openstreetmap-rendered-tiles:/var/lib/mod_tile -d overv/openstreetmap-tile-server run
31+
32+
## Performance tuning
33+
34+
The import and tile serving processes use 4 threads by default, but this number can be changed by setting the `THREADS` environment variable. For example:
35+
36+
docker run -p 80:80 -e THREADS=24 -v openstreetmap-data:/var/lib/postgresql/10/main -d overv/openstreetmap-tile-server run
37+
38+
## License
39+
40+
```
41+
Copyright 2018 Alexander Overvoorde
42+
43+
Licensed under the Apache License, Version 2.0 (the "License");
44+
you may not use this file except in compliance with the License.
45+
You may obtain a copy of the License at
46+
47+
http://www.apache.org/licenses/LICENSE-2.0
48+
49+
Unless required by applicable law or agreed to in writing, software
50+
distributed under the License is distributed on an "AS IS" BASIS,
51+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
52+
See the License for the specific language governing permissions and
53+
limitations under the License.
54+
```

apache.conf

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<VirtualHost *:80>
2+
ServerAdmin webmaster@localhost
3+
4+
LoadTileConfigFile /usr/local/etc/renderd.conf
5+
ModTileRenderdSocketName /var/run/renderd/renderd.sock
6+
ModTileRequestTimeout 0
7+
ModTileMissingRequestTimeout 30
8+
9+
DocumentRoot /var/www/html
10+
11+
ErrorLog ${APACHE_LOG_DIR}/error.log
12+
CustomLog ${APACHE_LOG_DIR}/access.log combined
13+
</VirtualHost>

leaflet-demo.html

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Custom Tile Server</title>
5+
6+
<meta charset="utf-8" />
7+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
8+
9+
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin=""/>
10+
<script src="https://unpkg.com/[email protected]/dist/leaflet.js" integrity="sha512-/Nsx9X4HebavoBvEBuyp3I7od5tA0UzAxs+j83KgC8PU0kgB4XiK4Lfe4y4cgBtaRJQEIFCW+oC506aPT2L1zw==" crossorigin=""></script>
11+
12+
<style>
13+
html, body, #map {
14+
width: 100%;
15+
height: 100%;
16+
margin: 0;
17+
padding: 0;
18+
}
19+
</style>
20+
</head>
21+
22+
<body>
23+
<div id="map"></div>
24+
25+
<script>
26+
var map = L.map('map').setView([0, 0], 3);
27+
28+
L.tileLayer('http://localhost/tile/{z}/{x}/{y}.png', {
29+
maxZoom: 18,
30+
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
31+
id: 'base'
32+
}).addTo(map);
33+
</script>
34+
</body>
35+
</html>

run.sh

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/bin/bash
2+
3+
if [ "$#" -ne 1 ]; then
4+
echo "usage: <import|run>"
5+
echo "commands:"
6+
echo " import: Set up the database and import /data.osm.pbf"
7+
echo " run: Runs Apache and renderd to serve tiles at /tile/{z}/{x}/{y}.png"
8+
echo "environment variables:"
9+
echo " THREADS: defines number of threads used for importing / tile rendering"
10+
exit 1
11+
fi
12+
13+
if [ "$1" = "import" ]; then
14+
# Initialize PostgreSQL
15+
service postgresql start
16+
sudo -u postgres createuser renderer
17+
sudo -u postgres createdb -E UTF8 -O renderer gis
18+
sudo -u postgres psql -d gis -c "CREATE EXTENSION postgis;"
19+
sudo -u postgres psql -d gis -c "CREATE EXTENSION hstore;"
20+
sudo -u postgres psql -d gis -c "ALTER TABLE geometry_columns OWNER TO renderer;"
21+
sudo -u postgres psql -d gis -c "ALTER TABLE spatial_ref_sys OWNER TO renderer;"
22+
23+
# Download Luxembourg as sample if no data is provided
24+
if [ ! -f /data.osm.pbf ]; then
25+
echo "WARNING: No import file at /data.osm.pbf, so importing Luxembourg as example..."
26+
wget -nv http://download.geofabrik.de/europe/luxembourg-latest.osm.pbf -O /data.osm.pbf
27+
fi
28+
29+
# Import data
30+
sudo -u renderer osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script /home/renderer/src/openstreetmap-carto/openstreetmap-carto.lua -C 2048 --number-processes ${THREADS:-4} -S /home/renderer/src/openstreetmap-carto/openstreetmap-carto.style /data.osm.pbf
31+
32+
exit 0
33+
fi
34+
35+
if [ "$1" = "run" ]; then
36+
# Initialize PostgreSQL and Apache
37+
service postgresql start
38+
service apache2 restart
39+
40+
# Configure renderd threads
41+
sed -i -E "s/num_threads=[0-9]+/num_threads=${THREADS:-4}/g" /usr/local/etc/renderd.conf
42+
43+
# Run
44+
sudo -u renderer renderd -f -c /usr/local/etc/renderd.conf
45+
46+
exit 0
47+
fi
48+
49+
echo "invalid command"
50+
exit 1

0 commit comments

Comments
 (0)