5572c9722e
fix for issue #271
195 lines
7.1 KiB
Bash
Executable File
195 lines
7.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
function createPostgresConfig() {
|
|
cp /etc/postgresql/14/main/postgresql.custom.conf.tmpl /etc/postgresql/14/main/conf.d/postgresql.custom.conf
|
|
sudo -u postgres echo "autovacuum = $AUTOVACUUM" >> /etc/postgresql/14/main/conf.d/postgresql.custom.conf
|
|
cat /etc/postgresql/14/main/conf.d/postgresql.custom.conf
|
|
}
|
|
|
|
function setPostgresPassword() {
|
|
sudo -u postgres psql -c "ALTER USER renderer PASSWORD '${PGPASSWORD:-renderer}'"
|
|
}
|
|
|
|
if [ "$#" -ne 1 ]; then
|
|
echo "usage: <import|run>"
|
|
echo "commands:"
|
|
echo " import: Set up the database and import /data/region.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"
|
|
echo " UPDATES: consecutive updates (enabled/disabled)"
|
|
echo " NAME_LUA: name of .lua script to run as part of the style"
|
|
echo " NAME_STYLE: name of the .style to use"
|
|
echo " NAME_MML: name of the .mml file to render to mapnik.xml"
|
|
echo " NAME_SQL: name of the .sql file to use"
|
|
exit 1
|
|
fi
|
|
|
|
set -x
|
|
|
|
# if there is no custom style mounted, then use osm-carto
|
|
if [ ! "$(ls -A /data/style/)" ]; then
|
|
mv /home/renderer/src/openstreetmap-carto-backup/* /data/style/
|
|
fi
|
|
|
|
# carto build
|
|
if [ ! -f /data/style/mapnik.xml ]; then
|
|
cd /data/style/
|
|
carto ${NAME_MML:-project.mml} > mapnik.xml
|
|
fi
|
|
|
|
if [ "$1" == "import" ]; then
|
|
# Ensure that database directory is in right state
|
|
mkdir -p /data/database/postgres/
|
|
chown renderer: /data/database/
|
|
chown -R postgres: /var/lib/postgresql /data/database/postgres/
|
|
if [ ! -f /data/database/postgres/PG_VERSION ]; then
|
|
sudo -u postgres /usr/lib/postgresql/14/bin/pg_ctl -D /data/database/postgres/ initdb -o "--locale C.UTF-8"
|
|
fi
|
|
|
|
# Initialize PostgreSQL
|
|
createPostgresConfig
|
|
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;"
|
|
setPostgresPassword
|
|
|
|
# Download Luxembourg as sample if no data is provided
|
|
if [ ! -f /data/region.osm.pbf ] && [ -z "${DOWNLOAD_PBF:-}" ]; then
|
|
echo "WARNING: No import file at /data/region.osm.pbf, so importing Luxembourg as example..."
|
|
DOWNLOAD_PBF="https://download.geofabrik.de/europe/luxembourg-latest.osm.pbf"
|
|
DOWNLOAD_POLY="https://download.geofabrik.de/europe/luxembourg.poly"
|
|
fi
|
|
|
|
if [ -n "${DOWNLOAD_PBF:-}" ]; then
|
|
echo "INFO: Download PBF file: $DOWNLOAD_PBF"
|
|
wget ${WGET_ARGS:-} "$DOWNLOAD_PBF" -O /data/region.osm.pbf
|
|
if [ -n "$DOWNLOAD_POLY" ]; then
|
|
echo "INFO: Download PBF-POLY file: $DOWNLOAD_POLY"
|
|
wget ${WGET_ARGS:-} "$DOWNLOAD_POLY" -O /data/region.poly
|
|
fi
|
|
fi
|
|
|
|
if [ "${UPDATES:-}" == "enabled" ] || [ "${UPDATES:-}" == "1" ]; then
|
|
# determine and set osmosis_replication_timestamp (for consecutive updates)
|
|
REPLICATION_TIMESTAMP=`osmium fileinfo /data/region.osm.pbf | grep 'osmosis_replication_timestamp=' | cut -b35-44`
|
|
|
|
# initial setup of osmosis workspace (for consecutive updates)
|
|
sudo -u renderer openstreetmap-tiles-update-expire.sh $REPLICATION_TIMESTAMP
|
|
fi
|
|
|
|
# copy polygon file if available
|
|
if [ -f /data/region.poly ]; then
|
|
cp /data/region.poly /data/database/region.poly
|
|
chown renderer: /data/database/region.poly
|
|
fi
|
|
|
|
# flat-nodes
|
|
if [ "${FLAT_NODES:-}" == "enabled" ] || [ "${FLAT_NODES:-}" == "1" ]; then
|
|
OSM2PGSQL_EXTRA_ARGS="${OSM2PGSQL_EXTRA_ARGS:-} --flat-nodes /data/database/flat_nodes.bin"
|
|
fi
|
|
|
|
# Import data
|
|
sudo -u renderer osm2pgsql -d gis --create --slim -G --hstore \
|
|
--tag-transform-script /data/style/${NAME_LUA:-openstreetmap-carto.lua} \
|
|
--number-processes ${THREADS:-4} \
|
|
-S /data/style/${NAME_STYLE:-openstreetmap-carto.style} \
|
|
/data/region.osm.pbf \
|
|
${OSM2PGSQL_EXTRA_ARGS:-} \
|
|
;
|
|
|
|
# old flat-nodes dir
|
|
if [ -f /nodes/flat_nodes.bin ] && ! [ -f /data/database/flat_nodes.bin ]; then
|
|
mv /nodes/flat_nodes.bin /data/database/flat_nodes.bin
|
|
chown renderer: /data/database/flat_nodes.bin
|
|
fi
|
|
|
|
# Create indexes
|
|
if [ -f /data/style/${NAME_SQL:-indexes.sql} ]; then
|
|
sudo -u postgres psql -d gis -f /data/style/${NAME_SQL:-indexes.sql}
|
|
fi
|
|
|
|
#Import external data
|
|
chown -R renderer: /home/renderer/src/ /data/style/
|
|
if [ -f /data/style/scripts/get-external-data.py ] && [ -f /data/style/external-data.yml ]; then
|
|
sudo -E -u renderer python3 /data/style/scripts/get-external-data.py -c /data/style/external-data.yml -D /data/style/data
|
|
fi
|
|
|
|
# Register that data has changed for mod_tile caching purposes
|
|
sudo -u renderer touch /data/database/planet-import-complete
|
|
|
|
service postgresql stop
|
|
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$1" == "run" ]; then
|
|
# Clean /tmp
|
|
rm -rf /tmp/*
|
|
|
|
# migrate old files
|
|
if [ -f /data/database/PG_VERSION ] && ! [ -d /data/database/postgres/ ]; then
|
|
mkdir /data/database/postgres/
|
|
mv /data/database/* /data/database/postgres/
|
|
fi
|
|
if [ -f /nodes/flat_nodes.bin ] && ! [ -f /data/database/flat_nodes.bin ]; then
|
|
mv /nodes/flat_nodes.bin /data/database/flat_nodes.bin
|
|
fi
|
|
if [ -f /data/tiles/data.poly ] && ! [ -f /data/database/region.poly ]; then
|
|
mv /data/tiles/data.poly /data/database/region.poly
|
|
fi
|
|
|
|
# sync planet-import-complete file
|
|
if [ -f /data/tiles/planet-import-complete ] && ! [ -f /data/database/planet-import-complete ]; then
|
|
cp /data/tiles/planet-import-complete /data/database/planet-import-complete
|
|
fi
|
|
if ! [ -f /data/tiles/planet-import-complete ] && [ -f /data/database/planet-import-complete ]; then
|
|
cp /data/database/planet-import-complete /data/tiles/planet-import-complete
|
|
fi
|
|
|
|
# Fix postgres data privileges
|
|
chown -R postgres: /var/lib/postgresql/ /data/database/postgres/
|
|
|
|
# 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
|
|
createPostgresConfig
|
|
service postgresql start
|
|
service apache2 restart
|
|
setPostgresPassword
|
|
|
|
# Configure renderd threads
|
|
sed -i -E "s/num_threads=[0-9]+/num_threads=${THREADS:-4}/g" /usr/local/etc/renderd.conf
|
|
|
|
# start cron job to trigger consecutive updates
|
|
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
|
|
fi
|
|
|
|
echo "invalid command"
|
|
exit 1
|