SK8 🛹 - Gestion et hébergement d’applications R Shiny sur des infrastructures INRAE

26 mai 2023

Introduction

Shiny, c’est quoi ? 🤔


  • Shiny est un package R qui permet de dĂ©velopper facilement des applications web interactives dans une syntaxe R très simple (pouvant ĂŞtre complĂ©tĂ©e par du HTML / CSS / JS pour les applications les plus abouties).

  • Outil principalement utilisĂ© pour l’analyse et la visualisation de donnĂ©es (mais pas que)

Un exemple


SOMbrero

Les applications Shiny Ă  INRAE

Plusieurs constats…


  • Les applications R Shiny sont de plus en plus prĂ©sentes dans notre environnement

  • Peuvent ĂŞtre dĂ©veloppĂ©es par des nĂ©ophytes comme par des dĂ©veloppeurs chevronnĂ©s

  • Formidable outil de partage / valorisation et dĂ©mocratisation des travaux menĂ©s dans l’institut

  • ProblĂ©matique majeure et rĂ©currente autour de l’hĂ©bergement

Solutions existantes d’hébergement


Solutions d’hébergement propriétaires


Rapprochement Shiny/Docker


Solutions existantes Ă  INRAE

  • Multiples solutions ShinyServer OpenSource locales

  • Très limitĂ©es et coĂ»teuses en termes d’administration ⚠️

Une solution intéressante à l’échelle d’une unité (BioSP)

  • ShinyProxy (Docker) https://shiny.biosp.inrae.fr
  • Gestion du code via GitLab CI/CD
  • Applications conteneurisĂ©es
  • Abstraction et meilleure gestion de la partie système

Projet SK8 : Une réponse INRAE plus globale

Le projet SK8

R-Shiny Kubernetes Service ➡️ R-Shiny K8S Service ➡️ SK8SS ➡️ SK8 🛹

Le projet SK8 : Pourquoi ?

Besoins en augmentation d’hébergement d’apps Shiny

  • Facile d’accès, pĂ©renne et Ă©volutif
  • Scalable (Ă©lastique)
  • SĂ©curisĂ©

Finalité

  • Avoir une meilleure visibilitĂ© et harmonisation des travaux de l’institut

Contrainte forte

  • Doit rester dans l’institut
  • Doit rĂ©pondre aux besoins des agents

Déroulé du projet

  • Projet d’unitĂ© BioSP 2019, portĂ© par Jean-François Rey ➡️ CATI IMOTEP

  • V1 (2021) : Etude de faisabilitĂ©, Ă©tat des lieux INRAE, crĂ©ation des groupes de travail

  • V2 (2022) : Passage d’un projet CATI-IMOTEP ➡️ Inter-CATIs et ouverture de la version BĂŞta

  • V2 (2023) : Passage de l’infra en version kickflip (applications plus stables), refonte documentation & site web

Qui paye ? đź’¶

  • Financements SAPI DipSO 2022/2023 (Formation et hackatons)
  • Financements futurs (+ pĂ©rennisation) en cours de recherche

Le projet SK8 : C’est qui ?

  • \(\approx\) 30 ITA (\(\approx\) 15 actifs)

  • \(\neq\) CATIs (10), UnitĂ©s, DĂ©partements scientifiques

  • Statisticiens, DevOps, Administrateurs systèmes, Bioinformaticiens…

  • 2 groupes de travail, rĂ©unions mensuelles

Le projet SK8 : C’est qui ?


SK8 : Ca marche comment ?

Infrastructure générale


Schéma simplifié du fonctionnement

Parenthèse technique

Quelques notions nécessaires

CI/CD : Continuous Integration / Continuous Development

  • Suite d’instructions automatiques lors de mise Ă  jour de code

  • PilotĂ© par un fichier .gitlab-ci.yml

  • tests, lancement script, publication de donnĂ©es, pages web, etc.

Exemple :

gitlab-ci.yml
01-Publier:
  stage: GĂ©rer mon application
  needs: ["Construire-l-application"]
  image: curlimages/curl:latest
  rules:
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $MISE_A_JOUR_AUTOMATIQUE == "true"'
      when: on_success
      allow_failure: false
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $MISE_A_JOUR_AUTOMATIQUE == "false"'
      when: manual
      allow_failure: true
  before_script:
    - ACTION=$SK8_DEPLOY
  script:
    - *commande-job

Quelques notions nécessaires

Docker

  • Permet de Containeuriser des logiciels, applications

  • CrĂ©ation d’une image Docker Ă  partir d’une recette : le Dockerfile

  • Facilite la diffusion (gestion des dĂ©pendances systèmes, etc.)

