Déployer une application Shiny sur shinyapps.io (hébergé, gratuit pour démarrer)

Publiez un app.R fonctionnel sur un serveur R géré pour que n’importe qui puisse l’ouvrir via une URL — sans administration serveur.

Programming
Shiny

Déployez une application Shiny sur shinyapps.io, la plateforme gérée qui exécute votre application sur un vrai serveur R. Configurez vos identifiants rsconnect, publiez avec deployApp(), figez vos packages avec renv, découvrez les limites de l’offre gratuite et dépannez un déploiement en échec avec showLogs().

Date de publication

16 juillet 2026

Modifié

16 juillet 2026

AstucePoints clés
  • shinyapps.io exécute votre application sur un vrai serveur R — une plateforme gérée en tant que service (PaaS), donc vous déployez avec une seule commande et vous vous passez de toute administration serveur.
  • Deux appels et c’est en ligne : rsconnect::setAccountInfo() une fois pour lier votre compte, puis rsconnect::deployApp() depuis le dossier de l’application pour publier.
  • L’offre gratuite est généreuse pour les démos : 5 applications et 25 heures actives par mois — de quoi couvrir une pièce de portfolio ou un prototype partagé.
  • Figez vos packages avec renv pour que le serveur reconstruise exactement la bibliothèque dont votre application a besoin — la plupart des déploiements en échec sont une incompatibilité de dépendances.
  • L’URL en ligne est le juge. Si elle échoue, rsconnect::showLogs() vous montre pourquoi.

Introduction

Vous avez construit un app.R qui fonctionne sur votre ordinateur portable, et maintenant vos collègues devraient simplement ouvrir une URL — sans installer R, sans « cloner ce dépôt ». Une application Shiny a besoin d’un processus R actif pour répondre au navigateur, elle doit donc tourner quelque part qui garde R en marche. shinyapps.io est la réponse gérée la plus rapide : une plateforme en tant que service (PaaS) — une plateforme hébergée qui exécute et met à l’échelle votre application pour vous — construite par Posit spécialement pour Shiny. Vous poussez votre application ; elle tourne sur leurs serveurs.

C’est la suite naturelle de la voie sans serveur. Si le calcul de votre application est léger et n’a besoin d’aucun secret côté serveur, exécutez-la dans le navigateur avec shinylive pour un hébergement statique gratuit. Dès que vous avez besoin d’un vrai serveur R — une base de données, une clé d’API privée, un package qui n’est pas disponible dans le navigateur — shinyapps.io est le chemin le plus court.

Cette leçon prend l’application et parcourt tout le déploiement : liez votre compte, publiez-la, figez ses dépendances, vérifiez-la en ligne, et lisez les limites des offres pour savoir quand passer à la vitesse supérieure.

NotePrérequis

Il vous faut trois choses : une application Shiny fonctionnelle (si vous débutez, construisez d’abord votre première application Shiny), R avec le package rsconnect installé (install.packages("rsconnect")), et un compte shinyapps.io gratuit. Inscrivez-vous avant de commencer — les identifiants viennent du tableau de bord.

NoteCopiez n’importe quel bloc et exécutez-le en local

Le code R de cette page n’est pas exécuté ici — le déploiement écrit dans votre compte shinyapps.io, et une application Shiny a besoin d’une session R active, aucun des deux ne tourne donc dans une page web statique. Copiez n’importe quel bloc dans R et exécutez-le en local. Chaque exemple est autonome et n’utilise que des données intégrées, il tourne donc tel quel. Le vrai test, c’est l’application déployée : quand elle se charge à votre URL *.shinyapps.io, vous avez prouvé qu’elle fonctionne — the runtime is the judge.

L’application que nous allons déployer

Partez d’une application Shiny normale. En voici une petite qui dessine un histogramme du jeu de données intégré faithful (temps d’attente entre éruptions du Old Faithful) avec un curseur pour le nombre de barres — rien de spécifique au déploiement, juste une application ordinaire :

# myapp/app.R
library(shiny)

