本篇僅為JAVA版Minescaft server V1.19.2安裝做說明,真的遇到描述內容以外的卡關情形,還麻煩各位路過朋友再另做功課並且請分享解法!感恩!
本篇內容所滿足需求--
- 在AWS虛擬主機Ubuntu上架設Minecraft server V1.19.2
- 建立虛擬主機開機即啟動Minecraft server的服務
- 使用DDNS註冊固定的網域名稱(虛擬主機是浮動IP)
- 簡單的伺服器遊戲資料備份機制
- 自動關機
前置要求知識及Prerequisite--
- AWS虛擬平台評估:
- 在AWS選用的平台為m5.large(8G ram, and 較高的網路頻寬,但要算錢)
- 試過了下面兩種都不穩定: (V1.16也許可以, 但V1.19版吃超過2G ram會跑不太起來)
- t2.micro(1G ram)
- t3.small(2G ram)
- SSH連線基礎知識
- Ubuntu shell, shell script基本知識
- Linux基礎知識(user space, sudo等等)
- 大概知道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--
個人壞習慣: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/serverrcon "save-on"## Delete older backupsfind /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 now00 06 * * * /usr/sbin/shutdown -h now00 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支援, 此文已無參考價值)
(4) Ubuntu定時系統自動關機
(5) DDNS選擇(我自己是用No-IP, 注意免費版每個月要去refresh domain, 不然Domain有機會被搶走)
No-IP: https://www.noip.com/
DuckDNS: https://www.duckdns.org/install.jsp
DuckDNS教學: https://blog.reh.tw/archives/3299
(6) Minecraft Wiki 講JDK的差異等等 (有興趣dig in再去看看吧)
沒有留言:
張貼留言