0Pricing
R Academy · Lektion

Shiny-Apps bereitstellen

Veröffentlichen Sie Apps auf shinyapps.io, Shiny Server und in Docker-Umgebungen

Shiny-Apps bereitstellen ist eine kostenlose R Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des R Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Übersicht der Deployment-Optionen

Shiny-Apps können je nach Budget, erwartetem Datenverkehr und Anforderungen an die Kontrolle auf mehreren Plattformen bereitgestellt werden:

  • shinyapps.io: Verwaltetes Cloud-Hosting von Posit – am einfachsten, kostenloser Tarif verfügbar.
  • Shiny Server (Open Source): Selbst gehostet unter Linux, kostenlos.
  • Posit Connect: Kommerziell, für Unternehmen geeignet, unterstützt auch R Markdown und Plumber.
  • Docker + rocker/shiny: Maximale Portabilität und Kontrolle.
# Summary of deployment options and their trade-offs:
# shinyapps.io: managed, auto-scaling, per-instance pricing
# Shiny Server: self-hosted, unlimited users, needs sysadmin
# Posit Connect: enterprise SSO, scheduling, REST APIs
# Docker: any cloud provider, reproducible environments

cat('Choose based on: scale, budget, infra control needs')

Struktur von app.R für das Deployment

Eine bereitstellbare Shiny-App muss entweder aus einer einzelnen Datei app.R (mit ui und server) oder aus den beiden Dateien ui.R und server.R bestehen. Alle Paketabhängigkeiten müssen am Anfang mit library() deklariert werden. Datendateien müssen sich im selben Verzeichnis befinden oder relativ zur App erreichbar sein.

# Minimal app.R for deployment
library(shiny)
library(ggplot2)
library(dplyr)

# Load data relative to app directory
data <- readRDS('data/processed_data.rds')

ui <- fluidPage(
  titlePanel('My Deployed App'),
  sidebarLayout(
    sidebarPanel(selectInput('var', 'Variable:', choices = names(data))),
    mainPanel(plotOutput('main_plot'))
  )
)

server <- function(input, output, session) {
  output$main_plot <- renderPlot({
    ggplot(data, aes_string(x = input$var)) + geom_histogram()
  })
}

shinyApp(ui, server)

rsconnect::deployApp()

Das Paket rsconnect übernimmt das Deployment auf shinyapps.io und Posit Connect. Konfigurieren Sie zunächst die Zugangsdaten Ihres Kontos und rufen Sie anschließend im App-Verzeichnis rsconnect::deployApp() auf. Dabei werden automatisch alle R-Dateien, Daten und ein Manifest gebündelt.

library(rsconnect)

# One-time setup: link your shinyapps.io account
# rsconnect::setAccountInfo(
#   name   = 'your_account_name',
#   token  = 'YOUR_TOKEN',
#   secret = 'YOUR_SECRET'
# )

# Deploy the app in the current directory
rsconnect::deployApp(
  appDir  = '.',          # or 'path/to/app'
  appName = 'my_analysis_app',
  forceUpdate = TRUE
)

Einrichtung von shinyapps.io

shinyapps.io ist der schnellste Weg zu einer öffentlichen URL. Erstellen Sie unter shinyapps.io ein kostenloses Konto, kopieren Sie Token und Secret aus dem Dashboard und rufen Sie setAccountInfo() auf. Der kostenlose Tarif erlaubt 5 Apps mit 25 aktiven Stunden pro Monat.

library(rsconnect)

# Copy credentials from shinyapps.io -> Account -> Tokens
rsconnect::setAccountInfo(
  name   = 'your_username',
  token  = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  secret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
)

# Verify the connection
rsconnect::accountInfo()

# List currently deployed apps
rsconnect::applications()

Shiny Server Open Source

Shiny Server läuft unter Linux (Ubuntu/RHEL) und stellt Shiny-Apps aus dem Verzeichnis /srv/shiny-server/ bereit. Jedes Unterverzeichnis wird zu einer App unter http://server:3838/subdirname/. Der Server ist kostenlos und unterstützt eine unbegrenzte Anzahl gleichzeitiger Benutzer (im Rahmen der Serverkapazität).

# Install Shiny Server on Ubuntu:
# sudo apt-get install r-base
# sudo R -e 'install.packages(c("shiny", "rmarkdown"))'
# wget https://download3.rstudio.org/ubuntu-20.04/x86_64/shiny-server-1.5.21.1012-amd64.deb
# sudo dpkg -i shiny-server-1.5.21.1012-amd64.deb

