<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://isig-wiki.ens-lyon.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sdunesme</id>
	<title>Wiki ISIG - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://isig-wiki.ens-lyon.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sdunesme"/>
	<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/wiki/Sp%C3%A9cial:Contributions/Sdunesme"/>
	<updated>2026-05-12T23:53:02Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Plan_Salle_Stagiaire.png&amp;diff=1213</id>
		<title>Fichier:Plan Salle Stagiaire.png</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Plan_Salle_Stagiaire.png&amp;diff=1213"/>
		<updated>2026-03-06T12:03:51Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Materiel&amp;diff=1207</id>
		<title>Materiel</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Materiel&amp;diff=1207"/>
		<updated>2026-02-12T09:57:45Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Liste du matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La plateforme ISIG dispose de matériel disponible à l&#039;emprunt pour les membres de l&#039;UMR5600. L&#039;emprunt se fait via la plateforme [[Grraou]]. Les points de contact concernant les ressources sont les [[Responsables matériel|groupes de responsables]].&lt;br /&gt;
&lt;br /&gt;
== Liste du matériel ==&lt;br /&gt;
Attention : cette section n&#039;est plus mise à jour automatiquement. La liste à jour est accessible ici : https://grraou-isig.ens-lyon.fr/Web/view_resources.php&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Materiel&amp;diff=1206</id>
		<title>Materiel</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Materiel&amp;diff=1206"/>
		<updated>2026-02-12T09:57:17Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Liste du matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La plateforme ISIG dispose de matériel disponible à l&#039;emprunt pour les membres de l&#039;UMR5600. L&#039;emprunt se fait via la plateforme [[Grraou]]. Les points de contact concernant les ressources sont les [[Responsables matériel|groupes de responsables]].&lt;br /&gt;
