BREAKING NEWS

[4]

ArchLinuxでお洒落にShiny Serverする

Shiny は、RのWebアプリケーションフレームワークです。 ShinyのプログラミングもRStudioで行なっていれば、 RStudio上のボタンひとつで、Webブラウザが起動されて、 そこでWebアプリが動き出します。 そう、始めはこれだけでめちゃめちゃ楽しいのです!



しかし、この場合、Shinyアプリを利用するためには、 まず、RStudioを起動しなければなりません。 そしてまた、Shinyアプリが利用できるのは、 起動しているローカルのユーザーだけであり ローカルネットワーク内の他のユーザーからは 利用する事が出来ません。 なので、やがて、

Shinyアプリを普通にWebサービスとして利用したい!


と思いはじめるのです。



そこで登場するのが、このノートで紹介する Shiny Server です。



Shiny Server

Shiny Server

Put Shiny Web Apps Online.

このノートでは、 archlinuxに、shiny serverをインストールし、 自分で作成したShinyアプリを ローカルネットワーク上の全てのパソコンから 利用する方法を紹介します。



ArchLinuxで利用するための手順の概略

shiny serverの公式ドキュメントを見ると ubuntuやCentOS等のディストリビューションに関する説明はあるものの ArchLinuxに関する説明はありません。 しかし、 shiny serverは、ArchLinux上で、ちゃんと動きます。 そして、しっかりとAURにshiny serverのパッケージがあるので、 ソースを手動でビルドする必要もなく、 インストール自体は、コンパイルに時間が掛るものの 難しい部分はありません。 実際にやるべき作業を列挙すれば、次の通りです。



  • Rをpacmanでインストール
  • Rでshinyパッケージをシステムにインストール
  • shiny serverをAURからインストール
  • shiny serverを設定
  • shiny serverを起動

インストール作業

まずは、ArchLinuxのシステムに必要なものを インストールしていきます。



Rのインストール

R本体をインストールしていない場合、Rをインストールしましょう。 ArchLinuxの公式リポジトリに、 Rパッケージがあるので、 pacmanを使って簡単にインストール出来ます。



$ sudo pacman -S r


Rでshinyパッケージをシステムにインストール

次に、Shiny Serverを動かすために、 システム(どのユーザーからも見える場所)にshinyパッケージ がインストールされている必要があります。 そこで、shinyパッケージを システムにインストールして行きますが、 これは、archlinuxのパッケージとしてインストールするのではなくて、 Rそのもののコマンドを使ってRの環境にインストールします。 このため、インストール前に、 CRAN(パッケージリポジトリのミラーのようなもの)に関する 設定をしておく必要があります。 次のコマンドでシステム用のR設定ファイル /usr/lib/R/etc/Rprofile.site を準備します。



$ sudo vim /usr/lib/R/etc/Rprofile.site


ファイルの内容は日本のCRANサーバーを指定して、次の様にします。





この作業を行なわずに、 コマンドラインからのインストールを行なうと、 エラーになって作業が進められなくなる事があるので 注意しましょう。



準備が出来たら、次のコマンドを実行して、 shinyパッケージを システムにインストール します。



$ sudo su - -c "R -e \"install.packages('shiny')\""


以下は、上述のエラーの例です。 エラーの場合、パッケージインストール処理へ進まないので、 すぐにプロンプトに戻ってきます。 はじめてのインストールで、メッセージを読んでいないと、 エラーが出ていることに気が付かないことがあるので注意しましょう。



Shiny Serverのインストール

ArchLinuxへのインストールは、 公式サイトに紹介されているディストリビューションの一覧にはありません。 しかし、AURにShiny Serverのパッケージがあるので、 次のコマンドでインストールが可能です。



$ yay -S shiny-server-git


以上でインストール作業は、終了です。



Shiny Serverの設定

Shiny Serverの管理は、 設定ファイル /etc/shiny-server/shiny-server.conf で行ないます。 早速、エディタで開いてみましょう。



$ sudo vim /etc/shiny-server/shiny-server.conf


内容は、だいたい以下のようになっていると思います。



# Instruct Shiny Server to run applications as the user "shiny"
run_as shiny;

# Define a server that listens on port 3838
server {
  listen 3838;

  # Define a location at the base URL
  location / {

    # Host the directory of Shiny Apps stored in this directory
    site_dir /srv/shiny-server;

    # Log all Shiny output to files in this directory
    log_dir /var/log/shiny-server;

    # When a user visits the base URL rather than a particular application,
    # an index of the applications available in this directory will be shown.
    directory_index on;
  }
}


サーバー起動のテスト

