ADS

2022年10月15日 星期六

2022.10.15, 在AWS上架設Minecraft Server (Setup Minecraft Server 1.19.2 on AWS EC2)

本篇僅為JAVA版Minescaft server V1.19.2安裝做說明,真的遇到描述內容以外的卡關情形,還麻煩各位路過朋友再另做功課並且請分享解法!感恩!

本篇內容所滿足需求--

  1. 在AWS虛擬主機Ubuntu上架設Minecraft server V1.19.2
  2. 建立虛擬主機開機即啟動Minecraft server的服務
  3. 使用DDNS註冊固定的網域名稱(虛擬主機是浮動IP)
  4. 簡單的伺服器遊戲資料備份機制
  5. 自動關機

前置要求知識及Prerequisite--

  1. AWS虛擬平台評估:
    • 在AWS選用的平台為m5.large(8G ram, and 較高的網路頻寬,但要算錢)
    • 試過了下面兩種都不穩定: (V1.16也許可以, 但V1.19版吃超過2G ram會跑不太起來)
      • t2.micro(1G ram)
      • t3.small(2G ram)
  2. SSH連線基礎知識
  3. Ubuntu shell, shell script基本知識
  4. Linux基礎知識(user space, sudo等等)
  5. 大概知道crontab是什麼

流程步驟--

(1) 申請AWS EC2虛擬主機

詳細流程請參考reference(1), 虛擬機種類選m5.large, 作業系統選擇為Ubuntu 22.04 LTS版, 但畢竟跟費用有點關聯,日後如果有更優的選擇也許會換

(2) SSH連線至虛擬主機

一樣請參考reference(1), 總之Amazon SSH是使用pem key連線,在windows端你就開console輸入如下command即可(當然pem key請準備好'YourKey.pem', EC2虛擬機也先啟動好帳號'YourInstanceAccount', 並且查好它的IP:'YourAmazonEC2InstanceIP')

ssh -i YourKey.pem YourInstanceAccount@YourAmazonEC2InstanceIP 

 

(3) Ubuntu系統設定與JRE套件安裝

登入伺服器系統後把相關套件都安裝起來
個人壞習慣:P--
$ sudo apt-get update; sudo apt-get -y upgrade; sudo apt-get -y dist-upgrade; sudo apt-get autoremove; sudo apt-get autoclean; sudo apt-get clean

JDK17安裝,跟你要跑的minecraft server版本有很大的相依性--
$ sudo apt-get install -y openjdk-17-jdk openjdk-17-jre

因為會用到compiler, 編譯環境也稍微裝一下--
$ sudo apt-get install git build-essential
我是習慣用老派編輯器,但是用nano也可以; net-tools只是方便看自己IP用--
$ sudo apt-get install vim net-tools
完成到這邊是初始環境設置好而已,加油!

(4) Minecraft Server相關設定

<0> 開一個執行service要用的帳號

$ sudo useradd -r -m -U -d /opt/minecraft -s /bin/bash minecraft

<1> 下載安裝minecraft server

先切換為剛才創的service帳號模式
$ sudo su - minecraft
創建相關資料夾(注意: 那個教學裡面把家目錄放在/opt下,反正我只是照做而已)
$ mkdir -p ~/{backups,tools,server}
(這裡創建三個資料夾用途: backup做自動備份用, tools等一下放工具程式, server放伺服器程式本體)
進入server資料夾
$ cd server
下載官方server程式(請去官方網頁複製下載連結,參閱Reference(0))
$ wget -O mcserver.jar https://piston-data.mojang.com/v1/objects/f69c284232d7c7580bd89a5a4931c3581eae1378/server.jar
初次執行server程式(一定要跑一次,才會產生EULA文件和server.properties,然後去編輯此兩個文件以有更多設定, 詳細請參閱refrence(2))
$ cd ~/server
$ java -Xmx2048M -Xms512M -jar server.jar nogui
$ nano ~/server/eula.txt
####把文件中"eula=false"改為"eula=true"再存檔

$ nano ~/server/server.properties

####在最後幾行新增行數加上下面三個內容
rcon.port=25575
rcon.password=strong-password
enable-rcon=true
####這三行是為了伺服器管理軟體登入用,其中'strong-password'請想一個管理終端登入時要打的密碼 
(java command後面看自己喜歡調整分配的記憶體,但1.19沒弄到1.5GB以上好像會crash)

<2> 安裝管理終端, mcrcon(注意這邊你應該還是在minecraft新創的帳號底下做事)

移動到tools資料夾及下載程式原始碼
$ cd ~/tools && git clone https://github.com/Tiiffi/mcrcon.git
進入原始碼子資料夾
$ cd ~/tools/mcrcon
編譯程式(懶的解釋,照做就對了:P)
$ gcc -std=gnu11 -pedantic -Wall -Wextra -O2 -s -o mcrcon mcrcon.c
測試編譯出來的程式
$ ./mcrcon -h

<3> 設定伺服器開機自動啟動minecraft server (如果還在minecraft帳號下,請先exit跳出再繼續)

