Last active
November 29, 2019 22:06
-
-
Save gyfoster/39a0201731ac438d133e140118c5eab6 to your computer and use it in GitHub Desktop.
A script for setting up an OSM tile server from scratch
This file contains hidden or 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
#!/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