Spigot 架設多人遊玩的 Minecraft 伺服器-於 Ubuntu 環境中示範

Spigot(也稱為SpigotMC;中文稱為水龍頭)是一個很受歡迎的Minecraft伺服器架設軟體,經由Bukkit伺服器mod的另一個分支,但因為Spigot性能和穩定方面來得比Bukkit好,且還保留了與Bukkit插件的相容性,所以就成為架設Minecraft伺服器首選之一。雖然Minecraft遊戲的官方Mojang也有推出他們家的Minecraft伺服器,但很可惜的就是他們所推出的伺服器版本,是無法安裝插件的,你只能遊玩Mojang所推出的Minecraft遊戲的原生功能,這可能就造成遊戲缺乏了一些趣味,而Spigot是可以裝上插件(Plugin)的,所以你需要為Minecraft遊戲世界添加額外的功能時,那就可以經由插件來進行添加你要的功能,這樣就能提高遊戲的可玩性。筆者在前面就有說到Spigot和Bukkit兩者所使用的插件是相容的,所以在他們兩個網站上看到的插件資源,幾乎都可以使用,而且現在有好多開發者貢獻了很多不同功能的插件,來滿足Minecraft世界的遊戲性,甚至Minecraft遊戲的管理者也可以經由插件所提供的管理功能來管理Minecraft遊戲的世界。

本文教學主要指引使用者如何在Debian/Ubuntu環境中使用SpigotMC架設多人遊玩的Minecraft遊戲伺服器。本文教學操作過程的指令,僅適用於Debian/Ubuntu環境(筆者此篇教學是在Ubuntu 18.04 LTS版本上操作),如果你是使用其他的Linux發行版,當然也是可以參考本教學,但在某些指令方面你需要自行更改以調整至適用你自己系統的環境。

**如果你想要在本機實作的話,那可以考慮安裝虛擬機器軟體來進行實作,虛擬機器方面可以選擇VirtualBox,然後安裝好Ubuntu作業系統,及設定好VirtualBox的Port轉發功能(Minecraft預設Port為25565),就可以按照本篇教學的步驟,來將Minecraft伺服器架設好。

**如果你要架設Minecraft伺服器與多位朋友一起遊玩的話,那筆者個人是比較推薦租用VPS主機,比較不建議使用自己的電腦來當伺服器。因為VPS主機幾乎都有提供固定的IP位址,穩定的網路,如果遇到資源不足的問題,要升級主機時也比較好升級,還有VPS主機都是全天運作的,所以你的電腦也就不用一直開著了,只是在有需要管理伺服器時,才需要使用你的電腦來使用SSH協定遠端管理你的Minecraft伺服器,還有就是現在的VPS主機費用都很便宜,比如以LinodeVultr來說,最低費用只需每月5美元就可以租用到1GB記憶體、1vCPU、25GB SSD硬碟的儲存空間和一組IPv4位址的規格,而且這兩家都有在日本佈局機房,也就說離台灣這邊很近,這樣台灣這邊的玩家在玩Minecraft遊戲時比較不容易出現延遲的問題。

**Spigot的伺服器硬體規格方面,假如你跟筆者一樣是使用,如:Linode、Vultr等等之類的VPS主機來架設的話,那建議你可以選擇10美元方案或以上的主機規格會比較穩,以Linode和Vultr來說,每月10美元規格的記憶體都是2GB,這大概可以承受約10多位玩家可以一起同時遊玩Minecraft遊戲及伺服器上也可以執行多個插件。

1)安裝Spigot會用到的相關套件。

Step 1:將Debian/Ubuntu系統的套件資訊與版本更新到最新。

sudo apt-get update && sudo apt-get upgrade -y

 

Step 2:安裝等下會用到的相關套件。

sudo apt-get install git screen -y

 

Step 3:因為Spigot需要在Java環境中執行,所以接著要在系統中安裝好JDK。以下指令,筆者是安裝了開源版本的OpenJDK。

**如果你要安裝Oracle的JDK版本,那也是可以的哦。

sudo apt-get install git openjdk-11-jre-headless -y

**如果你系統是Debian 9(Stretch),目前Debian 9官方軟體包中僅有提供OpenJDK 8。

