From f9a2ddd2aff90161b92784eb34aba7e9f38b708e Mon Sep 17 00:00:00 2001 From: Nathan Fant Date: Tue, 28 Jul 2026 07:44:47 -0500 Subject: [PATCH 1/2] Handle WorldOption.sav blocking settings on Windows->Linux migration A WorldOption.sav carried over from a save that was ever played on Windows takes priority over PalWorldSettings.ini and silently prevents the new server's settings -- including AdminPassword -- from applying. This causes RCON/REST API authentication to fail with "AdminPassword is empty" even when the password is correctly configured everywhere else (container env, generated PalWorldSettings.ini, etc.), as reported in #886. - migrate.sh now moves aside (not deletes) any pre-existing WorldOption.sav in the migrated save automatically. - README.md documents the same step for manual migrations, and adds a callout explaining why this matters before the script instructions. Verified against a real, production migration: same symptom (RCON and REST API both rejecting a verified-correct AdminPassword with "empty" errors) reproduced on two different hosts, persisted across container restarts and even with config regeneration disabled entirely (ruling out a regeneration race), and was resolved immediately by moving WorldOption.sav aside -- confirmed via the server's own logs showing RCON commands actually executing afterward. Closes #886 --- migration/README.md | 17 ++++++++++++++++- migration/migrate.sh | 10 ++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/migration/README.md b/migration/README.md index 19e9ca44d..063bfe1ba 100644 --- a/migration/README.md +++ b/migration/README.md @@ -7,6 +7,16 @@ > > Please make sure you always have a backup! +> [!IMPORTANT] +> If you're migrating a save that was ever played on Windows (including via Steam's +> "host from save data" co-op mode), that save's `WorldOption.sav` takes priority over +> `PalWorldSettings.ini` and will silently prevent your new server's settings — +> including `AdminPassword` — from applying. This causes RCON/REST API authentication +> to fail with "AdminPassword is empty" even when the password is correctly configured +> everywhere else (see #886). `migrate.sh` (below) handles this automatically by moving +> any pre-existing `WorldOption.sav` aside; if you migrate manually, do the same +> yourself (see step 3 in "Manually" below). + 1. Find a directory which is named by game server name and contains all saved game data, usually it will at `~/Steam/steamapps/common/PalServer/Pal/Saved/SaveGames/0/` 2. Make sure `migration/migrate.sh`, saved game data directory and mounted volume @@ -44,4 +54,9 @@ DedicatedServerName=`2E85FD38BAA792EB1D4C09386F3A3CDA`. 3. Delete the entire new server save at `PalServer\Pal\Saved\SaveGames\0\`, and replace it with the folder from the old server. -4. Restart the new server +4. If the copied save folder contains a `WorldOption.sav` file and the save was ever played on + Windows, move (don't delete outright — keep it as a backup) that file out of the way, e.g. + `mv WorldOption.sav WorldOption.sav.bak`. Otherwise it takes priority over + `PalWorldSettings.ini` and silently blocks your new server's settings (including + `AdminPassword`) from applying — see #886. +5. Restart the new server diff --git a/migration/migrate.sh b/migration/migrate.sh index 599e4aff1..cf088eecb 100644 --- a/migration/migrate.sh +++ b/migration/migrate.sh @@ -21,6 +21,16 @@ docker stop "${CONTAINER_ID}" cp -r ./"${MIGRATION_SERVER_NAME}" ./palworld/Pal/Saved/SaveGames/0/"${MIGRATION_SERVER_NAME}"/ +# A WorldOption.sav carried over from a save that was ever played on Windows takes +# priority over PalWorldSettings.ini and silently blocks the new server's settings +# (including AdminPassword) from applying -- see #886. Move it aside rather than +# deleting it outright, so it's still recoverable if needed. +WORLD_OPTION_SAV="./palworld/Pal/Saved/SaveGames/0/${MIGRATION_SERVER_NAME}/WorldOption.sav" +if [ -f "${WORLD_OPTION_SAV}" ]; then + echo "########## MOVING ASIDE WorldOption.sav (see #886) ##########" + mv "${WORLD_OPTION_SAV}" "${WORLD_OPTION_SAV}.bak" +fi + sed -i "s/DedicatedServerName=.*/DedicatedServerName=${MIGRATION_SERVER_NAME}/" ./palworld/Pal/Saved/Config/LinuxServer/GameUserSettings.ini echo "########## STARTING CONTAINER ${CONTAINER_NAME} NOW ##########" From fe8a5fdd867ed6830653e07692a8b3cb959ffbb2 Mon Sep 17 00:00:00 2001 From: Nathan Fant Date: Tue, 25 Aug 2026 21:45:16 -0500 Subject: [PATCH 2/2] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- migration/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migration/README.md b/migration/README.md index 063bfe1ba..2c6fc9797 100644 --- a/migration/README.md +++ b/migration/README.md @@ -15,7 +15,7 @@ > to fail with "AdminPassword is empty" even when the password is correctly configured > everywhere else (see #886). `migrate.sh` (below) handles this automatically by moving > any pre-existing `WorldOption.sav` aside; if you migrate manually, do the same -> yourself (see step 3 in "Manually" below). +> yourself (see step 4 in "Manually" below). 1. Find a directory which is named by game server name and contains all saved game data, usually it will at `~/Steam/steamapps/common/PalServer/Pal/Saved/SaveGames/0/`