Compare commits

..

15 Commits

Author SHA1 Message Date
Alexander Overvoorde
ca1626a9fc Merge branch 'Y0ngg4n-postgresql-12-upgrade' 2019-10-20 21:49:03 +02:00
Yonggan
101bb62e45 Fix README.md 2019-10-16 18:18:22 +02:00
root
e249f30d40 Upgrade to postgresql 12 2019-10-14 23:40:49 +02:00
Alexander Overvoorde
6e5f4f485d Add proper handling of docker stop 2019-10-12 12:35:16 +02:00
Alexander Overvoorde
ca4b1acb04 Add planet-import-complete file during imports 2019-10-12 12:21:10 +02:00
Alexander Overvoorde
40ebaf7934 Merge pull request #73 from stevo01/master
use tag v4.23.0 from openstreetmap-carto instead to use master
2019-10-04 19:48:38 +02:00
Steffen Volkmann
bfcc7d7c44 use tag v4.23.0 from openstreetmap-carto instead to use master 2019-10-03 18:15:41 +02:00
Alexander Overvoorde
598a48145a Merge pull request #71 from stevo01/master
use carto version 0.18.2 to solve carto conflicts / warnings
2019-09-29 16:46:17 +02:00
Steffen Volkmann
d106610e05 use carto version 0.18.2 to solve carto conflicts / warnings 2019-09-27 05:55:13 +02:00
Alexander Overvoorde
ff8655701e Update instructions for flat node usage 2019-09-26 20:09:02 +02:00
Alexander Overvoorde
a2eceb6bb5 Merge pull request #66 from stevo01/master
pull request solves issues #63 #64 #65
2019-09-26 20:06:48 +02:00
Steffen Volkmann
bea77eb8bf Dockerfile: create directory for flatnodes
and change owner of directory to renderer
2019-09-24 11:36:13 +02:00
Steffen Volkmann
33cd142850 make option -C of command osm2psql adjustable 2019-09-24 11:36:13 +02:00
Steffen Volkmann
c5a6462263 add OSM2PGSQL_EXTRA_ARGS to arguments of osm2psql call insight openstreetmap-tiles-update-expire script 2019-09-24 11:36:13 +02:00
Alexander Overvoorde
80586aff5f Fix Postgres not being reachable from outside container 2019-09-22 16:39:56 +02:00
6 changed files with 110 additions and 39 deletions

View File

