Vous n'êtes pas identifié(e).
Bonjour,
J'espère ne pas me tromper de section afin d'exposer mon problème.
J'ai un serveur perso chez moi avec Debian 11 (totalement à jour) et Postgresql 13.
J'ai installé sur ce serveur quelques applications qui utilisent postgresql (Nextcloud, Wallabag, ..) et je développe aussi un peu de SQL depuis mes pc clients sur mon LAN.
Le soucis est que lorsque je dois redémarrer mon serveur pour une raison X ou Y, mon instance postgresql n'est pas accessible immédiatement après le boot.
je précise que j'ai bien entendu enable le service avec ces 2 commandes :
sudo systemctl enable postgresql
sudo update-rc.d postgresql enable
rien à y faire, après un reboot mon instance n'est pas accessible par mes applications ou par moi-même lorsque je veux développer. DBeaver me renvoie cette erreur par exemple :
Connection to server_ip:port refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
La seule chose que j'ai a faire pour pouvoir rendre mon instance accessible est
sudo systemctl restart postgresql
Mon fichier start.conf présent dans /etc/postgresql/13/main/ est bien remplie avec la valeur "auto".
Et lorsque je reboot mon serveur et que je controle juste après le statut du service postgres j'ai ça en retour :
postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-03-28 12:48:30 CEST; 2min 10s ago
Process: 958 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 958 (code=exited, status=0/SUCCESS)
CPU: 1ms
Il faut que je "restart" le service pour que mes applications (et moi-même) puissent accéder à mes bases.
Je ne sais vraiment pas ou chercher, et je tourne en ronds depuis quelques semaines.
Merci d'avance pour l'aide que vous pourrez m'apporter.
Dernière modification par GrosJambon33000 (29/03/2022 09:46:41)
Hors ligne
Le plus probable est que l'adresse réseau ne soit pas encore montée quand postgres démarre dans le contexte d'un boot, et donc il n'écoute pas dessus. Il faudrait regarder le log serveur (/var/log/postgresql/postgresql-13-main.log juste après un boot, si c'est ça il y aura des messages d'erreur à ce sujet.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Le plus probable est que l'adresse réseau ne soit pas encore montée quand postgres démarre dans le contexte d'un boot, et donc il n'écoute pas dessus. Il faudrait regarder le log serveur (/var/log/postgresql/postgresql-13-main.log juste après un boot, si c'est ça il y aura des messages d'erreur à ce sujet.
Merci de votre réponse.
Voici le contenu des logs suite à un reboot du serveur :
2022-03-28 19:12:49.937 CEST [789] LOG: a reçu une demande d'arrêt rapide
2022-03-28 19:12:49.968 CEST [789] LOG: annulation des transactions actives
2022-03-28 19:12:49.969 CEST [789] LOG: processus en tâche de fond « logical replication launcher » (PID 809) a quitté avec le code de sortie 1
2022-03-28 19:12:49.972 CEST [804] LOG: arrêt en cours
2022-03-28 19:12:50.133 CEST [789] LOG: le système de base de données est arrêté
2022-03-28 19:13:11.771 CEST [792] LOG: démarrage de PostgreSQL 13.5 (Debian 13.5-0+deb11u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2022-03-28 19:13:11.772 CEST [792] LOG: en écoute sur IPv4, adresse « 127.0.0.1 », port 5432
2022-03-28 19:13:11.816 CEST [792] LOG: n'a pas pu lier IPv4 à l'adresse « 192.168.1.2 » : Ne peut attribuer l'adresse demandée
2022-03-28 19:13:11.816 CEST [792] ASTUCE : Un autre postmaster fonctionne-t'il déjà sur le port 5432 ?
Sinon, attendez quelques secondes et réessayez.
2022-03-28 19:13:11.817 CEST [792] ATTENTION: n'a pas pu créer le socket d'écoute pour « 192.168.1.2 »
2022-03-28 19:13:11.819 CEST [792] LOG: écoute sur la socket Unix « /var/run/postgresql/.s.PGSQL.5432 »
2022-03-28 19:13:11.896 CEST [805] LOG: le système de bases de données a été arrêté à 2022-03-28 19:12:50 CEST
2022-03-28 19:13:11.977 CEST [792] LOG: le système de bases de données est prêt pour accepter les connexions
Merci d'avance pour votre aide.
Hors ligne
si je modifie mon fichier pg_hba.conf pour lui retirer la ligne :
# IPv4 local connections:
host all all 127.0.0.1/32 md5
et que je laisse uniquement les lignes concernant l'IP local de mon serveur ainsi que les clients locaux, cela peut régler le soucis ?
EDIT : j'ai commenté la ligne dans le fichier cela n'a pas arrangé le soucis.
Dernière modification par GrosJambon33000 (28/03/2022 21:30:25)
Hors ligne
Cette erreur ressemble effectivement à ce que je supposais en #2:
2022-03-28 19:13:11.816 CEST [792] LOG: n'a pas pu lier IPv4 à l'adresse « 192.168.1.2 » : Ne peut attribuer l'adresse demandée
2022-03-28 19:13:11.816 CEST [792] ASTUCE : Un autre postmaster fonctionne-t'il déjà sur le port 5432 ?
Sinon, attendez quelques secondes et réessayez.
2022-03-28 19:13:11.817 CEST [792] ATTENTION: n'a pas pu créer le socket d'écoute pour « 192.168.1.2 »
dans le postgresql.conf, il doit y avoir une déclaration du style:
listen_addresses = 127.0.0.1,192.168.1.2
Ca dit à postgres d'écouter sur ces deux interfaces réseau. Le problème est que si 127.0.0.1 est bien accessible dès que postgres démarre au boot, 192.168.1.2 ne l'est pas.
Ca devrait pouvoir être corrigé, soit
1) de la manière la plus simple en mettant
listen_addresses = *
à la place. Le problème est que s'il y a d'autres interfaces réseau sur la machine, notamment ouvertes sur Internet, pour la sécurité c'est mauvais. Le reste du monde peut joindre votre instance postgres au lieu que ce soit limité à votre réseau local.
2) d'une manière plus compliquée mais plus sûre en forçant postgres à attendre que les interfaces soient prêtes via systemd, sans changer listen_addresses. Il y a une réponse ici qui va dans ce sens:
https://stackoverflow.com/questions/622 … ot-systemd
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Cette erreur ressemble effectivement à ce que je supposais en #2:
2022-03-28 19:13:11.816 CEST [792] LOG: n'a pas pu lier IPv4 à l'adresse « 192.168.1.2 » : Ne peut attribuer l'adresse demandée 2022-03-28 19:13:11.816 CEST [792] ASTUCE : Un autre postmaster fonctionne-t'il déjà sur le port 5432 ? Sinon, attendez quelques secondes et réessayez. 2022-03-28 19:13:11.817 CEST [792] ATTENTION: n'a pas pu créer le socket d'écoute pour « 192.168.1.2 »
dans le postgresql.conf, il doit y avoir une déclaration du style:
listen_addresses = 127.0.0.1,192.168.1.2
Ca dit à postgres d'écouter sur ces deux interfaces réseau. Le problème est que si 127.0.0.1 est bien accessible dès que postgres démarre au boot, 192.168.1.2 ne l'est pas.
Ca devrait pouvoir être corrigé, soit
1) de la manière la plus simple en mettantlisten_addresses = *
à la place. Le problème est que s'il y a d'autres interfaces réseau sur la machine, notamment ouvertes sur Internet, pour la sécurité c'est mauvais. Le reste du monde peut joindre votre instance postgres au lieu que ce soit limité à votre réseau local.
2) d'une manière plus compliquée mais plus sûre en forçant postgres à attendre que les interfaces soient prêtes via systemd, sans changer listen_addresses. Il y a une réponse ici qui va dans ce sens:
https://stackoverflow.com/questions/622 … ot-systemd
effectivement, je viens de voir ça dans le postgresql.conf.
Et si j'enlève 127.0.0.1 dans la conf et que je laisse uniquement l'IP locale de mon serveur à savoir 192.168.1.2 ?
EDIT : je viens de tester et Postgresql ne démarre carrément pas du tout...
Dernière modification par GrosJambon33000 (28/03/2022 21:46:10)
Hors ligne
2) d'une manière plus compliquée mais plus sûre en forçant postgres à attendre que les interfaces soient prêtes via systemd, sans changer listen_addresses. Il y a une réponse ici qui va dans ce sens:
https://stackoverflow.com/questions/622 … ot-systemd
je viens de tester en rajoutant les 2 lignes :
Wants=network-online.target
After=network.target network-online.target
dans le fichier ./etc/systemd/system/multi-user.target.wants/postgresql.service dans la section [unit] mais toujours le même soucis au reboot du serveur.
Dernière modification par GrosJambon33000 (28/03/2022 22:08:38)
Hors ligne
Et si j'enlève 127.0.0.1 dans la conf et que je laisse uniquement l'IP locale de mon serveur à savoir 192.168.1.2 ?
Ca enlève celle qui répond et ça garde celle qui ne répond pas (enfin pas tout de suite) donc effectivement ça ne peut pas marcher.
Encore une fois, si le serveur est protégé de l'extérieur, listen_addresses=* serait OK.
Concernant systemd, je viens d'essayer et comme prévu c'est moins simple. Effectivement faire le changement dans postgresql.service ne semble pas marcher pour moi non plus.
Sur Debian/Ubuntu l'unité systemd postgresql est en fait un lanceur et pas le service lui-même.
La vraie unité est générée pour chaque instance suivant le modèle dans /lib/systemd/postgresql@.service
Si dans la section [Unit] de ce fichier j'ajoute
After=network-online.target
ça semble marcher pour moi avec une interface DHCP. Ceci sur un portable Ubuntu 18.04 qui a les mêmes packages Postgres que Debian à peu de choses près, donc que je pense que ce serait pareil sur Debian. A confirmer.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Bonjour,
Le soucis à l'air réglé. J'ai été modifié le fichier postgresql@.service dans :
var/lib/systemd/system
j'avais déja cette ligne présente :
After=network.target
que j'ai transformé sur vos conseils en :
After=network-online.target
Merci pour votre aide.
Hors ligne