====== Installation d'un espace de Pré-Production pour GeoNature ====== ===== Dépendances nécessaires ===== * Se connecter à l'utilisateur geonat de bkp-srv :ssh geonat@bkp--sinp * Installer les dépendances (NVM, Python...) de GeoNature en suivant [[serveurs:installation:web-srv:geonature-dependances#dependances_pour_l_instance_web-srv_bkp-srv_espace_pre-prod| la documentation]]. ===== Procédure rapatriement de la prod ===== * Se connecter à l'utilisateur //geonat// de //bkp-srv// : ssh geonat@bkp--sinp * Récupérer l'installation des outils GeoNature de //web-srv// (supprimer l'option ''%%--dry-run%%'' si tout est OK) : rsync -e "ssh -p " -av --exclude .cache/ --exclude venv/ --exclude venv.save/ geonat@web--sinp:/home/geonat/www/ /home/geonat/www/ --dry-run * Récupérer les données de //db-srv// (supprimer l'option ''%%--dry-run%%'' si tout est OK) : rsync -av -e "ssh -p " --exclude "raw/*" geonat@db--sinp:/home/geonat/data/ /home/geonat/data --dry-run * Recréer les liens symboliques de la racine du home de geonat : ln -s www/atlas atlas ln -s www/geonature geonature ln -s www/taxhub taxhub ln -s www/usershub usershub ===== Procédure : installation via Git ===== * Cloner le dépôt avec l'URL en https : ''%% git clone https://github.com/PnX-SI/GeoNature.git geonature %%'' * Se placer dans le dossier du dépôt cloné : ''cd geonature'' * Récupérer le fichier ''config/settings.ini'' avec : ''scp geonat@web--sinp:~/geonature/config/settings.ini ./config/'' * Adapter son contenu : ''vi config/settings.ini'' * Récupérer le fichier ''config/geonature_config.toml'' avec : ''scp geonat@web--sinp:~/geonature/config/geonature_config.toml ./config/'' * Adapter son contenu : ''vi config/geonature_config.toml'' * Réinstaller le //venv// du backend : * ''cd install/'' * ''./01_install_backend.sh'' * Arrêter le script lors de la demande de mot de passe pour l'installation des scripts SystemD : ''CTRL+C'' * Installer le module Sentry : * ''source ../backend/venv/bin/activate'' * ''pip install sentry_sdk'' * ''deactivate'' * Copier les composants "custom" présents dans ''frontend/src/custom/components/'' * ''scp -r geonat@web--sinp:~/geonature/frontend/src/custom/components/ frontend/src/custom/'' * Si besoin restaurer les fichiers .sample : ''git restore *.sample'' * Copier les images "custom" présentes dans ''frontend/src/custom/images/'' * ''scp -r geonat@web--sinp:~/geonature/frontend/src/custom/images frontend/src/custom/'' * Copier le fichier //favicon.ico// : * ''scp -r geonat@web--sinp:~/geonature/frontend/src/favicon.ico frontend/src/'' * Penser à reporter les éventuelles modifications du fichier ''frontend/src/assets/i18n/fr.json'' : * ''scp geonat@web--sinp:~/geonature/frontend/src/assets/i18n/fr.json ./frontend/src/assets/i18n/'' * Récupérer le fichier //environ// : * ''scp geonat@web--sinp:~/geonature/environ ./'' * Adapter le fichier //environ// aux caractéristiques du serveur de la pré-prod : ''vi ./environ'' * Recréer les liens symboliques présents dans ''frontend/src/external_assets/'' et dans ''external_modules/'' * Réinstaller les modules pre-existant : source backend/venv/bin/activate pip list | grep modules pip install -e /home/geonat/www/modules/ pip list | grep modules * Essayer de réinstaller le frontend à l'aide du script : * ''cd install/'' * ''./04_install_fontend.sh'' * Sinon, une alternative et la réinstallation manuelle du frontend : * Réinstaller Npm et Node à l'aide de Nvm : * ''cd frontend/'' * ''nvm use'' * Réinstaller les paquets Npm : * ''cd frontend/'' * '' npm install'' * Reconstruire le frontend à l'aide d'Angular : * ''cd frontend/'' * ''npm run build'' * Corriger/Créer un fichier Logrotate : * ''vi /etc/logrotate.d/geonature'' * Corriger/Créer le service SystemD ==== Reconfigurer GeoNature ==== * [[serveurs:installation:web-srv:geonature-dependances#dependances_pour_l_instance_web-srv|Installer/Mettre à jour les dépendances de GeoNature]]. * **NOTES** : il est nécessaire que Gunicorn écoute sur l'IP 0.0.0.0 car Nginx étant dans un container il ne peut accéder à l'IP 127.0.0.1. Le parefeu se charge de rendre inaccessibles le port 8000 de GeoNature ainsi que ceux d'UsersHub et TaxHub. * Reconfigurer GeoNature : * Changer les paramètres suivants dans //geonature_config.toml// : vi ~/geonature/config/geonature_config.toml SQLALCHEMY_DATABASE_URI = "postgresql://geonatadmin:@127.0.0.1:5432/geonature2db" URL_APPLICATION = "https://gnpp.silene.eu" API_ENDPOINT = "https://gnpp.silene.eu/api" API_TAXHUB = "https://thpp.silene.eu/api" # Remplacer par une clé alétoire complexe SECRET_KEY = "" appName = " - Pré-Prod" # Set Sentry DSN SENTRY_DSN = "" [USERSHUB] URL_USERSHUB = "https://uhpp." [ACCOUNT_MANAGEMENT] VALIDATOR_EMAIL = [ "adminsys@", ] [FRONTEND] # Durée de vie du cache des stats de la page d'accueil # 86 400 = 1 jour STAT_BLOC_TTL = 86400 [PERMISSION_MANAGEMENT] VALIDATOR_EMAIL = [ "adminsys@", ] * Changer les paramètres suivants dans //settings.ini// : vi ~/geonature/config/settings.ini #MODE=dev #Voir s'il faut utiliser git pour l'installation et donc le mode "dev"... my_url=https://gnpp.silene.eu/ db_host=127.0.0.1 user_pg_pass= * Réinstaller le //venv// et //Node// pour //GeoNature// : cd ~/geonature/frontend nvm install cd ~/geonature/backend rm -fR venv cd ~/geonature/install ./01_install_backend.sh * Réinstaller le frontend : cd ~/geonature/install ./04_install_frontend.sh * Si erreur ''An unhandled exception occurred: Cannot find module '@angular-builders/custom-webpack/package.json'' : cd ~/geonature/frontend/ nvm use npm install npm run build * Créer une dossier pour les logs : mkdir /var/log/geonature/ mv /var/log/usershub.log /var/log/geonature/ chown -R geonat: /var/log/geonature/ * Créer un fichier logrotate : vi /etc/logrotate.d/geonature /var/log/geonature/geonature.log { su geonat geonat daily rotate 8 size 100M create compress postrotate systemctl reload geonature || true endscript } * Surcharger le service SystemD : systemctl edit geonature [Unit] Description=GeoNature - PreProd After=docker.service StartLimitIntervalSec=60min StartLimitBurst=25 [Service] Restart=on-failure RestartSec=2min StandardOutput=append:/var/log/geonature/geonature.log * Créer un fichier ''environ'' : vi ~/geonature/environ GUNICORN_HOST=0.0.0.0 GUNICORN_NUM_WORKERS=9 GUNICORN_TIMEOUT=300 ==== Reconfigurer l'Atlas ==== * Changer les paramètres suivants dans //config.py// : vi ~/atlas/atlas/configuration/config.py database_connection = "postgresql://geonatatlas:@127.0.0.1:5432/gnatlas" NOM_APPLICATION = "Silene Nature - Pré-Prod" SECRET_KEY = '' * Changer les paramètres suivants dans //settings.ini// : vi ~/www/atlas/atlas/configuration/settings.ini db_host=0.0.0.0 user_pg_pass= owner_atlas_pass= db_source_host=127.0.0.1 atlas_source_pass= * Réinstaller le //venv// et //Node// pour //GeoNature-Atlas// : cd ~/atlas/atlas/static/ nvm install cd ~/atlas/ rm -fR venv ./install_app.sh * Créer une dossier pour les logs : mkdir /var/log/geonature-atlas/ mv /var/log/usershub.log /var/log/geonature-atlas/ chown -R geonat: /var/log/geonature-atlas/ * Créer un fichier logrotate : vi /etc/logrotate.d/geonature-atlas /var/log/geonature-atlas/geonature-atlas.log { su geonat geonat daily rotate 8 size 100M create compress postrotate systemctl reload geonature-atlas || true endscript } * Surcharger le service SystemD : systemctl edit geonature-atlas [Unit] Description=Atlas - PreProd After=docker.service StartLimitIntervalSec=60min StartLimitBurst=25 [Service] Restart=on-failure RestartSec=2min StandardOutput=append:/var/log/geonature-atlas/geonature-atlas.log * Créer un fichier ''environ'' : vi ~/atlas/environ GUNICORN_HOST=0.0.0.0 GUNICORN_NUM_WORKERS=4 GUNICORN_TIMEOUT=90 ==== Reconfigurer UsersHub ==== * Changer les paramètres suivants dans //config.py// : vi ~/usershub/config/config.py SQLALCHEMY_DATABASE_URI = "postgresql://geonatadmin:@127.0.0.1:5432/geonature2db" URL_APPLICATION ='https://uhpp.silene.eu' SECRET_KEY = '' * Changer les paramètres suivants dans //settings.ini// : vi ~/usershub/config/settings.ini db_host=0.0.0.0 user_pg_pass= url_application=https://uhpp.silene.eu * Réinstaller le //venv// et //Node// pour //UsersHub// : cd ~/usershub/app/static/ nvm install cd ~/usershub/ rm -fR venv ./install_app.sh * Créer une dossier pour les logs : mkdir /var/log/usershub/ mv /var/log/usershub.log /var/log/usershub/ chown -R geonat: /var/log/usershub/ * Créer un fichier logrotate : vi /etc/logrotate.d/usershub /var/log/usershub/usershub.log { su geonat geonat daily rotate 8 size 100M create compress postrotate systemctl reload usershub || true endscript } * Surcharger le service SystemD : systemctl edit usershub.service [Unit] Description=UsersHub - PreProd After=docker.service StartLimitIntervalSec=60min StartLimitBurst=25 [Service] Restart=on-failure RestartSec=2min StandardOutput=append:/var/log/usershub/usershub.log * Créer un fichier ''environ'' : vi ~/usershub/environ GUNICORN_HOST=0.0.0.0 ==== Reconfigurer TaxHub ==== * Changer les paramètres suivants dans //config.py// : vi ~/taxhub/apptax/config.py DEBUG=True SQLALCHEMY_DATABASE_URI = "postgresql://geonatadmin:@127.0.0.1:5432/geonature2db" SECRET_KEY = '' * Changer les paramètres suivants dans //settings.ini// : vi ~/taxhub/settings.ini db_host=0.0.0.0 user_pg_pass= * Réinstaller le //venv// et //Node// pour //TaxHub// : cd ~/taxhub/static/ nvm install cd ~/taxhub/ rm -fR venv ./install_app.sh * Créer une dossier pour les logs : mkdir /var/log/taxhub/ mv /var/log/usershub.log /var/log/taxhub/ chown -R geonat: /var/log/taxhub/ * Créer un fichier logrotate : vi /etc/logrotate.d/taxhub /var/log/taxhub/taxhub.log { su geonat geonat daily rotate 8 size 100M create compress postrotate systemctl reload taxhub || true endscript } * Surcharger le service SystemD : systemctl edit taxhub [Unit] Description=TaxHub - PreProd After=docker.service StartLimitIntervalSec=60min StartLimitBurst=25 [Service] Restart=on-failure RestartSec=2min StandardOutput=append:/var/log/taxhub/taxhub.log * Créer un fichier ''environ'' : vi ~/taxhub/environ GUNICORN_HOST=0.0.0.0 ==== Création du container Docker hébergeant Postgresql & Nginx ==== === Activation de l'IPv6 sur Docker et la stack proxy === * Afin d'avoir un support complet d'IPv6 sur la pré-prod, il est nécessaire [[serveurs:installation:docker#activer_ipv6_pour_docker|d'activer le support d'IPv6 par Docker]]. === Création de la stack preprod === * Ajouter l'utilisateur //geonat// au groupe docker : sudo usermod -aG docker geonat * Se déconnecter et se reconnecter au compte //geonat// et vérifier la prise en compte du groupe avec : id * Tester Docker en tant qu'utilisateur //geonat// avec : docker run hello-world * Si le message d'erreur docker: ''Got permission denied while trying to connect to the Docker daemon socket'' apparait, redémarrer la machine pour activer la prise en compte de Docker. * Créer le dossier qui hébergera la stack GeoNature Docker Compose : mkdir -p ~/docker/preprod * Se placer dedans et récupérer les fichiers disponible sur [[https://github.com/cbn-alpin/sinp-paca-srv/tree/main/bkp-srv/home/geonat/docker/preprod|le dépôt Github sinp-paca-srv]] ou sur [[https://github.com/cbn-alpin/sinp-aura-srv/tree/main/bkp-srv/home/geonat/docker/preprod|le dépôt Github sinp-aura-srv]]. * Copier le fichier .env.sample en .env : cp .env.sample .env * Configurer le fichier //.env// * Lancer la stack avec : docker compose up -d * Vérifier le bon fonctionnement avec //Portainer//. === Accéder au shell Psql depuis le container Postgres === * Assurer vous que le container //preprod-postgres// est bien dans l'état //running// (via Portainer ou en ligne de commande). * Accéder à l'intérieur du container : docker exec -it preprod-postgres bash * Accéder à //Psql// avec : psql -U ${POSTGRES_USER} ${POSTGRES_DB} * Dans le container, l'utilisateur ${POSTGRES_USER} et la base ${POSTGRES_DB} remplace l'utilisateur par défaut //postgres//. Il est donc nécessaire de se connecter avec ces arguments ! === Installer le client Postgresql sur l'hôte === * Vérifier la présence du dépôt de paquets deb pour Postgresql dans : ''/etc/apt/sources.list.d/ '' * Vérifier la version de Postgresql utilisé par le contenair Docker Postgresql de la pré-prod. * Utiliser la même version pour l'installation du paquet postgresql-client. Ex. : ''apt install postgresql-client-15'' ===== Remplacer la base par la dernière version sauvegardée ===== * Se connecter en //root// sur //bkp-srv// : ssh admin@bkp--sinp ; sudo -i * Monter le dépôt Borg de //db-srv// : borg mount /home/backups/db-srv /tmp/repo * Saisir la //passphrase// de //db-srv//. * Extraire le dump de la base de GeoNature et le copier dans l'espace de restauration du container ''preprod-postgres-restore'' avec : * Pour //geonature2db// : cp -r /tmp/repo/db-srv-/root/.borgmatic/postgresql_databases/172.18.5.1/geonature2db /home/geonat/docker/preprod/postgres/restore/_geonature2db.custom * Pour //gnatlas// : cp -r /tmp/repo/db-srv-/root/.borgmatic/postgresql_databases/172.18.5.1/gnatlas /home/geonat/docker/preprod/postgres/restore/_gnatlas.custom * **ATTENTION** : le nom du fichier du dump récupéré doit contenir le nom de la base de donnée //geonature2db// ou //gnatlas//. Cette information est récupéré par le script de restauration pour effectuer certaines tâches spécifiques. * Donner les droits à //geonat// sur les dumps : chown geonat: /home/geonat/docker/preprod/postgres/restore/*.custom * Démonter le dépôt : cd ; borg umount /tmp/repo * Se connecter en //geonat// sur //bkp-srv// : * Se placer dans le dossier de la stack //preprod// : cd ~/docker/preprod/ * Restauration de **GeoNature** : * Lancer la restauration de la base de donnée (**ATTENTION**. Ex. avec //geonature2db// : cela supprimera la base en place) : docker compose run --rm preprod-postgres-restore /restore/restore.sh -d "2023-06-14_geonature2db.custom" * Restauration de **GeoNature Atlas** : * Lancer la restauration de la base de donnée (**ATTENTION**. Ex. avec //gnatlas// : cela supprimera la base en place) : docker compose run --rm preprod-postgres-restore /restore/restore.sh -d "2023-06-23_gnatlas.custom" * **ATTENTION** : La restauration précédente va bloquer sur le rafraîchissement de la VM "observations" pour une raison encore inconnue. Stopper la restauration avec ''CTRL+C''. Les tables et les VMs sont malgré tout généré dans la base. Il suffit donc de rafraichir l'ensemble des VMs pour finaliser la restauration. * Rafraîchir les VMs grâce au script ''gnatlas_refresh_all.sql'' : docker compose run --rm preprod-postgres-restore psql -U geonatadmin -e -d gnatlas -f /restore/gnatlas_refresh_all.sql ===== Docker Compose, Services SystemD et Nginx Proxy ===== * Pour fonctionner la pré-prod nécessite d'avoir démarré dans l'ordre suivant : - le serveur Postgresql //preprod-postgres// de la stack Docker Compose "preprod" - le fonctionnement sur l'hôte des services SystemD de GeoNature : systemctl status geonature systemctl status usershub systemctl status taxhub systemctl status geonature-atlas - le serveur Nginx //preprod-nginx// de la stack Docker Compose "preprod" ===== Installer le dépôt sinp--data ===== * Se connecter en //geonat// sur bkp-srv :ssh geonat@bkp--sinp * Deux solutions pour créer le dossier //~/data// et son contenu : * Copier directement le dossier //~/data// de production présent sur le serveur //db-srv// puis modifier les fichiers de config si nécessaire. * Cloner le dépôt dans un dossier //~/data/ // ce qui implique ensuite de copier tous les fichiers de config. Ex. : git clone --recursive https://github.com/cbn-alpin/sinp-aura-data.git data * Se placer dans le dossier du dépôt : cd ~/data/ * Installer Pipx : sudo apt install pipx * Configurer les chemins d'accès : pipx ensurepath * Relancer le terminal pour prendre en compte les changement ou essayer : source ~/.bashrc * Vérifier que Pipx est fonctionnel : pipx --version * Installer Pipenv : pipx install pipenv * Vérifier que Pipenv est fonctionnel : pipenv --version * Installer les dépendances de ''import-parser'' avec : ''cd ~/data/import-parser/; pipenv install '' * Installer les dépendances de ''gn2pg'' avec : ''cd ~/data/gn2pg/; pipenv install '' * Si nécessaire, supprimer le dossier ~/.gn2pg si ce n'est pas un lien ''ls -al ~/.gn2pg'' puis si c'est un dossier ''rm -fr ~/.gn2pg'' * Recréer un lien symbolique : '' ln -s ~/data/gn2pg/config ~/.gn2pg'' * Copier TOUS les fichiers de config depuis le serveur ''db-srv''