まず、shinyアプリを置く場所は、「site_dir」で指定されている /srv/shiny-server であることを把握します。 そして、ここに自分が作ったShinyアプリをコピーしましょう。 RStudioのプロジェクトディレクトリ毎にコピーすればOKです。



$ sudo cp -r shiny_example001 /srv/shiny-server


アプリが配置できたら、 次のコマンドを実行してshiny-serverを起動します。



$ sudo /usr/bin/shiny-server


では、webブラウザを立ち上げ、 ローカルホストの3838ポートに接続しましょう。 この3838ポートは、shiny-server.confの「listen」で指定されたものになります。





webブラウザに、 自分のコピーしたアプリのディレクトリ一覧が表示されるので そこに移動すれば、各Shinyアプリが起動します。



上述のスクリーンショットでは、WebブラウザのURL欄に着目してください。



shinyアプリの起動確認が出来たら、 Shiny Serverを終了しましょう。 起動したコンソールで Ctrl+C キーで終了することが出来ます。



Shinyアプリを置く場所をホームディレクトリ配下に

ここで、各ユーザーが管理者権限を必要とせず、 アプリを簡単にデプロイ(配置)出来るよう、 Shinyアプリの配置場所を各ユーザーディレクトリ以下の

~/ShinyApps/


というディレクトリとして設定する方法を紹介します。



再度、設定ファイル /etc/shiny-server/shiny-server.conf をエディタで開いてみましょう。



$ sudo vim /etc/shiny-server/shiny-server.conf


必要に応じて元の内容をバックアップした後、 以下のように書き換えます。



run_as :HOME_USER: shiny;

server {
  listen 3838;
  
  # グローバルなアプリのデプロイ場所
  location / {
    site_dir /srv/shiny-server;
    log_dir  /var/log/shiny-server;
    directory_index on;
  }

  # ユーザー毎のホームディレクトでデプロイ可能
  location /user {
    user_dirs;
    members_of shiny;
    directory_index on;
  }

}



次に、shinyアプリをホームディレクトリ内にデプロイしたいユーザーを shinyグループに追加します。 例えば、ユーザーnekoをshinyグループに追加するならば、 次のコマンドを実行します。



$ sudo usermod -aG shiny neko


続いて、shinyアプリをホームディレクトリ内にデプロイしたいユーザーの ホームディレクトリに ShinyAppsディレクトリを作成します。 そして、その中にshinyアプリをデプロイしましょう。



$ mkdir ~/ShinyApps
$ cp -r shiny_example001 ~/ShinyApps


以上で準備完了です。 shiny serverを起動してみましょう。



$ sudo /usr/bin/shiny-server


Webブラウザを起動し、 まずは、先程確認したシステムのデプロイ先にアクセスしてみましょう。





先程同様にアクセス出来ることが確認出来たら、 いよいよ、ユーザー権限でデプロイしたアプリにアクセスします。 ユーザー名がnekoの場合、URLは次のようになります。





アクセスすると、アプリのディレクトリ一覧が表示されているはずです。 ディレクトリをクリックすることで そのアプリが起動されます。



先程と同様に、 上述のスクリーンショットでは、WebブラウザのURL欄に着目してください。



以上で、設定は完了です。



systemdによるサービスの起動

Shiny Serverの起動の管理は、 systemdのsystemctlコマンドにより行います。



ユニットの編集

まず、起動設定の前に Shiny Server起動用の設定ファイル(ユニット)を編集します。



$ sudo vim /usr/lib/systemd/system/shiny-server.service


下記のように User=shiny の行をコメントアウトするために 行頭に#(シャープ)を付けます。



[Unit]
Description=Shiny Server
After=network.target

[Service]
Type=simple
#User=shiny
ExecStart=/usr/bin/shiny-server

[Install]
WantedBy=multi-user.target


この作業は重要です。 通常、Shiny Serverは、 shinyユーザーの権限で実行されるように設定されています。 しかし、このノートで行なっているように、 一般ユーザーのディレクトリ内にアプリをデプロイする場合、 一旦、root権限で起動し、各ユーザー権限に切り替える必要が生じます。 このため、上述のように、ユニットを編集しておく必要があります。 もし、この作業をおこなわないと、 Shiny Serverは起動時にエラーが発生し起動しません。



上記スクリーンショットがエラーの例です。 Webブラウザでは、アドレスへアクセス出来ない旨が出力され、また、 systemctl statusコマンドの出力に、'shiny' does not have permissions というエラーメッセージが確認出来ます。



サービスの起動

systemctlコマンドを使って、 サービスの自動起動を設定します。



$ sudo systemctl start shiny-server.service


サービスがうまく動いているなら、 次回起動時から自動で起動するように 次のコマンドを実行します。



