Production-ready Palworld dedicated server in Docker, with SteamCMD updates, ARM64 support through FEX, automatic backups, health monitoring, idle restart, and optional Discord notifications.
- ARM64 images for Apple Silicon, Raspberry Pi-class systems, and ARM cloud instances.
- SteamCMD installation, validation, and update handling.
- Environment-variable configuration for all settings generated in
PalWorldSettings.iniand the project's generatedEngine.iniperformance section. - Automatic backups with retention by day, week, and month.
- Health checks, metrics, an optional dashboard, and configurable idle restart.
- Optional REST API, RCON, and localized Discord notifications in Korean, English, or Japanese.
Create the environment file first:
cp .env.palworld.example .env.palworld
# Set ADMIN_PASSWORD in .env.palworld.
docker compose --env-file .env.palworld up -d.env.palworld is consumed by the container. Do not commit this copied file;
it contains passwords, webhook URLs, and other private values.
The default Compose port bindings are:
| Service | Host binding | Protocol | Purpose |
|---|---|---|---|
| Palworld | 8211 |
UDP | Game traffic |
| Steam query | 27018 |
UDP | Server browser/query traffic |
| REST API | 127.0.0.1:8212 |
TCP | Palworld administration API |
RCON uses port 25575 inside the server container. The provided Compose file
does not publish it; publish it only to a trusted local interface or private
network when RCON access is needed. If you change REST_API_PORT or
SERVER_PORT, Compose uses the new values for its port mappings. The query
port is likewise controlled by QUERY_PORT.
The persistent directories created by Compose are:
| Host directory | Container path | Contents |
|---|---|---|
./palworld_data |
/home/steam/palworld_server/Pal/Saved |
World and player data |
./palworld_backups |
/home/steam/backups |
Automatic backups |
./palworld_logs |
/home/steam/logs |
Server and manager logs |
For a server-only container, provide at least ADMIN_PASSWORD and a persistent
server volume:
docker run -d \
--name palworld-server \
--restart unless-stopped \
-p 8211:8211/udp \
-p 27018:27018/udp \
-p 127.0.0.1:8212:8212/tcp \
-e ADMIN_PASSWORD=replace-with-a-strong-password \
-v palworld-data:/home/steam/palworld_server \
-v palworld-backups:/home/steam/backups \
supersunho/palworld-server:latestThe REST API and any published RCON port are administrative interfaces. Keep them on localhost or a private network unless they are protected by a firewall, VPN, or authenticated reverse proxy.
-
Copy
.env.palworld.exampleto.env.palworld. -
Set a strong, non-empty
ADMIN_PASSWORDand change any desired values. -
Validate the files and start or recreate the container:
bash scripts/validate_env_files.sh .env.palworld docker compose --env-file .env.palworld up -d --force-recreate
-
Confirm the generated files and logs after startup.
The manager reads config/default.yaml, substitutes environment variables, and
generates the active Palworld files at:
/home/steam/palworld_server/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
/home/steam/palworld_server/Pal/Saved/Config/LinuxServer/Engine.ini
config/DefaultPalWorldSettings.ini and config/DefaultEngine.ini are source
templates and reference files. Editing those files alone does not change an
already-running server. Restart or recreate the container after changing
.env.palworld so the settings generator runs again.
The detailed tables below use the defaults in this project’s
.env.palworld.example and config/default.yaml. They are not guaranteed to
match the defaults in Palworld’s original sample INI and may change as
Palworld or this project is updated. The complete environment file is available
here: .env.palworld.example.
- Boolean values are written as
trueorfalse. The loader also acceptsyes/no,on/off, and1/0, case-insensitively. - Integer and decimal values are converted to numbers before the INI is
generated. Use a decimal for rates and multipliers, such as
1.0. - For most rate and damage multipliers,
1.0is the normal game value. A value above1.0generally increases a rate or amount; a value below1.0generally decreases it. Depletion rates are the exception: a larger value consumes hunger or stamina faster. - This project does not clamp every Palworld value. “Non-negative multiplier” describes the safe practical range where no hard game limit is documented; exact limits can vary by Palworld version.
- Values such as
CROSSPLAY_PLATFORMSandDENY_TECHNOLOGY_LISTare passed as strings. Preserve the syntax expected by the game.
Every variable in the following sections is written to the generated
PalWorldSettings.ini unless explicitly noted otherwise. The tables list the
environment variable, project default, practical/documented range, and effect.
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
SERVER_NAME |
Palworld Server |
Text | Name shown in the server browser and connection UI. |
SERVER_DESCRIPTION |
A Palworld dedicated server |
Text | Description shown in the server browser. |
SERVER_PASSWORD |
empty | Text; empty disables the join password | Password required to join. |
ADMIN_PASSWORD |
required | Non-empty text | Grants admin commands and is also used by RCON. Keep it secret. |
MAX_PLAYERS |
32 |
1–32 |
Manager/Compose-side maximum player validation. |
SERVER_PLAYER_MAX_NUM |
32 |
Positive integer; practical limit depends on the game build | Value written to ServerPlayerMaxNum. |
COOP_PLAYER_MAX_NUM |
4 |
Positive integer | Co-op player limit used by the game. |
SERVER_PORT |
8211 |
1024–65535 |
Game server UDP listening port and Compose mapping. |
PUBLIC_IP |
empty | Public IPv4, hostname, or empty | Explicit address advertised to clients. |
PUBLIC_PORT |
8211 |
1–65535 |
Publicly advertised game port; does not change the local listening port. |
REGION |
empty | Text | Optional region metadata. |
USE_AUTH |
true |
Boolean | Enables server authentication. |
BAN_LIST_URL |
official URL | URL | Remote ban-list URL used by the game. |
CROSSPLAY_PLATFORMS |
(Steam,Xbox,PS5,Mac) |
Parenthesized comma-separated list | Platforms allowed to connect. Keep the surrounding parentheses. |
REST_API_ENABLED |
true |
Boolean | Enables Palworld’s REST API. Keep the API private unless protected. |
REST_API_PORT |
8212 |
1024–65535 |
REST API listening port. |
REST_API_HOST |
localhost |
Hostname/IP | Manager-side REST API connection address. |
RCON_ENABLED |
true |
Boolean | Enables RCON in the generated game settings. |
RCON_PORT |
25575 |
1–65535 |
RCON listening port. |
RCON_HOST |
localhost |
Hostname/IP | Manager-side RCON connection address. |
QUERY_PORT (27018 by default) is the Steam server-query UDP port used by
Compose and the server startup command. It is not a PalWorldSettings.ini
option. SERVER_PORT, REST_API_PORT, and QUERY_PORT are validated by the
manager/health-check path; Compose also uses them when it creates port
mappings.
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
DIFFICULTY |
None |
None, Normal, Difficult |
Selects the game difficulty preset. |
DEATH_PENALTY |
All |
None, Item, ItemAndEquipment, All |
None: no drops; Item: items except equipment; ItemAndEquipment: items and equipment; All: items, equipment, and team Pals. |
HARDCORE |
false |
Boolean | Enables Hardcore mode and its death behavior. |
IS_MULTIPLAY |
true |
Boolean | Enables multiplayer behavior. |
IS_PVP |
false |
Boolean | Enables PvP. Combine with the explicit PvP damage switches when needed. |
RANDOMIZER_TYPE |
None |
None, Region, All |
Pal spawn randomization: disabled, by region, or fully randomized. |
RANDOMIZER_SEED |
empty | Text | Seed used by the randomizer. |
IS_RANDOMIZER_PAL_LEVEL_RANDOM |
false |
Boolean | Randomizes wild Pal levels when randomization is enabled. |
Unless noted otherwise, these are decimal multipliers with a default of 1.0.
| Variable | Default | Effect |
|---|---|---|
DAY_TIME_SPEED_RATE |
1.0 |
Daytime world-clock progression; higher values make daytime pass faster. |
NIGHT_TIME_SPEED_RATE |
1.0 |
Nighttime world-clock progression; higher values make nighttime pass faster. |
EXP_RATE |
1.0 |
Player and Pal experience gain. |
WORK_SPEED_RATE |
1.0 |
Pal work and production speed. |
PAL_CAPTURE_RATE |
1.0 |
Capture success multiplier. |
PAL_SPAWN_NUM_RATE |
1.0 |
Number of wild Pals spawned; higher values increase CPU and replication load. |
PAL_DAMAGE_RATE_ATTACK |
1.0 |
Damage dealt by Pals. |
PAL_DAMAGE_RATE_DEFENSE |
1.0 |
Damage received by Pals. |
PAL_AUTO_HP_REGENE_RATE |
1.0 |
Pal natural HP regeneration. |
PAL_AUTO_HP_REGENE_RATE_IN_SLEEP |
1.0 |
Pal HP regeneration while sleeping in the Palbox. |
PAL_STAMINA_DECREACE_RATE |
1.0 |
Pal stamina depletion; the spelling follows the game’s INI key. |
PAL_STOMACH_DECREACE_RATE |
1.0 |
Pal hunger depletion; the spelling follows the game’s INI key. |
PAL_EGG_DEFAULT_HATCHING_TIME |
72.0 |
Huge Egg incubation time in hours; other egg types use the game’s corresponding incubation behavior. |
PLAYER_DAMAGE_RATE_ATTACK |
1.0 |
Damage dealt by players. |
PLAYER_DAMAGE_RATE_DEFENSE |
1.0 |
Damage received by players. |
PLAYER_AUTO_HP_REGENE_RATE |
1.0 |
Player natural HP regeneration. |
PLAYER_AUTO_HP_REGENE_RATE_IN_SLEEP |
1.0 |
Player HP regeneration while sleeping. |
PLAYER_STAMINA_DECREACE_RATE |
1.0 |
Player stamina depletion. |
PLAYER_STOMACH_DECREACE_RATE |
1.0 |
Player hunger depletion. |
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
ENABLE_PLAYER_TO_PLAYER_DAMAGE |
false |
Boolean | Allows direct player damage. |
ENABLE_FRIENDLY_FIRE |
false |
Boolean | Allows damage to friendly players. |
ENABLE_INVADER_ENEMY |
true |
Boolean | Enables invader enemies. |
ACTIVE_UNKO |
false |
Boolean | Enables the game’s UNKO drop feature. |
ENABLE_AIM_ASSIST_PAD |
true |
Boolean | Enables controller aim assist. |
ENABLE_AIM_ASSIST_KEYBOARD |
false |
Boolean | Enables keyboard aim assist. |
BUILD_OBJECT_HP_RATE |
1.0 |
Non-negative multiplier | Structure HP multiplier. |
BUILD_OBJECT_DAMAGE_RATE |
1.0 |
Non-negative multiplier | Damage dealt to structures. |
BUILD_OBJECT_DETERIORATION_DAMAGE_RATE |
1.0 |
Non-negative multiplier | Structure deterioration/decay speed. |
COLLECTION_DROP_RATE |
1.0 |
Non-negative multiplier | Quantity obtained from gatherable resources. |
COLLECTION_OBJECT_HP_RATE |
1.0 |
Non-negative multiplier | HP of gatherable objects. |
COLLECTION_OBJECT_RESPAWN_SPEED_RATE |
1.0 |
Non-negative multiplier | Gatherable respawn interval; smaller values respawn faster. |
ENEMY_DROP_ITEM_RATE |
1.0 |
Non-negative multiplier | Quantity of items dropped by enemies. |
BUILD_AREA_LIMIT |
false |
Boolean | Restricts building in areas near structures such as fast-travel points. |
MAX_BUILDING_LIMIT_NUM |
0 |
Non-negative integer; 0 means unlimited |
Per-player building count cap. |
BASE_CAMP_MAX_NUM |
128 |
Non-negative integer | Total base-camp count across the server. |
BASE_CAMP_MAX_NUM_IN_GUILD |
4 |
Documented default 4, maximum 10 |
Maximum bases per guild; increasing it raises processing load. |
BASE_CAMP_WORKER_MAX_NUM |
15 |
Documented maximum 50 |
Maximum Pals working at each base; increasing it raises processing load. Some Palworld versions have a game-side bug where this has no effect. |
GUILD_PLAYER_MAX_NUM |
20 |
Positive integer | Maximum guild members. |
AUTO_RESET_GUILD_NO_ONLINE_PLAYERS |
false |
Boolean | Deletes guild structures and base Pals when no guild members log in. |
AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS |
72.0 |
Non-negative hours | Offline duration before automatic guild reset; ignored when the switch is false. |
DROP_ITEM_MAX_NUM |
3000 |
Non-negative integer | Maximum ordinary dropped items in the world. |
DROP_ITEM_MAX_NUM_UNKO |
100 |
Non-negative integer | Maximum UNKO drops in the world. |
PHYSICS_ACTIVE_DROP_ITEM_MAX_NUM |
-1 |
Integer; -1 follows game default behavior |
Maximum active physics drops. |
DROP_ITEM_ALIVE_MAX_HOURS |
1.0 |
Non-negative hours | Time before dropped items despawn. |
ITEM_WEIGHT_RATE |
1.0 |
Non-negative multiplier | Item weight multiplier. |
EQUIPMENT_DURABILITY_DAMAGE_RATE |
1.0 |
Non-negative multiplier | Equipment durability loss multiplier. |
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP |
false |
Boolean | Allows another guild to pick up death-penalty drops. |
ALLOW_CLIENT_MOD |
true |
Boolean | Allows clients with mods to join. Use only when the server’s trust model permits it. |
ENABLE_NON_LOGIN_PENALTY |
true |
Boolean | Enables the non-login penalty mechanic. |
ENABLE_FAST_TRAVEL |
true |
Boolean | Enables fast travel. |
ENABLE_FAST_TRAVEL_ONLY_BASE_CAMP |
false |
Boolean | Restricts fast travel to base-camp travel points. |
IS_START_LOCATION_SELECT_BY_MAP |
true |
Boolean | Allows selecting the starting location on the map. |
EXIST_PLAYER_AFTER_LOGOUT |
false |
Boolean | Leaves a sleeping player at the logout location instead of removing them. |
ENABLE_DEFENSE_OTHER_GUILD_PLAYER |
false |
Boolean | Enables defense against players from another guild. |
INVISIBLE_OTHER_GUILD_BASE_CAMP_AREA_FX |
false |
Boolean | Controls visibility of other-guild base-area boundary effects. |
AUTO_SAVE_SPAN |
30.0 |
Non-negative seconds | Interval between automatic saves. |
IS_USE_BACKUP_SAVE_DATA |
true |
Boolean | Enables the game’s backup save data; increases disk usage. |
SHOW_PLAYER_LIST |
false |
Boolean | Shows the player list in the ESC menu. |
CHAT_POST_LIMIT_PER_MINUTE |
30 |
Non-negative integer | Maximum chat messages per player per minute. |
PAL_LOST |
false |
Boolean | Permanently loses Pals on death. |
CHARACTER_RECREATE_IN_HARDCORE |
false |
Boolean | Allows character recreation after death in Hardcore mode. |
ALLOW_GLOBAL_PALBOX_EXPORT |
true |
Boolean | Allows saving to the Global Palbox. |
ALLOW_GLOBAL_PALBOX_IMPORT |
false |
Boolean | Allows loading from the Global Palbox. |
LOG_FORMAT_TYPE |
Text |
Text or Json |
Palworld server log format. |
ENABLE_PREDATOR_BOSS_PAL |
true |
Boolean | Enables Predator boss Pals. |
SUPPLY_DROP_SPAN |
180 |
Non-negative minutes | Meteorite/supply-drop interval. |
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
SERVER_REPLICATE_PAWN_CULL_DISTANCE |
15000.0 |
Documented 5000–15000 cm |
Distance at which Pal/actor replication is culled; larger values increase replication load. |
ITEM_CONTAINER_FORCE_MARK_DIRTY_INTERVAL |
1.0 |
Non-negative seconds | How often an open item container is force-synchronized. |
ITEM_CORRUPTION_MULTIPLIER |
1.0 |
Non-negative multiplier | Item corruption speed. |
MONSTER_FARM_ACTION_SPEED_RATE |
1.0 |
Non-negative multiplier | Production speed from grazing/monster farms. |
PLAYER_DATA_STORAGE_UPDATE_CHECK_INTERVAL |
1.0 |
Non-negative seconds | Interval between checks for updates to Pal storage data. |
DENY_TECHNOLOGY_LIST |
empty | Technology ID list/string | Disables named technologies; follow the game’s list syntax. |
GUILD_REJOIN_COOLDOWN_MINUTES |
0 |
Non-negative minutes | Guild rejoin cooldown. |
AUTO_TRANSFER_MASTER_CHECK_INTERVAL |
3600 |
Non-negative seconds | Interval for checking whether guild leadership should transfer. |
AUTO_TRANSFER_MASTER_THRESHOLD_DAYS |
14 |
Non-negative days | Inactivity period before guild-master transfer. |
MAX_GUILDS_PER_FRAME |
10 |
Positive integer | Maximum guilds processed per server frame; higher values can increase frame work. |
BUILDING_NAME_DISPLAY_CACHE_TTL |
60 |
Non-negative seconds | Cache lifetime for building-name display data. |
ENABLE_BUILDING_PLAYER_UID_DISPLAY |
false |
Boolean | Shows the creator’s player ID on structures. |
SHOW_JOIN_LEFT_MESSAGE |
true |
Boolean | Shows join/leave messages in the dedicated server. |
ALLOW_ENHANCE_STAT_HEALTH |
true |
Boolean | Allows enhancement of Health stat. |
ALLOW_ENHANCE_STAT_ATTACK |
true |
Boolean | Allows enhancement of Attack stat. |
ALLOW_ENHANCE_STAT_STAMINA |
true |
Boolean | Allows enhancement of Stamina stat. |
ALLOW_ENHANCE_STAT_WEIGHT |
true |
Boolean | Allows enhancement of Weight stat. |
ALLOW_ENHANCE_STAT_WORK_SPEED |
true |
Boolean | Allows enhancement of Work Speed stat. |
DISPLAY_PVP_ITEM_ON_MAP_BASE_CAMP |
false |
Boolean | Shows PvP-only item counts at bases on the world map. |
DISPLAY_PVP_ITEM_ON_MAP_PLAYER |
false |
Boolean | Shows player locations and PvP-only item counts on the map. |
ENABLE_VOICE_CHAT |
false |
Boolean | Enables in-game voice chat. |
VOICE_CHAT_MAX_DISTANCE |
3000 |
Non-negative distance units | Distance at which voice volume is no longer attenuated. |
VOICE_CHAT_ZERO_DISTANCE |
15000 |
Non-negative distance units | Distance at which voice volume reaches zero. |
ENABLE_ADDITIONAL_PVP_DROP_ITEM |
false |
Boolean | Enables an extra item drop when a player is killed in PvP. |
ADDITIONAL_PVP_DROP_ITEM_ID |
PlayerDropItem |
Item ID string | Item dropped when the preceding switch is enabled. |
ADDITIONAL_PVP_DROP_ITEM_NUM |
1 |
Positive integer | Quantity of the additional PvP drop. |
BLOCK_RESPAWN_TIME |
5 |
Non-negative seconds | Cooldown before respawning after death. |
RESPAWN_PENALTY_DURATION_THRESHOLD |
0 |
Non-negative seconds | Survival-time threshold for applying the respawn penalty scale after a later death. |
RESPAWN_PENALTY_TIME_SCALE |
2.0 |
Non-negative multiplier | Multiplier applied to the respawn cooldown. |
The repository’s config/DefaultEngine.ini contains the base Unreal content
paths. The generator preserves that content and appends the performance values
below to the active Engine.ini. These are the 13 ENGINE_* variables in
.env.palworld.example.
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
ENGINE_LAN_TICK_RATE |
120 |
Positive integer | Maximum network update tick rate for LAN connections. |
ENGINE_NET_TICK_RATE |
120 |
Positive integer | Maximum network update tick rate for online connections. |
ENGINE_INTERNET_SPEED |
104857600 |
Positive integer; bytes/second in this project | Configured Internet client bandwidth limit, not guaranteed throughput. |
ENGINE_LAN_SPEED |
104857600 |
Positive integer; bytes/second in this project | Configured LAN client bandwidth limit. |
ENGINE_MAX_CLIENT_RATE |
104857600 |
Positive integer; bytes/second in this project | Maximum client transfer rate. |
ENGINE_MAX_INTERNET_CLIENT_RATE |
104857600 |
Positive integer; bytes/second in this project | Maximum Internet client transfer rate. |
ENGINE_SMOOTH_FRAME_RATE |
true |
Boolean | Enables Unreal frame-rate smoothing. |
ENGINE_USE_FIXED_FRAME_RATE |
false |
Boolean | Uses the fixed frame-rate value when enabled. |
ENGINE_MIN_FRAME_RATE |
60.0 |
Non-negative FPS | Minimum desired frame rate. |
ENGINE_FIXED_FRAME_RATE |
120.0 |
Positive FPS | Fixed frame rate used when fixed-rate mode is enabled. |
ENGINE_CLIENT_TICKS |
120 |
Positive integer | Client network ticks per second. |
ENGINE_FRAME_RATE_LOWER |
30.0 |
Non-negative FPS; below upper bound | Lower edge of the smoothing range. |
ENGINE_FRAME_RATE_UPPER |
120.0 |
Positive FPS; above lower bound | Upper edge of the smoothing range. |
Higher tick rates and bandwidth ceilings can improve responsiveness on a
well-provisioned host, but they also consume more CPU and network capacity.
Tune them with MAX_PLAYERS, PAL_SPAWN_NUM_RATE, and
SERVER_REPLICATE_PAWN_CULL_DISTANCE. Keep the smoothing lower bound below the
upper bound; both values are written into Unreal’s SmoothedFrameRateRange
structure.
The variables in this section configure the image’s manager layer, not
PalWorldSettings.ini.
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
PUID |
1000 |
Positive integer; 0 is not accepted for remapping |
UID used by the container’s steam user. Match the owner of bind-mounted files when needed. |
PGID |
1000 |
Positive integer; 0 is not accepted for remapping |
GID used by the container’s steam user. |
USE_PERFORMANCE_THREADS |
true |
Boolean | Enables the server’s performance-thread startup option. |
DISABLE_ASYNC_LOADING |
true |
Boolean | Disables asynchronous loading according to the image’s startup configuration. |
USE_MULTITHREAD_FOR_DS |
true |
Boolean | Enables the dedicated-server multithreading startup option. |
WORKER_THREADS_COUNT |
0 |
Non-negative integer; 0 lets the server choose |
Number of worker threads passed at startup. |
ADDITIONAL_SERVER_OPTIONS |
empty | Space-separated option string | Extra command-line arguments for the server process. Verify arguments against the current Palworld version. |
ENABLE_PUBLIC_LOBBY |
false |
Boolean | Enables the public-lobby startup option. |
LOG_FORMAT |
text |
text or json |
Format emitted by the manager/application logs. |
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
MONITORING_MODE |
logs |
logs, prometheus, or both |
Selects log monitoring, Prometheus metrics, or both. |
METRICS_INTERVAL |
60 |
Positive seconds | Metrics collection interval. |
ENABLE_DASHBOARD |
true |
Boolean | Enables the manager dashboard. |
DASHBOARD_PORT |
8080 |
1–65535 |
Manager dashboard port. |
LOG_LEVEL |
INFO |
DEBUG, INFO, WARNING, or ERROR |
Manager log verbosity. |
LOG_FORMAT_STYLE |
simple |
Supported logging style | Manager log presentation style. |
IDLE_RESTART_ENABLED |
true |
Boolean | Restarts the server after the configured no-player period. |
IDLE_RESTART_MINUTES |
30 |
Positive minutes | No-player period before an idle restart. |
Idle restart is useful for small or personal servers, but it interrupts any
background activity that occurs while no players are connected. Set
DISCORD_EVENT_IDLE_RESTART=true if you want a notification when it happens.
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
BACKUP_ENABLED |
true |
Boolean | Enables automatic backups. |
BACKUP_INTERVAL |
3600 |
Positive seconds | Time between backups. |
BACKUP_RETENTION_DAYS |
7 |
Non-negative days | Daily backup retention period. |
BACKUP_RETENTION_WEEKS |
4 |
Non-negative weeks | Weekly backup retention period. |
BACKUP_RETENTION_MONTHS |
6 |
Non-negative months | Monthly backup retention period. |
BACKUP_COMPRESS |
true |
Boolean | Compresses backup archives. |
BACKUP_MAX_COUNT |
100 |
Non-negative integer | Maximum number of backup archives retained by the manager. |
BACKUP_CLEANUP_INTERVAL |
86400 |
Positive seconds | How often expired backups are removed. |
Backups are stored under /home/steam/backups by default. They are not a
substitute for an off-host backup: copy important archives to another disk or
object-storage provider. Back up the world before changing death penalties,
Hardcore/PAL loss, randomization, Global Palbox, or guild-reset settings.
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
DISCORD_ENABLED |
false |
Boolean | Enables Discord notifications. |
DISCORD_WEBHOOK_URL |
empty | Discord webhook URL | Destination webhook; required when notifications are enabled. |
DISCORD_MENTION_ROLE |
empty | Role ID or mention string | Optional role to mention in notifications. |
DISCORD_EVENT_START |
true |
Boolean | Notify when the server starts. |
DISCORD_EVENT_STOP |
true |
Boolean | Notify when the server stops. |
DISCORD_EVENT_JOIN |
true |
Boolean | Notify when a player joins. |
DISCORD_EVENT_LEAVE |
true |
Boolean | Notify when a player leaves. |
DISCORD_EVENT_BACKUP |
true |
Boolean | Notify when a backup completes. |
DISCORD_EVENT_ERRORS |
true |
Boolean | Notify on manager errors. |
DISCORD_EVENT_IDLE_RESTART |
true |
Boolean | Notify before or after an idle restart. |
LANGUAGE |
ko |
ko, en, or ja |
Language used by Discord notifications. |
| Variable | Default | Allowed value / range | Effect |
|---|---|---|---|
SERVER_DIR |
/home/steam/palworld_server |
Container path | Root directory for the dedicated server. |
BACKUP_DIR |
/home/steam/backups |
Container path | Backup destination. |
LOG_DIR |
/home/steam/logs |
Container path | Manager and server log destination. |
STEAMCMD_DIR |
/home/steam/steamcmd |
Container path | SteamCMD installation directory. |
STEAMCMD_APP_ID |
2394010 |
Steam App ID integer | App ID used by SteamCMD to install/update Palworld. |
STEAMCMD_VALIDATE |
true |
Boolean | Validates installed files during SteamCMD operations. |
CHECK_VERSION_UPDATE |
true |
Boolean | Checks periodically for a newer Palworld server version and reports it without automatically restarting an active server. |
UPDATE_ON_START |
true |
Boolean | Checks for an update during container startup. |
DISCORD_EVENT_UPDATE (true by default) controls whether update detections
are sent to Discord. When an update is found during runtime, the manager can
also notify players through RCON; it does not restart the server automatically.
The manager can use the Palworld REST API and RCON for monitoring and administration. Example local calls are:
curl http://localhost:8212/v1/api/info
curl http://localhost:8212/v1/api/players
curl http://localhost:8212/v1/api/settings
rcon-cli --host localhost --port 25575 \
--password "$ADMIN_PASSWORD" ShowPlayers
rcon-cli --host localhost --port 25575 \
--password "$ADMIN_PASSWORD" "Broadcast Hello!"Do not expose these interfaces directly to the public internet. Use a strong
ADMIN_PASSWORD, bind ports to localhost/private interfaces, and use a
firewall or VPN for remote administration.
Palworld’s active settings file is the copy under
Pal/Saved/Config/LinuxServer/, not the repository template. In addition,
some world settings can be overridden by WorldOption.sav. If a changed value
does not take effect, stop the server, back up the world, and check whether the
world-option save needs to be removed or regenerated for the Palworld version
in use.
Check the container health status and recent logs with:
docker ps
docker inspect --format '{{.State.Health.Status}}' palworld-server
docker logs --tail 100 palworld-serverThe bundled health check can also be invoked directly in the container:
docker exec palworld-server python /app/scripts/healthcheck.pyOn ARM64, the image uses FEX to run the x86_64 Palworld server. The container enables the relevant FEX settings automatically, including JIT caching, lazy memory deletion, and static register allocation. FEX generally has lower overhead than QEMU for this workload, but actual performance depends on the host CPU, memory, storage, and Palworld version.
Plan resources around the actual workload rather than the player count alone: Pal spawn rate, replication distance, base worker count, tick rates, and build activity can all affect CPU and memory use.
| Concurrent players | Suggested CPU | Suggested RAM | Suggested storage |
|---|---|---|---|
| 1–8 | 2 cores | 2 GB | 10 GB |
| 9–16 | 4 cores | 4 GB | 15 GB |
| 17–24 | 6 cores | 6 GB | 20 GB |
| 25–32 | 8 cores | 8 GB | 25 GB |
These are starting points, not guarantees. Monitor the server under real player load and leave headroom for the host OS, backups, and monitoring services.
Common ARM64 cloud options include AWS Graviton (c7g, m7g), Oracle Cloud
Ampere A1, Hetzner CAX, and Scaleway ARM64 instances.
git clone https://github.com/supersunho/docker-palworld-server.git
cd docker-palworld-server
# Native build
docker build -t palworld-server .
# Explicit ARM64 build
docker buildx build --platform linux/arm64 -t palworld-server .The normal interface is .env.palworld. For development or advanced image
customization, a replacement YAML file can be mounted at the path read by the
application:
docker run -d \
-v ./my-config.yaml:/app/config/default.yaml:ro \
-v palworld-data:/home/steam/palworld_server \
supersunho/palworld-server:latestKeep the YAML structure compatible with the repository’s
config/default.yaml. A custom file can bypass the
documented environment defaults, so review it after image updates.
docker run -it --rm \
-v "$(pwd):/app" \
-p 8211:8211/udp \
supersunho/palworld-server:latest bash- Palworld Server Guide — Configuration parameters
- Palworld Server Guide — Configure the server
- Unreal Engine — Configuration Files
- Unreal Engine — Avoiding Hitches in Networking
MIT License. See the repository for the complete license text.