Developpez.com

Club des développeurs et IT pro
Plus de 4 millions de visiteurs uniques par mois

Installer et configurer un serveur R-shiny su Ubuntu

Le , par bouye, Rédacteur/Modérateur
Shiny est un framework destiné à créer très simplement des applications web écrites en R. Cet outil est développé et distribué gratuitement par RStudio, la compagnie connue pour son éditeur R du même nom. Les dernières versions de cet éditeur disposent d'ailleurs d'un mode permettant le lancement et l’exécution local de telles apps, mais l’intérêt est, bien sûr, de les rendre disponible à plusieurs utilisateurs en les publiant sur un serveur web. RStudio propose d'ailleurs à cet effet le service shinyapps.io qui permet un tel hébergement en ligne avec des tarifs allant de l’hébergement gratuit (= fonctionnalités et capacités assez limitées) au support professionnel pour une grosse entreprise (= cher, voir très cher). Le logiciel RStudio contient également un module permettant de déployer directement une application depuis l’éditeur vers l’hébergement distant.

Cependant, la compagnie propose également le logiciel Shiny Server qui est un serveur Web et est un conteneur d'applications Shiny. Ce logiciel existe en deux versions :
  • L’édition Open Source gratuite ;
  • Et l’édition professionnelle payante (très très ... très chère). Évidement, cette version dispose de plus de fonctionnalités, telles que le support de SSL, de l'authentification ou encore la présence d'une interface web d’administration du serveur.

Nous allons nous pencher sur l'installation et la configuration de la version Open Source gratuite. Avoir un tel serveur sur un réseau interne est utile tant pour partager des outils statistiques ou scientifiques entre collaborateurs que pour vérifier si une application fonctionne correctement avant de la publier sur un hébergement extérieur.

Pour ce didacticiel, les versions des logiciels que j'ai utilisés sont :
  • Ubuntu Server 14.04 "Trusty Tahr" ;
  • R 3.2.2 "Fire Safety" ;
  • Shiny 0.12.2 ;
  • Shiny Server 1.4.0.721.


Toutes les infos que je vais reprendre ici, sont disponibles, en anglais, sur la page de Shiny Server ainsi que dans sur sa page de téléchargement et son guide d’administration.

Prérequis
Shiny Server (et sa version Pro) n'est actuellement disponible que sur Linux 64bit. Les distributions supportées par les binaires pré-compilés sont Ubuntu 12.04+ / Debian et Red Hat / CentOS 5+ ainsi que SUSE 11+. Pour les autres distributions, vous pouvez tenter de compiler le code source de Shiny Server manuellement en suivant les instructions (en anglais).

Votre machine serveur devra disposer d'assez de mémoire pour faire tourner Shiny Server ainsi que plusieurs instances de R (au moins une par connexion utilisateur par application). Vous devrez disposer d'assez d'espace de stockage pour pouvoir héberger vos applications et leurs fichiers de données ainsi que les éventuels fichiers temporaires que vous serez amenés à générer lorsque votre application tourne ; même chose si vous comptez héberger une base de données sur cette machine.

Dans mon cas, pour ces tests, j'ai déployé Ubuntu Server 14.04 dans une machine virtuelle Virtual Box. Les instructions et le gestionnaire de packages que je vais utiliser sont donc au format Debian.

Vous aurez également besoin d'une connexion Internet pour télécharger des outils additionnels pour votre distribution, R, Shiny et Shiny Server ainsi que leurs dépendances. La connexion n'est plus requise lorsque toutes les installations sont finies.

Vous pouvez en profiter pour installer tout éditeur de texte, tel que vi ou emacs, nécessaire pour modifier les fichiers de configuration système :

Code bash : Sélectionner tout
1
2
$ sudo apt-get install emacs 
$ sudo apt-get install vi

Enfin, votre serveur ou VM devra être accessible sur le réseau interne de votre entreprise ou organisation pour que vos utilisateurs puissent s'y connecter avec leur navigateur web. Les personnes qui seront amenées à uploader des applications sur le serveur devront disposer d'un compte utilisateur (qui peut être commun ou individuel).

