服務(wù)器de novo部署shiny app到網(wǎng)頁上

為了方便別人快速使用我們文章的數(shù)據(jù),先前給自己的project開發(fā)了一個(gè)shiny app,現(xiàn)在需要把這個(gè)APP部署到網(wǎng)頁上茎匠,因此記錄下整個(gè)部署過程。使用的是個(gè)空白的服務(wù)器押袍,centos系統(tǒng)诵冒。

第一步 安裝R(因?yàn)槲疫@個(gè)shiny app是基于R來的,因此R是必須的)安裝方法我喜歡編譯安裝谊惭,當(dāng)然也有很多人喜歡用conda安裝汽馋,這個(gè)看個(gè)人偏好。

(1) 下載與解壓
官網(wǎng) https://cran.rstudio.com/src/base/R-4/
也可以自己從舊服務(wù)器copy過來圈盔,使用scp命令豹芯,注意如果端口不是默認(rèn)的22的話,需要指定端口药磺,使用參數(shù) -P 即可

$ cd 
$ mkdir soft && cd soft
$ export R_VERSION=4.2.0

$ wget https://cran.rstudio.com/src/base/R-4/R-4.2.0.tar.gz
$ tar -xzvf R-${R_VERSION}.tar.gz
$ cd R-${R_VERSION}

(2) Build and install R

## 升級(jí)系統(tǒng)告组,補(bǔ)充一些包
$ tmux   #升級(jí)時(shí)間較長(zhǎng),防止意外中斷
$ sudo yum install epel-release 
$ sudo yum update 
### 565M, 286個(gè)包癌佩,可能需要幾個(gè)小時(shí)木缝,取決于網(wǎng)速便锨。中間 GPG key 選 y;  16:47--> 17:05 
### sudo shutdown -r now  #能跳過重啟

## 安裝build的依賴
$ sudo yum-builddep R 
## 188M, 281個(gè)包,耐心等待 

## 配置我碟,主要是--prefix 指定安裝位置
$ sudo mkdir -p /opt/R/
$ ./configure \
--prefix=/opt/R/${R_VERSION} \
--enable-memory-profiling \
--enable-R-shlib \
--with-blas \
--with-lapack

## 最后報(bào)警告放案,可以忽略,沒啥影響矫俺。
## configure: WARNING: neither inconsolata.sty nor zi4.sty found: PDF vignettes and package manuals will not be rendered optimally

## 編譯 | 可選多線程編譯吱殉,提高速度
$ make ## 可多線程編譯 make -j 64 

## 安裝
$ sudo make install

## 清理殘余
$ make clean

(3) checking

$ ls /opt/R/${R_VERSION}/
## bin lib64 share

$ /opt/R/${R_VERSION}/bin/R --version
R version 4.2.0 (2022-04-22) -- "Vigorous Calisthenics"
Copyright (C) 2022 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

(4) Create a symlink to R 添加軟鏈接

$ sudo ln -s /opt/R/${R_VERSION}/bin/R /usr/local/bin/R
$ sudo ln -s /opt/R/${R_VERSION}/bin/Rscript /usr/local/bin/Rscript

(5) 再次檢查當(dāng)前R

## 重新登錄終端
$ ssh xxx

$ which R
/usr/local/bin/R

$ R --version
R version 4.2.0 (2022-04-22) -- "Vigorous Calisthenics"
## 已經(jīng)是R最新版了

$ whereis R
R: /usr/local/bin/R

至此,R安裝完成厘托。這部分參考了我?guī)熜窒惹皩懙囊粋€(gè)推文R 安裝

第二步 安裝Shiny server

(1) 安裝可參考shiny 官網(wǎng) https://www.rstudio.com/products/shiny/download-server/redhat-centos/
我的是centos友雳,如果是Ubuntu的,在官網(wǎng)選擇Ubuntu即可铅匹。

## You’ll also need to install the Shiny R package before installing Shiny Server:
$ sudo su - \
-c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""

## Download and Install shiny-server
$ wget https://download3.rstudio.org/centos7/x86_64/shiny-server-1.5.19.995-x86_64.rpm
$ sudo yum install --nogpgcheck shiny-server-1.5.19.995-x86_64.rpm

安裝好shiny-server以后押赊,會(huì)自動(dòng)新建一個(gè)shiny的用戶
(2) 需要對(duì)shiny用戶做一些簡(jiǎn)單的設(shè)置

# 先切換到root模式
$ sudo -i 
# 然后設(shè)定密碼
$ sudo passwd shiny 

# 添加組
$ sudo groupadd shiny-apps
$ sudo usermod -aG shiny-apps shiny
$ sudo usermod -aG shiny-apps webdep # 也允許主用戶可以訪問,這個(gè)webdep需要根據(jù)的用戶名做適當(dāng)修改