@@ -10,7 +10,10 @@ 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 # Install dependencies
RUN echo "deb [ allow-insecure=yes ] http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main" >> /etc/apt/sources.list.d/pgdg.list \ 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 update \
&& apt-get install -y apt-transport-https ca-certificates \ && apt-get install -y apt-transport-https ca-certificates \
&& apt-get install -y --no-install-recommends --allow-unauthenticated \ && apt-get install -y --no-install-recommends --allow-unauthenticated \
@@ -24,7 +27,9 @@ RUN echo "deb [ allow-insecure=yes ] http://apt.postgresql.org/pub/repos/apt/ bi
fonts-noto-hinted \ fonts-noto-hinted \
fonts-noto-unhinted \ fonts-noto-unhinted \
clang \ clang \
gcc \
gdal-bin \ gdal-bin \
make \
git-core \ git-core \
libagg-dev \ libagg-dev \
libboost-all-dev \ libboost-all-dev \
@@ -52,10 +57,9 @@ RUN echo "deb [ allow-insecure=yes ] http://apt.postgresql.org/pub/repos/apt/ bi
nodejs \ nodejs \
npm \ npm \
postgis \ postgis \
postgresql-10 \ postgresql-12 \
postgresql-10-postgis-2.5 \ postgresql-server-dev-12 \
postgresql-10-postgis-2.5-scripts \ postgresql-contrib-12 \
postgresql-contrib-10 \
protobuf-c-compiler \ protobuf-c-compiler \
python-mapnik \ python-mapnik \
sudo \ sudo \
@@ -72,6 +76,11 @@ RUN echo "deb [ allow-insecure=yes ] http://apt.postgresql.org/pub/repos/apt/ bi
&& apt-get autoremove --yes \ && apt-get autoremove --yes \
&& rm -rf /var/lib/{apt,dpkg,cache,log}/ && rm -rf /var/lib/{apt,dpkg,cache,log}/
# Set up PostGIS
RUN wget http://download.osgeo.org/postgis/source/postgis-3.0.0rc2.tar.gz
RUN tar -xvzf postgis-3.0.0rc2.tar.gz
RUN cd postgis-3.0.0rc2 && ./configure && make && make install
# Set up renderer user # Set up renderer user
RUN adduser --disabled-password --gecos "" renderer RUN adduser --disabled-password --gecos "" renderer
USER renderer USER renderer
@@ -87,6 +96,8 @@ RUN cmake .. \
&& make -j $(nproc) && make -j $(nproc)
USER root USER root
RUN make install RUN make install
RUN mkdir /nodes \
&& chown renderer:renderer /nodes
USER renderer USER renderer
# Install and test Mapnik # Install and test Mapnik
@@ -107,10 +118,11 @@ USER renderer
# Configure stylesheet # Configure stylesheet
WORKDIR /home/renderer/src WORKDIR /home/renderer/src
RUN git clone https://github.com/gravitystorm/openstreetmap-carto.git RUN git clone https://github.com/gravitystorm/openstreetmap-carto.git \
&& git -C openstreetmap-carto checkout v4.23.0
WORKDIR /home/renderer/src/openstreetmap-carto WORKDIR /home/renderer/src/openstreetmap-carto
USER root USER root
RUN npm install -g carto RUN npm install -g carto@0.18.2
USER renderer USER renderer
RUN carto project.mml > mapnik.xml RUN carto project.mml > mapnik.xml
@@ -143,6 +155,8 @@ COPY postgresql.custom.conf.tmpl /etc/postgresql/10/main/
RUN chown -R postgres:postgres /var/lib/postgresql \ RUN chown -R postgres:postgres /var/lib/postgresql \
&& chown postgres:postgres /etc/postgresql/10/main/postgresql.custom.conf.tmpl \ && chown postgres:postgres /etc/postgresql/10/main/postgresql.custom.conf.tmpl \
&& echo "\ninclude 'postgresql.custom.conf'" >> /etc/postgresql/10/main/postgresql.conf && echo "\ninclude 'postgresql.custom.conf'" >> /etc/postgresql/10/main/postgresql.conf
RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/10/main/pg_hba.conf \
&& echo "host all all ::/0 md5" >> /etc/postgresql/10/main/pg_hba.conf
# copy update scripts # copy update scripts
COPY openstreetmap-tiles-update-expire /usr/bin/ COPY openstreetmap-tiles-update-expire /usr/bin/

View File

@@ -8,5 +8,5 @@ push: build
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 -v openstreetmap-data:/var/lib/postgresql/12/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 docker run -v openstreetmap-data:/var/lib/postgresql/12/main -p 80:80 -d overv/openstreetmap-tile-server run

View File