# Deploy an app:
# sudo cp -r /path/to/myapp /srv/shiny-server/myapp
# Access at: http://your-server:3838/myapp

# Config file: /etc/shiny-server/shiny-server.conf
cat('Shiny Server config controls ports, auth, and app paths')

Docker mit rocker/shiny

Das Docker-Image rocker/shiny stellt einen vorkonfigurierten Shiny Server bereit. Binden Sie Ihr App-Verzeichnis in den Container ein, damit die App sofort bereitgestellt wird. Docker gewährleistet Reproduzierbarkeit – dasselbe Image läuft auf jedem Host identisch.

# Dockerfile for a custom Shiny app
# FROM rocker/shiny:4.4.0
#
# # Install R package dependencies
# RUN R -e 'install.packages(c("ggplot2","dplyr","DT"))'
#
# # Copy app files
# COPY myapp/ /srv/shiny-server/myapp/
#
# EXPOSE 3838

# Build and run:
# docker build -t my-shiny-app .
# docker run -p 3838:3838 my-shiny-app

# Access at: http://localhost:3838/myapp

renv für reproduzierbare Abhängigkeiten

renv erstellt eine projektbezogene Paketbibliothek mit einer Lockdatei (renv.lock), in der die exakten Paketversionen festgehalten werden. Beim Deployment sorgt diese Lockdatei dafür, dass der Server oder das Docker-Image genau dieselben Paketversionen installiert, die während der Entwicklung verwendet wurden.

library(renv)

# Initialise renv in the project (creates renv.lock)
renv::init()

# After installing/updating packages, record the state
renv::snapshot()

# On the server: restore exact versions from lockfile
renv::restore()

# Check lockfile for a specific package version
renv::dependencies()  # lists all used packages

Umgebungsvariablen für die Konfiguration

API-Schlüssel, Datenbankpasswörter oder umgebungsspezifische Einstellungen dürfen niemals fest im App-Code hinterlegt werden. Verwenden Sie stattdessen Umgebungsvariablen, die mit Sys.getenv('VAR_NAME', unset = NA) gelesen werden. Setzen Sie diese lokal in .Renviron und für die Produktion in der Umgebungskonfiguration der Hosting-Plattform.

# In .Renviron (never commit this file):
# DB_HOST=prod-db.example.com
# DB_PASSWORD=secret123
# API_KEY=key_abc

# In app.R:
db_host <- Sys.getenv('DB_HOST',     unset = 'localhost')
db_pass <- Sys.getenv('DB_PASSWORD', unset = '')
api_key <- Sys.getenv('API_KEY',     unset = '')

if (api_key == '') {
  warning('API_KEY not set — some features disabled')
}

Übersicht über Posit Connect

Posit Connect ist die Unternehmensplattform für das Deployment von Shiny-Apps, R-Markdown-Dokumenten, Plumber-APIs und mehr. Unterstützt werden:

  • Single Sign-On (SSO) über LDAP oder SAML
  • Geplante Ausführung von R-Markdown-Berichten
  • Zugriffskontrolle auf App-Ebene
  • Automatische Skalierung und Load Balancing

Das Deployment erfolgt mit demselben rsconnect::deployApp()-Workflow wie bei shinyapps.io.

library(rsconnect)

# Configure connection to Posit Connect server
rsconnect::addServer(
  url  = 'https://connect.yourcompany.com',
  name = 'my_connect_server'
)

# Authenticate with API key
rsconnect::connectApiUser(
  account = 'jsmith',
  server  = 'my_connect_server',
  apiKey  = Sys.getenv('CONNECT_API_KEY')
)

# Deploy
rsconnect::deployApp(server = 'my_connect_server')

Checkliste vor dem Deployment

Prüfen Sie vor dem Deployment einer Shiny-App in die Produktion:

  • Alle Dateipfade verwenden relative statt absolute Pfade.
  • Sensible Daten (API-Schlüssel, Passwörter) werden aus Umgebungsvariablen gelesen.
  • Paketabhängigkeiten sind mit library() oder renv.lock explizit angegeben.
  • Große Datendateien werden einmal am Anfang von server.R geladen, nicht innerhalb eines reaktiven Ausdrucks.
  • Fehlermeldungen geben keine internen Informationen an Endbenutzer preis.