小解釋一下: 畢竟都架站了,總不能每次啟動機器時都要跑去手動執行啟動服務service,而且這樣無法常駐在系統成為真正的伺服器,所以這邊這樣設定,並且關機時也期望可以'正常地'關閉伺服器程式
**請確認真的離開剛創立的minecraft帳號了再進行**(指令whoami看看?)
系統目錄/etc/systemd/system/下創建服務控制腳本
$ sudo nano /etc/systemd/system/minecraft.service
####空白文件請貼下方內容####
[Unit]
Description=Minecraft Server
After=network.target
[Service]
User=minecraft
Nice=1
KillMode=none
SuccessExitStatus=0 1
ProtectHome=true
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true
WorkingDirectory=/opt/minecraft/server
ExecStart=/usr/bin/java -Xmx2048M -Xms512M -jar server.jar nogui
ExecStop=/opt/minecraft/tools/mcrcon/mcrcon -H 127.0.0.1 -P 25575 -p strong-password stop
[Install]
WantedBy=multi-user.target
####內容結束####
這邊有兩點請注意:
    • java啟動命令的記憶體大小請依據系統資源調整
    • 'strong-password'請設定為之前訂定的rcon密碼還有port number(如果你有更改)
測試腳本(啟動,看狀態與停止)--
$ sudo systemctl start minecraft
$ sudo systemctl status minecraft
$ sudo systemctl stop minecraft
沒問題就把他加入系統啟動清單--
$ sudo systemctl enable minecraft

    <4> 防火牆設定

    minecraft server需要用到port 25565, 這在AWS instance後台設定時已啟用過, 這邊從系統端再設定一次--
    $ sudo ufw allow 25565/tcp

    <5> 自動備份設定(optional, 如果不在乎世界被搞爛,遊戲地圖重來也沒差就不需要設定)

    切回minecraft帳號--
    $ sudo su - minecraft
    撰寫遊戲資料(地圖)備份腳本--
    $ nano /opt/minecraft/tools/backup.sh
    ####腳本內容複製貼上####
    function rcon {
      /opt/minecraft/tools/mcrcon/mcrcon -H 127.0.0.1 -P 25575 -p strong-password "$1"
    }
    rcon "save-off"
    rcon "save-all"
    tar -cvpzf /opt/minecraft/backups/server-$(date +%F-%H-%M).tar.gz /opt/minecraft/server
    rcon "save-on"
    ## Delete older backups
    find /opt/minecraft/backups/ -type f -mtime +7 -name '*.gz' -delete
    ####腳本內容結尾####
    設定腳本為可執行模式--
    $ chmod +x /opt/minecraft/tools/backup.sh
    將備份加入定期自動執行--
    $ crontab -e
    ####文件最後一行加上下面命令####
    0 23 * * * /opt/minecraft/tools/backup.sh
    ####結束儲存並退出編輯####
    前面"0 23 * * *" 意思為'每天'. '23:00'執行備份腳本, 想改時間請google crontab設定

    <6> 將單機的世界搬到伺服器上(optional)

    小朋友想把自己原本單機創建的世界搬到伺服器上與其他人同樂,所以又出了這個子任務
    目標:將Windows版的世界搬到伺服器去--

    在Windows環境下:

    • Windows按鍵+R叫出"執行"視窗
    • 開啟內容貼上"%appdata%"
    • 找到並進入".minecraft"資料夾
    • 找到並進入"saves"資料夾
    • 找到你在本機的世界名稱資料夾,複製並將它改名為"world"
    • 把整個world上傳至伺服器(FileZilla+SSH, 上傳到本來的user家目錄, 再移動到/opt/minecraft/server底下,建議先把原來的world資料夾整個砍掉或是改名,乾淨的複製進去)

    在Server環境下:

    • 把world資料夾改為owner為service帳號
    • 試著執行看看並在本機連線登入,看看世界是否改變成你要的樣子,Done

    (5) 自動關機設定

    因為我的需求是有需要再開伺服器玩,有時候忘記關就是一小時一小時在算錢, m5.large一小時價格大約是USD$0.2, 發呆也算錢,所以這邊是個防呆機制
    一樣是用crontab,只是這次是系統sudo去設定,所以crontab是在不同owner的腳本下做事
    (先確定已exit離開minecraft帳號)
    $ sudo crontab -e
    ####進入另一個crontab腳本設定,在文件最後將以下複製貼上####
    29 22 * * * /usr/sbin/shutdown -h now
    00 06 * * * /usr/sbin/shutdown -h now
    00 12 * * * /usr/sbin/shutdown -h now
    ####腳本結尾####
    這邊做到的是每天22:29, 06:00, 12:00都做自動關機的動作(如果伺服器活著),請google crontab做更靈活運用或設定

    (6) DDNS浮動IP網域名稱設定

    我使用的是noip (https://www.noip.com/), 簡述步驟如下
    • 去註冊一個帳號
    • 訂定自己想要的domain name
    • 下載duc程式並照步驟安裝(2.x版已經很足夠,3.x版要腳本指令...請自行研究)
    • command參考如下:
    $ noip-duc -g <YourDomain> -u <YourAccount> -p <YourPassword>
    • 下完連系統啟動都幫你設定號自動更新ip了,很方便,可以試著重開機看看是否功能有正常運作

    Reference:

    (0) Minecraft官方伺服器下載連結 (建議不要去其他地方下載奇怪的東西)

    (1) Minecraft Server to Cloud (AWS EC2) (建議僅參考EC2申請流程即可, 內文server架構是基於1.16.x版, 已不適用1.17.x之後的版本, 效能選擇上t2.micro也非常不夠)

    (2) A Guide to Installing a Minecraft Server on Linux Ubuntu (架設過程比較完整作法, 本篇步驟有70%是參照此流程完成)

    (3) Minecraft Wiki (啟動腳本參照, initctl已不再被Ubuntu支援, 此文已無參考價值)


    (5) DDNS選擇(我自己是用No-IP, 注意免費版每個月要去refresh domain, 不然Domain有機會被搶走)

    (6) Minecraft Wiki 講JDK的差異等等 (有興趣dig in再去看看吧)