ui <- fluidPage(
  titlePanel("Old Faithful eruptions"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins", "Number of bins:",
                  min = 1, max = 50, value = 30)
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
)

server <- function(input, output, session) {
  output$distPlot <- renderPlot({
    x    <- faithful$waiting
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    hist(x, breaks = bins, col = "#3a86d4", border = "white",
         xlab = "Waiting time to next eruption (min)", main = "")
  })
}

shinyApp(ui = ui, server = server)

Enregistrez-la sous app.R dans un dossier appelé myapp, et lancez-la d’abord en local avec shiny::runApp("myapp"). Déployer une application cassée ne vous donne qu’une URL cassée — confirmez qu’elle fonctionne avant de publier.

Étape 1 — Liez votre compte

Le déploiement passe par le package rsconnect, qui a besoin de savoir vers quel compte publier. Vous l’autorisez une fois avec un jeton et un secret depuis le tableau de bord : connectez-vous à shinyapps.io, allez dans Account → Tokens → Show → Copy to clipboard. Cela vous donne un appel setAccountInfo() tout prêt — ou remplissez-le vous-même :

library(rsconnect)

rsconnect::setAccountInfo(
  name   = "your-account",       # your shinyapps.io account name
  token  = "your-token-here",    # from Account > Tokens
  secret = "your-secret-here"    # shown alongside the token
)

