Raspberry Pi で ベクトルタイルサーバー をつくる

## はじめに
朝4時に目が覚めたので、2時間半くらい（途中中断含む）で Qiitaを書きながら Raspberry Piでのベクトルタイルサーバー構築を試してみました。
Raspberry Piでベクトルタイルサーバーを作るという取組みは過去にも記事になっていたりします。私の記録にあまり付加価値はないかもしれませんが、2021年12月現在で利用出来る方法で、最初（Micro SDカードへのOSインストール）からベクトルタイルサーバー作成を試した結果をメモします。よく知っている方向けの記事というよりは、入門編というか、これからやってみたい方の参考になるといいなと思います。

（個人的には、Raspberry Pi Imagerで最初にSDカードにOSを書き込むときに、wifiも設定出来てしまうというのは今回の発見です。同じwifiにつながっているPCからsshで操作できるのでテレビやキーボードにつなぐ必要は全くないです。）

ベクトルタイルのカレンダーも空いていたのでポストしてみます。
たくさん続けてすみませんが、生産、ホスト、（最適化）、消費の違う分野で記事を書くように気をつけています。

## 環境
* 家のパソコン Windows 10 Home（Micro SDカードにOS書き込み 及び SSHでの接続に利用）
* Raspberry Pi 3B
* Micro SD カード（SDXC、 64GB、UHS-I C10、 U3、V30で $8 くらい）

