0からRaspberry Pi 4でさくっとマイクラサーバーを建てるまで

知人からマイクラサーバーを建ててくれと頼まれたから仕方なく0から環境構築した話をするよ。

私はケチな上にパソコンの寿命管理にうるさいので(すぐ壊れるから)、自分のメインマシンを24時間稼働させるのは絶対嫌だし、電気代もかけたくなかった。
こういうときはやっぱり消費電力が超少ないシングルボードコンピュータRaspberry Piに限る。

昔私は2系を使っていたけど、最新のラズパイは4だそうだ。CPUも1.5GHzのクアッドで、メモリも4GBついてるらしい。
最大消費電力は6Wらしいので、24時間ずっと稼働させても電気代は月100円くらい。

というわけでこれを買った↓
LABISTS Raspberry4 4B-32GB(技適マーク入)MicroSDHCカード32G/NOOBSシステムプリインストール/カードリーダ /5.1V/3A Type-C スイッチ付電源/MicroHDMI-to-HDMIケーブルライン/三つヒートシンク/簡単に取り付けケース/日本語取扱説明書/24ヶ月保証
@amazonJPさんから

とりあえず悩んだら絶対これを買った方がいい。ファン、ヒートシンク、OSプリインストール済Micro SD、HDMIケーブルがついてくる。

OSプリインストール済みSDがあるので、起動してちゃちゃっと環境構築するだけ。普通に起動するとGUIが立ち上がるけどコンピューターリソースの無駄なのでさっさとCLIで起動しなおしたほうがいい。

とりあえずエディタはあったほうがいいので

sudo apt-get install vim

はやっておこう。(個人差アリ)

ローカルIPを固定する

多分デフォルトではDHCPを使ってると思うから、/etc/dhcpcd.confを弄る。

例えば、私のネットワーク環境はネットワークアドレスが192.168.11.0で、ルーターのアドレスが192.168.11.1で、サブネットマスクが255.255.255.0で、ローカルIPのホストの数字は(なんでもいいけど)25を割り当てたかったので、以下のようにした。

interface wlan0
static ip_address=192.168.11.25/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1

wlan0は無線のこと。無線の場合、そもそもインターネットにつなぐ必要があるので

wpa_passphrase  [SSID] [pass]

しておくこと。ちなみにケーブル管理が絶望的に不得意じゃないのなら有線にしたほうがいいです。マジで。サーバーのレイテンシ全然違うよ(無線の人間が何言ってるんだって話だが)
DNS(domain name servers)アドレスってなんやねんって思った人は、まず間違いなくルーターのアドレスいれれば動くと思う。

(03/15 追記) サーバーの遅延について抗議されたので有線接続にした。IP固定の方法はinterfaceをeth0にするだけで他は同じ

rebootすればIPが目的のものになっているはず。

公開鍵を登録してSSH接続できるようにする

ラズビアン(ラズパイのデフォルトOS)はデフォルトでSSH接続ができるから、もうすでにSSH接続できるっちゃできるけど、セキュリティ的にも公開鍵を使ったほうが良い。

公開鍵の作り方はいくらでも資料があるのでぐぐってください。

自分のSSH接続したいメインPCで公開鍵を作ったら、scpコマンドでラズパイのホームディレクトリに転送する。
ユーザーネームはpiとすると

scp ./.ssh/id_rsa.pub pi@192.168.11.25:~/

次、ラズパイのコンソールに入って

mkdir .ssh
cat id_rsa.pub >> .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

chmodしているのは念のため。sshはセキュリティ上この辺のファイルのパーミッションがガバガバだと弾かれるので。

これで公開鍵接続の準備は整ったので、パスワード接続を禁止する。
/etc/ssh/sshd_configを開いて、

PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

と記載しておく。

メインPCに戻って、./ssh/configで、ラズパイのホストの名前をつけてあげる。
名前はなんでもいいけど私はpi4にした。タイプ数少ないの最高!

Host pi4
    HostName     192.168.11.25
    IdentityFile    ~/.ssh/id_rsa
    User            pi

もうこれですぐつながる。

ssh pi4

ポートを開ける

イクラサーバーのデフォルトのポートは25565。自分のルーターのマニュアル見ながら開放しよう。
ちなみに私はv6プラス接続なので、開放できるポートには制限がある。その場合もポート変換をかませば可能。
ここは各自ルーターのベンダーにお問い合わせくださいといった感じなので割愛する。

イクラサーバーのダウンロード、起動

ラズビアンには多分JDKが最初から入ってたはずなので、ダウンロードしてすぐ起動できるはず。

適当にディレクトリ作って、 Download server for Minecraft | Minecraft ここからダウンロードリンクを取得したら

mkdir minecraft
cd minecraft
sudo wget DOWNLOAD_LINK

すると、ディレクトリにサーバー関連ファイルと、利用規約の同意書(eula.txt)が展開されるので
エディタでeula.txtをtrueに書き換える。(公式ページの利用規約を読んでから)

これで準備は完了。
ラズパイ4はメモリ4GBなので2GBくらいアサインするとして

sudo java -Xms2G -Xms2G -jar server.jar nogui

で起動。これでサーバーが全世界に公開されました。

ログ公開サーバーを作る

私はニートの知人にサーバーを貸してるので、仕事中に昼間からマイクラを遊んでる様子をみて励みにしたいから、ログが見れるHTTPサーバーを建てた。

ログサーバーなんて適当でいい、nodejsでちゃちゃっと書こう。ちなみにnodejsはラズビアンに既に入ってた。すげーなおい!

適当にディレクトリ作って、適当に.js拡張子でファイルを作って

var http = require('http');
var fs = require("fs");

const port = XXXX; // 適当なポート
const server = http.createServer((req, res) => {
        if (req.method == "GET") {
                var data = fs.readFileSync(".path/to/minecraft/logs/latest.log");
                res.writeHead(200, {"Content-Type": "text/plain"});
                res.end(data);
        } else {
                res.writeHead(404, {"Content-Type": "text/plain"});
                res.end("Sushi is not found");
        }
}).listen(port);

はい終わり。これはひどい! GETされるとリクエストパス関係なく常にマイクラサーバーの最新ログを返すだけのサーバー。それ以外のメソッドは404!
いいんだよこういうので。最高に堅牢なサーバーは何もしないサーバーだからね。

ちなみに私は例によってv6プラスなのでHTTPポートが開けられないから、適当なポート番号でlistenしてるよ。

このサーバーはデーモン化させたかったのでforeverを使った。

sudo npm install -g forever 
forever start app.js  

これでどこにいてもサーバーが元気に稼働してる様子が見られる。

終わり。