Installer PostgreSQL sur Linux (Ubuntu, Debian, AlmaLinux)

Tutoriels Linux › Bases de données

Documentation / Tutoriels Linux / Bases de données / Installer PostgreSQL sur Linux (Ubuntu, Debian, AlmaLinux)
Mis à jour le 08/10/2026
575 vues
Intermédiaire
20 minutes

Prérequis

Votre serveur :

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

Mettre à jour le système
apt update && apt upgrade -y
Résultat attendu
...
212 upgraded, 8 newly installed, 0 to remove and 4 not upgraded.
(les nombres dépendent de l'âge de l'image)
Mettre à jour le système
dnf upgrade -y
Résultat attendu
...
Complete!
Mettre à jour le système
dnf upgrade -y
Résultat attendu
...
Complete!
Mettre à jour le système, puis redémarrer
apk update && apk upgrade && reboot
Résultat attendu
...
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.

Mettre à jour le système
zypper -n refresh && zypper -n update
Résultat attendu
All repositories have been refreshed.
...

2Installer PostgreSQL

Votre système fournit PostgreSQL, il n'y a pas de dépôt à ajouter.

Installer PostgreSQL
apt install -y postgresql postgresql-client
Résultat attendu
...
Setting up postgresql-16 ...
(le paquet crée la base et démarre le service tout seul)
AlmaLinux / Rocky / CentOSActiver PostgreSQL 16, installer, initialiser et démarrer
dnf module enable postgresql:16 -y && dnf install -y postgresql-server postgresql
postgresql-setup --initdb
systemctl enable --now postgresql
Résultat attendu
...
 * 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)
FedoraInstaller, initialiser et démarrer
dnf install -y postgresql-server postgresql
postgresql-setup --initdb
systemctl enable --now postgresql
Résultat attendu
...
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Created symlink '/etc/systemd/system/multi-user.target.wants/postgresql.service' → ...
AlpineInstaller, initialiser et démarrer
apk add postgresql postgresql-client
/etc/init.d/postgresql setup
rc-update add postgresql default && rc-service postgresql start
Résultat attendu
...
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)
Installer et démarrer
zypper -n install postgresql-server postgresql && systemctl enable --now postgresql
Résultat attendu
...
Created symlink '/etc/systemd/system/multi-user.target.wants/postgresql.service' → ...
(openSUSE initialise la base au premier démarrage)
Vérifier la version et le service
psql --version && systemctl is-active postgresql
Résultat attendu
psql (PostgreSQL) 16.15 (Ubuntu 16.15-0ubuntu0.24.04.1)
active
(Debian 13 : PostgreSQL 17.11)
Vérifier la version et le service
psql --version && systemctl is-active postgresql
Résultat attendu
psql (PostgreSQL) 16.15
active
(CentOS Stream 9 : 16.8)
Vérifier la version et le service
psql --version && systemctl is-active postgresql
Résultat attendu
psql (PostgreSQL) 18.6
active
Vérifier la version et le service
psql --version && rc-service postgresql status
Résultat attendu
psql (PostgreSQL) 18.6
 * status: started
Vérifier la version et le service
psql --version && systemctl is-active postgresql
Résultat attendu
psql (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.

Ouvrir la console SQL
sudo -u postgres psql
Résultat attendu
psql (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).

Créer l'utilisateur et sa base
CREATE USER mon_utilisateur WITH PASSWORD 'MotDePasseSolide';
CREATE DATABASE ma_base OWNER mon_utilisateur;
Résultat attendu
CREATE ROLE
CREATE DATABASE
(propriétaire de la base, il pourra y créer ses tables sans droits supplémentaires)
Vérifier, puis quitter la console
\l
\q
Résultat attendu
   Name    |     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 :

Demander au serveur où sont ses fichiers
sudo -u postgres psql -c 'SHOW data_directory;' -c 'SHOW config_file;' -c 'SHOW hba_file;'
Résultat attendu
     data_directory
--------------------------
 /var/lib/postgresql/16/main

         config_file
-------------------------------------
 /etc/postgresql/16/main/postgresql.conf

          hba_file
-----------------------------------
 /etc/postgresql/16/main/pg_hba.conf

Les 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.

Voir ce que votre pg_hba.conf autorise
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'
Résultat attendu
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)
Voir ce que votre pg_hba.conf autorise
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'
Résultat attendu
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)
Voir ce que votre pg_hba.conf autorise
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'
Résultat attendu
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)
Voir ce que votre pg_hba.conf autorise
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'
Résultat attendu
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)
Voir ce que votre pg_hba.conf autorise
sudo -u postgres psql -t -A -c 'SHOW hba_file;' | xargs grep -vE '^#|^$'
Résultat attendu
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)
Tester la connexion de votre application
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"
Résultat attendu
 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)
Tester la connexion de votre application
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"
Résultat attendu
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)
Tester la connexion de votre application
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"
Résultat attendu
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)
Tester la connexion de votre application
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"
Résultat attendu
 current_user    | current_database
-----------------+------------------
 mon_utilisateur | ma_base
