Comment configurer Shiny Server sur Ubuntu 20.04

De Get Docs
Aller à :navigation, rechercher

L'auteur a sélectionné le Free and Open Source Fund pour recevoir un don dans le cadre du programme Write for DOnations.

Introduction

Alors que de nombreuses personnes se tournent vers le langage de programmation open source R pour les applications statistiques et graphiques, Shiny est un package R qui vous permet de convertir votre code R en pages Web interactives. Avec Shiny, vous pouvez utiliser Shiny Server (disponible à la fois dans un format open-source gratuit et dans un format professionnel payant) pour héberger et gérer des applications Shiny et des documents de démarquage R interactifs.

Dans ce didacticiel, vous allez installer et configurer Shiny et la version open source de Shiny Server sur un serveur exécutant Ubuntu 20.04. Vous installerez également un package supplémentaire pour exécuter des documents R Markdown interactifs.

Conditions préalables

Pour terminer ce tutoriel, vous aurez besoin de :

  • Un serveur Ubuntu 20.04 avec un utilisateur sudo non root et un pare-feu, que vous pouvez configurer en suivant le Guide de configuration initiale du serveur Ubuntu 20.04.
  • La dernière version de R, que vous pouvez installer à l'étape 1 de Comment installer R sur Ubuntu 20.04.
  • Nginx installé avec accès aux ports 80 et 443. Suivez Comment installer Nginx sur Ubuntu 20.04 pour installer Nginx. À l'étape 2, utilisez la commande sudo ufw allow 'Nginx Full' pour ouvrir à la fois le port 80 et le port 443 au lieu de sudo ufw allow 'Nginx HTTP', qui n'ouvre que le port 80.
  • Un nom de domaine enregistré. Ce didacticiel utilise example.com tout au long. Vous pouvez acheter un nom de domaine sur Namecheap, en obtenir un gratuitement sur Freenom ou utiliser le bureau d'enregistrement de domaine de votre choix.
  • Les deux enregistrements DNS suivants sont configurés pour votre serveur. Suivez le DNS Quickstart pour savoir comment les ajouter.
    • Un enregistrement A avec example.com pointant vers l'adresse IP publique de votre serveur.
    • Un enregistrement A avec www.example.com pointant également vers l'adresse IP publique de votre serveur.
  • Un certificat SSL Let's Encrypt pour le domaine, qui peut être installé en suivant Comment utiliser le mode autonome de Certbot pour récupérer les certificats SSL Let's Encrypt. À l'étape 2, obtenez le certificat SSL à l'aide de la commande sudo certbot --nginx -d example.com -d www.example.com au lieu de la commande certbot certonly donnée dans cet article.

Étape 1 - Installation de Shiny

Avant d'installer Shiny Server, vous devez installer le package Shiny R, qui fournit le cadre pour l'exécution des applications Web Shiny. Bien que vous puissiez installer les packages R directement à partir de R ou de la ligne de commande, cette dernière méthode est recommandée pour garantir que les packages sont installés pour tous les utilisateurs et pas seulement pour l'utilisateur qui exécute actuellement R.

Pour installer le package Shiny R à partir du référentiel officiel afin qu'il soit disponible pour tous les utilisateurs, utilisez la commande suivante :

sudo su - -c "R -e \"install.packages('shiny', repos='http://cran.rstudio.com/')\""

Avec su -, vous exécutez la commande en tant que root. Le drapeau c transmettra la commande à l'utilisateur référencé par su -. Dans ce cas, la commande entre guillemets sera passée à sudo.

Une fois terminée, la sortie indique que l'installation est terminée et identifie où trouver les packages source téléchargés :

Output...
* DONE (shiny)

The downloaded source packages are in
   ‘/tmp/RtmpPCeOoz/downloaded_packages’

Avec Shiny en place, vous pouvez installer Shiny Server et afficher son écran d'accueil par défaut dans votre navigateur.

Étape 2 - Installation de Shiny Server

Dans cette étape, vous installerez Shiny Server et ajusterez le pare-feu pour autoriser le trafic via le port sur lequel Shiny Server écoute.

La dernière version d'Ubuntu disponible au moment de la rédaction est Shiny Server 1.5.18.987. Utilisez la commande suivante pour télécharger un binaire pré-construit pour les architectures 64 bits.

wget https://download3.rstudio.org/ubuntu-18.04/x86_64/shiny-server-1.5.18.987-amd64.deb

Ensuite, utilisez la commande suivante pour vérifier l'intégrité du fichier téléchargé avec la somme de contrôle Sha256 répertoriée sur la page de téléchargement de RStudio Shiny Server :

sha256sum shiny-server-1.5.18.987-amd64.deb

Si les sommes de contrôle ne correspondent pas, téléchargez à nouveau le fichier et vérifiez son intégrité.

