Featured image of post 架設 Minecraft 伺服器 (Paper)

架設 Minecraft 伺服器 (Paper)

利用 Paper 及 Oracle Cloud 建立全年無休的 Minecraft 伺服器

尚未完成。

環境:

雲端平台:Azure, Oracle Cloud
作業系統:Ubuntu 20.04 LTS
Minecraft 版本:1.17

租伺服器

我使用的是 Oracle Cloud,因為有永久免費提供兩台 1G RAM/ 1vCPU 的機器可使用,比起 Google Cloud (永久 670MB RAM/1 vCPU* 1) 和 Azure (12個月 1G RAM/1 vCPU* 2 (Windows 及 Linux 各一)),算是非常大方了。如果使用自己的機器可以直接跳到事前準備。如果使用其他的雲端服務可以直接跳到 SSH 連線。

  1. 前往 Oracle Cloud 的官網,點選開始免費試用

  2. 註冊一支帳號。

  3. 開啟選單,並選擇 Compute > Instances

oraclecloudcomputeinstance

  1. 建立機器。

SSH 連線

推薦使用 Windows Terminal。介面美觀、功能強大、微軟親兒子。在 Microsoft Store 即可下載安裝。

開啟後,按下向下箭號,選擇 Settings,下拉左邊的側邊欄,點擊加號,在 Name 欄輸入你想使用的名稱,接著在 Command Line 欄貼上以下的指令,然後修改指令中的參數。

PowerShell -NoExit -NoLogo -Command ssh -i '私鑰路徑' <使用者名稱>@<伺服器 IP>

(第一次連接會顯示金鑰的指紋,並詢問是否要繼續連接,輸入 yes 就可以)

sshfingerprint

以後只要開啟 Windows Terminal,按下拉選單,然後選擇剛才設定的名稱便可以快速存取遠端機器。

SFTP 連線

Filezilla 安裝程式爭議:
Be careful if you are using FileZilla for your… (Reddit)
Fw: [黑特] filezilla我這麼相信你結果你藏木馬!

這裡以 Cyberduck 做示範,但更推薦使用 WinSCP (完全免費,不用看到購買金鑰提示),其他程式的流程應該也大同小異。 安裝完 Cyberduck 後,點左上角的 Open Connection

main ui

即可開啟此視窗。先在最上方的下拉選單選擇 SFTP,接著在 Server 那欄填寫你的機器的 IP,Username 欄填寫你在系統內的使用者名稱,最後點擊 SSH Private Key 旁的 Choose...,選擇你之前下載到的私鑰,就可以連接上了。如果接下來有任何關於檔案操作的步驟,不方便 (不習慣) 在終端機中操作,皆可以透過 Cyberduck 完成。

open connection

與 SSH 連接相同,第一次連接也會提示指紋,選擇允許就好了。

sftpfingerprint

事前準備

先更新 Ubuntu 的套件:

sudo apt update && sudo apt upgrade -y

Swap 空間

因為我們的機器的 RAM 只有 1G,所以得拿硬碟的一小部分作為 swap 空間。(如果機器的記憶體足夠,可以跳過此部分。且硬碟的速度比 RAM 慢上許多,會影響實際執行的效能)

sudo fallocate -l 3G /swapfile #分配空間
sudo chmod 600 /swapfile  #只有 sudo 使用者能存取此空間
sudo mkswap /swapfile  #啟用 swap
sudo swapon /swapfile  #啟用 swap

調整 fstab,否則下次系統重開機時又要再重新設定一次。

sudo nano /etc/fstab
/swapfile swap swap defaults 0 0 #在 fstab 裡面貼上這行指令

貼上後,按下 Ctrl+X、Y、Enter 就可以儲存並離開了。

防火牆

如果是使用 Oracle Cloud 的話,還要先開啟系統防火牆中 Minecraft 的連接埠。

sudo iptables -I INPUT -p tcp --dport 25565 --syn -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 25565 -j ACCEPT
sudo netfilter-persistent save

開始架設

接著就可以開始架設伺服器,安裝 JDK:

sudo apt install apt-transport-https software-properties-common gnupg
wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add -
sudo add-apt-repository https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
sudo apt update
sudo apt install adoptopenjdk-16-hotspot

