為了方便別人快速使用我們文章的數(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模板:
只要測(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就一起公開了叁怪。