Shiny Server dépend de GDebi pour son installation. GDebi est un outil qui installe des packages deb locaux tout en résolvant et en installant simultanément des dépendances supplémentaires.

Mettez à jour votre liste de packages, puis installez le package gdebi-core :

sudo apt update
sudo apt install gdebi-core

Ensuite, installez Shiny Server avec la commande gdebi suivante :

sudo gdebi shiny-server-1.5.17.973-amd64.deb

Vous serez invité à confirmer l'installation :

OutputShiny Server
 Shiny Server is a server program from RStudio, Inc. that makes Shiny applications available over the web. Shiny is a web application framework for the R statistical computation language.
Do you want to install the software package? [y/N]:y

Tapez y pour confirmer que vous souhaitez installer le package.

La fin de la sortie de la commande indiquera désormais qu'un service nommé shiny-server est actif et en cours d'exécution :

Output● shiny-server.service - ShinyServer
     Loaded: loaded (/etc/systemd/system/shiny-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2022-02-06 01:37:23 UTC; 14ms ago
   Main PID: 51306 (shiny-server)
...

Utilisez la commande ss pour vérifier que shiny-server écoute sur le port 3838 :

sudo ss -plut | grep -i shiny

Les indicateurs -plut recherchent où shiny-server écoute :

  • p est l'abréviation de processus et montre les processus utilisant socket.
  • l est l'abréviation de listening et affiche les prises d'écoute.
  • Le cas échéant, u affichera les sockets UDP.
  • Le cas échéant, t affichera les prises TCP.

La sortie affichera la ligne suivante :

Outputtcp  LISTEN   0   511    *:3838    *:*   users:(("shiny-server",pid=51306,fd=18))

Lorsque vous avez confirmé que shiny-server écoute sur le port 3838, modifiez le pare-feu pour autoriser le trafic vers Shiny Server :

sudo ufw allow 3838

Visitez http://your_server_ip:3838 dans un navigateur Web pour afficher la page d'accueil par défaut de Shiny Server, qui vous souhaite la bienvenue sur Shiny Server et vous félicite pour votre installation. Vous verrez une petite boîte sur le côté droit de l'écran avec un message indiquant Une erreur s'est produite. Lorsque vous installez rmarkdown à l'étape 4, le message d'erreur sera remplacé par un Shiny Doc interactif.

REMARQUE : La règle de pare-feu autorisant le trafic via le port 3838 est temporaire. Avant de terminer les tâches de l'étape 3, pointer votre navigateur vers https://your_server_ip:3838 ne chargera rien. Après avoir terminé les tâches de l'étape 3, il ne sera plus nécessaire d'accéder au serveur Shiny via ce port. Vous supprimerez la règle de pare-feu à l'étape 5.


Vous avez maintenant installé Shiny et Shiny Server et vous écoutez sur le port 3838.

À l'étape suivante, vous configurerez un proxy inverse à l'aide de Nginx et installerez un certificat SSL pour votre domaine, ce qui vous permettra d'accéder en toute sécurité à Shiny Server sur le port 443.

Étape 3 - Sécurisation du serveur Shiny avec un proxy inverse et un certificat SSL

Dans cette étape, vous allez configurer Nginx pour transférer les demandes entrantes vers Shiny Server via WebSocket, qui est un protocole de messagerie entre les serveurs Web et les clients.

Ouvrez le fichier de configuration principal de Nginx, nginx.conf, pour le modifier :

sudo nano /etc/nginx/nginx.conf

Dans ce fichier, vous pouvez créer des variables de configuration pour tout Nginx bloc de serveur à utiliser.

À l'aide du module map de Nginx, créez des variables pour les valeurs dont WebSocket a besoin en copiant la directive suivante dans le bloc http :

/etc/nginx/nginx.conf

http {
    ...
    # Map proxy settings for RStudio
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
}

La directive map compare $http_upgrade (la valeur de l'en-tête Upgrade du client) aux conditions entre accolades. Si la valeur est une chaîne vide (), alors map crée la variable $connection_upgrade et la définit sur close. Sinon, map crée la variable $connection_upgrade et la définit sur la valeur par défaut upgrade.

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Ensuite, ouvrez le bloc serveur de votre domaine :

sudo nano /etc/nginx/sites-available/example.com

Recherchez et modifiez le bloc location pour qu'il ne contienne que les directives suivantes :

/etc/nginx/sites-available/example.com

location / {
       proxy_pass http://your_server_ip:3838;
       proxy_redirect http://your_server_ip:3838/ https://$host/;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection $connection_upgrade;
       proxy_read_timeout 20d;
   }

proxy_pass indique à Nginx de transférer les requêtes entrant à la racine de l'application du serveur Web vers l'adresse IP du serveur écoutant sur le port 3838.

proxy_redirect réécrit la chaîne entrante, http://your_server_ip:3838/, en son équivalent HTTPS sur le serveur traitant la requête. La variable $host correspond au nom d'hôte du serveur sur lequel Nginx s'exécute.

proxy_set_header redéfinit ou ajoute des champs à l'en-tête de requête transmis au serveur mandaté.

proxy_read_timeout fixe un délai de lecture d'une réponse du serveur mandaté entre deux opérations de lecture successives.

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Avant d'activer les modifications que vous venez d'apporter dans /etc/nginx/sites-available/example.com, testez le fichier pour détecter les erreurs :

sudo nginx -t 

S'il n'y a pas d'erreurs, exécutez la commande suivante pour empêcher le chargement de la page d'accueil par défaut de Nginx :

sudo unlink /etc/nginx/sites-enabled/default

Activez ensuite les modifications en exécutant cette commande :

sudo systemctl restart nginx

Vous avez maintenant sécurisé Shiny Server avec un proxy inverse et un certificat SSL. Essayez de charger https://example.com (sans spécifier d'adresse IP ni de numéro de port) pour vérifier que votre configuration fonctionne.

Ensuite, vous configurerez votre configuration pour les documents R Markdown interactifs.

Étape 4 - Hébergement de documents interactifs R Markdown

En plus d'héberger des applications Shiny, Shiny Server est utile pour héberger des documents R Markdown interactifs. Votre serveur Shiny fonctionnel peut héberger des applications Shiny, mais il ne peut pas héberger de documents R Markdown interactifs sans le package R rmarkdown. Vous pouvez installer le package rmarkdown R de la même manière que vous avez utilisé pour installer le package shiny à l'étape 1.

Utilisez la commande suivante pour installer rmarkdown :

sudo su - -c "R -e \"install.packages('rmarkdown', repos='http://cran.rstudio.com/')\""

Pour vérifier l'installation, accédez à https://example.com. L'erreur rencontrée à l'étape 2 doit maintenant être remplacée par un tracé interactif. Alternativement, vous pouvez visiter https://example.com/sample-apps/rmd/ pour voir l'intrigue complète par elle-même.

Étape 5 - Refuser l'accès public au numéro de port du serveur Shiny

À l'étape 2, vous avez créé une règle de pare-feu pour autoriser l'accès au serveur Shiny via son numéro de port. Maintenant qu'il est accessible via https://example.com, il n'est plus nécessaire de fournir un accès public à ce port. Dans cette étape, vous supprimerez cette règle de pare-feu.

Pour commencer, passez en revue toutes les règles existantes à l'aide de la commande suivante :

sudo ufw status numbered

La sortie ressemblera à ceci :

OutputStatus: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere 
[ 2] Nginx Full                 ALLOW IN    Anywhere 
[ 3] 3838                       ALLOW IN    Anywhere 
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6) 
[ 5] Nginx Full (v6)            ALLOW IN    Anywhere (v6) 
[ 6] 3838 (v6)                  ALLOW IN    Anywhere (v6) 

Les règles qui se rapportent au pare-feu de Shiny Server sont étiquetées 3838 (règles 3 et 6 dans la sortie ci-dessus). Supprimez la première règle (dans la sortie ci-dessus, règle 3) :

sudo ufw delete 3

Avec une règle supprimée de la liste, les numéros de règles changeront (dans ce cas, la règle 6 sera désormais la règle 5). Passez en revue les numéros de règle avec la commande suivante :

sudo ufw status numbered

La sortie sera similaire à la précédente :

OutputStatus: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere 
[ 2] Nginx Full                 ALLOW IN    Anywhere 
[ 3] OpenSSH (v6)               ALLOW IN    Anywhere (v6) 
[ 4] Nginx Full (v6)            ALLOW IN    Anywhere (v6) 
[ 5] 3838 (v6)                  ALLOW IN    Anywhere (v6) 

Supprimez l'autre règle 3838 (règle 5 dans la sortie ci-dessus) :

sudo ufw delete 5

Pour appliquer les modifications, rechargez le pare-feu :

sudo ufw reload

Shiny Server est toujours actif mais ne sera plus accessible au public via le numéro de port.

Conclusion

Vous disposez maintenant d'un serveur Shiny entièrement fonctionnel qui peut héberger des applications Shiny et des documents R Markdown interactifs.

Lorsque vous êtes prêt à commencer le déploiement, vous pouvez trouver le fichier de configuration de Shiny Server sur /etc/shiny-server/shiny-server.conf. Par défaut, il est configuré pour servir les applications dans le répertoire /srv/shiny-server/, ce qui signifie que toute application Shiny placée sur /srv/shiny-server/app_name sera accessible au public sur https://example.com/app_name/.

Pour en savoir plus sur la personnalisation de Shiny Server en fonction de vos besoins précis, consultez le Guide de l'administrateur de Shiny Server ou lisez les didacticiels sur rstudio.com. Pour en savoir plus sur la rédaction de documents R markdown interactifs, consultez la page R Markdown sur rstudio.com.