Windows10＋vagrantでRStudioServerを動かす

Rstudio serverをWindows10で動かします。勉強会参加者に自宅マシン上のRstudio serverを開放して使ってもらう為、複数のユーザーアカウントを設定して、インターネットからアクセスできるようにしてみました。

参考: 
https://qiita.com/kazutan/items/6048fa8d46683dcad788

#### 動機
統計の勉強会をRを使ってやりはじめたところ、英語版WindowsユーザーやMacユーザーかつPCリテラシー低くて文字コード問題を自力で解決できない参加者が続出しました。ほんとはそれぞれの環境でちゃんと動くようにサポートしつつ頑張ってもらうのが良いんだと思うんですが、エンジニアじゃない参加者が多い為か勉強会がぜんぜん進まなくなっちゃった為、とりあえず進めるためにR studio serverでひと通り動く環境を用意しておいて全員が動かして確認できるようにしちゃう事にしました。

#### やったこと
1. MSYS2をインストール
2. MSYS2環境をアップデート
3. VirtualBoxをインストール
4. Vagrantをインストール
5. 仮想マシンを起動
6. 仮想マシンにRをインストール
7. Vagrantfileを書き換え
8. ローカルネットワークからアクセスしてみる
9. 複数ユーザー用にIDとパスワードを追加
10. インターネットからアクセスしてみる
11. 追記： 日本語フォントをインストールする

#### 試した環境
windows10 64bit
cpu: Ryzen7 1700X
MB: ROG STRIX X370-F GAMING
msys2-x86_64-20180531
VirtualBox-5.2.22-126460-Win
vagrant_2.2.1_x86_64

#### 手順
##### ざっくり説明


##### 1. MSYS2をインストール

MSYS2インストーラーを以下からダウンロードします。
https://sourceforge.net/projects/msys2/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/8438010a-2f3b-5481-1c5b-344ab03b08b0.png)

落ちてきたインストーラーを実行してインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/0a17a3f7-173b-c9e3-023b-65a33a839f4e.png)

##### 2. MSYS2環境をアップデート
MSYS2を実行します。僕の環境は64bitなので64bit版を使います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/afcbc052-c970-a107-e27b-ddbc1cc9c733.png)

MSYS2が起動しました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/df778a66-a5c6-aa97-7119-787c97110d30.png)

アップデートしておきます

```
$ update-core
#終わったら一度MSYS2シェルを閉じて再度開きます
$ pacman -S bash
$ pacman -Syu
$ pacman -Sl
```

.bash_profileにMinGWのPATHを加えます

```
$ echo 'export PATH=/mingw64/bin:$PATH' > $HOME/.bash_profile
```

##### 3. VirtualBoxをインストール
以下からVirtualBoxのインストーラーをダウンロードします。
https://www.virtualbox.org/

でっかいボタンを押せばダウンロードを開始します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/e26a7185-afdc-8957-1983-5c4189144f8f.png)

普通にインストールすれば問題なく入ると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/114835e6-6820-0709-e2df-ca9c7c2ec2d8.png)

##### 4. Vagrantをインストール
以下からVagrantをダウンロードします。
https://www.vagrantup.com/

記事の時点で最新版は2.2.1でした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/71b5af0b-47a0-e0bf-e47d-ea1e02f4be18.png)

インストールすると再起動を要求されますので再起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/7e92e385-a7cc-8a17-884f-125cd854a397.png)

##### 5. 仮想マシンを起動
ここからはコマンドプロンプトで作業します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/f0f91f16-44c3-2070-3b95-a53f1a48449d.png)

まずvagrantのイメージファイルや設定を保存するフォルダを作成します。ここにvagrant環境のあれこれが全部保存されます。

```
> mkdir c:\Users\自分のアカウント名\Vagrant\ubuntu\
> cd c:\Users\自分のアカウント名\Vagrant\ubuntu\
```
続いて、vagrantで使う仮想マシンのBOXデータをどこからダウンロードしてくるか指定します。今回は<a href="https://app.vagrantup.com/bento/boxes/ubuntu-18.04">bentoにあるubuntu-18.04 box</a>を使いました。vagrant initで設定ファイルであるVagrantfileがカレントフォルダに作成しますが、ここにどこからダウンロードしてくるかも記載されているようです。

