0Pricing
R Academy · Aula

Implantando aplicativos Shiny

Publique aplicativos em shinyapps.io, no Shiny Server e em ambientes com Docker.

Implantando aplicativos Shiny é uma aula grátis de R Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de R Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de R Academy inclui 4 aulas no total.

Visão geral das opções de implantação

Os aplicativos Shiny podem ser implantados em várias plataformas, dependendo do orçamento, do tráfego esperado e dos requisitos de controle:

  • shinyapps.io: hospedagem gerenciada na nuvem pela Posit — a opção mais fácil, com plano gratuito disponível.
  • Shiny Server (código aberto): hospedagem própria no Linux, gratuita.
  • Posit Connect: comercial, voltado para empresas, com suporte também a R Markdown e Plumber.
  • Docker + rocker/shiny: máxima portabilidade e controle.
# 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')

Estrutura de app.R para implantação

Um aplicativo Shiny implantável deve ter um único arquivo app.R (contendo tanto ui quanto server) ou dois arquivos, ui.R e server.R. Todas as dependências de pacotes devem ser declaradas com library() no início. Os arquivos de dados devem estar no mesmo diretório ou ser acessíveis por um caminho relativo ao aplicativo.

# 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()

O pacote rsconnect gerencia a implantação no shinyapps.io e no Posit Connect. Primeiro, configure as credenciais da sua conta e, em seguida, chame rsconnect::deployApp() a partir do diretório do aplicativo. Ele agrupa automaticamente todos os arquivos R, os dados e um manifesto.

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
)

Configuração do shinyapps.io

O shinyapps.io é o caminho mais rápido para obter uma URL pública. Crie uma conta gratuita em shinyapps.io, copie o token e o segredo do painel e chame setAccountInfo(). O plano gratuito permite 5 aplicativos com 25 horas ativas por mês.

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 de código aberto

O Shiny Server é executado no Linux (Ubuntu/RHEL) e disponibiliza aplicativos Shiny a partir do diretório /srv/shiny-server/. Cada subdiretório se torna um aplicativo em http://server:3838/subdirname/. Ele é gratuito e oferece suporte a um número ilimitado de usuários simultâneos (dentro da capacidade do servidor).

# 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 com rocker/shiny

A imagem Docker rocker/shiny fornece um Shiny Server pré-configurado. Monte o diretório do seu aplicativo no contêiner para disponibilizá-lo imediatamente. O Docker garante reprodutibilidade — a mesma imagem é executada de forma idêntica em qualquer máquina hospedeira.

# 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 para dependências reproduzíveis

O renv cria uma biblioteca de pacotes no nível do projeto com um arquivo de bloqueio (renv.lock) que registra as versões exatas dos pacotes. Durante a implantação, esse arquivo garante que o servidor ou a imagem Docker instale exatamente as mesmas versões de pacotes usadas durante o desenvolvimento.

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

Variáveis de ambiente para configuração

Nunca insira diretamente no código do aplicativo chaves de API, senhas de banco de dados ou configurações específicas do ambiente. Use variáveis de ambiente lidas com Sys.getenv('VAR_NAME', unset = NA). Defina-as localmente em .Renviron e, em produção, na configuração de ambiente da plataforma de hospedagem.

# 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')
}

Visão geral do Posit Connect

O Posit Connect é a plataforma empresarial para implantar aplicativos Shiny, documentos R Markdown, APIs Plumber e muito mais. Ele oferece suporte a:

  • Logon único (SSO) por meio de LDAP ou SAML
  • Execução agendada de relatórios R Markdown
  • Controle de acesso no nível do aplicativo
  • Dimensionamento automático e balanceamento de carga

A implantação usa o mesmo fluxo de trabalho rsconnect::deployApp() do 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 de verificação antes da implantação

Antes de implantar um aplicativo Shiny em produção, verifique:

  • Todos os caminhos de arquivos usam caminhos relativos, não absolutos.
  • Dados confidenciais (chaves de API, senhas) são lidos de variáveis de ambiente.
  • As dependências de pacotes são explícitas, usando library() ou renv.lock.
  • Arquivos de dados grandes são carregados uma vez no início de server.R (não dentro de reactive).
  • As mensagens de erro não expõem informações internas aos usuários finais.
# 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))
  })
}

Considerações sobre dimensionamento

Os aplicativos Shiny são baseados em sessões: cada usuário recebe seu próprio processo R (ou trabalhador). Estratégias de dimensionamento:

  • Carregue dados pré-calculados na inicialização, em vez de calculá-los por sessão.
  • Use cache reativo com bindCache() para cálculos dispendiosos compartilhados entre sessões.
  • Vários trabalhadores: o Shiny Server Pro e o Posit Connect iniciam processos R paralelos.
  • Sistemas de banco de dados: use DBI/pool para acesso simultâneo ao banco de dados.
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')
  })
}

Verificação rápida

Qual é a maneira recomendada de gerenciar chaves de API e senhas de banco de dados em um aplicativo Shiny implantado?

Recapitulação da implantação de aplicativos Shiny

Principais aprendizados sobre a implantação de aplicativos Shiny:

  • Opções de implantação: shinyapps.io (mais fácil), Shiny Server (hospedagem própria), Posit Connect (empresarial) e Docker.
  • app.R deve declarar todas as dependências com library(); use renv::snapshot() para obter versões reproduzíveis.
  • rsconnect::deployApp() agrupa e envia o aplicativo para o shinyapps.io ou o Posit Connect.
  • O Docker com rocker/shiny oferece máxima portabilidade.
  • Use Sys.getenv() para obter credenciais — nunca insira segredos diretamente no código.
  • Carregue conjuntos de dados grandes na inicialização (fora de server()) para compartilhá-los entre sessões.
  • Use pools de conexões (pacote pool) para acesso simultâneo ao banco de dados.
# 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'
)

Perguntas Frequentes

A aula “Implantando aplicativos Shiny” é grátis?

Sim — o texto completo de “Implantando aplicativos Shiny” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de R Academy, atualize para CoddyKit PRO. O curso de R Academy inclui 4 aulas no total.

O que vou aprender em “Implantando aplicativos Shiny”?

Publique aplicativos em shinyapps.io, no Shiny Server e em ambientes com Docker. Você pratica R Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar R Academy?

Nenhuma experiência prévia é necessária. R Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Implantando aplicativos Shiny”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de R Academy?

Sim. Cada aula de R Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Aprofundamento em programação reativa
  2. Módulos Shiny para reutilização de código
  3. Interface dinâmica com renderUI e insertUI
  4. Implantando aplicativos Shiny
← Voltar para R Academy