&lt;br /&gt;
== Liste du matériel ==&lt;br /&gt;
Attention : cette section n&#039;est plus mise à jour automatiquement. La liste à jour est accessible ici : https://grraou-isig.ens-lyon.fr/Web/view_resources.php&lt;br /&gt;
&amp;lt;!-- GrraouBot content below --&amp;gt;{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Type de ressource&lt;br /&gt;
!Nom&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|ADC Snap (Tetracam) PIR&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Aspirateur de chantier&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Benne Ekman&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Benne Scooper 20L&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Benne Scooper 60L&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Bombard AX n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Bombard AX n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Bombard Commando C4&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Bombard Typhoon&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Cadre granulo photo&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Caisse à outils FACOM&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Camera Blackmagic Pocket Cinema Camera 4K n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Camera Blackmagic Pocket Cinema Camera 4K n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Camera thermique VarioCAM HR600 (InfraTec)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Caméscope JVC&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Camion du laboratoire&lt;br /&gt;
|Camion Peugeot Expert&lt;br /&gt;
|Le camion n&#039;est empruntable que si vous disposez d&#039;une autorisation de conduite de l&#039;ENS à jour.&lt;br /&gt;
|-&lt;br /&gt;
|Canoë&lt;br /&gt;
|Canoë plastique rigide une place&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Canon PowerShot A25000&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Canon PowerShot G9&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Canon PowerShot S3 IS&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Cape de pluie&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Casque (3 unités disponibles)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Chalumeau&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Chaussures de sécurité [taille 38]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Chaussures de sécurité [taille 40]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Chaussures de sécurité [taille 44]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Combinaison de plongée [taille 42]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Combinaison de plongée [taille 46]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Combinaison manches courtes [taille 42]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Compact étanche WG-50 (Ricoh)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Compact étanche WG-60 (Ricoh)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Compact Pro G9 n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Coupe boulon&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Coupe vent [taille 2]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|D7000 (Nikon)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Échantillonneur McNeil (2 unités disponibles)&lt;br /&gt;
|Tube cylindrique de 15 cm de diamètre utiliser pour prélever la couche et la sous-couche du lit en eau (profondeur max. 40 cm)&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Échelle télescopique 2m90&lt;br /&gt;
|Echelle télescopique.&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Enregistreur (ancien) lunettes SMI eye-tracker&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Escabeau&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Fer à souder&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Flow tracker ADCPro&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Gabarits granulométriques&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|Garmin eTrex 30x n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|GEO XH 6000 (Trimble)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Gilet de pêche multipoche [taille L]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Gilet de pêche multipoche [taille M]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Gilet de pêche multipoche [taille XL]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Gilet de sauvetage seul&lt;br /&gt;
|Réservez un ou plusieurs gilets de sauvetage sans bateau.&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|GoPro Hero 2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Grande antenne RFID rectangulaire&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Haglöf Transpondeur Télémètre à ultrason&lt;br /&gt;
|Manque potentiellement des pièces&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|IML RESI PowerDrill Wood&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Jeu de clés mixtes Facom&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Long John de plongée [taille 42]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Lunettes SMI Eye tracker (ancien)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Lunettes SMI Eye tracking (nouveau) + enregistreur&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Machette&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Maillet&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Malette à visser AllRound&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Malette à visser Eckmann&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Masse&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Microphone 360° USB n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Microphone 360° USB n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Moyenne antenne RFID rectangulaire&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Enregistreurs vocaux&lt;br /&gt;
|NAGRA ARES-ML&lt;br /&gt;
|Enregistreur audio&lt;br /&gt;
|-&lt;br /&gt;
|Enregistreurs vocaux&lt;br /&gt;
|NAGRA SD&lt;br /&gt;
|Enregistreur audio&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Niveau à bulle (3 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Outillage divers&lt;br /&gt;
|Divers outils disponibles au local bateau&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Eustache&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Félicie&lt;br /&gt;
|PC détenu par Kristell pour le moment&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Gérard&lt;br /&gt;
|Inventaire DSI : L100599&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Jean-Luc&lt;br /&gt;
|Utilisé par Hossein actuellement&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Marguerite&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|PC de terrain empruntable à la demi-journée&lt;br /&gt;
|PC Terrain Panasonic Touchbook CF-19&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Pénétromètre PANDA&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Perceuse-visseuse Bosh PSB 18&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Perche graduée pour granulo photo&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Perforateur Bosh sans fil 18V&lt;br /&gt;
|Perforateur sans fil avec 2 batteries.&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Peson Kern&lt;br /&gt;
|Résolution 5g, Maximum 6kg&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Petit maillet&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Petite antenne RFID circulaire&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Pistolet à cartouches (2 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Pointeur Laser n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Pointeur Laser n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|R8 (Trimble) DGPS (chargeur boîte noire)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|R8 (Trimble) GNSS (chargeur boîte noire)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|RFID boitier TAG Passif : Datamax + boitier Cipam + 2 petits GPS + cables&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|RFID TAG Actif a-UHF (2 caisses)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Sac à dos étanche ITIWI&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Sonde Pressler&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|PC de terrain empruntable à la demi-journée&lt;br /&gt;
|Tablette Terrain Panasonic Touchbook CF-D1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Enregistreurs vocaux&lt;br /&gt;
|Tascam DR-07 n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Top thermique de plongée [taille L]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Top thermique de plongée [taille S]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Tour de visioconférence n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Tour de visioconférence n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires photo&lt;br /&gt;
|Trépied photo n°1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires photo&lt;br /&gt;
|Trépied photo n°2&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Treuil (2 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Trousse de secours terrain&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vélo&lt;br /&gt;
|Vélo cargo Douze Cycles&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Veste de plongée [taille 42]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Veste imperméable Quechua [taille L] (2 unités disponibles)&lt;br /&gt;
|Veste imperméable achetée en 2022&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Veste Millet [taille L]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vidéoprojecteur&lt;br /&gt;
|Vidéoprojecteur Acer&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vidéoprojecteur&lt;br /&gt;
|Vidéoprojecteur Optoma&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders néoprène [taille 38-39]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders néoprène [taille 40-41] (2 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders néoprène [taille 42-43] (3 unités disponibles)&lt;br /&gt;
|Waders achetées en novembre 2022&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders néoprène [taille 46-47]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders [taille 38-39] (5 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders [taille 40-41] (3 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders [taille 42-43] (4 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders [taille 44-45] (2 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Yamaha Yam 310 S&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|Zenith 35 Pro (Geomax) composé de 3 caisses&lt;br /&gt;
|None&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Materiel&amp;diff=1205</id>
		<title>Materiel</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Materiel&amp;diff=1205"/>
		<updated>2026-02-12T09:55:36Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La plateforme ISIG dispose de matériel disponible à l&#039;emprunt pour les membres de l&#039;UMR5600. L&#039;emprunt se fait via la plateforme [[Grraou]]. Les points de contact concernant les ressources sont les [[Responsables matériel|groupes de responsables]].&lt;br /&gt;
&lt;br /&gt;
== Liste du matériel ==&lt;br /&gt;
Attention : cette section n&#039;est plus mise à jour automatiquement.&lt;br /&gt;
&amp;lt;!-- GrraouBot content below --&amp;gt;{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Type de ressource&lt;br /&gt;
!Nom&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|ADC Snap (Tetracam) PIR&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Aspirateur de chantier&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Benne Ekman&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Benne Scooper 20L&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Benne Scooper 60L&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Bombard AX n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Bombard AX n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Bombard Commando C4&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Bombard Typhoon&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Cadre granulo photo&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Caisse à outils FACOM&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Camera Blackmagic Pocket Cinema Camera 4K n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Camera Blackmagic Pocket Cinema Camera 4K n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Camera thermique VarioCAM HR600 (InfraTec)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Caméscope JVC&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Camion du laboratoire&lt;br /&gt;
|Camion Peugeot Expert&lt;br /&gt;
|Le camion n&#039;est empruntable que si vous disposez d&#039;une autorisation de conduite de l&#039;ENS à jour.&lt;br /&gt;
|-&lt;br /&gt;
|Canoë&lt;br /&gt;
|Canoë plastique rigide une place&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Canon PowerShot A25000&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Canon PowerShot G9&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Canon PowerShot S3 IS&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Cape de pluie&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Casque (3 unités disponibles)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Chalumeau&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Chaussures de sécurité [taille 38]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Chaussures de sécurité [taille 40]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Chaussures de sécurité [taille 44]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Combinaison de plongée [taille 42]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Combinaison de plongée [taille 46]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Combinaison manches courtes [taille 42]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Compact étanche WG-50 (Ricoh)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Compact étanche WG-60 (Ricoh)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|Compact Pro G9 n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Coupe boulon&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Coupe vent [taille 2]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|D7000 (Nikon)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Échantillonneur McNeil (2 unités disponibles)&lt;br /&gt;
|Tube cylindrique de 15 cm de diamètre utiliser pour prélever la couche et la sous-couche du lit en eau (profondeur max. 40 cm)&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Échelle télescopique 2m90&lt;br /&gt;
|Echelle télescopique.&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Enregistreur (ancien) lunettes SMI eye-tracker&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Escabeau&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Fer à souder&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Flow tracker ADCPro&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Gabarits granulométriques&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|Garmin eTrex 30x n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|GEO XH 6000 (Trimble)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Gilet de pêche multipoche [taille L]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Gilet de pêche multipoche [taille M]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Gilet de pêche multipoche [taille XL]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Gilet de sauvetage seul&lt;br /&gt;
|Réservez un ou plusieurs gilets de sauvetage sans bateau.&lt;br /&gt;
|-&lt;br /&gt;
|Appareil photo&lt;br /&gt;
|GoPro Hero 2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Grande antenne RFID rectangulaire&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Haglöf Transpondeur Télémètre à ultrason&lt;br /&gt;
|Manque potentiellement des pièces&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|IML RESI PowerDrill Wood&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Jeu de clés mixtes Facom&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Long John de plongée [taille 42]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Lunettes SMI Eye tracker (ancien)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Lunettes SMI Eye tracking (nouveau) + enregistreur&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Machette&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Maillet&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Malette à visser AllRound&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Malette à visser Eckmann&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Masse&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Microphone 360° USB n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Microphone 360° USB n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Moyenne antenne RFID rectangulaire&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Enregistreurs vocaux&lt;br /&gt;
|NAGRA ARES-ML&lt;br /&gt;
|Enregistreur audio&lt;br /&gt;
|-&lt;br /&gt;
|Enregistreurs vocaux&lt;br /&gt;
|NAGRA SD&lt;br /&gt;
|Enregistreur audio&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Niveau à bulle (3 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Outillage divers&lt;br /&gt;
|Divers outils disponibles au local bateau&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Eustache&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Félicie&lt;br /&gt;
|PC détenu par Kristell pour le moment&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Gérard&lt;br /&gt;
|Inventaire DSI : L100599&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Jean-Luc&lt;br /&gt;
|Utilisé par Hossein actuellement&lt;br /&gt;
|-&lt;br /&gt;
|Laptop empruntable à l&#039;heure&lt;br /&gt;
|PC portable Marguerite&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|PC de terrain empruntable à la demi-journée&lt;br /&gt;
|PC Terrain Panasonic Touchbook CF-19&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Pénétromètre PANDA&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Perceuse-visseuse Bosh PSB 18&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Perche graduée pour granulo photo&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Perforateur Bosh sans fil 18V&lt;br /&gt;
|Perforateur sans fil avec 2 batteries.&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Peson Kern&lt;br /&gt;
|Résolution 5g, Maximum 6kg&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Petit maillet&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|Petite antenne RFID circulaire&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Pistolet à cartouches (2 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Pointeur Laser n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Pointeur Laser n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|R8 (Trimble) DGPS (chargeur boîte noire)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|R8 (Trimble) GNSS (chargeur boîte noire)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|RFID boitier TAG Passif : Datamax + boitier Cipam + 2 petits GPS + cables&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Capteurs de données divers&lt;br /&gt;
|RFID TAG Actif a-UHF (2 caisses)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Sac à dos étanche ITIWI&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Appareils de mesures&lt;br /&gt;
|Sonde Pressler&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|PC de terrain empruntable à la demi-journée&lt;br /&gt;
|Tablette Terrain Panasonic Touchbook CF-D1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Enregistreurs vocaux&lt;br /&gt;
|Tascam DR-07 n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Top thermique de plongée [taille L]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Top thermique de plongée [taille S]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Tour de visioconférence n°1&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires informatiques&lt;br /&gt;
|Tour de visioconférence n°2&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires photo&lt;br /&gt;
|Trépied photo n°1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Accessoires photo&lt;br /&gt;
|Trépied photo n°2&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Outils de bricolage&lt;br /&gt;
|Treuil (2 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Equipements de Protection Individuelle&lt;br /&gt;
|Trousse de secours terrain&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vélo&lt;br /&gt;
|Vélo cargo Douze Cycles&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Veste de plongée [taille 42]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Veste imperméable Quechua [taille L] (2 unités disponibles)&lt;br /&gt;
|Veste imperméable achetée en 2022&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Veste Millet [taille L]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vidéoprojecteur&lt;br /&gt;
|Vidéoprojecteur Acer&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vidéoprojecteur&lt;br /&gt;
|Vidéoprojecteur Optoma&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders néoprène [taille 38-39]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders néoprène [taille 40-41] (2 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders néoprène [taille 42-43] (3 unités disponibles)&lt;br /&gt;
|Waders achetées en novembre 2022&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders néoprène [taille 46-47]&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders [taille 38-39] (5 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders [taille 40-41] (3 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders [taille 42-43] (4 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Vêtements (hors EPI)&lt;br /&gt;
|Waders [taille 44-45] (2 unités disponibles)&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|Bateau&lt;br /&gt;
|Yamaha Yam 310 S&lt;br /&gt;
|None&lt;br /&gt;
|-&lt;br /&gt;
|GPS&lt;br /&gt;
|Zenith 35 Pro (Geomax) composé de 3 caisses&lt;br /&gt;
|None&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Grraou&amp;diff=1204</id>
		<title>Grraou</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Grraou&amp;diff=1204"/>
		<updated>2026-02-12T09:54:39Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gestion et Réservation des Ressources Actuellement Opérationnelles et Utilisées d&#039;ISIG (grraou ISIG) est la nouvelle plateforme de réservation du matériel d&#039;ISIG. Cette plateforme remplace l&#039;ancien GRR qui ne répondait pas à toutes les attentes, notamment en termes d&#039;ergonomie. &lt;br /&gt;
&lt;br /&gt;
Elle est accessible à l&#039;adresse https://grraou-isig.ens-lyon.fr :&lt;br /&gt;
&lt;br /&gt;
* A toute personne ayant un compte ENS de Lyon affecté à EVS.&lt;br /&gt;
* A tout personne ayant un compte Personnel des Unités CNRS affecté à EVS.&lt;br /&gt;
&lt;br /&gt;
Cette plateforme nous permet de suivre l&#039;utilisation du matériel et d&#039;assurer le remplacement du matériel défectueux ou perdu. Son utilisation est obligatoire si vous souhaitez emprunter du [[Materiel|matériel géré par ISIG]]. &lt;br /&gt;
&lt;br /&gt;
La [[Materiel|liste du matériel]] disponible via Grraou est accessible publiquement [[Materiel|ici]]. &lt;br /&gt;
&lt;br /&gt;
== Guide d&#039;utilisation ==&lt;br /&gt;
&lt;br /&gt;
=== Connexion ===&lt;br /&gt;
La connexion se fait avec votre nom d&#039;utilisateur et mot de passe ENS habituel. Si vous n&#039;avez pas de compte ENS, un compte externe peut vous être créé par un administrateur grraou.&lt;br /&gt;
&lt;br /&gt;
=== Tableau de bord ===&lt;br /&gt;
[[Fichier:Tableau de bord Grraou.png|centré|sans_cadre|574x574px]]&lt;br /&gt;
Les actualités concernant le matériel (pannes, indisponibilités, etc.) s&#039;affichent dans le panneau &#039;&#039;&#039;Annonces&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Vos réservations à venir s&#039;affichent dans le panneau &#039;&#039;&#039;Réservations à venir&#039;&#039;&#039;, et les réservations des autres s&#039;affichent dans le dernier panneau &#039;&#039;&#039;Toutes les Réservations à venir&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Il est possible d&#039;accéder directement au formulaire de réservation d&#039;une ressource via le panneau &#039;&#039;&#039;Disponibilité des Ressources&#039;&#039;&#039;. Cependant, l&#039;usage du planning est plus pratique.&lt;br /&gt;
&lt;br /&gt;
=== Planning et réservation ===&lt;br /&gt;
L&#039;onglet Planning vous permet d&#039;accéder au calendrier de vos réservations (&#039;&#039;&#039;Mon Calendrier&#039;&#039;&#039;) ou au calendrier de toutes les réservations d&#039;une ressource (&#039;&#039;&#039;Calendrier des Ressources&#039;&#039;&#039;). Vous pouvez créer une réservation directement via ces calendriers si vous le souhaitez. Un moteur de recherche de créneaux disponibles est également proposé (&#039;&#039;&#039;Trouver une Disponibilité&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
L&#039;interface principale de réservation est accessible via ce même onglet Planning &amp;gt; &#039;&#039;&#039;Réservations&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Deux plannings sont disponibles : le matériel de terrain réservable à la demi-journée et le matériel de labo réservable à l&#039;heure. On passe d&#039;un planning à l&#039;autre avec le menu déroulant en haut de la page.&lt;br /&gt;
[[Fichier:Changement de planning.png|centré|sans_cadre]]&lt;br /&gt;
Par défaut, une semaine est affichée sur le planning. On change de semaine via le calendrier à côté de ce menu déroulant. Il est également possible d&#039;afficher uniquement certaines dates spécifiques en cochant la case &#039;&#039;&#039;Show specific dates&#039;&#039;&#039; et en cliquant sur les jours demandés.&lt;br /&gt;
&lt;br /&gt;
Il y a 4 modes de visualisation du planning : &lt;br /&gt;
&lt;br /&gt;
* Le &#039;&#039;&#039;mode standard&#039;&#039;&#039; : les ressources s&#039;affichent en ligne et les créneaux en colonnes.&lt;br /&gt;
* Le &#039;&#039;&#039;mode étroit&#039;&#039;&#039; : les ressources s&#039;affichent en colonnes et les créneaux en lignes.&lt;br /&gt;
* Le &#039;&#039;&#039;mode large&#039;&#039;&#039; : comme le mode standard mais toute la semaine est sur la même ligne.&lt;br /&gt;
* Le &#039;&#039;&#039;mode compact&#039;&#039;&#039; (par défaut) : les jours de la semaine s&#039;affichent en colonnes, les ressources en lignes, et les créneaux dans chaque case.&lt;br /&gt;
&lt;br /&gt;
On passe d&#039;un mode à l&#039;autre avec les boutons en haut à gauche, au-dessus des filtres. Lorsque vous avez choisi votre préféré, enregistrez le comme par défaut en cliquant sur l&#039;étoile. &lt;br /&gt;
[[Fichier:Modes de visualisation du planning.png|centré|sans_cadre]]&lt;br /&gt;
Les &#039;&#039;&#039;filtres&#039;&#039;&#039; à gauche permettent d&#039;alléger le tableau en &#039;&#039;&#039;n&#039;affichant que certains types de ressources&#039;&#039;&#039;. Des &#039;&#039;&#039;packages thématiques&#039;&#039;&#039; sont également disponibles pour faciliter votre choix de matériel en fonction de la sortie terrain envisagée.&lt;br /&gt;
&lt;br /&gt;
En mode standard, étroit ou large, vous pouvez &#039;&#039;&#039;cliquer-glisser dans le tableau pour réserver plusieurs créneaux d&#039;un seul coup.&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
=== Formulaire de réservation ===&lt;br /&gt;
[[Fichier:Formulaire de réservation Grraou.png|centré|sans_cadre|539x539px]]&lt;br /&gt;
Sur le formulaire de réservation, vous devez choisir une &#039;&#039;&#039;date et heure de début et de fin de réservation&#039;&#039;&#039;. La durée de la réservation est alors automatiquement calculée. Vous devez également renseigner un &#039;&#039;&#039;motif de réservation dans le champ &#039;&#039;Libellé de la réservation&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez &#039;&#039;&#039;ajouter plusieurs ressources&#039;&#039;&#039; à votre réservation pour éviter d&#039;avoir à la dupliquer en cliquant sur &#039;&#039;Modifier+&#039;&#039; (au-dessus de la liste des ressources réservées).&lt;br /&gt;
&lt;br /&gt;
Si vous avez choisi une ressource qui nécessite de &#039;&#039;&#039;répartir les coûts de fonctionnement sur les lignes budgétaires&#039;&#039;&#039; des utilisateurs, le champ &#039;&#039;&#039;&#039;&#039;Projet de recherche&#039;&#039;&#039;&#039;&#039; apparaitra et devra être obligatoirement renseigné avec les détails de votre ligne de budget. &lt;br /&gt;
&lt;br /&gt;
Vous pouvez également &#039;&#039;&#039;ajouter des accessoires&#039;&#039;&#039; aux ressources réservées (à côté de la liste des ressources). &#039;&#039;&#039;Certains accessoires sont obligatoires avec certaines ressources&#039;&#039;&#039; (des rames avec un bateau par exemple). Si c&#039;est le cas, un message d&#039;erreur avec le détail des accessoires obligatoires apparaitra à la validation du formulaire. Certaines ressources sont aussi disponibles en plusieurs exemplaires. Il faudra donc préciser le nombre d&#039;unités empruntées en ajoutant des accessoires.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez &#039;&#039;&#039;ajouter des participants&#039;&#039;&#039; à votre réservation dans le champ &#039;&#039;Liste des participants&#039;&#039; si ces derniers ont déjà un compte Grraou. Si ce n&#039;est pas le cas, ajoutez-les en tant que &#039;&#039;Guest&#039;&#039; dans le champ &#039;&#039;Invités&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Enfin, vous avez la possibilité de &#039;&#039;&#039;régler un rappel par mail&#039;&#039;&#039; avant le début et la fin de votre réservation dans la section &#039;&#039;Send Reminder&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
En cliquant sur le bouton &#039;&#039;Créer&#039;&#039;, si une des ressources choisies nécessite validation, votre réservation passera en mode &amp;quot;en attente de modération&amp;quot; (les modérateurs reçoivent automatiquement une notification). Si ce n&#039;est pas le cas, elle sera directement validée et visible par tous.&lt;br /&gt;
&lt;br /&gt;
=== Éditer votre réservation ===&lt;br /&gt;
En passant par le tableau de bord, le planning ou les calendriers, vous avez la possibilité d&#039;&#039;&#039;&#039;éditer vos réservations vous-même&#039;&#039;&#039;. Si une des ressources choisies nécessite validation, il faudra que les responsables matos concernés valident votre modification. &lt;br /&gt;
&lt;br /&gt;
Pour &#039;&#039;&#039;annuler une réservation&#039;&#039;&#039;, cliquez sur le bouton &#039;&#039;Plus&#039;&#039;, puis sur &#039;&#039;Effacer&#039;&#039;.&lt;br /&gt;
[[Fichier:Annuler une réservation.png|centré|sans_cadre|253x253px]]&lt;br /&gt;
&lt;br /&gt;
== Guide d&#039;administration ==&lt;br /&gt;
Cette section s&#039;adresse uniquement aux administrateurs et aux responsables matos.&lt;br /&gt;
&lt;br /&gt;
=== Utilisateurs et groupes ===&lt;br /&gt;
Il y a trois niveaux de droits d&#039;utilisateurs :&lt;br /&gt;
&lt;br /&gt;
* Les administrateurs de l&#039;application&lt;br /&gt;
* Les responsables de matériel&lt;br /&gt;
* Les utilisateurs&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Accueil&amp;diff=1203</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Accueil&amp;diff=1203"/>
		<updated>2026-02-12T09:52:48Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* ✍️ Contribuer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
Bienvenue sur le wiki d&#039;[[ISIG]] !&lt;br /&gt;
== Objectifs==&lt;br /&gt;
Ce site, conçu comme un &#039;&#039;&#039;carnet de notes partagé&#039;&#039;&#039; au sein de l&#039;équipe et des collaborateurs d&#039;[[ISIG]], est destiné à rassembler les informations relatives aux&lt;br /&gt;
* 🤝 &amp;lt;strong&amp;gt;fonctionnement de laboratoire&amp;lt;/strong&amp;gt;, &lt;br /&gt;
* 🔧 &amp;lt;strong&amp;gt;notes techniques&amp;lt;/strong&amp;gt; &lt;br /&gt;
* 📃 &amp;lt;strong&amp;gt;documentation et liens&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le monde entier peut &amp;lt;strong&amp;gt;lire et modifier&amp;lt;/strong&amp;gt; ce wiki (à l&#039;exception de quelques pages à l&#039;accès restreint)! Vous êtes bien entendus invités à l&#039;enrichir vous aussi !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;l2&amp;quot; class=&amp;quot;mainpage_row&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;mainpage_box&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;h3&amp;gt;🧑‍🤝‍🧑&amp;lt;span&amp;gt; Vie d&#039;ISIG&amp;lt;/span&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
* 🕸️ [[reseaux| Réseaux scientifiques (séminaires, formations)]]&lt;br /&gt;
&lt;br /&gt;
🔑 [[Pages à accès restreint|Accès réservé]] aux utilisateurs identifiés:&lt;br /&gt;
&lt;br /&gt;
* 💸  [[Restreint:Idees achats|Besoins matériels et suggestions d&#039;achats]]&lt;br /&gt;
* 📝  [[Restreint:Procedures admin|Procédures administratives]]&lt;br /&gt;
* 💰  [[Restreint:Appels à projets|Appels à projets]]&lt;br /&gt;
* 🚶  [[Restreint:Historique des contrats courts|Historique des contrats courts]]&lt;br /&gt;
* 🙋‍♂️  [[Restreint:PresenceLabo|Présence au labo]]&lt;br /&gt;
* 👷  [[Restreint:ISIG pages internes|ISIG: pages internes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;mainpage_box&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;h3&amp;gt;📃&amp;lt;span&amp;gt; Ressources d&#039;ISIG&amp;lt;/span&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
🗃️ [[:Catégorie:Tutoriel|Tutothèque]]&lt;br /&gt;
&lt;br /&gt;
🤯 [[Formations]]&lt;br /&gt;
&lt;br /&gt;
📜 [[Inventaires]] de données&lt;br /&gt;
&lt;br /&gt;
🔨 [[Materiel|Matériel empruntable]]&lt;br /&gt;
&lt;br /&gt;
🗣️ [[Discord ISIG|Discord ISIG et discussions]]&lt;br /&gt;
&lt;br /&gt;
👶 [[Guide des nouveaux arrivants]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;mainpage_box&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;h3&amp;gt;🖥️ &amp;lt;span&amp;gt;Outils d&#039;ISIG&amp;lt;/span&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
🗣️ [[Discord ISIG]]&lt;br /&gt;
&lt;br /&gt;
🗄️ [[Serveur de fichiers EVS]]&lt;br /&gt;
&lt;br /&gt;
⚙️ [[Serveurs de calcul|Serveurs de calcul et machines à grosses configurations]]&lt;br /&gt;
&lt;br /&gt;
💧 [[Fluvial Corridor Toolbox]]&lt;br /&gt;
&lt;br /&gt;
📦 [[Packages R]]&lt;br /&gt;
&lt;br /&gt;
💿 [[:Catégorie:Licences logicielles|Licences logicielles]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:Catégorie:Outils|🔧 Voir tous les outils]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ✍️ &amp;lt;span&amp;gt;Contribuer&amp;lt;/span&amp;gt; ==&lt;br /&gt;
Vous souhaitez contribuer au wiki [[ISIG]] ? C&#039;est une excellente nouvelle ! 🎉&lt;br /&gt;
&lt;br /&gt;
Pour bien débuter, vous pouvez vous aider des 👉 [[tuto_wiki| quelques conseils listés ici]]. &lt;br /&gt;
&lt;br /&gt;
Bonne rédaction !&lt;br /&gt;
== Actualités ==&lt;br /&gt;
ℹ️ Nouveauté : Il est désormais nécessaire de se connecter au wiki via idEVS, avec votre compte ENS ou votre compte Personnel des Unités CNRS affecté à EVS. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ci-dessous les modifications récentes qui ont eu lieues sur le wiki.&lt;br /&gt;
&lt;br /&gt;
{{Special:RecentChanges/50}}&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Accueil&amp;diff=1202</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Accueil&amp;diff=1202"/>
		<updated>2026-02-12T09:51:57Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Actualités */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
Bienvenue sur le wiki d&#039;[[ISIG]] !&lt;br /&gt;
== Objectifs==&lt;br /&gt;
Ce site, conçu comme un &#039;&#039;&#039;carnet de notes partagé&#039;&#039;&#039; au sein de l&#039;équipe et des collaborateurs d&#039;[[ISIG]], est destiné à rassembler les informations relatives aux&lt;br /&gt;
* 🤝 &amp;lt;strong&amp;gt;fonctionnement de laboratoire&amp;lt;/strong&amp;gt;, &lt;br /&gt;
* 🔧 &amp;lt;strong&amp;gt;notes techniques&amp;lt;/strong&amp;gt; &lt;br /&gt;
* 📃 &amp;lt;strong&amp;gt;documentation et liens&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le monde entier peut &amp;lt;strong&amp;gt;lire et modifier&amp;lt;/strong&amp;gt; ce wiki (à l&#039;exception de quelques pages à l&#039;accès restreint)! Vous êtes bien entendus invités à l&#039;enrichir vous aussi !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;l2&amp;quot; class=&amp;quot;mainpage_row&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;mainpage_box&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;h3&amp;gt;🧑‍🤝‍🧑&amp;lt;span&amp;gt; Vie d&#039;ISIG&amp;lt;/span&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
* 🕸️ [[reseaux| Réseaux scientifiques (séminaires, formations)]]&lt;br /&gt;
&lt;br /&gt;
🔑 [[Pages à accès restreint|Accès réservé]] aux utilisateurs identifiés:&lt;br /&gt;
&lt;br /&gt;
* 💸  [[Restreint:Idees achats|Besoins matériels et suggestions d&#039;achats]]&lt;br /&gt;
* 📝  [[Restreint:Procedures admin|Procédures administratives]]&lt;br /&gt;
* 💰  [[Restreint:Appels à projets|Appels à projets]]&lt;br /&gt;
* 🚶  [[Restreint:Historique des contrats courts|Historique des contrats courts]]&lt;br /&gt;
* 🙋‍♂️  [[Restreint:PresenceLabo|Présence au labo]]&lt;br /&gt;
* 👷  [[Restreint:ISIG pages internes|ISIG: pages internes]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;mainpage_box&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;h3&amp;gt;📃&amp;lt;span&amp;gt; Ressources d&#039;ISIG&amp;lt;/span&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
🗃️ [[:Catégorie:Tutoriel|Tutothèque]]&lt;br /&gt;
&lt;br /&gt;
🤯 [[Formations]]&lt;br /&gt;
&lt;br /&gt;
📜 [[Inventaires]] de données&lt;br /&gt;
&lt;br /&gt;
🔨 [[Materiel|Matériel empruntable]]&lt;br /&gt;
&lt;br /&gt;
🗣️ [[Discord ISIG|Discord ISIG et discussions]]&lt;br /&gt;
&lt;br /&gt;
👶 [[Guide des nouveaux arrivants]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;mainpage_box&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;h3&amp;gt;🖥️ &amp;lt;span&amp;gt;Outils d&#039;ISIG&amp;lt;/span&amp;gt;&amp;lt;/h3&amp;gt;&lt;br /&gt;
🗣️ [[Discord ISIG]]&lt;br /&gt;
&lt;br /&gt;
🗄️ [[Serveur de fichiers EVS]]&lt;br /&gt;
&lt;br /&gt;
⚙️ [[Serveurs de calcul|Serveurs de calcul et machines à grosses configurations]]&lt;br /&gt;
&lt;br /&gt;
💧 [[Fluvial Corridor Toolbox]]&lt;br /&gt;
&lt;br /&gt;
📦 [[Packages R]]&lt;br /&gt;
&lt;br /&gt;
💿 [[:Catégorie:Licences logicielles|Licences logicielles]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:Catégorie:Outils|🔧 Voir tous les outils]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ✍️ &amp;lt;span&amp;gt;Contribuer&amp;lt;/span&amp;gt; ==&lt;br /&gt;
Vous souhaitez contribuer au wiki [[ISIG]] ? C&#039;est une excellente nouvelle ! 🎉&lt;br /&gt;
&lt;br /&gt;
Pour bien débuter, nous vous conseillons de [[Spécial:Créer un compte|créer un compte]] afin de pouvoir suivre vos pages modifiées, vous identifier auprès de vos lecteurs, etc. &lt;br /&gt;
&lt;br /&gt;
Ensuite, vous pouvez vous lancer en vous aidant des 👉 [[tuto_wiki| quelques conseils listés ici]].&lt;br /&gt;
&lt;br /&gt;
Bonne rédaction !&lt;br /&gt;
== Actualités ==&lt;br /&gt;
ℹ️ Nouveauté : Il est désormais nécessaire de se connecter au wiki via idEVS, avec votre compte ENS ou votre compte Personnel des Unités CNRS affecté à EVS. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ci-dessous les modifications récentes qui ont eu lieues sur le wiki.&lt;br /&gt;
&lt;br /&gt;
{{Special:RecentChanges/50}}&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Glourbee.png&amp;diff=1201</id>
		<title>Fichier:Glourbee.png</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Glourbee.png&amp;diff=1201"/>
		<updated>2026-01-26T09:15:49Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Chrono-Rhone.png&amp;diff=1200</id>
		<title>Fichier:Chrono-Rhone.png</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Chrono-Rhone.png&amp;diff=1200"/>
		<updated>2026-01-26T08:42:04Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ISIG&amp;diff=1189</id>
		<title>ISIG</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ISIG&amp;diff=1189"/>
		<updated>2025-12-17T09:43:01Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#evu:https://www.youtube.com/watch?v=lDOx8D-VHSo&lt;br /&gt;
|alignment=right&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
La plateforme ISIG est un lieu de production, de partage, d&#039;échanges et de mise en réseau des membres de l&#039;UMR 5600 &amp;quot;Environnement Ville Société&amp;quot; travaillant dans le domaine de l&#039;imagerie, de la géomatique et de champs connexes.&lt;br /&gt;
[[Fichier:Compétences ISIG.png|gauche|vignette]]&lt;br /&gt;
&lt;br /&gt;
Elle est composée d’ingénieur.e.s dont les compétences couvrent l’ensemble des compétences du domaine de la géomatique et proposent aux membres de l’UMR :&lt;br /&gt;
&lt;br /&gt;
* un soutien technique et méthodologique en géomatique,&lt;br /&gt;
* le développement d’outils génériques de traitement de l’information spatialisée,&lt;br /&gt;
* des cycles de formation méthodologiques et techniques à destination des chercheurs et des ateliers spécifiques pour les doctorants,&lt;br /&gt;
* une veille tech­no­lo­gi­que dans le domaine de la télé­dé­tec­tion et des Systèmes d&#039;Information Géographique.&lt;br /&gt;
&lt;br /&gt;
La plateforme a pour vocation de construire des outils spé­ci­fi­ques trans­ver­saux, comme par exemple des portails collaboratifs pour la mutualisation des données. Elle s’articule avec une équipe de recherche active dans ce domaine regroupée au sein de l&#039;atelier Spatialités Numériques et Géomatique (SN&amp;amp;G).&lt;br /&gt;
[[Catégorie:Vie du laboratoire]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Comp%C3%A9tences_ISIG.png&amp;diff=1188</id>
		<title>Fichier:Compétences ISIG.png</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Comp%C3%A9tences_ISIG.png&amp;diff=1188"/>
		<updated>2025-12-17T09:41:39Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1106</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1106"/>
		<updated>2025-06-03T09:03:11Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Configuration de l&amp;#039;application sur le serveur ShinyProxy de production */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.    &lt;br /&gt;
[[Fichier:Schéma Docker.png|centré|sans_cadre|1054x1054px]]    &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
ShinyProxy fera en sorte qu&#039;un certain nombre de containers (à définir dans la configuration décrite à la fin de ce tutoriel) soient toujours disponibles pour de nouveaux utilisateurs qui se connecteraient à votre application. Il s&#039;occupera également de supprimer les containers quand vos utilisateurs se déconnectent. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
# Dans cet exemple, l&#039;application écoutera systématiquement sur le port 3838&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3838, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
Notez le tag &amp;lt;code&amp;gt;$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt; qui permet de taguer l&#039;image avec le hash (la référence) du commit actuel (ne fonctionne que si vous êtes dans un dépôt git). Ce tag est bien pratique si vous n&#039;incrémentez pas un numéro de version par ailleurs (&amp;lt;code&amp;gt;2.0.1&amp;lt;/code&amp;gt; dans l&#039;exemple ci-dessus). &lt;br /&gt;
&lt;br /&gt;
Le tag &amp;lt;code&amp;gt;latest&amp;lt;/code&amp;gt; est à mettre sur la dernière version de votre image. Il sera automatiquement retiré de toutes les autres versions de votre image.  &lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;docker images&amp;lt;/code&amp;gt; permet ensuite de lister les tags disponibles localement. Si le build a réussi, vous devriez y voir votre image.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
~$ docker images&lt;br /&gt;
REPOSITORY                                                         TAG             IMAGE ID       CREATED         SIZE&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           2.0.1           b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           7ad814c         b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           latest          b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           642e23b         8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           latest          8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           502564d         9a2050fc09d4   4 days ago      1.38GB&lt;br /&gt;
semaphoreui/semaphore                                              v2.12.4         136bec584184   2 weeks ago     727MB&lt;br /&gt;
ghcr.io/mastergeonum/cartondes                                     main            a95ee654e34a   5 weeks ago     205MB&lt;br /&gt;
dockurr/windows                                                    latest          c3419fd6e55a   2 months ago    384MB&lt;br /&gt;
docker.osgeo.org/geoserver                                         2.26.1          a91188b23092   3 months ago    608MB&lt;br /&gt;
rocker/verse                                                       4.4.1           202c993befdc   3 months ago    3.77GB&lt;br /&gt;
ghcr.io/evs-gis/glourbee-ui                                        1.1.0           03e05bed5617   4 months ago    1.47GB&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Remarquez que &amp;lt;code&amp;gt;ghcr.io/evs-gis/mapdoapp&amp;lt;/code&amp;gt; est présente plusieurs fois avec des tags différents, mais le même IMAGE ID. Il s&#039;agit bien de la même image et elle n&#039;est pas dupliquée sur le disque.&lt;br /&gt;
&lt;br /&gt;
Pour supprimer un tag, on utilisera la commande &amp;lt;code&amp;gt;docker image rm ghcr.io/evs-gis/mapdoapp:2.0.1&amp;lt;/code&amp;gt;. Si plus aucun tag n&#039;existe pour l&#039;image, elle sera complètement supprimée du disque local. &lt;br /&gt;
&lt;br /&gt;
=== Tester l&#039;image ===&lt;br /&gt;
Pour tester son image, on peut utiliser la commande &amp;lt;code&amp;gt;docker run&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker run --rm -p 3838:3838 ghcr.io/evs-gis/mapdoapp:latest&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* --rm : Supprimer le container lorsqu&#039;il est arrêté.&lt;br /&gt;
* -p 3838:3838 : exposer le port 3838 local et le faire pointer vers le port 3838 dans le container.&lt;br /&gt;
&lt;br /&gt;
Les logs de l&#039;application s&#039;affichent dans le terminal et l&#039;application est accessible dans un navigateur à l&#039;adresse http://localhost:3838. Pour stopper le container, &#039;&#039;&#039;Ctrl+C&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Faire du ménage localement ===&lt;br /&gt;
Il arrive que des vieilles images sans tag, de vieux volumes et de vieux containers plantés restent sur le disque au fil du temps. Tester la commande &amp;lt;code&amp;gt;docker ps --all&amp;lt;/code&amp;gt; par exemple, pour lister tous les containers locaux (lancés ou stoppés). La commande &amp;lt;code&amp;gt;docker system prune&amp;lt;/code&amp;gt; permet de faire le grand ménage.&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
Il faut d&#039;abord se loguer sur le registre avec son login GitHub habituel, et un &#039;&#039;Personal Access Token&#039;&#039; en guise de mot de passe. Pour [https://github.com/settings/tokens/new obtenir un &#039;&#039;Personal Access Token&#039;&#039;], rendez-vous [https://github.com/settings/tokens/new ici] et activez bien le droit &amp;lt;code&amp;gt;write:packages&amp;lt;/code&amp;gt; pour votre token.  &amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
# La commande suivante est à lancer pour se loguer sur le registre. Il n&#039;est pas nécessaire de la relancer à chaque fois.&lt;br /&gt;
docker login ghcr.io&lt;br /&gt;
&lt;br /&gt;
# Pour pousser tous les tags de notre image sur le registre, on utilise ensuite la commande suivante.&lt;br /&gt;
docker push ghcr.io/evs-gis/mapdoapp -a&lt;br /&gt;
&lt;br /&gt;
# Pour pousser seulement un tag spécifique, on préfèrera la commande suivante.&lt;br /&gt;
docker push ghcr.io/evs-gis/mapdoapp:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration de l&#039;application sur le serveur ShinyProxy de production ==&lt;br /&gt;
La configuration initiale de l&#039;application doit être faite par l&#039;administrateur du serveur.&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
La mise à jour d&#039;une appli sur le serveur de prod ne nécessite généralement pas de modifier la configuration. Il suffit de &#039;&#039;&#039;pousser la nouvelle version de votre image sur votre registre&#039;&#039;&#039; (avec le tag latest), puis de &#039;&#039;&#039;lancer le job &#039;&#039;Mise à jour d&#039;une application en production sous ShinyProxy&#039;&#039; sur Jenkins&#039;&#039;&#039; pour forcer le redémarrage des containers d&#039;attente déjà lancés. Si l&#039;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&#039;image arrive sur le registre. &lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Formations&amp;diff=1098</id>
		<title>Formations</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Formations&amp;diff=1098"/>
		<updated>2025-03-27T13:24:30Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Formations ISIG 2025 ==&lt;br /&gt;
Les formations proposées par ISIG en 2025 sont visibles sur l&#039;[https://umr5600.cnrs.fr/fr/support-technique/imagerie-et-systemes-dinformation-geographiques/isig-les-formations/isig-agenda-des-formations/ Agenda des formations ISIG].&lt;br /&gt;
&lt;br /&gt;
== Anciennes formations ISIG ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Formation&lt;br /&gt;
!Dates&lt;br /&gt;
!Format.eur.rice.s&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1086</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1086"/>
		<updated>2025-03-24T12:02:06Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Pousser l&amp;#039;image sur un registre */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.    &lt;br /&gt;
[[Fichier:Schéma Docker.png|centré|sans_cadre|1054x1054px]]    &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
ShinyProxy fera en sorte qu&#039;un certain nombre de containers (à définir dans la configuration décrite à la fin de ce tutoriel) soient toujours disponibles pour de nouveaux utilisateurs qui se connecteraient à votre application. Il s&#039;occupera également de supprimer les containers quand vos utilisateurs se déconnectent. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
# Dans cet exemple, l&#039;application écoutera systématiquement sur le port 3838&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3838, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
Notez le tag &amp;lt;code&amp;gt;$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt; qui permet de taguer l&#039;image avec le hash (la référence) du commit actuel (ne fonctionne que si vous êtes dans un dépôt git). Ce tag est bien pratique si vous n&#039;incrémentez pas un numéro de version par ailleurs (&amp;lt;code&amp;gt;2.0.1&amp;lt;/code&amp;gt; dans l&#039;exemple ci-dessus). &lt;br /&gt;
&lt;br /&gt;
Le tag &amp;lt;code&amp;gt;latest&amp;lt;/code&amp;gt; est à mettre sur la dernière version de votre image. Il sera automatiquement retiré de toutes les autres versions de votre image.  &lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;docker images&amp;lt;/code&amp;gt; permet ensuite de lister les tags disponibles localement. Si le build a réussi, vous devriez y voir votre image.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
~$ docker images&lt;br /&gt;
REPOSITORY                                                         TAG             IMAGE ID       CREATED         SIZE&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           2.0.1           b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           7ad814c         b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           latest          b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           642e23b         8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           latest          8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           502564d         9a2050fc09d4   4 days ago      1.38GB&lt;br /&gt;
semaphoreui/semaphore                                              v2.12.4         136bec584184   2 weeks ago     727MB&lt;br /&gt;
ghcr.io/mastergeonum/cartondes                                     main            a95ee654e34a   5 weeks ago     205MB&lt;br /&gt;
dockurr/windows                                                    latest          c3419fd6e55a   2 months ago    384MB&lt;br /&gt;
docker.osgeo.org/geoserver                                         2.26.1          a91188b23092   3 months ago    608MB&lt;br /&gt;
rocker/verse                                                       4.4.1           202c993befdc   3 months ago    3.77GB&lt;br /&gt;
ghcr.io/evs-gis/glourbee-ui                                        1.1.0           03e05bed5617   4 months ago    1.47GB&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Remarquez que &amp;lt;code&amp;gt;ghcr.io/evs-gis/mapdoapp&amp;lt;/code&amp;gt; est présente plusieurs fois avec des tags différents, mais le même IMAGE ID. Il s&#039;agit bien de la même image et elle n&#039;est pas dupliquée sur le disque.&lt;br /&gt;
&lt;br /&gt;
Pour supprimer un tag, on utilisera la commande &amp;lt;code&amp;gt;docker image rm ghcr.io/evs-gis/mapdoapp:2.0.1&amp;lt;/code&amp;gt;. Si plus aucun tag n&#039;existe pour l&#039;image, elle sera complètement supprimée du disque local. &lt;br /&gt;
&lt;br /&gt;
=== Tester l&#039;image ===&lt;br /&gt;
Pour tester son image, on peut utiliser la commande &amp;lt;code&amp;gt;docker run&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker run --rm -p 3838:3838 ghcr.io/evs-gis/mapdoapp:latest&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* --rm : Supprimer le container lorsqu&#039;il est arrêté.&lt;br /&gt;
* -p 3838:3838 : exposer le port 3838 local et le faire pointer vers le port 3838 dans le container.&lt;br /&gt;
&lt;br /&gt;
Les logs de l&#039;application s&#039;affichent dans le terminal et l&#039;application est accessible dans un navigateur à l&#039;adresse http://localhost:3838. Pour stopper le container, &#039;&#039;&#039;Ctrl+C&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Faire du ménage localement ===&lt;br /&gt;
Il arrive que des vieilles images sans tag, de vieux volumes et de vieux containers plantés restent sur le disque au fil du temps. Tester la commande &amp;lt;code&amp;gt;docker ps --all&amp;lt;/code&amp;gt; par exemple, pour lister tous les containers locaux (lancés ou stoppés). La commande &amp;lt;code&amp;gt;docker system prune&amp;lt;/code&amp;gt; permet de faire le grand ménage.&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
Il faut d&#039;abord se loguer sur le registre avec son login GitHub habituel, et un &#039;&#039;Personal Access Token&#039;&#039; en guise de mot de passe. Pour [https://github.com/settings/tokens/new obtenir un &#039;&#039;Personal Access Token&#039;&#039;], rendez-vous [https://github.com/settings/tokens/new ici] et activez bien le droit &amp;lt;code&amp;gt;write:packages&amp;lt;/code&amp;gt; pour votre token.  &amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
# La commande suivante est à lancer pour se loguer sur le registre. Il n&#039;est pas nécessaire de la relancer à chaque fois.&lt;br /&gt;
docker login ghcr.io&lt;br /&gt;
&lt;br /&gt;
# Pour pousser tous les tags de notre image sur le registre, on utilise ensuite la commande suivante.&lt;br /&gt;
docker push ghcr.io/evs-gis/mapdoapp -a&lt;br /&gt;
&lt;br /&gt;
# Pour pousser seulement un tag spécifique, on préfèrera la commande suivante.&lt;br /&gt;
docker push ghcr.io/evs-gis/mapdoapp:latest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration de l&#039;application sur le serveur ShinyProxy de production ==&lt;br /&gt;
La configuration de l&#039;application se fait dans le &#039;&#039;&#039;fichier shinyapps.yml sur le dépôt privé&#039;&#039;&#039; https://github.com/EVS-GIS/isig-apps (un compte GitHub associé à l&#039;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 &#039;&#039;&#039;pull request&#039;&#039;&#039; validé par Samuel lorsque vous voulez mettre à jour cette configuration.&lt;br /&gt;
&lt;br /&gt;
L&#039;intégralité des paramètres qu&#039;il est possible de configurer est disponible [https://www.shinyproxy.io/documentation/configuration/#apps ici]. Voici les principaux que je vous recommande de configurer : &amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
    - id: mapdoapp # Identifiant unique de l&#039;application&lt;br /&gt;
      display-name: &amp;quot;Mapd&#039;O App&amp;quot; # Nom d&#039;affichage&lt;br /&gt;
      container-image: ghcr.io/evs-gis/mapdoapp:latest # Image Docker à utiliser (bien utiliser un tag &amp;quot;latest&amp;quot; pour faciliter la mise à jour)&lt;br /&gt;
      port: 3838 # Le port à écouter dans le container (dépend du port choisi au moment de la création de l&#039;image)&lt;br /&gt;
      minimum-seats-available: 3 # Le nombre de containers en attente d&#039;utilisateur que ShinyProxy doit assurer&lt;br /&gt;
      container-env: # Définitions de variables d&#039;environnement&lt;br /&gt;
        MA_VARIABLE_1: valeur1&lt;br /&gt;
        MA_VARIABLE_2: valeur2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;N&#039;hésitez pas à demander mon aide pour cette étape qui ne sera généralement à faire qu&#039;une seule fois au moment du premier déploiement de l&#039;appli. Dans certains cas où vous prévoyez un pic d&#039;affluence sur votre appli (un cours ou une conférence par exemple), vous pouvez ajuster le &amp;lt;code&amp;gt;minimum-seats-available&amp;lt;/code&amp;gt; pour éviter du temps de chargement à vos visiteurs.&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
La mise à jour d&#039;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 &#039;&#039;&#039;pousser la nouvelle version de votre image sur votre registre&#039;&#039;&#039; (avec le tag latest), puis de &#039;&#039;&#039;lancer le job &#039;&#039;Mise à jour d&#039;une application en production sous ShinyProxy&#039;&#039; sur Jenkins&#039;&#039;&#039; pour forcer le redémarrage des containers d&#039;attente déjà lancés.&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1065</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1065"/>
		<updated>2025-02-24T09:56:26Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Principe de fonctionnement de ShinyProxy (et Docker) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.    &lt;br /&gt;
[[Fichier:Schéma Docker.png|centré|sans_cadre|1054x1054px]]    &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
ShinyProxy fera en sorte qu&#039;un certain nombre de containers (à définir dans la configuration décrite à la fin de ce tutoriel) soient toujours disponibles pour de nouveaux utilisateurs qui se connecteraient à votre application. Il s&#039;occupera également de supprimer les containers quand vos utilisateurs se déconnectent. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
# Dans cet exemple, l&#039;application écoutera systématiquement sur le port 3838&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3838, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
Notez le tag &amp;lt;code&amp;gt;$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt; qui permet de taguer l&#039;image avec le hash (la référence) du commit actuel (ne fonctionne que si vous êtes dans un dépôt git). Ce tag est bien pratique si vous n&#039;incrémentez pas un numéro de version par ailleurs (&amp;lt;code&amp;gt;2.0.1&amp;lt;/code&amp;gt; dans l&#039;exemple ci-dessus). &lt;br /&gt;
&lt;br /&gt;
Le tag &amp;lt;code&amp;gt;latest&amp;lt;/code&amp;gt; est à mettre sur la dernière version de votre image. Il sera automatiquement retiré de toutes les autres versions de votre image.  &lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;docker images&amp;lt;/code&amp;gt; permet ensuite de lister les tags disponibles localement. Si le build a réussi, vous devriez y voir votre image.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
~$ docker images&lt;br /&gt;
REPOSITORY                                                         TAG             IMAGE ID       CREATED         SIZE&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           2.0.1           b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           7ad814c         b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           latest          b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           642e23b         8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           latest          8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           502564d         9a2050fc09d4   4 days ago      1.38GB&lt;br /&gt;
semaphoreui/semaphore                                              v2.12.4         136bec584184   2 weeks ago     727MB&lt;br /&gt;
ghcr.io/mastergeonum/cartondes                                     main            a95ee654e34a   5 weeks ago     205MB&lt;br /&gt;
dockurr/windows                                                    latest          c3419fd6e55a   2 months ago    384MB&lt;br /&gt;
docker.osgeo.org/geoserver                                         2.26.1          a91188b23092   3 months ago    608MB&lt;br /&gt;
rocker/verse                                                       4.4.1           202c993befdc   3 months ago    3.77GB&lt;br /&gt;
ghcr.io/evs-gis/glourbee-ui                                        1.1.0           03e05bed5617   4 months ago    1.47GB&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Remarquez que &amp;lt;code&amp;gt;ghcr.io/evs-gis/mapdoapp&amp;lt;/code&amp;gt; est présente plusieurs fois avec des tags différents, mais le même IMAGE ID. Il s&#039;agit bien de la même image et elle n&#039;est pas dupliquée sur le disque.&lt;br /&gt;
&lt;br /&gt;
Pour supprimer un tag, on utilisera la commande &amp;lt;code&amp;gt;docker image rm ghcr.io/evs-gis/mapdoapp:2.0.1&amp;lt;/code&amp;gt;. Si plus aucun tag n&#039;existe pour l&#039;image, elle sera complètement supprimée du disque local. &lt;br /&gt;
&lt;br /&gt;
=== Tester l&#039;image ===&lt;br /&gt;
Pour tester son image, on peut utiliser la commande &amp;lt;code&amp;gt;docker run&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker run --rm -p 3838:3838 ghcr.io/evs-gis/mapdoapp:latest&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* --rm : Supprimer le container lorsqu&#039;il est arrêté.&lt;br /&gt;
* -p 3838:3838 : exposer le port 3838 local et le faire pointer vers le port 3838 dans le container.&lt;br /&gt;
&lt;br /&gt;
Les logs de l&#039;application s&#039;affichent dans le terminal et l&#039;application est accessible dans un navigateur à l&#039;adresse http://localhost:3838. Pour stopper le container, &#039;&#039;&#039;Ctrl+C&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Faire du ménage localement ===&lt;br /&gt;
Il arrive que des vieilles images sans tag, de vieux volumes et de vieux containers plantés restent sur le disque au fil du temps. Tester la commande &amp;lt;code&amp;gt;docker ps --all&amp;lt;/code&amp;gt; par exemple, pour lister tous les containers locaux (lancés ou stoppés). La commande &amp;lt;code&amp;gt;docker system prune&amp;lt;/code&amp;gt; permet de faire le grand ménage.&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
== Configuration de l&#039;application sur le serveur ShinyProxy de production ==&lt;br /&gt;
La configuration de l&#039;application se fait dans le &#039;&#039;&#039;fichier shinyapps.yml sur le dépôt privé&#039;&#039;&#039; https://github.com/EVS-GIS/isig-apps (un compte GitHub associé à l&#039;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 &#039;&#039;&#039;pull request&#039;&#039;&#039; validé par Samuel lorsque vous voulez mettre à jour cette configuration.&lt;br /&gt;
&lt;br /&gt;
L&#039;intégralité des paramètres qu&#039;il est possible de configurer est disponible [https://www.shinyproxy.io/documentation/configuration/#apps ici]. Voici les principaux que je vous recommande de configurer : &amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
    - id: mapdoapp # Identifiant unique de l&#039;application&lt;br /&gt;
      display-name: &amp;quot;Mapd&#039;O App&amp;quot; # Nom d&#039;affichage&lt;br /&gt;
      container-image: ghcr.io/evs-gis/mapdoapp:latest # Image Docker à utiliser (bien utiliser un tag &amp;quot;latest&amp;quot; pour faciliter la mise à jour)&lt;br /&gt;
      port: 3838 # Le port à écouter dans le container (dépend du port choisi au moment de la création de l&#039;image)&lt;br /&gt;
      minimum-seats-available: 3 # Le nombre de containers en attente d&#039;utilisateur que ShinyProxy doit assurer&lt;br /&gt;
      container-env: # Définitions de variables d&#039;environnement&lt;br /&gt;
        MA_VARIABLE_1: valeur1&lt;br /&gt;
        MA_VARIABLE_2: valeur2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;N&#039;hésitez pas à demander mon aide pour cette étape qui ne sera généralement à faire qu&#039;une seule fois au moment du premier déploiement de l&#039;appli. Dans certains cas où vous prévoyez un pic d&#039;affluence sur votre appli (un cours ou une conférence par exemple), vous pouvez ajuster le &amp;lt;code&amp;gt;minimum-seats-available&amp;lt;/code&amp;gt; pour éviter du temps de chargement à vos visiteurs.&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
La mise à jour d&#039;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 &#039;&#039;&#039;pousser la nouvelle version de votre image sur votre registre&#039;&#039;&#039; (avec le tag latest), puis de &#039;&#039;&#039;lancer le job &#039;&#039;Mise à jour d&#039;une application en production sous ShinyProxy&#039;&#039; sur Jenkins&#039;&#039;&#039; pour forcer le redémarrage des containers d&#039;attente déjà lancés.&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Sch%C3%A9ma_Docker.png&amp;diff=1064</id>
		<title>Fichier:Schéma Docker.png</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Sch%C3%A9ma_Docker.png&amp;diff=1064"/>
		<updated>2025-02-24T09:43:04Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : Sdunesme a téléversé une nouvelle version de Fichier:Schéma Docker.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schéma de fonctionnement basique d&#039;une application sous Docker&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1063</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1063"/>
		<updated>2025-02-21T16:20:13Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Configuration de l&amp;#039;application sur le serveur ShinyProxy de production */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.    &lt;br /&gt;
[[Fichier:Schéma Docker.png|centré|sans_cadre|1054x1054px]]    &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
# Dans cet exemple, l&#039;application écoutera systématiquement sur le port 3838&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3838, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
Notez le tag &amp;lt;code&amp;gt;$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt; qui permet de taguer l&#039;image avec le hash (la référence) du commit actuel (ne fonctionne que si vous êtes dans un dépôt git). Ce tag est bien pratique si vous n&#039;incrémentez pas un numéro de version par ailleurs (&amp;lt;code&amp;gt;2.0.1&amp;lt;/code&amp;gt; dans l&#039;exemple ci-dessus). &lt;br /&gt;
&lt;br /&gt;
Le tag &amp;lt;code&amp;gt;latest&amp;lt;/code&amp;gt; est à mettre sur la dernière version de votre image. Il sera automatiquement retiré de toutes les autres versions de votre image.  &lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;docker images&amp;lt;/code&amp;gt; permet ensuite de lister les tags disponibles localement. Si le build a réussi, vous devriez y voir votre image.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
~$ docker images&lt;br /&gt;
REPOSITORY                                                         TAG             IMAGE ID       CREATED         SIZE&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           2.0.1           b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           7ad814c         b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           latest          b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           642e23b         8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           latest          8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           502564d         9a2050fc09d4   4 days ago      1.38GB&lt;br /&gt;
semaphoreui/semaphore                                              v2.12.4         136bec584184   2 weeks ago     727MB&lt;br /&gt;
ghcr.io/mastergeonum/cartondes                                     main            a95ee654e34a   5 weeks ago     205MB&lt;br /&gt;
dockurr/windows                                                    latest          c3419fd6e55a   2 months ago    384MB&lt;br /&gt;
docker.osgeo.org/geoserver                                         2.26.1          a91188b23092   3 months ago    608MB&lt;br /&gt;
rocker/verse                                                       4.4.1           202c993befdc   3 months ago    3.77GB&lt;br /&gt;
ghcr.io/evs-gis/glourbee-ui                                        1.1.0           03e05bed5617   4 months ago    1.47GB&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Remarquez que &amp;lt;code&amp;gt;ghcr.io/evs-gis/mapdoapp&amp;lt;/code&amp;gt; est présente plusieurs fois avec des tags différents, mais le même IMAGE ID. Il s&#039;agit bien de la même image et elle n&#039;est pas dupliquée sur le disque.&lt;br /&gt;
&lt;br /&gt;
Pour supprimer un tag, on utilisera la commande &amp;lt;code&amp;gt;docker image rm ghcr.io/evs-gis/mapdoapp:2.0.1&amp;lt;/code&amp;gt;. Si plus aucun tag n&#039;existe pour l&#039;image, elle sera complètement supprimée du disque local. &lt;br /&gt;
&lt;br /&gt;
=== Tester l&#039;image ===&lt;br /&gt;
Pour tester son image, on peut utiliser la commande &amp;lt;code&amp;gt;docker run&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker run --rm -p 3838:3838 ghcr.io/evs-gis/mapdoapp:latest&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* --rm : Supprimer le container lorsqu&#039;il est arrêté.&lt;br /&gt;
* -p 3838:3838 : exposer le port 3838 local et le faire pointer vers le port 3838 dans le container.&lt;br /&gt;
&lt;br /&gt;
Les logs de l&#039;application s&#039;affichent dans le terminal et l&#039;application est accessible dans un navigateur à l&#039;adresse http://localhost:3838. Pour stopper le container, &#039;&#039;&#039;Ctrl+C&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Faire du ménage localement ===&lt;br /&gt;
Il arrive que des vieilles images sans tag, de vieux volumes et de vieux containers plantés restent sur le disque au fil du temps. Tester la commande &amp;lt;code&amp;gt;docker ps --all&amp;lt;/code&amp;gt; par exemple, pour lister tous les containers locaux (lancés ou stoppés). La commande &amp;lt;code&amp;gt;docker system prune&amp;lt;/code&amp;gt; permet de faire le grand ménage.&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
== Configuration de l&#039;application sur le serveur ShinyProxy de production ==&lt;br /&gt;
La configuration de l&#039;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&#039;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 une pull request validée par Samuel lorsque vous voulez mettre à jour cette configuration.&lt;br /&gt;
&lt;br /&gt;
L&#039;intégralité des paramètres qu&#039;il est possible de configurer est disponible [https://www.shinyproxy.io/documentation/configuration/#apps ici].&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
La mise à jour d&#039;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 &amp;quot;Mise...... &amp;quot; sur Jenkins pour forcer le redémarrage des containers d&#039;attente déjà lancés.&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1062</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1062"/>
		<updated>2025-02-21T16:17:59Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Configuration sur l&amp;#039;instance de dev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.    &lt;br /&gt;
[[Fichier:Schéma Docker.png|centré|sans_cadre|1054x1054px]]    &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
# Dans cet exemple, l&#039;application écoutera systématiquement sur le port 3838&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3838, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
Notez le tag &amp;lt;code&amp;gt;$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt; qui permet de taguer l&#039;image avec le hash (la référence) du commit actuel (ne fonctionne que si vous êtes dans un dépôt git). Ce tag est bien pratique si vous n&#039;incrémentez pas un numéro de version par ailleurs (&amp;lt;code&amp;gt;2.0.1&amp;lt;/code&amp;gt; dans l&#039;exemple ci-dessus). &lt;br /&gt;
&lt;br /&gt;
Le tag &amp;lt;code&amp;gt;latest&amp;lt;/code&amp;gt; est à mettre sur la dernière version de votre image. Il sera automatiquement retiré de toutes les autres versions de votre image.  &lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;docker images&amp;lt;/code&amp;gt; permet ensuite de lister les tags disponibles localement. Si le build a réussi, vous devriez y voir votre image.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
~$ docker images&lt;br /&gt;
REPOSITORY                                                         TAG             IMAGE ID       CREATED         SIZE&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           2.0.1           b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           7ad814c         b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           latest          b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           642e23b         8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           latest          8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           502564d         9a2050fc09d4   4 days ago      1.38GB&lt;br /&gt;
semaphoreui/semaphore                                              v2.12.4         136bec584184   2 weeks ago     727MB&lt;br /&gt;
ghcr.io/mastergeonum/cartondes                                     main            a95ee654e34a   5 weeks ago     205MB&lt;br /&gt;
dockurr/windows                                                    latest          c3419fd6e55a   2 months ago    384MB&lt;br /&gt;
docker.osgeo.org/geoserver                                         2.26.1          a91188b23092   3 months ago    608MB&lt;br /&gt;
rocker/verse                                                       4.4.1           202c993befdc   3 months ago    3.77GB&lt;br /&gt;
ghcr.io/evs-gis/glourbee-ui                                        1.1.0           03e05bed5617   4 months ago    1.47GB&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Remarquez que &amp;lt;code&amp;gt;ghcr.io/evs-gis/mapdoapp&amp;lt;/code&amp;gt; est présente plusieurs fois avec des tags différents, mais le même IMAGE ID. Il s&#039;agit bien de la même image et elle n&#039;est pas dupliquée sur le disque.&lt;br /&gt;
&lt;br /&gt;
Pour supprimer un tag, on utilisera la commande &amp;lt;code&amp;gt;docker image rm ghcr.io/evs-gis/mapdoapp:2.0.1&amp;lt;/code&amp;gt;. Si plus aucun tag n&#039;existe pour l&#039;image, elle sera complètement supprimée du disque local. &lt;br /&gt;
&lt;br /&gt;
=== Tester l&#039;image ===&lt;br /&gt;
Pour tester son image, on peut utiliser la commande &amp;lt;code&amp;gt;docker run&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker run --rm -p 3838:3838 ghcr.io/evs-gis/mapdoapp:latest&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* --rm : Supprimer le container lorsqu&#039;il est arrêté.&lt;br /&gt;
* -p 3838:3838 : exposer le port 3838 local et le faire pointer vers le port 3838 dans le container.&lt;br /&gt;
&lt;br /&gt;
Les logs de l&#039;application s&#039;affichent dans le terminal et l&#039;application est accessible dans un navigateur à l&#039;adresse http://localhost:3838. Pour stopper le container, &#039;&#039;&#039;Ctrl+C&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Faire du ménage localement ===&lt;br /&gt;
Il arrive que des vieilles images sans tag, de vieux volumes et de vieux containers plantés restent sur le disque au fil du temps. Tester la commande &amp;lt;code&amp;gt;docker ps --all&amp;lt;/code&amp;gt; par exemple, pour lister tous les containers locaux (lancés ou stoppés). La commande &amp;lt;code&amp;gt;docker system prune&amp;lt;/code&amp;gt; permet de faire le grand ménage.&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
== Configuration de l&#039;application sur le serveur ShinyProxy de production ==&lt;br /&gt;
La configuration de l&#039;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&#039;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 une pull request validée par Samuel lorsque vous voulez mettre à jour cette configuration.&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
La mise à jour d&#039;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 &amp;quot;Mise...... &amp;quot; sur Jenkins pour forcer le redémarrage des containers d&#039;attente déjà lancés.&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1061</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1061"/>
		<updated>2025-02-21T16:04:28Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Tester l&amp;#039;image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.    &lt;br /&gt;
[[Fichier:Schéma Docker.png|centré|sans_cadre|1054x1054px]]    &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
# Dans cet exemple, l&#039;application écoutera systématiquement sur le port 3838&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3838, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
Notez le tag &amp;lt;code&amp;gt;$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt; qui permet de taguer l&#039;image avec le hash (la référence) du commit actuel (ne fonctionne que si vous êtes dans un dépôt git). Ce tag est bien pratique si vous n&#039;incrémentez pas un numéro de version par ailleurs (&amp;lt;code&amp;gt;2.0.1&amp;lt;/code&amp;gt; dans l&#039;exemple ci-dessus). &lt;br /&gt;
&lt;br /&gt;
Le tag &amp;lt;code&amp;gt;latest&amp;lt;/code&amp;gt; est à mettre sur la dernière version de votre image. Il sera automatiquement retiré de toutes les autres versions de votre image.  &lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;docker images&amp;lt;/code&amp;gt; permet ensuite de lister les tags disponibles localement. Si le build a réussi, vous devriez y voir votre image.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
~$ docker images&lt;br /&gt;
REPOSITORY                                                         TAG             IMAGE ID       CREATED         SIZE&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           2.0.1           b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           7ad814c         b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           latest          b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           642e23b         8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           latest          8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           502564d         9a2050fc09d4   4 days ago      1.38GB&lt;br /&gt;
semaphoreui/semaphore                                              v2.12.4         136bec584184   2 weeks ago     727MB&lt;br /&gt;
ghcr.io/mastergeonum/cartondes                                     main            a95ee654e34a   5 weeks ago     205MB&lt;br /&gt;
dockurr/windows                                                    latest          c3419fd6e55a   2 months ago    384MB&lt;br /&gt;
docker.osgeo.org/geoserver                                         2.26.1          a91188b23092   3 months ago    608MB&lt;br /&gt;
rocker/verse                                                       4.4.1           202c993befdc   3 months ago    3.77GB&lt;br /&gt;
ghcr.io/evs-gis/glourbee-ui                                        1.1.0           03e05bed5617   4 months ago    1.47GB&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Remarquez que &amp;lt;code&amp;gt;ghcr.io/evs-gis/mapdoapp&amp;lt;/code&amp;gt; est présente plusieurs fois avec des tags différents, mais le même IMAGE ID. Il s&#039;agit bien de la même image et elle n&#039;est pas dupliquée sur le disque.&lt;br /&gt;
&lt;br /&gt;
Pour supprimer un tag, on utilisera la commande &amp;lt;code&amp;gt;docker image rm ghcr.io/evs-gis/mapdoapp:2.0.1&amp;lt;/code&amp;gt;. Si plus aucun tag n&#039;existe pour l&#039;image, elle sera complètement supprimée du disque local. &lt;br /&gt;
&lt;br /&gt;
=== Tester l&#039;image ===&lt;br /&gt;
Pour tester son image, on peut utiliser la commande &amp;lt;code&amp;gt;docker run&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker run --rm -p 3838:3838 ghcr.io/evs-gis/mapdoapp:latest&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* --rm : Supprimer le container lorsqu&#039;il est arrêté.&lt;br /&gt;
* -p 3838:3838 : exposer le port 3838 local et le faire pointer vers le port 3838 dans le container.&lt;br /&gt;
&lt;br /&gt;
Les logs de l&#039;application s&#039;affichent dans le terminal et l&#039;application est accessible dans un navigateur à l&#039;adresse http://localhost:3838. Pour stopper le container, &#039;&#039;&#039;Ctrl+C&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Faire du ménage localement ===&lt;br /&gt;
Il arrive que des vieilles images sans tag, de vieux volumes et de vieux containers plantés restent sur le disque au fil du temps. Tester la commande &amp;lt;code&amp;gt;docker ps --all&amp;lt;/code&amp;gt; par exemple, pour lister tous les containers locaux (lancés ou stoppés). La commande &amp;lt;code&amp;gt;docker system prune&amp;lt;/code&amp;gt; permet de faire le grand ménage.&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1060</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1060"/>
		<updated>2025-02-21T15:52:15Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Pousser l&amp;#039;image sur un registre */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.    &lt;br /&gt;
[[Fichier:Schéma Docker.png|centré|sans_cadre|1054x1054px]]    &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3841, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
Notez le tag &amp;lt;code&amp;gt;$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt; qui permet de taguer l&#039;image avec le hash (la référence) du commit actuel (ne fonctionne que si vous êtes dans un dépôt git). Ce tag est bien pratique si vous n&#039;incrémentez pas un numéro de version par ailleurs (&amp;lt;code&amp;gt;2.0.1&amp;lt;/code&amp;gt; dans l&#039;exemple ci-dessus). &lt;br /&gt;
&lt;br /&gt;
Le tag &amp;lt;code&amp;gt;latest&amp;lt;/code&amp;gt; est à mettre sur la dernière version de votre image. Il sera automatiquement retiré de toutes les autres versions de votre image.  &lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;docker images&amp;lt;/code&amp;gt; permet ensuite de lister les tags disponibles localement. Si le build a réussi, vous devriez y voir votre image.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
~$ docker images&lt;br /&gt;
REPOSITORY                                                         TAG             IMAGE ID       CREATED         SIZE&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           2.0.1           b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           7ad814c         b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/evs-gis/mapdoapp                                           latest          b2b999e7d781   3 days ago      1.27GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           642e23b         8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           latest          8a3daa97546e   4 days ago      1.38GB&lt;br /&gt;
ghcr.io/glourb/glourbapp                                           502564d         9a2050fc09d4   4 days ago      1.38GB&lt;br /&gt;
semaphoreui/semaphore                                              v2.12.4         136bec584184   2 weeks ago     727MB&lt;br /&gt;
ghcr.io/mastergeonum/cartondes                                     main            a95ee654e34a   5 weeks ago     205MB&lt;br /&gt;
dockurr/windows                                                    latest          c3419fd6e55a   2 months ago    384MB&lt;br /&gt;
docker.osgeo.org/geoserver                                         2.26.1          a91188b23092   3 months ago    608MB&lt;br /&gt;
rocker/verse                                                       4.4.1           202c993befdc   3 months ago    3.77GB&lt;br /&gt;
ghcr.io/evs-gis/glourbee-ui                                        1.1.0           03e05bed5617   4 months ago    1.47GB&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Remarquez que &amp;lt;code&amp;gt;ghcr.io/evs-gis/mapdoapp&amp;lt;/code&amp;gt; est présente plusieurs fois avec des tags différents, mais le même IMAGE ID. Il s&#039;agit bien de la même image et elle n&#039;est pas dupliquée sur le disque.&lt;br /&gt;
&lt;br /&gt;
Pour supprimer un tag, on utilisera la commande &amp;lt;code&amp;gt;docker image rm ghcr.io/evs-gis/mapdoapp:2.0.1&amp;lt;/code&amp;gt;. Si plus aucun tag n&#039;existe pour l&#039;image, elle sera complètement supprimée du disque local. &lt;br /&gt;
&lt;br /&gt;
=== Tester l&#039;image ===&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1059</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1059"/>
		<updated>2025-02-21T15:35:29Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Principe de fonctionnement de ShinyProxy (et Docker) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.    &lt;br /&gt;
[[Fichier:Schéma Docker.png|centré|sans_cadre|1054x1054px]]    &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3841, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
Notez le tag &amp;lt;code&amp;gt;$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt; qui permet de taguer l&#039;image avec le hash (la référence) du commit actuel (ne fonctionne que si vous êtes dans un dépôt git). Ce tag est bien pratique si vous n&#039;incrémentez pas un numéro de version par ailleurs (&amp;lt;code&amp;gt;2.0.1&amp;lt;/code&amp;gt; dans l&#039;exemple ci-dessus). &lt;br /&gt;
&lt;br /&gt;
Le tag &amp;lt;code&amp;gt;latest&amp;lt;/code&amp;gt; est à mettre sur la dernière version de votre image. Il sera automatiquement retiré de toutes les autres versions de votre image.  &lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1058</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1058"/>
		<updated>2025-02-21T15:33:29Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Construire l&amp;#039;image Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.    &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3841, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
Notez le tag &amp;lt;code&amp;gt;$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt; qui permet de taguer l&#039;image avec le hash (la référence) du commit actuel (ne fonctionne que si vous êtes dans un dépôt git). Ce tag est bien pratique si vous n&#039;incrémentez pas un numéro de version par ailleurs (&amp;lt;code&amp;gt;2.0.1&amp;lt;/code&amp;gt; dans l&#039;exemple ci-dessus). &lt;br /&gt;
&lt;br /&gt;
Le tag &amp;lt;code&amp;gt;latest&amp;lt;/code&amp;gt; est à mettre sur la dernière version de votre image. Il sera automatiquement retiré de toutes les autres versions de votre image.  &lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Sch%C3%A9ma_Docker.png&amp;diff=1057</id>
		<title>Fichier:Schéma Docker.png</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Sch%C3%A9ma_Docker.png&amp;diff=1057"/>
		<updated>2025-02-21T15:33:11Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schéma de fonctionnement basique d&#039;une application sous Docker&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1056</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1056"/>
		<updated>2025-02-21T15:22:50Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Choisir l&amp;#039;image source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.  &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3841, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
La construction d&#039;une image Docker se fait sur la base... d&#039;une autre. On choisi en général son image de base en fonction de ce qu&#039;on va faire avec. Pour une application Shiny, nous aurons besoin d&#039;une image Docker spécialisée en R. &lt;br /&gt;
&lt;br /&gt;
Le [https://rocker-project.org/images/ projet Rocker] propose plusieurs images de base avec différentes quantités de packages pré-installés. Lorsque l&#039;on choisi son image de base, il faut trouver le bon compromis entre une image légère et une image avec suffisamment de dépendances pré-installées pour qu&#039;elle soit pratique.&lt;br /&gt;
&lt;br /&gt;
L&#039;image [https://eddelbuettel.github.io/r2u/ r2u] est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! L&#039;inconvénient de cette fonctionnalité est (à ma connaissance) qu&#039;elle ne fonctionne qu&#039;avec la fonction &amp;lt;code&amp;gt;install.packages(...)&amp;lt;/code&amp;gt;. Il n&#039;est donc pas possible d&#039;installer une version spécifique d&#039;un package avec &amp;lt;code&amp;gt;remotes::install_version(...)&amp;lt;/code&amp;gt; par exemple (la fonction reste utilisable de manière classique). &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
La création d&#039;une image Docker repose sur l&#039;écriture d&#039;un fichier texte appelé &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; (sans extension).&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. C&#039;est à ce moment que l&#039;on va versionner l&#039;image en la taguant avec l&#039;argument &amp;lt;code&amp;gt;-t&amp;lt;/code&amp;gt;. On peut mettre directement plusieurs tags à une image, ou les ajouter à posteriori en relançant la commande &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt;. Si le Dockerfile n&#039;a pas changé depuis le dernier build, &amp;lt;code&amp;gt;docker build&amp;lt;/code&amp;gt; ne fera qu&#039;ajouter les tags à l&#039;image existante. &lt;br /&gt;
&lt;br /&gt;
Pour que la CLI Docker trouve bien le Dockerfile, on lance le terminal dans le dossier ou ce Dockerfile est enregistré. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build . -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarquez que le tag doit contenir le chemin complet vers le registre où sera poussée l&#039;image (étape suivante). Si vous ne précisez pas le chemin (par exemple &amp;lt;code&amp;gt;mapdoapp:latest&amp;lt;/code&amp;gt;), le registre utilisé sera DockerHub. &lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1055</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1055"/>
		<updated>2025-02-21T15:08:14Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.  &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut : &lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un appli Shiny classique, ajouter dans &amp;lt;code&amp;gt;options(..)&amp;lt;/code&amp;gt;, avant l&#039;appel de &amp;lt;code&amp;gt;shinyApp(..)&amp;lt;/code&amp;gt;, les options suivantes : &amp;lt;code&amp;gt;&amp;quot;shiny.port&amp;quot;=3841&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;&amp;quot;shiny.host&amp;quot;=&amp;quot;0.0.0.0&amp;quot;&amp;lt;/code&amp;gt;. Par exemple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(shiny)&lt;br /&gt;
library(glourbi)&lt;br /&gt;
&lt;br /&gt;
options(&amp;quot;shiny.port&amp;quot; = 3841, &amp;quot;shiny.host&amp;quot; = &amp;quot;0.0.0.0&amp;quot;, &amp;quot;golem.app.prod&amp;quot; = TRUE)&lt;br /&gt;
&lt;br /&gt;
shinyApp(ui=glourbapp:::app_ui,server=glourbapp:::app_server)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans le cas d&#039;un document Rmarkdown, ........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
https://rocker-project.org/images/&lt;br /&gt;
&lt;br /&gt;
L&#039;image r2u est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande docker build. Il est important de taguer l&#039;image avec l&#039;option -t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build ./Dockerfile -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1054</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1054"/>
		<updated>2025-02-21T14:59:44Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy (et Docker) ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli.  &lt;br /&gt;
&lt;br /&gt;
Afin que votre application puisse fonctionner sur ShinyProxy, il va donc falloir créer une &#039;&#039;&#039;image&#039;&#039;&#039; qui permettra au serveur ShinyProxy de lancer des &#039;&#039;&#039;containers&#039;&#039;&#039; de votre application.  &lt;br /&gt;
&lt;br /&gt;
Vous n&#039;aurez généralement pas besoin de volume pour stocker des données pérennes dans le cas d&#039;une application Shiny. Si votre application utilise une base de données, celle-ci devra être externalisée (hébergée sur le serveur de bases de données d&#039;ISIG par exemple). &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
Pour fonctionner en mode conteneurisé, votre application devra écouter toujours sur le même port (ce qui n&#039;est pas le comportement par défaut d&#039;une application Shiny). &lt;br /&gt;
&lt;br /&gt;
Afin de s&#039;en assurer, il faut ..........&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
https://rocker-project.org/images/&lt;br /&gt;
&lt;br /&gt;
L&#039;image r2u est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande docker build. Il est important de taguer l&#039;image avec l&#039;option -t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build ./Dockerfile -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1053</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1053"/>
		<updated>2025-02-21T14:38:00Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
La conteneurisation peut se faire directement sur votre machine personelle si vous y avez installé Docker (https://docs.docker.com/engine/install/), ou sur le serveur isig-apps de dev via [https://rstudio.evs.ens-lyon.fr Rstudio server] et son terminal intégré.&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
https://rocker-project.org/images/&lt;br /&gt;
&lt;br /&gt;
L&#039;image r2u est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande docker build. Il est important de taguer l&#039;image avec l&#039;option -t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build ./Dockerfile -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1052</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1052"/>
		<updated>2025-02-12T21:08:00Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Conteneurisation de votre appli Shiny */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
&lt;br /&gt;
=== Fixer le port ===&lt;br /&gt;
&lt;br /&gt;
=== Choisir l&#039;image source ===&lt;br /&gt;
https://rocker-project.org/images/&lt;br /&gt;
&lt;br /&gt;
L&#039;image r2u est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! &lt;br /&gt;
&lt;br /&gt;
=== Écrire le Dockerfile ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé (attention à bien fixer le port sur lequel votre appli écoute, cf. ci-dessus)&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Construire l&#039;image Docker ===&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande docker build. Il est important de taguer l&#039;image avec l&#039;option -t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build ./Dockerfile -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pousser l&#039;image sur un registre ===&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1051</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1051"/>
		<updated>2025-02-12T21:04:11Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Conteneurisation de votre appli Shiny */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
https://rocker-project.org/images/&lt;br /&gt;
&lt;br /&gt;
L&#039;image r2u est une bonne base assez simple à utiliser, car elle va chercher des binaires précompilés des packages R que l&#039;on souhaite installer et toutes leurs dépendances, librairies système incluses ! Pratiquement rien n&#039;y est pré-installé, il faudra donc bien préciser toutes les dépendances dont vous avez besoin. En contrepartie, l&#039;image sera plutôt légère, ce qui est une bonne chose ! &lt;br /&gt;
&lt;br /&gt;
Voici un exemple de Dockerfile pour l&#039;application GloUrb :&amp;lt;syntaxhighlight lang=&amp;quot;dockerfile&amp;quot;&amp;gt;&lt;br /&gt;
# On commence par définir l&#039;image sur laquelle va se baser la notre&lt;br /&gt;
FROM rocker/r2u:jammy&lt;br /&gt;
&lt;br /&gt;
# On précise quelques infos qui permettrons d&#039;identifier l&#039;image&lt;br /&gt;
LABEL org.opencontainers.image.authors=&amp;quot;Lise Vaudor &amp;lt;lise.vaudor@ens-lyon.fr&amp;gt;, Samuel Dunesme &amp;lt;samuel.dunesme@ens-lyon.fr&amp;gt;&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.source=&amp;quot;https://github.com/glourb/glourbapp&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.documentation=&amp;quot;https://evs-gis.github.io/glourbdoc/&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.version=&amp;quot;0.0.0.9000&amp;quot;&lt;br /&gt;
LABEL org.opencontainers.image.description=&amp;quot;An app for the GloUrb project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# On peut éventuellement générer des locales supplémentaires si notre appli utilise d&#039;autres langues que l&#039;anglais&lt;br /&gt;
RUN locale-gen fr_FR.UTF-8&lt;br /&gt;
&lt;br /&gt;
# On liste maintenant toutes les dépendances R à installer&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tidyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;shiny&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;config&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;testthat&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;tibble&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;purrr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;dplyr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;ggplot2&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;forcats&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;magrittr&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;golem&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;sf&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;plotly&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;spelling&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;mclust&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;leaflet&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cluster&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cowplot&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;FactoMineR&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;glue&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;grDevices&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RColorBrewer&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;remotes&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;cicerone&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;RPostgres&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DBI&amp;quot;)&#039;&lt;br /&gt;
RUN Rscript -e &#039;install.packages(&amp;quot;DT&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
RUN Rscript -e &#039;remotes::install_github(&amp;quot;glourb/glourbi&amp;quot;)&#039;&lt;br /&gt;
&lt;br /&gt;
# On copie l&#039;arborescence de fichiers dans un dossier app à la racine de l&#039;image. Ce sera le working directory des containers lancés avec notre image&lt;br /&gt;
RUN mkdir /app&lt;br /&gt;
ADD . /app&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
&lt;br /&gt;
# Si besoin, on peut installer notre package&lt;br /&gt;
RUN R -e &#039;remotes::install_local()&#039;&lt;br /&gt;
&lt;br /&gt;
# On détermine le port qui sera exposé&lt;br /&gt;
EXPOSE 3838&lt;br /&gt;
&lt;br /&gt;
# Pour plus de sécurité, on fait en sorte que les containers ne se lancent pas avec l&#039;utilisateur &amp;quot;root&amp;quot;, mais avec un utilisateur &amp;quot;app&amp;quot; dédié&lt;br /&gt;
RUN groupadd -g 1010 app &amp;amp;&amp;amp; useradd -c &#039;app&#039; -u 1010 -g 1010 -m -d /home/app -s /sbin/nologin app&lt;br /&gt;
USER app&lt;br /&gt;
&lt;br /&gt;
# Enfin, on précise la commande qui permet de lancer notre appli. C&#039;est cette commande qui sera lancée par défaut par tout nouveau container lancé avec notre image&lt;br /&gt;
CMD  [&amp;quot;R&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;app.R&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande docker build. Il est important de taguer l&#039;image avec l&#039;option -t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build ./Dockerfile -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1050</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1050"/>
		<updated>2025-02-06T12:59:54Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Conteneurisation de votre appli Shiny */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
https://rocker-project.org/images/&lt;br /&gt;
&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande docker build. Il est important de taguer l&#039;image avec l&#039;option -t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build ./Dockerfile -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1049</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1049"/>
		<updated>2025-02-06T10:38:51Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : /* Configuration sur l&amp;#039;instance de dev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
Pour construire l&#039;image docker à l&#039;aide du Dockerfile, il faut lancer la commande docker build. Il est important de taguer l&#039;image avec l&#039;option -t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker build ./Dockerfile -t ghcr.io/evs-gis/mapdoapp:latest -t ghcr.io/evs-gis/mapdoapp:2.0.1 -t ghcr.io/evs-gis/mapdoapp:$(git rev-parse --short HEAD)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
Forcer le redémarrage de tous les containers de votre appli (utile uniquement dans le cas où vous avez paramétré un nombre minimum de sièges supérieur à 0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;docker container restart $(docker ps -q -f ancestor=&amp;quot;ghcr.io/evs-gis/mapdoapp:latest&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1048</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1048"/>
		<updated>2025-02-05T15:13:36Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&amp;lt;big&amp;gt;Attention : Page en cours de rédaction&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1047</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1047"/>
		<updated>2025-02-05T15:13:01Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider, rapidement et simplement, dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore pas grand-chose à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy ==&lt;br /&gt;
ShinyProxy fonctionne comme un orchestrateur de conteneurs Docker. Chaque appli configurée doit avoir une image Docker associée présente sur le serveur qui exécute ShinyProxy. C&#039;est ShinyProxy qui s&#039;occupera ensuite de lancer et stopper un conteneur à chaque fois qu&#039;un internaute se connectera ou se déconnectera de votre appli. &lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1046</id>
		<title>ShinyProxy</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=ShinyProxy&amp;diff=1046"/>
		<updated>2025-02-05T15:08:59Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : Page créée avec « ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&amp;#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&amp;#039;ancien Shiny-Server et nécessite quelques bases dans l&amp;#039;utilisation de Docker. L&amp;#039;objectif de cette page est de vous guider dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore rien à Docker.  == Principe de fonctionnement de ShinyProxy ==  == Co... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ISIG-Apps passe sous ShinyProxy pour améliorer la stabilité et l&#039;isolation de vos applications pendant les montées en charge. Le fonctionnement est très différent par rapport à l&#039;ancien Shiny-Server et nécessite quelques bases dans l&#039;utilisation de Docker. L&#039;objectif de cette page est de vous guider dans le nouveau workflow dev &amp;gt; prod en partant du principe que vous ne connaissez encore rien à Docker.&lt;br /&gt;
&lt;br /&gt;
== Principe de fonctionnement de ShinyProxy ==&lt;br /&gt;
&lt;br /&gt;
== Conteneurisation de votre appli Shiny ==&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de dev ==&lt;br /&gt;
&lt;br /&gt;
== Configuration sur l&#039;instance de prod ==&lt;br /&gt;
&lt;br /&gt;
== Mise à jour d&#039;une appli ==&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Elvis_notext.png&amp;diff=1036</id>
		<title>Fichier:Elvis notext.png</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:Elvis_notext.png&amp;diff=1036"/>
		<updated>2025-01-30T14:28:23Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:FactoViz.png&amp;diff=1034</id>
		<title>Fichier:FactoViz.png</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Fichier:FactoViz.png&amp;diff=1034"/>
		<updated>2025-01-17T15:54:49Z</updated>

		<summary type="html">&lt;p&gt;Sdunesme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sdunesme</name></author>
	</entry>
</feed>