```
> vagrant init bento/ubuntu-18.04
```
Vagrantfile作ったぞいとか言ってるので上手くいったっぽいです。

```
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```
vagrant upで仮想マシンを立ち上げます。BOXファイルがダウンロード済みならローカルに保存されているものを使用しますが、今回は初回なので指定のものがダウンロードされます。

```
> vagrant up
```

これで仮想マシンが起動した筈です。ちゃんと起動したか確認しましょう。GUI版のvertual boxで確認すると分かりやすいのでwindowsのスタートメニューから起動してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/4670a498-8bd1-e432-950d-09d532575dd1.png)

こういう感じのwindowsが開きます。ubuntu1804が「実行中」となってれば起動成功です。こうなってないようならダウンロードに失敗したか、仮想環境の起動に失敗したかのどちらかだと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/a569dc15-9f85-ab39-1509-7aa10b6b149f.png)

僕の環境では以下の2つの問題が発生しました。

まず、ウィルス対策ソフトが原因でBOXのダウンロードが失敗しました。僕の環境ではKasperskyがブロックしてしまってダウンロードできませんでしたので除外リストに追加してダウンロードしました。エラーメッセージにもダウンロードが失敗したぞい的なのが出るし、ウィルス対策ソフトが何か言ってくると思いますので確認してください。

