Creating script which migrates map database to new database for custom niceness.

This commit is contained in:
Roland 2025-01-01 10:59:28 -07:00
parent 28fbc8f197
commit 7324e83626
No known key found for this signature in database
GPG key ID: 1BA620CE6C9A4680
15 changed files with 126 additions and 57 deletions

View file

@ -0,0 +1,3 @@
[Service]
# WROLPi's map uses a lot of processing power. Change niceness of map database to prevent blocking of other services.
Nice=19

View file

@ -6,7 +6,7 @@ After=network.target auditd.service
[Service]
# Delay startup so WROLPi App and API have time to start.
ExecStartPre=/bin/sleep 30
# Map is intense, but not a high priority.
# Map is uses a lot of resources, but not a high priority.
Nice=19
ExecStart=/usr/bin/renderd -f
User=_renderd

View file

@ -1,3 +1,3 @@
[Unit]
Description=WROLPi services group
Wants=wrolpi-api.service wrolpi-app.service nginx.service postgresql.service wrolpi-kiwix.service renderd.service apache2.service
Wants=wrolpi-api.service wrolpi-app.service nginx.service postgresql.service wrolpi-kiwix.service renderd.service apache2.service postgresql@15-map.service

10
help.sh
View file

@ -200,10 +200,16 @@ fi
echo
# Map
if sudo -i -u wrolpi psql -l 2>/dev/null | grep gis >/dev/null; then
if netstat -ant | grep LISTEN | grep 127.0.0.1:5433 >/dev/null; then
echo "OK: Port 5433 is occupied"
else
echo "FAILED: Port 5433 is not occupied"
fi
if sudo -iu postgres psql --port=5433 -l 2>/dev/null | grep gis >/dev/null; then
echo "OK: Found map database"
if sudo -i -u wrolpi psql gis -c '\d' | grep water_polygons >/dev/null; then
if sudo -iu postgres psql --port=5433 gis -c '\d' | grep water_polygons >/dev/null; then
echo "OK: Map database is initialized"
else
echo "FAILED: Map database is not initialized"

View file

