開発用のRaspberryPiサーバーを構築する方法

公開: 2022-03-11

Raspberry Piは、5米ドルという低価格で入手できる小さなコンピューターであり、さまざまな種類のソフトウェアを実行したり、さまざまなプロジェクトを構築したりできます。

この記事では、ホーム開発サーバーとしてセットアップし、ネットワークの外部からアクセスできるフルスタックJavaScriptアプリケーションをデプロイするプロセスについて説明します。 これは、独自のリモートデジタルワークスペースを設定したり、開発に使用するハードウェアを制御したりするのに最適です。

このRaspberryPiホームサーバーには何が必要ですか?

これは特にRaspberryPi3チュートリアルになりましたが、第1世代に戻るモデルでも機能するはずです。古いモデルまたはRaspberry Pi Zeroをお持ちの場合は、以下のコメントで経験をお知らせください。

Raspberry Piボード自体に加えて、次のものが必要になります。

  • マイクロUSB充電器
  • イーサネットケーブル
  • microSDカード(最小8GB、最大32GBのカードで問題なく動作するようです)

これらは、初期設定時にも役立ちます。

  • USBキーボード
  • HDMIケーブルとモニター

Raspberry Pi OS:Raspbian

RaspberryPiへのオペレーティングシステムのインストールは簡単です。 まず、コンピューターを使用して、ブートイメージをmicroSDカードにインストールします。 次に、カードをRaspberry Piに挿入し、そこから起動します。

Raspbianは、Debian 7.0( Wheezy )から移植されたLinuxディストリビューションであり、デバイスのアーキテクチャ用に最適化されたRaspberryPiの公式OSです。 Piでお気に入りのOSを実行するための他のオプションがありますが、その単純さのためにRaspbianを使用します。

このチュートリアルは、このバージョン(またはそれ以降)のRaspbianで動作するように更新されています。

 Kernel version : #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) Kernel release : 4.9.0-8-amd64

Raspbianをインストールするには、公式ダウンロードページにアクセスし、最新のRaspbianバージョンを含むzipファイルをダウンロードします。

次に、microSDカードをコンピューターのSDカードスロットまたはアダプターに挿入します。 コンピュータのオペレーティングシステムに応じて、Linux、Mac OS、またはWindows用のRaspberryのWebサイトに記載されている手順に従ってください。

プロセスが終了したら、SDカードをコンピューターから取り出し、RaspberryPiに挿入します。 イーサネットケーブルを使用してRaspberryPiをルーターに接続し、MicroUSB充電器を接続します。これによりRaspberryPiの起動が開始されます。

初期構成には、次の2つのオプションがあります。

  • USBキーボードとHDMIモニターをお持ちの場合は、初期設定のためにそれらをRaspberryPiに接続できます。
    • Piは、これらのデバイスが接続されるとすぐにそれらを認識する必要があります。
    • Piが初めて起動すると、自動的にraspi-configが実行されます。 最初の起動後、デバイスを構成するために、自分でsudo raspi-configを実行する必要があります。
  • それらがない場合は、SSHを使用してRaspberryPiに接続できます。
    • まず、ローカルネットワークでRaspberryPiのIPアドレスを見つける必要があります。 これは、ルーターの管理ページに接続するか、 nmapなどのネットワークツールを使用して実行できます。
    • デバイスのIPアドレスを取得したら、ターミナルからSSHを使用して(またはWindowsを使用している場合はPuttyを介して)デバイスに接続します。 デフォルトのユーザーはpiで、デフォルトのパスワードはraspberryです。 したがって、たとえば、IPアドレスが192.168.1.16の場合、 ssh [email protected]を実行し、プロンプトが表示されたらパスワードを入力します。
    • 接続したら、 sudo raspi-configを実行します。

raspi-configは、最終的なセットアップをガイドします。 すべてのオプションを構成できますが、最も重要なのは最初の2つです。ファイルシステムを拡張し、OSですべてのSDカードストレージを使用できるようにすることと、サーバーが次のようになるようにデフォルトのPiユーザーのパスワードを変更することです。侵入者から保護されています。