上記を修正してvagrant upしたところ、今度は仮想環境サポートが無効である事により起動に失敗しました。仮想環境サポートというのはCPUの機能のようで、オンオフの設定はマザーボードがやっているようです。仮想環境を使ったことがない人は大抵無効になってるようです。virtual box のGUIに下の画像のようなメッセージが出てるときは仮想環境サポートが無効な為に仮想環境の起動に失敗しています。仮想環境サポートはBIOSメニューで設定できますので、PCを再起動してBIOSへ行きましょう。
![fa408f4f.png](https://qiita-image-store.s3.amazonaws.com/0/277233/dfad318f-9d6f-6932-871b-8a827e2aac4e.png)

AMDのCPUだとSVM (support virtual machineかな？) が仮想環境サポート機能であるようです。Intelは別の機能名になってるようです。SVM Mode を Enabled にしたら設定を保存して起動します。
![DSC_1952.JPG](https://qiita-image-store.s3.amazonaws.com/0/277233/b6c15cd8-6ad5-cfb5-c3aa-ec09af6db651.jpeg)

仮想環境の起動に成功したらvagrant sshでSSH接続します。鍵の受け渡しはやっといてくれるみたいですね。

```
vagrant ssh
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-29-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Nov 27 14:30:12 UTC 2018

  System load:  0.0               Processes:           88
  Usage of /:   4.0% of 61.80GB   Users logged in:     0
  Memory usage: 6%                IP address for eth0: 10.0.2.15
  Swap usage:   0%


  * MicroK8s is Kubernetes in a snap. Made by devs for devs. One quick
    install on a workstation, VM, or appliance.

   - http://bit.ly/microk8s


3 packages can be updated.
0 updates are security updates.


Last login: Tue Nov 27 08:55:40 2018 from 10.0.2.2

vagrant@vagrant:~$
```
プロンプトがvagrant@vagrant:~$に変わりました。ubuntu仮想マシンにssh接続できたようです。

##### 6. 仮想マシンにRをインストール
ubuntuでRをインストールすると古いのが入っちゃうことがあるようなので、最新のが入るようにaptのソースリストに書き加えます。

```
$ echo "deb https://cran.rstudio.com/bin/linux/ubuntu trusty/" | \
  sudo tee -a /etc/apt/sources.list.d/cran.list
```
次にgpg鍵を登録します。

```
$ gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E084DAB9
$ gpg -a --export E084DAB9 | sudo apt-key add -
```
新しいマシンなのでアップデートしておきます。

```
$ sudo apt-get update
$ sudo apt-get upgrade
```
Rをインストールします。

```
$ sudo apt-get install r-base-dev
```
RStudioServerをインストールします。<a href="https://www.rstudio.com/products/rstudio/download-server/">公式サイトのインストール手順</a>をそのままやってますがversionごとにURLが違うようなので、公式の最新コードを実行するようにしてください。

```
$ sudo apt-get install gdebi-core
$ wget https://download2.rstudio.org/rstudio-server-1.1.463-amd64.deb
$ sudo gdebi rstudio-server-1.1.463-amd64.deb
```
これでインストールを完了しました。

##### 7. Vagrantfileを書き換え

インストールすると自動でRstudio serverが起動してくれます。標準でポート8787でrstudio serverがスタンバイしていますが、仮想マシンはホストマシンからルーターを介して繋がってるような状態になってるので、ポート転送を設定してやらないとポートにアクセスできません。一度ssh接続を解除してvagrantfileを書き換えます。

ssh接続の解除（仮想マシンは起動したままです）

```
$ exit
```
vagrantfileをメモ帳か何かで開いて書き換えてポート転送を設定します。以下だとホストの1111ポートが仮想マシンの8787ポート(rstudio-serverが待機してるポート)に転送されます。

```
  # config.vm.network "forwarded_port", guest: 80, host: 8080
    ↓ 上の行を探して下のように書き換えます
  config.vm.network "forwarded_port", guest: 8787, host: 1111
```

書き換えたらvagrantを再起動します。

```
vagrant reload
```

##### 8. ローカルネットワークからアクセスしてみる

ブラウザからアクセスしてみましょう。仮想マシンのIPはvagrantを実行中のwindowsマシンのIPと同じですので、コマンドプロンプトからipconfigしてローカルネットワーク上でのIPを調べましょう。下の画像の場合は192.168.1.151ですね。
![01v.jpg](https://qiita-image-store.s3.amazonaws.com/0/277233/f62dd710-c247-d1ad-b7d4-723be3078f54.jpeg)

rstudio-serverはdefaultで8787ポートに待機しています。ブラウザのURL入力欄に以下のURLを入力してアクセスしてみましょう。

```
http://192.168.1.151:1111
```
アクセスできました。ID、パスワードとも'vagrant'でログインできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/49fbe90f-54b8-517a-eb6a-be2609df57b5.png)

ログインすると見慣れた画面が出てきます。やったね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/cdb0225e-41fd-21a0-7dd8-9727a4b1f16a.png)

##### 9. 複数ユーザー用にIDとパスワードを追加
rstudio serverは同一IDのユーザーがログインしてくると先にログインしてたブラウザからの接続は切断されちゃうようです。自分ひとりで使うならそのままで大丈夫なんですが、今回は複数人が同時にログインする想定なので人数分のIDを登録しておきます。sudo adduser hogeで追加できます。ID「user1」を追加したい場合はsudo adduser user1です。いくつか入力を要求されますが必須なのはパスワードだけです。今回はユーザー情報は空欄のままにしました。

```
$ sudo adduser user1
Adding user `user1' ...
Adding new group `user1' (1002) ...
Adding new user `user1' (1002) with group `user1' ...
Creating home directory `/home/user1' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
Sorry, passwords do not match
passwd: Authentication token manipulation error
passwd: password unchanged
Try again? [y/N] y
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for user1
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y
```
誤って作成したIDは以下のコマンドで「user1」を削除できます。

```
sudo deluser user1
```

##### 10. インターネットからアクセスしてみる
ローカルネットワーク内からのアクセスは出来ましたが、今回は勉強会参加メンバーが自宅からアクセス出来るようにしたいのでインターネットからアクセス出来るようにしておきます。ローカルネットワークとの違いは2点、ローカルIPでなくグローバルIPにアクセスする事と、ルーターやファイヤーウォールで塞がってるポートを開放する必要があるかもって事ですね。

グローバルIPを教えてくれるサイトはあちこちにありますので適当なのを使って探します。今どきのご自宅ネットワーク環境だと動的にグローバルIPが変わっちゃう環境が多いと思いますが、今回は短期間だけ使えれば良いのでダイナミックDNSとかはやらずに、グローバルIPが変わる度に参加者に連絡することにしました。
https://www.cman.jp/network/support/go_access.cgi

rstudio serverが接続しているのとは別の回線で接続したマシンのブラウザに上記で調べたグローバルIPを入力してアクセスします。グローバルIPが222.222.222.222の場合は以下となります。

``
html://222.222.222.222:1111
```
ルーターとか使ってないようならすんなり繋がるかも。
![01v.jpg](https://qiita-image-store.s3.amazonaws.com/0/277233/f62dd710-c247-d1ad-b7d4-723be3078f54.jpeg)

ダメな場合は以下を確認）

僕の自宅マシンはwifiルーター経由でインターネット接続していますのでポート転送を設定しないと繋がりません。詳しくはお使いのルーター＋ポート開放でググッてください。

BUFFALOで1111ポートを転送する設定はこんな感じです。
<img width="739" alt="101.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/277233/a070430c-cb82-a1be-8a2d-9bccc57a8315.png">

また大抵のルーターがそうだと思うんですが外部からのアクセスを遮断する機能がありますので、その場合は一部機能を解除する必要があるかもしれません。同じくBUFFALOだとこんな感じの画面がファイアーウォールの設定ページ。僕の環境では全部有効にしたままで接続できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/c1363686-179b-45e4-f45c-ab0e4d6d46c5.png)

また、今どきのウィルス対策ソフトはファイアーウォールを標準装備してますので、これもポートを開けてやらないと繋がらなかったりします。これもソフト名＋ポート開放でググッてください。登録しなくても繋がる場合は別に弄らなくて良いと思います。

kasperskyだとこの辺にやり方が書いてあります。
https://support.kaspersky.com/12950#block1



というわけでrstudio serverがどこからでも使えるようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/cdb0225e-41fd-21a0-7dd8-9727a4b1f16a.png)
やったね！


## 追記: グラフで日本語を使えるようにする
Ubuntu18.04のXウィンドウ版は標準で日本語フォントが入っているようですが、コマンドラインにはインストールされないようで、RStudioServerのグラフに日本語を使おうとすると豆腐になっちゃいます。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3237373233332f34643032353032322d643964302d323638372d323664382d3131383036653364356162642e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/277233/0cb1386f-b616-524e-d465-1acec4e95fcc.png)

これだと何かと都合が悪いので日本語フォントをインストールしました。まず、仮想マシンにssh接続します。

```
cd c:\Users\ユーザー名\Vagrantのあるフォルダ\
vagrant up
vagrant ssh
```
仮想マシンにインストールされてるフォントの一覧を確認します。

```
$ fc-list
/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf: DejaVu Serif:style=Bold
/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf: DejaVu Sans Mono:style=Book
/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf: DejaVu Sans:style=Book
/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf: DejaVu Sans:style=Bold
/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf: DejaVu Sans Mono:style=Bold
/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf: DejaVu Serif:style=Book
```
やはり日本語フォントがないようですのでインストールします。ubuntu18.04のXウィンドウ版で標準になっているgoogle notoフォントを使おうと思います。ちなみにnotoはno more tofuの略で、マルチバイト文字が表示できなくて豆腐になっちゃうのを防ごうという動機で作られたフォントなんだそうです。ありがたやですね。

```
sudo apt-get install fonts-noto-cjk
```
インストールできたか確認しておきます。

```
vagrant@vagrant:~$ fc-list : family

Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Bold
Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Regular
Noto Sans Mono CJK SC,Noto Sans Mono CJK SC Regular
DejaVu Sans Mono
Noto Serif CJK JP
Noto Serif CJK KR
Noto Sans CJK SC,Noto Sans CJK SC Regular
Noto Serif CJK SC
Noto Serif CJK TC
Noto Sans CJK TC,Noto Sans CJK TC Regular
Noto Sans CJK KR,Noto Sans CJK KR Bold
Noto Sans CJK JP,Noto Sans CJK JP Bold
Noto Sans CJK SC,Noto Sans CJK SC Bold
DejaVu Sans
Noto Sans CJK TC,Noto Sans CJK TC Bold
Noto Sans Mono CJK SC,Noto Sans Mono CJK SC Bold
Noto Sans Mono CJK JP,Noto Sans Mono CJK JP Regular
Noto Sans CJK JP,Noto Sans CJK JP Regular
Noto Sans Mono CJK KR,Noto Sans Mono CJK KR Regular
DejaVu Serif
Noto Sans CJK KR,Noto Sans CJK KR Regular
Noto Sans Mono CJK KR,Noto Sans Mono CJK KR Bold
Noto Sans Mono CJK JP,Noto Sans Mono CJK JP Bold
```
無事インストールできたようなので、RStudioServerで確認してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/b8430583-d05b-f375-7c0a-a7b9385a17d2.png)
やったね