# change owner:將指定文件的擁有者改為指定的用戶或組
$ sudo chown -R shiny:shiny-apps /srv/shiny-server
$ sudo chmod g+w /srv/shiny-server
$ sudo chmod g+s /srv/shiny-server
# g - the permissions that other users in the file's group have for it
# w - set user or group ID have right to write
# s - set user or group ID have right to execute

# 設(shè)置完成,查看【/srv/shiny-server這個(gè)目錄就是存放各種shiny app的地方啦】
$ ls -l /srv/shiny-server
# total 0
# lrwxrwxrwx 1 shiny shiny-apps 38 Oct 11 19:35 index.html -> /opt/shiny-server/samples/welcome.html
# lrwxrwxrwx 1 shiny shiny-apps 37 Oct 11 19:35 sample-apps -> /opt/shiny-server/samples/sample-apps

# 之后我們都用shiny這個(gè)用戶安裝R包
$ su - shiny

接下來包斑,你可以選擇安裝Rstudio流礁,當(dāng)然這個(gè)不是必要的,安裝可參考官網(wǎng)https://www.rstudio.com/products/rstudio/download-server/redhat-centos/

## 非常簡(jiǎn)單
$ wget https://download2.rstudio.org/server/centos7/x86_64/rstudio-server-rhel-2022.07.2-576-x86_64.rpm
$ sudo yum install rstudio-server-rhel-2022.07.2-576-x86_64.rpm
第三步 安裝shiny app 需要的R包及對(duì)R進(jìn)行配置

Note 首先切換到shiny用戶罗丰,然后再操作神帅!
(1) 配置.Rprofile

# 命令
$ vi .Rprofile
# 然后輸入下面??
Sys.setenv(LANG="en_US.UTF-8")
options=(repo = c(CRAN = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))
options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor")
# 最后保存退出

(2) 配置.Renviron

$ mkdir /home/shiny/R_Library

# 命令
$ vi .Renviron
# 然后輸入下面??
R_LIBS=/home/shiny/R_Library
# 最后保存退出

(3) 因?yàn)槭且渲胹hiny網(wǎng)頁,所以接下來我們需要以shiny用戶登陸

# 之后我們都用shiny這個(gè)用戶安裝R包
$ su - shiny

####################
# 下面??均在R中進(jìn)行  #
####################
$ R 
# 配置鏡像 (前面配置過.Rprofile的話萌抵,可以跳過)
local({
  r <- getOption( "repos" ); 
  r[ "CRAN" ] <- "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"; 
  options( repos = r )
  BioC <- getOption( "BioC_mirror" ); 
  BioC[ "BioC_mirror" ] <- "https://mirrors.ustc.edu.cn/bioc/"; 
  options( BioC_mirror = BioC )
})
# 安裝shiny需要的包 
## 定義個(gè)安裝包的函數(shù)1
getPackage <- function(pkg, check = TRUE, load = TRUE, silent = FALSE, github = NULL) {
  if(check) {
    if(!suppressMessages(suppressWarnings(require(pkg, character.only = TRUE, quietly = TRUE)))) {
      if(is.null(github)){
        try(install.packages(pkg), silent = TRUE)
      }
      else{
        try(remotes::install_github(github))
      }
    }
  }
  if(load) suppressPackageStartupMessages(library(pkg, character.only = TRUE, quietly = TRUE))
  if(load & !silent) message("Loaded ", pkg)
}
packages <- c("dplyr","psych","Matrix","ggplot2", "png", "ggedit", "cowplot", "ggbeeswarm", "ggrepel", "corrplot", "grid", "RColorBrewer", "dplyr", "egg", "gtable", "scales", "reshape2")
lapply(packages, getPackage)

## 定義個(gè)安裝包的函數(shù)2
all_pkgs <- c("BiocVersion","limma")
if (!requireNamespace("BiocManager", quietly = TRUE)){
  install.packages("BiocManager")
}
CRANpackages <- available.packages() # 全部的CRAN包
lapply(all_pkgs, 
        function( p ){
          if( !require( p, character.only = T ) ){
            if( p %in% rownames( CRANpackages) ){
              install.packages( p )
            }else{
              BiocManager::install( p, suppressUpdates = FALSE, ask = FALSE)
            }
          }
        }
)

(4) 開放端口及啟動(dòng)shiny app
shiny默認(rèn)設(shè)置3838端口找御,rstudio默認(rèn)是8787 端口

## 開放3838端口
$ sudo iptables -I INPUT -p tcp --dport 3838 -j ACCEPT

#保存修改到數(shù)據(jù)表
$ sudo service iptables save

### 如果保存報(bào)錯(cuò),應(yīng)該是防火墻攔截了 
### 解決方法:關(guān)掉 firewalld谜嫉,并打開 iptables-services 服務(wù)萎坷。 
$ sudo systemctl stop firewalld     #關(guān)閉防火墻
$ sudo systemctl disable firewalld.service #禁止firewall開機(jī)啟動(dòng)