(ça marche... mais lisez l'encadré ci-dessous avant de vous en réjouir)
Tester la connexion de votre application
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"
Résultat attendu
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.

AlmaLinux / Rocky / CentOSExiger le mot de passe, puis recharger
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
Résultat attendu
(aucune sortie : la modification est faite et PostgreSQL a relu son fichier)
FedoraExiger le mot de passe, puis recharger
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
Résultat attendu
(aucune sortie : la modification est faite et PostgreSQL a relu son fichier)
openSUSEExiger le mot de passe, puis recharger
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
Résultat attendu
(aucune sortie : la modification est faite et PostgreSQL a relu son fichier)
AlpineExiger le mot de passe, fermer l'accès local, puis recharger
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
Résultat attendu
 * Reloading PostgreSQL 18 configuration ... [ ok ]
Vérifier que le mot de passe est maintenant exigé
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"
Résultat attendu
 current_user    | current_database
-----------------+------------------
 mon_utilisateur | ma_base
(et avec un mauvais mot de passe : « FATAL:  password authentication failed for user "mon_utilisateur" »)
Vérifier que le mot de passe est maintenant exigé
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"
Résultat attendu
 current_user    | current_database
-----------------+------------------
 mon_utilisateur | ma_base
(et avec un mauvais mot de passe : « FATAL:  password authentication failed for user "mon_utilisateur" »)
Vérifier que le mot de passe est maintenant exigé
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"
Résultat attendu
 current_user    | current_database
-----------------+------------------
 mon_utilisateur | ma_base
(et avec un mauvais mot de passe : « FATAL:  password authentication failed for user "mon_utilisateur" »)
Vérifier que le mot de passe est maintenant exigé
PGPASSWORD=MotDePasseSolide psql -h 127.0.0.1 -U mon_utilisateur -d ma_base -c "SELECT current_user, current_database();"
Résultat attendu
 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.

Sauvegarder une base
sudo -u postgres pg_dump ma_base > ma_base.sql
ls -l ma_base.sql
Résultat attendu
-rw-r--r-- 1 root root 1400 ... ma_base.sql
Restaurer une base
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.sql
Résultat attendu
DROP 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.

Ubuntu / DebianRégler la mémoire (exemple pour 4 Go de RAM) et redémarrer
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 postgresql
AlmaLinux / Rocky / CentOSRégler la mémoire (exemple pour 4 Go de RAM) et redémarrer
cat >> /var/lib/pgsql/data/postgresql.conf << 'EOF'
shared_buffers = 1GB
effective_cache_size = 2GB
work_mem = 32MB
maintenance_work_mem = 256MB
EOF
systemctl restart postgresql
FedoraRégler la mémoire (exemple pour 4 Go de RAM) et redémarrer
cat >> /var/lib/pgsql/data/postgresql.conf << 'EOF'
shared_buffers = 1GB
effective_cache_size = 2GB
work_mem = 32MB
maintenance_work_mem = 256MB
EOF
systemctl restart postgresql
AlpineRégler la mémoire (exemple pour 4 Go de RAM) et redémarrer
cat >> /etc/postgresql/postgresql.conf << 'EOF'
shared_buffers = 1GB
effective_cache_size = 2GB
work_mem = 32MB
maintenance_work_mem = 256MB
EOF
rc-service postgresql restart
openSUSERégler la mémoire (exemple pour 4 Go de RAM) et redémarrer
cat >> /var/lib/pgsql/data/postgresql.conf << 'EOF'
shared_buffers = 1GB
effective_cache_size = 2GB
work_mem = 32MB
maintenance_work_mem = 256MB
EOF
systemctl restart postgresql

Vérifiez avec sudo -u postgres psql -c "SHOW shared_buffers;".

Les commandes du quotidien

État du service PostgreSQL
systemctl status postgresql
Ouvrir la console SQL en administrateur
sudo -u postgres psql
Recharger après un changement de pg_hba.conf
systemctl reload postgresql
Redémarrer après un changement de postgresql.conf
systemctl restart postgresql
Sauvegarder une base dans un fichier
sudo -u postgres pg_dump ma_base > sauvegarde.sql
Lister les utilisateurs et leurs droits
sudo -u postgres psql -c '\du'
État du service PostgreSQL
systemctl status postgresql
Ouvrir la console SQL en administrateur
sudo -u postgres psql
Recharger après un changement de pg_hba.conf
systemctl reload postgresql
Redémarrer après un changement de postgresql.conf
systemctl restart postgresql
Sauvegarder une base dans un fichier
sudo -u postgres pg_dump ma_base > sauvegarde.sql
Lister les utilisateurs et leurs droits
sudo -u postgres psql -c '\du'
État du service PostgreSQL
systemctl status postgresql
Ouvrir la console SQL en administrateur
sudo -u postgres psql
Recharger après un changement de pg_hba.conf
systemctl reload postgresql
Redémarrer après un changement de postgresql.conf
systemctl restart postgresql
Sauvegarder une base dans un fichier
sudo -u postgres pg_dump ma_base > sauvegarde.sql
Lister les utilisateurs et leurs droits
sudo -u postgres psql -c '\du'
État du service PostgreSQL
rc-service postgresql status
Ouvrir la console SQL en administrateur
sudo -u postgres psql
Recharger après un changement de pg_hba.conf
rc-service postgresql reload
Redémarrer après un changement de postgresql.conf
rc-service postgresql restart
Sauvegarder une base dans un fichier
sudo -u postgres pg_dump ma_base > sauvegarde.sql
Lister les utilisateurs et leurs droits
sudo -u postgres psql -c '\du'
État du service PostgreSQL
systemctl status postgresql
Ouvrir la console SQL en administrateur
sudo -u postgres psql
Recharger après un changement de pg_hba.conf
systemctl reload postgresql
Redémarrer après un changement de postgresql.conf
systemctl restart postgresql
Sauvegarder une base dans un fichier
sudo -u postgres pg_dump ma_base > sauvegarde.sql
Lister les utilisateurs et leurs droits
sudo -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

💬 Écrivez-nous sur Messenger !