$ sudo systemctl enable shiny-server.service


ここまでの作業で、おうち内の ローカルネットワークに繋っているパソコンから Shinyアプリにアクセス出来るようになりました。



avahiで名前解決

次に、ShinyServerが稼動しているホストの名前をスマートに解決するため、 avahiを利用します。 手順は、下記のノートのavahi項目を参照しましょう。



ssh鍵でパソコンへお洒落に侵入する

ssh鍵でパソコンへお洒落に侵入する

archlinux環境でsshを使い、リビングのソファーに寝転びながらノートパソコンで 離れた場所にあるデスクトップパソコンを操作しましょう。

Linux側でavahiの設定をしてしまえば、 同一ローカルネットワーク内では、 Windowsパソコンからも、iPhonからも ホスト名でアクセス出来るようになります。



最後に

色々とライブラリを呼び出すShinyアプリの例

僕が最近書いているShinyアプリの一つを例として宣伝します。



GitHub - syunsuke/koala

GitHub - syunsuke/koala

koara is KOuji price anALizing mAp.

この「koala」は、 国土交通省が公示している、 全国の不動産の価格(地価公示)を閲覧するためのShinyアプリです。 地図閲覧なので、leafletをはじめ、Tidyverse等のパッケージを読み込みます。



実際にためしてみる場合は、 githubからクローンし、 RStudio内で必要ライブラリ等 (app.Rのlibrary()を直接参照してくださいね)を インストールして動くことを確認してから、 shiny serverへディプロイしましょう。



次の後書きでも述べますが、 このアプリを開発しながら簡単に使えるように、 ShinyServerでホームディレクトリ以下でデプロイ出来るように 使っています。



ノート後書き

このノートでは、面倒臭がり屋の人でも実践しやすいように、 典型的なやり方を一本道で紹介しました。 例えば、Shinyパッケージのグローバルへのインストールは、 直接コマンドラインのオプションとして指定することももちろん出来ます。 また、Webブラウザでディプロイディレクトリのルートにアクセスしたときの 一覧表示も本来のセキュリティ観点からは、よろしくなさそうですが、 はじめてShinyServerのデプロイを行なうときには、 ディレクトリ構造を把握しやすいので、みえるようにしてあります。 更に、systemdでのユニット編集に関しては、 直接ファイルを書き換えると、 パッケージアップデートの際に手間が必要になるので、 systemdの上書き設定作法に従った方が良いです。 (みんな大好きArchWiki参照) これらは、いずれ慣れてきたら、 設定ファイルで適切に設定しなおす必要があるかもしれません。 さて、そんな色々はあるのですが、 このノートをまとめようと思ったきっかけは次のものです。



shiny serverを利用する時、 デプロイ場所が、/srv/shiny-server/という グローバルでもよいのですが(これでOKの場合、デフォルト設定でいけるので何もする必要が無く簡単)、 グローバルで起動する場合、 そのアプリが参照するライブラリパッケージが グローバルの場所から見えるところにインストールされていなければなりません。



ここで、Rのプロジェクトは通常、 各ユーザーが利用するRStudioで行なわれ、 パッケージの管理も同様にRStudioで行なわれて、 ユーザー毎のホームディレクト以下に保存されます。 あわせて、LinuxでRを使う場合、 パッケージのインストール時にコンパイル作業があるので 結構時間が掛ります。



以上の事から、 ユーザーが開発したものを、 グローバルな場所に置きなおすと、 改めてパッケージライブラリをインストールしなおさなければならないので 面倒臭いのです。



そこで、このノートです! まぁ、プロの方々は別として、 趣味でやっている者にとっては、 やっぱり、おうちサーバーは動いているだけで興奮です。 公式にArchLinuxの表記がなくったって、 ちゃんとArchLinuxでも動きます。 このノートを活用して、 自作Shinyアプリをローカルネットワーク内に公開し、 みんなに自慢しちゃいましょう!!



ArchLinuxでお洒落にShiny Serverする ArchLinuxでお洒落にShiny Serverする Reviewed by shunsk on 6/13/2022 Rating: 5

No comments:

Sora Templates

Image Link [https://scontent.xx.fbcdn.net/v/t1.0-9/13343039_103147363441877_5912666874811349341_n.jpg?oh=32de40bba33988d454d1a3104dde18ac&oe=57D1E6F4] Author Name [Syunkichi] Author Description [Let's write codes staylishly!!!!!] Twitter Username [webgeek7] Facebook Username [syunkichi.nekota] GPlus Username [114037852049523769954] Pinterest Username [pcgeek91] Instagram Username [s.nekota]