宅内Minecraft統合版サーバーにNintendo Switchから接続するまで

二週間ほど前から妻がマインクラフトを始めた。2年ほどクリエイティブモードで遊んでいる息子に習いながら、穏やかな平地を見つけて家を建て、洞窟を冒険し、ブランチ鉱法で鉄の採掘を行い、拠点に村人を連れてきて、廃坑から持ち出してきたレールで交通機関を作るなどして遊んでいたのだけど、三人で遊んでいるとインベントリーも開かないほど重くなってしまった。うちのゲーム環境はゲーミングPCやPS5ではなくNintendo SwitchとiPad、iPhoneなので、サバイバルゲームのマルチプレイサーバーのホスティングは荷が重いのだ。

そこで、息子にあげたお下がりのiMacでサーバーを立ち上げることにした。マインクラフトのサーバーはてっきりサードパーティーのものだと思っていたんだけど、公式があるんだね。これはありがたい。

- [無料の MINECRAFT BEDROCK サーバーをダウンロード](https://www.minecraft.net/ja-jp/download/server/bedrock)

見ての通りWindows版とLinux版（というかUbuntu版）しかないので、Dockerで動かすことにする。仮想環境なのでパフォーマンスが最高というわけではないけど、iMac 2020のCPUは3.3GHz 6コアのIntel Core i5。画面を使うわけでもないし、Fution Driveなので仮想記憶に落ちてもそこそこ早い。そもそもメモリが16GBもあるのでスペックは問題ない。構築には以下のZennを参考にした。

- [Minecraft Bedrock Server を Docker で構築する（Official）](https://zenn.dev/mesgory/articles/0fb74c53ceebf6)
- [docker-minecraft-bedrock-server](https://github.com/itzg/docker-minecraft-bedrock-server)

Dockerはmastodonで使ったことがあるけど手持ちの環境にはインストールしていなかったので、iMacにDocker Desktopをダウンロードするところから。ちょうど息子がJava版のマインクラフトで遊んでいたので、sshで入ってbrewでインストールしようとしたんだけど、このインストールプロセスはデスクトップ操作をシェルから実行するもので、セキュリティ認証やアプリケーションの起動をシェルで終わらせるのが難しい（結局諦めてデスクトップで操作した）。

Docker Desktopはちょっと癖がある。コマンドがインストールされるのは```/usr/bin/local/```とかじゃなくて、```/Applications/Docker.app/Contents/Resources/bin/docker```（GUIアプリケーションのパッケージの内部）。ローカルではパスが通るけど、ssh用の```$PATH```を通さないとsshから起動できない。そしてコマンドはDocker Desktopを起動していないと使えない。

それでも、ブログの通りにcompose.yamlを作ってdocker compose up -dするとサーバーが立ち上がり、永続化用のフォルダーができて色々とファイルが作られた。compose.yamlはこんな感じ。server.propertiesのパラメーターがcomposer.yamlで書けるので無理なく立ち上げられる。

```yaml
services:
  # =================================================== #
  #  Bedrock Server                                     #
  # =================================================== #
  bedrock:
    container_name: home-bedrock
    image: itzg/minecraft-bedrock-server
    tty: true         # ターミナルの割り当て（`-t`オプション）
    stdin_open: true  # 標準入出力ストリーム（`-i`オプション）
    environment:
      SERVER_NAME: "new-world" # a default is "Dedicated Server"
      #GAMEMODE: "SURVIVAL"
      #FORCE_GAMEMODE: "FALSE"
      #DIFFICULTY: "EASY"
      #ALLOW_CHEATS: "FALSE"
      #MAX_PLAYERS: 10
      #ONLINE_MODE: "TRUE"
      #WHITE_LIST: "FALSE"
      #ALLOW_LIST: "FALSE"
      SERVER_PORT: "19134"
      SERVER_PORT_V6: "19135"
      #ENABLE_LAN_VISIBILITY: "TRUE"
      #VIEW_DISTANCE: 12
      #TICK_DISTANCE: 4
      #PLAYER_IDLE_TIMEOUT: 30
      #MAX_THREADS: 8
      LEVEL_NAME: "My世界" # a default is "Bedrock level"
      EULA: "TRUE"
      VERSION: "LATEST"
    ports:
      - 19134:19134/udp
    volumes:
      - ./bedrock:/data
      - /etc/timezone:/etc/timezone:ro
    restart: unless-stopped
```

portはデフォルトの19312ではなくて19314にずらしている（デフォルトのポートは、後述するBedrockConnectで使っている）。妻だけではなく私もワールドを持ちたいしね。必要なライブラリだけダウンロードするのでimage作成も一瞬。さすがDocker。ちょっと感動。

iPhoneのマインクラフトからIPを指定してサーバーに入ると、世界が構築される。リスポーン地点は氷雪バイオーム。粉雪だまりに落っこちてあっという間に死んだ（マインクラフトのハードさはWizardryに匹敵すると思う）。

次は引越しだ。ワールドデータはiOSならFiles.appからダウンロードできるので、途中まで遊んだワールドを引っ越しておく。Switchはファイルにアクセスできないけど、公式ゲームサーバーのRealmに加入してワールドをサーバーにアップロードして、iPhoneでログインしてダウンロードすると、iPhoneで作った世界のように引っ越せる(Realmはサブスクリプションだけど初月無料枠がある)。

これでiPadやiPhoneは宅内サーバーで遊べるんだけど、Switchから宅内サーバーにアクセスするにはもう一つハードルを越えなければならない。

同じ統合版でもWindows版とモバイル版は勝手サーバーを追加できるんだけど、コンシュマーゲーム機用のマインクラフトにはサーバー追加機能がない。マインクラフトの世界にも闇はあるので制限は無理もないけど、プラットフォーマーのペアレンタルコントロールで解除できるようになってくれないかなあ……とは思う。ないものねだりしても仕方がない。そこで使うのがサーバー選択だけを行う専用ワールドサーバー、BedrockConnectだ。

- [BedrockConnect](https://bedrockconnect.app/)
- [https://github.com/Pugmatt/BedrockConnect](https://github.com/Pugmatt/BedrockConnect)

BedrockConnectの開発元が運営しているBCMainというフレンドを登録すると、BedrockConnectのワールドがフレンドのタブに現れる。ここでワールドを読み込むとサーバー選択画面が現れて、自分で好きなサーバーを登録することができるのだ。マインクラフトの柔軟さとコミュニティの広がりを感じたいのなら、ぜひ試してみてほしい。

これでSwitchから接続することができた。よしよし、と思っていたのだけど、BedrockConnectのサーバーがちょっと不安定だった。アクセスが集中してるのか、それともサービスを継続できないのかわからないが、繋がらないことも増えてきたので、iMacでBedrockConnectもサーブすることにした。BedrockConnectもDockerのイメージがあるので起動しておく。compose.yamlはこんな感じ。

```yaml
version: '3'
services:
  bedrock:
    restart: always
    image: pugmatt/bedrock-connect
    container_name: bedrock-connect
    # environment:
    #   featured_servers: false
    custom_servers: "/brc/custom_servers.json"
    #   user_servers: true
    ports:
      - "19132:19132/udp"
    volumes:
      - './servers.json:/brc/custom_servers.json'
```

そして最後に、iMacに誘導する仕組みだ。BedrockConnectの開発元がやっているようなフレンドを使う方法は遅いし技術もいるので、DNSサーバーを起動して、マインクラフトの認可済みサードパーティーワールドをiMacに転送することにした。これもDockerだ。設定は以下の通り。

```yaml
compose.yaml

version: '3'
services:
  dnsmasq:
    restart: always
    image: 4km3/dnsmasq
    container_name: myDNS
    environment:
      TZ: "Asia/Tokyo"
    ports:
      - "53:53/udp"
      - "53:53/tcp"
    volumes:
      - './PV/etc/dnsmasq.d:/etc/dnsmasq.d'
    # dns:
    #   # 本ファイルの「dns」に対して、上位の DNSサーバを定義してしまえば、
    #   # PV/etc/dnsmasq.d/my.conf に上位 DNSサーバを定義する手間が省ける.
    #   # - 8.8.8.8
    cap_add:
      - NET_ADMIN
```
dnsmasq.dは以下の通り。
```
# プライベートIPの逆引きは上位DNSに転送しない
bogus-priv

# 名前と IP の管理を、/etc/hosts ではなく /etc/dnsmasq.d/add_hosts に変更する.
# (∵ コンテナ内の /etc/hosts は、ホスト側から容易にマウントできないため)
# addn-hosts=/etc/dnsmasq.d/add_hosts 

server=8.8.8.8
address=/geo.hivebedrock.network/192.168.0.X
address=/hivebedrock.network/192.168.0.X
address=/play.inpvp.net/192.168.0.X
address=/mco.lbsg.net/192.168.0.X
address=/play.galaxite.net/192.168.0.X
address=/play.enchanted.gg/192.168.0.X
port=53
```

あとはSwitchのDNSサーバーにiMacのIPアドレスを指定してあげればいい。上位DNSはGoogle。プロバイダのDNSを使わないと弊害も出るけど、今までのところ、Switchでは目立つ問題が出ていない。

Switchの認定ワールドにアクセスするとiMacで動いているBedrockConnectが起動してサーバー選択画面が立ち上がり、異なるポートを開いているマインクラフトサーバーにアクセスできる。

Dockerのコンテナなので、キャッシュやら何やらが溜まるらしく長時間起動しっぱなしだとパフォーマンスが落ちてしまうのだけど、そのあたりはこれから勉強が必要なところ。ゲームは快適。ネザーゲートも開いて地図も広げ、三人それぞれ好きな時間に好きな冒険ができるようになった。

マインクラフトは楽しい。家族や友人たちと遊ぶともっと楽しいよ。