writing-skills
writing-skills
Use when creating new skills, editing existing skills, or verifying skills work before deployment
deploy-shiny-app将 Shiny 应用程序部署到 shinyapps.io、Posit Connect 或 Docker 容器。涵盖 rsconnect 配置、清单生成、Dockerfile 创建及部署验证。适用于为外部或内部 用户发布 Shiny 应用、从本地开发迁移到托管环境、为 Kubernetes 或 Docker 部署容器化 Shiny 应用,或设置自动化部署流水线。
Independent GitHub snapshot · Automated classification · Original documentation governs
将 Shiny 应用程序部署到 shinyapps.io、Posit Connect 或 Docker 容器。
确保应用程序是自包含且可部署的:
# Check for missing dependencies
rsconnect::appDependencies("path/to/app")
# For golem apps, ensure DESCRIPTION lists all Imports
devtools::check()
# Verify the app runs cleanly
shiny::runApp("path/to/app")
验证这些文件存在:
app.R(或 ui.R + server.R)renv.lock(推荐用于可重现部署).Rprofile 在生产中不调用 mcptools::mcp_session()预期结果: 应用在本地运行无错误,所有依赖项已捕获。
失败处理: 如果 appDependencies() 报告缺少包,安装它们并更新 renv.lock。如果应用使用系统库(如 gdal、curl),记录它们以供 Docker 路径使用。
# One-time account setup
rsconnect::setAccountInfo(
name = "your-account",
token = Sys.getenv("SHINYAPPS_TOKEN"),
secret = Sys.getenv("SHINYAPPS_SECRET")
)
# Deploy
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 控制台 > 账户 > 令牌 处重新生成令牌。如果服务器上包安装失败,检查所有包是否在 CRAN 上可用——shinyapps.io 默认无法从 GitHub 安装。
# Register server (one-time)
rsconnect::addServer(
url = "https://connect.example.com",
name = "production"
)
# Authenticate (one-time)
rsconnect::connectApiUser(
account = "your-username",
server = "production",
apiKey = Sys.getenv("CONNECT_API_KEY")
)
# Deploy
rsconnect::deployApp(
appDir = "path/to/app",
appName = "my-app",
server = "production",
account = "your-username"
)
预期结果: 应用已部署,可在 Posit Connect 实例上访问。
失败处理: 如果服务器拒绝连接,验证 API 密钥和服务器 URL。如果包安装失败,检查 Connect 是否有权访问所需仓库(CRAN、内部类 CRAN 仓库)。
创建 Dockerfile:
FROM rocker/shiny-verse:4.4.0
# Install system dependencies
RUN apt-get update && apt-get install -y \
libcurl4-openssl-dev \
libssl-dev \
libxml2-dev \
&& rm -rf /var/lib/apt/lists/*
# Install R packages
RUN R -e "install.packages(c('shiny', 'bslib', 'DT', 'plotly'))"
# Copy app
COPY . /srv/shiny-server/myapp/
# Configure Shiny Server
COPY shiny-server.conf /etc/shiny-server/shiny-server.conf
# Expose port
EXPOSE 3838
# Run
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。
# Check the deployed URL responds
response <- httr::GET("https://your-app-url/")
httr::status_code(response) # Should be 200
# For Docker
response <- httr::GET("http://localhost:3838/")
httr::status_code(response)
手动验证清单:
预期结果: 应用响应 HTTP 200,所有功能正常。
失败处理: 查看特定部署平台的服务器日志。常见问题:生产环境未设置环境变量、数据库连接使用 localhost 而非生产 URL,或文件路径仅在本地存在。
通过 https://www.shinyapps.io/admin/#/applications 的控制台监控。
# Check deployment status via API
connectapi::connect(
server = "https://connect.example.com",
api_key = Sys.getenv("CONNECT_API_KEY")
)
在 Dockerfile 中添加健康检查:
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD curl -f http://localhost:3838/ || exit 1
预期结果: 已为部署目标配置监控。
失败处理: 如果健康检查间歇性失败,增加超时值。Shiny 应用在初始加载时响应可能较慢。
.Renviron 或 CI 密钥中,而非代码中system.file()(用于包数据)或环境变量(用于外部资源)。mcptools::mcp_session() 或 devtools 的 .Rprofile。使用条件加载或单独的配置文件。apt-get install 中。remotes 包和部署时的显式安装。scaffold-shiny-app — 部署前创建应用结构create-r-dockerfile — R 项目的详细 Docker 配置setup-docker-compose — Shiny 与数据库的多容器设置setup-github-actions-ci — 包含自动化部署的 CI/CDoptimize-shiny-performance — 部署到生产前的性能调优