将闪亮应用程序库部署到闪亮服务器的最佳(标准)方法?

Posted

技术标签:

【中文标题】将闪亮应用程序库部署到闪亮服务器的最佳(标准)方法?【英文标题】:Best (standard) way to deploy the libraries for a shiny app to the shiny server? 【发布时间】:2021-09-03 03:24:51 【问题描述】:

我正在尝试在 Shiny Server 上部署一个闪亮的应用程序。我可以毫无问题地做到这一点,但是在尝试部署具有许多依赖项(远程和本地)的应用程序时,我们一直遇到问题。

我们使用 renv 来跟踪依赖项(在 Windows 开发盒上)并在 Linux prod 盒上从头开始重新构建它,但即使重新构建了依赖项并加载了一些依赖项,但其他一些则没有。运行应用程序的用户的 .Rprofile 指向 renv 激活脚本。

为了清楚起见,我们需要并且希望所有 R 代码都从 Linux 机器上的源代码构建。

将闪亮应用程序的库部署到闪亮服务器的最佳或标准方式(甚至是一种糟糕的方式)是什么? renv 是否适合这种情况,还是有更好的工具?

我已经尝试阅读闪亮的服务器文档,并且关闭它只提到它使用运行应用程序的用户的 .Rprofile,但似乎没有任何关于部署依赖的最佳方式的指南图书馆。

【问题讨论】:

“但是即使依赖关系被重建并且有些被加载,有些则没有”——你能扩展你的意思吗?通常,调用 renv::restore() 应该足以恢复整个库。你能详细说明你在做什么,你看到了什么错误吗? 嗨,很遗憾我不能。没有正当理由没有加载一个依赖项,一切看起来都很好(就像所有其他库一样链接),但仍然无法加载。我一定是做错了什么,因为我擦掉了所有东西并最终让它正常工作。 好问题!我们在 CentOS 上运行闪亮。我们可以访问 /srv/shiny-server/,但没有权限在默认系统库(我们系统上的 /opt/R/4.1.0/lib/R/library)中安装 R 包。 【参考方案1】:

此renv 文档讨论了一些可重复性警告:

    系统依赖,以及 CRAN 中的更改(例如,二进制文件不再可用)。

由于您正在从 Windows 迁移到 Linux 系统,因此您的软件包可能具有未满足的系统依赖关系(需要在 R 之外安装的东西),而这些依赖关系是您在 Windows 中没有遇到的。例如,某些与 Excel 相关的 R 包需要rJava,安装其相关的系统依赖项并在 Linux 上运行有时可能是一个挑战。您可以使用RStudio Package Manager Website 来确定您的特定 Linux 操作系统的不同 R 包需要哪些系统依赖项。此外,您在 Linux 上运行这些应用程序时收到的错误消息应该会为您指明正确的方向。这些系统依赖项是您必须自己管理的,因为 renv 不需要。

但对于更生产级的解决方案,您可以尝试 Docker 和 ShinyProxy。对于具有许多依赖项或特别是外部依赖项(例如 Python、SQL 等)的应用程序,您可以使用 Docker 保证更高的可重复性。 ShinyProxy 可用于托管内置于 docker 镜像中的应用程序。这是更多的工作,但您要确保整个系统是可重现的,而不仅仅是 R 版本和 R 包。 ShinyProxy 还添加了额外的托管功能,例如用户身份验证。

【讨论】:

在我看来,文档有点“抽象”。最后,我让它工作到了可接受的程度(是的,RENV 在这方面非常有帮助),但我的问题不是关于修复错误,而是使用 Shiny Server 部署库的好做法。例如。在 Shiny Server 的上下文中,RENV 中的共享缓存默认为当前用户目录,但这是否有正当理由,或者是否应该在用于运行应用程序的用户之间共享?我现在忘记了其他一些类似的问题 - 没有什么无法解决的,但希望它们在文档中得到解决。 附带说明,我尝试在免费的 Azure 层上探索 docker,但即使对于 hello world 应用程序(5 到 +10 分钟),启动性能也很糟糕。您是否有更好的体验(在更高级别的 Azure 或 AWS 层之一上)? 在 AWS 上的 EC2 Linux 实例上使用闪亮服务器托管可提供合理的性能。您还可以添加 Rstudio-server 以使其成为一个不错的云开发/部署爱好服务器。可能需要交换空间。当然,shinyapps.io 既简单又免费,在业余爱好方面表现不错。

以上是关于将闪亮应用程序库部署到闪亮服务器的最佳(标准)方法?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 NGINX 将多个闪亮的应用程序部署到一台服务器?

无法在闪亮的服务器上部署闪亮的应用程序

使用闪亮的服务器和 nginx 设置用于缓存的 http 标头

在 DigitalOcean ubuntu 服务器上托管闪亮的应用程序时出错

AWS Elastic Beanstalk 上的闪亮服务器与 Docker

个人应用程序的闪亮服务器配置