在 DigitalOcean 上部署 Shiny Server

· Tutorials

在 DigitalOcean 上部署 Shiny Server

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

这是默认位置。

  1. 删除示例应用:

    sudo rm -rf /srv/shiny-server/*
    
  2. 部署您的应用:
    使用 git 拉取您的应用代码。

    cd /srv/shiny-server
    sudo git clone https://github.com/yourname/my-shiny-app.git
    
  3. 安装应用依赖项:
    如果您的应用使用 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)。

  1. 编辑配置:

    sudo nano /etc/shiny-server/shiny-server.conf
    
  2. 添加 user_dirs:

    run_as :HOME_USER:;
    
    server {
      listen 3838;
      
      location / {
        user_dirs;  # 启用 ~/ShinyApps
        directory_index on;
      }
    }
    
  3. 创建目录:

    mkdir ~/ShinyApps
    
  4. 重启服务器:

    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

故障排除

"发生错误"(灰色屏幕)

此通用错误信息隐藏了详细信息。

  1. 检查 /var/log/shiny-server/ 中的日志。
  2. 确保 library() 调用中使用的所有 R 包都已全局安装(使用 sudo R)。

"与服务器断开连接"

原因: 应用超时或 WebSocket 问题。
修复: 在 shiny-server.conf 中增加超时时间:

app_idle_timeout 300; # 5 分钟

权限被拒绝

Shiny Server 默认以用户 shiny 身份运行。确保它可以读取您的文件:

sudo chown -R shiny:shiny /srv/shiny-server

另请参阅:

Server Setup R