sudo apt-get install git openjdk-8-jre-headless -y

 

Step 4:輸入『java -version』,來測試Java環境是否安裝好。

java -version

如出現下面類似的訊息,則代表你的系統已正確安裝好Java環境。

  1. openjdk version "10.0.2" 2018-07-17
  2. OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
  3. OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)

 

2)新增一個名稱為minecraft的使用者及授予sudo權限。

**本篇教學從這部分開始,架設Minecraft伺服器過程,以及包含伺服器的管理,一律都使用minecraft使用者的權限,為了方便你在參考本篇教學過程不會出錯,建議你取跟筆者一樣的minecraft使用者名稱。

Step 1:在你的系統上新增一個『minecraft』為名稱的新使用者。

sudo adduser minecraft

 

Step 2:然後接著按照系統的要求來輸入兩次minecraft新使用者的密碼,及其他的帳號相關資訊。

**主機如果是有公開在網路上的,請記得將minecraft使用者的密碼設定複雜一些。

 

Step 3:授予minecraft使用者sudo權限。

sudo usermod -aG sudo minecraft

 

Step 4:新使用者建立完成之後,你就可以將目前的身份來切換至剛剛所建立好的minecraft使用者了。

sudo su - minecraft

 

Step 5:檢查minecraft使用者是否有root權限。如果輸出為『root』則代表minecraft使用者已具備sudo權限。

sudo whoami

 

3)下載與編譯Spigot,以及更改Minecraft在首次執行時需要同意EULA授權合約的設定。

Step 1:新增一個編譯用的目錄,及cd至剛剛新增好的目錄位置。

mkdir ~/build && cd ~/build

 

Step 2:下載BuildTools.jar至你的主機。

  1. wget -c https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar

 

Step 3:開始進行編譯。

如果沒要指定Minecraft版本,那可以直接輸入以下的指令,BuildTools預設會編譯最新穩定版本的Minecraft。

java -jar BuildTools.jar

如果要指定Minecraft版本,那可以輸入:

java -jar BuildTools.jar --rev <版本號>

比如本文教學在撰寫時,Minecraft最新版本為『1.13.2』:

java -jar BuildTools.jar --rev 1.13.2

 

Step 4:Spigot成功編譯完成之後,是會輸出類似如以下的訊息:

  1. Success! Everything compiled successfully. Copying final .jar files now.
  2. Copying craftbukkit-1.13.2-R0.1-SNAPSHOT.jar to /home/minecraft/build/./craftbukkit-1.13.2.jar
  3.  - Saved as ./craftbukkit-1.13.2.jar
  4. Copying spigot-1.13.2-R0.1-SNAPSHOT.jar to /home/minecraft/build/./spigot-1.13.2.jar
  5.  - Saved as ./spigot-1.13.2.jar

 

Step 5:需要將編譯好的『.jar』檔案移動到server目錄下,因為還未建立好server目錄,所以需要先建立一個server目錄,建立好之後cd到server目錄。

mkdir ~/server && cd ~/server

 

Step 6:接著就將編譯好的『.jar』檔案移動到server目錄,並將檔案名稱重新命名為『spigot.jar』。

mv ../build/spigot-1.*.jar spigot.jar

 

Step 7:開始執行剛剛所編譯好的Spigot檔案吧。

java -Xms512M -Xmx900M -jar spigot.jar

 

Step 8:因為還沒同意EULA授權合約,所以你會看到類似如以下執行失敗的訊息:

  1. [XX:XX:XX WARN]: Failed to load eula.txt
  2. [XX:XX:XX INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
  3. [XX:XX:XX INFO]: Stopping server

 

Step 9:接著使用你習慣的文字編輯器,來編輯『eula.txt』檔案。以下指令為筆者使用Vim編輯器來編輯『eula.txt』檔案:

vim /home/minecraft/server/eula.txt

接著就將『eula=false』改成『eula=true』。

**如果你將EULA授權合約改成『true』的話,則代表你已同意了MINECRAFT使用者授權合約

eula=true

 

4)從GitHub下載shell script,以可以方便管理Minecraft伺服器及讓Spigot程式在伺服器開機時能自動執行。

