Installer PostgreSQL 9.3 sur Raspberry Pi Raspbian

lundi 30 juin 2014
par  Finizi
popularité : 24%

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.


PostgreSQL database

 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.


RaspberryPi

 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.


Installer PostgreSQL

 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.


Paramètres de PostgreSQL

 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

Mise en réseau

 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)

  1. listen_addresses = '*'

Décommenter la ligne suivante (enlever le « # » du début) :

  1. 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 :

  1. # allow management IP
  2. 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)

  1. # "local" is for Unix domain socket connections only
  2. 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 :

  1. # MAPNAME       SYSTEM-USERNAME         PG-USERNAME
  2. devmap          devpi                   devpi
  3. devmap          devpi                   appli
  4. devmap          root                    appli
  5. devmap          root                    devpi

Power On

 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 :

  1. #! /bin/sh
  2. # chkconfig: 2345 98 02
  3. # description: PostgreSQL RDBMS
  4. # This is an example of a start/stop script for SysV-style init, such
  5. # as is used on Linux systems.  You should edit some of the variables
  6. # and maybe the 'echo' commands.
  7. #
  8. # Place this file at /etc/init.d/postgresql (or
  9. # /etc/rc.d/init.d/postgresql) and make symlinks to
  10. #   /etc/rc.d/rc0.d/K02postgresql
  11. #   /etc/rc.d/rc1.d/K02postgresql
  12. #   /etc/rc.d/rc2.d/K02postgresql
  13. #   /etc/rc.d/rc3.d/S98postgresql
  14. #   /etc/rc.d/rc4.d/S98postgresql
  15. #   /etc/rc.d/rc5.d/S98postgresql
  16. # Or, if you have chkconfig, simply:
  17. # chkconfig --add postgresql
  18. #
  19. # Proper init scripts on Linux systems normally require setting lock
  20. # and pid files under /var/run as well as reacting to network
  21. # settings, so you should treat this with care.
  22. # Original author:  Ryan Kirkpatrick <pgsql@rkirkpat.net>
  23. # contrib/start-scripts/linux
  24. ## EDIT FROM HERE
  25. # Installation prefix
  26. prefix=/usr/local/pgsql
  27. # Data directory
  28. PGDATA="/usr/local/pgsql/data"
  29. # Who to run the postmaster as, usually "postgres".  (NOT "root")
  30. PGUSER=postgres
  31. # Where to keep a log file
  32. PGLOG="$PGDATA/serverlog"
  33. # It's often a good idea to protect the postmaster from being killed by the
  34. # OOM killer (which will tend to preferentially kill the postmaster because
  35. # of the way it accounts for shared memory).  Setting the OOM_SCORE_ADJ value
  36. # to -1000 will disable OOM kill altogether.  If you enable this, you probably
  37. # want to compile PostgreSQL with "-DLINUX_OOM_SCORE_ADJ=0", so that
  38. # individual backends can still be killed by the OOM killer.
  39. #OOM_SCORE_ADJ=-1000
  40. # Older Linux kernels may not have /proc/self/oom_score_adj, but instead
  41. # /proc/self/oom_adj, which works similarly except the disable value is -17.
  42. # For such a system, enable this and compile with "-DLINUX_OOM_ADJ=0".
  43. #OOM_ADJ=-17
  44. ## STOP EDITING HERE
  45. # The path that is to be used for the script
  46. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  47. # What to use to start up the postmaster.  (If you want the script to wait
  48. # until the server has started, you could use "pg_ctl start -w" here.
  49. # But without -w, pg_ctl adds no value.)
  50. DAEMON="$prefix/bin/postmaster"
  51. # What to use to shut down the postmaster
  52. PGCTL="$prefix/bin/pg_ctl"
  53. set -e
  54. # Only start if we can find the postmaster.
  55. test -x $DAEMON ||
  56. {
  57.         echo "$DAEMON not found"
  58.         if [ "$1" = "stop" ]
  59.         then exit 0
  60.         else exit 5
  61.         fi
  62. }
  63. # Parse command line parameters.
  64. case $1 in
  65.   start)
  66.         echo -n "Starting PostgreSQL: "
  67.         test x"$OOM_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
  68.         test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
  69.         su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
  70.         echo "ok"
  71.         ;;
  72.   stop)
  73.         echo -n "Stopping PostgreSQL: "
  74.         su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast"
  75.         echo "ok"
  76.         ;;
  77.   restart)
  78.         echo -n "Restarting PostgreSQL: "
  79.         su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"
  80.         test x"$OOM_SCORE_ADJ" != x && echo "$OOM_SCORE_ADJ" > /proc/self/oom_score_adj
  81.         test x"$OOM_ADJ" != x && echo "$OOM_ADJ" > /proc/self/oom_adj
  82.         su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
  83.         echo "ok"
  84.         ;;
  85.   reload)
  86.         echo -n "Reload PostgreSQL: "
  87.         su - $PGUSER -c "$PGCTL reload -D '$PGDATA' -s"
  88.         echo "ok"
  89.         ;;
  90.   status)
  91.         su - $PGUSER -c "$PGCTL status -D '$PGDATA'"
  92.         ;;
  93.   *)
  94.         # Print help
  95.         echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2
  96.         exit 1
  97.         ;;
  98. esac
  99. 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

pgAdmin III

 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

Logo de giova
jeudi 13 août 2015 à 01h28 - par  giova

Merci pour cet exelent tuto, je l’ai suivi pour installer la version 9.4.4 sans aucun soucis.

Je suis donc bon pour m’attaquer à encore plus lourd : mono et entity framework 6 ;)

Et il ne me restera plus qu’à apprendre comment gérer les mises à jour d’une appli compilée (postgresql) sous raspbian :D

Navigation

Articles de la rubrique