Ceci est une ancienne révision du document !
Installer un serveur PostgreSQL
C'est un serveur de base de données dont vous aurez certainement besoin pour alimenter vos sites web et applications.
Préparez databases/postgresql15-server dans vos poudrières. Dans l'exemple qui suit popeye est l'hôte et pg est la jail.
Préparez une Jail
Construisez une jail nommée pg dans /jails/pg
pour accueillir votre serveur de bases de données.
Adaptez la configuration de la jail pg :
- pg/etc/rc.conf.local
hostname="pg"
- /etc/jail.conf
pg { host.hostname = pg; ip4.addr = "lo1|192.168.0.10";# Adresse IP à attribuer. path ="/jails/pg"; # où est-elle ? mount.devfs; # postgresql a besoin de /dev/null # allow.sysvipc=1; # preferez la ligne qui suit sysvshm=inherit; # postgresql va monter des shm exec.start = "/bin/sh /etc/rc"; exec.stop = "/bin/sh /etc/rc.shutdown"; }
Notez que postgresql réclame quelques réglages pour une jail:
mount.devfs
, en fait l'installation de postgresql n'a besoin que de/dev/null
. C'est le moyen le plus rapide de l'avoir.sysvshm=inherit
ouallow.sysvipc=1
, postgresql doit pouvoir allouer une shared memory SYSV pour fonctionner,sysvipc
va ouvrir d'autres IPC que shm.
root@popeye:# ifconfig lo1 create root@popeye:# jail -c pg root@popeye:# root@popeye:# pkg -j pg install databases/postgresql15-server
Pour que l'interface réseau soit créée au démarrage:
root@popeye:# sysrc cloned_interfaces+="lo1"
Ainsi que la jail:
root@popeye:# sysrc jail_enable="YES" root@popeye:# sysrc jail_list+="pg"
Préparation
Depuis la jail, initialisez postgresql:
root@popeye:# jexec pg root@pg:# /usr/local/etc/rc.d/postgresql oneinitdb
Vous allez probablement permettre à l'hôte voire d'autre jail de communiquer avec votre serveur, autorisez le à écouter tout le monde:
- /var/db/postgres/data15/postgresql.conf
listen_addresses = '*'
Affinez le contrôle en autorisant tout va transiter par l’hôte:
- /var/db/postgres/data15//pg_hba.conf
host all all 192.168.0.1/24 trust
root@pg:# service postgresql onestart 2020-04-11 13:54:50.404 UTC [19008] LOG: listening on IPv4 address "0.0.0.0", port 5432 2020-04-11 13:54:50.421 UTC [19008] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432" 2020-04-11 13:54:50.444 UTC [19008] LOG: ending log output to stderr 2020-04-11 13:54:50.444 UTC [19008] HINT: Future log output will go to log destination "syslog".
changez le mot de passe administrateur du serveur de base de données:
root@popeye:#jexec pg root@pg:# su - postgres $ psql psql (11.7) Type "help" for help. postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) postgres=# \password postgres Enter new password: Enter it again: postgres=# \q
Voire de le lancer au démarrage de la jail:
root@popeye:#sysrc -j pg postgresql_enable="YES"
Vous pouvez maintenant démarrer le serveur de base de données:
root@popeye:#service -j pg postgresql start
Tests
Est-ce que le serveur est à l'écoute ?
root@popeye# jexec pg sockstat -l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS postgres postgres 36299 3 tcp4 192.168.0.10:5432 *:* postgres postgres 36299 5 stream /tmp/.s.PGSQL.5432 root syslogd 99367 5 dgram /var/run/log root syslogd 99367 6 dgram /var/run/logpriv
Essayons, depuis l'hôte:
root@popeye# telnet 192.168.0.10 5432 Trying 192.168.0.10... Connected to 192.168.0.10. Escape character is '^]'.
A l'aide du client databases/postgresql15-client
root@popeye# pg_isready --host=192.168.0.10 192.168.0.10:5432 - accepting connections
root@popeye# psql -U postgres --host=192.168.0.10 -W Password: psql (11.7) Type "help" for help. postgres-# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) postgres-# \q
Socket unix
Vous avez noté la ligne de sockstat(1):
postgres postgres 36299 5 stream /tmp/.s.PGSQL.5432
Cela signifie que vous pouvez communiquer avec la serveur via une socket(2) unix.
Vous n'avez même pas besoin de configuration réseau pour communiquer avec cette jail:
root@popeye:# psql -U postgres --host=/jails/pg/tmp/ -W Password: psql (11.7) postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+-------+----------------------- postgres | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres (3 rows) postgres=# \q
disable
à ip4
et ip6
de votre jail et l'isoler ainsi complètement du réseau.
Mettre à jour
Créer un répertoire pg_oldbin
et y sauvegarder tout ce qui conserver postgresql dans /usr/local/bin
Connectez vous à la base:
# su - postgres # pg_dumpall
Mettre à jour, puis
# su - postgres # mv <pg_data> <pgdata_old> # mkdir <data-folder> # initdb pgdata # pg_update -b pg_oldbin -d pgdata_old -D pgdata