Step 1:編譯及安裝好Spigot之後,接下來為了可以方便管理Minecraft伺服器,所以可以來建立一個shell script,你可以直接從GitHub下載作者Nav Vasky所撰寫的shell script,且由筆者二次編輯好的spigotmc-startup-script.sh(中文版本)至你的『/etc/init.d』目錄,並將名稱更改為『minecraft』。

sudo wget -O /etc/init.d/minecraft https://raw.githubusercontent.com/KJieGitHub/spigotmc-startup-script/master/zh-hant-version/spigotmc-startup-script.sh

如果你要英文版本的spigotmc-startup-script.sh,那可以輸入以下的指令,將shell script下載至你的主機。

sudo wget -O /etc/init.d/minecraft https://raw.githubusercontent.com/KJieGitHub/spigotmc-startup-script/master/spigotmc-startup-script.sh

 

Step 2:將其下載好的shell script設定為可執行的權限。

sudo chmod +x /etc/init.d/minecraft

 

Step 3:重新載入systemd。

sudo systemctl daemon-reload

 

Step 4:設定主機在開機或重啟時能自動執行Spigot。

sudo update-rc.d -f minecraft defaults

 

Step 5:以後管理Minecraft伺服器時,所輸入的指令格式如下:

/etc/init.d/minecraft <指令>

指令分別有:

啟動Spigot

/etc/init.d/minecraft start

停止Spigot

/etc/init.d/minecraft stop

重啟Spigot

/etc/init.d/minecraft restart

備份Spigot程式、Minecraft地圖以及伺服器所安裝的第三方插件

/etc/init.d/minecraft backup

查看Minecraft伺服器目前執行的狀態

/etc/init.d/minecraft status

 

Step 6:都設定完成之後,接著可以來首次執行你架設好的Minecraft伺服器了。

/etc/init.d/minecraft start

 

5)Minecraft遊戲世界的伺服器端設定。

Step 1:Minecraft的伺服器端有提供一個稱為『server.properties』的設定檔,這個設定檔可以讓Minecraft伺服器管理者來調整多人遊戲所有參數的檔案。在開始編輯『server.properties』檔案之前,建議你可以先將『server.properties』檔案複製一份,以免日後不小心編輯錯誤時,你還可以參考這份備份檔,或來進行覆蓋。

cp /home/minecraft/server/server.properties /home/minecraft/server/server.properties.backup

 

Step 2:接著使用你習慣的文字編輯器,來編輯及更改『server.properties』設定檔參數至你要的遊戲模式。以下指令為筆者使用Vim編輯器來編輯『server.properties』檔案:

vim /home/minecraft/server/server.properties

 

Step 3:關於『server.properties』設定檔中文版本,可以參考Gamepedia-Minecraft網站的server.properties,裡面有說明每個設定值有哪些參數,及每個參數的描述。

 

Step 4:如果你有更動到『server.properties』設定檔,請記得要重啟你的Minecraft伺服器,這樣你的設定才會生效。

/etc/init.d/minecraft restart

 

6)使用Screen來操控Minecraft伺服器。

**如果你的Minecraft伺服器有在使用防火牆,請記得將Minecraft所使用的預設Port『25565』或者是你指定的Port加入至iptables中,以Debian/Ubuntu來說,最常使用的防火牆為UFW,那可以輸入『sudo ufw allow 25565/tcp』指令來允許外面的連線經由port 25565或者是你指定的Port來連結至你的Minecraft伺服器。

sudo ufw allow 25565/tcp

Step 1:為了防止在中斷SSH連線時,進而導致Spigot終止執行情況下,所以一般都會使用Screen來讓Spigot能在後台執行及管理者自己也可以隨時來連回minecraft的session來管理Minecraft遊戲的世界。為了可以讓使用者自己試著來使用Screen的一些指令,你可以先啟動好Minecraft伺服器。

/etc/init.d/minecraft start

 

Step 2:如果Minecraft伺服器已啟動,那接著可以使用Screen來連上minecraft的session。

screen -r

