![0f8b2e131d2ccb2e7729e65523cb8df1.png](https://img-blog.csdnimg.cn/img_convert/0f8b2e131d2ccb2e7729e65523cb8df1.png)
shinyAPP相关,早在五年前我们生信技能树还是网页论坛的时候我就开辟了一个版块分享相关知识。这些年很多生物信息学爱好者都开发了自己的各式各样的网页工具,前些天浙江大学全球油菜基因资源数字化利用交互式网站上线,就是我们生信技能树VIP成员严涛做出来的,而且也邀请了他分享相关经验 把你的shiny网页工具部署在云服务器
这次,另外一个元老级生信技能树VIP成员也带来了他的Shiny app开发经验
五年前的生信编程直播python讲师《东》的分享最近博士导师实验室上线了一个基于R shiny制作的用于癌症miRNA数据分析和可视化的网页工具。暂时命名为CancerMIRNome (http://bioinfo.jialab-ucr.org/CancerMIRNome/)。其主要功能是针对TCGA中33种肿瘤及癌旁组织的miRNA测序数据,以及GEO公共数据库中2万多位癌症患者及健康人群的循环miRNA数据进行系统分析。承蒙大家厚爱和支持,在朋友圈发布至今两周已有750左右的访问。因为希望能把这个工具持续维护下去,所以每一部分都做的非常用心。关于网站的功能,为什么做这样一个网页版工具,个人跟miRNA的渊源,以及对肿瘤早筛领域的热爱可以单独写一篇文章做详细介绍。
CancerMIRNome
Visitors
当你开发了一个shiny app之后,可能会想怎样能够让用户在任何地方都可以通过互联网访问,以及怎样为shiny app设置一个酷炫的网址。本文将细致讲解这两个问题的解决办法。即如何在AWS部署shiny app,以及如何绑定域名。关于shiny app开发的技术不做过多探讨。但是会提供一些简单的资料供入门者学习。
本文主要分三部分:
Shiny app开发
AWS上部署Shiny app
绑定域名
Shiny官网: https://shiny.rstudio.com/
Shiny官网Tutorial: https://shiny.rstudio.com/tutorial/
Shiny官网Articles: https://shiny.rstudio.com/articles/
Shiny官网Gallery: https://shiny.rstudio.com/gallery/
Shiny examples: https://github.com/rstudio/shiny-examples
![93ed52d81edc79aa177c285b868df5c4.png](https://img-blog.csdnimg.cn/img_convert/93ed52d81edc79aa177c285b868df5c4.png)
![d7ac310b700a93d3d43e4477830b8522.png](https://img-blog.csdnimg.cn/img_convert/d7ac310b700a93d3d43e4477830b8522.png)
![9296ba65429e1f698741236a6a48c13e.png](https://img-blog.csdnimg.cn/img_convert/9296ba65429e1f698741236a6a48c13e.png)
shinythemes (https://rstudio.github.io/shinythemes/)
shinydashboard (https://rstudio.github.io/shinydashboard/)
shinydashboardPlus (https://rinterface.github.io/shinydashboardPlus/)
dashboardthemes (https://github.com/nik01010/dashboardthemes)
shinyWidgets (http://shinyapps.dreamrs.fr/shinyWidgets/)
shinycssloaders (https://github.com/daattali/shinycssloaders)
shinyjs (https://github.com/daattali/shinyjs)
系统学习一下网页UI设计(比如HTML, CSS等)会让你的Shiny app看起来更加高级。w3schools ( https://www.w3schools.com/ ) 有一些学习资料。 一些优秀的已发表的开源Shiny apps也是非常好的学习资源。CancerMIRNome (Github: https://github.com/rli012/CancerMIRNome )从项目开始一直是开源的,欢迎大家学习交流和提出宝贵意见。 01 在AWS上部署Shiny app 当一个Shiny app开发完成后,如果你想把只能在本地运行的app发布出去供用户使用,就需要将你的Shiny app部署到服务器上。部署Shiny app的方法有很多,比如可以使用Shiny/RStudio的官方服务器shinyapp.io ( https://www.shinyapps.io/ )。你也可以使用云服务器,比如阿里云,腾讯云,亚马逊云(AWS)等。本文以AWS为例介绍Shiny app的部署,使用其他云服务器原理和设置应该是类似的。 01创建AWS账号
使用亚马逊云,你需要创建一个AWS账号( https://aws.amazon.com/free )。亚马逊提供一项12-month AWS Free Tier服务,用户可以免费使用1 CPU + 1G内存+30G存储的AWS云服务器12个月。此配置可以作为学习AWS及Linux系统的平台,但是亲测安装shiny至少需要2G内存,否则会一直卡在安装httpuv这一步,所以此配置可能无法满足部署shiny app的需求。运气好也许可以安装成功。 账号申请非常简单。只要输入邮箱,密码,用户名;然后填写个人联系方式,信用卡信息;最后确认即可。登陆账户
登陆AWS账户后即可选择你需要的服务。亚马逊为用户提供了非常多的服务内容。最常用的即Elastic Computing Cloud (EC2)和Simple Storage Service (S3)。顾名思义, EC2用于云计算,S3用于数据存储。部署一个简单的Shiny app暂时用不到S3,在此也不作过多讨论。![9d56ace2722e197c6c3d8874bb2115fb.png](https://img-blog.csdnimg.cn/img_convert/9d56ace2722e197c6c3d8874bb2115fb.png)
![84eceb2c3b5dc98df92fd182bbbaf197.png](https://img-blog.csdnimg.cn/img_convert/84eceb2c3b5dc98df92fd182bbbaf197.png)
# 登录服务器
$ ssh -i /location/to/shiny.perm ubuntu@your.ip.address
# 安装R等软件
$ sudo apt-get update
$ sudo apt-get install git
$ sudo apt-get install libcurl4-openssl-dev
$sudo apt-get install libxml2-dev
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
$sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/'
$ sudo apt update
$ sudo apt install r-base r-base-dev
# 安装shiny
#如果只是自己在用,R包最好使用root用户(sudo –i)安装,这样R包可以安装到默认的位置,方便使用。否则需要在运行R代码的时候指定.libPaths。
$ sudo -i
$ R
$ install.packages(‘shiny’, repos = ‘http://cran.rstudio.com/')
#其他R包的安装也类似
# 安装shiny server
$ sudo apt-get install gdebi-core
$ wget https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.14.948-amd64.deb
$ sudo gdebi shiny-server-1.5.14.948-amd64.deb
$ netstat -nlpt
$ sudo service shiny-server restart
# 测试shiny server是否安装成功
在浏览器中输入your.ip.address:3838
如果shiny server安装成功,会显示如下页面
![7365dc9983a62bcecc4ea0c2d3697957.png](https://img-blog.csdnimg.cn/img_convert/7365dc9983a62bcecc4ea0c2d3697957.png)
# 设置shiny-server.conf文件
$ sudo vim /etc/shiny-server/shiny-server.conf
在shiny-server.conf文件中添加app的位置,以CancerMIRNome为例:
location /CancerMIRNome {
app_dir /home/ubuntu/ShinyApps/CancerMIRNome; #location to the app
log_dir /var/log/shiny-server/CancerMIRNome; # log
}
其中CancerMIRNome是用户访问时要用到的名字。
app_dir指示shiny app的位置,log_dir指示运行app
时产生的logs存放的文件夹。
![8d73225995c3bfead63e6018b323e1ca.png](https://img-blog.csdnimg.cn/img_convert/8d73225995c3bfead63e6018b323e1ca.png)
$ cd /srv/shiny-server
$ sudo ln –s /home/ubuntu/ShinyApps/CancerMIRNome .
我们还需要做一下其他设置。
如果你的base URL没有对应的index.html文件,又不希望
别人看到你所有的apps,那么请将directory_index on改为directory_index off; 另外,默认的shiny server设置还有一个很不好的地方是报错的logs经常会被秒删,这就给debug带来了很大的困难。
所以要在shiny-server.conf文件中加一句:
preserve_logs true。
从shiny-server.conf文件中我们可以看到,默认的logs存放在、var/log/shiny-server中。
前面也已经说过,每个app的logs可以单独放在一个文件夹中。
设置完成后,重启shiny server
$ sudo service shiny-server restart
# 传输本地文件到AWS
$ scp -i shiny.perm -r CancerMIRNome/ ubuntu@3.236.105.88:/home/ubuntu/
记得在服务器上修改文件的可读权限
登陆Shiny app
所有文件准备就绪后,理论上来说你的app已经可以被用户通过互联网访问了。比如CancerMIRNome的访问地址:
http://3.236.105.88:3838/CancerMIRNome/
3.89.45.124是部署CancerMIRNome的AWS EC2 Instance的IP地址 如前所述,3838是shiny server的端口03 绑定域名 虽然你的app已成功发布,但是用户很难记住你的IP地址,连你自己恐怕都记不住。这时候你就需要给app绑定一个简单易记的域名,便于网站的传播和使用。 绑定域名可以分三步:购买/申请域名→设置DNS→设置reverse proxy Step 1: 购买/申请域名 域名注册商应该有很多。每个域名一年的费用大概$10到$20,所以没认真研究在哪买会便宜。大概查了一下GoDaddy(https://www.godaddy.com/)比较有名,就在那里购买了。域名有很多种类型,常见的.com, .net, .org等,你也可以申请.com.cn这种域名,看你的喜好和域名是否已经被注册。在学校一般可以联系IT部门申请子域名,比如bioinfo.ucr.edu就是ucr.edu的子域名,但是为了便于管理,我们还是自己申请了jialab-ucr.org的域名用于统一管理实验室的网站和生物信息学软件。关于域名的购买根据网站提示下单就可以。 Step 2: 设置DNS 有了域名后,你需要将域名和IP地址绑定到一起。这时候就需要设置Domain Name System (DNS)。这一步需要在你购买域名的注册商网站账户中完成。每个域名注册商的网站页面肯定略有不同,但是需要设置的内容是一致的。以GoDaddy为例,- 登陆账号,选定要设置的域名
- 管理DNS
- 添加DNS record
$ sudo vim /etc/shiny-server/shiny-server.conf
#找到 listen 3838,改为listen 80。重启shiny server:
$ sudo service shiny-server restart
成功!
在之前的AWS security groups设置中我们已经添加了HTTP 80端口。所以修改之后就可以直接在浏览器中输入bioinfo.jialab-ucr.org/CancerMIRNome访问了。如果之前没有打开80端口,需要到AWS EC2中进行设置。
如前所述,这样做虽然简单直接,但是会面临一个问题。如果你同时安装了RStudio server或者Jupyter Notbook,对这两个站点你也想用很清爽的网站地址,比如rstudio.jialab-ucr.org,这时候就无法实现了,因为80端口已经被shiny server占用了。
方法二:使用Nginx反向代理
上述问题可以用Nginx反向代理来解决。这方面我也不是很专业。但是找到一个很好的比喻。我们把服务器看成一座房子,里面有很多门。每个端口对应一个门。你必须敲开正确的门才能获取想要的信息。这就是为什么访问shiny server的时候要指定3838端口,即bioinfo.jialab-ucr.org:3838。
反向代理可以看作守在大厅的前台。而Nginx是最好的反向代理。我们把80端口给Nginx。假如我们想要访问shiny server,可以先跟Nginx通话,再由它帮我们找到shiny server获取我们想要的信息。这样就避免了去直接敲门。也就不必在访问的时候指定shiny server或RStudio server的端口了。
# Nginx安装和设置
$ sudo apt install nginx
$ cd /etc/nginx
$ cd sites-available
$ sudo vim shiny.conf
添加shiny.conf文件内容, 如
下:
![0d6c7dbca531a40719b9dd8db7ad2663.png](https://img-blog.csdnimg.cn/img_convert/0d6c7dbca531a40719b9dd8db7ad2663.png)
$ cd ../sites-enabled
$ sudo ln –s ../sites-available/shiny.conf .
# 检验反向代理是否设置成功
$ sudo nginx –t
#如果看到下列两行,则说明设置成功:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
#如果出现下列error:
nginx: [emerg] unknown "connection_upgrade" variable
打开nginx.conf文件,
$ sudo vim /etc/nginx/nginx.conf
# 添加:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close; }
![074b999b1f30bae90c5efca55d0ee092.png](https://img-blog.csdnimg.cn/img_convert/074b999b1f30bae90c5efca55d0ee092.png)
# 重启nginx
$ sudo systemctl restart nginx
大功告成!
现在你可以通过访问
http://bioinfo.jialab-ucr.org/CancerMIRNome/
来使用shiny app了。
作者简介
Ruidong Li, 加州大学河滨分校(UC Riverside)生物信息学博士,现任美国吉利德科学公司(Gilead Sciences, Inc.)生物信息科学家。
博士期间共发表SCI论文20余篇。其中以第一(或共同第一)作者在Molecular Biology and Evolution (IF: 11.062), Briefings in Bioinformatics (IF: 8.990), Plant Biotechnology Journal (8.154), 以及Bioinformatics(5.610)等杂志发表SCI论文7篇。主要研究兴趣包括癌症早筛,癌症信息学,以及数据科学在癌症诊断及预后的应用等。写在后面
搞生物信息学的小伙伴们都可以抽空学一学shiny这个可视化网页工具构建小技能,技多不压身嘛!文末阅读原文(http://www.biotrainee.com/forum-149-1.html)或者复制粘贴此URL均可直达我们的生信技能树早期shiny经验合辑!