幻獸帕魯伺服器更新教學:版本不符與不掉存檔的順序
用戶端會自己更新,專用伺服器不會。這篇講怎麼確認上游出了新版本、公告 → 強制存檔 → 停止 → 更新 → 啟動的正確順序,以及更新後世界打不開時怎麼判斷、怎麼還原。
《幻獸帕魯》的用戶端 Steam 會自己幫你更新,專用伺服器不會有人幫你更新。所以官方發版那天的畫面永遠一樣:昨天還好好的伺服器突然誰都進不去,連線等得比平常久,然後被丟回標題畫面。這篇講的是怎麼用不掉存檔的順序更新幻獸帕魯伺服器。還沒開服的話,先看從零架一台專用伺服器。
版本不符時玩家那側看到什麼
版本不符不會給你一句清楚的錯誤訊息。所以開服的人第一個想到的通常是連接埠或防火牆,真正的原因卻是版本編號。
| 你看到的 | 實際發生的事 |
|---|---|
| 連線卡很久,然後回到標題畫面 | 用戶端已經是新版,伺服器還在舊版本 |
| 跳出版本不同的提示 | 同一個原因。有些版本會跳,有些不會 |
| 伺服器從社群列表裡消失 | 列表本來就按版本過濾,舊版本不會出現 |
| 只有一兩個人進不去 | 這不是版本問題,是連不上排查那一篇的事 |
最後一行是判別線:全部人同時進不去就是版本,只有一兩個人進不去就是那個人的環境。官方發版後那幾天,前者佔壓倒性多數。
確認只要比對兩個地方:遊戲主選單角落的版本號,和伺服器啟動日誌裡印出的版本。如果你開了 REST 介面,GET /v1/api/info 會直接回傳伺服器版本(REST API 管理)。
怎麼知道上游出了新版本
專用伺服器的 App ID 是 2394010,和遊戲本體(1623730)不是同一個號碼,發布也是分開的。你現在裝的是哪個版本,寫在安裝目錄的資訊清單裡:
grep buildid /home/palserver/palworld/steamapps/appmanifest_2394010.acf
Steam 目前在發的版本編號,問 SteamCMD:
steamcmd +login anonymous +app_info_update 1 +app_info_print 2394010 +quit \
| grep -A 5 '"public"'
branches → public 底下的 buildid 是現在在發的編號,timeupdated 是它發布的時間。兩個數字不一樣,就代表有東西要更新。
不過這個比對不用每次手動做。加了 validate 的 app_update 在已經是最新版時基本上什麼都不做,所以「有沒有新版」這個判斷可以直接交給 SteamCMD。比對真正有用的情況只有一種:現在還有人在線上,你想先知道值不值得為它停機。
正確順序:公告 → 強制存檔 → 停止 → 更新 → 啟動
這五步的順序就是這篇的重點,任兩步對調都會丟東西。
PW='一個夠長的密碼'
API='http://127.0.0.1:8212/v1/api'
# 1. 公告:給線上的人反應時間
curl -s -u "admin:$PW" -X POST "$API/announce" \
-H 'Content-Type: application/json' \
-d '{"message":"Server updates in 5 minutes"}'
sleep 300
# 2. 強制存檔:把記憶體裡的世界寫進硬碟
curl -s -u "admin:$PW" -X POST "$API/save"
sleep 10
# 3. 停止:等程式完全退出再做下一步
sudo systemctl stop palworld
# 4. 備份在這裡做(下一節)
# 5. 更新
sudo -u palserver steamcmd +force_install_dir /home/palserver/palworld \
+login anonymous +app_update 2394010 validate +quit
# 6. 啟動
sudo systemctl start palworld
還沒開 REST 介面的話,先在 PalWorldSettings.ini 裡加上 RESTAPIEnabled=True 和 AdminPassword。認證是 HTTP Basic、使用者名稱固定是 admin,而且防火牆不要放行 8212,官方明講過它不是設計來直接暴露在網際網路上的。
另外三件事要講清楚:
- 不要在伺服器還開著的時候跑
app_update。 Linux 不會阻止你覆蓋一個正在執行的程式的檔案,結果是程式還跑著舊的執行檔、硬碟上的檔案卻換成了新的,這種半新半舊的狀態要等下次重新啟動才會爆出來。 validate每次都要加。 它會多做一次檔案完整性檢查,代價是慢一點;但下載中斷留下的壞檔案,只有這個選項抓得到。- 更新期間誰都進不來。 大一點的版本要下載好幾分鐘,所以別挑大家都在等著開玩的時間點動手。
更新前那一次完整備份
存檔格式偶爾會跟著版本變,而且一個世界一旦用新版本開啟過,就回不去舊版本了。所以這次備份跟「每天一次」是兩回事:更新前手動再做一次。它平常一次都用不到,真要用到的那天就是全部。
要複製的是世界資料夾整包,而且要在伺服器停掉之後才複製:
sudo systemctl stop palworld
sudo -u palserver cp -a \
/home/palserver/palworld/Pal/Saved/SaveGames/0/<WorldID> \
/home/palserver/backups/pre-update-$(date +%F)
<WorldID> 是伺服器第一次啟動時建的十六進位資料夾名。只複製裡面那個 Level.sav 的備份,還原之後所有人都會變成全新角色:地圖還在、據點還在,但主人不見了。為什麼 Players/ 一定要一起帶走、還原要照什麼順序,寫在存檔在哪、怎麼備份、怎麼還原。
更新後世界打不開:怎麼判斷、怎麼回退
先分清楚是下面哪一種,處理方式完全不同:
| 症狀 | 怎麼看 | 原因 |
|---|---|---|
| 伺服器根本起不來 | journalctl -u palworld -n 100 | 檔案損壞,或設定檔讀不進去 |
| 起來了,但是一個空的新世界 | 看 SaveGames/0/ 底下是不是多了一個資料夾 | 讀不到原本那個資料夾,於是另外開了一個 |
| 伺服器正常,但全部人進不去 | 比對版本 | 這次是用戶端那側還沒更新 |
中間那條最嚇人,但其實什麼都沒少。原本的 <WorldID> 資料夾還在原地,只是伺服器沒讀它。不要把原本那個資料夾刪掉。
回退的做法不是「把版本降回去」,而是把更新前那份備份還原到新版本上。兩個理由:用戶端已經升上新版,舊版本的伺服器本來就沒人連得進來;而世界打不開的事故,絕大多數不是格式改了,是停機不乾淨留下的半份存檔。SteamCMD 確實有 download_depot 可以抓指定版本,但你得自己去查 depot ID 和 manifest ID,而且基於上面兩點,抓回來也幾乎沒有用。
還原的順序是:停掉伺服器 → 把現在這個 <WorldID> 資料夾改名搬開、不要刪 → 把備份放回原本的名字 → 啟動。世界能開之後,搬開的那份再觀察幾天才清掉。
Windows 與 Linux 的差別
只有指令和工具不同,順序完全一樣。
| Linux | Windows | |
|---|---|---|
| 停止 | sudo systemctl stop palworld | 先用 REST 介面公告與存檔,再 Stop-Process -Name PalServer-Win64-Shipping |
| 更新 | steamcmd +force_install_dir /home/palserver/palworld +login anonymous +app_update 2394010 validate +quit | C:\steamcmd\steamcmd.exe +force_install_dir C:\palworld-server +login anonymous +app_update 2394010 validate +quit |
| 存檔位置 | /home/palserver/palworld/Pal/Saved/SaveGames/0/ | C:\palworld-server\Pal\Saved\SaveGames\0\ |
| 開著就更新會怎樣 | 不會被擋,會半成功,所以危險的是這邊 | 檔案被鎖住,SteamCMD 直接失敗 |
| 排程 | systemd 加 cron | 工作排程器 |
Windows 還有一個坑。如果你是從 Steam 用戶端的工具清單裝的伺服器,Steam 可能在伺服器跑著的時候自己把它更新掉,那正好就是製造半份存檔的標準做法。把那個項目的自動更新設定改掉,或者乾脆只用 SteamCMD 管理。
把更新折進每日重啟
反正伺服器每天都得停一次。幻獸帕魯伺服器端有一個至今沒修掉的記憶體洩漏,定時重啟不是選配而是前提(記憶體洩漏與定時重啟)。既然都要停,讓它每次啟動前先對一次版本,額外代價基本是零:
# palworld.service 的 [Service] 段裡加這兩行
TimeoutStartSec=30min
ExecStartPre=/usr/games/steamcmd +force_install_dir /home/palserver/palworld +login anonymous +app_update 2394010 validate +quit
凌晨那次重啟就順便變成了版本檢查。官方發版那天早上伺服器已經是新版本;沒發版的日子,validate 也要把檔案整個檢查一遍,啟動會多花一兩分鐘。TimeoutStartSec 那一行不能省:Type=simple 下 systemd 預設的 90 秒啟動逾時一樣管著 ExecStartPre,大版本下載超過 90 秒就會被中途砍掉,伺服器根本起不來。至於「每天停一次」這件事本身怎麼排——連同開機自動啟動與當機自動重啟——寫在24 小時不關機:開機自動啟動、當機自動重啟、定時重啟。
但這一行少了一件事:它不會在更新前備份。 所以它必須和「重啟前先跑一次備份」配成一組才算安全。沒有備份的自動更新,是那種跑好幾個月都沒事、出事一次就全丟的做法。
常見問題
幻獸帕魯伺服器要怎麼更新?
順序就是全部:先在遊戲裡發全服公告,用 REST 介面強制存檔,停掉伺服器程式,把世界資料夾整包備份起來,再跑 sudo -u palserver steamcmd +force_install_dir /home/palserver/palworld +login anonymous +app_update 2394010 validate +quit,最後重新啟動。+force_install_dir 要指向安裝目錄,而且放在 +login 前面;少了它,SteamCMD 會在別的地方另外下載一份,伺服器還是舊版本。不要在跑著的伺服器上直接覆蓋,備份是在更新之前做而不是之後。
更新會不會弄丟存檔?
照正確順序做不會。更新只換伺服器端的程式檔案,不會動 Pal/Saved/SaveGames/ 裡的東西。真正危險的不是更新本身,是在存檔寫到一半時把程式砍掉。守住強制存檔 → 停止 → 更新這個順序,並且在那之前把世界資料夾整包複製一份。
更新後連不上伺服器是為什麼?
如果是全部人同時進不去,幾乎都是版本差。可能是伺服器還留在舊版本,也可能反過來——伺服器更新了,某個人的 Steam 還沒把用戶端更新上去。比對伺服器啟動日誌裡的版本和遊戲主選單角落的版本,先看清楚是哪一邊落後。只有一兩個人連不上的話,那是位址或連接埠的問題,不是版本。
幻獸帕魯專用伺服器會自動更新嗎?
預設不會。Steam 只幫你更新用戶端,伺服器端原封不動。你可以在 systemd 的 ExecStartPre 加一行 SteamCMD,讓它每次啟動都檢查一次(記得把 TimeoutStartSec 調長,免得大版本下載被砍掉);但光這樣是「更新前沒有備份」的自動更新。要無人值守地跑,備份必須在同一條流程裡。
託管上,更新只要點一下
上面沒有哪一步特別難。難的是每次官方發版都要有人正好注意到。《幻獸帕魯》發版很勤,多半落在平常上班上課的時間,而開服的那個人通常正在上班上課。於是問題總是在晚上、大家準備要一起開玩的那一刻才被發現,然後從備份到更新又要再花一段時間。
KeepWorlds 的《幻獸帕魯》專用伺服器替你盯著版本。版本守衛會在上游發了新版本時自動偵測,並在會員中心的伺服器頁面提示;點一下「立即更新」,剩下的照順序跑完:先備份存檔,再更新、恢復執行。什麼時候停機由你決定,不會在大家玩到一半時被切斷。停機之前會先在遊戲裡發全服公告,走完倒數計時、強制存檔,再關伺服器,所以線上的人不會丟進度。備份按時間點列在會員中心的我的伺服器裡,想回到哪個時間點就挑哪一個還原。