@@ -13,7 +13,7 @@ Next, download an .osm.pbf extract from geofabrik.de for the region that you're
``` ```
docker run \ docker run \
-v /absolute/path/to/luxembourg.osm.pbf:/data.osm.pbf \ -v /absolute/path/to/luxembourg.osm.pbf:/data.osm.pbf \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/main \
overv/openstreetmap-tile-server \ overv/openstreetmap-tile-server \
import import
``` ```
@@ -28,7 +28,7 @@ If your import is an extract of the planet and has polygonal bounds associated w
docker run \ docker run \
-v /absolute/path/to/luxembourg.osm.pbf:/data.osm.pbf \ -v /absolute/path/to/luxembourg.osm.pbf:/data.osm.pbf \
-v /absolute/path/to/luxembourg.poly:/data.poly \ -v /absolute/path/to/luxembourg.poly:/data.poly \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/main \
overv/openstreetmap-tile-server \ overv/openstreetmap-tile-server \
import import
``` ```
@@ -42,7 +42,7 @@ Run the server like this:
``` ```
docker run \ docker run \
-p 80:80 \ -p 80:80 \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/main \
-d overv/openstreetmap-tile-server \ -d overv/openstreetmap-tile-server \
run run
``` ```
@@ -57,12 +57,14 @@ Tiles that have already been rendered will be stored in `/var/lib/mod_tile`. To
docker volume create openstreetmap-rendered-tiles docker volume create openstreetmap-rendered-tiles
docker run \ docker run \
-p 80:80 \ -p 80:80 \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/main \
-v openstreetmap-rendered-tiles:/var/lib/mod_tile \ -v openstreetmap-rendered-tiles:/var/lib/mod_tile \
-d overv/openstreetmap-tile-server \ -d overv/openstreetmap-tile-server \
run run
``` ```
**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) ### Enabling automatic updating (optional)
Given that you've specified both the OSM data and polygon as specified in the *Automatic updates* section during server setup, you can enable the updating process by setting the variable `UPDATES` to `enabled`: Given that you've specified both the OSM data and polygon as specified in the *Automatic updates* section during server setup, you can enable the updating process by setting the variable `UPDATES` to `enabled`:
@@ -71,7 +73,7 @@ Given that you've specified both the OSM data and polygon as specified in the *A
docker run \ docker run \
-p 80:80 \ -p 80:80 \
-e UPDATES=enabled \ -e UPDATES=enabled \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/main \
-v openstreetmap-rendered-tiles:/var/lib/mod_tile \ -v openstreetmap-rendered-tiles:/var/lib/mod_tile \
-d overv/openstreetmap-tile-server \ -d overv/openstreetmap-tile-server \
run run
@@ -86,12 +88,43 @@ To enable the `Access-Control-Allow-Origin` header to be able to retrieve tiles
``` ```
docker run \ docker run \
-p 80:80 \ -p 80:80 \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/main \
-e ALLOW_CORS=1 \ -e ALLOW_CORS=1 \
-d overv/openstreetmap-tile-server \ -d overv/openstreetmap-tile-server \
run run
``` ```
### Connecting to Postgres
To connect to the PostgreSQL database inside the container, make sure to expose port 5432:
```
docker run \
-p 80: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 80: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 ## 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/). Details for update procedure and invoked scripts can be found here [link](https://ircama.github.io/osm-carto-tutorials/updating-data/).
@@ -103,7 +136,19 @@ The import and tile serving processes use 4 threads by default, but this number
docker run \ docker run \
-p 80:80 \ -p 80:80 \
-e THREADS=24 \ -e THREADS=24 \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/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 80:80 \
-e "OSM2PGSQL_EXTRA_ARGS=-C 4096" \
-v openstreetmap-data:/var/lib/postgresql/12/main \
-d overv/openstreetmap-tile-server \ -d overv/openstreetmap-tile-server \
run run
``` ```
@@ -115,33 +160,27 @@ The database use the autovacuum feature by default. This behavior can be changed
docker run \ docker run \
-p 80:80 \ -p 80:80 \
-e AUTOVACUUM=off \ -e AUTOVACUUM=off \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/main \
-d overv/openstreetmap-tile-server \ -d overv/openstreetmap-tile-server \
run run
``` ```
### Flat nodes ### 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. This option takes a path to a file that must be persisted so we should first set up a volume with the right permissions: 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 -it -v openstreetmap-nodes:/nodes --entrypoint=bash overv/openstreetmap-tile-server
$ chown renderer:renderer -R /nodes
$ exit
```
You can then use it during the import process as follows:
``` ```
docker run \ docker run \
-v /absolute/path/to/luxembourg.osm.pbf:/data.osm.pbf \ -v /absolute/path/to/luxembourg.osm.pbf:/data.osm.pbf \
-v openstreetmap-nodes:/nodes \ -v openstreetmap-nodes:/nodes \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/main \
-e "OSM2PGSQL_EXTRA_ARGS=--flat-nodes /nodes/flat_nodes.bin" \ -e "OSM2PGSQL_EXTRA_ARGS=--flat-nodes /nodes/flat_nodes.bin" \
overv/openstreetmap-tile-server \ overv/openstreetmap-tile-server \
import 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 ### 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). 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).
@@ -159,7 +198,7 @@ To raise it use `--shm-size` parameter. For example:
``` ```
docker run \ docker run \
-p 80:80 \ -p 80:80 \
-v openstreetmap-data:/var/lib/postgresql/10/main \ -v openstreetmap-data:/var/lib/postgresql/12/main \
--shm-size="192m" \ --shm-size="192m" \
-d overv/openstreetmap-tile-server \ -d overv/openstreetmap-tile-server \
run run

