Agent-almanac deploy-shiny-app
git clone https://github.com/pjt222/agent-almanac
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/ja/skills/deploy-shiny-app" ~/.claude/skills/pjt222-agent-almanac-deploy-shiny-app-0d070c && rm -rf "$T"
i18n/ja/skills/deploy-shiny-app/SKILL.mdShinyアプリのデプロイ
ShinyアプリケーションをShinyapps.io、Posit Connect、またはDockerコンテナにデプロイします。
使用タイミング
- 外部または内部ユーザー向けにShinyアプリを公開するとき
- ローカル開発からホスト環境に移行するとき
- KubernetesまたはDockerデプロイメント用にShinyアプリをコンテナ化するとき
- 自動デプロイメントパイプラインをセットアップするとき
入力
- 必須: Shinyアプリケーションへのパス
- 必須: デプロイ先(shinyapps.io、Posit Connect、またはDocker)
- オプション: アカウント名とトークン(shinyapps.io/Connect用)
- オプション: インスタンスサイズの選択
- オプション: カスタムドメインまたはURLパス
手順
ステップ1: アプリケーションの準備
アプリが自己完結型でデプロイ可能であることを確認します:
# 欠けている依存関係を確認 rsconnect::appDependencies("path/to/app") # golemアプリの場合、DESCRIPTIONにすべてのImportsがリストされているか確認 devtools::check() # アプリがクリーンに実行されることを確認 shiny::runApp("path/to/app")
以下のファイルが存在することを確認してください:
(またはapp.R
+ui.R
)server.R
(再現可能なデプロイメントに推奨)renv.lock
が本番環境で.Rprofile
を呼び出していないことmcptools::mcp_session()
期待結果: アプリがエラーなしでローカルに実行でき、すべての依存関係がキャプチャされています。
失敗時:
appDependencies()が欠けているパッケージを報告する場合はインストールしてrenv.lockを更新してください。アプリがシステムライブラリ(例:gdal、curl)を使用する場合は、Dockerパス用にメモしてください。
ステップ2a: shinyapps.ioへのデプロイ
# 一回限りのアカウントセットアップ rsconnect::setAccountInfo( name = "your-account", token = Sys.getenv("SHINYAPPS_TOKEN"), secret = Sys.getenv("SHINYAPPS_SECRET") ) # デプロイ rsconnect::deployApp( appDir = "path/to/app", appName = "my-app", appTitle = "My Application", account = "your-account", forceUpdate = TRUE )
認証情報は
.Renvironに保存してください(コードには絶対に書かない):
# .Renviron SHINYAPPS_TOKEN=your_token_here SHINYAPPS_SECRET=your_secret_here
期待結果: アプリがデプロイされ
https://your-account.shinyapps.io/my-app/でアクセス可能になります。
失敗時: 認証が失敗する場合は、shinyapps.ioダッシュボード > Account > Tokensでトークンを再生成してください。サーバーでパッケージのインストールが失敗する場合は、すべてのパッケージがCRANで入手可能か確認してください — shinyapps.ioはデフォルトでGitHubからインストールできません。
ステップ2b: Posit Connectへのデプロイ
# サーバーの登録(一回限り) rsconnect::addServer( url = "https://connect.example.com", name = "production" ) # 認証(一回限り) rsconnect::connectApiUser( account = "your-username", server = "production", apiKey = Sys.getenv("CONNECT_API_KEY") ) # デプロイ rsconnect::deployApp( appDir = "path/to/app", appName = "my-app", server = "production", account = "your-username" )
期待結果: アプリがデプロイされてPosit Connectインスタンスでアクセス可能になります。
失敗時: サーバーが接続を拒否する場合は、APIキーとサーバーURLを確認してください。パッケージのインストールが失敗する場合は、Connectが必要なリポジトリ(CRAN、内部CRANライクなリポジトリ)にアクセスできるか確認してください。
ステップ2c: Dockerでのデプロイ
Dockerfileを作成します:
FROM rocker/shiny-verse:4.4.0 # システム依存関係のインストール RUN apt-get update && apt-get install -y \ libcurl4-openssl-dev \ libssl-dev \ libxml2-dev \ && rm -rf /var/lib/apt/lists/* # Rパッケージのインストール RUN R -e "install.packages(c('shiny', 'bslib', 'DT', 'plotly'))" # アプリをコピー COPY . /srv/shiny-server/myapp/ # Shiny Serverの設定 COPY shiny-server.conf /etc/shiny-server/shiny-server.conf # ポートを公開 EXPOSE 3838 # 実行 CMD ["/usr/bin/shiny-server"]
shiny-server.confを作成します:
run_as shiny; server { listen 3838; location / { site_dir /srv/shiny-server/myapp; log_dir /var/log/shiny-server; directory_index on; } }
ビルドと実行:
docker build -t myapp:latest . docker run -p 3838:3838 myapp:latest
期待結果: アプリが
http://localhost:3838でアクセス可能になります。
失敗時: パッケージのインストールでビルドが失敗する場合は、欠けているシステムライブラリを
apt-get installの行に追加してください。アプリが読み込まれない場合はShiny Serverのログを確認してください:docker exec <container> cat /var/log/shiny-server/*.log。
ステップ3: デプロイメントの確認
# デプロイされたURLが応答するか確認 response <- httr::GET("https://your-app-url/") httr::status_code(response) # 200であるべき # Dockerの場合 response <- httr::GET("http://localhost:3838/") httr::status_code(response)
手動確認チェックリスト:
- アプリがエラーなしで読み込まれる
- すべてのインタラクティブ要素が応答する
- デプロイされた環境でデータ接続が機能する
- 認証/認可が機能する(該当する場合)
期待結果: アプリがHTTP 200で応答し、すべての機能が動作します。
失敗時: 特定のデプロイメントプラットフォームのサーバーログを確認してください。よくある問題:本番環境での環境変数の未設定、localhostの代わりに本番URLを使ったデータベース接続、またはローカルにしか存在しないファイルパス。
ステップ4: モニタリングの設定(オプション)
shinyapps.io
https://www.shinyapps.io/admin/#/applicationsのダッシュボードでモニタリングします。
Posit Connect
# API経由でデプロイメントの状態を確認 connectapi::connect( server = "https://connect.example.com", api_key = Sys.getenv("CONNECT_API_KEY") )
Docker
DockerfileにHEALTHCHECKを追加します:
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \ CMD curl -f http://localhost:3838/ || exit 1
期待結果: デプロイメントターゲットのモニタリングが設定されています。
失敗時: ヘルスチェックが断続的に失敗する場合はタイムアウト値を増やしてください。Shinyアプリは初回読み込み時に応答が遅い場合があります。
バリデーション
- アプリがエラーなしでデプロイされる
- デプロイされたURLがHTTP 200で応答する
- すべてのインタラクティブ機能が本番環境で動作する
- 環境変数/シークレットが設定されている(ハードコードされていない)
- 認証情報が
またはCIシークレットに保存されており、コードには書かれていない.Renviron - 再現可能な依存関係解決のためにrenv.lockがコミットされている
よくある落とし穴
- ハードコードされたファイルパス: 絶対パスを
(パッケージデータ用)または環境変数(外部リソース用)に置き換えてください。system.file() - 開発専用の依存関係:
やmcptools::mcp_session()
を読み込むdevtools
をデプロイしないでください。条件付き読み込みまたは別のプロファイルを使用してください。.Rprofile - DockerでのシステムライブラリのMissing: sf、curl、xml2などのRパッケージにはシステムライブラリが必要です。Dockerfileの
に追加してください。apt-get install - shinyapps.ioでのCRANのみパッケージ: shinyapps.ioはデフォルトでCRANからのみインストールします。GitHubのみのパッケージには
パッケージとデプロイメント内での明示的なインストールが必要です。remotes - 環境変数の忘れ: データベース認証情報、APIキー、その他のシークレットはコードとは別に、デプロイメント環境で設定する必要があります。
関連スキル
— デプロイ前のアプリ構造の作成scaffold-shiny-app
— Rプロジェクトの詳細なDocker設定create-r-dockerfile
— データベースを持つShiny用のマルチコンテナセットアップsetup-docker-compose
— 自動デプロイメントを含むCI/CDsetup-github-actions-ci
— 本番デプロイ前のパフォーマンスチューニングoptimize-shiny-performance