**如果你在輸入『screen -r』指令時出現『Cannot open your terminal '/dev/pts/1' - please check.』訊息,原因是因為你此次使用SSH連線是使用root或sudo權限來切換至minecraft身份而造成的,你可以輸入『script /dev/null』來解決此次無法連上session的問題。

 

Step 3:在連上minecraft的session之後,你就可以即時看到你Minecraft伺服器的狀況了,比如說有哪些玩家連上你的Minecraft伺服器,或離開了遊戲等等的資訊,還有你也可以直接從你連上的minecraft session這邊輸入指令(包含你安裝在Spigot上的插件相關指令)來控制Minecraft遊戲世界,還有很重要的就是,如果你日後有在Spigot上安裝插件,假如有某個插件出現錯誤或不相容的情形,那也可以直接從minecraft的session這邊看到是哪個插件出現錯誤訊息。

 

Step 4:這邊筆者列出比較常用到的Screen指令與快捷鍵。

Screen指令:

連結目前的session。

screen -r

如果你無法連上session,那可以使用這個指令來列出目前所有的session。

screen -ls

如果你使用『screen -ls』指令,有出現多個session的話,那就要使用這串指令『screen -r 』來指定session,例如:『screen -r minecraft』。

screen -r <session id>

Screen的鍵盤快捷鍵:

如果需要離開Screen畫面,你可以按下鍵盤『Ctrl+A』與『D』就可以離開當前的Screen畫面,需要注意的是,請勿直接按下鍵盤的『Ctrl+C』,因為這會造成Minecraft伺服器也一併終止執行。

 

7)調整Minecraft伺服器可用的記憶體。

Step 1:如果你使用本文教學所提供的shell script,那在shell script裡面的記憶體設定中,筆者預設僅有設定1GB的記憶體,如果你的主機可用的記憶體有2GB或以上,那你可以將Minecraft伺服器可用的記憶體調整多一些,這樣你的伺服器可以同時容納更多的玩家,及也可以安裝更多的有趣的插件,在調整記憶體之前,你需要先停止Minecraft伺服器。

**如果你不知道你的主機有多少MB的記憶體,那可以輸入『free -h』指令來查看你主機上有多少MB的記憶體。

/etc/init.d/minecraft stop

 

Step 2:接著你可以編輯shell script來調整記憶體了。以下指令為筆者使用Vim編輯器來編輯minecraft的shell script檔案:

sudo vim /etc/init.d/minecraft

 

Step 3:在shell script檔案中,大約在26及27行當中,可以分別調整『MAXHEAP』和『MINHEAP』的記憶體數值,分別意思為:MAXHEAP是可用的記憶體最大數值,MINHEAP是可用的記憶體最小數值。以一部2GB記憶體的主機來說,建議調整MAXHEAP數值為『1536』,而MINHEAP數值為『1024』。

**shell script檔案的記憶體『MAXHEAP』和『MINHEAP』兩者數值是使用MB單位計算,每1GB轉換成MB單位是『1024』。

 

Step 4:重新載入systemd。

sudo systemctl daemon-reload

 

Step 5:啟動Minecraft伺服器。

/etc/init.d/minecraft start

 

8)備份Minecraft伺服器及設定crontab排程來自動備份Minecraft伺服器。

Step 1:如果你使用本文教學所提供的shell script,那在shell script中也已編寫好Spigot的備份設定,你只需要輸入指令就可以同時備份好『spigot.jar』、『plugins目錄(插件)』、『Minecraft主世界(The Overworld)』、『地獄(The Nether)』和『終末之界(The End)』。首先你需要手動新增一個備份Spigot的目錄:

mkdir ~/mcserver_backup

 

Step 2:接著可以試著輸入指令來試看備份過程有沒有輸入錯誤。以下為備份Spigot的指令:

/etc/init.d/minecraft backup

如有逐步輸出下面的各個訊息,則代表是有成功備份好Spigot所有資料。

  1. spigot.jar is running... suspending saves
  2. Backing up minecraft world...
  3. Backing up spigot.jar
  4. spigot.jar is running... re-enabling saves
  5. Compressing backup...
  6. Done.

 

Step 3:除了手動輸入指令來備份Spigot之外,建議可以使用Linux的crontab排程,讓系統在你所安排好的時間來自動備份好Spigot。首先可以來開啟好crontab排程的設定介面。