View File

@@ -22,7 +22,7 @@ OSM2PGSQL_BIN=osm2pgsql
TRIM_BIN=/home/$ACCOUNT/src/regional/trim_osc.py TRIM_BIN=/home/$ACCOUNT/src/regional/trim_osc.py
DBNAME=gis DBNAME=gis
OSM2PGSQL_OPTIONS="-d $DBNAME -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" 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 # When using trim_osc.py we can define either a bounding box (such as this

View File

@@ -21,3 +21,5 @@ random_page_cost = 1.1
track_activity_query_size = 16384 track_activity_query_size = 16384
autovacuum_vacuum_scale_factor = 0.05 autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.02 autovacuum_analyze_scale_factor = 0.02
listen_addresses = '*'

36
run.sh
View File

@@ -2,11 +2,14 @@
set -x set -x
function CreatePostgressqlConfig() function createPostgresConfig() {
{ cp /etc/postgresql/12/main/postgresql.custom.conf.tmpl /etc/postgresql/12/main/postgresql.custom.conf
cp /etc/postgresql/10/main/postgresql.custom.conf.tmpl /etc/postgresql/10/main/postgresql.custom.conf sudo -u postgres echo "autovacuum = $AUTOVACUUM" >> /etc/postgresql/12/main/postgresql.custom.conf
sudo -u postgres echo "autovacuum = $AUTOVACUUM" >> /etc/postgresql/10/main/postgresql.custom.conf cat /etc/postgresql/12/main/postgresql.custom.conf
cat /etc/postgresql/10/main/postgresql.custom.conf }
function setPostgresPassword() {
sudo -u postgres psql -c "ALTER USER renderer PASSWORD '${PGPASSWORD:-renderer}'"
} }
if [ "$#" -ne 1 ]; then if [ "$#" -ne 1 ]; then
@@ -22,7 +25,7 @@ fi
if [ "$1" = "import" ]; then if [ "$1" = "import" ]; then
# Initialize PostgreSQL # Initialize PostgreSQL
CreatePostgressqlConfig 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
@@ -30,6 +33,7 @@ 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
@@ -52,11 +56,14 @@ if [ "$1" = "import" ]; then
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} ${OSM2PGSQL_EXTRA_ARGS} -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 # Create indexes
sudo -u postgres psql -d gis -f indexes.sql 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 service postgresql stop
exit 0 exit 0
@@ -75,9 +82,10 @@ if [ "$1" = "run" ]; then
fi fi
# Initialize PostgreSQL and Apache # Initialize PostgreSQL and Apache
CreatePostgressqlConfig 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
@@ -87,8 +95,16 @@ if [ "$1" = "run" ]; then
/etc/init.d/cron start /etc/init.d/cron start
fi fi
# Run # Run while handling docker stop's SIGTERM
sudo -u renderer renderd -f -c /usr/local/etc/renderd.conf 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 service postgresql stop
exit 0 exit 0