-
Notifications
You must be signed in to change notification settings - Fork 494
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 5906892
Showing
6 changed files
with
262 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
FROM ubuntu:18.04 | ||
|
||
# Based on | ||
# https://switch2osm.org/manually-building-a-tile-server-18-04-lts/ | ||
|
||
# Install dependencies | ||
RUN apt-get update | ||
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 | ||
|
||
# Set up environment and renderer user | ||
ENV TZ=UTC | ||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone | ||
RUN adduser --disabled-password --gecos "" renderer | ||
USER renderer | ||
|
||
# Install latest osm2pgsql | ||
RUN mkdir /home/renderer/src | ||
WORKDIR /home/renderer/src | ||
RUN git clone https://github.com/openstreetmap/osm2pgsql.git | ||
WORKDIR /home/renderer/src/osm2pgsql | ||
USER root | ||
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 | ||
USER renderer | ||
RUN mkdir build | ||
WORKDIR /home/renderer/src/osm2pgsql/build | ||
RUN cmake .. | ||
RUN make | ||
USER root | ||
RUN make install | ||
USER renderer | ||
|
||
# Install and test Mapnik | ||
USER root | ||
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 | ||
USER renderer | ||
RUN python -c 'import mapnik' | ||
|
||
# Install mod_tile and renderd | ||
WORKDIR /home/renderer/src | ||
RUN git clone -b switch2osm https://github.com/SomeoneElseOSM/mod_tile.git | ||
WORKDIR /home/renderer/src/mod_tile | ||
RUN ./autogen.sh | ||
RUN ./configure | ||
RUN make | ||
USER root | ||
RUN make install | ||
RUN make install-mod_tile | ||
RUN ldconfig | ||
USER renderer | ||
|
||
# Configure stylesheet | ||
WORKDIR /home/renderer/src | ||
RUN git clone https://github.com/gravitystorm/openstreetmap-carto.git | ||
WORKDIR /home/renderer/src/openstreetmap-carto | ||
USER root | ||
RUN apt-get install -y npm nodejs | ||
RUN npm install -g carto | ||
USER renderer | ||
RUN carto -v | ||
RUN carto project.mml > mapnik.xml | ||
|
||
# Load shapefiles | ||
WORKDIR /home/renderer/src/openstreetmap-carto | ||
RUN scripts/get-shapefiles.py | ||
|
||
# Install fonts | ||
USER root | ||
RUN apt-get install -y fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont | ||
USER renderer | ||
|
||
# Configure renderd | ||
USER root | ||
RUN sed -i 's/renderaccount/renderer/g' /usr/local/etc/renderd.conf | ||
RUN sed -i 's/hot/tile/g' /usr/local/etc/renderd.conf | ||
USER renderer | ||
|
||
# Configure Apache | ||
USER root | ||
RUN mkdir /var/lib/mod_tile | ||
RUN chown renderer /var/lib/mod_tile | ||
RUN mkdir /var/run/renderd | ||
RUN chown renderer /var/run/renderd | ||
RUN echo "LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so" >> /etc/apache2/conf-available/mod_tile.conf | ||
RUN a2enconf mod_tile | ||
COPY apache.conf /etc/apache2/sites-available/000-default.conf | ||
USER renderer | ||
|
||
# Install PostgreSQL | ||
USER root | ||
RUN apt-get install -y postgresql postgresql-contrib postgis postgresql-10-postgis-2.4 | ||
USER renderer | ||
|
||
# Start running | ||
USER root | ||
RUN apt-get install -y sudo | ||
COPY run.sh / | ||
ENTRYPOINT ["/run.sh"] | ||
CMD [] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
.PHONY: build push test | ||
|
||
build: | ||
docker build -t overv/openstreetmap-tile-server . | ||
|
||
push: build | ||
docker push overv/openstreetmap-tile-server:latest | ||
|
||
test: build | ||
docker volume create openstreetmap-data | ||
docker run -v openstreetmap-data:/var/lib/postgresql/10/main overv/openstreetmap-tile-server import | ||
docker run -v openstreetmap-data:/var/lib/postgresql/10/main -p 80:80 -d overv/openstreetmap-tile-server run |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
# openstreetmap-tile-server | ||
|
||
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. | ||
|
||
## Setting up the server | ||
|
||
First create a Docker volume to hold the PostgreSQL database that will contain the OpenStreetMap data: | ||
|
||
docker volume create openstreetmap-data | ||
|
||
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: | ||
|
||
docker run -v luxembourg.osm.pbf:/data.osm.pbf -v openstreetmap-data:/var/lib/postgresql/10/main overv/openstreetmap-tile-server import | ||
|
||
If the container exits without errors, then your data has been successfully imported and you are now ready to run the tile server. | ||
|
||
## Running the server | ||
|
||
Run the server like this: | ||
|
||
docker run -p 80:80 -v openstreetmap-data:/var/lib/postgresql/10/main -d overv/openstreetmap-tile-server run | ||
|
||
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. | ||
|
||
## Preserving rendered tiles | ||
|
||
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: | ||
|
||
docker volume create openstreetmap-rendered-tiles | ||
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 | ||
|
||
## Performance tuning | ||
|
||
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: | ||
|
||
docker run -p 80:80 -e THREADS=24 -v openstreetmap-data:/var/lib/postgresql/10/main -d overv/openstreetmap-tile-server run | ||
|
||
## License | ||
|
||
``` | ||
Copyright 2018 Alexander Overvoorde | ||
Licensed under the Apache License, Version 2.0 (the "License"); | ||
you may not use this file except in compliance with the License. | ||
You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software | ||
distributed under the License is distributed on an "AS IS" BASIS, | ||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
See the License for the specific language governing permissions and | ||
limitations under the License. | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<VirtualHost *:80> | ||
ServerAdmin webmaster@localhost | ||
|
||
LoadTileConfigFile /usr/local/etc/renderd.conf | ||
ModTileRenderdSocketName /var/run/renderd/renderd.sock | ||
ModTileRequestTimeout 0 | ||
ModTileMissingRequestTimeout 30 | ||
|
||
DocumentRoot /var/www/html | ||
|
||
ErrorLog ${APACHE_LOG_DIR}/error.log | ||
CustomLog ${APACHE_LOG_DIR}/access.log combined | ||
</VirtualHost> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<title>Custom Tile Server</title> | ||
|
||
<meta charset="utf-8" /> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
|
||
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin=""/> | ||
<script src="https://unpkg.com/[email protected]/dist/leaflet.js" integrity="sha512-/Nsx9X4HebavoBvEBuyp3I7od5tA0UzAxs+j83KgC8PU0kgB4XiK4Lfe4y4cgBtaRJQEIFCW+oC506aPT2L1zw==" crossorigin=""></script> | ||
|
||
<style> | ||
html, body, #map { | ||
width: 100%; | ||
height: 100%; | ||
margin: 0; | ||
padding: 0; | ||
} | ||
</style> | ||
</head> | ||
|
||
<body> | ||
<div id="map"></div> | ||
|
||
<script> | ||
var map = L.map('map').setView([0, 0], 3); | ||
|
||
L.tileLayer('http://localhost/tile/{z}/{x}/{y}.png', { | ||
maxZoom: 18, | ||
attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>', | ||
id: 'base' | ||
}).addTo(map); | ||
</script> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
#!/bin/bash | ||
|
||
if [ "$#" -ne 1 ]; then | ||
echo "usage: <import|run>" | ||
echo "commands:" | ||
echo " import: Set up the database and import /data.osm.pbf" | ||
echo " run: Runs Apache and renderd to serve tiles at /tile/{z}/{x}/{y}.png" | ||
echo "environment variables:" | ||
echo " THREADS: defines number of threads used for importing / tile rendering" | ||
exit 1 | ||
fi | ||
|
||
if [ "$1" = "import" ]; then | ||
# Initialize PostgreSQL | ||
service postgresql start | ||
sudo -u postgres createuser renderer | ||
sudo -u postgres createdb -E UTF8 -O renderer gis | ||
sudo -u postgres psql -d gis -c "CREATE EXTENSION postgis;" | ||
sudo -u postgres psql -d gis -c "CREATE EXTENSION hstore;" | ||
sudo -u postgres psql -d gis -c "ALTER TABLE geometry_columns OWNER TO renderer;" | ||
sudo -u postgres psql -d gis -c "ALTER TABLE spatial_ref_sys OWNER TO renderer;" | ||
|
||
# Download Luxembourg as sample if no data is provided | ||
if [ ! -f /data.osm.pbf ]; then | ||
echo "WARNING: No import file at /data.osm.pbf, so importing Luxembourg as example..." | ||
wget -nv http://download.geofabrik.de/europe/luxembourg-latest.osm.pbf -O /data.osm.pbf | ||
fi | ||
|
||
# Import data | ||
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 | ||
|
||
exit 0 | ||
fi | ||
|
||
if [ "$1" = "run" ]; then | ||
# Initialize PostgreSQL and Apache | ||
service postgresql start | ||
service apache2 restart | ||
|
||
# Configure renderd threads | ||
sed -i -E "s/num_threads=[0-9]+/num_threads=${THREADS:-4}/g" /usr/local/etc/renderd.conf | ||
|
||
# Run | ||
sudo -u renderer renderd -f -c /usr/local/etc/renderd.conf | ||
|
||
exit 0 | ||
fi | ||
|
||
echo "invalid command" | ||
exit 1 |