shinyAPP相关,早在五年前我们生信技能树还是网页论坛的时候我就开辟了一个版块分享相关知识。这些年很多生物信息学爱好者都开发了自己的各式各样的网页工具,前些天浙江大学全球油菜基因资源数字化利用交互式网站上线,就是我们生信技能树VIP成员严涛做出来的,而且也邀请了他分享相关经验 把你的shiny网页工具部署在云服务器
这次,另外一个元老级生信技能树VIP成员也带来了他的Shiny app开发经验
最近博士导师实验室上线了一个基于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初学者,官网有大量入门资料可供学习。Tutorial对Shiny的基本元素和语法进行了系统介绍。Articles里有很多实用和进阶的攻略。Gallery里有上百个优秀的Shiny apps供用户学习,并且所有源代码都是公开的。RStudio的Github上也有182个Shiny examples可作为入门学习资源。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
能自己开发一些简单的Shiny小程序后,想要Shiny app看起来更专业或者更复杂一些,可以学习几个Shiny主题设计相关的R包, 比如: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)从项目开始一直是开源的,欢迎大家学习交流和提出宝贵意见。当一个Shiny app开发完成后,如果你想把只能在本地运行的app发布出去供用户使用,就需要将你的Shiny app部署到服务器上。部署Shiny app的方法有很多,比如可以使用Shiny/RStudio的官方服务器shinyapp.io (https://www.shinyapps.io/)。你也可以使用云服务器,比如阿里云,腾讯云,亚马逊云(AWS)等。本文以AWS为例介绍Shiny app的部署,使用其他云服务器原理和设置应该是类似的。使用亚马逊云,你需要创建一个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,在此也不作过多讨论。
我们使用EC2来部署Shiny app。选择EC2服务后即进入EC2 Dashboard。我们可以看到Running Instances, Key pairs, 以及Security groups等选项,这些都是需要用到的。
进入EC2 Dashboard后选择Running Instances Launch Instance
接下来共有七个步骤来launch an instance:选择AMI→选择Instance类型→配置Instance→添加存储→添加标签→配置安全组→Review有很多系统可供选择,在这里选用了Ubuntu Server 18.04 LTS (HVM), SSD Volume Type
Instance类型也有非常多。不同的类型对应不同的配置也对应不同价格。t2.micro就是我们上文提到的1 CPU + 1G内存的免费类型。t2.small有1 CPU + 2G内存,可以满足我们的需求。On-demand的t2.small每小时花费$ 0.023,差不多每天$0.55。如果使用3-year reserved t2.small,价格会降到每天$0.22。我现在使用2 CPU + 8G内存的t3a.large,3-year reserved,三年总共$750,也许阿里云腾讯云等有更便宜的计划,也欢迎讨论。当然你可以随时Stop或Terminate这个Instance。Stop通常只是暂停该Instance运行,可随时恢复。Terminate通常就让这个Instance彻底消失了。这一步需要做的事情比较多。因为Shiny server,RStudio server, 以及HTTP service等都用到不同的端口。每个端口都需要特定的配置。下图是我的设置。当然也可以之后用到哪个就添加哪个。其中,3838是Shiny server的端口;8787是RStudio server的端口;80是HTTP服务的端口;22就是初始的SSH登陆服务器的端口。再检查一遍,点击“Review and Launch”,进入下一页点击”Launch”, 此时会弹出一个对话框让你选择一个key pair。Key pair是为安全登录Instance设计的。对于Linux系统,有了这个key pair可以直接登录,无需每次都输入密码。第一次使用AWS你需要创建一个新的key pair,之后再Launch其他Instance的时候可以select an existing key pair,或者不嫌麻烦每个Instance都创建一个key pair也可以。点击Download Key Pair,有个shiny.pem(shiny是我对这个key pair的命名)的文件会被下载下来。将这个.pem文件放到一个指定的文件夹,然后修改读写权限 (chmod 400 shiny.pem),任何人不得修改里面的内容。最后点击Launch Instances (下载.pem文件之后就可以点击了),一个小型的服务器正式创建成功。再次进入EC2 DashBoard Instances,即可看到新创建的Instance, 你可以任意修改这个Instance的Name。选中该Instance即会显示相关的信息,找到IPv4 Public IP地址,这就是你用于登陆服务器的IP地址。
# 登录服务器
$ 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安装成功,会显示如下页面# 设置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存放的文件夹。你也许已经注意到shiny-server.conf有一行site_dir /srv/shiny-server,表示/srv/shiny-server是默认存放shiny app的文件夹。因此你可以在shiny-server文件夹中直接创建每个app的快捷方式,就不再需要添加上面的内容到shiny-server.conf中,比如运行:$ 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可以单独放在一个文件夹中。$ sudo service shiny-server restart
# 传输本地文件到AWS
$ scp -i shiny.perm -r CancerMIRNome/ ubuntu@3.236.105.88:/home/ubuntu/
所有文件准备就绪后,理论上来说你的app已经可以被用户通过互联网访问了。比如CancerMIRNome的访问地址:
http://3.236.105.88:3838/CancerMIRNome/
3.89.45.124是部署CancerMIRNome的AWS EC2 Instance的IP地址如前所述,3838是shiny server的端口虽然你的app已成功发布,但是用户很难记住你的IP地址,连你自己恐怕都记不住。这时候你就需要给app绑定一个简单易记的域名,便于网站的传播和使用。绑定域名可以分三步:购买/申请域名→设置DNS→设置reverse proxy域名注册商应该有很多。每个域名一年的费用大概$10到$20,所以没认真研究在哪买会便宜。大概查了一下GoDaddy(https://www.godaddy.com/)比较有名,就在那里购买了。域名有很多种类型,常见的.com, .net, .org等,你也可以申请.com.cn这种域名,看你的喜好和域名是否已经被注册。在学校一般可以联系IT部门申请子域名,比如bioinfo.ucr.edu就是ucr.edu的子域名,但是为了便于管理,我们还是自己申请了jialab-ucr.org的域名用于统一管理实验室的网站和生物信息学软件。关于域名的购买根据网站提示下单就可以。有了域名后,你需要将域名和IP地址绑定到一起。这时候就需要设置Domain Name System (DNS)。这一步需要在你购买域名的注册商网站账户中完成。每个域名注册商的网站页面肯定略有不同,但是需要设置的内容是一致的。以GoDaddy为例,
-
-
如果Points to设置的是@, 那么主域名(jialab-ucr.org)直接跟IP地址(3.236.105.88)绑定。假如你想将IP地址跟一个子域名绑定,在Points to中填入你想要的子域名即可,如下图中的第一条,使用了子域名bioinfo,用户访问的时候用到的地址是bioinfo.jialab-ucr.org,而不是主域名jialab.org。
完成设置后,域名就跟IP地址绑定到一起了。但是,到目前为止如果要访问Shiny app,依然需要指定3838端口,即bioinfo.jialab-ucr.org:3838/CancerMIRNome。这显然还没有达到我们的最终要求。Step 3: 设置反向代理(reverse proxy)如何在网站地址中去掉3838端口?有两种方法, 一种简单直接但是后续会有麻烦。另一种设置过程稍微繁琐但是一劳永逸。方法一:在shiny-server.conf中将3838改成80$ 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反向代理来解决。这方面我也不是很专业。但是找到一个很好的比喻。我们把服务器看成一座房子,里面有很多门。每个端口对应一个门。你必须敲开正确的门才能获取想要的信息。这就是为什么访问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
$ 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; }
# 重启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经验合辑!