Wdrażanie aplikacji Shiny
Publikuj aplikacje w shinyapps.io, Shiny Server i środowiskach opartych na Dockerze.
Wdrażanie aplikacji Shiny to bezpłatna lekcja R Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Przegląd opcji wdrażania
Aplikacje Shiny można wdrażać na kilku platformach, zależnie od budżetu, przewidywanego ruchu i wymaganego poziomu kontroli:
- shinyapps.io: zarządzany hosting w chmurze firmy Posit — najłatwiejsza opcja, dostępny bezpłatny plan.
- Shiny Server (open source): samodzielny hosting w systemie Linux, bezpłatny.
- Posit Connect: rozwiązanie komercyjne klasy enterprise, obsługuje również R Markdown i Plumber.
- Docker + rocker/shiny: maksymalna przenośność i kontrola.
# 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')Struktura app.R na potrzeby wdrażania
Aplikacja Shiny gotowa do wdrożenia musi zawierać albo pojedynczy plik app.R (zawierający zarówno ui, jak i server), albo dwa pliki: ui.R i server.R. Wszystkie zależności pakietów należy zadeklarować za pomocą library() na początku pliku. Pliki danych muszą znajdować się w tym samym katalogu co aplikacja albo być dostępne za pomocą ścieżek względnych.
# 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()
Pakiet rsconnect obsługuje wdrażanie do shinyapps.io i Posit Connect. Najpierw należy skonfigurować dane uwierzytelniające konta, a następnie wywołać rsconnect::deployApp() z katalogu aplikacji. Funkcja automatycznie pakuje wszystkie pliki R, dane oraz manifest.
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
)Konfiguracja shinyapps.io
shinyapps.io to najszybszy sposób na uzyskanie publicznego adresu URL. Należy utworzyć bezpłatne konto w serwisie shinyapps.io, skopiować token i sekret z panelu, a następnie wywołać setAccountInfo(). Bezpłatny plan pozwala uruchomić 5 aplikacji przez 25 aktywnych godzin miesięcznie.
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 działa w systemie Linux (Ubuntu/RHEL) i udostępnia aplikacje Shiny z katalogu /srv/shiny-server/. Każdy podkatalog staje się aplikacją dostępną pod adresem http://server:3838/subdirname/. Rozwiązanie jest bezpłatne i obsługuje nieograniczoną liczbę jednoczesnych użytkowników, w granicach możliwości serwera.
# 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 z rocker/shiny
Obraz Dockera rocker/shiny udostępnia wstępnie skonfigurowany Shiny Server. Aby natychmiast udostępnić aplikację, należy zamontować jej katalog w kontenerze. Docker zapewnia powtarzalność — ten sam obraz działa identycznie na każdym hoście.
# 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/myapprenv na potrzeby powtarzalnych zależności
renv tworzy bibliotekę pakietów na poziomie projektu oraz plik blokady (renv.lock) zawierający dokładne wersje pakietów. Podczas wdrażania ten plik gwarantuje, że serwer lub obraz Dockera zainstaluje dokładnie te same wersje pakietów, które były używane podczas tworzenia aplikacji.
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 packagesZmienne środowiskowe do konfiguracji
Nigdy nie należy wpisywać na stałe kluczy API, haseł do baz danych ani ustawień zależnych od środowiska w kodzie aplikacji. Należy używać zmiennych środowiskowych odczytywanych za pomocą Sys.getenv('VAR_NAME', unset = NA). Lokalnie należy ustawić je w pliku .Renviron, a w środowisku produkcyjnym — w konfiguracji środowiska platformy hostingowej.
# 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')
}Przegląd Posit Connect
Posit Connect to platforma klasy enterprise do wdrażania aplikacji Shiny, dokumentów R Markdown, interfejsów API Plumber i innych elementów. Obsługuje:
- Single Sign-On (SSO) za pośrednictwem LDAP lub SAML
- zaplanowane wykonywanie raportów R Markdown
- kontrolę dostępu na poziomie aplikacji
- automatyczne skalowanie i równoważenie obciążenia
Wdrażanie odbywa się za pomocą tego samego procesu rsconnect::deployApp() co w 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')Lista kontrolna przed wdrożeniem
Przed wdrożeniem aplikacji Shiny na środowisko produkcyjne należy sprawdzić, czy:
- wszystkie ścieżki do plików są względne, a nie absolutne;
- wrażliwe dane (klucze API, hasła) są odczytywane ze zmiennych środowiskowych;
- zależności pakietów są jawnie określone za pomocą
library()lubrenv.lock; - duże pliki danych są ładowane jednokrotnie na początku server.R, a nie wewnątrz wyrażenia reaktywnego;
- komunikaty o błędach nie ujawniają użytkownikom końcowym informacji wewnętrznych.
# 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))
})
}Kwestie związane ze skalowaniem
Aplikacje Shiny działają w oparciu o sesje: każdy użytkownik otrzymuje własny proces R (lub workera). Strategie skalowania:
- Ładowanie wstępnie obliczonych danych podczas uruchamiania zamiast obliczania ich dla każdej sesji.
- Stosowanie pamięci podręcznej reaktywnej za pomocą
bindCache()w przypadku kosztownych obliczeń współdzielonych między sesjami. - Wielu workerów: Shiny Server Pro i Posit Connect uruchamiają równoległe procesy R.
- Zaplecza baz danych: używanie DBI/pool do obsługi jednoczesnego dostępu do bazy danych.
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')
})
}Szybkie sprawdzenie
Jaki jest zalecany sposób obsługi kluczy API i haseł do baz danych we wdrożonej aplikacji Shiny?
Podsumowanie wdrażania aplikacji Shiny
Najważniejsze informacje z lekcji Wdrażanie aplikacji Shiny:
- Opcje wdrażania: shinyapps.io (najłatwiejsza), Shiny Server (samodzielny hosting), Posit Connect (enterprise), Docker.
- app.R musi deklarować wszystkie zależności za pomocą
library(); do uzyskania powtarzalnych wersji należy używaćrenv::snapshot(). rsconnect::deployApp()pakuje aplikację i przesyła ją do shinyapps.io lub Posit Connect.- Docker z obrazem
rocker/shinyzapewnia maksymalną przenośność. - Do poświadczeń należy używać
Sys.getenv()— nigdy nie należy wpisywać sekretów na stałe w kodzie. - Duże zbiory danych należy ładować podczas uruchamiania, poza
server(), aby współdzielić je między sesjami. - Do jednoczesnego dostępu do bazy danych należy używać pul połączeń (pakiet
pool).
# 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'
)Często zadawane pytania
Czy lekcja „Wdrażanie aplikacji Shiny” jest bezpłatna?
Tak — pełny tekst „Wdrażanie aplikacji Shiny” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wdrażanie aplikacji Shiny”?
Publikuj aplikacje w shinyapps.io, Shiny Server i środowiskach opartych na Dockerze. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Wdrażanie aplikacji Shiny”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Zaawansowane programowanie reaktywne
- Moduły Shiny wielokrotnego użytku
- Dynamiczny interfejs za pomocą renderUI i insertUI
- Wdrażanie aplikacji Shiny