Avertissement aux développeurs R
Votre application Shiny sera exécutée par le serveur tournant sur une machine Linux 64bit. Vous ne pouvez donc pas utiliser de module uniquement disponible dans la version 32bit de R. Cela implique également que vous ne pouvez pas utiliser dans votre code R de packages, modules ou bibliothèques ou de fonctions spécifiques à Windows ou à Mac OS X même si, dans un premier temps, vous développerez vos applications directement sur votre machine de travail avant de les déployer sur la machine hébergeant le serveur Shiny. Vous devez faire également attention à ce que vos chemins d’accès aux fichier utilisent le format UNIX ; si vous venez du monde Windows, vous devez respecter la case (minuscule / majuscule) dans le nom des fichiers et répertoires.

Installation et configuration de R
Vous devez commencer par installer R sur votre machine. En effet Shiny et Shiny Server reposent tous les deux sur R pour fonctionner. De manière à pouvoir récupérer les dernières versions de R, vous pouvez suivre les instructions disponibles sur cette page pour rajouter le dépo du CRAN dans la liste des dépos utilisés par apt-get en éditant le fichier /etc/apt/sources.list. Dans mon cas, puisque j'utilise Ubuntu "Trusty Tahr", j'ai rajouté la ligne suivante en fin de fichier :

Code : Sélectionner tout
deb http://cran.rstudio.com/bin/linux/ubuntu trusty/
Lorsque ceci est fait, vous pouvez procéder à l'installation de R de la manière suivante :

Code bash : Sélectionner tout
1
2
$ sudo apt-get update 
$ sudo apt-get install r-base

Puisque que R est désormais disponible dans votre système, vous devez y installer le package shiny. La présence de Shiny est évidement nécessaire pour que vos applications écrites dans ce format puisse s’exécuter sur le serveur. Ici, il est nécessaire de lancer R en tant que super-administrateur pour que la bibliothèque soit installée au niveau du système et non pas au niveau de votre compte utilisateur. Cela peut être fait de deux manières :

Soit directement dans R, en lançant :

Code bash : Sélectionner tout
$ sudo R

Puis, dans R :

Code R : Sélectionner tout
> install.packages('shiny', repos='https://cran.rstudio.com/')

Soit, directement via la ligne de commande, en faisant :

Code bash : Sélectionner tout
$ sudo su - -c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""

Je vous suggère également d'installer le package rmarkdown qui est nécessaire à l’exécution d'une des applications de test livrée avec le serveur.

Code bash : Sélectionner tout
$ sudo su - -c "R -e \"install.packages('rmarkdown')\""

Vous pouvez procéder de manière identique pour tous les packages, modules ou bibliothèques R que vous jugerez bon d'installer sur votre serveur. Ces packages seront disponibles pour tous les comptes utilisateurs puisque installés au niveau du système. Plus tard nous allons configurer Shiny Server pour qu'il permette de lancer des applications hébergées dans les répertoires home des utilisateurs ; dans ce cas les utilisateurs pourront eux-mêmes installer, via R, les bibliothèques manquantes sur leur compte et elles seront utilisées par leurs applications en complément de celles déjà présentes sur le système.

Installation de Shiny Server
Vous devez tout d'abord installer installer l'utilitaire gdebi qui permet d'installer des packages locaux (apt fonctionne avec des packages distants) :

Code bash : Sélectionner tout
$ sudo apt-get install gdebi-core

Pour vous allez récupérer et installer la dernière version de Shiny Server depuis les serveurs de stockage de RStudio :

Code Java : Sélectionner tout
1
2
$ wget https://download3.rstudio.org/ubuntu-12.04/x86_64/shiny-server-1.4.0.721-amd64.deb 
$ sudo gdebi shiny-server-1.4.0.721-amd64.deb

Vous pouvez procéder de manière identique si vous voulez mettre à jour une installation préexistante du logiciel. Vous pouvez vous référer aux instructions disponibles sur la page des téléchargements de Shiny Server pour connaitre l'URL de stockage de la version la plus récente.

