Skip to content

Instantly share code, notes, and snippets.

@gyfoster
Last active November 29, 2019 22:06
Show Gist options
  • Save gyfoster/39a0201731ac438d133e140118c5eab6 to your computer and use it in GitHub Desktop.
Save gyfoster/39a0201731ac438d133e140118c5eab6 to your computer and use it in GitHub Desktop.
A script for setting up an OSM tile server from scratch
#!/bin/bash
##########################################################################################
# Run on Ubuntu Server 18.04
# Assumes *.tar.gz files are in the same dir as script
# - osm2pgsql.tar.gz from `git clone git://github.com/openstreetmap/osm2pgsql.git`
# - mod_tile.tar.gz from `git clone -b switch2osm git://github.com/SomeoneElseOSM/mod_tile.git`
# - openstreetmap-carto.tar.gz from `git clone git://github.com/gravitystorm/openstreetmap-carto.git`
# - map_data.tar.gz from `wget http://download.geofabrik.de/asia/azerbaijan-latest.osm.pbf`
# - shapefile_data.tar.gz from openstreetmap-carto/scripts/get-shapefiles.py
# Assumes you are providing your own 000-default.conf
# Script created on 2019-11-26
# Based on https://switch2osm.org/serving-tiles/manually-building-a-tile-server-18-04-lts/
##########################################################################################
# Exit when any command fails
set -e
# Check if being run as root
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
USER_NAME="renderaccount"
SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P )"
BASE_DIR="/home/$USER_NAME"
echo_heading () {
LRED='\033[1;31m' # Light red
NC='\033[0m' # No Color
echo -e "${LRED}$1${NC}"
}
echo_heading "Updating package repository..."
apt -y update
echo_heading "Upgrading packages..."
apt -y upgrade
echo_heading "Installing general dependencies..."
apt -y install 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 curl
echo_heading "Installing PostgreSQL dependencies..."
apt -y install postgresql postgresql-contrib postgis postgresql-10-postgis-2.4 postgresql-10-postgis-scripts
echo_heading "Installing osm2pgsql dependencies..."
apt -y install 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
echo_heading "Installing Mapnik dependencies..."
apt -y install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev \
libproj-dev gdal-bin libmapnik-dev mapnik-utils python-mapnik
echo_heading "Installing OpenStreetMap Carto dependencies..."
apt -y install npm nodejs
echo_heading "Installing Carto international fonts dependencies..."
apt -y install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont
echo_heading "Initializng PostgreSQL database..."
sudo -u postgres createuser $USER_NAME
sudo -u postgres createdb -E UTF8 -O $USER_NAME gis
sudo -u postgres psql gis -c "CREATE EXTENSION postgis"
sudo -u postgres psql gis -c "CREATE EXTENSION hstore"
sudo -u postgres psql gis -c "ALTER TABLE geometry_columns OWNER TO $USER_NAME"
sudo -u postgres psql gis -c "ALTER TABLE spatial_ref_sys OWNER TO $USER_NAME"
echo_heading "Creating user $USER_NAME if doesn't exist..."
id -u $USER_NAME &>/dev/null || useradd -m $USER_NAME
id -u $USER_NAME &>/dev/null || passwd $USER_NAME
mkdir $BASE_DIR/src
cd $BASE_DIR/src
echo_heading "Installing osm2pgsql (allows Postgres to store OSM data)..."
tar xzvf $SCRIPT_DIR/osm2pgsql.tar.gz -C $BASE_DIR/src
cd osm2pgsql/
mkdir build && cd build
cmake ..
make
sudo make install
echo_heading "Installing mod_tile (tile caching)..."
cd $BASE_DIR/src
tar xzvf $SCRIPT_DIR/mod_tile.tar.gz -C $BASE_DIR/src
cd mod_tile/
./autogen.sh
./configure
make
make install
make install-mod_tile
ldconfig
echo_heading "Setting up OpenStreetMap Carto (stylesheet for map)..."
mkdir $BASE_DIR/src/openstreetmap-carto
tar xzvf $SCRIPT_DIR/openstreetmap-carto.tar.gz -C $BASE_DIR/src/openstreetmap-carto
cd $BASE_DIR/src/openstreetmap-carto
npm install -g carto
echo_heading "Converting carto project into a format readable by Mapnik..."
carto project.mml > mapnik.xml
echo_heading "Loading map data..."
mkdir $BASE_DIR/data
cd $SCRIPT_DIR
tar xzvf $SCRIPT_DIR/map_data.tar.gz
cp $SCRIPT_DIR/map_data/* $BASE_DIR/data
sudo -u postgres osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script \
$BASE_DIR/src/openstreetmap-carto/openstreetmap-carto.lua -C 2500 --number-processes 1 \
-S $BASE_DIR/src/openstreetmap-carto/openstreetmap-carto.style $BASE_DIR/data/azerbaijan-latest.osm.pbf
tar xzvf $SCRIPT_DIR/shapefile_data.tar.gz
mkdir $BASE_DIR/src/openstreetmap-carto/data
cp $SCRIPT_DIR/shapefile_data/* $BASE_DIR/src/openstreetmap-carto/data
unzip $BASE_DIR/src/openstreetmap-carto/data/\*.zip -d $BASE_DIR/src/openstreetmap-carto/data/
echo_heading "Updating ownership of new Postgres GIS tables..."
sudo -u postgres psql gis -c "ALTER TABLE planet_osm_line OWNER TO $USER_NAME"
sudo -u postgres psql gis -c "ALTER TABLE planet_osm_nodes OWNER TO $USER_NAME"
sudo -u postgres psql gis -c "ALTER TABLE planet_osm_point OWNER TO $USER_NAME"
sudo -u postgres psql gis -c "ALTER TABLE planet_osm_polygon OWNER TO $USER_NAME"
sudo -u postgres psql gis -c "ALTER TABLE planet_osm_rels OWNER TO $USER_NAME"
sudo -u postgres psql gis -c "ALTER TABLE planet_osm_roads OWNER TO $USER_NAME"
sudo -u postgres psql gis -c "ALTER TABLE planet_osm_ways OWNER TO $USER_NAME"
echo_heading "Configuring web server..."
mkdir /var/lib/mod_tile
chown $USER_NAME /var/lib/mod_tile
mkdir /var/run/renderd
chown $USER_NAME /var/run/renderd
echo "LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so" >> /etc/apache2/conf-available/mod_tile.conf
a2enconf mod_tile
cp $SCRIPT_DIR/000-default.conf /etc/apache2/sites-available/000-default.conf
service apache2 reload
service apache2 reload # intentional
echo_heading "Configuring renderd service..."
cp /home/$USER_NAME/src/mod_tile/debian/renderd.init /etc/init.d/renderd
chmod u+x /etc/init.d/renderd
cp /home/$USER_NAME/src/mod_tile/debian/renderd.service /lib/systemd/system
/etc/init.d/renderd start
systemctl enable renderd
echo_heading "Script complete!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment