マイクラサーバーのエラーをchatgptで解決する話

## はじめに
こんにちは、花粉症で死んでいます。
ある日友達とプラグインなどを開発するためのサーバーを立てようとしていました。そして高校を卒業したためいらなくなった学校用ノートpcをサーバーにしようとせっせこやっていたのですが、たまたま父親が来て様子をのぞｋ、サーバーを立てようとしていることを相談したのですが、父から一言、「うちのルーターに外部からアクセスするのは禁止です。」我滅茶苦茶失望也。素人が適当にポート開けるのは保安上怖いので辞めてくれということでした。かわりに外部にサーバーを持てとの助言をいただきましたので今回はConohaでサーバーを立てようということになりました。

## よし早速開発に取り掛かるぞ、、、あれ??
今回はConohaの2gbプランを借りることになりました。初めてサーバーを借りるので分からないことだらけでしたが構築はConohaがお膳立てしたものがあるので簡単に起動までこぎつけました。初期のワールドの状態ではログインできたのですが、ワールドをいつも作っていたマップに置き換えると、あれ?入れない。![スクリーンショット (2076).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924666/69188e61-63bc-4096-9d46-044af3545579.png)

getsockoptとありますがよくわからないので調べてみる。あまり情報はありませんでしたが、どうやらサーバー側の問題のようです。サーバー側のログを見てみよう。
```error
[14:03:39] [ServerMain/ERROR]: Failed to start the minecraft server
java.nio.file.AccessDeniedException: ./world/session.lock
	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:90) ~[?:?]
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106) ~[?:?]
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[?:?]
	at sun.nio.fs.UnixFileSystemProvider.newFileChannel(UnixFileSystemProvider.java:181) ~[?:?]
	at java.nio.channels.FileChannel.open(FileChannel.java:298) ~[?:?]
	at java.nio.channels.FileChannel.open(FileChannel.java:357) ~[?:?]
	at net.minecraft.util.DirectoryLock.create(DirectoryLock.java:23) ~[?:?]
	at net.minecraft.world.level.storage.LevelStorageSource$LevelStorageAccess.<init>(LevelStorageSource.java:533) ~[?:?]
	at net.minecraft.world.level.storage.LevelStorageSource.validateAndCreateAccess(LevelStorageSource.java:439) ~[?:?]
	at net.minecraft.server.Main.main(Main.java:205) ~[paper-1.20.4.jar:git-Paper-381]
	at org.bukkit.craftbukkit.Main.main(Main.java:325) ~[paper-1.20.4.jar:git-Paper-381]
	at io.papermc.paperclip.Paperclip.lambda$main$0(Paperclip.java:42) ~[app:?]
	at java.lang.Thread.run(Thread.java:840) ~[?:?]
```

###                  ??????

初心者の私にはよくわからないのでChatgpt大先生に聞いてみることにしましょう。
![スクリーンショット (2078).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924666/87ea99bf-b49f-4d1b-829b-b3291a65d616.png)
どうやらファイルを新しく入れたので権限がうまく設定できていなかったようです。
コマンドを打つとそこは治ったのですが新しいエラーが出たので次に進みます。

## バージョンが違うみたい
```error
[14:18:11] [Tuinity Chunk System Worker #0/WARN]: java.lang.RuntimeException: Server attempted to load chunk saved with newer version of minecraft! 4082 > 3700
[14:18:11] [Tuinity Chunk System Worker #0/WARN]: 	at net.minecraft.world.level.chunk.storage.ChunkRegionLoader.loadChunk(ChunkRegionLoader.java:149)
[14:18:11] [Tuinity Chunk System Worker #0/WARN]: 	at io.papermc.paper.chunk.system.scheduling.ChunkLoadTask$ChunkDataLoadTask.runOffMain(ChunkLoadTask.java:338)
[14:18:11] [Tuinity Chunk System Worker #0/WARN]: 	at io.papermc.paper.chunk.system.scheduling.GenericDataLoadTask$ProcessOffMainTask.run(GenericDataLoadTask.java:307)
[14:18:11] [Tuinity Chunk System Worker #0/WARN]: 	at ca.spottedleaf.concurrentutil.executor.standard.PrioritisedThreadedTaskQueue$PrioritisedTask.executeInternal(PrioritisedThreadedTaskQueue.java:351)
[14:18:11] [Tuinity Chunk System Worker #0/WARN]: 	at ca.spottedleaf.concurrentutil.executor.standard.PrioritisedThreadedTaskQueue.executeTask(PrioritisedThreadedTaskQueue.java:118)
[14:18:11] [Tuinity Chunk System Worker #0/WARN]: 	at ca.spottedleaf.concurrentutil.executor.standard.PrioritisedThreadPool$PrioritisedThread.pollTasks(PrioritisedThreadPool.java:274)
[14:18:11] [Tuinity Chunk System Worker #0/WARN]: 	at ca.spottedleaf.concurrentutil.executor.standard.PrioritisedQueueExecutorThread.run(PrioritisedQueueExecutorThread.java:50)
[14:18:11] [Server thread/INFO]: Time elapsed: 514 ms
[14:18:11] [Server thread/INFO]: Preparing start region for dimension minecraft:the_nether
[14:18:11] [Server thread/INFO]: Time elapsed: 110 ms
[14:18:11] [Server thread/INFO]: Preparing start region for dimension minecraft:the_end
[14:18:11] [Server thread/INFO]: Time elapsed: 148 ms
[14:18:12] [Thread-1/INFO]: Stopping main thread (Ignore any thread death message you see! - DO NOT REPORT THREAD DEATH TO PAPER)
[14:18:12] [Thread-1/INFO]: Stopping server
[14:18:12] [Thread-1/INFO]: Saving players
[14:18:12] [Thread-1/WARN]: Asynchronous Save Players! Blocking thread until it returns 
java.lang.IllegalStateException: null
	at io.papermc.paper.util.MCUtil.ensureMain(MCUtil.java:364) ~[paper-1.20.4.jar:git-Paper-381]
	at net.minecraft.server.players.PlayerList.saveAll(PlayerList.java:1238) ~[paper-1.20.4.jar:git-Paper-381]
	at net.minecraft.server.players.PlayerList.saveAll(PlayerList.java:1234) ~[paper-1.20.4.jar:git-Paper-381]
	at net.minecraft.server.MinecraftServer.stopServer(MinecraftServer.java:984) ~[paper-1.20.4.jar:git-Paper-381]
	at net.minecraft.server.dedicated.DedicatedServer.stopServer(DedicatedServer.java:821) ~[paper-1.20.4.jar:git-Paper-381]
	at net.minecraft.server.MinecraftServer.close(MinecraftServer.java:931) ~[paper-1.20.4.jar:git-Paper-381]
	at org.bukkit.craftbukkit.v1_20_R3.util.ServerShutdownThread.run(ServerShutdownThread.java:27) ~[paper-1.20.4.jar:git-Paper-381]
```
今度はこんな感じのエラーが出たのでまたまたchatgpt大先生に丸投げします。![スクリーンショット (2079).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924666/0e8e4579-f072-48d2-9c8c-d61fca5eb819.png)
単純に、ワールドのバージョンとサーバーのバージョンがチガウヨっていう話でした。ならばサーバーをバージョンアップすれば解決。だがどうやるのだ、ということで調べてみるとConohaがバージョンアップ用のスクリプトを用意してくれていたみたいです。
https://support.conoha.jp/v/minecraftverup1-13/
```script
curl https://gist.githubusercontent.com/ConoHa/d16fedf984db8484cbeb867fcbce5534/raw/verup_to_latest.sh | bash
```
これをコピペするだけのようです。コピペ大好き成人なので早速取り掛かりました。しかし.....

### またもやエラー

```error
yum: command not found 
```
yumって誰やねんということでchatgpt先生にご登場いただきます。
![スクリーンショット (2081).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924666/7f8f5fff-dd2f-460f-ad09-0bef2f325281.png)
あれ?Ubuntuようのスクリプトじゃなかったのかな?大分昔の記事のようだったのでOS変えることもあるよねということでyumさんはaptに書き換えていきたいと思います。(あーぱつあぱつー.....)
```
apt-get update
apt-get install -y jq
apt-get install -y screen
apt-get install -y openjdk-17-jdk
```
こんな感じで書き換えればいいみたいです。欲しい人が奇跡的にいるかもしれないので一応変更後のスクリプトを置いておきます。
```
#!/bin/bash

set -eu

apt-get install -y jq


readonly MINECRAFT_DIR="/opt/minecraft_server"
readonly BACKUP_DIR_PREFIX="backup"
readonly MINECRAFT_SERVER_SERVICE="/etc/systemd/system/minecraft-server.service"

readonly MINECRAFT_SERVER_LATEST_VER=$( curl https://launchermeta.mojang.com/mc/game/version_manifest.json|jq -r '."latest"."release"' )
readonly MINECRAFT_SERVER_LATEST_MANIFEST_URL=$( curl https://launchermeta.mojang.com/mc/game/version_manifest.json | jq -r ".\"versions\"[] | select (.\"id\"==\"${MINECRAFT_SERVER_LATEST_VER}\") | .\"url\" " )
readonly MINECRAFT_SERVER_LATEST_JAR_URL=$( curl "${MINECRAFT_SERVER_LATEST_MANIFEST_URL}" | jq -r ".\"downloads\".\"server\".\"url\"" )
readonly MINECRAFT_SERVER_CURRENT_INSTALLED_VER=$( find /opt/minecraft_server -maxdepth 1 -name "*.jar" | cut -d '/' -f4 | sed -e "s/minecraft_server\.//" -e "s/\.jar//" )

readonly BACKUP_DIR="${MINECRAFT_SERVER_CURRENT_INSTALLED_VER}-$(date --iso-8601='minutes')"

function fullfill_requirements(){
    echo "Fullfill requirements"
    apt-get install -y screen

    groupadd minecraft || true
    useradd -g minecraft minecraft || true
}

function backup_installed_minecraft(){
    echo "Backup installed minecraft"
    mkdir -p "${MINECRAFT_DIR}/${BACKUP_DIR_PREFIX}/${BACKUP_DIR}"
    cp -r ${MINECRAFT_DIR}/[^backup]* "${MINECRAFT_DIR}/${BACKUP_DIR_PREFIX}/${BACKUP_DIR}"
    mv /etc/systemd/system/minecraft-server.service "${MINECRAFT_DIR}/${BACKUP_DIR_PREFIX}/${BACKUP_DIR}"
}

function install_latest_openjdk(){
    echo "Install latest openjdk"
    apt-get install -y openjdk-17-jdk
    local latest_java_profile_number
    readonly latest_java_profile_number=$(echo '' | alternatives --config java | grep 'latest'|awk '{print $1}')
    echo "${latest_java_profile_number}" | alternatives --config java
}

function install_latest_minecraft_server(){
    echo "Install latest minecraft server: ${MINECRAFT_SERVER_LATEST_VER}"
    rm "${MINECRAFT_DIR}/minecraft_server.${MINECRAFT_SERVER_CURRENT_INSTALLED_VER}.jar"
    wget "${MINECRAFT_SERVER_LATEST_JAR_URL}" -O "${MINECRAFT_DIR}/minecraft_server.${MINECRAFT_SERVER_LATEST_VER}.jar"
    chown -R minecraft:minecraft ${MINECRAFT_DIR}
}

function generate_systemd_service(){
    local jvm_xmx_param
    readonly jvm_xmx_param=${1}

    echo "Generate newer systemd.service for Minecraft server"

    cat >> ${MINECRAFT_SERVER_SERVICE} <<EOF
[Unit]
Description=Minecraft Server
After=network.target

[Service]
WorkingDirectory=${MINECRAFT_DIR}
User=minecraft
Group=minecraft
ProtectSystem=full
ProtectHome=true

ExecStart=/bin/sh -c '/usr/bin/screen -DmS minecraft /usr/bin/java -server -Xms512M -Xmx${jvm_xmx_param} -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -jar ${MINECRAFT_DIR}/minecraft_server.${MINECRAFT_SERVER_LATEST_VER}.jar --forceUpgrade nogui'

ExecReload=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "reload"\\015'

ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "save-all"\\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "stop"\\015'
ExecStop=/bin/sleep 5

Restart=on-failure
RestartSec=60s

[Install]
WantedBy=multi-user.target
EOF

    systemctl daemon-reload
}

function get_java_xmx_param(){
    for line in $(grep ExecStart ${MINECRAFT_SERVER_SERVICE});do
        if echo "${line}" | grep -q "\-Xmx"; then
            echo "${line}" | tr -d "\-Xmx"
        fi
    done
}

function main(){
    apt-get update
    systemctl disable --now  minecraft-server.service

    fullfill_requirements

    local jvm_xmx_param
    readonly jvm_xmx_param=$(get_java_xmx_param)

    backup_installed_minecraft

    local default_java_version
    readonly default_java_version=$(java -version |& grep version | awk '{print $3}' | tr -d '"')
    local query_java_180="1.8.0*"
    if [[ ${default_java_version} =~ ${query_java_180} ]];then
        install_latest_openjdk
    fi

    install_latest_minecraft_server

    generate_systemd_service "${jvm_xmx_param}"
    systemctl enable --now minecraft-server.service
}

main
```
これをサーバー内に置いておいて須藤さん(sudo)します。

![スクリーンショット (2075).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924666/ded17639-74c1-4a2b-843b-f9743e0d5b13.png)

### ま゛だ゛え゛ら゛ー゛な゛の゛


ファイルを指定して実行しているのですがファイルがないとか抜かしています。こういう時は大抵タイプミスなのですが今回はミスしてなさそう?ということでファイル検索を入れるとファイル自体は存在しています。どうしたことだ。ということでchatgpt先輩お願いいたします。
![スクリーンショット (2082).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924666/94e823e2-0fbd-4619-9a69-df2f2b8ce566.png)

CRLF vs LF　ってなんですか。そんな仕様統一しておいてくださいよ。
直すと、、、、、、
やりました。よくわからない文字列が動き出します。
これで行けただろう。

## まだでした
普通にさっきと同じエラーが出ます。ファイルを見ると最新の数字に置き換わっているんですがね。
強制アップグレードする方法もあるようなので試していきます。
```
java -jar /opt/minecraft_server/server.jar --forceUpgrade
```
これで行けるようです。

```
Error: LinkageError occurred while loading main class net.minecraft.bundler.Main
java.lang. UnsupportedClassVersionError: net/minecraft/bundler/Main has been compiled by a more recent version of the Jav a Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0
```
まぁ多分エラー出るなという気がしてました。なぜか。javaのバージョンが足りないよと言っています。

```
sudo apt install openjdk-21-jdk
```
あぱつーーーーー(脳死)
ということで強制アプデはうまくできたようですが果たして入れるのか?......


## 勝利

![スクリーンショット (2083).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924666/46eb4174-ac53-456f-a5cf-11210390f835.png)

勝ちました。ということでなんとか入れました。conohaで同じような感じになった方は是非参考にしてください(*'ω'*)