Dockerfile
FROM rocker/verse:4.2.1
RUN apt-get update && apt-get install -y  cmake imagemagick libcurl4-openssl-dev [...]
RUN mkdir -p /usr/local/lib/R/etc/ /usr/lib/R/etc/
RUN echo "options(repos = c(CRAN = 'https://cran.rstudio.com/'), download.file.method = 'libcurl', Ncpus = 4)"
RUN R -e 'install.packages("remotes")'
RUN Rscript -e 'remotes::install_version("magrittr",upgrade="never", version = "2.0.3")'
RUN Rscript -e 'remotes::install_version("htmltools",upgrade="never", version = "0.5.5")'
[...]
RUN Rscript -e 'remotes::install_github("rstudio/sass@2f1f152d84c162ccb9aba1c056e3548079d669d9")'
RUN mkdir /build_zone
ADD . /build_zone
WORKDIR /build_zone
RUN R -e 'remotes::install_local(upgrade="never")'
RUN rm -rf /build_zone
EXPOSE 3838
CMD R -e "options('shiny.port'=3838,shiny.host='0.0.0.0');ShinyIDEA::run_app()"

Quelques notions nécessaires

Kubernetes

Solution permettant de distribuer intelligemment des container Docker aux utilisateurs.

SK8 : Ca marche comment ?

Infrastructure générale


Schéma simplifié du fonctionnement

Du point de vue utilisateur

  • CompĂ©tences basiques en git (clone, add, commit, push).

Du point de vue utilisateur

Du point de vue utilisateur

Du point de vue utilisateur

  • L’utilisateur rĂ©cupère le code : git clone
  • Il fait des modifications en local (intègre son propre code)
  • Envoie les modifications au repo : git add | commit | push

Du point de vue utilisateur

Du point de vue de l’application

Job Configuration :

flowchart LR
    A(Cherche<br>renv.lock) -->|pas de fichier| B2(Génère un<br>renv.lock)
    B(Cherche un<br>Dockerfile) --> |existe deja|C1(Utilise ce<br>Dockerfile)
    B --> |pas de fichier|A

    A --> |existe deja| L
    B2 --> L(Génère liste des<br>libs systèmes)
      L --> C2(Génère un<br>Dockerfile)
      F(FIN DU JOB CONFIGURATION)
      C2 --> F
      C1 --> F

Du point de vue de l’application

Job Configuration :

  • Activation {renv} (si pas dĂ©jĂ  fait) et crĂ©ation d’un cache
  • DĂ©tection des packages R
  • DĂ©tection des librairies système nĂ©cessaires
  • CrĂ©ation/mĂ j du fichier renv.lock
  • GĂ©nĂ©ration d’un Dockerfile

Du point de vue de l’application

Job Construire-l-application :

  • CrĂ©ation du container docker de l’application Ă  partir du Dockerfile
  • Utilise le fichier renv.lock
  • Utilise un cache pour les packages R et librairies système (rapide, sauf la première fois)

Du point de vue de l’application

Publication :

  • 01-Publier : Envoie le container docker gĂ©nĂ©rĂ© Ă  K8S ➡️ monapp.sk8.inrae.fr est accessible !
  • 02-Annuler-dernière_mise_Ă -jour : Envoie la version prĂ©cĂ©dente du container docker Ă  K8S
  • 03-DĂ©publier : supprime le pod K8S de l’application ➡️ monapp.sk8.inrae.fr n’est plus accessible

Du point de vue de l’application

DĂ©buggage :

  • Recevoir-les-logs-de-mon-app : Envoie les logs Kubernetes par mail si logs CI/CD insuffisants.

Le catalogue SK8


L’utilisation d’un catalogue (via ShinyProxy) permet

  • De disposer d’un hub centralisĂ© qui rĂ©fĂ©rence toutes les applications

  • De dĂ©ployer une instance distincte pour chaque utilisateur d’une application

Conclusion

Bilan

  • Travail innovant mĂŞlant de nombreuses technologies (R, Docker, Gitlab, CI/CD…)

  • Projet mĂŞlant une grande diversitĂ© de profils au travers de 10 CATIs

  • ⚠️ Les use-case les plus complexes sont les bienvenus pour tester le service ! ⚠️




🛹 SK8 : Un projet qui roule comme sur des roulettes 🛹

Et la suite ?

  • Monitoring et log, authentification

  • Publication SK8tools

  • DonnĂ©es persistantes

  • Accès Ă  des serveurs de donnĂ©es sĂ©curisĂ©s

  • PĂ©rennisation de l’offre (structure et financement)

  • CrĂ©ation d’une communautĂ© des utilisateurs

Merci ! Des questions ?

Slides consultables ici :

Slides made with InraeThemes