====== 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 [[https://www.freshports.org/databases/postgresql15-server/|databases/postgresql15-server]] dans vos [[ports:poudriere|poudrières]].
Dans l'exemple qui suit est l'hôte et est la //jail//.
===== Préparez une Jail =====
Construisez une [[jails:zfs|jail]] nommée dans ''/jails/pg'' pour accueillir votre serveur de bases de données.
Adaptez la configuration de la //jail// :
hostname="pg"
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'' ou ''allow.sysvipc=1'', //postgresql// doit pouvoir allouer une [[https://www.freebsd.org/cgi/man.cgi?query=shmget&apropos=0&sektion=2&manpath=FreeBSD+13.1-RELEASE&arch=default&format=html|shared memory SYSV]] pour fonctionner, ''sysvipc'' va ouvrir d'autres //IPC// que //shm//.
:~ ifconfig lo1 create
:~ jail -c pg
:~ pkg -j pg install databases/postgresql15-server
Pour que l'interface réseau soit créée au démarrage:
:~ sysrc cloned_interfaces+="lo1"
Ainsi que la jail:
:~ sysrc jail_enable="YES"
:~ sysrc jail_list+="pg"
===== Préparation =====
Depuis la jail, initialisez //postgresql//:
:~ jexec 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:
listen_addresses = '*'
Affinez le contrôle en autorisant tout va transiter par l’hôte:
host all all 192.168.0.1/24 trust
:~ 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:
:~ jexec pg
:~ su - postgres
$ psql
psql (13.8, server 15.0)
WARNING: psql major version 13, server major version 15.
Some psql features might not work.
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:
:~ sysrc -j pg postgresql_enable="YES"
Vous pouvez maintenant démarrer le serveur de base de données:
:~ service -j pg postgresql start
==== Extensions ====
Selon vos besoins, installez le port [[https://www.freshports.org/databases/postgresql15-contrib/|postgresql-contrib]].
Pour, par exemple, charger l'extension [[https://www.postgresql.org/docs/15/pgstatstatements.html|pg_stat_statements]]:
shared_preload_libraries = 'pg_stat_statements'
#pg_stat_statements.track = all
#pg_stat_statements.max = 10000
===== 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 [[https://www.freshports.org/databases/postgresql15-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 (13.8, server 15.0)
WARNING: psql major version 13, server major version 15.
Some psql features might not work.
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 (13.8, server 15.0)
WARNING: psql major version 13, server major version 15.
Some psql features might not work.
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
Dans ce cas, vous pouvez attribuer la valeur ''disable'' à ''ip4'' et ''ip6'' de votre jail et l'isoler ainsi complètement du réseau.
===== ZFS ======
Si vous utilisez une [[jails:zfs|jail sous ZFS]] vous pouvez améliorer les performances en paramétrant le //dataset// au mieux.
zfs get atime,compression,primarycache,recordsize,dedup,reservation zroot/JAILS/master/pg15
NAME PROPERTY VALUE SOURCE
zroot/JAILS/master/pg15 atime off inherited from zroot
zroot/JAILS/master/pg15 compression lz4 inherited from zroot
zroot/JAILS/master/pg15 primarycache metadata local
zroot/JAILS/master/pg15 recordsize 128K default
zroot/JAILS/master/pg15 dedup off inherited from zroot/JAILS/master
zroot/JAILS/master/pg15 reservation 1G local
===== Mettre à jour =====
Stoppez le service:
service postgresql stop
Sauvegarder les répertoires ''/usr/local/bin'' dans ''/usr/local/pgold''.
Connectez vous en tant qu'utilisateur ''postgre'':
su - postgres
Installez la nouvelle version puis préparer la nouvelle base de données comme indiqué dans l'article.
Demandez la migration:
su - postgres
pg_update -b /usr/local/pgold -B /usr/local/bin/ -d ./data11 -D ./data15
Une fois la migration terminée, démarrer le service et demandez un ''VACUUM ANALYZE;'' sur chaque base.
===== En savoir plus =====
* [[https://pgconfigurator.cybertec.at/|Configurator]]