## 手順
### Step 1: Raspberry Pi の OS インストール
Micro SDカードをパソコンに挿して、[Raspberry Pi OS](https://www.raspberrypi.com/software/) のページからダウンロードしたRaspberry Pi Imager (v1.6.2)を使ってOSを準備します。書き込みの設定等は以下です。

* OS: Raspberry Pi OS (32-BIT)
* 対象：　SDXC Card
    * 対象のドライブを間違えないようによく注意しましょう！
* Writeボタンを押す前に ctrl + shift + x　で、設定を調整できます。
    * ホストネーム（とパスワード）、SSHの許可、wifiの設定をやりました。この段階でwifiとsshが出来て便利でした。（前回はRaspberry Pi 起動後に画面につないで各種の調整をしていましたが、ずいぶん楽になるように思います。）

![2021-12-08-raspberrypi-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/1be99dd5-45c4-ef1b-722a-c33fa1d2f8ab.png)
（↑ ctrl + shift + x での設定。下にはwifiの設定も）

終わった後に、Windowsがディスクをフォーマットするか聞いてきましたが、何もしないでSDカードを外しました。

### Step 2: Raspberry Pi の 起動
#### 電源オン
準備したMicro SD カードをRaspberry Piにさし、電源をいれてスタートさせます。家には、実験用に Raspberry Piの Zero W、3B、400があるんですが、Zero W だとよく止まるような印象があるので、3Bでやってみます。（下の写真。ケースは子供が組み立ててくれました。）
![IMG_20211208_050338177.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/fd49ed7b-b2ae-ed1a-e92f-0df3d78079bb.jpeg)



#### SSH接続
前のステップ（OSをMicroSDカードに書きこむ）でSSHとWifiの設定をしているので、今回はそれを信じてLANケーブルなし、ディスプレイやキーボードへの接続もなしでやってみます。Windows PCのPowerShellから、sshでホスト名を指定してアクセスしてみました。

![2021-12-08-raspberrypi-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/90ba784b-53c1-d4ef-fdba-ae66571dcd97.png)
なんと、普通にできました。

#### OS更新
次に、Raspberry PiのOSを更新しておきます。

```bash:
　sudo apt update
　sudo apt upgrade
```
ちょっと待ちましたが、これでOSも更新されました。/etc/debian_versionを確認したら11.1になっていました。2021年の10月リリースなので最新ですね。

#### スワップファイルを増やすか（今回は見送り）
3Bではメモリが1GBあるので、今回はスワップファイルの設定（ /etc/dphys-swapfile ）は変えませんでした。今後、作業が遅いような感じがすればここを調整してみます。

### Step 3: ベクトルタイル関係ツールのインストール
Step 2 に続いて、今度はベクトルタイル関係ツールのインストールをします。UNVTでは、ラズベリーパイ用のUNVTツールのインストーラーがあります（こちら[unvt/equinox](https://github.com/unvt/equinox)）。ベクトルタイルの生産も含めて全部やりたい方はこれを使うと簡単です。その場合は、以下のようにやってみましょう。

```bash:
curl -sL https://unvt.github.io/equinox/install.sh | bash -
```

私の場合は、ベクトルタイルの生産はラズベリーパイではしないので、Tippecanoeをどけて、以下のツールをインストールしようと思います。

```bash:install.sh
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -    
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install -y autoconf automake cmake code git libsqlite3-dev libtool raspberrypi-kernel-headers nodejs parallel pdal python-gdal ruby sqlite3 tmux unar xrdp yarn zip 
sudo service xrdp restart
sudo yarn global add browserify pm2 rollup
git clone https://github.com/ubukawa/server-test-01
cd server-test-01; npm install; cd ..
```
ちょうど、最近作ったレポジトリ（[ubukawa/server-test-01](https://github.com/ubukawa/server-test-01)）にインストーラーをいれていたので、以下の通り実行してみます。（1行目で確認、2行目で実施）

```
curl -sL https://ubukawa.github.io/server-test-01/install.sh
curl -sL https://ubukawa.github.io/server-test-01/install.sh | bash -
```
これだけで nodejs が入るかなと思っていたのですが、apt-get install -y nodejs  と sudo apt-get install gcc g++ make をやりなさいとメッセージに出ていたので、実行しました。これで、node v16.13.1 と npm 8.1.2 が入りました。（pm2はこれだけだとまだインストールされていません。）
![2021-12-08-raspberrypi-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/b49df89f-99b6-6163-c03d-057bef43a836.png)

また、最近便利に使っているUNVTのスタイルツール unvt/charites も sudo npm install -g @unvt/charites のコマンドで入れておきました。私のインストーラーにも入れておけばよかったですね。（equinox には入っています。）

nodejsがインストールされましたので、これでベクトルタイルのサーバーも立てられるようになりました。ここではこの先の手順でnodejsを使います。軽くてシンプルなのでラズベリーパイにもいいかなと思ったからです。
（Nginxサーバーなど立てたい方も、試されたら経験をおしえてください！）

### Step 4: 地図のホスティングテスト
Step 3で、[ubukawa/server-test-01](https://github.com/ubukawa/server-test-01) のレポジトリからツールをインストールしているので、すでにserver-test-01というフォルダが出来ていると思います。この中には、サンプルデータとnodejsのホスティングサーバーを立てるスクリプトもあるのでこれを使って簡単なホスティングのテストをします。（ない場合はgit clone でこのレポジトリをコピーしてきてください。）
なお、このnodejsスクリプトの作り方は、こちらの記事「[nodejsでベクトルタイルサーバーを作る（mbtilesからpbfを配信する）](https://qiita.com/T-ubu/items/545d9f995ef7496a2ec4)」にまとめていますので、ご興味ありましたら見てみてください。
nodejsサーバーの作り方の詳細は前回の記事に譲りますが、以下では、ラズベリーパイでベクトルタイルサーバーが動くか見てみることにします。

```bash:
cd server-test-01
npm install
node app.js
```

npm install のあと、フリーズしたかと思いましたが、しばらく待ったら動きました。nodeでapp.jsをスタートしてみて、そして同じWifiにつながっているWindows PCから、 http://（ラズパイ・ホスト名）:8836にアクセスしてみます。
![2021-12-08-raspberrypi-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/8c28ff0f-42e3-6e8c-1ff1-27b4cb0504df.png)
サーバーは立ち上がっていました。

ベクトルタイルの地図が見られるか確かめるため、htdocs/mapsの下にある、style-mbtiles.json と style-pbf.json にあるベクトルタイルのパスを、今回のラズベリーパイのアドレスに修正します。viエディタでやったら操作性が少し違ったので、Windos PCからWinSCPを使って編集しました。
![2021-12-08-raspberrypi-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/9bf58774-b46e-e0d6-6ae5-0bd22f509423.png)

この結果、http://（あなたのラズパイ・ホスト名）:8836/maps/map-mbtiles.html をみてもベクトルタイルのウェブ地図が見られることが確認できました。つまり、ラズベリーパイがベクトルタイルサーバーとして動いています。
![2021-12-08-raspberrypi-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679143/f58b9a10-6937-41e9-37bb-b5fc596e120a.png)

これで本日の実験は完了です。
ctrl+c で nodejsによるホスティングをとめて、sudo shutdonw -h now でラズベリーパイを終了します。

## まとめ
簡単に作業を確認しましたが、Micro SDへの書き込みからスタートして、簡易なベクトルタイルホスティングサーバーをRaspberry Piで作れることを確認しました。

今後、USBメモリに大きめなmbtilesデータをいれて、そこからpbfタイルを配信するようなテストをしてみようと思っています。

このメモは、今後必要に応じて英訳して、同僚への技術移転に使うかもしれません。（そういうケースになれば・・・。）

## 参考
* SD Card for Raspbery Pi: https://www.raspberrypi.com/documentation/computers/getting-started.html#sd-cards
* Raspberry Pi OS： https://www.raspberrypi.com/software/
* Raspberry Pi Zero W をベクトルタイルサーバにするまで： https://qiita.com/hfu/items/e3c2c0a5d63189c4d0dc
* nodejsでベクトルタイルサーバーを作る（mbtilesからpbfを配信する）： https://qiita.com/T-ubu/items/545d9f995ef7496a2ec4