ArchLinuxでお洒落にShiny Serverする
Shiny は、RのWebアプリケーションフレームワークです。 ShinyのプログラミングもRStudioで行なっていれば、 RStudio上のボタンひとつで、Webブラウザが起動されて、 そこでWebアプリが動き出します。 そう、始めはこれだけでめちゃめちゃ楽しいのです!
しかし、この場合、Shinyアプリを利用するためには、
まず、RStudioを起動しなければなりません。
そしてまた、Shinyアプリが利用できるのは、
起動しているローカルのユーザーだけであり
ローカルネットワーク内の他のユーザーからは
利用する事が出来ません。
なので、やがて、
と思いはじめるのです。
そこで登場するのが、このノートで紹介する Shiny Server です。
このノートでは、 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項目を参照しましょう。
Linux側でavahiの設定をしてしまえば、 同一ローカルネットワーク内では、 Windowsパソコンからも、iPhonからも ホスト名でアクセス出来るようになります。
最後に
色々とライブラリを呼び出すShinyアプリの例
僕が最近書いているShinyアプリの一つを例として宣伝します。
この「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アプリをローカルネットワーク内に公開し、 みんなに自慢しちゃいましょう!!
No comments: