0Pricing
R Academy · レッスン

Shiny アプリをデプロイする

shinyapps.io、Shiny Server、Docker 化した環境にアプリを公開します。

「Shiny アプリをデプロイする」はCoddyKit上の無料R Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

デプロイ方法の概要

Shinyアプリは、予算、想定するトラフィック、必要な管理レベルに応じて、複数のプラットフォームにデプロイできます。

  • shinyapps.io:Positが管理するクラウドホスティングサービスです。最も簡単に利用でき、無料プランもあります。
  • Shiny Server (open source):Linux上でセルフホストできます。無料です。
  • Posit Connect:商用のエンタープライズ向けプラットフォームで、R MarkdownやPlumberにも対応しています。
  • Docker + rocker/shiny:最大限の移植性と制御性を実現できます。
# 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')

デプロイ用のapp.R構成

デプロイ可能なShinyアプリには、uiとserverの両方を含む単一のapp.Rファイル、またはui.Rとserver.Rの2つのファイルが必要です。すべてのパッケージ依存関係は、先頭でlibrary()を使って宣言する必要があります。データファイルは同じディレクトリに置くか、アプリからの相対パスでアクセスできる場所に置いてください。

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

rsconnectパッケージは、shinyapps.ioとPosit Connectへのデプロイを処理します。まずアカウントの認証情報を設定し、次にアプリのディレクトリからrsconnect::deployApp()を呼び出します。Rファイル、データ、マニフェストが自動的にまとめられます。

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
)

shinyapps.ioのセットアップ

shinyapps.ioは、公開URLを取得する最も簡単な方法です。shinyapps.ioで無料アカウントを作成し、ダッシュボードからトークンとシークレットをコピーして、setAccountInfo()を呼び出します。無料プランでは、月25時間のアクティブ時間内で5つのアプリを利用できます。

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はLinux(Ubuntu/RHEL)上で動作し、/srv/shiny-server/ディレクトリからShinyアプリを配信します。各サブディレクトリは、http://server:3838/subdirname/のアプリになります。無料で利用でき、サーバーの処理能力の範囲内で同時接続ユーザー数に制限はありません。

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

rocker/shinyを使ったDocker

rocker/shiny Dockerイメージには、設定済みのShiny Serverが用意されています。アプリのディレクトリをコンテナにマウントすれば、すぐに配信できます。Dockerにより再現性が確保されるため、同じイメージをどのホストでも同じように実行できます。

# 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

renvは、正確なパッケージバージョンを記録するロックファイル(renv.lock)と、プロジェクト単位のパッケージライブラリを作成します。デプロイ時には、このロックファイルによって、開発時に使用したものとまったく同じバージョンのパッケージがサーバーまたはDockerイメージにインストールされます。

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

設定に使う環境変数

APIキー、データベースのパスワード、環境固有の設定をアプリのコードにハードコードしないでください。Sys.getenv('VAR_NAME', unset = NA)で読み取る環境変数を使用します。ローカルでは.Renvironに設定し、本番環境ではホスティングプラットフォームの環境設定に設定してください。

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

Posit Connectの概要

Posit Connectは、Shinyアプリ、R Markdownドキュメント、Plumber APIなどをデプロイするためのエンタープライズ向けプラットフォームです。次の機能に対応しています。

  • LDAPまたはSAMLによるシングルサインオン(SSO)
  • R Markdownレポートのスケジュール実行
  • アプリ単位のアクセス制御
  • 自動スケーリングとロードバランシング

デプロイには、shinyapps.ioと同じrsconnect::deployApp()ワークフローを使用します。

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

デプロイ前のチェックリスト

Shinyアプリを本番環境にデプロイする前に、次の項目を確認してください。

  • すべてのファイルパスに絶対パスではなく相対パスを使用している。
  • 機密データ(APIキー、パスワード)を環境変数から読み取っている。
  • パッケージ依存関係をlibrary()またはrenv.lockで明示している。
  • 大きなデータファイルをserver.Rの先頭で一度だけ読み込んでいる(reactiveの内部では読み込まない)。
  • エラーメッセージに内部情報を含めず、エンドユーザーに公開していない。
# 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))
  })
}

スケーリングに関する考慮事項

Shinyアプリはセッション単位で動作します。各ユーザーには専用のRプロセス(またはワーカー)が割り当てられます。スケーリングの方法には次のものがあります。

  • セッションごとに計算するのではなく、起動時に事前計算済みのデータを読み込む。
  • 複数セッションで共有する負荷の高い計算には、bindCache()を使ったリアクティブキャッシュを利用する。
  • 複数のワーカー:Shiny Server ProとPosit Connectは、Rプロセスを並列に起動します。
  • データベースバックエンド:同時にデータベースへアクセスする場合はDBI/poolを使用します。
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')
  })
}

クイックチェック

デプロイしたShinyアプリで、APIキーやデータベースのパスワードを扱う推奨方法は何ですか。

Shinyアプリのデプロイのまとめ

Shinyアプリのデプロイで学んだ重要事項:

  • デプロイ方法には、shinyapps.io(最も簡単)、Shiny Server(セルフホスト)、Posit Connect(エンタープライズ向け)、Dockerがあります。
  • app.Rではすべての依存関係をlibrary()で宣言し、再現可能なバージョン管理にはrenv::snapshot()を使用します。
  • rsconnect::deployApp()は、shinyapps.ioまたはPosit Connect向けにアプリをまとめてプッシュします。
  • rocker/shinyを使ったDockerにより、最大限の移植性を確保できます。
  • 認証情報にはSys.getenv()を使用し、シークレットをハードコードしないでください。
  • セッション間で共有できるよう、大規模なデータセットは起動時に(server()の外で)読み込んでください。
  • データベースへの同時アクセスには、接続プール(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'
)

よくある質問

「Shiny アプリをデプロイする」レッスンは無料ですか?

はい。「Shiny アプリをデプロイする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「Shiny アプリをデプロイする」で何を学びますか?

shinyapps.io、Shiny Server、Docker 化した環境にアプリを公開します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Shiny アプリをデプロイする」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. リアクティブプログラミングの深掘り
  2. コード再利用のための Shiny モジュール
  3. renderUI と insertUI による動的 UI
  4. Shiny アプリをデプロイする
← R Academyに戻る