Raspberry Pi 3で自宅サーバーを立ててNode.jsなどを動かしてみた


Raspberry Piをモニター無しでセットアップする手順をまとめた、新しい記事を公開しました。
下記よりもうちょっと手順が減っています。よろしければご覧ください。

Node.jsが動作する公開サーバーが欲しくて。

ウェブ制作をしている人は、webpackだのgulpだのが動作するよう、自分の環境にNode.jsが動作する環境を用意している方も多いと思います。
自分のパソコンの中で動いている分には実感がないですが、サーバー上で動くJavaScript環境で、ネットワークアプリケーションをJavaScriptで記述して動作させることができます。
Node.js自体、話題になってからずいぶん久しいのでやってみたいなぁと思っていたものの、Node.jsが動作するサーバーを立てるような案件に縁はなく(あれば是非片棒をかつぎたいのでお願いしたく)、ローカルでやってるだけというのも面白みがなく、かといってなかなか個人で(安価に、自由な、公開された)環境を用意するのも難しいようです。

2016年12月版 Node.jsをホスティング出来るPaaSまとめ

そこでいろいろ考えた末、自宅にサーバーを立てることにしました。
自前で用意するサーバーであれば、設定には気をつけなければならないですが、一応どんなことでもできるし、作ったサービスをテスト的に公開することもできます。

サーバー用に新たにPCを買うとなると、場所も予算も必要で、電源も基本的に入れっぱなしにしなければなりません。それはなかなか負担になるため、かねてから目をつけていた「Raspberry Pi」を使ってみることに決めました。
手のひらサイズで省電力、もちろんファンレスで動作音すらありません。Wi-Fiも内蔵しているため、ややこしい設定もなく無線で使うこともできます。しかも安い!
ホームメイドのIoTなんかでよく聞きますが、ホームサーバー用途も結構多いようで、話題がいろいろ見つかります。
調べたところ、最新の「RASPBERRY PI 3 MODEL B」は、スペック的にまったく問題がないとのことで、早速、Amazonで本体(ケース付き)、アダプター、SDカードを一式購入しました。


我が家のサーバー

SDメモリーカードは、自分の環境を見る限り、最低16GB、32GBあれば超安心という感じです。

Raspberry Pi 3を設定する

初期化とOSのインストール(Macで)

参考:Mac OS X で Raspberry PiのOSイメージを焼く

こちらのサイトにあるように、OSはRASPBIANにしました。
コマンドラインは冷や汗モノですが、書き出し先さえ間違えなければ大丈夫です。
本来であれば、HDMIでディスプレイに接続してキーボードをUSBで繋いで…となると思うのですが、出力できるディスプレイがなかったため、次のサイトを参考に、Raspberry PiのSSHを有効にして、有線LAN接続のローカルIPアドレスでアクセスして設定しました。

初期化とOSのインストール(Windowsで)、およびRaspberry Piを画面に繋がないで設定する方法

参考:HOW TO SETUP A RASPBERRY PI WITHOUT A MONITOR OR KEYBOARD

SSH was disabled by default in Raspbian versions released after November 2016. One way to enable it is to access the raspi-config menu and turn it on. However, we’re setting it up headless so we don’t have access to the command prompt yet. Luckily there’s another way to turn on SSH…

All you need to do is create an empty file called “SSH” and place it in the root partition of the SD card. The file should have no extensions like “.txt” or “.doc”. The easiest way to do this is to open up a text editor like Notepad and save the blank page as “SSH.txt”. Close the text editor, then rename the file to delete the “.txt” extension. After that, move the file to the top level folder of the SD card (the root partition).

ターミナルを使ってSSHで接続するためには、SDカードのルートに、拡張子なしで「SSH」という空のファイルを作成してからRaspberry PiにSDカードを挿し、電源コードをつなぎます。

デフォルトのユーザー名はpi、パスワードはraspberryになっています。

Linux users - Raspberry Pi Documentation

その他の設定

本来なら使えるGUIが使えないのももったいないので、VNCの設定もしました。

参考:VNC Connect and Raspberry Pi
First, run the following commands to make sure you have the latest version of VNC Server and VNC Viewer:

sudo apt-get update
sudo apt-get install realvnc-vnc-server
sudo apt-get install realvnc-vnc-viewer

If you’re already using an older version of VNC Server, restart it. If not, and you’re already booted into the PIXEL desktop, select Menu > Preferences > Raspberry Pi Configuration > Interfaces and make sure VNC is set to Enabled.

Alternatively, run the command sudo raspi-config, navigate to Advanced Options > VNC and select Yes.

Raspberry Piにログインした状態で、上記3つのコマンド(sudo 〜〜〜)を実行して、VNCをインストール。
現時点ではGUIが使えないので、コマンドラインから sudo raspi-config でCUIの設定画面を出して、VNCをオンにします。上記だとAdvanced Optionsってあるんですが、実際はInterfacing Optionsという中にあります。
あとは、自分のPC/MacにVNC Viewerを入れれば、GUIが使えます。

あと最後に、機動性収納性を考えて、LANケーブルをなくすために、Wi-Fiを使えるようにします。
VNCを設定してしまえばGUIからもできますが、CUIの場合、以下のサイトを参考にしました。

HOW TO SET UP WIFI ON THE RASPBERRY PI 3

Node.jsのインストール

Ubuntuに最新のNode.jsを難なくインストールする

こちらで行けるはず。ここはあまり苦労しなかった覚えが。

サーバーを公開する

デフォルトユーザーの削除

デフォルトで「pi」というユーザーがルート権限を持って登録されています。
そのままだと少し心配なので、piユーザーを削除して、新しくユーザーを追加します。

Change default users on Raspberry Pi
Raspberry Piのセキュリティー設定 for Webサーバー用 パート2

新規ユーザーの追加、新規ユーザーがsudoできるようにグループへの追加、piユーザーの削除のほか、SSH接続のための鍵認証の設定もしています。

ファイアーウォール設定

ファイヤーウォール(UFW)で必要なポート以外は閉じて、適宜開けていくようにします。

Raspberry Piのセキュリティー設定 for Webサーバー用 パート2

また、この参考ページの後半で、Windowsの方向けのSSH接続の鍵認証設定の仕方が紹介されています。

ルーターの設定

自宅のIPアドレスにUFWで設定したポートへのアクセスがあった場合に、それをRaspberry Piサーバーに振り分けるため、ルーターにポートフォワーディングの設定を行います。
これはルーターごとに設定が違うため、それぞれのマニュアルを参考にしてください。

現状の使い方

Raspberry Pi 3は、以上の他にNginxとMySQLを設定してウェブサーバーとしても動作させています。
動作確認などで使うテストサーバーとして、a-blog cmsをインストールしていますが、まったく問題なく動いています。

肝心のNode.jsは、PHPMyAdminのかわりの「nodeadmin」、それから、ニンテンドースイッチの在庫を監視するTwitter Botの運用をしています。ソースはこちら。

https://github.com/kadoyan/monitor_sites_difference

そのほか細々とテスト的なものを作っています。

夏に向けて熱が心配ですが、動作にもたつきもないし、なによりローカルなので接続が早いし、なにしちゃダメもないし、1万円そこそこでこれができるのであれば、使わない手はないと思います。
サーバーサイドの勉強にもなるので、Raspberry Pi、おすすめです。