*本文為Ubuntu Linux架設Minecraft Java版伺服器的教學,如果您想在Linux電腦玩Minecraft Java版,請參閱 此篇。
Mojang開發的Minecraft Java版伺服器(Minecraft Java Edition server)是給那些需要大型多人連線的玩家所準備的,屬於專有軟體。相較於單純的局域網分享,開Minecraft伺服器能應對更多人數的玩家需求,同時也還可以安裝各種模組(mod)、插件(plugin)增強遊戲效果。
本文Ivon使用容器化技術,將Minecraft伺服器跑在Docker容器裡,簡化部署流程,並減少對伺服器系統的依賴。
1. 環境#
- 系統:Ubuntu 22.04 LTS 安裝教學
- CPU: 4核心x86架構CPU
- RAM:8GB
- 硬碟空間:20GB
雖說這裡用Ubuntu系統做示範,但因為主要是依賴Docker來跑,不需設定Java,只要能裝Docker,用CentOS/Debian的Linux電腦來架也可以。
2. 撰寫Docker-compose#
此處使用itzg組織維護的映像檔,該映像檔基於Mojang官方發表的最新 Minecraft伺服器軟體所建置(對應最新穩定版的Minecraft,例如1.20),支援x86與ARM架構的電腦。
請先安裝 Docker
新增存放世界資料的目錄,這裡就是伺服器的根目錄了。
cd ~
mkdir minecraft_server
cd minecraft_server
- 參考
官方說明,新增
docker-compose.yml
vim docker-compose.yml
- 填入以下內容。這裡跑二個服務,一個是Minecraft伺服器服務,一個是備份世界的服務(後述)
version: "3.8"
services:
# 伺服器服務
mc:
image: itzg/minecraft-server
container_name: "mc"
tty: true
stdin_open: true
ports:
- "25565:25565"
environment:
# 自動同意伺服器的EULA
EULA: "TRUE"
# 設定分配8GB RAM
MEMORY: "8G"
# 設定JVM啟動參數,設定最多使用75% RAM
JVM_OPTS: "-XX:MaxRAMPercentage=75"
volumes:
# 在目前的目錄新增存放資料的目錄
- ./data:/data
# 自動備份服務
backups:
image: itzg/mc-backup
environment:
BACKUP_INTERVAL: "24h"
RCON_HOST: mc
PRE_BACKUP_SCRIPT: |
echo "Before backup!"
echo "Also before backup from $$RCON_HOST to $$DEST_DIR"
POST_BACKUP_SCRIPT_FILE: /post-backup.sh
volumes:
# 與Minecraft伺服器共用目錄,唯讀
- ./data:/data:ro
# 備份至mc-backups
- ./mc-backups:/backups
- ./post-backup.sh:/post-backup.sh:ro
- 啟動服務
sudo docker compose up -d
- 用
ip addr
查看Linux電腦的區域IP:
# 範例輸出,IP為192.168.0.5
wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.0.5/24 brd 192.168.0.255 scope global dynamic noprefixroute wlan0
- 如果Linux有防火牆,記得開放25565通訊埠
sudo ufw allow 25565
sudo ufw reload
- 於同一區域網路下的電腦,開啟Minecraft,點選多人遊戲 → 新增伺服器,輸入
<Linux電腦區域IP>:25565
嘗試連線。
3. 調整Minecraft的伺服器設定#
- Minecraft伺服器的資料位於
~/minecraft_server/data
,若要修改伺服器設定。先將容器服務停止:
sudo docker compose down
- 再編輯
~/minecraft_server/data/server.properties
檔案。
vim ~/data/server.properties
server.properties
定義伺服器的設定,例如玩家人數、生存或創造、遊戲難度、要載入的世界等等。詳細用法參考
Minecraft Wiki
此外,data
目錄下還有其它重要檔案:
world
目錄即為伺服器載入的世界。玩家一連線就會生成一個空白世界,可自行替換成現有世界。
whitelist.json
:定義白名單,設定只有在該列表的玩家才能加入世界。需在server.properties
將white-list=
設為true才會啟用白名單機制。伺服器管理員可以在遊戲中以/whitelist
指令編輯白名單,用/list uuids
列出所有玩家的UUID。再如下填寫:
[
{
"uuid": "UUID",
"name": "玩家名稱"
},
{
"uuid": "UUID",
"name": "玩家名稱"
}
]
ops.json
:定義作為伺服器管理員(OP)的玩家。
banned-players.json
:黑名單玩家。
banned-ips.json
:禁止連線的IP。
logs
目錄:輸出Minecraft伺服器的系統訊息,方便除錯。
mods
目錄:安裝Forge、Fabric模組之用。
plugins
目錄:安裝插件之用。
config
目錄:放置模組設定檔。
修改完成後,再重新啟動容器服務:
cd ~/minecraft_server
sudo docker compose up -d
3. 設定定時備份世界的排程任務#
備份Minecraft世界有助於復原遊戲資料。
我們在上面的docker-compose.yml已經跑了一個mc-backup
的服務,它每24小時就會將世界備份到~/minecraft_server/mc-backups
目錄,以壓縮檔形式儲存。
僅供參考:手動systemd timer定時備份法
最簡單的Minecraft世界備份方式就是將世界目錄製成壓縮檔。
新增備份目錄
mkdir ~/backup
壓縮世界檔案,檔名帶入目前時間
zip -r world_$(date +"%Y%m%d") ~/backup
用ls ~/backup
指令看壓縮檔有無出現在backup
目錄
# 範例輸出
world_20230722.zip
接著要將上述步驟自動化,我們將設定一個sytemd unit,設定每日0時,將Minecraft伺服器的世界(worlds
目錄)做成壓縮檔備份,並儲存到使用者家目錄(需填寫完整路徑,如/home/user/backup
,其中user
是您的使用者名稱)
- 往系統新增systemd unit
sudo vim /etc/systemd/systemd/backup-minecraft-data.service
- 填入以下內容,指令為使用zip工具,建立檔名帶有備份當下時間的壓縮檔。
[Unit]
Description=backup-minecraft-data
[Service]
Type=oneshot
# 對容器發送rcon指令,強迫Minecraft存檔,再行備份
ExecStart=docker exec -i mc rcon-cli save && sudo docker exec -i mc rcon-cli save-off && /usr/bin/zip -r world_$(date +"%Y%m%d") "/home/user/backup" && docker exec -i mc rcon-cli save-on
WorkingDirectory=/home/user/backup/minecraft_server
- 再建立一個systemd timer
sudo vim /etc/systemd/systemd/backup-minecraft-data.timer
- 填入以下內容
[Unit]
Description=backup-minecraft-data
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
- 最後,啟用服務
sudo systemctl daemon-reload
sudo systemctl enable --now backup-minecraft-data.timer
4. 開放外部連線的作法#
如果您的伺服器沒有固定的公共IP,又想讓區域網路外部連線進來,那麼推薦在所有電腦(含Minecraft伺服器的電腦本身)安裝 內網穿透軟體,進行連線。
屆時Minecaft伺服器的IP,就是改用虛擬區域IP來連線,例如安裝ZeroTier後,Mineraft伺服器可能會分配到一個172.30.155.1
的虛擬區域IP,那麼在Minecraft裡面就用這個IP連線。
延伸閱讀#
itzg Minecraft伺服器官方參考文件 Minecraft Server on Docker (Java Edition)
itzg Minecraft伺服器備份方案參考文件 docker-mc-backup