前往 Paper 的下載頁面,選擇要架設的版本 (示範為1.17),然後對著最新組建 (目前是 #71) 的按鈕點右鍵,複製連結。 下載頁面

建立一個資料夾,名字可以隨便取,接著進到資料夾。

mkdir <資料夾名稱>  # 建立資料夾 Ex: mkdir mcserver
cd <資料夾名稱>  # 進入資料夾 Ex: cd mcserver

使用你剛才複製的連結下載組建。

wget <連結>  # Ex: wget https://papermc.io/api/v2/projects/paper/versions/1.17/builds/71/downloads/paper-1.17-71.jar

此時當你執行 ls 列出檔案列表的時候,應該就能看到資料夾裡面有一個 .jar 的檔案。

執行伺服器檔:

java -Xms512M -Xmx2G -jar paper-1.17-71.jar --nogui

-Xms 是指定伺服器剛啟動時的記憶體分配大小,-Xmx 則是指定伺服器最多能使用的記憶體大小。我這裡分別分配了 512 MB 和 2GB 給伺服器使用,實際執行時能依自己的情況調整。

第一次開啟時,伺服器會要求簽許可協議,並自動關閉。只要開啟 eula.txt,

nano eula.txt

把裡面的 eula=false 改成 eula=true 就可以了。

再開啟伺服器一次。這次就能順利看到伺服器在載入和產生世界,出現 Done (xx.xxxs)! For help, type “help” 之後,就可以透過 IP 進到伺服器中。

問題

只要關掉終端機,伺服器就會跟著一起關掉

使用 screen。

即使你斷線或是關掉終端,screen 還是會在背景繼續執行你的工作。

Ubuntu 已經有內建 screen,在指令前面加上 screen 就可以了,例如:

screen java -Xms512M -Xmx2G -jar paper-1.17-71.jar --nogui

之後若要返回終端機,只需輸入 screen -r

但如果出現以下的錯誤訊息,代表你的終端還綁在其他地方,需要先卸離。輸入 screen -d,再連接一次就好。

There is a screen on:
        38940.pts-0.vm2 (07/16/21 19:44:58)     (Attached)
There is no screen to be resumed.

指令太長,每次都要用複製的

使用 .sh 檔,然後在裡面貼上要執行的指令。設定好權限之後,未來只要執行該 .sh 檔就可以快速執行指令。

nano start.sh //建立檔案
screen java -Xms512M -Xmx2G -jar paper-1.17-71.jar --nogui //貼上此行並儲存
chmod +x start.sh //設定執行權限
./start.sh //執行 .sh 檔

安裝插件

只要將下載回來的 .jar 檔放在 plugins/ 資料夾中就可以了,下次開啟伺服器時就會自動產生檔案。

推薦:

CoreProtect:紀錄或還原破壞方塊、放置方塊、儲物箱物品移動、聊天、登入登出…等事件。

/co i #切換檢查器,對方塊點右鍵即可查看紀錄
/co rb <參數> #復原,可使用參數來縮小範圍
/co l <參數> #查詢紀錄,可使用參數來縮小範圍

可使用的參數有:
u:<玩家> 
t:<時間> Ex: t:5w,3d,2h,1m,4s
r:<範圍> 
a:<動作>  Ex:a:block (放置/破壞方塊)
            a:+block (放置方塊)
            a:-block (破壞方塊)
            a:chat (聊天對話)
            a:click (互動)
            a:command (指令)
            a:container (從儲物箱取出或放入物品)
            a:+container (放入物品)
            a:-container (取出物品)
            a:inventory (撿起或扔出物品)
            a:+inventory (撿起物品)
            a:-inventory (扔出物品)
            a:item (從儲物箱取出或放入物品、撿起或扔出物品)
            a:+item (放入物品到儲物箱或撿起物品)
            a:-item (從儲物箱取出物品或扔出物品)
            a:kill (殺死生物)
            a:session (登入/登出)
            a:+session (登入)
            a:-session (登出)
            a:sign (告示牌訊息)
            a:username (玩家名稱變動)
b:<方塊> 
e:<排除方塊> 

FastChunkPregenerator:預先生成 chunk,不用等到玩家在附近時才生成,對跑圖時的效能非常有幫助。

/fcp start <範圍> [世界] [chunk 的 X 座標] [chunk 的 Z 座標]  #開始生成
/fcp pause #暫停生成
/fcp resume #繼續生成
/fcp cancel #取消生成

可有可無:

TAB:在玩家列表、頭上、計分板…等地方顯示自訂訊息。

example

Source:TAB Plugin Page

/tab reload

Supported RGB formats:

#******
&#******
{#******}
#<******>
&x&*&*&*&*&*&*

Gradients:

<#******>Text</#******>
{#******>}Text{#******<}
<$#******>Text<$#******>

config.yml

animation.yml

Dynmap:讓世界能像 Google 地圖一樣瀏覽

預設可使用的世界及地圖: world - 世界 (主世界)
                       -> flat - 地圖 (2D)
                       -> surface - 地圖 (3D)
                       -> cave - 地圖 (3D)
                     world_nether - 世界 (地獄)
                       -> flat - 地圖 (2D)
                       -> surface - 地圖 (3D)
                     world_the_end - 世界 (終界)
                       -> flat - 地圖 (2D)
                       -> surface - 地圖 (3D)
                       
指令:                       
/dynmap render: 渲染目前所在位置的一格區塊。
/dynmap fullrender (世界):(地圖): 從中央開始,渲染指定世界的地圖。
/dynmap radiusrender (範圍) (地圖): 從你所在位置開始,向外渲染你指定的範圍。
/dynmap radiusrender (地圖) x z (範圍): 從 `x, 64, z` 開始,向外渲染你指定的範圍。
/dynmap updaterender (地圖): 渲染需要更新的區塊。
/dynmap updaterender (世界) x z (地圖): 從(x, z)的區塊開始,渲染需要更新的區塊。
/dynmap cancelrender (世界): 取消所有渲染工作。
/dynmap purgequeue: 清除工作隊列。
/dynmap purgemap (世界) (地圖): 刪除該世界的所有地圖檔。若未提供地圖將刪除全部。
/dynmap pause all: 暫停所有渲染工作。
/dynmap pause none: 繼續所有渲染工作。

Multiverse:多個世界,可將個別調整世界的細項,像是遊戲模式、規則…

提升性能

參考

修改時區

根據租的機器的所在位置,時區也會跟著有所不同。在察看伺服器的紀錄檔的時候可能會很麻煩。如果想要把時區改回台灣的話,可以使用下面這條指令。

sudo timedatectl set-timezone Asia/Taipei
.
.