Testé avec :
- Debian 12 - Docker version 27.0.3, build 7d4bcd8 - rootless install - voir Run the Docker daemon as a non-root user (Rootless mode)
- Ubuntu 22.04 - Docker version 27.0.3, build 7d4bcd8 - as a non-root user - voir Manage Docker as a non-root user
Le reste de la doc d'install est réalisée avec un utilisateur debian
non sudoer (sauf la mise en place de la tâche cron).
- S'assurer d'être propriétaire des fichiers Se placer à la racine du projet et exécuter la commande suivante
sudo chown -R $UID:$GID .
- Synchroniser les sources:
Le script
deployment/scripts/deploy-sources-to-server.sh
permet de prévisualiser puis d'effectuer la synchronisation des sources. Il prend en argument le host du serveur ainsi que le répertoire de destination
deployment/scripts/deploy-sources-to-server.sh user@target-server-host:/path/to/dest
Le reste de la procédure d'installation a lieu sur le serveur distant.
- Créer le réseau docker
magosm
docker network create magosm
Se placer à la racine du projet sur le serveur cible.
Les fichiers suivants contiennent entre autre la configuration par défaut de la base de données:
env/default.env
: contient les variables d'environnement nécessaires au build des images et à l'exécution des containers, notamment celui de la db. Il est situé en dehors de la racine pour éviter un parasitage entre fichiers.env
.db/conf/postgres_settings_default.sh
: contient un script qui met à jour la configuration postgres
- créer les fichiers de configuration à partir des fichiers par défaut:
cp ./env/default.env ./deployment/.env
cp db/conf/postgres_settings_default.sh db/conf/postgres_settings.sh
- Modifier les fichiers
./deployment/.env
etdb/conf/postgres_settings.sh
créés précédemment afin qu'ils contiennent la configuration voulue pour le projet⚠️ Portez une attention particulière aux variables suivantes :
# `postgres` PostgreSQL user password
DBPG_USER_POSTGRES_PWD
# `magosm` PostgreSQL user password
DBPG_USER_MAGOSM_PWD
#UID / GID inside the container
GEOSERVER_UID=
GEOSERVER_GID=
# uncomment next line if you want to use --flat-nodes (only for huge extracts like planet or europe)
OSM2PGSQL_OPTS="$OSM2PGSQL_OPTS --flat-nodes $DOCKER_VOLUMES_BASE_DIR/$OSM2PGSQL_FLATNODE_DIR/nodes.cache"
- exécuter le script suivant et suivre les instructions jusqu'à ce qu'il n'affiche plus d'erreurs :
db/scripts/check_requirements.sh
- construire l'image docker:
cd deployment
docker compose build db
- Démarrer la db:
docker compose up db -d
- Injecter les variables d'environnement dans le shell courant (à répéter à chaque changement de shell)
source .env
- Appliquer la configuration postgres
docker compose exec db bash $DOCKER_VOLUMES_BASE_DIR/$SOURCE_DIR/conf/postgres_settings.sh
# check your pg_hba.conf is correct
docker compose exec db bash -c 'cat ${PGDATA}/pg_hba.conf'
# you must restart your container to restart postgres service (needed for parameters which require a restart to update, as `shared_buffers`)
docker compose restart db
# you can check that your postgresql.conf file has been correctly edited
docker compose exec db bash -c 'cat ${PGDATA}/postgresql.conf'
- Créer les utilisateurs et la base de données
docker compose exec db bash $DOCKER_VOLUMES_BASE_DIR/$SOURCE_DIR/scripts/database/init_db.sh
- Importer les données du fichier pbf dans la base
# prepare command
CMD="osm2pgsql \
--create \
$OSM2PGSQL_OPTS \
$DOCKER_VOLUMES_BASE_DIR/$OSM_PBF_FILES_DIR/$OSM_LATEST_PBF_FILE_NAME"
# check it
echo $CMD
# run
docker compose exec db $CMD >> $HOST_VOLUMES_BASE_DIR/$OSMOSIS_OSM2PGSQL_LOG_DIR/osm2pgsql-create.log 2>&1
# check log file
tail -f -n 200 $HOST_VOLUMES_BASE_DIR/$OSMOSIS_OSM2PGSQL_LOG_DIR/osm2pgsql-create.log
- Créer les vues
docker compose exec db bash $DOCKER_VOLUMES_BASE_DIR/$SOURCE_DIR/scripts/database/init_views.sh
# look for errors
docker compose exec db sh -c 'grep ERR /tmp/*log.err'
- Créer les tables, triggers et fonctions pour magosm-change :
docker compose exec db bash $DOCKER_VOLUMES_BASE_DIR/$SOURCE_DIR/scripts/database/init_magosm-change.sh
- Vérifier l'existence et la conformité du state file (suivre les instructions du script) :
cd ../db
bash ./scripts/database/check_osmosis_state_file.sh
- Initialiser le répertoire de travail Osmosis
bash ./scripts/database/init_osmosis_working_dir.sh
- Effectuer une mise à jour manuelle
cd ../deployment
# osmosis/osm2pgsql update + change analysis (`changes_analysis_*` tables are only populated on second iteration)
docker compose exec db bash $DOCKER_VOLUMES_BASE_DIR/$SOURCE_DIR/scripts/database/keepup_osm_db_and_changes.sh >> $HOST_VOLUMES_BASE_DIR/$OSMOSIS_OSM2PGSQL_LOG_DIR/keepup_osm_db_and_changes.log 2>&1
# check log file
tail -f -n 200 $HOST_VOLUMES_BASE_DIR/$OSMOSIS_OSM2PGSQL_LOG_DIR/keepup_osm_db_and_changes.log
# then check that your state.txt is one day later
cat $HOST_VOLUMES_BASE_DIR/$OSMOSIS_OSM2PGSQL_WORKING_DIR/updates/state.txt
# materialized views update
docker compose exec db bash $DOCKER_VOLUMES_BASE_DIR/$SOURCE_DIR/scripts/database/keepup_osm_views.sh >> $HOST_VOLUMES_BASE_DIR/$OSMOSIS_OSM2PGSQL_LOG_DIR/keepup_osm_views.log 2>&1
# check log file
tail -f -n 200 $HOST_VOLUMES_BASE_DIR/$OSMOSIS_OSM2PGSQL_LOG_DIR/keepup_osm_views.log
- Ajouter les tâches cron
# se placer dans le bon répertoire
cd ../deployment
sudo bash -c "cat <<EOF > /etc/cron.d/keepup_docker-db
# osmosis/osm2pgsql update
30 10 * * * debian docker compose --project-directory $(pwd) exec db bash $DOCKER_VOLUMES_BASE_DIR/$SOURCE_DIR/scripts/database/keepup_osm_db_and_changes.sh > $HOST_VOLUMES_BASE_DIR/$OSMOSIS_OSM2PGSQL_LOG_DIR/keepup_osm_db_and_changes.log 2>&1 && docker compose --project-directory $(pwd) exec db bash $DOCKER_VOLUMES_BASE_DIR/$SOURCE_DIR/scripts/database/keepup_osm_views.sh > $HOST_VOLUMES_BASE_DIR/$OSMOSIS_OSM2PGSQL_LOG_DIR/keepup_osm_views.log 2>&1
EOF"
Le nombre de containers geoserver déployés est indiqué dans le fichier deployment/docker-compose.yml
. La valeur associée est celle indiquée dans geoserver > deploy > replicas
.
- Si ce n'est pas déjà fait, créer le réseau docker
magosm
docker network create magosm
- Démarrer geoserver et le reverse-proxy
docker compose up -d geoserver reverse-proxy
- Attendre que geoserver soit démarré
#geoserver service must be marked as healthy
docker compose ps
Docker gère le load balancing entre les différentes instances de geoserver déployées. Il n'est pas possible d'accéder à l'interface d'administration de geoserver lorsque plusieurs containers du service geoserver
sont lancés en même temps (les requêtes d'authentification et d'accès aux données ne sont pas
adressées à un même container).
Pour contourner ce problème, on peut procéder de la manière suivante:
- arrêter les containers avec
docker stop
et pasdocker compose stop
jusqu'à ce qu'il n'en reste qu'un en marche: Par exemple, sireplicas: 2
:
docker stop $COMPOSE_PROJECT_NAME-geoserver-2
Si on dispose d'un environnement de travail sur la machine cible, on peut ensuite se connecter à l'interface administrateur via http://localhost:81/geoserver
- lorsqu'on a fini d'utiliser l'interface administrateur, relancer tous les containers
#relance les autres containers avec la configuration actualisée
docker compose up geoserver -d
#redémarre le container actuel avec la configuration actualisée (optionnel, nécessaire uniquement si on a fait une modification qui nécessite un redémarrage du container)
docker restart $COMPOSE_PROJECT_NAME-geoserver-1
- Suivre la procédure ci-dessus pour n'avoir qu'un seul container geoserver en marche
- Se rendre dans l'interface administrateur de geoserver via
http://localhost:81/geoserver
et se connecter avec les identifiants par défaut :admin
/geoserver
. - Dans le menu aller dans
Sécurité > Utilisateurs, Groupes et Rôles
puis cliquer sur l'onglet "Utilisateurs/Groupes" - Cliquer sur l'utilisateur
admin
et modifier le mot de passe puis sauvegarder
- Depuis l'interface d'administration de geoserver, se rendre dans
Entrepôts > magosm
- Dans les identifiants de connexion, indiquer le mot de passe précédemment choisi pour l'utilisateur
magosm
de la base de données (correspond àDBPG_USER_MAGOSM_PWD
dans le fichier.env
) puis sauvegarder - Répéter l'opération pour
Entrepôts > citymap
- Depuis l'interface d'administration de geoserver, aller dans
Sécurité > Mots de passe
et cliquer sur le lienmot de passe maître oublié
puis renseigner le fichier dans lequel geoserver doit écrire le mot de passe en clair (ex :masterpwd
) - Inspecter le mot de passe en ligne de commande :
docker exec $COMPOSE_PROJECT_NAME-geoserver-1 cat /geoserver/masterpwd
- Dans l'interface d'administration, cliquer sur le lien
changer le mot de passe maître
et renseigner les champs demandés
- Construire les images docker manquantes
docker compose build client services-webapp
- Démarrer les services
docker compose up -d
On peut ensuite vérifier le statut des services avec docker compose ps