Configuration de Shiny Server
Voilà, Shiny Server est désormais installé sur votre machine dans /opt/shiny-server. Un utilisateur shiny a également été ajouté ; c'est sous cet utilisateur que tourneront, par défaut, les processus générés lors des connections au serveur web. Des scripts ont été installés aux endroits appropriés pour démarrer et stopper le serveur ; vous pouvez donc lancer le serveur en faisant :

Code bash : Sélectionner tout
$ sudo service shiny-server start

Le fichier de configuration du service est situé dans /etc/shiny-server/shiny-server.conf. Par défaut, il devrait être équivalent à :

Code conf : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Instruct Shiny Server to run applications as the user "shiny" 
run_as shiny; 
 
# Define a server that listens on port 3838 
server { 
  listen 3838; 
 
  # Define a location at the base URL 
  location / { 
 
    # Host the directory of Shiny Apps stored in this directory 
    site_dir /srv/shiny-server; 
 
    # Log all Shiny output to files in this directory 
    log_dir /var/log/shiny-server; 
 
    # When a user visits the base URL rather than a particular application,  
    # an index of the applications available in this directory will be shown. 
    directory_index on; 
  } 
}

  • La ligne #2 indique que les applications seront lancées par défaut sous l'utilisateur shiny ;
  • La ligne #5 définit un serveur Shiny. Il est possible de définir plusieurs serveurs tournant sur des ports différents et accédant à des emplacements différents ;
  • La ligne #6 indique sur quel port tourne ce serveur ;
  • La ligne #9 défini un emplacement sur ce serveur, ici la racine / du site. On peut définir plusieurs autres emplacements ou même des sous-emplacements inclus les uns dans les autres. Chaque emplacement peut avoir son propre jeu de définitions de permission, d'emplacements de fichiers ou simplement hériter directement ceux de son parent ;
  • La ligne #12 indique que les fichiers de cet emplacement sont stockés sur le système dans /srv/shiny-server/ ;
  • La ligne #15 indique que les fichiers logs de cet emplacement sont stockés sur le système dans /var/log/shiny-server/ ;
  • La ligne #19 indique enfin que le contenu du répertoire sera affiché dans le navigateur s'il ne contient pas d'application Shiny ou de fichier index.html. Utile pour déboguer, voir rapidement toutes les applications ou faire des tests en environnements de développement. À désactiver en environnement de production.


Ainsi, si vous ouvrez votre navigateur web sur http://<nom ou adresse IP de votre machine serveur>:3838/, vous devriez voir une page de tests d'application Shiny :


Cette page contient deux applications Shiny ; celle du bas n'apparaitra que si vous avez installé le package rmarkdown dans R sur votre serveur.

En tant que super-administrateur, vous pouvez désormais ajouter des sous-répertoires dans /srv/shiny-server dans lesquels vous pouvez recopier les fichiers server.R et ui.R (et tout autre fichier nécessaire) de votre application que vous aurez transféré sur le serveur par scp, sftp ou FilleZilla, etc.

Par exemple :

Code bash : Sélectionner tout
1
2
3
4
$ cd /srv/shiny-server/ 
$ sudo mkdir myapp 
$ sudo cp ~/server.R ./myapp/ 
$ sudo cp ~/ui.R ./myapp/

