+ postgresql_user "nominatim" do
+ cluster node[:nominatim][:dbcluster]
+ superuser true
+ only_if { node[:nominatim][:state] != "slave" }
+ end
+
+ postgresql_user "www-data" do
+ cluster node[:nominatim][:dbcluster]
+ only_if { node[:nominatim][:state] != "slave" }
+ end
+
+ directory "#{basedir}/tablespaces" do
+ owner "postgres"
+ group "postgres"
+ mode "700"
+ end
+
+ # NOTE: tablespaces must be exactly in the same location on each
+ # Nominatim instance when replication is in use. Therefore
+ # use symlinks to canonical directory locations.
+ node[:nominatim][:tablespaces].each do |name, location|
+ directory location do
+ owner "postgres"
+ group "postgres"
+ mode "700"
+ recursive true
+ end
+
+ link "#{basedir}/tablespaces/#{name}" do
+ to location
+ end
+
+ postgresql_tablespace name do
+ cluster node[:nominatim][:dbcluster]
+ location "#{basedir}/tablespaces/#{name}"
+ end
+ end
+
+ ## Nominatim backend
+
+ include_recipe "git"
+ include_recipe "python"
+
+ python_directory = "#{basedir}/venv"
+
+ package %w[
+ build-essential
+ cmake
+ g++
+ libboost-dev
+ libboost-system-dev
+ libboost-filesystem-dev
+ libexpat1-dev
+ zlib1g-dev
+ libbz2-dev
+ libpq-dev
+ libproj-dev
+ liblua5.3-dev
+ libluajit-5.1-dev
+ libicu-dev
+ nlohmann-json3-dev
+ lua5.3
+ python3-pyosmium
+ python3-psycopg2
+ python3-dotenv
+ python3-psutil
+ python3-jinja2
+ python3-icu
+ python3-datrie
+ python3-yaml
+ python3-sqlalchemy-ext
+ python3-geoalchemy2
+ python3-asyncpg
+ python3-dev
+ pkg-config
+ ruby
+ ruby-file-tail
+ ruby-pg
+ ruby-webrick
+ ]
+
+ if node[:nominatim][:api_flavour] == "php"
+ package %w[
+ php-pgsql
+ php-intl
+ ]
+ elsif node[:nominatim][:api_flavour] == "python"
+
+ python_virtualenv python_directory do
+ interpreter "/usr/bin/python3"
+ end
+
+ python_package "SQLAlchemy" do
+ python_virtualenv python_directory
+ version "2.0.32"
+ end
+
+ python_package "PyICU" do
+ python_virtualenv python_directory
+ version "2.13.1"
+ end
+
+ python_package "psycopg[binary]" do
+ python_virtualenv python_directory
+ version "3.2.1"
+ end
+
+ python_package "psycopg2-binary" do
+ python_virtualenv python_directory
+ version "2.9.9"
+ end
+
+ python_package "python-dotenv" do
+ python_virtualenv python_directory
+ version "1.0.1"
+ end
+
+ python_package "pygments" do
+ python_virtualenv python_directory
+ version "2.18.0"
+ end
+
+ python_package "PyYAML" do
+ python_virtualenv python_directory
+ version "6.0.2"
+ end
+
+ python_package "falcon" do
+ python_virtualenv python_directory
+ version "3.1.3"
+ end
+
+ python_package "uvicorn" do
+ python_virtualenv python_directory
+ version "0.30.5"
+ end
+
+ python_package "gunicorn" do
+ python_virtualenv python_directory
+ version "22.0.0"
+ end
+
+ python_package "jinja2" do
+ python_virtualenv python_directory
+ version "3.1.4"
+ end
+
+ python_package "datrie" do
+ python_virtualenv python_directory
+ version "0.8.2"
+ end
+
+ python_package "psutil" do
+ python_virtualenv python_directory
+ version "6.0.0"
+ end
+
+ python_package "osmium" do
+ python_virtualenv python_directory
+ version "3.7.0"
+ end
+ end
+
+ source_directory = "#{basedir}/src/nominatim"
+ build_directory = "#{basedir}/src/build"
+ project_directory = "#{basedir}/planet-project"
+ bin_directory = "#{basedir}/bin"
+ cfg_directory = "#{basedir}/etc"
+ ui_directory = "#{basedir}/ui"
+ qa_bin_directory = "#{basedir}/src/Nominatim-Data-Analyser"
+ qa_data_directory = "#{basedir}/qa-data"
+
+ [basedir, "#{basedir}/src", cfg_directory, bin_directory, build_directory, project_directory].each do |path|
+ directory path do
+ owner "nominatim"
+ group "nominatim"
+ mode "755"
+ recursive true
+ end
+ end
+
+ directory "#{bin_directory}/maintenance" do
+ owner "nominatim"
+ group "nominatim"
+ mode "775"
+ end
+
+ if node[:nominatim][:flatnode_file]
+ directory File.dirname(node[:nominatim][:flatnode_file]) do
+ recursive true
+ end
+ end
+
+ remote_directory "#{project_directory}/static-website" do
+ source "website"
+ owner "nominatim"
+ group "nominatim"
+ mode "755"
+ files_owner "nominatim"
+ files_group "nominatim"
+ files_mode "644"
+ purge false
+ end
+
+ # Normally syncing via chef is a bad idea because syncing might involve
+ # an update of database functions which should not be done while an update
+ # is ongoing. Therefore we sync in between update cycles. There is an
+ # exception for slaves: they get DB function updates from the master, so
+ # only the source code needs to be updated, which chef may do.
+ git source_directory do
+ action node[:nominatim][:state] == "slave" ? :sync : :checkout
+ repository node[:nominatim][:repository]
+ revision node[:nominatim][:revision]