Compare commits
115 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
5a1b2a6b06 | ||
|
5300472417 | ||
|
f9a29fb23b | ||
|
52c89b4775 | ||
|
0bb62b77d3 | ||
|
0a5ac2a018 | ||
|
f0f36a6c9b | ||
|
b192fabac3 | ||
|
f2971fa97e | ||
|
0d789b883d | ||
|
99484a505b | ||
|
ac609febcc | ||
|
dafb4610cd | ||
|
a90f8f1d8c | ||
|
515dd2a18c | ||
|
18c97f52bf | ||
|
e9a26ddded | ||
|
d0428523b5 | ||
|
4ca2e8f1e5 | ||
|
17a2c6d631 | ||
|
d7922429f3 | ||
|
837a38df04 | ||
|
f69bcd2540 | ||
|
f77c926ee5 | ||
|
bae840f240 | ||
|
e0f7438dab | ||
|
637e821888 | ||
|
e8e95c6001 | ||
|
d8ccc2c026 | ||
|
b71e7a6aba | ||
|
62a972736a | ||
|
f9f1047400 | ||
|
fa4b0eba0b | ||
|
69cb804609 | ||
|
efc2cb1e2a | ||
|
6de21a4595 | ||
|
868d2fae0a | ||
|
0527120c30 | ||
|
8bac516eb1 | ||
|
c8a79a19e4 | ||
|
92708df534 | ||
|
879e5f25ab | ||
|
010f87d711 | ||
|
789ff772be | ||
|
64c66a7d0b | ||
|
626158f677 | ||
|
ca1626a9fc | ||
|
101bb62e45 | ||
|
e249f30d40 | ||
|
6e5f4f485d | ||
|
ca4b1acb04 | ||
|
40ebaf7934 | ||
|
bfcc7d7c44 | ||
|
598a48145a | ||
|
d106610e05 | ||
|
ff8655701e | ||
|
a2eceb6bb5 | ||
|
bea77eb8bf | ||
|
33cd142850 | ||
|
c5a6462263 | ||
|
80586aff5f | ||
|
b82e37b9b5 | ||
|
451f335bc5 | ||
|
8744ab2792 | ||
|
31bf2d718b | ||
|
fcc6168253 | ||
|
2313b00d1e | ||
|
6834a20707 | ||
|
4953b4f0c5 | ||
|
ce15672ca1 | ||
|
a21931792a | ||
|
1cca710a02 | ||
|
2be4107bb1 | ||
|
1beb5fb1e8 | ||
|
ef1660c22c | ||
|
f9611b4cd8 | ||
|
77e7157807 | ||
|
4b062b6ce2 | ||
|
52d5f0b4b2 | ||
|
db5f6799f0 | ||
|
4e5828e749 | ||
|
a9392359b9 | ||
|
9b2b67b076 | ||
|
d7c2817f9f | ||
|
554707fc46 | ||
|
564c753011 | ||
|
174bbd5fa2 | ||
|
5805f89698 | ||
|
095c3badc3 | ||
|
2186981cba | ||
|
a02daac961 | ||
|
c99368d160 | ||
|
c8f8d0fd71 | ||
|
42b5783486 | ||
|
662ce85cb8 | ||
|
ca32b809ea | ||
|
87a5ba0672 | ||
|
6b1ef3fe22 | ||
|
ab0f62d08d | ||
|
ad366e7c87 | ||
|
1681d33635 | ||
|
48d257763e | ||
|
16b85cb9e2 | ||
|
7e87c26e0e | ||
|
a0728026b2 | ||
|
7875c4492e | ||
|
dbbe98aaed | ||
|
95e5fa8a96 | ||
|
c8a5c771ac | ||
|
e37c31d2f0 | ||
|
18066e910f | ||
|
2c5368f9bf | ||
|
6d57819daa | ||
|
cefc97edd3 | ||
|
67a1bf2ded |
28
.travis.yml
Normal file
28
.travis.yml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
os: linux
|
||||||
|
language: minimal
|
||||||
|
services:
|
||||||
|
- docker
|
||||||
|
# DOCKER_USERNAME/DOCKER_PASSWORD have been configured in Travis CI
|
||||||
|
# env:
|
||||||
|
before_install:
|
||||||
|
- echo "Before install"
|
||||||
|
before_script:
|
||||||
|
- docker pull overv/openstreetmap-tile-server || true
|
||||||
|
script:
|
||||||
|
- docker build --pull --cache-from overv/openstreetmap-tile-server --tag overv/openstreetmap-tile-server .
|
||||||
|
- docker volume create openstreetmap-data
|
||||||
|
- docker run --rm -v openstreetmap-data:/var/lib/postgresql/12/main overv/openstreetmap-tile-server import
|
||||||
|
- docker run --rm -v openstreetmap-data:/var/lib/postgresql/12/main -p 8080:80 -d overv/openstreetmap-tile-server run
|
||||||
|
- sleep 30
|
||||||
|
- make DOCKER_IMAGE=overv/openstreetmap-tile-server stop
|
||||||
|
after_script:
|
||||||
|
- docker images
|
||||||
|
after_success:
|
||||||
|
- if [[ "$TRAVIS_BRANCH" == "master" ]];
|
||||||
|
then
|
||||||
|
docker images ;
|
||||||
|
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin ;
|
||||||
|
docker push overv/openstreetmap-tile-server ;
|
||||||
|
fi
|
||||||
|
notifications:
|
||||||
|
email: true
|
233
Dockerfile
233
Dockerfile
@@ -3,96 +3,181 @@ FROM ubuntu:18.04
|
|||||||
# Based on
|
# Based on
|
||||||
# https://switch2osm.org/manually-building-a-tile-server-18-04-lts/
|
# https://switch2osm.org/manually-building-a-tile-server-18-04-lts/
|
||||||
|
|
||||||
# Install dependencies
|
# Set up environment
|
||||||
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
|
ENV TZ=UTC
|
||||||
|
ENV AUTOVACUUM=on
|
||||||
|
ENV UPDATES=disabled
|
||||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install wget gnupg2 lsb-core -y \
|
||||||
|
&& wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
|
||||||
|
&& echo "deb [ trusted=yes ] http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get install -y apt-transport-https ca-certificates
|
||||||
|
|
||||||
|
RUN apt-get install -y curl \
|
||||||
|
&& wget --quiet -O - https://deb.nodesource.com/setup_10.x | bash - \
|
||||||
|
&& apt-get install -y nodejs
|
||||||
|
|
||||||
|
RUN apt-get install -y --no-install-recommends --allow-unauthenticated \
|
||||||
|
apache2 \
|
||||||
|
apache2-dev \
|
||||||
|
autoconf \
|
||||||
|
build-essential \
|
||||||
|
bzip2 \
|
||||||
|
cmake \
|
||||||
|
cron \
|
||||||
|
fonts-noto-cjk \
|
||||||
|
fonts-noto-hinted \
|
||||||
|
fonts-noto-unhinted \
|
||||||
|
gcc \
|
||||||
|
gdal-bin \
|
||||||
|
git-core \
|
||||||
|
libagg-dev \
|
||||||
|
libboost-filesystem-dev \
|
||||||
|
libboost-system-dev \
|
||||||
|
libbz2-dev \
|
||||||
|
libcairo-dev \
|
||||||
|
libcairomm-1.0-dev \
|
||||||
|
libexpat1-dev \
|
||||||
|
libfreetype6-dev \
|
||||||
|
libgdal-dev \
|
||||||
|
libgeos++-dev \
|
||||||
|
libgeos-dev \
|
||||||
|
libgeotiff-epsg \
|
||||||
|
libicu-dev \
|
||||||
|
liblua5.3-dev \
|
||||||
|
libmapnik-dev \
|
||||||
|
libpq-dev \
|
||||||
|
libproj-dev \
|
||||||
|
libprotobuf-c0-dev \
|
||||||
|
libtiff5-dev \
|
||||||
|
libtool \
|
||||||
|
libxml2-dev \
|
||||||
|
lua5.3 \
|
||||||
|
make \
|
||||||
|
mapnik-utils \
|
||||||
|
node-gyp \
|
||||||
|
osmium-tool \
|
||||||
|
osmosis \
|
||||||
|
postgis \
|
||||||
|
postgresql-12 \
|
||||||
|
postgresql-contrib-12 \
|
||||||
|
postgresql-server-dev-12 \
|
||||||
|
protobuf-c-compiler \
|
||||||
|
python3-mapnik \
|
||||||
|
python3-lxml \
|
||||||
|
python3-psycopg2 \
|
||||||
|
python3-shapely \
|
||||||
|
sudo \
|
||||||
|
tar \
|
||||||
|
ttf-unifont \
|
||||||
|
unzip \
|
||||||
|
wget \
|
||||||
|
zlib1g-dev \
|
||||||
|
&& apt-get clean autoclean \
|
||||||
|
&& apt-get autoremove --yes \
|
||||||
|
&& rm -rf /var/lib/{apt,dpkg,cache,log}/
|
||||||
|
|
||||||
|
# Set up PostGIS
|
||||||
|
RUN wget http://download.osgeo.org/postgis/source/postgis-3.0.0.tar.gz -O postgis.tar.gz \
|
||||||
|
&& mkdir -p postgis_src \
|
||||||
|
&& tar -xvzf postgis.tar.gz --strip 1 -C postgis_src \
|
||||||
|
&& rm postgis.tar.gz \
|
||||||
|
&& cd postgis_src \
|
||||||
|
&& ./configure && make && make install \
|
||||||
|
&& cd .. && rm -rf postgis_src
|
||||||
|
|
||||||
|
# Set up renderer user
|
||||||
RUN adduser --disabled-password --gecos "" renderer
|
RUN adduser --disabled-password --gecos "" renderer
|
||||||
USER renderer
|
|
||||||
|
|
||||||
# Install latest osm2pgsql
|
# Install latest osm2pgsql
|
||||||
RUN mkdir /home/renderer/src
|
RUN mkdir -p /home/renderer/src \
|
||||||
WORKDIR /home/renderer/src
|
&& cd /home/renderer/src \
|
||||||
RUN git clone https://github.com/openstreetmap/osm2pgsql.git
|
&& git clone https://github.com/openstreetmap/osm2pgsql.git \
|
||||||
WORKDIR /home/renderer/src/osm2pgsql
|
&& cd /home/renderer/src/osm2pgsql \
|
||||||
USER root
|
&& rm -rf .git \
|
||||||
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
|
&& mkdir build \
|
||||||
USER renderer
|
&& cd build \
|
||||||
RUN mkdir build
|
&& cmake .. \
|
||||||
WORKDIR /home/renderer/src/osm2pgsql/build
|
&& make -j $(nproc) \
|
||||||
RUN cmake ..
|
&& make install \
|
||||||
RUN make
|
&& mkdir /nodes \
|
||||||
USER root
|
&& chown renderer:renderer /nodes \
|
||||||
RUN make install
|
&& rm -rf /home/renderer/src/osm2pgsql
|
||||||
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
|
# Install mod_tile and renderd
|
||||||
WORKDIR /home/renderer/src
|
RUN mkdir -p /home/renderer/src \
|
||||||
RUN git clone -b switch2osm https://github.com/SomeoneElseOSM/mod_tile.git
|
&& cd /home/renderer/src \
|
||||||
WORKDIR /home/renderer/src/mod_tile
|
&& git clone -b switch2osm https://github.com/SomeoneElseOSM/mod_tile.git \
|
||||||
RUN ./autogen.sh
|
&& cd mod_tile \
|
||||||
RUN ./configure
|
&& ./autogen.sh \
|
||||||
RUN make
|
&& ./configure \
|
||||||
USER root
|
&& make -j $(nproc) \
|
||||||
RUN make install
|
&& make -j $(nproc) install \
|
||||||
RUN make install-mod_tile
|
&& make -j $(nproc) install-mod_tile \
|
||||||
RUN ldconfig
|
&& ldconfig \
|
||||||
USER renderer
|
&& cd ..
|
||||||
|
|
||||||
# Configure stylesheet
|
# Configure stylesheet
|
||||||
WORKDIR /home/renderer/src
|
RUN mkdir -p /home/renderer/src \
|
||||||
RUN git clone https://github.com/gravitystorm/openstreetmap-carto.git
|
&& cd /home/renderer/src \
|
||||||
WORKDIR /home/renderer/src/openstreetmap-carto
|
&& git clone https://github.com/gravitystorm/openstreetmap-carto.git \
|
||||||
USER root
|
&& git -C openstreetmap-carto checkout v4.23.0 \
|
||||||
RUN apt-get install -y npm nodejs
|
&& cd openstreetmap-carto \
|
||||||
RUN npm install -g carto
|
&& rm -rf .git \
|
||||||
USER renderer
|
&& npm install -g carto@0.18.2 \
|
||||||
RUN carto -v
|
&& carto project.mml > mapnik.xml \
|
||||||
RUN carto project.mml > mapnik.xml
|
&& scripts/get-shapefiles.py \
|
||||||
|
&& rm /home/renderer/src/openstreetmap-carto/data/*.zip
|
||||||
# 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
|
# Configure renderd
|
||||||
USER root
|
RUN sed -i 's/renderaccount/renderer/g' /usr/local/etc/renderd.conf \
|
||||||
RUN sed -i 's/renderaccount/renderer/g' /usr/local/etc/renderd.conf
|
&& sed -i 's/hot/tile/g' /usr/local/etc/renderd.conf
|
||||||
RUN sed -i 's/hot/tile/g' /usr/local/etc/renderd.conf
|
|
||||||
USER renderer
|
|
||||||
|
|
||||||
# Configure Apache
|
# Configure Apache
|
||||||
USER root
|
RUN mkdir /var/lib/mod_tile \
|
||||||
RUN mkdir /var/lib/mod_tile
|
&& chown renderer /var/lib/mod_tile \
|
||||||
RUN chown renderer /var/lib/mod_tile
|
&& mkdir /var/run/renderd \
|
||||||
RUN mkdir /var/run/renderd
|
&& chown renderer /var/run/renderd \
|
||||||
RUN chown renderer /var/run/renderd
|
&& echo "LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so" >> /etc/apache2/conf-available/mod_tile.conf \
|
||||||
RUN echo "LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so" >> /etc/apache2/conf-available/mod_tile.conf
|
&& echo "LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so" >> /etc/apache2/conf-available/mod_headers.conf \
|
||||||
RUN a2enconf mod_tile
|
&& a2enconf mod_tile && a2enconf mod_headers
|
||||||
COPY apache.conf /etc/apache2/sites-available/000-default.conf
|
COPY apache.conf /etc/apache2/sites-available/000-default.conf
|
||||||
USER renderer
|
COPY leaflet-demo.html /var/www/html/index.html
|
||||||
|
RUN ln -sf /dev/stdout /var/log/apache2/access.log \
|
||||||
|
&& ln -sf /dev/stderr /var/log/apache2/error.log
|
||||||
|
|
||||||
# Install PostgreSQL
|
# Configure PosgtreSQL
|
||||||
USER root
|
COPY postgresql.custom.conf.tmpl /etc/postgresql/12/main/
|
||||||
RUN apt-get install -y postgresql postgresql-contrib postgis postgresql-10-postgis-2.4
|
RUN chown -R postgres:postgres /var/lib/postgresql \
|
||||||
USER renderer
|
&& chown postgres:postgres /etc/postgresql/12/main/postgresql.custom.conf.tmpl \
|
||||||
|
&& echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/12/main/pg_hba.conf \
|
||||||
|
&& echo "host all all ::/0 md5" >> /etc/postgresql/12/main/pg_hba.conf
|
||||||
|
|
||||||
|
# Copy update scripts
|
||||||
|
COPY openstreetmap-tiles-update-expire /usr/bin/
|
||||||
|
RUN chmod +x /usr/bin/openstreetmap-tiles-update-expire \
|
||||||
|
&& mkdir /var/log/tiles \
|
||||||
|
&& chmod a+rw /var/log/tiles \
|
||||||
|
&& ln -s /home/renderer/src/mod_tile/osmosis-db_replag /usr/bin/osmosis-db_replag \
|
||||||
|
&& echo "* * * * * renderer openstreetmap-tiles-update-expire\n" >> /etc/crontab
|
||||||
|
|
||||||
|
# Install trim_osc.py helper script
|
||||||
|
RUN mkdir -p /home/renderer/src \
|
||||||
|
&& cd /home/renderer/src \
|
||||||
|
&& git clone https://github.com/zverik/regional \
|
||||||
|
&& cd regional \
|
||||||
|
&& git checkout 612fe3e040d8bb70d2ab3b133f3b2cfc6c940520 \
|
||||||
|
&& rm -rf .git \
|
||||||
|
&& chmod u+x /home/renderer/src/regional/trim_osc.py
|
||||||
|
|
||||||
# Start running
|
# Start running
|
||||||
USER root
|
|
||||||
RUN apt-get install -y sudo
|
|
||||||
COPY run.sh /
|
COPY run.sh /
|
||||||
|
COPY indexes.sql /
|
||||||
ENTRYPOINT ["/run.sh"]
|
ENTRYPOINT ["/run.sh"]
|
||||||
CMD []
|
CMD []
|
||||||
|
|
||||||
|
EXPOSE 80 5432
|
||||||
|
14
Makefile
14
Makefile
@@ -1,12 +1,18 @@
|
|||||||
.PHONY: build push test
|
.PHONY: build push test
|
||||||
|
|
||||||
|
DOCKER_IMAGE=overv/openstreetmap-tile-server
|
||||||
|
|
||||||
build:
|
build:
|
||||||
docker build -t overv/openstreetmap-tile-server .
|
docker build -t ${DOCKER_IMAGE} .
|
||||||
|
|
||||||
push: build
|
push: build
|
||||||
docker push overv/openstreetmap-tile-server:latest
|
docker push ${DOCKER_IMAGE}:latest
|
||||||
|
|
||||||
test: build
|
test: build
|
||||||
docker volume create openstreetmap-data
|
docker volume create openstreetmap-data
|
||||||
docker run -v openstreetmap-data:/var/lib/postgresql/10/main overv/openstreetmap-tile-server import
|
docker run --rm -v openstreetmap-data:/var/lib/postgresql/12/main ${DOCKER_IMAGE} import
|
||||||
docker run -v openstreetmap-data:/var/lib/postgresql/10/main -p 80:80 -d overv/openstreetmap-tile-server run
|
docker run --rm -v openstreetmap-data:/var/lib/postgresql/12/main -p 8080:80 -d ${DOCKER_IMAGE} run
|
||||||
|
|
||||||
|
stop:
|
||||||
|
docker rm -f `docker ps | grep '${DOCKER_IMAGE}' | awk '{ print $$1 }'` || true
|
||||||
|
docker volume rm -f openstreetmap-data
|
||||||
|
201
README.md
201
README.md
@@ -1,5 +1,7 @@
|
|||||||
# openstreetmap-tile-server
|
# openstreetmap-tile-server
|
||||||
|
|
||||||
|
[](https://travis-ci.org/Overv/openstreetmap-tile-server) [](https://microbadger.com/images/overv/openstreetmap-tile-server "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.
|
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
|
## Setting up the server
|
||||||
@@ -10,35 +12,214 @@ First create a Docker volume to hold the PostgreSQL database that will contain t
|
|||||||
|
|
||||||
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:
|
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
|
```
|
||||||
|
docker run \
|
||||||
|
-v /absolute/path/to/luxembourg.osm.pbf:/data.osm.pbf \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/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.
|
If the container exits without errors, then your data has been successfully imported and you are now ready to run the tile server.
|
||||||
|
|
||||||
|
### Automatic updates (optional)
|
||||||
|
|
||||||
|
If your import is an extract of the planet and has polygonal bounds associated with it, like those from geofabrik.de, then it is possible to set your server up for automatic updates. Make sure to reference both the OSM file and the polygon file during the import process to facilitate this, and also include the `UPDATES=enabled` variable:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-e UPDATES=enabled \
|
||||||
|
-v /absolute/path/to/luxembourg.osm.pbf:/data.osm.pbf \
|
||||||
|
-v /absolute/path/to/luxembourg.poly:/data.poly \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
overv/openstreetmap-tile-server \
|
||||||
|
import
|
||||||
|
```
|
||||||
|
|
||||||
|
Refer to the section *Automatic updating and tile expiry* to actually enable the updates while running the tile server.
|
||||||
|
|
||||||
## Running the server
|
## Running the server
|
||||||
|
|
||||||
Run the server like this:
|
Run the server like this:
|
||||||
|
|
||||||
docker run -p 80:80 -v openstreetmap-data:/var/lib/postgresql/10/main -d overv/openstreetmap-tile-server run
|
```
|
||||||
|
docker run \
|
||||||
|
-p 8080:80 \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/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.
|
Your tiles will now be available at `http://localhost:8080/tile/{z}/{x}/{y}.png`. The demo map in `leaflet-demo.html` will then be available on `http://localhost:8080`. Note that it will initially take quite a bit of time to render the larger tiles for the first time.
|
||||||
|
|
||||||
## Preserving rendered tiles
|
### Using Docker Compose
|
||||||
|
|
||||||
|
The `docker-compose.yml` file included with this repository shows how the aforementioned command can be used with Docker Compose to run your server.
|
||||||
|
|
||||||
|
### 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:
|
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
|
docker volume create openstreetmap-rendered-tiles
|
||||||
|
docker run \
|
||||||
|
-p 8080:80 \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
-v openstreetmap-rendered-tiles:/var/lib/mod_tile \
|
||||||
|
-d overv/openstreetmap-tile-server \
|
||||||
|
run
|
||||||
|
```
|
||||||
|
|
||||||
## Performance tuning
|
**If you do this, then make sure to also run the import with the `openstreetmap-rendered-tiles` volume to make sure that caching works properly across updates!**
|
||||||
|
|
||||||
|
### Enabling automatic updating (optional)
|
||||||
|
|
||||||
|
Given that you've set up your import as described in the *Automatic updates* section during server setup, you can enable the updating process by setting the `UPDATES` variable while running your server as well:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-p 8080:80 \
|
||||||
|
-e UPDATES=enabled \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
-v openstreetmap-rendered-tiles:/var/lib/mod_tile \
|
||||||
|
-d overv/openstreetmap-tile-server \
|
||||||
|
run
|
||||||
|
```
|
||||||
|
|
||||||
|
This will enable a background process that automatically downloads changes from the OpenStreetMap server, filters them for the relevant region polygon you specified, updates the database and finally marks the affected tiles for rerendering.
|
||||||
|
|
||||||
|
### Cross-origin resource sharing
|
||||||
|
|
||||||
|
To enable the `Access-Control-Allow-Origin` header to be able to retrieve tiles from other domains, simply set the `ALLOW_CORS` variable to `enabled`:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-p 8080:80 \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
-e ALLOW_CORS=enabled \
|
||||||
|
-d overv/openstreetmap-tile-server \
|
||||||
|
run
|
||||||
|
```
|
||||||
|
|
||||||
|
### Connecting to Postgres
|
||||||
|
|
||||||
|
To connect to the PostgreSQL database inside the container, make sure to expose port 5432:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-p 8080:80 \
|
||||||
|
-p 5432:5432 \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
-d overv/openstreetmap-tile-server \
|
||||||
|
run
|
||||||
|
```
|
||||||
|
|
||||||
|
Use the user `renderer` and the database `gis` to connect.
|
||||||
|
|
||||||
|
```
|
||||||
|
psql -h localhost -U renderer gis
|
||||||
|
```
|
||||||
|
|
||||||
|
The default password is `renderer`, but it can be changed using the `PGPASSWORD` environment variable:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-p 8080:80 \
|
||||||
|
-p 5432:5432 \
|
||||||
|
-e PGPASSWORD=secret \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
-d overv/openstreetmap-tile-server \
|
||||||
|
run
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performance tuning and tweaking
|
||||||
|
|
||||||
|
Details for update procedure and invoked scripts can be found here [link](https://ircama.github.io/osm-carto-tutorials/updating-data/).
|
||||||
|
|
||||||
|
### THREADS
|
||||||
|
|
||||||
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:
|
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 8080:80 \
|
||||||
|
-e THREADS=24 \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
-d overv/openstreetmap-tile-server \
|
||||||
|
run
|
||||||
|
```
|
||||||
|
|
||||||
docker run -p 80:80 -e THREADS=24 -v openstreetmap-data:/var/lib/postgresql/10/main -d overv/openstreetmap-tile-server run
|
### CACHE
|
||||||
|
|
||||||
|
The import and tile serving processes use 800 MB RAM cache by default, but this number can be changed by option -C. For example:
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-p 8080:80 \
|
||||||
|
-e "OSM2PGSQL_EXTRA_ARGS=-C 4096" \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
-d overv/openstreetmap-tile-server \
|
||||||
|
run
|
||||||
|
```
|
||||||
|
|
||||||
|
### AUTOVACUUM
|
||||||
|
|
||||||
|
The database use the autovacuum feature by default. This behavior can be changed with `AUTOVACUUM` environment variable. For example:
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-p 8080:80 \
|
||||||
|
-e AUTOVACUUM=off \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
-d overv/openstreetmap-tile-server \
|
||||||
|
run
|
||||||
|
```
|
||||||
|
|
||||||
|
### Flat nodes
|
||||||
|
|
||||||
|
If you are planning to import the entire planet or you are running into memory errors then you may want to enable the `--flat-nodes` option for osm2pgsql. You can then use it during the import process as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-v /absolute/path/to/luxembourg.osm.pbf:/data.osm.pbf \
|
||||||
|
-v openstreetmap-nodes:/nodes \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
-e "OSM2PGSQL_EXTRA_ARGS=--flat-nodes /nodes/flat_nodes.bin" \
|
||||||
|
overv/openstreetmap-tile-server \
|
||||||
|
import
|
||||||
|
```
|
||||||
|
|
||||||
|
>Note that if you use a folder other than `/nodes` then you must make sure that you manually set the owner to `renderer`!
|
||||||
|
|
||||||
|
### Benchmarks
|
||||||
|
|
||||||
|
You can find an example of the import performance to expect with this image on the [OpenStreetMap wiki](https://wiki.openstreetmap.org/wiki/Osm2pgsql/benchmarks#debian_9_.2F_openstreetmap-tile-server).
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### ERROR: could not resize shared memory segment / No space left on device
|
||||||
|
|
||||||
|
If you encounter such entries in the log, it will mean that the default shared memory limit (64 MB) is too low for the container and it should be raised:
|
||||||
|
```
|
||||||
|
renderd[121]: ERROR: failed to render TILE ajt 2 0-3 0-3
|
||||||
|
renderd[121]: reason: Postgis Plugin: ERROR: could not resize shared memory segment "/PostgreSQL.790133961" to 12615680 bytes: ### No space left on device
|
||||||
|
```
|
||||||
|
To raise it use `--shm-size` parameter. For example:
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-p 8080:80 \
|
||||||
|
-v openstreetmap-data:/var/lib/postgresql/12/main \
|
||||||
|
--shm-size="192m" \
|
||||||
|
-d overv/openstreetmap-tile-server \
|
||||||
|
run
|
||||||
|
```
|
||||||
|
For too high values you may notice excessive CPU load and memory usage. It might be that you will have to experimentally find the best values for yourself.
|
||||||
|
|
||||||
|
### The import process unexpectedly exits
|
||||||
|
|
||||||
|
You may be running into problems with memory usage during the import. Have a look at the "Flat nodes" section in this README.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
```
|
```
|
||||||
Copyright 2018 Alexander Overvoorde
|
Copyright 2019 Alexander Overvoorde
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -51,4 +232,4 @@ distributed under the License is distributed on an "AS IS" BASIS,
|
|||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
```
|
```
|
||||||
|
@@ -10,4 +10,8 @@
|
|||||||
|
|
||||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||||
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
|
|
||||||
|
<IfDefine ALLOW_CORS>
|
||||||
|
Header set Access-Control-Allow-Origin "*"
|
||||||
|
</IfDefine>
|
||||||
</VirtualHost>
|
</VirtualHost>
|
||||||
|
14
docker-compose.yml
Normal file
14
docker-compose.yml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
map:
|
||||||
|
image: overv/openstreetmap-tile-server
|
||||||
|
volumes:
|
||||||
|
- openstreetmap-data:/var/lib/postgresql/12/main
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
command: "run"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
openstreetmap-data:
|
||||||
|
external: true
|
48
indexes.sql
Normal file
48
indexes.sql
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
-- Extracted from https://github.com/gravitystorm/openstreetmap-carto
|
||||||
|
-- Comes with a CC0 license
|
||||||
|
|
||||||
|
-- These are optional but suggested indexes for rendering OpenStreetMap Carto
|
||||||
|
-- with a full planet database.
|
||||||
|
-- This file is generated with scripts/indexes.py
|
||||||
|
|
||||||
|
CREATE INDEX planet_osm_roads_admin
|
||||||
|
ON planet_osm_roads USING GIST (way)
|
||||||
|
WHERE boundary = 'administrative';
|
||||||
|
CREATE INDEX planet_osm_roads_roads_ref
|
||||||
|
ON planet_osm_roads USING GIST (way)
|
||||||
|
WHERE highway IS NOT NULL AND ref IS NOT NULL;
|
||||||
|
CREATE INDEX planet_osm_roads_admin_low
|
||||||
|
ON planet_osm_roads USING GIST (way)
|
||||||
|
WHERE boundary = 'administrative' AND admin_level IN ('0', '1', '2', '3', '4');
|
||||||
|
CREATE INDEX planet_osm_line_ferry
|
||||||
|
ON planet_osm_line USING GIST (way)
|
||||||
|
WHERE route = 'ferry';
|
||||||
|
CREATE INDEX planet_osm_line_river
|
||||||
|
ON planet_osm_line USING GIST (way)
|
||||||
|
WHERE waterway = 'river';
|
||||||
|
CREATE INDEX planet_osm_line_name
|
||||||
|
ON planet_osm_line USING GIST (way)
|
||||||
|
WHERE name IS NOT NULL;
|
||||||
|
CREATE INDEX planet_osm_polygon_water
|
||||||
|
ON planet_osm_polygon USING GIST (way)
|
||||||
|
WHERE waterway IN ('dock', 'riverbank', 'canal')
|
||||||
|
OR landuse IN ('reservoir', 'basin')
|
||||||
|
OR "natural" IN ('water', 'glacier');
|
||||||
|
CREATE INDEX planet_osm_polygon_nobuilding
|
||||||
|
ON planet_osm_polygon USING GIST (way)
|
||||||
|
WHERE building IS NULL;
|
||||||
|
CREATE INDEX planet_osm_polygon_name
|
||||||
|
ON planet_osm_polygon USING GIST (way)
|
||||||
|
WHERE name IS NOT NULL;
|
||||||
|
CREATE INDEX planet_osm_polygon_way_area_z10
|
||||||
|
ON planet_osm_polygon USING GIST (way)
|
||||||
|
WHERE way_area > 23300;
|
||||||
|
CREATE INDEX planet_osm_polygon_military
|
||||||
|
ON planet_osm_polygon USING GIST (way)
|
||||||
|
WHERE (landuse = 'military' OR military = 'danger_area') AND building IS NULL;
|
||||||
|
CREATE INDEX planet_osm_polygon_way_area_z6
|
||||||
|
ON planet_osm_polygon USING GIST (way)
|
||||||
|
WHERE way_area > 5980000;
|
||||||
|
CREATE INDEX planet_osm_point_place
|
||||||
|
ON planet_osm_point USING GIST (way)
|
||||||
|
WHERE place IS NOT NULL AND name IS NOT NULL;
|
@@ -25,7 +25,7 @@
|
|||||||
<script>
|
<script>
|
||||||
var map = L.map('map').setView([0, 0], 3);
|
var map = L.map('map').setView([0, 0], 3);
|
||||||
|
|
||||||
L.tileLayer('http://localhost/tile/{z}/{x}/{y}.png', {
|
L.tileLayer('/tile/{z}/{x}/{y}.png', {
|
||||||
maxZoom: 18,
|
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>',
|
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'
|
id: 'base'
|
||||||
|
206
openstreetmap-tiles-update-expire
Normal file
206
openstreetmap-tiles-update-expire
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# AJT - change directory to mod_tile directory so that we can run replag
|
||||||
|
# and other things directly from this script when run from cron.
|
||||||
|
# Change the actual location to wherever installed locally.
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
export PATH=.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
|
ACCOUNT=renderer
|
||||||
|
cd /home/$ACCOUNT/src/mod_tile/
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# Extra OSM2PGSQL_OPTIONS may need setting if a tag transform script is
|
||||||
|
# in use. See https://github.com/SomeoneElseOSM/SomeoneElse-style and
|
||||||
|
# http://wiki.openstreetmap.org/wiki/User:SomeoneElse/Ubuntu_1404_tileserver_load
|
||||||
|
# The database name always needs setting.
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
OSMOSIS_BIN=osmosis
|
||||||
|
OSM2PGSQL_BIN=osm2pgsql
|
||||||
|
TRIM_BIN=/home/$ACCOUNT/src/regional/trim_osc.py
|
||||||
|
|
||||||
|
DBNAME=gis
|
||||||
|
OSM2PGSQL_OPTIONS="-d $DBNAME -G --hstore ${OSM2PGSQL_EXTRA_ARGS} --tag-transform-script /home/renderer/src/openstreetmap-carto/openstreetmap-carto.lua --number-processes ${THREADS:-4} -S /home/renderer/src/openstreetmap-carto/openstreetmap-carto.style"
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# When using trim_osc.py we can define either a bounding box (such as this
|
||||||
|
# example for England and Wales) or a polygon.
|
||||||
|
# See https://github.com/zverik/regional .
|
||||||
|
# This area will usually correspond to the data originally loaded.
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
TRIM_POLY_FILE="/var/lib/mod_tile/data.poly"
|
||||||
|
TRIM_OPTIONS="-d $DBNAME"
|
||||||
|
#TRIM_REGION_OPTIONS="-b -14.17 48.85 2.12 61.27"
|
||||||
|
TRIM_REGION_OPTIONS="-p $TRIM_POLY_FILE"
|
||||||
|
|
||||||
|
BASE_DIR=/var/lib/mod_tile
|
||||||
|
LOG_DIR=/var/log/tiles/
|
||||||
|
WORKOSM_DIR=$BASE_DIR/.osmosis
|
||||||
|
|
||||||
|
LOCK_FILE=/tmp/openstreetmap-update-expire-lock.txt
|
||||||
|
CHANGE_FILE=$BASE_DIR/changes.osc.gz
|
||||||
|
EXPIRY_FILE=$BASE_DIR/dirty_tiles
|
||||||
|
STOP_FILE=$BASE_DIR/stop.txt
|
||||||
|
|
||||||
|
OSMOSISLOG=$LOG_DIR/osmosis.log
|
||||||
|
PGSQLLOG=$LOG_DIR/osm2pgsql.log
|
||||||
|
EXPIRYLOG=$LOG_DIR/expiry.log
|
||||||
|
RUNLOG=$LOG_DIR/run.log
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# The tile expiry section below can re-render, delete or dirty expired tiles.
|
||||||
|
# By default, tiles between EXPIRY_MINZOOM and EXPIRY_MAXZOOM are rerendered.
|
||||||
|
# "render_expired" can optionally delete (and/or dirty) tiles above a certail
|
||||||
|
# threshold rather than rendering them.
|
||||||
|
# Here we expire (but don't immediately rerender) tiles between zoom levels
|
||||||
|
# 13 and 18 and delete between 19 and 20.
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
EXPIRY_MINZOOM=13
|
||||||
|
EXPIRY_TOUCHFROM=13
|
||||||
|
EXPIRY_DELETEFROM=19
|
||||||
|
EXPIRY_MAXZOOM=20
|
||||||
|
|
||||||
|
#*************************************************************************
|
||||||
|
#*************************************************************************
|
||||||
|
|
||||||
|
m_info()
|
||||||
|
{
|
||||||
|
echo "[`date +"%Y-%m-%d %H:%M:%S"`] $$ $1" >> "$RUNLOG"
|
||||||
|
}
|
||||||
|
|
||||||
|
m_error()
|
||||||
|
{
|
||||||
|
echo "[`date +"%Y-%m-%d %H:%M:%S"`] $$ [error] $1" >> "$RUNLOG"
|
||||||
|
|
||||||
|
m_info "resetting state"
|
||||||
|
/bin/cp $WORKOSM_DIR/last.state.txt $WORKOSM_DIR/state.txt || true
|
||||||
|
|
||||||
|
rm "$CHANGE_FILE" || true
|
||||||
|
rm "$EXPIRY_FILE.$$" || true
|
||||||
|
rm "$LOCK_FILE"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ok()
|
||||||
|
{
|
||||||
|
echo "[`date +"%Y-%m-%d %H:%M:%S"`] $$ $1" >> "$RUNLOG"
|
||||||
|
}
|
||||||
|
|
||||||
|
getlock()
|
||||||
|
{
|
||||||
|
if [ -s $1 ]; then
|
||||||
|
if [ "$(ps -p `cat $1` | wc -l)" -gt 1 ]; then
|
||||||
|
return 1 #false
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $$ >"$1"
|
||||||
|
return 0 #true
|
||||||
|
}
|
||||||
|
|
||||||
|
freelock()
|
||||||
|
{
|
||||||
|
rm "$1"
|
||||||
|
rm "$CHANGE_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [ $# -eq 1 ] ; then
|
||||||
|
m_info "Initialising Osmosis replication system to $1"
|
||||||
|
mkdir $WORKOSM_DIR
|
||||||
|
$OSMOSIS_BIN --read-replication-interval-init workingDirectory=$WORKOSM_DIR 1>&2 2> "$OSMOSISLOG"
|
||||||
|
wget "http://replicate-sequences.osm.mazdermind.de/?"$1"T00:00:00Z" -O $WORKOSM_DIR/state.txt
|
||||||
|
mv $WORKOSM_DIR/configuration.txt $WORKOSM_DIR/configuration_orig.txt
|
||||||
|
sed "s!baseUrl=http://planet.openstreetmap.org/replication/minute!baseUrl=https://planet.openstreetmap.org/replication/minute!" $WORKOSM_DIR/configuration_orig.txt > $WORKOSM_DIR/configuration.txt
|
||||||
|
else
|
||||||
|
# make sure the lockfile is removed when we exit and then claim it
|
||||||
|
|
||||||
|
if ! getlock "$LOCK_FILE"; then
|
||||||
|
m_info "pid `cat $LOCK_FILE` still running"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -e $STOP_FILE ]; then
|
||||||
|
m_info "stopped"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Add disk space check from https://github.com/zverik/regional
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
MIN_DISK_SPACE_MB=500
|
||||||
|
|
||||||
|
if `python -c "import os, sys; st=os.statvfs('$BASE_DIR'); sys.exit(1 if st.f_bavail*st.f_frsize/1024/1024 > $MIN_DISK_SPACE_MB else 0)"`; then
|
||||||
|
m_info "there is less than $MIN_DISK_SPACE_MB MB left"
|
||||||
|
exit 4
|
||||||
|
fi
|
||||||
|
|
||||||
|
seq=`cat $WORKOSM_DIR/state.txt | grep sequenceNumber | cut -d= -f2`
|
||||||
|
|
||||||
|
m_ok "start import from seq-nr $seq, replag is `osmosis-db_replag -h`"
|
||||||
|
|
||||||
|
/bin/cp $WORKOSM_DIR/state.txt $WORKOSM_DIR/last.state.txt
|
||||||
|
m_ok "downloading diff"
|
||||||
|
|
||||||
|
if ! $OSMOSIS_BIN --read-replication-interval workingDirectory=$WORKOSM_DIR --simplify-change --write-xml-change $CHANGE_FILE 1>&2 2> "$OSMOSISLOG"; then
|
||||||
|
m_error "Osmosis error"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f $TRIM_POLY_FILE ] ; then
|
||||||
|
m_ok "filtering diff"
|
||||||
|
if ! $TRIM_BIN $TRIM_OPTIONS $TRIM_REGION_OPTIONS -z $CHANGE_FILE $CHANGE_FILE 1>&2 2>> "$RUNLOG"; then
|
||||||
|
m_error "Trim_osc error"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
m_ok "filtering diff skipped"
|
||||||
|
fi
|
||||||
|
m_ok "importing diff"
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# Previously openstreetmap-tiles-update-expire tried to dirty layer
|
||||||
|
# "$EXPIRY_MAXZOOM - 3" (which was 15) only. Instead we write all expired
|
||||||
|
# tiles in range to the list (note the "-" rather than ":" in the "-e"
|
||||||
|
# parameter).
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
if ! $OSM2PGSQL_BIN -a --slim -e$EXPIRY_MINZOOM-$EXPIRY_MAXZOOM $OSM2PGSQL_OPTIONS -o "$EXPIRY_FILE.$$" $CHANGE_FILE 1>&2 2> "$PGSQLLOG"; then
|
||||||
|
m_error "osm2pgsql error"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# The lockfile is normally removed before we expire tiles because that is
|
||||||
|
# something thatcan be done in parallel with further processing. In order to
|
||||||
|
# avoid rework, if actually rerendering is done rather than just deleting or
|
||||||
|
# dirtying, it makes sense to move it lower down.
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# m_ok "Import complete; removing lock file"
|
||||||
|
# freelock "$LOCK_FILE"
|
||||||
|
|
||||||
|
m_ok "expiring tiles"
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# When expiring tiles we need to define the style sheet if it's not "default".
|
||||||
|
# In this case it's "ajt".
|
||||||
|
# Previously all tiles on the "dirty" list between $EXPIRY_MINZOOM and
|
||||||
|
# $EXPIRY_MAXZOOM were dirtied. We currently re-render
|
||||||
|
# tiles >= $EXPIRY_MINZOOM and < $EXPIRY_DELETEFROM, expiry from 14 and
|
||||||
|
# delete >= $EXPIRY_DELETEFROM and <= $EXPIRY_MAXZOOM.
|
||||||
|
# The default path to renderd.sock is fixed.
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
if ! render_expired --map=ajt --min-zoom=$EXPIRY_MINZOOM --touch-from=$EXPIRY_TOUCHFROM --delete-from=$EXPIRY_DELETEFROM --max-zoom=$EXPIRY_MAXZOOM -s /var/run/renderd/renderd.sock < "$EXPIRY_FILE.$$" 2>&1 | tail -8 >> "$EXPIRYLOG"; then
|
||||||
|
m_info "Expiry failed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm "$EXPIRY_FILE.$$"
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
# Only remove the lock file after expiry (if system is slow we want to delay
|
||||||
|
# the next import, not have multiple render_expired processes running)
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
freelock "$LOCK_FILE"
|
||||||
|
|
||||||
|
m_ok "Done with import"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
25
postgresql.custom.conf.tmpl
Normal file
25
postgresql.custom.conf.tmpl
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Suggested minimal settings from
|
||||||
|
# https://ircama.github.io/osm-carto-tutorials/tile-server-ubuntu/
|
||||||
|
|
||||||
|
shared_buffers = 128MB
|
||||||
|
min_wal_size = 1GB
|
||||||
|
max_wal_size = 2GB
|
||||||
|
maintenance_work_mem = 256MB
|
||||||
|
|
||||||
|
# Suggested settings from
|
||||||
|
# https://github.com/openstreetmap/chef/blob/master/roles/tile.rb#L38-L45
|
||||||
|
|
||||||
|
max_connections = 250
|
||||||
|
temp_buffers = 32MB
|
||||||
|
work_mem = 128MB
|
||||||
|
wal_buffers = 1024kB
|
||||||
|
wal_writer_delay = 500ms
|
||||||
|
commit_delay = 10000
|
||||||
|
# checkpoint_segments = 60 # unrecognized in psql 10.7.1
|
||||||
|
max_wal_size = 2880MB
|
||||||
|
random_page_cost = 1.1
|
||||||
|
track_activity_query_size = 16384
|
||||||
|
autovacuum_vacuum_scale_factor = 0.05
|
||||||
|
autovacuum_analyze_scale_factor = 0.02
|
||||||
|
|
||||||
|
listen_addresses = '*'
|
80
run.sh
80
run.sh
@@ -1,5 +1,17 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -x
|
||||||
|
|
||||||
|
function createPostgresConfig() {
|
||||||
|
cp /etc/postgresql/12/main/postgresql.custom.conf.tmpl /etc/postgresql/12/main/conf.d/postgresql.custom.conf
|
||||||
|
sudo -u postgres echo "autovacuum = $AUTOVACUUM" >> /etc/postgresql/12/main/conf.d/postgresql.custom.conf
|
||||||
|
cat /etc/postgresql/12/main/conf.d/postgresql.custom.conf
|
||||||
|
}
|
||||||
|
|
||||||
|
function setPostgresPassword() {
|
||||||
|
sudo -u postgres psql -c "ALTER USER renderer PASSWORD '${PGPASSWORD:-renderer}'"
|
||||||
|
}
|
||||||
|
|
||||||
if [ "$#" -ne 1 ]; then
|
if [ "$#" -ne 1 ]; then
|
||||||
echo "usage: <import|run>"
|
echo "usage: <import|run>"
|
||||||
echo "commands:"
|
echo "commands:"
|
||||||
@@ -7,11 +19,19 @@ if [ "$#" -ne 1 ]; then
|
|||||||
echo " run: Runs Apache and renderd to serve tiles at /tile/{z}/{x}/{y}.png"
|
echo " run: Runs Apache and renderd to serve tiles at /tile/{z}/{x}/{y}.png"
|
||||||
echo "environment variables:"
|
echo "environment variables:"
|
||||||
echo " THREADS: defines number of threads used for importing / tile rendering"
|
echo " THREADS: defines number of threads used for importing / tile rendering"
|
||||||
|
echo " UPDATES: consecutive updates (enabled/disabled)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$1" = "import" ]; then
|
if [ "$1" = "import" ]; then
|
||||||
|
# Ensure that database directory is in right state
|
||||||
|
chown postgres:postgres -R /var/lib/postgresql
|
||||||
|
if [ ! -f /var/lib/postgresql/12/main/PG_VERSION ]; then
|
||||||
|
sudo -u postgres /usr/lib/postgresql/12/bin/pg_ctl -D /var/lib/postgresql/12/main/ initdb -o "--locale C.UTF-8"
|
||||||
|
fi
|
||||||
|
|
||||||
# Initialize PostgreSQL
|
# Initialize PostgreSQL
|
||||||
|
createPostgresConfig
|
||||||
service postgresql start
|
service postgresql start
|
||||||
sudo -u postgres createuser renderer
|
sudo -u postgres createuser renderer
|
||||||
sudo -u postgres createdb -E UTF8 -O renderer gis
|
sudo -u postgres createdb -E UTF8 -O renderer gis
|
||||||
@@ -19,32 +39,84 @@ if [ "$1" = "import" ]; then
|
|||||||
sudo -u postgres psql -d gis -c "CREATE EXTENSION hstore;"
|
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 geometry_columns OWNER TO renderer;"
|
||||||
sudo -u postgres psql -d gis -c "ALTER TABLE spatial_ref_sys OWNER TO renderer;"
|
sudo -u postgres psql -d gis -c "ALTER TABLE spatial_ref_sys OWNER TO renderer;"
|
||||||
|
setPostgresPassword
|
||||||
|
|
||||||
# Download Luxembourg as sample if no data is provided
|
# Download Luxembourg as sample if no data is provided
|
||||||
if [ ! -f /data.osm.pbf ]; then
|
if [ ! -f /data.osm.pbf ]; then
|
||||||
echo "WARNING: No import file at /data.osm.pbf, so importing Luxembourg as example..."
|
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
|
wget -nv http://download.geofabrik.de/europe/luxembourg-latest.osm.pbf -O /data.osm.pbf
|
||||||
|
wget -nv http://download.geofabrik.de/europe/luxembourg.poly -O /data.poly
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$UPDATES" = "enabled" ]; then
|
||||||
|
# determine and set osmosis_replication_timestamp (for consecutive updates)
|
||||||
|
osmium fileinfo /data.osm.pbf > /var/lib/mod_tile/data.osm.pbf.info
|
||||||
|
osmium fileinfo /data.osm.pbf | grep 'osmosis_replication_timestamp=' | cut -b35-44 > /var/lib/mod_tile/replication_timestamp.txt
|
||||||
|
REPLICATION_TIMESTAMP=$(cat /var/lib/mod_tile/replication_timestamp.txt)
|
||||||
|
|
||||||
|
# initial setup of osmosis workspace (for consecutive updates)
|
||||||
|
sudo -u renderer openstreetmap-tiles-update-expire $REPLICATION_TIMESTAMP
|
||||||
|
fi
|
||||||
|
|
||||||
|
# copy polygon file if available
|
||||||
|
if [ -f /data.poly ]; then
|
||||||
|
sudo -u renderer cp /data.poly /var/lib/mod_tile/data.poly
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Import data
|
# 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
|
sudo -u renderer osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script /home/renderer/src/openstreetmap-carto/openstreetmap-carto.lua --number-processes ${THREADS:-4} ${OSM2PGSQL_EXTRA_ARGS} -S /home/renderer/src/openstreetmap-carto/openstreetmap-carto.style /data.osm.pbf
|
||||||
|
|
||||||
|
# Create indexes
|
||||||
|
sudo -u postgres psql -d gis -f indexes.sql
|
||||||
|
|
||||||
|
# Register that data has changed for mod_tile caching purposes
|
||||||
|
touch /var/lib/mod_tile/planet-import-complete
|
||||||
|
|
||||||
|
service postgresql stop
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$1" = "run" ]; then
|
if [ "$1" = "run" ]; then
|
||||||
|
# Clean /tmp
|
||||||
|
rm -rf /tmp/*
|
||||||
|
|
||||||
|
# Fix postgres data privileges
|
||||||
|
chown postgres:postgres /var/lib/postgresql -R
|
||||||
|
|
||||||
|
# Configure Apache CORS
|
||||||
|
if [ "$ALLOW_CORS" == "enabled" ] || [ "$ALLOW_CORS" == "1" ]; then
|
||||||
|
echo "export APACHE_ARGUMENTS='-D ALLOW_CORS'" >> /etc/apache2/envvars
|
||||||
|
fi
|
||||||
|
|
||||||
# Initialize PostgreSQL and Apache
|
# Initialize PostgreSQL and Apache
|
||||||
|
createPostgresConfig
|
||||||
service postgresql start
|
service postgresql start
|
||||||
service apache2 restart
|
service apache2 restart
|
||||||
|
setPostgresPassword
|
||||||
|
|
||||||
# Configure renderd threads
|
# Configure renderd threads
|
||||||
sed -i -E "s/num_threads=[0-9]+/num_threads=${THREADS:-4}/g" /usr/local/etc/renderd.conf
|
sed -i -E "s/num_threads=[0-9]+/num_threads=${THREADS:-4}/g" /usr/local/etc/renderd.conf
|
||||||
|
|
||||||
# Run
|
# start cron job to trigger consecutive updates
|
||||||
sudo -u renderer renderd -f -c /usr/local/etc/renderd.conf
|
if [ "$UPDATES" = "enabled" ] || [ "$UPDATES" = "1" ]; then
|
||||||
|
/etc/init.d/cron start
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run while handling docker stop's SIGTERM
|
||||||
|
stop_handler() {
|
||||||
|
kill -TERM "$child"
|
||||||
|
}
|
||||||
|
trap stop_handler SIGTERM
|
||||||
|
|
||||||
|
sudo -u renderer renderd -f -c /usr/local/etc/renderd.conf &
|
||||||
|
child=$!
|
||||||
|
wait "$child"
|
||||||
|
|
||||||
|
service postgresql stop
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "invalid command"
|
echo "invalid command"
|
||||||
exit 1
|
exit 1
|
||||||
|
Reference in New Issue
Block a user