Raspi-config

Raspberry PiにWebサーバー(Nginx)をインストールします

次に、Webサーバーをインストールします。 Nginxはメモリフットプリントが小さく、Node.js(後で設定します)とうまく連携するため、私はNginxを好みます。 Apacheやlighttpdなどの他のWebサーバーも同様に機能しますが、このデモではNginxを使用します。

インストールを開始する前に、Piで次のコマンドを実行して、すべてが最新であることを確認する必要があります。

 sudo apt-get update sudo apt-get upgrade

次に、 apt-getを使用してNginxをインストールできます。

 sudo apt-get install nginx

インストールが完了したら、次のコマンドを実行してサーバーを起動します。

 sudo service nginx start

前の手順でRaspberryPiのローカルIPを把握する必要がなかった場合は、 ifconfigを実行して把握する必要があります。 イーサネットアダプタの出力はeth0の下にあり、そのローカルIPアドレスはinet addrとラベル付けされています。

IPアドレスがわかれば、コンピュータのブラウザでIPアドレスを指定すると、デフォルトの「WelcometoNginx」メッセージが表示されます。

Webに公開:ポートフォワーディング

ローカルネットワークの外部からRaspberryPiにアクセスする予定がない場合は、この手順をスキップできます。 ただし、他の場所からサーバーにアクセスしたい場合は、それが可能であることを確認しましょう。

一般的なホームネットワークでは、ルーターに接続されているデバイスは外の世界からは見えません。 ネットワークの外部IPアドレスを使用して、外部からルーターにのみアクセスできます。 ルーターは、ネットワークへの着信トラフィックと、送信先のデバイスを決定する責任があります。

ローカルネットワーク上のデバイスが接続を開始すると(たとえば、ブラウザでWebサイトを開いたとき)、ルーターは着信応答トラフィックをこの接続の一部として認識し、通過を許可します。 ただし、ルーターが開いている接続の一部ではない着信トラフィックを受信した場合(たとえば、外部デバイスが内部デバイスとの接続を開始しようとした場合)、ルーターは着信トラフィックがネットワークに侵入するのをブロックします。 これは、ネットワークを保護するための重要なセキュリティ機能です。

では、どのようにして外部からPiに接続できますか? 答えはポートフォワーディングです。 特定のポートの着信接続が通過し、正しいデバイスに送信されるようにルーターを構成する必要があります。 デフォルトでは、HTTPプロトコルはポート80を使用し、SSHはポート22を使用するため、これらはWebアプリケーションにアクセスし、サーバーを管理するための安全な接続を可能にするためにルーターで開く必要がある2つのポートです。

ポートフォワーディング。

ポートを開いて転送するようにルーターを構成する手順は、インターネットプロバイダーとルーターのブランドによって異なる場合がありますが、いずれの場合も、ルーターの管理ページの高度な構成オプションを使用して実行できるはずです。 「転送」、「ポート転送」、「ネットワークアドレス変換」などの名前のオプションを探すだけです。

HTTP接続用にポートを開き、SSH用に別のポートを開く必要があります。 基本的な考え方は、これら2つの外部ポート宛てのデータをRaspberry Piに転送し、WebトラフィックはNginxがリッスンしているポート80に送信し、SSHトラフィックはポート22に送信してSSHサーバーが外部コンピューターからの接続を受け入れることです。 これがルーターの構成ページでどのように表示されるかの例を次に示します。

ポートフォワーディング設定テーブル。

RaspberryPiの内部IPアドレスが192.168.1.16の場合のポート転送構成。 ポート80または22に向かうすべての着信トラフィックは、この内部アドレスに転送されます。