@ -28,7 +28,7 @@ systemctl stop apache2 || :
# Create the WROLPi user
grep wrolpi: /etc/passwd || useradd -md /home/wrolpi wrolpi -s "$(command -v bash)"
[ -f /home/wrolpi/.pgpass ] || cat >/home/wrolpi/.pgpass <<'EOF'
127.0.0.1:5432:gis:_renderd:wrolpi
127.0.0.1:5433:gis:_renderd:wrolpi
127.0.0.1:5432:wrolpi:wrolpi:wrolpi
EOF
chmod 0600 /home/wrolpi/.pgpass
@ -66,6 +66,8 @@ systemctl enable wrolpi-app.service
systemctl enable wrolpi-kiwix.service
systemctl enable wrolpi-help.service
# Copy config files necessary for map.
cp -r /opt/wrolpi/etc/raspberrypios/postgresql@15-map.service.d /etc/systemd/system/
cp /opt/wrolpi/etc/raspberrypios/renderd.conf /etc/renderd.conf
cp /opt/wrolpi/etc/raspberrypios/renderd.service /lib/systemd/system/renderd.service
# Configure Apache2 to listen on 8084.
@ -91,7 +93,7 @@ visudo -c -f /etc/sudoers.d/90-wrolpi
# Configure Postgresql. Do this after the API is stopped.
/opt/wrolpi/scripts/initialize_api_db.sh
# wrolpi user is superuser so they can import maps.
sudo -u postgres psql -c "alter user wrolpi with superuser"
sudo -iu postgres psql -c "alter user wrolpi with superuser"
# Configure renderd.
if [ ! -d /opt/openstreetmap-carto ]; then
@ -110,7 +112,9 @@ cp /opt/wrolpi/etc/raspberrypios/mod_tile.conf /etc/apache2/conf-available/mod_t
carto -v
# Initialize the map if it has not been initialized.
sudo -u postgres psql -c '\l' | grep gis || /opt/wrolpi/scripts/initialize_map_db.sh
systemctl enable postgresql@15-map.service || :
systemctl start postgresql@15-map.service || :
sudo -iu postgres psql -c '\l' --port=5433 | grep -q gis || yes | /opt/wrolpi/scripts/initialize_map_db.sh
cp /opt/wrolpi/etc/raspberrypios/renderd.conf /etc/renderd.conf
# Configure Apache2 to listen on 8084.
@ -120,12 +124,6 @@ if [[ ${rpi} == true ]]; then
else
cp /opt/wrolpi/etc/debian12/000-default.conf /etc/apache2/sites-available/000-default.conf
fi
# Copy Leaflet files to Apache's directory so they can be used offline.
cp /opt/wrolpi/etc/raspberrypios/index.html \
/opt/wrolpi/modules/map/leaflet.js \
/opt/wrolpi/modules/map/leaflet.css /var/www/html/
chmod 644 /var/www/html/*
systemctl enable renderd
# Create the media directory. This should be mounted by the maintainer.
[ -d /media/wrolpi ] || mkdir /media/wrolpi

View file

@ -20,7 +20,7 @@ fi
set -x
HAS_ICE_SHEET=false
sudo -u postgres psql gis -c '\d' | grep icesheet_polygons && HAS_ICE_SHEET=true
sudo -iu postgres psql --port=5433 gis -c '\d' | grep icesheet_polygons && HAS_ICE_SHEET=true
if [ ${HAS_ICE_SHEET} = false ]; then
echo "WROLPi: Missing icesheet_polygons. Run reset_map.sh"
exit 4
@ -69,36 +69,36 @@ if [[ ${1} == *.osm.pbf ]]; then
fi
# Import as postgres user, then change ownership to _renderd.
nice -n 18 sudo -u postgres osm2pgsql -d gis --create --slim -G --hstore \
nice -n 18 sudo -iu postgres osm2pgsql -d gis --create --slim -G --hstore --port=5433 \
--tag-transform-script /opt/openstreetmap-carto/openstreetmap-carto.lua \
-C ${MAX_CACHE} \
--number-processes 3 \
-S /opt/openstreetmap-carto/openstreetmap-carto.style \
"${pbf_path}"
# Assign all data to _renderd so the map can be rendered.
sudo -u postgres psql -d gis -c 'ALTER TABLE external_data OWNER TO _renderd'
sudo -u postgres psql -d gis -c 'ALTER TABLE geography_columns OWNER TO _renderd'
sudo -u postgres psql -d gis -c 'ALTER TABLE geometry_columns OWNER TO _renderd'
sudo -u postgres psql -d gis -c "ALTER TABLE icesheet_outlines OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE icesheet_polygons OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE ne_100m_admin_0_boundary_lines_land OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE planet_osm_line OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE planet_osm_nodes OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE planet_osm_point OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE planet_osm_polygon OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE planet_osm_rels OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE planet_osm_roads OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE planet_osm_ways OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE simplified_water_polygons OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE spatial_ref_sys OWNER TO _renderd"
sudo -u postgres psql -d gis -c "ALTER TABLE water_polygons OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c 'ALTER TABLE external_data OWNER TO _renderd'
sudo -iu postgres psql --port=5433 -d gis -c 'ALTER TABLE geography_columns OWNER TO _renderd'
sudo -iu postgres psql --port=5433 -d gis -c 'ALTER TABLE geometry_columns OWNER TO _renderd'
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE icesheet_outlines OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE icesheet_polygons OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE ne_100m_admin_0_boundary_lines_land OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE planet_osm_line OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE planet_osm_nodes OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE planet_osm_point OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE planet_osm_polygon OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE planet_osm_rels OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE planet_osm_roads OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE planet_osm_ways OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE simplified_water_polygons OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE spatial_ref_sys OWNER TO _renderd"
sudo -iu postgres psql --port=5433 -d gis -c "ALTER TABLE water_polygons OWNER TO _renderd"
elif [[ ${1} == *.dump ]]; then
if [ ! -f "${1}" ]; then
echo "WROLPi: File does not exist! ${1}"
exit 7
fi
# Import a Postgresql dump.
nice -n 18 pg_restore -j3 --no-owner -d gis -U _renderd -h 127.0.0.1 "${1}"
nice -n 18 pg_restore --port=5433 -j3 --no-owner -d gis -U _renderd -h 127.0.0.1 "${1}"
else
echo "WROLPi: Cannot import unknown file"
exit 8

View file

@ -11,11 +11,11 @@ fi
set -x
# Create WROLPi API database.
sudo -u postgres psql -c '\l' | grep wrolpi || (
sudo -u postgres createuser -s wrolpi # superuser so maps can be imported
sudo -u postgres psql -c "alter user postgres password 'wrolpi'"
sudo -u postgres psql -c "alter user wrolpi password 'wrolpi'"
sudo -u postgres createdb -E UTF8 -O wrolpi wrolpi
sudo -iu postgres psql -c '\l' | grep wrolpi || (
sudo -iu postgres createuser -s wrolpi # superuser so maps can be imported
sudo -iu postgres psql -c "alter user postgres password 'wrolpi'"
sudo -iu postgres psql -c "alter user wrolpi password 'wrolpi'"
sudo -iu postgres createdb -E UTF8 -O wrolpi wrolpi
echo "Created wrolpi database"
)
sudo -u wrolpi /bin/bash -c 'cd /opt/wrolpi && /opt/wrolpi/venv/bin/python3 main.py db upgrade'
sudo -iu wrolpi /bin/bash -c 'cd /opt/wrolpi && /opt/wrolpi/venv/bin/python3 main.py db upgrade'

View file

@ -4,7 +4,7 @@
source /opt/wrolpi/wrolpi/scripts/lib.sh
sudo -u postgres psql -c '\l' 2>/dev/null | grep gis >/dev/null && (
sudo -iu postgres psql -c '\l' 2>/dev/null | grep gis >/dev/null && (
yes_or_no "Are you sure you want to initialize the map database? Data from imported maps will be lost." || exit 0
)
@ -12,20 +12,23 @@ set -x
systemctl stop renderd
# Create map database if it does not exist.
pg_createcluster 15 map --port=5433 --start
# Create gis (map) database.
sudo -u postgres psql -c '\l' | grep gis || (
sudo -u postgres createuser _renderd
sudo -u postgres psql -c "alter user _renderd password 'wrolpi'"
sudo -u postgres createdb -E UTF8 -O _renderd gis
sudo -u postgres psql -d gis -c "CREATE EXTENSION postgis"
sudo -u postgres psql -d gis -c "CREATE EXTENSION hstore"
sudo -iu postgres psql -c '\l' --port=5433 | grep gis || (
sudo -iu postgres createuser --port=5433 _renderd
sudo -iu postgres psql --port=5433 -c "alter user _renderd password 'wrolpi'"
sudo -iu postgres createdb --port=5433 -E UTF8 -O _renderd gis
sudo -iu postgres psql -d gis --port=5433 -c 'CREATE EXTENSION postgis'
sudo -iu postgres psql -d gis --port=5433 -c 'CREATE EXTENSION hstore'
echo "Created gis database"
)
# Restore initial dump.
zcat /opt/wrolpi-blobs/gis-map.dump.gz | sudo -u postgres pg_restore --no-owner --role=_renderd -d gis
sudo -u postgres psql -d gis -c 'ALTER TABLE geography_columns OWNER TO _renderd'
sudo -u postgres psql -d gis -c 'ALTER TABLE geometry_columns OWNER TO _renderd'
sudo -u postgres psql -d gis -c "ALTER TABLE spatial_ref_sys OWNER TO _renderd"
zcat /opt/wrolpi-blobs/gis-map.dump.gz | sudo -iu postgres pg_restore --port=5433 --no-owner --role=_renderd -d gis
sudo -iu postgres psql --port=5433 -d gis -c 'ALTER TABLE geography_columns OWNER TO _renderd'
sudo -iu postgres psql --port=5433 -d gis -c 'ALTER TABLE geometry_columns OWNER TO _renderd'
sudo -iu postgres psql --port=5433 -d gis -c 'ALTER TABLE spatial_ref_sys OWNER TO _renderd'
# Clear map tile cache files.
yes | /bin/bash /opt/wrolpi/scripts/clear_map_cache.sh

View file

@ -17,7 +17,7 @@ set -x
systemctl stop wrolpi-api
# Delete the WROLPi API DB, if it exists.
sudo -u postgres dropdb wrolpi
sudo -u postgres dropuser wrolpi
sudo -iu postgres dropdb wrolpi
sudo -iu postgres dropuser wrolpi
/bin/bash /opt/wrolpi/scripts/initialize_api_db.sh

View file

@ -11,7 +11,7 @@ fi
# Change directory to avoid "sudo" home directory warning.
cd /tmp
if sudo -u postgres psql -l 2>/dev/null | grep gis >/dev/null; then
if sudo -iu postgres psql -l 2>/dev/null | grep gis >/dev/null; then
yes_or_no "Are you sure you want to delete the map database and cache? This can't be undone!" || exit 0
fi
@ -27,11 +27,11 @@ set -x
systemctl stop renderd
sudo -u postgres dropdb gis || :
sudo -u postgres dropuser _renderd || :
sudo -iu postgres dropdb gis || :
sudo -iu postgres dropuser _renderd || :
# Reset "imported" status of any map files.
sudo -u postgres psql -d wrolpi -c "UPDATE map_file SET imported=false"
sudo -iu postgres psql -d wrolpi -c "UPDATE map_file SET imported=false"
yes | /opt/wrolpi/scripts/initialize_map_db.sh

View file

@ -16,5 +16,8 @@ npm install || npm install || npm install || npm install # try install multiple
# Upgrade WROLPi Help.
/opt/wrolpi/scripts/install_help_service.sh || echo "Help install failed."
# Migrate map DB if necessary. Do this before repair because it will reset map if map db is empty.
/opt/wrolpi/wrolpi/scripts/migrate_map_db.sh || echo "Map DB migration failed."
# Install any configs, restart services.
/opt/wrolpi/repair.sh

View file

@ -31,6 +31,7 @@ while getopts ":hH:" option; do
done
# Try to fetch the first tile multiple times if the service is starting, or if new map was imported.
ATTEMPTS=100
for i in {1..100}; do
# Try to fetch the first tile.
wget "${HOST}/hot/3/0/0.png" \

View file

@ -0,0 +1,55 @@
#! /usr/bin/env bash
# Moves the `gis` map from default database on 5432 to a new database on 5433.
# This script should only need to be run once. If you are having issues with your map, try
# /opt/wrolpi/scripts/reset_map.sh
# Re-execute this script if it wasn't called with sudo.
if [ $EUID != 0 ]; then
sudo "$0" "$@"
exit $?
fi
sudo -iu postgres psql -c '\l' --port=5433 2>/dev/null | grep -q gis && (
echo "Map DB already migrated."
exit 0
)
function cleanup() {
if [ -e /tmp/map.dump ]; then
rm -rf /tmp/map.dump
fi
}
trap cleanup EXIT
cleanup
systemctl stop renderd
# Create new cluster for the map.
pg_createcluster 15 map --port=5433 --start
# Create user permissions for map user.
sudo -iu postgres psql -c '\l' --port=5433 | grep gis || (
sudo -iu postgres createuser --port=5433 _renderd
sudo -iu postgres psql --port=5433 -c "alter user _renderd password 'wrolpi'"
sudo -iu postgres createdb --port=5433 -E UTF8 -O _renderd gis
sudo -iu postgres psql -d gis --port=5433 -c 'CREATE EXTENSION postgis'
sudo -iu postgres psql -d gis --port=5433 -c 'CREATE EXTENSION hstore'
)
# Override niceness of new map database.
cp -r /opt/wrolpi/etc/raspberrypios/postgresql@15-map.service.d /etc/systemd/system/
systemctl daemon-reload
systemctl restart postgresql@15-map.service
# Dump DB, then restore in different DB.
sudo -iu postgres pg_dump -Fd gis --port=5432 -j3 -f /tmp/map.dump && # 5432 is old DB.
sudo -iu postgres pg_restore --port=5433 -j3 -d gis /tmp/map.dump && # 5433 is new DB.
sudo -iu postgres dropdb --port=5432 gis
# Update openstreetmap-carto to use the new database.
grep -q 'port: 5433' /opt/openstreetmap-carto/project.mml || (
# Append port line after dbname configuration line.
sed -i '/dbname: "gis"/a \ port: 5433' /opt/openstreetmap-carto/project.mml
(cd /opt/openstreetmap-carto/ && carto project.mml >mapnik.xml)
)

View file

@ -543,7 +543,7 @@ async def test_post_vin_number_decoder(async_client):
'region': 'North America',
'serial': None,
'transmission': None,
'years': '1995'}
'years': '2025,1995'}
@pytest.mark.asyncio

View file

@ -1 +1 @@
0.15.0-beta
0.15.1-beta