Catalogue Shiny
Contexte
Le Catalogue Shiny du Mésocentre propose un accès en ligne à des applications interactives développées avec le framework R/Shiny.
Ces applications sont destinées à la visualisation, à l’analyse de données ou à la diffusion de résultats scientifiques, dans un format accessible depuis un simple navigateur web.
Les applications sont hébergées et exécutées à l’aide de ShinyProxy, une solution open source permettant de déployer des applications Shiny dans des conteneurs Docker.
Fonctionnement
ShinyProxy permet d’exposer des applications R/Shiny sous forme de conteneurs isolés.
À chaque connexion d’un utilisateur, une instance indépendante de l'application est lancée, garantissant ainsi des exécutions isolées, reproductibles et sans interférence entre utilisateurs.
Deux instances de ShinyProxy sont actuellement déployées sur le cluster Kubernetes du Mésocentre :
- Catalogue public : accessible librement, il regroupe des applications prêtes à être diffusées.
- Catalogue privé : réservé à des applications sous embargo (par exemple, en attente de publication).
L'accès nécessite un mot de passe fourni par l’équipe déposante ou le Mésocentre.
Cas d’usage
Le catalogue Shiny peut être utilisé pour :
- Diffuser des résultats de recherche de manière interactive
- Partager des visualisations avancées avec des collaborateurs ou partenaires
- Fournir un accès simplifié à des jeux de données ou des modèles
- Conserver des applications confidentielles dans un environnement sécurisé en attendant leur diffusion.
Déploiement d’une application
Pour déployer une application dans le Catalogue Shiny du Mésocentre, il est nécessaire de fournir un projet R/Shiny structuré et conteneurisé.
L'infrastructure repose sur ShinyProxy et Kubernetes, ce qui implique l'utilisation de Docker pour packager chaque application.
Pour proposer une application à héberger sur le catalogue, il faut dans un premier temps contacter l’équipe support du Mésocentre pour discuter de la faisabilité et des besoins spécifiques.
Informations à fournir lors d’une demande d’hébergement
Pour faciliter la prise en charge de votre demande, merci de bien vouloir fournir les informations suivantes (liste non exhaustive) :
- Nom et prénom du référent de l’application
- Laboratoire, unité ou équipe d’appartenance du référent
- Liste des personnes autorisées à accéder au code source de l’application
- Statut du code source : public ou privé
- Choix du catalogue : intégration au catalogue public ou privé
- Type d’application R/Shiny (visualisation, calcul, simulation, etc.)
- Description succincte de l’application et de ses fonctionnalités
- Nom souhaité pour l’application (qui sera utilisé dans l’URL d’accès)
- Veuillez éviter les caractères spéciaux
- Les espaces seront automatiquement remplacés par des tirets (« - »)
- Toute autre information pertinente à votre projet ...
Remarque importante pour les applications publiques
Le code source des applications publiques sera déposé dans le repository GitLab suivant :
https://git.mesocentre.uca.fr/mesocentre-public/k8s
Il sera organisé dans un sous-projet spécifique correspondant au laboratoire, unité ou équipe que vous aurez indiqué lors de la demande d’hébergement.
Projet Shiny attendu
Un projet minimal doit inclure :
README.md
: description courte de l'application (titre + résumé), utilisée par ShinyProxy pour la présentation.gitlab-ci.yml
: pipeline GitLab CI/CD définissant les étapes de build et de publicationDockerfile
: fichier de construction de l'image Docker de l'applicationapp/
: répertoire contenant les fichiers R de l'application (app.R
, ouui.R
+server.R
)
Structure :
my-shiny-app/
├── README.md
├── .gitlab-ci.yml
├── Dockerfile
└── app/
└── app.R
Ce type de projet est compatible avec les pipelines CI/CD utilisés au Mésocentre avec intégration continue :
- étape
build
: construction de l'image de conteneur à chaque commit (avec kaniko) - etape
production
: ajout du tag latest pour publication dans ShinyProxy (avec crane)
Bonnes pratiques de développement Shiny
Pour améliorer la qualité, la maintenabilité et l’expérience utilisateur de vos applications R/Shiny vous pouvez suivre les recommendations de la documentation du service d'hébergement du projet SK8.
Vous pouvez déjà retenir qu'il faut :
- Documenter clairement l’application dans le
README.md
avec un titre explicite et une description concise de son objectif et usage. - Ne jamais utiliser
install.packages()
directement dans le code de l’application, mettre les packages à installer dans l'imageDockerfile
- Tester la construction de l’image localement en tant que
user
(pas enroot
) avant de la pousser dans le pipeline CI/CD pour détecter rapidement les erreurs - Structurer l’application Shiny en séparant clairement
ui.R
,server.R
etglobal.R
pour faciliter la maintenance - Utiliser
validate()
pour afficher des messages d’erreur clairs et adaptés à l’utilisateur - Ajouter une page d’accueil pour contextualiser l’application et informer l’utilisateur
- Intégrer des barres de progression pour améliorer l’expérience utilisateur lors des calculs longs
- Envisager le package
{golem}
pour une architecture robuste et modulaire sur les projets complexes
Tester en local avant soumission
Avant tout déploiement, vous devez tester votre application localement, sans privilèges root
, pour vérifier son bon fonctionnement dans un conteneur :
docker build -t my-shiny-app .
docker run -p 3838:3838 my-shiny-app
http://localhost:3838
pour accèder à l'application
Exemple de projet Shiny
app.R
Voici un exemple minimal de fichier app.R
, qui constitue le cœur de l'application Shiny. Il définit à la fois l'interface utilisateur (ui
) et le serveur (server
), nécessaires pour faire tourner l'application.
library(shiny)
ui <- fluidPage(
"Hello world!"
)
server <- function(input, output, session) {
}
shinyApp(ui, server)
README.md
Voici un exemple minimal de README.md
utilisé pour décrire l'application dans l'interface ShinyProxy. Le titre et la description courte seront affichés dans le catalogue :
# Hello World Shiny App
## Description
Cette application est un exemple minimal d’une application R/Shiny déployée via Docker avec intégration continue GitLab CI/CD.
Elle permet de tester et démontrer le fonctionnement du pipeline de construction et de déploiement pour des apps Shiny hébergées dans un environnement type ShinyProxy.
.gitlab-ci.yml
Pour permettre la construction automatique de votre image Docker et son déploiement dans ShinyProxy, vous pouvez utiliser le fichier .gitlab-ci.yml
suivant :
---
stages:
- build
- production
variables:
IMAGE_TAG: $CI_COMMIT_SHORT_SHA # or $CI_COMMIT_TAG if only building on tags
container-build:
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: ['']
script:
- /kaniko/executor
--context "${CI_PROJECT_DIR}"
--dockerfile "${CI_PROJECT_DIR}/Dockerfile"
--destination "${CI_REGISTRY_IMAGE}:${IMAGE_TAG}"
container-latest:
stage: production
image:
name: gcr.io/go-containerregistry/crane:debug
entrypoint: ['']
script:
- crane auth login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
- crane tag ${CI_REGISTRY_IMAGE}:${IMAGE_TAG} latest
Dockerfile
Les packages R et les dépendances système doivent être installés au moment de la construction de l’image Docker, et non à l'exécution de l'application.
Cela permet de garantir un environnement reproductible, stable et plus rapide au lancement.
Comme ici avec ce Dockerfile de base pour une application Shiny simple :
# ref:
# - https://rocker-project.org/images/versioned/shiny.html
# - https://hub.docker.com/r/rocker/shiny-verse/tags
FROM docker.io/rocker/shiny-verse:4.2.3
ENV SYSPACKAGES="libudunits2-dev libgdal-dev libgeos-dev libpoppler-cpp-dev libpoppler-glib-dev libglpk-dev"
# Installation des packages système
RUN apt-get update \
&& apt-get install --no-install-recommends -y $SYSPACKAGES \
&& rm -rf /var/lib/apt/lists/*
## Ajout de package R
ENV RPACKAGES="rgdal shiny tidyverse"
# Installation des packages R depuis CRAN
RUN install2.r --ncpus 2 --error --deps TRUE $RPACKAGES && rm -rf /tmp/*
# Copie du code de l'application dans le conteneur
RUN rm -rf /srv/shiny-server/
COPY app/ /srv/shiny-server/
Lorsque les packages R ne sont pas disponibles sur CRAN, ils peuvent être installés via GitHub (avec remotes
) ou Bioconductor (avec BiocManager
).
Ces installations doivent également être faites dans le Dockerfile, au moment du build de l’image :
# Installation de packages depuis GitHub
RUN R -e 'remotes::install_github("d3treeR/d3treeR")'
# Installation de packages depuis Bioconductor
RUN R -e 'install.packages("BiocManager")'
RUN R -e 'BiocManager::install("graph")'
Ressources
- https://rocker-project.org/images/versioned/shiny.html
- Documentation sk8 - Bonnes pratiques Shiny
- Documentation officielle Shiny (RStudio)
- Le guide {golem} : Engineering Production-Grade Shiny Apps
Support
Pour toute demande relative au catalogue Shiny (ajout d'application, accès, problèmes techniques), veuillez contacter l’équipe du Mésocentre via le système de tickets de l’Université :
- Par mail : support.dsi@uca.fr
- Via l’interface web : Demande de support
Veuillez mentionner que votre demande concerne le service Shiny du Mésocentre.
Le catalogue Shiny permet de rendre la science plus interactive et accessible. N’hésitez pas à valoriser vos travaux à travers une application Shiny !