前陣子一直在玩 Starbound(雖然目前已荒廢),當時為了想推坑所以就想架個伺服器試試,於是找到了這篇入門文章,經由作者同意後我就翻譯貼上來了。

原文連結: Daniel Sokolowski’s Blog: Starbound Dedicated Server Setup

Thanks to Daniel Sokolowski.

Starbound 專用伺服器架設

使用 Debian 架設全天候的 Starbound 伺服器

Starbound 是一款類 Terraria 的外太空生存 / 建造遊戲。

在觀看一些影片並且實際試玩了一下後,我只能說這款遊戲內的豐富生態和可掠奪的星球設定很對我胃口。因此除了原有的 minecraft.danols.com 之外,我決定再為 Starbound 架設一個全年無休的專用主機 starbound.danols.com,以下就是架設教學。

取得 Debian linux 伺服器

如果你尚未擁有 Linux 伺服器,我推薦 Linode Xen VPS 提供的主機服務 – 最基本的方案就行了。至今我使用他們的服務超過五年,覺得無可挑剔。

雖然坊間還有其他更便宜的主機商,但是一分錢一分貨是不變的真理;況且最基本的方案就足以讓我架設 FreeSWITCH VOIP、Minecraft、電子郵件以及跑一些網站了。

參考它們的安裝說明就能輕易地建立 Debian 7 的環境。

如果你願意的話,請使用上述連結註冊或是這個推薦碼 7d884fa5262b62b8735502da003fee34061db49b 可以讓我獲得一點小回饋。

為 Starbound 伺服器挑一個網域名稱

如果你還沒有網域名稱,我推薦 1&1 Internet 這家註冊商。過去幾年我都是同時用 GoDaddy 和 1and1 的服務,然而我更傾向使用 1and1,畢竟價格優惠又提供免費的 WHOIS 匿名服務。

在取得網域名稱後,修改 1and1 或 GoDaddy DNS(網域名稱伺服器)指向至你的 Linode 主機。

當你完成在網域註冊商的 DNS 設置後,登入 Linode 後台並設置 DNS 子網域內容且指向至你的主機。這個步驟只需要在如果你像我一樣使用子網域來跑服務時設定。下圖是我的 starbound.danols.com 的設定。

要確認所有設定都正常運作,試試 ping 一下你的網域,如果有回應那就沒問題了。這也表示,如果有其他玩家想加入你的主機,只需要給他們你的網域名稱而不是冰冷的 IP 位址。

root@sh1:/usr/local# ping starbound.danols.com
PING starbound.danols.com (69.164.217.6) 56(84) bytes of data.
64 bytes from sh1.danols.com (69.164.217.6): icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from sh1.danols.com (69.164.217.6): icmp_seq=2 ttl=64 time=0.065 ms
64 bytes from sh1.danols.com (69.164.217.6): icmp_seq=3 ttl=64 time=0.064 ms
--- starbound.danols.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.051/0.060/0.065/0.006 ms

從 Starbound 資料夾內複製 Linux 伺服器需要的檔案

Windows Steam 版本的 Starbound 在安裝後已經包含了運作 Linux 伺服器的可執行檔。
使用 SFTP WinSCP 客戶端複製 <安裝目錄>\Steam\SteamApps\common\Starbound\linux64\*.*/usr/local/starbound-server/linux64/
以及 <安裝目錄>\Steam\SteamApps\common\Starbound\assets\*.*/usr/local/starbound-server/assets

最後的資料夾結構看起來會是:

/usr/local/starbound-server/
    /assets/  (從 asssets 複製而來)
    /linux64/     (從 linux64 複製而來)

如果你好奇為什麼我們要把檔案放在 /user/local/,請參考 Debian FilesystemHierarchyStandard wiki

建立 starbound-server 使用者以及執行腳本

使用 SSH 遠端連線至你的主機,我慣用衍生至 PuTTY、提供更多額外功能的 KiTTY

使用 adduser 指令建立可執行 starbound 服務且受限制的帳戶。

root@sh1:/usr/local/starbound-server# adduser --home /usr/local/starbound-server/ --shell /bin/false --no-create-home --ingroup daemon --disabled-password --disabled-login starbound-server
Adding user `starbound-server' ...
Adding new user `starbound-server' (1005) with group `daemon' ...
Not creating home directory `/usr/local/starbound-server/'.
Changing the user information for starbound-server
Enter the new value, or press ENTER for the default
        Full Name []: Starbound Server
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n]

再來就是建立遊戲服務的執行腳本,輸入 nano /usr/local/starbound-server/starbound-server-init.d-script.sh 並貼入下列文字:

#!/bin/sh
### BEGIN INIT INFO
# Provides:      starbound
# Required-Start:    $local_fs $remote_fs $network $syslog $named
# Required-Stop:    $local_fs $remote_fs $network $syslog $named
# Default-Start:    2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the starbound server
# Description:      starts starbound using start-stop-daemon
### END INIT INFO

### NOTE: after linking it into init.d run `update-rc.d starbound-server.sh defaults`

### Settings
PID=/var/run/starbound-server.pid
DAEMON=/usr/local/starbound-server/linux64/starbound_server   # 執行檔名稱
DAEMON_FOLDER=/usr/local/starbound-server/linux64/            # starbound_server 檔案的所在資料夾
DAEMON_OPTS=""
NAME=Starbound                                            # 程序名稱
DESC="Starbound server"                                   # 程序描述
USER=starbound-server                                     # 執行程序的帳戶(不要使用 root)


# Check if user exists
if ! id -u $USER > /dev/null 2>&1; then
        echo "The user does not exist; execute below commands to crate and try again:"
        echo "  root@sh1:~# adduser --home /usr/local/starbound-server/ --shell /bin/false --no-create-home --ingroup daemon --disabled-password --disabled-login $USER"
        echo "  ..."
        echo "  root@sh1:~# chown starbound-server:daemon /usr/local/starbound-server/ -R"
        exit 1
fi

### Check if server file exists and is executable
if [ ! -e $DAEMON ]; then echo "File $DAEMON does not exist"; exit 1; fi
if [ ! -x $DAEMON ]; then echo "Server file is not executable; run 'chmod +x $DAEMON' to fix."; exit 1; fi

set -e

. /lib/lsb/init-functions


start() {
        # start the server
        # echo "start-stop-daemon --start --make-pidfile --pidfile $PID --chuid $USER --chdir $DAEMON_FOLDER --exec $DAEMON -- $DAEMON_OPTS"
        start-stop-daemon --start --make-pidfile --pidfile $PID --chuid $USER  --chdir $DAEMON_FOLDER  --exec $DAEMON -- $DAEMON_OPTS > /dev/null &

}

stop() {
        # gracefully stop the server
        start-stop-daemon --stop --signal INT --pidfile $PID --chuid $USER --oknodo --exec $DAEMON
}

case "$1" in
        start)
                log_daemon_msg "Starting $DESC" "$NAME"
                start
                log_end_msg $?
                ;;

        stop)
                log_daemon_msg "Stopping $DESC" "$NAME"
                stop
                log_end_msg $?
                ;;
        restart)
                log_daemon_msg "Restarting $DESC" "$NAME"
                stop
                sleep 1
                start
                log_end_msg $?
                ;;

        status)
                status_of_proc -p $PID "$DAEMON" starbound
                ;;

        *)
                echo "Usage: $NAME {start|stop|backup|restart|status}" >&2
                exit 1
                ;;
esac

exit 0

error while loading shared libraries: libvorbisfile.so.3: cannot open shared object file: No such file or directory

你可能會取得上述錯誤訊息,只要執行 aptitude install libvorbisfile3 應該可以解決此缺少函式庫的問題。

最終步驟及執行測試

先確認所需檔案的擁有者都屬於 starbound-server 帳戶: daemon /usr/local/starbound-server/ -R

將執行腳本排入啟動順序並建立連結至 /etc/init.d/ 目錄以加入 boot 程序,如下所示:

root@sh1:/usr/local/starbound-server/assets# ln -s /usr/local/starbound-server/starbound-server-init.d-script.sh /etc/init.d/starbound-server.sh
root@sh1:/usr/local/starbound-server/assets# update-rc.d starbound-server.sh defaults

最後,輸入 /etc/init.d/starbound-server.sh start 來執行測試,登入你全新且閃亮亮的伺服器吧!

如果你有任何疑問,不要客氣,關注我的 Twitter @danielsokolow 一起交流。

你也可以登入我的 starbound.danols.com 瞧瞧。

疑難排解

最好的除錯方式就是手動執行遊戲服務,並且觀察 console 內顯示的任何訊息;使用下列指令以手動執行:

root@sh1:/etc/init.d# cd /usr/local/starbound-server/linux64/
root@sh1:/usr/local/starbound-server/bin# ./starbound_server
Info: Creating Star::Root with 1 assets sources and config file: './starbound.config'
Info: Loading Star::Assets from: '../assets'
Info: Loading Star::Root...
...

Warn: Slow asset 0.081 : /objects/generic/capsulemed/capsulemed.png:default
Warn: Perf: UniverseServer::createWorld millis: 6830
Warn: Perf: WorldServerThread::sync millis: 363
Warn: Perf: UniverseServer::doTriggeredStorage millis: 363
Warn: Perf: UniverseServer::run.innerloop millis: 473
Info: Shutting down world alpha:-61930447:-6722809:-4350314:8:6

提示

日誌高亮度風格

遊戲產生的日誌非常多又雜,但你可以使用像是 `ccze` 的日誌高亮度檢視器;使用下列指令安裝並執行:

root@sh1:~# aptitude install ccze
...
root@sh1:~# tail -f -n 50 /usr/local/starbound-server/linux64/starbound_server.log | ccze -A
...

伺服器當掉時自動重啟

我注意到服務執行一段時間後會停止運作,我認為這是 beta 版本的緣故。以防萬一,我建立了執行 /etc/init.d/starbound-server start 的 cron 排程,讓 start-stop-deamon 監測是否需重新建立執行程序。

我喜歡較明確的作法,所以我將下列內容命名儲存為 /usr/local/starbound-server/starbound-server-cron.d-entry 並建立連結至 /etc/cron.d/starbound-server-start-if-needed。要注意的是,在 cron.d 內的檔案名稱不能包含 .句點。

# 在 Debian 系統將檔案建立連結至 `/etc/cron.d` 資料夾
#
# > ln -s /usr/local/starbound-server/starbound-server-cron.d-entry /etc/cron.d/starbound-server-start-if-needed
#
# 確認檔案的權限以及擁有者如下所示,請參閱(http://askubuntu.com/questions/54857/can-symlinks-be-use$)
#
#    -rwxr--r--  1 root daemon  215 Dec 12 15:01 starbound-server-cron.d-entry

 */15 * * * * root /etc/init.d/starbound-server start

延伸閱讀

後記

我依照上文架設的確可以正常運作,只是 CPU 一直飆高,所以我也僅止於「架設成功」的階段並無投入運作,因此若有其他問題,至原文作者 Twitter 發問應該比較適合。