Et voilà ! Si désormais vous pointez votre navigateur en spécifiant /myapp/ comme sous-emplacement sur le serveur (ex : http://<nom ou adresse IP de votre machine serveur>:3838/myapp/), vous devriez voir s'afficher dans votre navigateur la web app Shiny que vous venez de placer sur la machine serveur.

Configuration pour plusieurs utilisateurs
OK, tout cela est bien sympathique mais cette configuration a plusieurs défaut :
  • Seul quelqu'un disposant d'un accès super-utilisateur peut recopier les fichiers des applications sur /srv/shiny-server ;
  • Pire : seul quelqu'un disposant d'un accès super-utilisateur peut ajouter des modules, packages et bibliothèques manquants dans R.


Autrement dit, tout le monde va vous demander de le faire pour eux. Nous allons donc modifier la configuration de notre serveur pour permettre l’exécution d'applications situées dans les répertoires des utilisateurs.

En mode super-utilisateur, ouvrez le fichier /etc/shiny-server/shiny-server.conf dans votre editeur de texte favori (vi, emacs, etc.) et, dans l'unique bloc server existant, ajoutez une nouvelle configuration de sous-emplacement :

Code conf : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
server { 
 
[...] 
 
  location /users { 
    run_as :HOME_USER:; 
    user_dirs; 
    members_of shinyUsers; 
    directory_index on; 
  } 
}

  • La ligne #5 défini un nouveau sous-emplacement sur le serveur ;
  • La ligne #6 indique qu'une application lancée depuis le répertoire home de l'utilisateur untel tournera sous cet utilisateur au lieu de l'utilisateur shiny par défaut.
  • La ligne #7 indique que Shiny Server doit désormais chercher des applications Shiny dans le répertoire ShinyApps/ de chaque utilisateur (ex : /home/<nom d'utilisateur/ShinyApps/).
  • La ligne #8 indique que seuls les utilisateurs étant membres du groupe système shinyUsers sont concernés.
  • La ligne #9 indique enfin que le contenu du répertoire sera affiché dans le navigateur s'il ne contient pas d'application Shiny ou de fichier index.html.


Vous devez maintenant redemarrer Shiny Server :

Code bash : Sélectionner tout
1
2
$ sudo service shiny-server stop 
$ sudo service shiny-server start

Si le serveur ne démarre pas, c'est probablement que vous avez faire une faute de frappe dans le fichier de configuration. Vous pouvez tenter de le lancer manuellement en faisant :

Code bash : Sélectionner tout
$ sudo shiny-server

Ce qui devrait vous fournir un message d'erreur plus précis. Cela vous permettra de corriger votre erreur avant que vous ne relanciez Shiny Server pour de bon en tant que service / daemon.

Il ne nous reste plus qu'à ajouter un groupe shinyUsers sur la machine et à inclure dans ce groupe les utilisateurs qui sont autorisés à poster des applications Shiny sur le serveur :

Code bash : Sélectionner tout
1
2
$ sudo groupadd shinyUsers 
$ sudo usermod -G shinyUsers toto

Désormais l'utilisateur toto fait partie du groupe shinyUsers. Il peut donc lui-même transférer les fichiers des applications Shiny sur son compte sur le serveur via par scp, sftp ou FilleZilla, etc. et de recopier ces fichiers dans /home/toto/ShinyApps/ ou un de ses sous-répertoire. Ses applications sont accessibles automatiquement via l'URL http://<nom ou adresse IP de votre machine serveur>:3838/users/toto/. Il en sera de même si vous effectuez à nouveau cette manœuvre avec un autre utilisateur.

De plus, si l'application de l'utilisateur toto requiert un package, une bibliothèque ou un module additionnel dans R, cet utilisateur peut directement se connecter sur son compte via SSH, lancer R et installer le module manquant. Le module sera alors installé dans son répertoire utilisateur et deviendra disponible pour les applications Shiny de ce compte. Chaque utilisateur peut donc désormais avoir son propre jeu de modules pour ses propre applications et ce indépendamment de ceux des autres.

Les mises à jour de Shiny Server, Shiny et R resteront, bien sûr, à la charge du super-utilisateur.

Conclusion
Voilà, notre bref tour d'horizon de l'installation et de la configuration de Shiny Server arrive à sa fin. Vous avez désormais un environnement simple à disposition pour permettre à vos statisticiens ou à vos scientifique de rapidement poster et tester et surtout de partager sur votre réseau interne les outils web graphiques qu'ils développeront avec Shiny en R.


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :
Offres d'emploi IT
Ingénieur système de commande de vol H/F
Safran - Ile de France - Massy (91300)
Responsable de projet logiciel H/F
Safran - Ile de France - Éragny (95610)
Ingénieur produit (Landing gear) H/F
Safran - Ile de France - MASSY Hussenot

Voir plus d'offres Voir la carte des offres IT
Responsable bénévole de la rubrique R : djibril -