# Production-hardened app.R patterns

# Load data once at startup (not per-session)
app_data <- readRDS('data/processed.rds')  # outside server()

server <- function(input, output, session) {
  # Reference app_data directly — already in memory
  output$plot <- renderPlot({
    subset_data <- app_data[app_data$group == input$grp, ]
    plot(subset_data$x, subset_data$y)
  })

  # Sanitise error messages
  tryCatch({
    risky_operation()
  }, error = function(e) {
    showNotification('An error occurred.', type = 'error')
    # log the real error internally, not to user
    message('Error: ', conditionMessage(e))
  })
}

Überlegungen zur Skalierung

Shiny-Apps sind sitzungsbasiert: Jeder Benutzer erhält einen eigenen R-Prozess (oder Worker). Strategien zur Skalierung:

  • Vorberechnete Daten laden, sobald die App startet, statt sie für jede Sitzung neu zu berechnen.
  • Reaktives Caching verwenden mit bindCache() für aufwendige Berechnungen, die über mehrere Sitzungen hinweg gemeinsam genutzt werden.
  • Mehrere Worker: Shiny Server Pro und Posit Connect starten parallele R-Prozesse.
  • Datenbank-Backends: DBI/pool für gleichzeitige Datenbankzugriffe verwenden.
library(shiny)
library(pool)

# Create a database connection pool at startup
# (shared across all sessions)
pool <- dbPool(
  drv      = RPostgres::Postgres(),
  host     = Sys.getenv('DB_HOST'),
  dbname   = 'analytics',
  user     = Sys.getenv('DB_USER'),
  password = Sys.getenv('DB_PASSWORD'),
  minSize  = 2,
  maxSize  = 10
)

onStop(function() { poolClose(pool) })

server <- function(input, output, session) {
  output$tbl <- renderTable({
    dbGetQuery(pool, 'SELECT * FROM metrics LIMIT 100')
  })
}

Kurzer Test

Wie sollten API-Schlüssel und Datenbankpasswörter in einer bereitgestellten Shiny-App gehandhabt werden?

Zusammenfassung: Deployment von Shiny-Apps

Die wichtigsten Erkenntnisse zum Deployment von Shiny-Apps:

  • Deployment-Optionen: shinyapps.io (am einfachsten), Shiny Server (selbst gehostet), Posit Connect (für Unternehmen), Docker.
  • app.R muss alle Abhängigkeiten mit library() deklarieren; verwenden Sie renv::snapshot() für reproduzierbare Versionen.
  • rsconnect::deployApp() bündelt die App und überträgt sie zu shinyapps.io oder Posit Connect.
  • Docker mit rocker/shiny bietet maximale Portabilität.
  • Verwenden Sie Sys.getenv() für Zugangsdaten – hinterlegen Sie Geheimnisse niemals fest im Code.
  • Laden Sie große Datensätze beim Start (außerhalb von server()), damit sie über mehrere Sitzungen hinweg gemeinsam genutzt werden können.
  • Verwenden Sie Verbindungspools (Paket pool) für gleichzeitige Datenbankzugriffe.
# Minimal production-ready structure
# myapp/
#   app.R           <- ui + server + shinyApp()
#   data/           <- processed datasets
#   R/              <- modules and helpers
#   renv.lock       <- package version snapshot
#   .Renviron       <- local env vars (gitignored)

# Deploy:
library(rsconnect)
rsconnect::deployApp(
  appDir  = 'myapp',
  appName = 'my_production_app'
)

Häufig gestellte Fragen

Ist die Lektion „Shiny-Apps bereitstellen“ kostenlos?

Ja — der vollständige Text von „Shiny-Apps bereitstellen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des R Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der R Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Shiny-Apps bereitstellen“?

Veröffentlichen Sie Apps auf shinyapps.io, Shiny Server und in Docker-Umgebungen Du übst R Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um R Academy zu starten?

Keine Vorkenntnisse erforderlich. R Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Shiny-Apps bereitstellen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser R Academy-Lektion Code schreiben und ausführen?

Ja. Jede R Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Reaktive Programmierung im Detail
  2. Shiny-Module zur Codewiederverwendung
  3. Dynamische UI mit renderUI und insertUI
  4. Shiny-Apps bereitstellen
← Zurück zu R Academy