« ShinyProxy » : différence entre les versions

 
(4 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 158 : Ligne 158 :
Pour que le serveur ShinyProxy (ainsi que le monde entier !) puisse accéder à votre image, il faut la pousser sur un registre. Si vous ne souhaitez pas que votre image soit publique, vous pouvez utiliser le registre ghcr.io/evs-gis (le serveur ShinyProxy y a accès même si les images sont privées).  
Pour que le serveur ShinyProxy (ainsi que le monde entier !) puisse accéder à votre image, il faut la pousser sur un registre. Si vous ne souhaitez pas que votre image soit publique, vous pouvez utiliser le registre ghcr.io/evs-gis (le serveur ShinyProxy y a accès même si les images sont privées).  


Il faut d'abord se loguer sur le registre avec son login GitHub habituel, et un ''Personal Access Token'' en guise de mot de passe. Pour [https://github.com/settings/tokens/new obtenir un ''Personal Access Token''], rendez-vous [https://github.com/settings/tokens/new ici] et activez bien le droit <code>write:packages</code> pour votre token.  <syntaxhighlight lang="sh">
Il faut d'abord se loguer sur le registre avec son login GitHub habituel, et un ''Personal Access Token'' en guise de mot de passe. Pour [https://github.com/settings/tokens/new obtenir un ''Personal Access Token''], rendez-vous [https://github.com/settings/tokens/new ici] et activez bien le droit <code>write:packages</code> pour votre token.  <syntaxhighlight lang="sh"># La commande suivante est à lancer pour se loguer sur le registre. Il n'est pas nécessaire de la relancer à chaque fois.
# La commande suivante est à lancer pour se loguer sur le registre. Il n'est pas nécessaire de la relancer à chaque fois.
docker login ghcr.io
docker login ghcr.io


Ligne 166 : Ligne 165 :


# Pour pousser seulement un tag spécifique, on préfèrera la commande suivante.
# Pour pousser seulement un tag spécifique, on préfèrera la commande suivante.
docker push ghcr.io/evs-gis/mapdoapp:latest
docker push ghcr.io/evs-gis/mapdoapp:latest</syntaxhighlight>
 
== Configuration de l'application sur le serveur ShinyProxy de production ==
La configuration initiale de l'application doit être faite par l'administrateur du serveur.
 
== Mise à jour d'une appli ==
La mise à jour d'une appli sur le serveur de prod ne nécessite généralement pas de modifier la configuration. Il suffit de '''pousser la nouvelle version de votre image sur votre registre''' (avec le tag latest), puis de '''lancer le job ''Mise à jour d'une application en production sous ShinyProxy'' sur Jenkins''' pour forcer le redémarrage des containers d'attente déjà lancés. Si l'intégration continue a été correctement configurée, le job Jenkins de mise à jour devrait se lancer automatiquement dès que la nouvelle version de l'image arrive sur le registre.
== Debug des applis en prod ==
 
 
Pour accéder aux logs des applications sur le serveur de prod, se connecter en ssh aux archives:<syntaxhighlight lang="bash">
ssh archives.evs.ens-lyon.fr
</syntaxhighlight>Puis afficher le contenu des logs:<syntaxhighlight lang="bash">
tail -n 10 /data/echanges/ShinyProxyLogs/shinyapps-stdout.log
# récupérer les 10 (option -n) dernières lignes de stdout
 
tail -n 10 -f /data/echanges/ShinyProxyLogs/shinyapps-stderr.log
# voir stderr défiler en temps réel (option -f)
 
tail -n 10 /data/echanges/ShinyProxyLogs/shinyapps-std*.log
# voir les 10 dernières lignes de tous les logs (standard et erreur)
 
tail -n 100 ...
# pour les 100 dernières lignes, etc
</syntaxhighlight>Tous les logs (quelque soit l'appli) apparaissent. Pour chercher spécifiquement les lignes correspondant à une appli précise (par exemple mapdoapp):<syntaxhighlight lang="bash">
grep mapdoapp /data/echanges/ShinyProxyLogs/shinyapps-std*.log
# N'affiche que les lignes qui concernent mapdoapp
</syntaxhighlight>On peut aussi combiner défilement en live + grep<syntaxhighlight lang="bash">
tail -f /data/echanges/ShinyProxyLogs/shinyapps-std*.log | grep mapdoapp
</syntaxhighlight>
</syntaxhighlight>


== Configuration de l'application sur le serveur ShinyProxy de production ==
== To do list mise en ligne d'une nouvelle appli ==
La configuration de l'application se fait dans le '''fichier shinyapps.yml sur le dépôt privé''' https://github.com/EVS-GIS/isig-apps (un compte GitHub associé à l'organisation EVS-GIS est nécessaire). La branche prod de ce dépôt est synchronisée avec le serveur. Une erreur dans cette configuration pouvant potentiellement tout faire planter, cette branche prod est protégée et nécessite que vous fassiez un '''pull request''' validé par Samuel lorsque vous voulez mettre à jour cette configuration.
1) récupérer dans le dossier d'une appli déjà mise en ligne sur ShinyProxy: run.R (si appli learnr), dockerfile, et le dossier .github qui contient un yaml qui permettra de build et push l'image docker sur le ShinyProxy.
 
2) modifier dans run.R (si appli learnr) le nom du Rmd à tricoter
 
3) modifier dans le yaml le nom de l'image docker (deux lignes à changer)
 
4) modifier le dockerfile: infos sur l'appli et noms des packages à installer
 
5) build l'image docker localement pour vérifier que tout est ok, par ex. <syntaxhighlight lang="bash">
docker build . -t ghcr.io/lvaudor/learnr_exos_shiny:latest
</syntaxhighlight>6) run un container pour vérifier que tout est ok, par ex.<syntaxhighlight lang="bash">
docker run --rm -p 3840:3840 ghcr.io/learnr_shiny_exos:latest
</syntaxhighlight>7) Aller sur le repo github et changer paramètres: Settings => Actions => General => Workflow permissions => Cocher Read and write permissions
 
8) Faire un commit et push des dernières modifs sur main => Une image docker doit être créée dans les github Actions
 
9) Prévenir Samuel pour qu'il ajoute la nouvelle appli au registre
 


L'intégralité des paramètres qu'il est possible de configurer est disponible [https://www.shinyproxy.io/documentation/configuration/#apps ici]. Voici les principaux que je vous recommande de configurer : <syntaxhighlight lang="yaml">
== To do list mise à jour d'une appli ==
    - id: mapdoapp # Identifiant unique de l'application
1) build l'image docker localement pour vérifier que tout est ok, par ex.<syntaxhighlight lang="bash">
      display-name: "Mapd'O App" # Nom d'affichage
docker build . -t ghcr.io/lvaudor/learnr_exos_shiny:latest
      container-image: ghcr.io/evs-gis/mapdoapp:latest # Image Docker à utiliser (bien utiliser un tag "latest" pour faciliter la mise à jour)
</syntaxhighlight>2) run un container pour vérifier que tout est ok, par ex.<syntaxhighlight lang="bash">
      port: 3838 # Le port à écouter dans le container (dépend du port choisi au moment de la création de l'image)
docker run --rm -p 3840:3840 ghcr.io/learnr_shiny_exos:latest
      minimum-seats-available: 3 # Le nombre de containers en attente d'utilisateur que ShinyProxy doit assurer
</syntaxhighlight>3) Faire le docker push pour mettre à jour le registre<syntaxhighlight lang="bash">
      container-env: # Définitions de variables d'environnement
docker push ghcr.io/lvaudor/learnr_shiny_exos:latest
        MA_VARIABLE_1: valeur1
        MA_VARIABLE_2: valeur2
</syntaxhighlight>N'hésitez pas à demander mon aide pour cette étape qui ne sera généralement à faire qu'une seule fois au moment du premier déploiement de l'appli. Dans certains cas où vous prévoyez un pic d'affluence sur votre appli (un cours ou une conférence par exemple), vous pouvez ajuster le <code>minimum-seats-available</code> pour éviter du temps de chargement à vos visiteurs.


== Mise à jour d'une appli ==
</syntaxhighlight>
La mise à jour d'une appli sur le serveur de prod ne nécessite généralement pas de modifier le fichier de configuration (décrit ci-dessus). Il suffit de '''pousser la nouvelle version de votre image sur votre registre''' (avec le tag latest), puis de '''lancer le job ''Mise à jour d'une application en production sous ShinyProxy'' sur Jenkins''' pour forcer le redémarrage des containers d'attente déjà lancés.
[[Catégorie:Tutoriel]]
[[Catégorie:Tutoriel]]