Googleに「what'smyipaddress」と入力するだけで、ルーターの外部IPアドレスを確認できます。 その後、ルーターのネットワークの外部に移動する場合は、 ssh pi@{external IP address}でSSH接続を開くことにより、ポート転送が機能していることをテストできます。 同様に、HTTPポート転送は、ブラウザのアドレスバーに外部IPアドレスを入力することでテストできます。 ポートフォワーディングでは、ルーターの外部IPを知っていれば、外部から誰でもこれらのポートのデバイスにアクセスできることに注意してください。

静的IPがない場合は、動的DNSを設定できます。 とてもシンプルで簡単なステップです。 ルーターからダイナミックDNSを設定することも、RaspberryPiを構成することもできます。 ここではDDNSの構成方法については説明しませんが、必要に応じてBitPi.coにこのテーマに関する優れたチュートリアルがあります。

フレームワークのインストール:フルスタックJavaScript

ほとんどのWebフレームワークはNginx上で実行できますが、JavaScriptを使用してフルスタックにする方法を見てみましょう。 これを行うには、Node.jsとMongoDBをインストールする必要があります。

現在、Node.jsは次の方法でRaspberryPiに簡単にインストールできます。

 sudo apt-get install nodejs

インストールが完了したら、 node -vを実行して、動作しているかどうかを確認できます。

これで、次のように入力するだけでMongoDBをインストールできます。

 sudo apt-get install mongodb

Raspberry Piをオフにする必要がある場合は、データベースの破損を防ぐために、最初にサービスをシャットダウンする必要があることに注意してください。

 sudo service mongodb stop

アプリをデプロイする

ローカルマシンで開発してから、変更をBitBucketのGitリポジトリにプッシュできます。 RaspbianにはGitがプリインストールされているため、最新のアプリケーションコードをデバイスにプルして実行できます。

プロジェクトの足場

まず、いくつかのアプリケーションコードを設定し、それをGitリポジトリにプッシュしましょう。 アプリケーションを起動する方法はたくさんありますが、私のお気に入りの1つは、サーバーとクライアントの両方のコードの足場となるgenerator-angular-fullstackです。

コンピューターにgenerator-angular-fullstackをインストールします。

 npm install -g generator-angular-fullstack

アプリケーションの新しいディレクトリを作成します。

 mkdir my-app cd my-app

そして、アプリケーションの足場:

 yo angular-fullstack my-app

リポジトリを作成してコードをプッシュする

ここで説明するように、BitBucketにリポジトリを作成します。 次に、ローカルディレクトリを設定します。

 git init git remote add origin [email protected]:USER/REPO.git

したがって、コードをコミットしてプッシュできます。

 git add . git commit -m 'Initial commit' git push -u origin master

