在 DigitalOcean 上部署 Shiny Server

在 DigitalOcean(或任何 Ubuntu 服务器)上获取 Shiny Server
TL;DR: 通过在 Linux 机器上安装开源 Shiny Server,将 R Shiny 应用部署到网络。涵盖 R 安装、服务器配置以及如何托管多个应用或用户目录。
为何要自行托管?
像 shinyapps.io 这样的服务很棒,但自行托管 Shiny Server 提供以下优势:
- 成本节约: 每月 5-10 美元的 VPS 对比昂贵的高级套餐。
- 控制权: 无活跃时间或实例大小限制。
- 隐私性: 将数据保留在您自己控制的基础设施上。
- 自定义域名: 轻松使用
apps.yourlab.com。
第一部分:先决条件
从一个全新的 Ubuntu 22.04 或 24.04 服务器开始(参见设置远程服务器)。
1. 安装 R
使用官方的 CRAN 仓库以获取最新的 R 版本(Ubuntu 默认版本通常较旧)。
# 更新索引
sudo apt update -qq
# 安装用于添加仓库的辅助工具
sudo apt install -y --no-install-recommends software-properties-common dirmngr
# 添加 CRAN 密钥和仓库
wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
# 安装 R
sudo apt install -y r-base
2. 安装 Shiny 包
首先安装系统依赖项(用于 httpuv、openssl 等)。
sudo apt install -y libcurl4-gnutls-dev libcairo2-dev libxt-dev libssl-dev
# 安装 Shiny 包(以 root 身份,使其全局可用)
sudo su - -c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""
第二部分:安装 Shiny Server
从 RStudio (Posit) 下载最新版本。
# 在以下网址检查最新版本:https://posit.co/download/shiny-server/
wget https://download3.rstudio.org/ubuntu-18.04/x86_64/shiny-server-1.5.22.1017-amd64.deb
# 安装
sudo gdebi shiny-server-1.5.22.1017-amd64.deb
验证其是否正在运行:
sudo systemctl status shiny-server
应显示 active (running)。
开放防火墙:
Shiny Server 默认在端口 3838 上运行。
sudo ufw allow 3838
在浏览器中访问 http://your-server-ip:3838。您应该会看到“Welcome to Shiny Server!”页面。
第三部分:部署应用
位置 1:系统级应用 (/srv/shiny-server)
这是默认位置。
删除示例应用:
sudo rm -rf /srv/shiny-server/*部署您的应用:
使用 git 拉取您的应用代码。cd /srv/shiny-server sudo git clone https://github.com/yourname/my-shiny-app.git安装应用依赖项:
如果您的应用使用ggplot2或dplyr,请全局安装它们:sudo su - -c "R -e \"install.packages(c('ggplot2', 'dplyr'))\""
您的应用现在位于:http://your-server-ip:3838/my-shiny-app/
位置 2:用户级应用 (~/ShinyApps)
允许用户在各自的主目录中托管应用(例如,http://server:3838/miana/app1)。
编辑配置:
sudo nano /etc/shiny-server/shiny-server.conf添加
user_dirs:run_as :HOME_USER:; server { listen 3838; location / { user_dirs; # 启用 ~/ShinyApps directory_index on; } }创建目录:
mkdir ~/ShinyApps重启服务器:
sudo systemctl restart shiny-server
第四部分:生产环境最佳实践
1. 在端口 80/443 上运行(Nginx 反向代理)
不要让用户输入 :3838。使用 Nginx 转发流量。
sudo apt install nginx
编辑配置:/etc/nginx/sites-available/shiny
server {
listen 80;
server_name apps.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3838;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
启用它:
sudo ln -s /etc/nginx/sites-available/shiny /etc/nginx/sites-enabled/
sudo systemctl restart nginx
2. 使用 HTTPS 加密(Let's Encrypt)
切勿通过 HTTP 运行应用。
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d apps.yourdomain.com
3. 日志文件
故障排除?检查日志:
- 系统日志:
/var/log/shiny-server.log - 应用日志:
/var/log/shiny-server/app-name-timestamp.log
故障排除
"发生错误"(灰色屏幕)
此通用错误信息隐藏了详细信息。
- 检查
/var/log/shiny-server/中的日志。 - 确保
library()调用中使用的所有 R 包都已全局安装(使用sudo R)。
"与服务器断开连接"
原因: 应用超时或 WebSocket 问题。
修复: 在 shiny-server.conf 中增加超时时间:
app_idle_timeout 300; # 5 分钟
权限被拒绝
Shiny Server 默认以用户 shiny 身份运行。确保它可以读取您的文件:
sudo chown -R shiny:shiny /srv/shiny-server
另请参阅: