在Docker中架設Factorio多人遊戲服務端

最近跟基友一起玩Factorio遊戲,創建了一個服務器,運行在阿里雲服務器的Docker中。
本文介紹Docker版Factorio服務端的安裝過程,並且提供了一個完整的服務端鏡像,讓你一行代碼完成Factorio服務器的安裝。

如果你只想要一個已經安裝完畢的Docker版Factorio服務端,可以直接跳到文章結尾。

我已將Docker版本Factorio的所有文件打包到GitHub中: https://github.com/yoojia/Docker-Factorio,包括Factorio最新服務端版本文件、啓動腳本、Dockerfile。

這裏要說說Docker神器啊,對於部署或者安裝某一個服務的簡單程度,簡!直!了!不信你直接跳到文章結尾提供的一行代碼部署Factorio服務器。最重要是,各個服務之間、服務主機之間可以互不影響啊!

一、安裝Docker

安裝Docker只需要一行代碼:

curl -fsSL https://get.docker.com/ | sh

二、創建Docker的基礎鏡像

在這裏,讓Factorio服務端運行在Ubuntu Server 14.04環境中。

Ubuntu的Docker鏡像,可以使用Docker的官方鏡像,也可以使用我已創建好並內置阿里雲mirrors的鏡像yoojia/ubuntu

阿里雲的mirrors是我所在網絡環境裏更新網速最快的源

sudo docker run -ti yoojia/ubuntu:14.04

三、下載Factorio服務端

Factorio提供了Windows和Linux兩個平臺的服務端。服務端與客戶端不同,它只處理遊戲邏輯和數據保存及多人數據同步,沒有遊戲UI和音效的處理。
另外值得一說的是Factorio使用的是UDP協議而非TCP協議來傳輸數據,據官方的說法是,Factorio使用了可靠的通訊層來保證數據丟包問題?咦!難道他們應用了Google QUIC?

Windows版本的安裝很簡單,下載後雙擊打開就完成安裝了。這裏介紹的是Linux的版本。

執行上面的命令,等待鏡像的各層下載完成後,你就進入到yoojia/ubuntu鏡像的容器中,命令提示符是這樣的:

root@10b496af46e:/#

yoojia/ubuntu:14.04只是一個簡潔的Ubuntu內核,並沒有其它工具。例如 cURL 或者 wget 等命令是不存在的,需要我們自己安裝。

非常簡單,更新Ubuntu系統,然後安裝cURL:

apt-get update
apt-get install -y curl

在Factorio官網下載Headless版本,即服務端。地址爲https://www.factorio.com/download-headless/stable

當前最新版本爲0.12.29 (headless),使用上面安裝的cURL下載,並解壓它:

cd /
curl -fkOL https://www.factorio.com/get-download/0.12.29/headless/linux64 | tar -xzf

到此爲止,Factorio服務端已經安裝完成。上面這麼多,其實就是下載Factorio的服務端文件並解壓到 /factorio 目錄中。
運行 /factorio/bin/x64/factorio 文件就可以啓動服務端了。

四、Factorio服務端啓動腳本

配置參數作用於:/factorio/bin/x64/factorio。

  • -c PATH 或者 --config PATH: 指定配置文件路徑
  • --create MAP-NAME 創建一個隨機地圖,並指定文件名;
  • --start-server MAP-NAME 使用指定地圖啓動服務端;

Factorio服務端的參數解析:

  • --latency N: 網絡響應時間參數,暫時沒明白這個參數具體的作用;
  • --latency-ms N: 網絡響應時間參數,暫時沒明白這個參數具體的作用;
  • --autosave-interval N: 服務端自動保存遊戲進度時間,單位:分鐘;
  • --autosave-slots N: 服務端自動保存;
  • --disallow-commands: 禁止使用控制檯命令;
  • --peer-to-peer: 客戶端之間使用點對點通訊;這個選項的前提是各個客戶端之間的網絡通訊比客戶端與服務端通訊要用的情況下使用;
  • --no-auto-pause: 當沒有用戶連接時,不要自動暫停遊戲。

啓動腳本

啓動腳本用於在啓動Factorio服務端時,判斷地圖是否存在,並查找到最新的autosave文件來加載地圖。

目前Factorio的地圖保存和讀取策略是,--start-server 參數指定的地圖只是作爲基礎數據。服務端啓動後,遊戲進度數據保存到_autosave1.zip,_autosave2.zip,_autosave3.zip 文件中。所以啓動腳本要解決服務端重啓問題,在重啓後,讀取最新的遊戲進度。

具體實現腳本文件:

SAVE_NAME="ourworld"
SAVE_MAP="${SAVE_NAME}.zip"

AUTOSAVE_INTERVAL="--autosave-interval 30"
AUTOSAVE_SLOTS="--autosave-slots 3"
DISABLED_COMMANDS="--disallow-commands"

EXEC_DIR="/factorio"
EXEC_BIN="${EXEC_DIR}/bin/x64/factorio"
EXEC_ARGS="${DISABLED_COMMANDS} ${AUTOSAVE_INTERVAL} ${AUTOSAVE_SLOTS}"

AUTOSAVE_DIR="${EXEC_DIR}/saves"

echo "# Factorio Server launcher start..."

# find the latest autosaveN.zip
LATEST_MAP=`ls -t ${AUTOSAVE_DIR}/*.zip 2> /dev/null | head -1`

echo "# Latest autosave map: ${LATEST_MAP}"

if [ "${LATEST_MAP}" == "${AUTOSAVE_DIR}/${SAVE_MAP}" ]; then
    echo "- Using origin map: ${LATEST_MAP}"
else
    echo "- Using latest map: ${LATEST_MAP}"
    mv ${LATEST_MAP} ${AUTOSAVE_DIR}/${SAVE_MAP}
fi

# Check save map
if [ ! -f ${LATEST_MAP} ]; then
    ${EXEC_BIN} --create ${SAVE_NAME}
fi

# Run server with args
${EXEC_BIN} --start-server ${SAVE_NAME} ${EXEC_ARGS} $@

五、構建Docker鏡像

Factorio官網下載似乎抽風,使用CURL下載經常失敗。爲了方便,我把服務端文件下載到本地,在Dockerfile中讀取本地文件來構建。

FROM yoojia/ubuntu:14.04

MAINTAINER Yoojia Chen <yoojiachen@gmail.com>

ADD factorio-0_12_29.tar.gz /

WORKDIR /factorio

ADD start.sh ./
RUN chmod +x start.sh

VOLUME ["/factorio/saves"]

EXPOSE 34197/udp

ENTRYPOINT ["./start.sh"]

首先創建一個目錄,如factorio 將上面代碼保存爲 Dockerfile 文件,在目錄的上一級運行:

sudo docker build -t factorio-server factorio

-t之後的第一個參數是鏡像名稱,第二個參數是目錄名

即可構建你的Docker鏡像。

六、一行代碼部署Factorio服務器

sudo docker run -d \
-v :/opt/factorio/saves \
-p 34197:34197/udp \
–restart=always \
–name my-factorio-server \
yoojia/factorio:latest

  • <your-local-save-dir> 這個是你保存服務端地圖的目錄,例如我的服務器,數據都保存在 /datadisk 中。那我的地址就是 /datadisk/factorio

祝你遊戲愉快!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章