在GCP上架設永久免費的 ShinyServer

Jim Chen
7 min readJul 3, 2020

--

最近不小心把原先 GCP 上的虛擬主機玩壞了,要重新架一個 Shiny server 時發現有點生疏,過程中遇到一堆問題,決定把步驟記錄下來以後自己可以參考。

Step 1 : 註冊 GCP 服務

GCP 全名是 Google Cloud Platform,是 Google 提供的雲端服務,其他同類型的服務還有 Amazon 的 AWS 以及 Microsoft 的 Azure,本篇僅介紹在 GCP 上架設免費的虛擬主機。

相信在坐各位都有 Google 帳號,接下來用你的 Google 帳號 到 GCP 官網開通服務就行了。

如果是第一次使用的話,應該會看到以下畫面 :

Activate GCP service

右上方有一個啟用按鈕,可以在接下來 12 個月內免費使用 GCP 的所有服務,並獲得 300 美金的抵免額。

看到這邊不用擔心一年後就要開始付費的問題,因為 GCP 有提供一些永久免費服務,這些服務在 Google 更改他們的營運策略前是不會收費的,本篇會使用到的服務僅有永久免費服務中的 f1-micro 執行個體 (每月) (20210916更新: 免費方案改成e2-micro了),所以就放心的給它啟用下去。

由於使用這類型的雲端服務都必須要綁定信用卡才能使用,所以啟用過程中會系統會要求使用者填入信用卡卡號並收 1 塊錢來進行認證。

Step 2 : 在 GCP 上建立虛擬主機

GCP 服務開通好了以後,點選左邊選單 Compute Engine 中的 vm 執行個體,就可以來建立我們的虛擬主機了。

Create a vm

需要注意的是,GCP 是使用專案的方式來管理各項資源,所以在建立虛擬主機以前,GCP 帳戶中必須要有執行中的專案,剛創立的帳戶若沒有任何專案,這邊系統會引導你建立一個新專案,這個過程通常需要幾分鐘。

這邊我新建的專案名稱叫 FreeVM,專案建立好後就可以點選「建立」來新建虛擬主機。

Create a VM instance

接下來的畫面就是要設定一些虛擬主機的硬體配備,由於 GCP 的永久免費方案選項中, CPU 只能選擇 f1-micro(1個 vCPU,614 MB記憶體),硬碟大小只能選擇 30GB。但是記憶體太小會導致一些套件安裝過程中,編譯記憶體不足而無法正常安裝,因此 CPU 我們先選擇 n1-standard-1(1個 vCPU,3.75 GB記憶體),等套件安裝完後再把虛擬主機關機並把配備調回低配。

當然也可以選擇使用 Ubuntu 的交換分區(Swap)的方式來增加記憶體大小,但步驟上比較麻煩,所以本篇採用懶人做法。

另外需要注意防火牆選項需要勾選允許 HTTP 流量和允許 HTTPS 流量,並按下「管理、安全性、磁碟、網路、單獨租用」展開更多選單,並點選「網路」標籤。

本篇以 Ubunut 16.04 為例

接著在「網路介面」的下拉式選單中的外部 IP 選擇建立 IP 位址,名稱我命名為 forshinyserver。

完成後就可以建立虛擬主機了。

旁邊的綠色勾勾表示現在虛擬主機是開機的狀態。接著點旁邊的 SSH 就可以連線到虛擬主機並透過指令來安裝 Shiny server 了。

Step 3 : 安裝 R 和相關 Packages

安裝 R 很簡單,四行指令搞定,這樣會安裝 R4.0 的版本 :

至於安裝 Package 就不能那麼單純進去 R 後透過 install.packages 安裝了,否則 ShinyServer 會抓不到套件,必須透過以下指令安裝 :

安裝完 shiny 套件後先按停止把虛擬機關機,然後點進 shinyserver 這台虛擬機器,在上方選單中點選編輯,把機器類型調回 f1-micro(1個 vCPU,614 MB記憶體) 以改回使用 GCP 的永久免費方案。

Step 4 : 安裝 Shiny Server

安裝 Shiny Server 相對來說比較容易,Rstudio 官網有給完整的指令 :

安裝完後 ShinyServer 就會自動啟動,且 Port 預設為 3838,這時候在內網內連線 localhost:3838 應該就可以連上 ShinyServer 了,但要讓外部網路可以連線,還需要在 GCP 的防火牆做一些設定。

Step 5 : GCP 防火牆設定

由於 ShinyServer 預設 Port 為 3838,但 GCP 的防火牆預設只開了一些常用的 Port 如 80 和 443,為了要讓 ShinyServer 通過,我們需要在防火牆上再開一個 3838 的 Port。

首先在最左邊選單選擇 VPC 網路 → 防火牆 → 上方選單「建立防火牆規則」。

防火牆規則的名稱我一樣了無新意的命名為 shinyserver,其他比較重要的設定如下 :

目標 : 網路中的所有執行個體

來源篩選器 : IP範圍

來源IP範圍 : 0.0.0.0/0

通訊協定和通訊埠 : 指定的通訊協定和通訊埠

tcp : 3838

設定無誤後按下建立,接著切回虛擬主機的編輯畫面,在「網路標記」的選項中新增剛剛建立的防火牆規則「shinyserver」並按下儲存。

接著打開瀏覽器,透過外部 IP 就可以連上 ShinyServer 啦,ShinyServer 預設網址為 :

http://外部 IP:Port/

以我的 ShinyServer 為例,網址為

http://34.75.152.252:3838/

由於 ShinyServer 預設是沒有用 https 的,所以網址如果多打一個 s 會無法連上要多注意。

Step 6 : 部屬自己的 ShinyApp

把自己的 App 放上 ShinyServer 非常簡單,只要透過 SSH 介面上傳檔案後,再移動至指定的路徑即可,我這邊拿我以前寫的「偽裝成StackOverflow的聊天室」App 做個示範。

首先把整個 ShinyApp 連同資料夾一起壓縮成 Zip 檔案,檔名叫做 MediumDemo.zip,然後點選 SSH 介面中右上角的齒輪 → 上傳檔案。

然後把整包 Zip 檔移動到 ShinyServer 的路徑下並且 unzip,再把 App Folder 的權限開給 Shiny,避免一些權限錯誤。 :

到目前為止就算完成了,輸入網址

http://IP:3838

應該就可以看到你的 Shiny Server 了!

由於免費版的 Shiny Server 沒有管控機制,所有人只要有網址都可以使用你的 Shiny App,正統作法是購買 Shiny Server Pro,或是使用 Nginx 這類的網頁框架來轉址(Link)。

但其實有另一個好東西叫做 ShinyProxy,涵蓋了免費版 Shiny Server 的所有功能,也有簡單易用的使用者管控機制,詳細使用方式可以參考這篇

--

--

Jim Chen

A machine learning engineer. Sharing what I saw and what I learned.