ジェネレーターにはgrunt-build-controlプラグインが付属しており、リポジトリ内の特定のブランチにビルドコードをコミットできます。 BitBucketの構成をアプリケーションのルートディレクトリのGruntfile.jsに追加するだけです。

 buildcontrol: { options: { dir: 'dist', commit: true, push: true, connectCommits: false, message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%' }, bitbucket: { options: { remote: '[email protected]:USER/REPO.git', branch: 'build' } } }, // ...

今実行します:

 grunt build

…配布フォルダを作成し、その後に次のようにします。

 grunt buildcontrol:bitbucket

…コードをコミットして、リポジトリのビルドブランチにプッシュします。

SSHキーを生成する

これで、コードがホストされました。 Raspberry Piにデプロイする前に、Raspberry PiのSSHキーを生成し、BitBucketアカウントに追加する必要があります。 この手順はすぐに実行されますが、問題が発生した場合は、BitBucketガイドに従ってください。 したがって、Raspberry Piターミナルに再度ログインして、公開鍵と秘密鍵のペアを生成します。

 ssh-keygen

次に、エージェントを開始します。

 ssh-agent /bin/bash

そして、エージェントにキーを追加します。

 ssh-add /home/pi/.ssh/id_rsa

ここで、公開鍵の内容を出力する必要があります。

 cat /home/pi/.ssh/id_rsa.pub

…コピーしてBitBucketに貼り付けることができます。

BitBucketで、プロフィール写真をクリックして、 [アカウントの管理]に移動します。 [セキュリティ]でSSHキーを見つけ、[キーを追加]ボタンをクリックします。

リポジトリのクローンを作成する

アプリのコードを配置する場所についての規則はありませんが、 /var/wwwディレクトリを作成して、そこにすべてのプロジェクトを配置することができます。

 cd /var sudo mkdir www

Webルートにファイルを配置するときにsudoを使用しないようにするには、所有者をPiユーザーに変更し、グループをNginxで使用されるwww-dataに変更します。

 sudo chown -R pi:www-data www cd www

これで、リポジトリのビルドブランチのクローンを作成し、依存関係をインストールできます。

 git clone [email protected]:USER/REPO.git --branch build --single-branch cd REPO npm install --production

完了したら、アプリを起動して、環境を本番環境に設定できます。

 export NODE_ENV=production; node server/app.js &

次に、コンピューターのブラウザーでデバイスのIPアドレスを指定して、機能するかどうかを確認します。

自分で呼び出すことができる開発サーバーがあればいいのにと思いませんか? #RaspberryPiでできます。
つぶやき

Nginxリバースプロキシを構成する

アプリケーションを外部からアクセスできるようにするためのもう1つのステップが残っています。 NginxはPiのHTTPリクエストを受信するポート80でリッスンしていますが、ノードアプリケーション自体は別のポート(たとえば、ポート8080)でリッスンしています。 したがって、リバースプロキシとして機能するようにNginxを構成し、アプリケーション向けのリクエストを認識して、それらをノードに渡す必要があります。

Nginxは、提供する各アプリケーションの構成ファイルをsites-availableフォルダーに保持します。

 cd /etc/nginx/sites-available/

ここで、 defaultの構成ファイルをコピーして、都合の良いときに編集できます。

 sudo cp default my-app sudo nano my-app

最終的な構成ファイルは次のようになり、NginxがNode.jsサーバーのプロキシとして機能します。

 server { listen 80; root /var/www/my-app/; # identifies the location of the application you are configuring server_name my-app.dev; # identifies the hostname used by this application's traffic location / { proxy_pass http://localhost:8080/; # configures the back-end destination for this traffic } }

この構成を有効にするには、 sites-enabledフォルダーにシンボリックリンクを作成する必要があります。ここで、Nginxは実行時にアクティブな構成を検索します。

 sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/my-app

そして、サービスをリロードして、これらの変更をアクティブにします。

 sudo service nginx reload

この時点で、アプリケーションはmy-app.devドメイン宛てのHTTPトラフィックを受信する準備ができています(上記で構成したserver_name my-app.devディレクティブに感謝します)。 解決する必要のある最後の問題は、外部から送信するトラフィックをこのドメイン名と一致させる方法です。 ドメイン名を購入してIPを指すこともできますが、 hostsファイルが役に立ち、それが不要になります。

サイトにアクセスするワークステーションで、ルーターの外部IPアドレスを追加し、ホスト名my-app.devと照合します。 my-app.dev用に生成したHTTPトラフィックはすべて、 Host HTTPヘッダーに正しいホスト名を付けて、ルーターに直接送信されます。

Windowsでは、管理者権限を使用して、 c:\windows\system32\drivers\etc\hostsにあるファイルをメモ帳で編集できます。 LinuxとMacでは、ターミナルをそれぞれsudo nano /etc/hostssudo nano /private/etc/hostsで使用できます。

 ## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost 212.124.126.242 my-app.dev # add your host name to the list

次は何ですか?

すべてがセットアップされたので、必要な数のアプリケーションをRaspberry Piにデプロイし、永久にインストールするか、pm2をインストールしてNode.jsサーバーを存続させることができます。

また、問題が発生した場合は、SDカードをワイプして、最初からやり直すことができることを忘れないでください。

動作中のRaspberryPi開発サーバー。

関連:このラズベリーパイサーモスタットチュートリアルで気候を制御する