name est votre compte (il devient une partie de chaque URL d’application, https://your-account.shinyapps.io/...) ; token et secret sont les identifiants qui permettent à rsconnect de déployer en votre nom. C’est une configuration unique — les détails sont enregistrés en local, vous ne la répéterez donc pas pour chaque application. Traitez le secret comme un mot de passe : ne le committez pas dans un dépôt public.

Étape 2 — Déployez l’application

Depuis le dossier de l’application, un seul appel l’empaquette et la publie :

library(rsconnect)

# run from inside the app folder, or pass appDir = "myapp"
rsconnect::deployApp()

Derrière cet unique appel, rsconnect empaquette les fichiers de votre application, analyse votre code à la recherche des appels library() pour déterminer les packages nécessaires, téléverse le lot, et le serveur reconstruit cette bibliothèque et démarre votre application. Une fois terminé, il affiche l’URL en ligne et (par défaut) l’ouvre dans votre navigateur. Vous pouvez nommer l’application et contrôler ce qui est envoyé :

rsconnect::deployApp(
  appName = "old-faithful",              # the URL-friendly app name
  appDir  = "myapp",                     # the app directory (defaults to the working dir)
  appFiles = c("app.R"),                 # ship only these files (omit to auto-detect)
  forceUpdate = TRUE                     # redeploy over an existing app of the same name
)

Redéployer, c’est la même commande — rsconnect met à jour l’application existante sur place, donc pousser un correctif revient simplement à relancer deployApp().

Une règle sauve la plupart des premiers déploiements : n’appelez jamais install.packages() dans app.R (ni ui.R/server.R). Le serveur installe les packages à votre place, détectés depuis vos appels library() ; un install.packages() dans l’application s’exécute à chaque démarrage et casse le déploiement. Consultez le guide de démarrage de shinyapps.io pour comprendre comment fonctionne la détection des dépendances.

Étape 3 — Figez les dépendances avec renv

rsconnect détecte quels packages vous utilisez, mais sur l’offre gratuite et les offres inférieures le serveur résout lui-même les versions — et la dérive de versions « ça marche sur ma machine » est de loin la cause la plus fréquente d’un déploiement qui se construit en local mais échoue sur le serveur. renv corrige cela en enregistrant les versions exactes avec lesquelles votre application a été construite :

# in your app directory, once
renv::init()        # start tracking this project's packages
renv::snapshot()    # write renv.lock with the exact versions you use

Avec un renv.lock dans le dossier, le déploiement reconstruit la même bibliothèque à chaque fois, donc l’application qui tourne sur le serveur correspond à celle que vous avez testée. Refaites un snapshot à chaque fois que vous ajoutez ou mettez à jour un package.

Étape 4 — Vérifiez qu’elle est en ligne

Ouvrez l’URL affichée par deployApp(). Si l’application se charge et que le curseur redessine l’histogramme, c’est terminé — elle tourne sur un vrai serveur R que n’importe qui peut atteindre. Si vous voyez plutôt « An error has occurred », l’application a démarré mais a rencontré une erreur d’exécution ; les journaux du serveur vous disent quoi :

rsconnect::showLogs(appName = "old-faithful")

showLogs() diffuse la sortie console de l’application déployée — les mêmes messages, avertissements et erreurs que vous verriez en la lançant en local. Un package manquant, un fichier introuvable, un chemin absolu qui n’existe pas sur le serveur : tout apparaît ici. C’est le moment « the runtime is the judge » — les journaux transforment « ça a cassé » en une ligne précise et corrigeable.

Vous pouvez aussi gérer l’application en cours d’exécution depuis R :

Tâche Fonction
Lister vos applications déployées rsconnect::applications()
Voir les journaux d’une application déployée rsconnect::showLogs(appName = "...")
Changer la taille d’instance / les paramètres rsconnect::configureApp(appName, size = ...)

Offres et limites

L’offre gratuite est réelle et utile, mais elle est facturée en heures actives — le temps pendant lequel votre application tourne réellement et sert un visiteur, pas le temps d’horloge. Une application inactive se met en veille et ne consomme aucune heure ; elle se réveille à la visite suivante. Ainsi 25 heures actives par mois suffisent largement pour une démo, une pièce de portfolio ou un lien que vous partagez avec quelques collègues, et ne deviennent une contrainte qu’une fois qu’une application reçoit un trafic soutenu.

Prix et limites en date de 2026 — consultez la page tarifaire de shinyapps.io pour les tarifs actuels, car les chiffres vieillissent :

Offre Prix (USD) Applications Heures actives/mois À noter
Free $0 5 25 support communautaire
Starter $13/mo ($145/yr) 25 100 support e-mail premium
Basic $49/mo ($550/yr) illimité 500 boost de performance
Standard $119/mo ($1,330/yr) illimité 2,000 authentification
Professional $349/mo ($3,860/yr) illimité 10,000 authentification, partage de compte, domaines personnalisés

Deux fonctionnalités payantes méritent d’être connues par leur nom, car vous ne pouvez pas les simuler sur l’offre gratuite :

  • L’authentification (Standard et au-dessus) place une connexion devant votre application, pour que seuls les utilisateurs autorisés puissent l’ouvrir — la barrière pour tout ce qui contient des données privées.
  • Les domaines personnalisés (Professional) servent l’application depuis analytics.yourcompany.com au lieu de l’URL générique your-account.shinyapps.io, avec le SSL (le certificat HTTPS qui chiffre la connexion) géré pour vous.

Commencez gratuitement ; passez à une offre supérieure quand le trafic dépasse 25 heures actives, ou quand vous avez besoin d’une connexion ou de votre propre domaine.

Quelle cible et quand

shinyapps.io est le serveur géré le plus rapide, mais ce n’est pas la seule façon d’héberger une application Shiny. Faites correspondre la tâche à la cible :

shinyapps.io (cette leçon) Serveur auto-hébergé (Docker / ShinyProxy) shinylive (sans serveur)
Effort de configuration Le plus faible — une commande Le plus élevé — vous gérez la machine Faible — exporter des fichiers statiques
Coût Offre gratuite, puis facturé Votre facture de serveur Hébergement statique gratuit
Échelle & contrôle Géré, plafonné par l’offre Contrôle total, vous le mettez à l’échelle Tourne dans le navigateur de chaque visiteur
Secrets côté serveur / base de données ✅ Oui ✅ Oui ❌ Non — tout côté client
Idéal pour Démos, tableaux de bord, portfolios Applications lourdes, privées ou à fort trafic Applications légères, publiques, sans secret

Optez pour shinyapps.io quand vous voulez un vrai serveur R sans en gérer un vous-même ; passez à un conteneur auto-hébergé (Docker, ou ShinyProxy pour de nombreux utilisateurs) pour un contrôle total ou des données sur site ; choisissez shinylive pour une application légère, publique et sans secret que vous préférez héberger gratuitement.

Travailler avec des bases de données et des API

Une application shinyapps.io peut se connecter à une base de données ou appeler une API — c’est un serveur R complet, donc une base de données dans le cloud (comme Amazon RDS ou Google Cloud SQL) ou un service REST fonctionne comme en local. Deux règles la gardent sûre :

  • Ne codez jamais un secret en dur. Placez les chaînes de connexion et les clés d’API dans des variables d’environnement — définissez-les dans le tableau de bord sous Settings → Vars et lisez-les avec Sys.getenv("DB_PASSWORD") — pour qu’elles n’apparaissent jamais dans votre code ni dans l’historique git.
  • Autorisez la connexion. Une base de données cloud doit accepter les connexions depuis le réseau de shinyapps.io, et un appel distant ajoute de la latence — mettez les réponses en cache dans des expressions réactives pour ne pas ré-interroger à chaque interaction.

Problèmes fréquents

Le déploiement échoue sur un package manquant. rsconnect détecte les packages depuis les appels library(), donc un package que vous chargez d’une autre manière (ou qui n’est pas sur le CRAN) ne sera pas trouvé. Chargez chaque package avec un library() explicite en haut de app.R, et lancez renv::snapshot() pour que les versions exactes voyagent avec le déploiement.

Ça marche en local mais échoue sur le serveur. Presque toujours un chemin absolu ou un package non détecté. Lisez les fichiers avec des chemins relatifs (readRDS("data/x.rds"), jamais C:/Users/...), empaquetez les fichiers de données dans le dossier de l’application, et lancez rsconnect::showLogs() pour voir la ligne exacte qui échoue.

« An error has occurred » dans le navigateur. L’application a été déployée mais a planté à l’exécution. Ne devinez pas — rsconnect::showLogs(appName = "...") affiche l’erreur côté serveur. Corrigez-la en local, puis relancez deployApp().

Vous avez atteint la limite de 25 heures actives. L’application passe hors ligne jusqu’à la réinitialisation du mois. Si elle reçoit un vrai trafic, c’est un signal pour passer à une offre payante (100+ heures) plutôt qu’un bug à corriger.

Questions fréquentes

Il existe une offre réellement gratuite : 5 applications et 25 heures actives par mois, support communautaire. Les offres payantes commencent à environ $13/mois (en date de 2026) pour plus d’applications et d’heures, jusqu’à Professional pour les domaines personnalisés et l’authentification. Consultez la page tarifaire pour les tarifs actuels.

Cinq applications déployées et 25 heures actives par mois. Les heures actives ne comptent que le temps où votre application tourne réellement et sert quelqu’un — une application inactive se met en veille et n’en consomme aucune, puis se réveille à la prochaine visite. C’est amplement suffisant pour une démo ou une application de portfolio à faible trafic.

La plupart des échecs sont une incompatibilité de dépendances — un package que le serveur n’a pas pu trouver ou résoudre. Chargez chaque package avec un library() explicite, lancez renv::snapshot() pour figer les versions, et ne mettez jamais install.packages() dans app.R. Si l’application se déploie puis échoue, lancez rsconnect::showLogs() pour lire l’erreur exacte côté serveur.

Oui — c’est un vrai serveur R, donc les connexions à une base de données et les appels d’API fonctionnent comme en local. Stockez les identifiants dans des variables d’environnement (tableau de bord Settings → Vars, à lire avec Sys.getenv()), jamais dans votre code, et assurez-vous que la base de données accepte les connexions depuis le réseau de shinyapps.io.

Utilisez shinyapps.io pour l’hébergement géré le plus rapide, sans aucune administration serveur. Utilisez Posit Connect quand votre organisation doit héberger Shiny en plus d’autres contenus (rapports, API, Plumber) sur une infrastructure que vous contrôlez. Auto-hébergez avec Docker ou ShinyProxy quand vous avez besoin d’un contrôle total, de ressources lourdes ou de données sur site. shinyapps.io est le bon choix par défaut pour les démos, les tableaux de bord et les portfolios.

Testez vos connaissances

Vous avez enregistré l’application histogramme du Old Faithful sous app.R dans un dossier appelé myapp, et vous avez un compte shinyapps.io. Quels deux appels rsconnect la font passer de « ça marche sur mon portable » à une URL en ligne, et que fait chacun d’eux ?

Un appel est une configuration unique qui lie votre compte avec des identifiants du tableau de bord. L’autre est celui que vous lancez depuis le dossier de l’application pour publier réellement — et que vous relancez pour pousser des mises à jour.

library(rsconnect)

# 1. one-time: link your account (token + secret from Account > Tokens)
rsconnect::setAccountInfo(
  name   = "your-account",
  token  = "your-token-here",
  secret = "your-secret-here"
)

# 2. from the app directory: bundle, upload, build, and publish
rsconnect::deployApp(appDir = "myapp", appName = "old-faithful")

setAccountInfo() autorise rsconnect à publier vers votre compte (à lancer une fois). deployApp() empaquette l’application, détecte ses packages, la téléverse, et le serveur la construit et la démarre — en affichant https://your-account.shinyapps.io/old-faithful comme URL en ligne. Relancez deployApp() à tout moment pour pousser un correctif.

Votre application tourne parfaitement avec shiny::runApp() mais la version déployée affiche « An error has occurred ». Quelle est la première chose à faire ?

A. Passer à une offre payante pour plus de mémoire.
B. Lancer rsconnect::showLogs() pour lire l’erreur côté serveur, puis corriger et redéployer.
C. Ajouter des appels install.packages() en haut de app.R.
D. Supprimer l’application et tout recommencer.

B. « An error has occurred » signifie que l’application a été déployée mais a planté à l’exécution — les journaux du serveur nomment la cause. rsconnect::showLogs() affiche l’erreur exacte (un package manquant, un mauvais chemin), que vous corrigez en local puis redéployez avec deployApp(). A est prématuré (ce n’est presque jamais un problème de mémoire à ce stade). C est faux et activement nuisible — install.packages() dans app.R casse le déploiement ; les dépendances sont détectées depuis les appels library(). D jette un déploiement fonctionnel pour une ligne corrigeable.

Conclusion

Déployer une application Shiny sur shinyapps.io tient en deux appels une fois le compte lié : setAccountInfo() pour autoriser rsconnect, puis deployApp() depuis le dossier de l’application. Figez vos packages avec renv pour que le serveur reconstruise la bibliothèque que vous avez testée, et sortez showLogs() dès que l’application en ligne se comporte mal. L’offre gratuite — 5 applications, 25 heures actives — porte une démo ou un portfolio de bout en bout ; passez à une offre supérieure quand le trafic, une connexion ou un domaine personnalisé l’exigent.

Leçons connexes

Cette page vous a-t-elle été utile ?

Prouvez que vous savez le faire. Maîtrisez toute la série Shiny en production — suivez votre parcours, construisez des projets et obtenez un certificat.

Commencer gratuitement →

Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.

dès 15 $/mois facturé annuellement

Passer à Pro →

✓ Vous êtes Pro — continuez. The runtime is the judge.

Recevez les nouvelles leçons R & Python par e-mail

Pratique, reproductible, sans spam. Désinscription à tout moment.

Double opt-in. Nous ne partageons jamais votre e-mail.

Partager cette pageXLinkedInRedditHN

Réutilisation

Citation

BibTeX
@online{2026,
  author = {},
  title = {Déployer une application Shiny sur shinyapps.io (hébergé,
    gratuit pour démarrer)},
  date = {2026-07-16},
  url = {https://www.datanovia.com/learn/programming/shiny/production/shinyapps-io},
  langid = {fr}
}
Veuillez citer ce travail comme suit :
“Déployer une application Shiny sur shinyapps.io (hébergé, gratuit pour démarrer).” 2026. July 16. https://www.datanovia.com/learn/programming/shiny/production/shinyapps-io.