$ sudo yum install iptables-services   #安裝或更新服務(wù)
$ sudo systemctl enable iptables        #開機(jī)啟動(dòng)iptables
$ sudo systemctl start iptables        #打開iptables
## 開放3838端口
$ sudo iptables -I INPUT -p tcp --dport 3838 -j ACCEPT
$ sudo service iptables save        #保存修改

### 重啟iptables服務(wù):
$ sudo service iptables restart
## 執(zhí)行完畢之后 /etc/sysconfig/iptables 文件就有了

(5) 把shiny項(xiàng)目放在自己的家目錄
5.1 首先把項(xiàng)目放在自己的家目錄

# 方案1:項(xiàng)目在github上,可以直接git clone
$ cd /home/shiny
$ git clone 你的項(xiàng)目地址

# 方案2:本地上傳
$ scp -r /本地目錄/app shiny@你的IP地址:/home/shiny
# 然后在服務(wù)器上設(shè)置這個(gè)目錄的權(quán)限
$ chmod 755 /home/shiny/app

5.2 然后在 /srv/shiny-server 中加入項(xiàng)目的快捷方式

$ sudo ln -s /home/shiny/app /srv/shiny-server
# 同時(shí)更改項(xiàng)目屬主是shiny
$ sudo chown -R shiny:shiny app/ ## app是你自己的app名字沐兰,需要適當(dāng)修改

5.3 之后重啟

$ sudo systemctl restart shiny-server.service

5.4 最后輸入:http://你的IP:3838/你的shiny項(xiàng)目名稱

常見的報(bào)錯(cuò)
如果無法運(yùn)行shiny app哆档,去 /var/log/shiny-server/ 目錄下看看log文件中的報(bào)錯(cuò)信息,一般是由于缺少包住闯,解決后瓜浸,立刻就能恢復(fù)運(yùn)行。

(6) 可能的優(yōu)化
6.1 刪掉原來的shiny app
默認(rèn)情況下比原,直接輸入IP地址會(huì)顯示自帶的shiny app模板:

默認(rèn)界面

只要測(cè)試shiny可以用了插佛,就可以刪掉它了:

$ sudo rm -rf /srv/shiny-server/sample-apps

6.2 服務(wù)器總是自動(dòng)斷線

$ sudo vim /etc/ssh/sshd_config
# 找到下面這兩行
#ClientAliveInterval 0
#ClientAliveCountMax 3

# 然后去掉注釋,并且修改
ClientAliveInterval 30 #意思是:服務(wù)端每隔多少秒向客戶端發(fā)送一個(gè)信號(hào)
ClientAliveCountMax 86400 #意思是:客戶端多少次沒有相應(yīng)量窘,服務(wù)器自動(dòng)斷掉連接

# 最后重啟ssh
$ service sshd restart

6.3 Shiny server 常用操作

啟動(dòng):
$ sudo systemctl start shiny-server
$ sudo systemctl enable shiny-server

重啟: 
$ sudo systemctl restart shiny-server.service

查看日志:
$ cat /var/log/shiny-server.log

這部分內(nèi)容參考了劉小澤老師的推文

至此雇寇,服務(wù)器重頭部署shiny app到網(wǎng)頁的工作到此完成。由于我自己的是學(xué)校的IP,所以目前部署到的是內(nèi)網(wǎng)上锨侯,目前在對(duì)接信息中心嫩海,到時(shí)候開放外網(wǎng)的IP的就可以讓每個(gè)人都可以訪問了,下面是自己的shiny app囚痴,等文章放到biorxiv就一起公開了叁怪。

自己的APP

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者深滚。
  • 序言:七十年代末奕谭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痴荐,更是在濱河造成了極大的恐慌血柳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件生兆,死亡現(xiàn)場(chǎng)離奇詭異混驰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)皂贩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昆汹,“玉大人明刷,你說我怎么就攤上這事÷郑” “怎么了辈末?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)映皆。 經(jīng)常有香客問我挤聘,道長(zhǎng),這世上最難降的妖魔是什么捅彻? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任组去,我火速辦了婚禮,結(jié)果婚禮上步淹,老公的妹妹穿的比我還像新娘从隆。我一直安慰自己,他們只是感情好缭裆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布键闺。 她就那樣靜靜地躺著,像睡著了一般澈驼。 火紅的嫁衣襯著肌膚如雪辛燥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音挎塌,去河邊找鬼徘六。 笑死,一個(gè)胖子當(dāng)著我的面吹牛勃蜘,可吹牛的內(nèi)容都是我干的硕噩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼缭贡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼炉擅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阳惹,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤谍失,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后莹汤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體快鱼,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年纲岭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抹竹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡止潮,死狀恐怖窃判,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喇闸,我是刑警寧澤袄琳,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站燃乍,受9級(jí)特大地震影響唆樊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刻蟹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一逗旁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧座咆,春花似錦痢艺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哺呜,卻和暖如春舌缤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工国撵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陵吸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓介牙,卻偏偏與公主長(zhǎng)得像壮虫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子环础,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容