Prérequis
- Un serveur sous Ubuntu, Debian, AlmaLinux, Rocky, CentOS, Fedora, Alpine ou openSUSE : voir nos VPS au Canada
- Une connexion SSH ouverte en root : Se connecter en SSH à votre VPS
PostgreSQL est une base de données, celle que demandent Django, Rails, Odoo ou Mastodon. Ce guide l'installe depuis les dépôts de votre système, crée un utilisateur et une base, puis règle le point qui bloque presque tout le monde : par défaut, votre application n'a pas le droit de se connecter avec son mot de passe, et ce n'est pas pareil d'un système à l'autre. On sauvegarde et on restaure aussi. Choisissez votre système ci-dessus. Copiez la commande avec le bouton Copier, collez-la dans votre terminal, et comparez avec le résultat attendu.
1Mettre à jour le système
apt update && apt upgrade -y... 212 upgraded, 8 newly installed, 0 to remove and 4 not upgraded. (les nombres dépendent de l'âge de l'image)
dnf upgrade -y... Complete!
dnf upgrade -y... Complete!
apk update && apk upgrade && reboot... OK: 158 MiB in 209 packages (les nombres dépendent de l'image ; la connexion SSH se coupe au redémarrage)
Alpine redémarre après la mise à jour : quand elle remplace le noyau, les modules du noyau en cours disparaissent, et le système ne peut plus en charger aucun avant de redémarrer sur le nouveau. Reconnectez-vous en SSH après une minute.
zypper -n refresh && zypper -n updateAll repositories have been refreshed. ...
2Installer PostgreSQL
Votre système fournit PostgreSQL, il n'y a pas de dépôt à ajouter.
apt install -y postgresql postgresql-client... Setting up postgresql-16 ... (le paquet crée la base et démarre le service tout seul)
dnf module enable postgresql:16 -y && dnf install -y postgresql-server postgresql
postgresql-setup --initdb
systemctl enable --now postgresql... * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → ... (sans « module enable postgresql:16 », AlmaLinux, Rocky et CentOS installent PostgreSQL 13, qui n'est plus maintenu depuis novembre 2025)
dnf install -y postgresql-server postgresql
postgresql-setup --initdb
systemctl enable --now postgresql... * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log Created symlink '/etc/systemd/system/multi-user.target.wants/postgresql.service' → ...
apk add postgresql postgresql-client
/etc/init.d/postgresql setup
rc-update add postgresql default && rc-service postgresql start... initdb: warning: enabling "trust" authentication for local connections ... Success. * service postgresql added to runlevel default * Starting postgresql ... [ ok ] (retenez cet avertissement : l'étape 6 le corrige)
zypper -n install postgresql-server postgresql && systemctl enable --now postgresql... Created symlink '/etc/systemd/system/multi-user.target.wants/postgresql.service' → ... (openSUSE initialise la base au premier démarrage)
psql --version && systemctl is-active postgresqlpsql (PostgreSQL) 16.15 (Ubuntu 16.15-0ubuntu0.24.04.1) active (Debian 13 : PostgreSQL 17.11)
psql --version && systemctl is-active postgresqlpsql (PostgreSQL) 16.15 active (CentOS Stream 9 : 16.8)
psql --version && systemctl is-active postgresqlpsql (PostgreSQL) 18.6 active
psql --version && rc-service postgresql statuspsql (PostgreSQL) 18.6 * status: started
psql --version && systemctl is-active postgresqlpsql (PostgreSQL) 18.6 active
3Ouvrir la console en administrateur
PostgreSQL ne se pilote pas avec le compte root du serveur mais avec son propre compte système, postgres, créé à l'installation. sudo -u postgres psql ouvre la console en tant qu'administrateur de la base, sans mot de passe : c'est l'authentification « peer », le serveur fait confiance au compte système.
sudo -u postgres psqlpsql (16.15) Type "help" for help. postgres=# (tapez \q pour sortir)
4Créer un utilisateur et une base
Une application ne se connecte jamais en administrateur : on lui crée son utilisateur, avec un mot de passe, et sa base dont il est propriétaire. Passez ces deux commandes dans la console ouverte à l'étape 3 (remplacez les noms et le mot de passe par les vôtres).
CREATE USER mon_utilisateur WITH PASSWORD 'MotDePasseSolide';
CREATE DATABASE ma_base OWNER mon_utilisateur;CREATE ROLE CREATE DATABASE (propriétaire de la base, il pourra y créer ses tables sans droits supplémentaires)
\l
\qName | Owner | Encoding | -----------+-----------------+----------+ ma_base | mon_utilisateur | UTF8 | (la liste des bases ; ma_base appartient bien à mon_utilisateur)
5Où sont les fichiers de PostgreSQL
Les chemins changent selon le système. Demandez-les au serveur :
sudo -u postgres psql -c 'SHOW data_directory;' -c 'SHOW config_file;' -c 'SHOW hba_file;' data_directory
--------------------------
/var/lib/postgresql/16/main
config_file
-------------------------------------
/etc/postgresql/16/main/postgresql.conf
hba_file
-----------------------------------
/etc/postgresql/16/main/pg_hba.confLes réglages sont dans /etc/postgresql/VERSION/main/ et les données dans /var/lib/postgresql/VERSION/main.
Tout est au même endroit : /var/lib/pgsql/data/ contient les données ET les deux fichiers de configuration.
Tout est au même endroit : /var/lib/pgsql/data/ contient les données ET les deux fichiers de configuration.
Les réglages sont dans /etc/postgresql/ et les données dans /var/lib/postgresql/18/data.
Tout est au même endroit : /var/lib/pgsql/data/ contient les données ET les deux fichiers de configuration.
6Autoriser votre application à se connecter
Le fichier pg_hba.conf décide qui a le droit de se connecter, d'où, et comment il doit prouver son identité. Son contenu par défaut n'est pas le même d'un système à l'autre, et sur la plupart il refuse justement ce dont votre application a besoin : se connecter par 127.0.0.1 avec un mot de passe.
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'local all postgres peer local all all peer host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256 local replication all peer host replication all 127.0.0.1/32 scram-sha-256 host replication all ::1/128 scram-sha-256 (scram-sha-256 sur les lignes host : un mot de passe est exigé et vérifié. C'est ce qu'il faut)
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'local all all peer host all all 127.0.0.1/32 ident host all all ::1/128 ident local replication all peer host replication all 127.0.0.1/32 ident host replication all ::1/128 ident (ident sur les lignes host : votre application sera refusée, quel que soit son mot de passe)
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'local all all peer host all all 127.0.0.1/32 ident host all all ::1/128 ident local replication all peer host replication all 127.0.0.1/32 ident host replication all ::1/128 ident (ident sur les lignes host : votre application sera refusée, quel que soit son mot de passe)
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'local all all trust host all all 127.0.0.1/32 trust host all all ::1/128 trust local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust (trust partout : tout le monde entre, sans mot de passe)
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'local all all peer host all all 127.0.0.1/32 ident host all all ::1/128 ident local replication all peer host replication all 127.0.0.1/32 ident host replication all ::1/128 ident (ident sur les lignes host : votre application sera refusée, quel que soit son mot de passe)
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"current_user | current_database -----------------+------------------ mon_utilisateur | ma_base (scram-sha-256 est déjà en place pour 127.0.0.1 : votre application se connecte sans rien changer)
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"psql: error: connection to server at "127.0.0.1", port 5432 failed: FATAL: Ident authentication failed for user "mon_utilisateur" (le fichier dit « ident » : le mot de passe n'est même pas examiné. La commande suivante corrige)
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"psql: error: connection to server at "127.0.0.1", port 5432 failed: FATAL: Ident authentication failed for user "mon_utilisateur" (le fichier dit « ident » : le mot de passe n'est même pas examiné. La commande suivante corrige)
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"current_user | current_database -----------------+------------------ mon_utilisateur | ma_base (ça marche... mais lisez l'encadré ci-dessous avant de vous en réjouir)
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"psql: error: connection to server at "127.0.0.1", port 5432 failed: FATAL: Ident authentication failed for user "mon_utilisateur" (le fichier dit « ident » : le mot de passe n'est même pas examiné. La commande suivante corrige)
Sur Alpine, aucun mot de passe n'est vérifié
Alpine écrit « trust » sur toutes les lignes de pg_hba.conf : la connexion est acceptée quel que soit le mot de passe, même faux. N'importe quel compte du serveur peut aussi ouvrir la base en administrateur. Corrigez-le avec la commande ci-dessous avant de mettre quoi que ce soit dans cette base.
Remplacez « ident » par « scram-sha-256 » sur les deux lignes qui concernent 127.0.0.1 et ::1, puis rechargez. scram-sha-256 est la méthode de mot de passe de PostgreSQL ; md5 est dépassée.
Remplacez « ident » par « scram-sha-256 » sur les deux lignes qui concernent 127.0.0.1 et ::1, puis rechargez. scram-sha-256 est la méthode de mot de passe de PostgreSQL ; md5 est dépassée.
Remplacez « ident » par « scram-sha-256 » sur les deux lignes qui concernent 127.0.0.1 et ::1, puis rechargez. scram-sha-256 est la méthode de mot de passe de PostgreSQL ; md5 est dépassée.
On remplace « trust » par « scram-sha-256 » pour les connexions par 127.0.0.1, et par « peer » pour les connexions locales : l'administrateur gardera son accès par sudo -u postgres, mais plus personne d'autre.
Rien à changer ici : scram-sha-256 est déjà en place pour les connexions par 127.0.0.1. Vérifiez simplement que le test ci-dessus vous a bien répondu.
HBA=$(sudo -u postgres psql -t -A -c 'SHOW hba_file;')
sed -i 's/^\(host .*127\.0\.0\.1\/32 *\)ident/\1scram-sha-256/; s/^\(host .*::1\/128 *\)ident/\1scram-sha-256/' "$HBA"
systemctl reload postgresql(aucune sortie : la modification est faite et PostgreSQL a relu son fichier)
HBA=$(sudo -u postgres psql -t -A -c 'SHOW hba_file;')
sed -i 's/^\(host .*127\.0\.0\.1\/32 *\)ident/\1scram-sha-256/; s/^\(host .*::1\/128 *\)ident/\1scram-sha-256/' "$HBA"
systemctl reload postgresql(aucune sortie : la modification est faite et PostgreSQL a relu son fichier)
HBA=$(sudo -u postgres psql -t -A -c 'SHOW hba_file;')
sed -i 's/^\(host .*127\.0\.0\.1\/32 *\)ident/\1scram-sha-256/; s/^\(host .*::1\/128 *\)ident/\1scram-sha-256/' "$HBA"
systemctl reload postgresql(aucune sortie : la modification est faite et PostgreSQL a relu son fichier)
HBA=$(sudo -u postgres psql -t -A -c 'SHOW hba_file;')
sed -i 's/^\(local .*[[:space:]]\)trust$/\1peer/' "$HBA"
sed -i 's/^\(host .*127\.0\.0\.1\/32 *\)trust/\1scram-sha-256/; s/^\(host .*::1\/128 *\)trust/\1scram-sha-256/' "$HBA"
rc-service postgresql reload* Reloading PostgreSQL 18 configuration ... [ ok ]
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"current_user | current_database -----------------+------------------ mon_utilisateur | ma_base (et avec un mauvais mot de passe : « FATAL: password authentication failed for user "mon_utilisateur" »)
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"current_user | current_database -----------------+------------------ mon_utilisateur | ma_base (et avec un mauvais mot de passe : « FATAL: password authentication failed for user "mon_utilisateur" »)
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"current_user | current_database -----------------+------------------ mon_utilisateur | ma_base (et avec un mauvais mot de passe : « FATAL: password authentication failed for user "mon_utilisateur" »)
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"current_user | current_database -----------------+------------------ mon_utilisateur | ma_base (avec un mauvais mot de passe : « FATAL: password authentication failed for user ». Et un autre compte du serveur qui tenterait psql -U postgres reçoit maintenant « FATAL: Peer authentication failed for user "postgres" »)
7Sauvegarder et restaurer
pg_dump écrit une base entière dans un fichier de texte. La restauration relit ce fichier dans une base vide : on la recrée d'abord, avec le même propriétaire.
sudo -u postgres pg_dump ma_base > ma_base.sql
ls -l ma_base.sql-rw-r--r-- 1 root root 1400 ... ma_base.sql
sudo -u postgres psql -c 'DROP DATABASE ma_base;' -c 'CREATE DATABASE ma_base OWNER mon_utilisateur;'
sudo -u postgres psql -d ma_base < ma_base.sqlDROP DATABASE CREATE DATABASE ... (vérifiez avec sudo -u postgres psql -d ma_base -c '\dt')
Pour une sauvegarde chaque nuit, mettez la première commande dans un script et planifiez-le : le tutoriel Configurer les tâches cron montre comment.
8Régler la mémoire
Deux réglages comptent : shared_buffers, la mémoire que PostgreSQL garde pour les données (environ le quart de la RAM), et effective_cache_size, ce qu'il suppose disponible en cache (environ la moitié). Ajoutez-les dans un fichier à part, que PostgreSQL lit après sa configuration principale, puis redémarrez.
CONF=$(sudo -u postgres psql -t -A -c 'SHOW config_file;')
cat > "$(dirname $CONF)/conf.d/90-reglages.conf" << 'EOF'
shared_buffers = 1GB
effective_cache_size = 2GB
work_mem = 32MB
maintenance_work_mem = 256MB
EOF
systemctl restart postgresqlcat >> /var/lib/pgsql/data/postgresql.conf << 'EOF'
shared_buffers = 1GB
effective_cache_size = 2GB
work_mem = 32MB
maintenance_work_mem = 256MB
EOF
systemctl restart postgresqlcat >> /var/lib/pgsql/data/postgresql.conf << 'EOF'
shared_buffers = 1GB
effective_cache_size = 2GB
work_mem = 32MB
maintenance_work_mem = 256MB
EOF
systemctl restart postgresqlcat >> /etc/postgresql/postgresql.conf << 'EOF'
shared_buffers = 1GB
effective_cache_size = 2GB
work_mem = 32MB
maintenance_work_mem = 256MB
EOF
rc-service postgresql restartcat >> /var/lib/pgsql/data/postgresql.conf << 'EOF'
shared_buffers = 1GB
effective_cache_size = 2GB
work_mem = 32MB
maintenance_work_mem = 256MB
EOF
systemctl restart postgresqlVérifiez avec sudo -u postgres psql -c "SHOW shared_buffers;".
Les commandes du quotidien
systemctl status postgresqlsudo -u postgres psqlsystemctl reload postgresqlsystemctl restart postgresqlsudo -u postgres pg_dump ma_base > sauvegarde.sqlsudo -u postgres psql -c '\du'systemctl status postgresqlsudo -u postgres psqlsystemctl reload postgresqlsystemctl restart postgresqlsudo -u postgres pg_dump ma_base > sauvegarde.sqlsudo -u postgres psql -c '\du'systemctl status postgresqlsudo -u postgres psqlsystemctl reload postgresqlsystemctl restart postgresqlsudo -u postgres pg_dump ma_base > sauvegarde.sqlsudo -u postgres psql -c '\du'rc-service postgresql statussudo -u postgres psqlrc-service postgresql reloadrc-service postgresql restartsudo -u postgres pg_dump ma_base > sauvegarde.sqlsudo -u postgres psql -c '\du'systemctl status postgresqlsudo -u postgres psqlsystemctl reload postgresqlsystemctl restart postgresqlsudo -u postgres pg_dump ma_base > sauvegarde.sqlsudo -u postgres psql -c '\du'PostgreSQL en service
Votre base tourne, votre application a son utilisateur et sa base, et elle se connecte avec un mot de passe qui est réellement vérifié. Vous savez sauvegarder et restaurer. Pour la brancher à un site : Installer Nginx avec PHP-FPM ou Node.js.
Erreurs fréquentes
L'image du serveur a été construite sur un autre disque et GRUB demande où se réinstaller : choisissez le disque de la machine (celui que lsblk affiche, en général /dev/sda) ; la mise à jour continue ensuite.
C'est le défaut d'AlmaLinux, Rocky, CentOS, Fedora et openSUSE : pg_hba.conf dit « ident », donc votre mot de passe n'est jamais examiné. Remplacez ident par scram-sha-256 sur les lignes 127.0.0.1/32 et ::1/128, puis rechargez (étape 6).
Vous vous connectez par la socket locale sous un autre compte que celui demandé. Avec « peer », le nom du compte système doit être le même que le nom de l'utilisateur de la base : passez par sudo -u postgres psql pour l'administrateur, ou connectez-vous par 127.0.0.1 avec un mot de passe pour votre application.
Cette fois le mot de passe est bien examiné, et il ne correspond pas. Redonnez-en un : sudo -u postgres psql -c "ALTER USER mon_utilisateur WITH PASSWORD 'NouveauMotDePasse';".
pg_hba.conf est en « trust », qui accepte tout le monde sans rien vérifier : c'est le réglage posé à l'initialisation, et l'outil vous l'a dit au passage. Appliquez la commande de l'étape 6 pour exiger un mot de passe.
C'est le paquet par défaut d'Enterprise Linux 9, et il n'est plus maintenu depuis novembre 2025. Activez un module récent avant d'installer : dnf module enable postgresql:16 (les modules 15, 16 et 18 sont proposés).
La base n'a pas été initialisée, ou le service n'est pas démarré. Sur AlmaLinux, Rocky, CentOS et Fedora il faut postgresql-setup --initdb ; sur Alpine, /etc/init.d/postgresql setup (étape 2).
PostgreSQL n'écoute que sur 127.0.0.1 par défaut. Il faut listen_addresses dans postgresql.conf, une ligne host pour l'adresse de cette machine dans pg_hba.conf, et le port 5432 ouvert pour cette adresse seulement dans le pare-feu (Configurer le pare-feu). Ne l'ouvrez jamais à 0.0.0.0/0.