X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/f9517e91433a9f33a01f75efe3629330196f21f5..edb1eec46d0fd222f9b30e0e3d62e906c1c9059e:/vagrant/Install-on-Ubuntu-20.sh?ds=sidebyside diff --git a/vagrant/Install-on-Ubuntu-20.sh b/vagrant/Install-on-Ubuntu-20.sh index 292947d1..57361ec7 100755 --- a/vagrant/Install-on-Ubuntu-20.sh +++ b/vagrant/Install-on-Ubuntu-20.sh @@ -1,8 +1,7 @@ -#!/bin/bash +#!/bin/bash -e # # hacks for broken vagrant box #DOCS: sudo rm -f /var/lib/dpkg/lock #DOCS: -sudo update-locale LANG=en_US.UTF-8 #DOCS: export APT_LISTCHANGES_FRONTEND=none #DOCS: export DEBIAN_FRONTEND=noninteractive #DOCS: @@ -14,27 +13,27 @@ export DEBIAN_FRONTEND=noninteractive #DOCS: # # These instructions expect that you have a freshly installed Ubuntu 20.04. # -# Make sure all packages are are up-to-date by running: +# Make sure all packages are up-to-date by running: # -#DOCS: :::sh - sudo apt-get \ #DOCS: - -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" \ #DOCS: - --allow-downgrades --allow-remove-essential --allow-change-held-packages \ #DOCS: - -fuy install grub-pc #DOCS: - sudo apt update -qq + sudo apt-get update -qq # Now you can install all packages needed for Nominatim: - sudo apt install -y php-cgi - sudo apt install -y build-essential cmake g++ libboost-dev libboost-system-dev \ + sudo apt-get install -y build-essential cmake g++ libboost-dev libboost-system-dev \ libboost-filesystem-dev libexpat1-dev zlib1g-dev \ - libbz2-dev libpq-dev libproj-dev \ - postgresql-server-dev-12 postgresql-12-postgis-3 \ + libbz2-dev libpq-dev liblua5.3-dev lua5.3 lua-dkjson \ + nlohmann-json3-dev postgresql-12-postgis-3 \ postgresql-contrib-12 postgresql-12-postgis-3-scripts \ - php php-pgsql php-intl libicu-dev python3-dotenv \ - python3-psycopg2 python3-psutil python3-jinja2 python3-icu git \ - python3-argparse-manpage + libicu-dev python3-dotenv \ + python3-psycopg2 python3-psutil python3-jinja2 python3-pip \ + python3-icu python3-datrie python3-yaml git + +# Some of the Python packages that come with Ubuntu 20.04 are too old, so +# install the latest version from pip: + + pip3 install --user sqlalchemy asyncpg + # # System Configuration @@ -56,11 +55,18 @@ export DEBIAN_FRONTEND=noninteractive #DOCS: # # You may find a more suitable location if you wish. # +# The following instructions assume you are logged in as this user. +# You can also switch to the user with: +# +# sudo -u nominatim bash +# # To be able to copy and paste instructions from this manual, export # user name and home directory now like this: # +if [ "x$USERNAME" == "x" ]; then #DOCS: export USERNAME=vagrant #DOCS: export USERNAME=nominatim export USERHOME=/home/vagrant #DOCS: export USERHOME=/srv/nominatim +fi #DOCS: # # **Never, ever run the installation as a root user.** You have been warned. # @@ -72,14 +78,17 @@ export DEBIAN_FRONTEND=noninteractive #DOCS: # --------------------- # # Tune the postgresql configuration, which is located in -# `/etc/postgresql/12/main/postgresql.conf`. See section *Postgres Tuning* in -# [the installation page](../admin/Installation.md#postgresql-tuning) +# `/etc/postgresql/12/main/postgresql.conf`. See section *Tuning the PostgreSQL database* +# in [the installation page](../admin/Installation.md#tuning-the-postgresql-database) # for the parameters to change. # # Restart the postgresql service after updating this config file. +if [ "x$NOSYSTEMD" == "xyes" ]; then #DOCS: + sudo pg_ctlcluster 12 main start #DOCS: +else #DOCS: sudo systemctl restart postgresql - +fi #DOCS: # # Finally, we need to add two postgres users: one for the user that does # the import and another for the webserver which should access the database @@ -100,7 +109,7 @@ export DEBIAN_FRONTEND=noninteractive #DOCS: # if [ "x$1" == "xyes" ]; then #DOCS: :::sh cd $USERHOME - git clone --recursive git://github.com/openstreetmap/Nominatim.git + git clone --recursive https://github.com/openstreetmap/Nominatim.git cd Nominatim else #DOCS: cd $USERHOME/Nominatim #DOCS: @@ -110,7 +119,7 @@ fi #DOCS: # download the country grid: if [ ! -f data/country_osm_grid.sql.gz ]; then #DOCS: :::sh - wget -O data/country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz + wget -O data/country_osm_grid.sql.gz https://nominatim.org/data/country_grid.sql.gz fi #DOCS: # The code must be built in a separate directory. Create this directory, @@ -124,43 +133,107 @@ fi #DOCS: # Nominatim is now ready to use. You can continue with # [importing a database from OSM data](../admin/Import.md). If you want to set up -# a webserver first, continue reading. +# the API frontend first, continue reading. +# +# Setting up the Python frontend +# ============================== # +# Some of the Python packages in Ubuntu are too old. Therefore run the +# frontend from a Python virtualenv with current packages. +# +# To set up the virtualenv, run: + +#DOCS:```sh +sudo apt-get install -y virtualenv +virtualenv $USERHOME/nominatim-venv +$USERHOME/nominatim-venv/bin/pip install SQLAlchemy PyICU psycopg[binary] \ + psycopg2-binary python-dotenv PyYAML falcon uvicorn gunicorn +#DOCS:``` + +# Next you need to create a systemd job that runs Nominatim on gunicorn. +# First create a systemd job that manages the socket file: + +#DOCS:```sh +sudo tee /etc/systemd/system/nominatim.socket << EOFSOCKETSYSTEMD +[Unit] +Description=Gunicorn socket for Nominatim + +[Socket] +ListenStream=/run/nominatim.sock +SocketUser=www-data + +[Install] +WantedBy=multi-user.target +EOFSOCKETSYSTEMD +#DOCS:``` + +# Then create the service for Nominatim itself. + +#DOCS:```sh +sudo tee /etc/systemd/system/nominatim.service << EOFNOMINATIMSYSTEMD +[Unit] +Description=Nominatim running as a gunicorn application +After=network.target +Requires=nominatim.socket + +[Service] +Type=simple +Environment="PYTHONPATH=/usr/local/lib/nominatim/lib-python/" +User=www-data +Group=www-data +WorkingDirectory=$USERHOME/nominatim-project +ExecStart=$USERHOME/nominatim-venv/bin/gunicorn -b unix:/run/nominatim.sock -w 4 -k uvicorn.workers.UvicornWorker nominatim.server.falcon.server:run_wsgi +ExecReload=/bin/kill -s HUP \$MAINPID +StandardOutput=append:/var/log/gunicorn-nominatim.log +StandardError=inherit +PrivateTmp=true +TimeoutStopSec=5 +KillMode=mixed + +[Install] +WantedBy=multi-user.target +EOFNOMINATIMSYSTEMD +#DOCS:``` + +# Activate the services: + +if [ "x$NOSYSTEMD" != "xyes" ]; then #DOCS: + sudo systemctl daemon-reload + sudo systemctl enable nominatim.socket + sudo systemctl start nominatim.socket + sudo systemctl enable nominatim.service +fi #DOCS: + + # Setting up a webserver # ====================== # -# The webserver should serve the php scripts from the website directory of your -# [project directory](../admin/import.md#creating-the-project-directory). -# Therefore set up a project directory and populate the website directory: +# The webserver is only needed as a proxy between the public interface +# and the gunicorn service. +# +# The frontend will need configuration information from the project +# directory, which will be populated later +# [during the import process](../admin/Import.md#creating-the-project-directory) +# Already create the project directory itself now: + mkdir $USERHOME/nominatim-project - cd $USERHOME/nominatim-project - nominatim refresh --website -# + # Option 1: Using Apache # ---------------------- # if [ "x$2" == "xinstall-apache" ]; then #DOCS: -# -# Apache has a PHP module that can be used to serve Nominatim. To install them -# run: +# First install apache itself and enable the proxy module: - sudo apt install -y apache2 libapache2-mod-php + sudo apt-get install -y apache2 + sudo a2enmod proxy_http -# You need to create an alias to the website directory in your apache -# configuration. Add a separate nominatim configuration to your webserver: +# To set up proxying for Apache add the following configuration: #DOCS:```sh sudo tee /etc/apache2/conf-available/nominatim.conf << EOFAPACHECONF - - Options FollowSymLinks MultiViews - AddType text/html .php - DirectoryIndex search.php - Require all granted - - -Alias /nominatim $USERHOME/nominatim-project/website +ProxyPass /nominatim "unix:/run/nominatim.sock|http://localhost/" EOFAPACHECONF #DOCS:``` @@ -169,7 +242,11 @@ EOFAPACHECONF # sudo a2enconf nominatim +if [ "x$NOSYSTEMD" == "xyes" ]; then #DOCS: + sudo apache2ctl start #DOCS: +else #DOCS: sudo systemctl restart apache2 +fi #DOCS: # The Nominatim API is now available at `http://localhost/nominatim/`. @@ -181,33 +258,9 @@ fi #DOCS: # if [ "x$2" == "xinstall-nginx" ]; then #DOCS: -# Nginx has no native support for php scripts. You need to set up php-fpm for -# this purpose. First install nginx and php-fpm: - - sudo apt install -y nginx php-fpm - -# You need to configure php-fpm to listen on a Unix socket. +# First install nginx itself: -#DOCS:```sh -sudo tee /etc/php/7.4/fpm/pool.d/www.conf << EOF_PHP_FPM_CONF -[www] -; Replace the tcp listener and add the unix socket -listen = /var/run/php7.4-fpm.sock - -; Ensure that the daemon runs as the correct user -listen.owner = www-data -listen.group = www-data -listen.mode = 0666 - -; Unix user of FPM processes -user = www-data -group = www-data - -; Choose process manager type (static, dynamic, ondemand) -pm = ondemand -pm.max_children = 5 -EOF_PHP_FPM_CONF -#DOCS:``` + sudo apt-get install -y nginx # Then create a Nginx configuration to forward http requests to that socket. @@ -218,38 +271,27 @@ server { listen [::]:80 default_server; root $USERHOME/nominatim-project/website; - index search.php index.html; - location / { - try_files \$uri \$uri/ @php; - } - - location @php { - fastcgi_param SCRIPT_FILENAME "\$document_root\$uri.php"; - fastcgi_param PATH_TRANSLATED "\$document_root\$uri.php"; - fastcgi_param QUERY_STRING \$args; - fastcgi_pass unix:/var/run/php7.4-fpm.sock; - fastcgi_index index.php; - include fastcgi_params; - } - - location ~ [^/]\.php(/|$) { - fastcgi_split_path_info ^(.+?\.php)(/.*)$; - if (!-f \$document_root\$fastcgi_script_name) { - return 404; - } - fastcgi_pass unix:/var/run/php7.4-fpm.sock; - fastcgi_index search.php; - include fastcgi.conf; + index /search; + + location /nominatim/ { + proxy_set_header Host \$http_host; + proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto \$scheme; + proxy_redirect off; + proxy_pass http://unix:/run/nominatim.sock:/; } } EOF_NGINX_CONF #DOCS:``` -# # Enable the configuration and restart Nginx # - sudo systemctl restart php7.4-fpm nginx +if [ "x$NOSYSTEMD" == "xyes" ]; then #DOCS: + sudo /usr/sbin/nginx & #DOCS: +else #DOCS: + sudo systemctl restart nginx +fi #DOCS: # The Nominatim API is now available at `http://localhost/`.