Shiny app开发, AWS上部署Shiny app,绑定域名

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开发的技术不做过多探讨。但是会提供一些简单的资料供入门者学习。

本文主要分三部分:

  1. Shiny app开发

  2. AWS上部署Shiny app

  3. 绑定域名

01
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 Tutorial
Shiny Articles
Shiny Gallery
能自己开发一些简单的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)从项目开始一直是开源的,欢迎大家学习交流和提出宝贵意见。
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的需求。运气好也许可以安装成功。
账号申请非常简单。只要输入邮箱,密码,用户名;然后填写个人联系方式,信用卡信息;最后确认即可。
02

登陆账户

登陆AWS账户后即可选择你需要的服务。亚马逊为用户提供了非常多的服务内容。最常用的即Elastic Computing Cloud (EC2)和Simple Storage Service (S3)。顾名思义, EC2用于云计算,S3用于数据存储。部署一个简单的Shiny app暂时用不到S3,在此也不作过多讨论。
03
创建实例(Instance)
我们使用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
Step1: 选择AMI
有很多系统可供选择,在这里选用了Ubuntu Server 18.04 LTS (HVM), SSD Volume Type
Step2: 选择Instance类型
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彻底消失了。
Step3: 配置Instance
不需要调整,选择默认参数即可
Step4: 添加存储
加到免费的30G上限
Step5: 添加标签
可跳过
Step6: 配置安全组
这一步需要做的事情比较多。因为Shiny server,RStudio server, 以及HTTP service等都用到不同的端口。每个端口都需要特定的配置。下图是我的设置。当然也可以之后用到哪个就添加哪个。
其中,3838是Shiny server的端口;8787是RStudio server的端口;80是HTTP服务的端口;22就是初始的SSH登陆服务器的端口。
这一步设置好之后就不用担心用户无法访问的问题了。
Step7: Review
再检查一遍,点击“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地址。
04
登录服务器,安装软件,部署Shiny app
接下来的内容废话不多说,直接上代码。
# 登录服务器
$ 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可以单独放在一个文件夹中。
设置完成后,重启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为例,
  1. 登陆账号,选定要设置的域名
  2. 管理DNS
  3. 添加DNS record
Type: A
Host: your IP address
Points to: @
如果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反向代理
上述问题可以用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文件内容, 如下:
$ 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经验合辑!
(0)

相关推荐

  • Nginx永久重定向使主域名跳转3w域名

    Nginx作为一个高性能.高并发.模块化设计.可扩展性好.生态圈丰富.稳定性好.可靠性高.支持热部署.源码开源.占资源少的web server,具有很多优点. 这里说一下使用nginx的rewrite ...

  • certbot在Centos7上配置合法签名证书,实现nginx的https访问

    咖菲猫-李常明笔记 公司因之前使用的openssh创建的自签名证书,有一个弊端,就是在某些客户端上不能使用此证书,无法使用https连接,所以,研究了一下certbot 做签名证书! certbot的 ...

  • Amh-Nginx环境下开启ssl后自动跳https教程

    这几天想更换linux,于是使用了amh的控制面板,因为目前来说wdcp使用ssl的话,还得手动编辑配置文件,而且我还没成功,因为现在ssl很有安全,估计用不了多久很多的网站都会换上https这个形式 ...

  • 餐饮APP开发解决方案_外卖订餐APP定制开发

    餐饮APP是为餐饮行业量身打造的手机应用程序,用户能够通过餐饮APP享受手机点餐.在线咨询.线路导航.优惠推送.御用厨师.一键呼叫.shoujidingwei等各种功能服务.用户通过餐饮APP能够享受 ...

  • 聊天室多人语音APP开发,多人语音APP软件搭建

    相对于文字图片,多人语音APP开发是能够实现语音聊天的一段程序源码,多人语音APP交流相较于文字符号相比,更为生动,能够切实感受到对方的语气,通过语气感知态度,知晓对方此时的心情. 与视频聊天系统相比 ...

  • 现实APP开发应用类APP开发定制开发一对一设计私有化部署

    跨平台APP高端定制开发服务商,都是全部工作多年工程师,思维慎密技术全面,为您提供安卓IOS原生开发,从沟通流程.立项流程到开发流程全部规范化,服务多家企业,标准化技术管理,分工明确,一对一全程跟进客 ...

  • 教育app开发:如何利用教育平台源码减少机构线上转型阻力

    教育与直播行业的结合,在教育领域造成了"百家争鸣"的局面,但市场出现了两极分化,部分机构一直坚持传统教育理念线下发展:但有些机构想要紧跟市场发展的脚步,却不知道如何在线转型.机构如 ...

  • So Easy - 在Linux服务器上部署 .NET Core App

    .NET Core 是微软提供的免费.跨平台和开源的开发框架,可以构建桌面应用程序.移动端应用程序.网络应用程序.物联网应用程序和游戏应用程序等.如果你是 Windows 平台下的 dotnet 开发 ...

  • APP开发流程知道多一点(上)

    有充足的预算和找到合适的开发APP公司后,就要把握时间落实开发APP的计划了.所以今日就会跟大家讲解APP的开发流程,一定要看到最后哦! 决定产品开发项目 要和开发APP公司决定开发项目,可以从1. ...

  • 餐饮app开发的意义与好处

    大家都知道,随着人们用食物的味道来看网络食物的发展趋势,店铺和手机支付的融合已经是必然趋势.对此事,餐饮企业应提高自身信息化管理.手机.互联网业务流程的快速发展趋势规定,餐饮企业具备快速发展的业务能力 ...

  • 网络教育app开发能够带来的价值

    教育APP开发行业的快速发展主要取决于国内移动和教育培训机构的整合,各行各业的教育知识是个性化的专业教育APP软件.为了更好地满足客户的需求,在线教育APP软件有时必须出现.教育APP开发工作主要面向 ...

  • 短视频APP开发,省钱开发攻略了解一下

    短视频APP开发怎么能最省钱?开发需要选择哪些必备功能?对于运营商来说,这些问题成为阻碍他们进入短视频行业的绊脚石,如何能避免这些问题,少交冤枉钱做到最合适的开发呢?今天就给大家介绍几招. 一.如何减 ...