Move the complete world data, keep the old destination recoverable, and make the server's -world and -savedir point at the imported copy. Copying whichever two files an old tutorial mentions is no longer a reliable Valheim 1.0 migration.
This walkthrough targets a PC world and the Linux service from our Valheim setup guide: account valheim, launcher /srv/valheim/start.sh, explicit save root /srv/valheim/data. It assumes one server process uses that root. Sources were checked on October 17, 2026. Adapt paths before running commands on a different installation.
Identify the format before choosing files#
Iron Gate's 1.0 release announcement confirms the September 9 release. The developer's detailed Steam notes describe the new save system as splitting world data across chunks.
A legacy, unconverted world uses its matching .db and .fwl files. That pair is a historical format boundary, not the current universal export recipe. A world saved in the new system has additional files: preserve its complete directory structure and all constituent data. Do not choose only files with familiar extensions or combine pieces from different backup generations.
This guide transfers the entire worlds_local directory into private staging. That avoids depending on an incomplete hand-maintained list of the current format's files. It can include other local worlds, so treat the upload as private and account for its size. The explicit world selector determines which one the server loads. Character saves are separate and do not need to be uploaded for players to bring their existing characters.
Materialize a cloud world and close the game#
At the world selection screen, open Manage Saves → Worlds, choose the intended world and use Move to Local if it is stored in the cloud. Wait for completion, then quit Valheim. Iron Gate's cloud-save guidance explains that dedicated servers use local saves; merely disabling Steam Cloud is not an export.
For a Windows PC, open %USERPROFILE%\AppData\LocalLow\IronGate\Valheim\worlds_local. For a native Linux client, start at ~/.config/unity3d/IronGate/Valheim/worlds_local. Check the world in the game before exporting and record its exact name and a recognizable settlement or landmark. Preserve an independent copy of the closed game's directory on the PC.
If your world exists only on a console, first establish a supported way to obtain a local PC copy for that platform/account. This article does not provide direct console filesystem access. Do not substitute a random cloud file downloaded from another account.
Establish the destination and stop it cleanly#
On the VPS, inspect the service and launcher:
sudo systemctl cat valheim
sudo systemctl show valheim -p User -p Environment -p ExecStart
sudo -u valheim test -r /srv/valheim/start.sh
sudo df -h /srv/valheim /var/backups
Confirm the launcher uses -savedir /srv/valheim/data and check its existing -world value. Without an explicit override, the save location follows the service account's home, not necessarily your SSH account. A container may use a mounted volume instead: identify that real storage before proceeding.
Keep enough free space for the incoming tree, the old data, a backup archive and any conversion. Then stop the service and verify shutdown:
sudo systemctl stop valheim
sudo systemctl show valheim -p MainPID -p SubState
sudo journalctl -u valheim -n 80 --no-pager
Continue only after MainPID=0, an inactive service and completed shutdown in the log. The setup unit requests graceful SIGINT; if shutdown times out or another writer remains, resolve it before copying. Keep players out of the source world too until the migration is accepted.
Back up and stage the complete transfer#
On the VPS, create a private archive of the current destination and launcher. Run this block together; an error stops it:
(
set -e
test ! -e "$HOME/valheim-import"
test ! -L "$HOME/valheim-import"
test "$(sudo systemctl show valheim -p ActiveState --value)" = inactive
test "$(sudo systemctl show valheim -p MainPID --value)" = 0
sudo install -d -o root -g root -m 700 /var/backups/valheim
valheim_archive=$(sudo mktemp /var/backups/valheim/pre-import-XXXXXXXX.tar.gz)
sudo tar -czf "$valheim_archive" -C /srv/valheim data start.sh
sudo tar -tzf "$valheim_archive" >/dev/null
install -d -m 700 "$HOME/valheim-import"
printf '%s\n' "$valheim_archive"
)
The staging path must be new. If it already exists, choose another path consistently rather than merging into it. The installation block also rejects symlinks and special files; use an independent regular-file export.
Using SFTP under your normal SSH login, upload the PC's whole worlds_local directory into valheim-import in that account's home. The resulting path must be ~/valheim-import/worlds_local, not a second nested worlds_local/worlds_local. Compare file counts, sizes and, preferably, SHA-256 manifests generated relative to the same directory on both ends. A client reporting a completed transfer does not prove every source file was selected.
For a Linux source PC, generate a content manifest while the game is closed:
cd "$HOME/.config/unity3d/IronGate/Valheim"
find worlds_local -type f -print0 | LC_ALL=C sort -z | xargs -0 -r sha256sum > "$HOME/valheim-worlds.sha256"
Upload that manifest beside the staged folder. On the VPS, verify it before installation:
cd "$HOME/valheim-import"
sha256sum -c valheim-worlds.sha256
For Windows, use your transfer tool's SHA-256 comparison or create a relative-path manifest with a suitable local utility; the Linux command is not a PowerShell recipe. Keep the server stopped if any file is missing or mismatched.
Install the tree and select the intended world#
For this example, the current destination already has worlds_local. The reserved previous-directory name below must not exist; if it does, choose a new name consistently rather than overwriting it:
(
set -e
test -d "$HOME/valheim-import/worlds_local"
python3 - "$HOME/valheim-import/worlds_local" <<'PYTREE'
import sys
from pathlib import Path
root = Path(sys.argv[1])
for item in [root, *root.rglob('*')]:
if item.is_symlink() or not (item.is_file() or item.is_dir()):
raise SystemExit('Use an independent tree of regular files and directories')
PYTREE
sudo test -d /srv/valheim/data/worlds_local
sudo test ! -e /srv/valheim/data/worlds_local.before-import-20261017
sudo mv /srv/valheim/data/worlds_local /srv/valheim/data/worlds_local.before-import-20261017
sudo cp -a "$HOME/valheim-import/worlds_local" /srv/valheim/data/worlds_local
sudo chown -R valheim:valheim /srv/valheim/data/worlds_local
sudo chmod -R u+rwX,go-rwx /srv/valheim/data/worlds_local
sudo -u valheim nano /srv/valheim/start.sh
)
Set -world to the imported world's exact name, retaining -savedir /srv/valheim/data. Preserve the launcher's existing library settings, password and chosen connection backend. Do not confuse the public server -name with the world selector or rename internal chunk files to make them match a server label.
Access lists belong to the server's save root; importing worlds does not require replacing its administrator or permitted-player policy with the PC's settings. Verify those existing policies still admit the test player.
Validate persistence before retiring the old copy#
sudo systemctl start valheim
sudo journalctl -u valheim --since '5 minutes ago' --no-pager
Check the selected world in startup output. Join from a real client and visit the recorded settlement. An empty starting area or unfamiliar world calls for stopping and checking the selector/path, not playing until the expected buildings appear. If crossplay fails before world loading, use the connection guide.
Make a small recognizable change, leave, stop the server cleanly, start it again and rejoin. Confirm the change survived. Preserve the original PC export and pre-import backup until this passes.
For rollback, stop and verify the process again, move the failed imported tree aside, restore the preserved previous worlds_local and launcher, then start and validate. Do not merge old and new chunk files. Restore the matching runtime too if you changed versions; a converted save is not proof of backward compatibility. Iron Gate's conversion incident notes also explain why restoring an older world snapshot discards later world progress.




