Installer PostgreSQL 9.3 sur Raspberry Pi Raspbian
par
popularité : 29%

Afin de pouvoir enregistrer, traiter, analyser et restituer des données de data logging, l’idéal est de pouvoir utiliser une base de donnée relationnelle.
En effet, le but est de permettre aux différents appareils de l’environnement de pouvoir accéder de manière indépendante aux données, que ce soit en lecture ou en écriture, et de pouvoir appliquer automatiquement certaines transformations aux données, comme par exemple des cumuls journaliers.
Pourquoi PostgreSQL ?
Je suis donc parti à la recherche d’un logiciel de gestion de base de données relationnelle multi utilisateurs disposant impérativement d’une licence open source, et respectant au plus près le standard ANSI.
J’ai d’abord pensé à l’incontournable MySQL, mais mis hors jeu rapidement depuis son appartenance à Oracle.
Bien sur, il y a MariaDB, qui est la suite open source de MySQL. Il reste toutefois entre les mains d’une entreprise.
Et puis, j’ai découvert PostgreSQL, qui lui est là depuis 1986, qui est géré par une communauté très active, et dont les performances n’ont rien à envier aux grandes bases de données propriétaires.
De plus, la version 9.3 (la version stable à la date de rédaction de cet article) offre des fonctionnalités JSON améliorées. Ca tombe bien, JSON est justement le format de données que je compte utiliser pour faire circuler les données entre mes différents appareils.
PostgreSQL sur Raspberry Pi
J’ai d’abord testé PostgreSQL sur les systèmes Xubuntu & Debian, distributions avec lesquelles je n’ai rencontré aucun problème et qui m’ont convaincu du bien fondé du choix de PostgreSQL. Après avoir ajouter le dépôt à utiliser et préciser la clé de signature, un classique sudo apt-get install postgresql-9.3 suffit alors à l’installer.
Mais voilà , l’ensemble devant tourner 24h/24, j’ai décider d’installer PostgreSQL 9.3 sur un Raspberry Pi.
Et c’est là que les difficultés commencent...
En effet, je n’ai pas trouver de dépôt contenant les fichiers compilés pour le Raspberry Pi. Il en existe, mais pour la version 9.1, qui ne gère pas le JSON aussi facilement.
Pour installer la version 9.3 sur le Rasperry Pi, il va donc falloir compiler les sources, ce qui est moins trivial.
L’installation sur Raspberry Pi
Après quelques essais, voici la façon la moins compliquée que j’ai utilisé.
Configurer le Raspberry Pi en suivant les instructions de l’article « Raspberry Pi : Initialisation & intallation d’un serveur web léger ». Ici, j’ai utilisé la dernière version (celle de juin 2014). Pas de changement notable par rapport à l’article.
Toutes ces manipulations peuvent se faire via VNC. Plus besoin de clavier, de souris et d’écran connecter au Raspberry Pi.
Commencer par installer quelques utilitaires nécessaires à PostgreSQL. Taper :
- sudo aptitude install python-software-properties -y
- sudo aptitude install libreadline-dev libxml2-dev
- sudo aptitude update
Récupérer les sources de PostgreSQL et les décompresser. Taper :
- cd /tmp
- wget http://ftp.postgresql.org/pub/source/v9.3.4/postgresql-9.3.4.tar.gz
- tar -xzvf postgresql-9.3.4.tar.gz
On peut maintenant lacer la compilation en tapant les ordres suivants :
- cd postgresql-9.3.4
- ./configure --with-libxml
- make world
Cette phase est assez longue (1 Ã 2 heures) - su
- make install-world
Normalement, le message « PostgreSQL installation complete. » indique que l’installation s’est faite correctement.
La configuration de PostgreSQL
PostgreSQL est désormais installé, mais maintenant, il faut pouvoir l’utiliser.
Pour cela, il est impératif de créer l’utilisateur nommé « postgres ».
Taper :
- adduser postgres passwd "pg"
- mkdir /usr/local/pgsql/data
- chown postgres /usr/local/pgsql/data
- su - postgres
- /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
- /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &
Cette dernière commande lance PostgreSQL en tâche de fond.
Noter qu’il est possible de lancer PostgreSQL en avant plan en tapant : /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start . « Ctrl+C » pour l’arrêter.
L’utilisateur « postgres » est un utilisateur d’administration. Hors intervention sur la configuration, il est recommandé de ne pas l’utiliser.
Nous allons donc créer 2 autres utilisateurs postgreSQL :
- devpi qui sera utiliser en mode console pour administrer les données et le code SQL y afférent.
- appli qui sera utilisé par les différentes applications qui accéderons aux données.
Il faut aussi créer la base de données qui sera utilisée : « PiBase ». Taper :
- /usr/local/pgsql/bin/createuser -P devpi
et saisir le mot de passe, par exemple "abcd" - /usr/local/pgsql/bin/createdb -O devpi -E UTF8 PiBase
- /usr/local/pgsql/bin/createuser -P appli
et saisir le mot de passe, par exemple "ap"
Il est maintenant possible de se connecter à la base de données avec l’utilisateur « devpi » en tapant :
- /usr/local/pgsql/bin/psql -U devpi PiBase
ou plus simplement :
/usr/local/pgsql/bin/psql PiBase .
On doit voir s’afficher « plsql (9.3.4) »
Maintenant il faut permettre à l’utilsateur « appli » d’accéder aux objets de la base, taper le code SQL :
- GRANT devpi TO appli
Configuration des connexions réseau
Que ce soit pour administrer les données ou pour en ajouter ou les interroger, il sera nécessaire de pouvoir y accéder à partir d’un PC distant. Pour cela, de nouvelles configurations sont indispensables.
Ouvrir une nouvelle fenêtre de terminal.
Il est nécessaire de modifier le fichier /usr/local/pgsql/data/postgresql.conf . Taper :
- sudo geany /usr/local/pgsql/data/postgresql.conf
et ajouter la ligne suivante au dessus de la ligne "#listen_addresses = ’localho..." (vers la ligne 60)
- listen_addresses = '*'
Décommenter la ligne suivante (enlever le « # » du début) :
- port=5432
Il faut aussi autoriser toutes les adresses IP de votre réseau local à se connecter au PostgreSQL du raspberry Pi. Cela va se faire en éditant le fichier "/usr/local/pgsql/data/pg_hba.conf". Taper :
- sudo geany /usr/local/pgsql/data/pg_hba.conf
Et ajouter les lignes suivantes à la fin :
- # allow management IP
- host all all 192.168.0.1/24 md5
Evidemment, l’adresse IP est fonction de votre réseau local. Il faut remplacer "192.168.0" par les 3 premiers chiffres des adresses de votre réseau local.
Modifier aussi la ligne suivante (un peu au dessus)
- # "local" is for Unix domain socket connections only
- local all all ident map=devmap
Il faut maintenant autoriser les utilisateurs "devpi" et "appli" à se connecter à distance sur le Raspberry Pi, avec pgAdmin3 par exemple. Taper :
- sudo geany /usr/local/pgsql/data/pg_ident.conf
Et ajouter les lignes suivantes :
- # MAPNAME SYSTEM-USERNAME PG-USERNAME
- devmap devpi devpi
- devmap devpi appli
- devmap root appli
- devmap root devpi
Le démarrage automatique de PostgreSQL
Tout semble terminé. Pourtant, au prochain redémarrage du Raspberry Pi, il sera nécessaire de lancer le server via la ligne de commande, ce qui n’est pas très pratique.
Voici la marche à suivre pour remédier à cela. En fait, il faut aller chercher dans les sources le fichier « postgresql-9.1.4/contrib/start-scripts/linux /etc/init.d/postgresql ». Comme nous n’avons pas téléchargé les sources, le fichier se trouve ci-dessous. Taper :
- sudo geany
pour ouvrir un éditeur de texte.
Dans un nouveau fichier, copier le contenu suivant :
- #! /bin/sh
- # chkconfig: 2345 98 02
- # description: PostgreSQL RDBMS
- # This is an example of a start/stop script for SysV-style init, such
- # as is used on Linux systems. You should edit some of the variables
- # and maybe the 'echo' commands.
- #
- # Place this file at /etc/init.d/postgresql (or
- # /etc/rc.d/init.d/postgresql) and make symlinks to
- # /etc/rc.d/rc0.d/K02postgresql
- # /etc/rc.d/rc1.d/K02postgresql
- # /etc/rc.d/rc2.d/K02postgresql
- # /etc/rc.d/rc3.d/S98postgresql
- # /etc/rc.d/rc4.d/S98postgresql
- # /etc/rc.d/rc5.d/S98postgresql
- # Or, if you have chkconfig, simply:
- # chkconfig --add postgresql
- #
- # Proper init scripts on Linux systems normally require setting lock
- # and pid files under /var/run as well as reacting to network
- # settings, so you should treat this with care.
- # Original author: Ryan Kirkpatrick <pgsql@rkirkpat.net>
- # contrib/start-scripts/linux
- ## EDIT FROM HERE
- # Installation prefix
- prefix=/usr/local/pgsql
- # Data directory
- PGDATA="/usr/local/pgsql/data"
- # Who to run the postmaster as, usually "postgres". (NOT "root")
- PGUSER=postgres
- # Where to keep a log file
- PGLOG="$PGDATA/serverlog"
- # It's often a good idea to protect the postmaster from being killed by the
- # OOM killer (which will tend to preferentially kill the postmaster because
- # of the way it accounts for shared memory). Setting the OOM_SCORE_ADJ value
- # to -1000 will disable OOM kill altogether. If you enable this, you probably
- # want to compile PostgreSQL with "-DLINUX_OOM_SCORE_ADJ=0", so that
- # individual backends can still be killed by the OOM killer.
- #OOM_SCORE_ADJ=-1000
- # Older Linux kernels may not have /proc/self/oom_score_adj, but instead
- # /proc/self/oom_adj, which works similarly except the disable value is -17.
- # For such a system, enable this and compile with "-DLINUX_OOM_ADJ=0".
- #OOM_ADJ=-17
- ## STOP EDITING HERE
- # The path that is to be used for the script
- PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
- # What to use to start up the postmaster. (If you want the script to wait
- # until the server has started, you could use "pg_ctl start -w" here.
- # But without -w, pg_ctl adds no value.)
- DAEMON="$prefix/bin/postmaster"
- # What to use to shut down the postmaster
- PGCTL="$prefix/bin/pg_ctl"
- set -e
- # Only start if we can find the postmaster.
- test -x $DAEMON ||
- {
- echo "$DAEMON not found"
- if [ "$1" = "stop" ]
- then exit 0
- else exit 5
- fi
- }
- # Parse command line parameters.
- case $1 in
- start)
- echo -n "Starting PostgreSQL: "
- test x"$OOM_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
- test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
- su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
- echo "ok"
- ;;
- stop)
- echo -n "Stopping PostgreSQL: "
- su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast"
- echo "ok"
- ;;
- restart)
- echo -n "Restarting PostgreSQL: "
- su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"
- test x"$OOM_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
- test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
- su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
- echo "ok"
- ;;
- reload)
- echo -n "Reload PostgreSQL: "
- su - $PGUSER -c "$PGCTL reload -D '$PGDATA' -s"
- echo "ok"
- ;;
- status)
- su - $PGUSER -c "$PGCTL status -D '$PGDATA'"
- ;;
- *)
- # Print help
- echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2
- exit 1
- ;;
- esac
- exit 0
Il faut enregistrer ce nouveau fichier sous : « /etc/init.d/postgresql »
Taper ensuite :
- sudo chmod a+x /etc/init.d/postgresql
- sudo aptitude install chkconfig
- sudo chkconfig --add postgresql
Et ensuite
Maintenant, tout est en place pour pouvoir enregistrer les données.
Auparavant, il va quand même falloir définir l’architecture des données que l’on veut y enregistrer, c’est à dire créer les tables, les vue, les fonctions, ...
Pour cela, on va utiliser le logiciel pgAdmin III qui sera installer sur votre poste Linux ou Windows, et qui interviendra directement sur la base de données du Raspberry Pi.
Enfin, il restera à coder les différents clients qui vont alimenter et consulter les données. On retrouvera Python & Bottle.
Mais tout çà , c’est une autre histoire...
Commentaires forum ferme