3 # hacks for broken vagrant box      #DOCS:
 
   4 sudo rm -f /var/lib/dpkg/lock       #DOCS:
 
   5 export APT_LISTCHANGES_FRONTEND=none #DOCS:
 
   6 export DEBIAN_FRONTEND=noninteractive #DOCS:
 
   8 # *Note:* these installation instructions are also available in executable
 
   9 #         form for use with vagrant under vagrant/Install-on-Ubuntu-24.sh.
 
  11 # Installing the Required Software
 
  12 # ================================
 
  14 # These instructions expect that you have a freshly installed Ubuntu 24.04.
 
  16 # Make sure all packages are up-to-date by running:
 
  19     sudo apt-get update -qq
 
  21 # Now you can install all packages needed for Nominatim:
 
  23     sudo apt-get install -y osm2pgsql postgresql-postgis postgresql-postgis-scripts \
 
  24                             pkg-config libicu-dev virtualenv git
 
  28 # System Configuration
 
  29 # ====================
 
  31 # The following steps are meant to configure a fresh Ubuntu installation
 
  32 # for use with Nominatim. You may skip some of the steps if you have your
 
  33 # OS already configured.
 
  35 # Creating Dedicated User Accounts
 
  36 # --------------------------------
 
  38 # Nominatim will run as a global service on your machine. It is therefore
 
  39 # best to install it under its own separate user account. In the following
 
  40 # we assume this user is called nominatim and the installation will be in
 
  41 # /srv/nominatim. To create the user and directory run:
 
  43 #     sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim
 
  45 # You may find a more suitable location if you wish.
 
  47 # The following instructions assume you are logged in as this user.
 
  48 # You can also switch to the user with:
 
  50 #     sudo -u nominatim bash
 
  52 # To be able to copy and paste instructions from this manual, export
 
  53 # user name and home directory now like this:
 
  55 if [ "x$USERNAME" == "x" ]; then #DOCS:
 
  56     export USERNAME=vagrant        #DOCS:    export USERNAME=nominatim
 
  57     export USERHOME=/home/vagrant  #DOCS:    export USERHOME=/srv/nominatim
 
  60 # **Never, ever run the installation as a root user.** You have been warned.
 
  62 # Make sure that system servers can read from the home directory:
 
  66 # Setting up PostgreSQL
 
  67 # ---------------------
 
  69 # Tune the postgresql configuration, which is located in 
 
  70 # `/etc/postgresql/16/main/postgresql.conf`. See section *Tuning the PostgreSQL database*
 
  71 # in [the installation page](../admin/Installation.md#tuning-the-postgresql-database)
 
  72 # for the parameters to change.
 
  74 # Restart the postgresql service after updating this config file.
 
  76 if [ "x$NOSYSTEMD" == "xyes" ]; then  #DOCS:
 
  77     sudo pg_ctlcluster 16 main start  #DOCS:
 
  79     sudo systemctl restart postgresql
 
  82 # Finally, we need to add two postgres users: one for the user that does
 
  83 # the import and another for the webserver which should access the database
 
  87     sudo -u postgres createuser -s $USERNAME
 
  88     sudo -u postgres createuser www-data
 
  91 # Installing Nominatim
 
  92 # ====================
 
  94 # Building and Configuration
 
  95 # --------------------------
 
  97 # Get the source code from Github and change into the source directory
 
  99 if [ "x$1" == "xyes" ]; then  #DOCS:    :::sh
 
 101     git clone https://github.com/osm-search/Nominatim.git
 
 104     cd $USERHOME/Nominatim         #DOCS:
 
 107 # When installing the latest source from github, you also need to
 
 108 # download the country grid:
 
 110 if [ ! -f data/country_osm_grid.sql.gz ]; then       #DOCS:    :::sh
 
 111     wget -O data/country_osm_grid.sql.gz https://nominatim.org/data/country_grid.sql.gz
 
 114 # Nominatim should be installed in a separate Python virtual environment.
 
 115 # Create the virtual environment:
 
 117     virtualenv $USERHOME/nominatim-venv
 
 119 # We want the faster binary version pf psycopg, so install that:
 
 121     $USERHOME/nominatim-venv/bin/pip install psycopg[binary]
 
 123 # Now install Nominatim using pip:
 
 125     cd $USERHOME/Nominatim
 
 126     $USERHOME/nominatim-venv/bin/pip install packaging/nominatim-db
 
 128 # Nominatim is now ready to use. The nominatim binary is available at
 
 129 # `$USERHOME/venv/bin/nominatim`. If you want to have 'nominatim' in your
 
 130 # path, simply activate the virtual environment:
 
 133 # . $USERHOME/nominatim-venv/bin/activate
 
 136 # You can continue with
 
 137 # [importing a database from OSM data](../admin/Import.md). If you want to set up
 
 138 # the API frontend first, continue reading.
 
 140 # Setting up the Python frontend
 
 141 # ==============================
 
 143 # The Python frontend is contained in the nominatim-api package. To run
 
 144 # the API as a webservice, you also need falcon with uvicorn to serve the API.
 
 145 # It is generally recommended to run falcon/uvicorn on top of gunicorn.
 
 147 # To install all packages, run:
 
 150 $USERHOME/nominatim-venv/bin/pip install falcon uvicorn gunicorn
 
 151 cd $USERHOME/Nominatim
 
 152 $USERHOME/nominatim-venv/bin/pip install packaging/nominatim-api
 
 155 # Next you need to create a systemd job that runs Nominatim on gunicorn.
 
 156 # First create a systemd job that manages the socket file:
 
 159 sudo tee /etc/systemd/system/nominatim.socket << EOFSOCKETSYSTEMD
 
 161 Description=Gunicorn socket for Nominatim
 
 164 ListenStream=/run/nominatim.sock
 
 168 WantedBy=multi-user.target
 
 172 # Then create the service for Nominatim itself.
 
 175 sudo tee /etc/systemd/system/nominatim.service << EOFNOMINATIMSYSTEMD
 
 177 Description=Nominatim running as a gunicorn application
 
 179 Requires=nominatim.socket
 
 185 WorkingDirectory=$USERHOME/nominatim-project
 
 186 ExecStart=$USERHOME/nominatim-venv/bin/gunicorn -b unix:/run/nominatim.sock -w 4 -k uvicorn.workers.UvicornWorker "nominatim_api.server.falcon.server:run_wsgi()"
 
 187 ExecReload=/bin/kill -s HUP \$MAINPID
 
 193 WantedBy=multi-user.target
 
 197 # Activate the services:
 
 199 if [ "x$NOSYSTEMD" != "xyes" ]; then  #DOCS:
 
 200     sudo systemctl daemon-reload
 
 201     sudo systemctl enable nominatim.socket
 
 202     sudo systemctl start nominatim.socket
 
 203     sudo systemctl enable nominatim.service
 
 206 # Setting up a webserver
 
 207 # ======================
 
 209 # The webserver is only needed as a proxy between the public interface
 
 210 # and the gunicorn service.
 
 212 # The frontend will need configuration information from the project
 
 213 # directory, which will be populated later
 
 214 # [during the import process](../admin/Import.md#creating-the-project-directory)
 
 215 # Already create the project directory itself now:
 
 217     mkdir $USERHOME/nominatim-project
 
 220 # Option 1: Using Apache
 
 221 # ----------------------
 
 223 if [ "x$2" == "xinstall-apache" ]; then #DOCS:
 
 225 # First install apache itself and enable the proxy module:
 
 227     sudo apt-get install -y apache2
 
 228     sudo a2enmod proxy_http
 
 231 # To set up proxying for Apache add the following configuration:
 
 234 sudo tee /etc/apache2/conf-available/nominatim.conf << EOFAPACHECONF
 
 236 ProxyPass /nominatim "unix:/run/nominatim.sock|http://localhost/"
 
 241 # Then enable the configuration and restart apache
 
 245 sudo a2enconf nominatim
 
 248 if [ "x$NOSYSTEMD" == "xyes" ]; then  #DOCS:
 
 249     sudo apache2ctl start             #DOCS:
 
 251     sudo systemctl restart apache2
 
 254 # The Nominatim API is now available at `http://localhost/nominatim/`. Point your browser
 
 255 # to the status output `http://localhost/nominatim/status` to test if everything is ok.
 
 260 # Option 2: Using nginx
 
 261 # ---------------------
 
 263 if [ "x$2" == "xinstall-nginx" ]; then #DOCS:
 
 265 # First install nginx itself:
 
 267     sudo apt-get install -y nginx
 
 270 # Then create a Nginx configuration to forward http requests to that socket.
 
 273 sudo tee /etc/nginx/sites-available/default << EOF_NGINX_CONF
 
 275     listen 80 default_server;
 
 276     listen [::]:80 default_server;
 
 278     root $USERHOME/nominatim-project/website;
 
 281     location /nominatim/ {
 
 282             proxy_set_header Host \$http_host;
 
 283             proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
 
 284             proxy_set_header X-Forwarded-Proto \$scheme;
 
 286             proxy_pass http://unix:/run/nominatim.sock:/;
 
 292 # Enable the configuration and restart Nginx
 
 295 if [ "x$NOSYSTEMD" == "xyes" ]; then  #DOCS:
 
 296     sudo /usr/sbin/nginx &            #DOCS:
 
 298     sudo systemctl restart nginx
 
 301 # The Nominatim API is now available at `http://localhost/nominatim/`. Point your browser
 
 302 # to the status output `http://localhost/nominatim/status` to test if everything is ok.