sudo crontab -e

 

Step 4:比如說筆者想要讓Minecraft伺服器每6個小時備份一次,那指令可以參考如下:

**關於Cron的時間設定可以查看維基百科。

1 */6 * * * /etc/init.d/minecraft backup

 

9)更新Spigot至你要的版本。

**如果Minecraft有釋出最新的正式版本,那Spigot的伺服器版本也不一定會立即釋出Minecraft的最新版本,這可能需要等好幾天Spigot才會釋出比較穩定的伺服器版本,你可以從SpigotMC首頁來查看Spigot目前最新的版本。

**如果你要更新Spigot版本,有一個需要注意的事,就是你在Minecraft伺服器上所安裝的插件,因為隨著Spigot不同的版本,那可能會有些插件出現版本不相容的問題,還有並不是每個插件都能獲得插件的作者長久更新,也就表示可能會有某個插件,在你更新完Spigot程式後,可能作者沒有繼續維護,而導致插件出現錯誤,也就造成你Minecraft某些功能無法正常使用,所以建議的就是在你更新完Spigot時,不要忘記也要檢查與確定每個插件是否在最新版本,且所有插件的功能是都可以正常使用的。

**如果某個插件真的出現錯誤,作者也沒有意願繼續更新插件,且那個插件的功能對你的Minecraft伺服器上來說是很重要的話,那建議你不要更新Spigot程式會比較好。

**如果你要查看插件過去有沒有發生錯誤,除了可以經由『screen -r』來即時檢視Minecraft伺服器狀態之外,其實也可以經由過去Log檔來查看記錄,包含日後如果你遇到Minecraft伺服器崩潰,你也可以經由過去的Log檔,來查找蛛絲馬跡,而Log檔存放的目錄位置為『/home/minecraft/server/logs/』目錄下。

Step 1:如果你要更新Spigot的版本,那可以按照本部分的步驟,來手動更新你主機的Spigot版本,在更新Spigot版本之前,可以先停止Minecraft伺服器。

/etc/init.d/minecraft stop

 

Step 2:還有在更新Spigot版本,需要先備份好Minecraft伺服器。

/etc/init.d/minecraft backup

 

Step 3:接著cd至之前下載好的BuildTools.jar檔案目錄位置。

cd ~/build

 

Step 4:開始進行編譯。

java -jar BuildTools.jar

如果要指定Minecraft版本,那可以輸入:

java -jar BuildTools.jar --rev <版本號>

比如本文教學在撰寫時,Minecraft最新版本為『1.13.2』:

java -jar BuildTools.jar --rev 1.13.2

 

Step 5:等待編譯完成。編譯完成後是會輸出類似如以下所示的成功編譯訊息:

  1. Success! Everything compiled successfully. Copying final .jar files now.
  2. Copying craftbukkit-1.13.2-R0.1-SNAPSHOT.jar to /home/ubuntu/build/./craftbukkit-1.13.2.jar
  3.  - Saved as ./craftbukkit-1.13.2.jar
  4. Copying spigot-1.13.2-R0.1-SNAPSHOT.jar to /home/ubuntu/build/./spigot-1.13.2.jar
  5.  - Saved as ./spigot-1.13.2.jar

 

Step 6:Spigot編譯完成之後,需要將編譯好的『.jar』檔案移動到server目錄下,所以需要cd至『server』的目錄位置。

cd ~/server

 

Step 7:接著就將剛剛編譯好的『.jar』檔案移動到server目錄,並將檔案名稱重新命名為『spigot.jar』。

mv ../build/spigot-1.*.jar spigot.jar

 

Step 8:更新完成後,接著就可以來啟動Minecraft伺服器了。對了,除了更新好Minecraft伺服器之外,也要記得通知玩家要將遊戲程式更新至跟你Minecraft伺服器的Spigot程式一樣的版本,比如說在這部分,筆者將Spigot更新至『1.13.2』版本,那遊戲端的Minecraft也是要『1.13.2』版本,這樣才能順利登入伺服器,及繼續遊玩Minecraft遊戲。

/etc/init.d/minecraft start