RE:NODE

Minecraft11 min read

Bedrock Dedicated Server setup and add-ons

Run Minecraft Bedrock Dedicated Server: installing it, every server.properties key that matters, port 19132, allowlist and permissions, add-ons, backups and consoles.

0 readers

Bedrock Dedicated Server (BDS) is Mojang's own server for Minecraft Bedrock Edition - the version on Windows, phones, Xbox, PlayStation and Switch. It is a free download for Windows and Ubuntu Linux, has no plugin API, is configured through a server.properties file that shares a name but little else with Java's, and listens on UDP port 19132. Download it, unzip it, set the world name, game mode and allowlist, open the port, run bedrock_server. Two things to know before you start: console players cannot type in a server address without a workaround, and anything beyond vanilla comes from add-ons (behaviour and resource packs), not plugins.

If you are still deciding between Bedrock and Java, read Bedrock vs Java hosting first - for mixed groups, a Java server with Geyser is often the better answer. This post assumes you want BDS itself.

What BDS is, and what it is not#

BDS is the same game engine as the Bedrock client, packaged as a headless server. It runs the official game exactly, in sync with the client version, and is the reference for how Bedrock multiplayer should behave.

What it does not have:

  • A plugin API. No Bukkit, no Paper, no Spigot equivalents. Customisation is through add-ons, which are data-driven packs and JavaScript via Mojang's Script API.
  • RCON or a query protocol you can rely on. Administration is the server console and operator commands typed in game.
  • Version tolerance. Clients must be on the same version as the server. When a phone updates on Tuesday and the server has not, that phone cannot join until the server catches up.
  • Official support for Mac or other Linux distributions. It is built for Windows and Ubuntu. Other modern Linux distributions usually run it, but that is not guaranteed.

Third-party Bedrock servers exist that do offer plugin APIs - PocketMine-MP, Nukkit-family servers - but they are reimplementations of the game, not BDS, and they lag behind and differ from vanilla in many details. There are also projects that add a plugin layer on top of BDS itself, such as Endstone and LeviLamina. They are worth knowing about; they are also another moving part that breaks on every Bedrock update.

Requirements and resource usage#

BDS is lighter than a Java server for the same player count, mainly because it is written in C++ rather than running on a JVM with its heap overhead. It still scales with view distance, entities and loaded area.

PlayersRAMCPUNotes
1-51-2 GB1 coreA family or a few friends
5-152-4 GB2 coresKeep view-distance modest
15-304-6 GB2-3 corestick-distance and entities matter
30+6 GB+3+ coresLarge builds and farms dominate

Disk: the server install is a few hundred megabytes; worlds grow with exploration and are usually a few hundred megabytes to a few gigabytes. BDS uses more than one thread (max-threads controls the worker pool), but the world simulation still favours fast single cores, as covered in CPU vs RAM for game servers.

Installing and first start#

Download the Windows or Ubuntu zip from the official Bedrock server download page on minecraft.net. Accepting the licence terms is part of the download. Unzip it into an empty folder.

On Linux:

bash
$ mkdir ~/bedrock && cd ~/bedrock$ unzip ~/Downloads/bedrock-server-*.zip$ LD_LIBRARY_PATH=. ./bedrock_server

LD_LIBRARY_PATH=. tells the server to load the libraries shipped in its own folder. On Windows, run bedrock_server.exe.

The first start creates the world named in level-name and prints:

code
[INFO] Starting Server[INFO] Version: 1.21.x[INFO] Level Name: Bedrock level[INFO] IPv4 supported, port: 19132: Used for gameplay and LAN discovery[INFO] IPv6 supported, port: 19133: Used for gameplay[INFO] Server started.

The folder layout after a first start:

PathWhat it is
server.propertiesAll server settings
allowlist.jsonPlayers allowed to join, when the allowlist is on
permissions.jsonOperator and member levels, by XUID
worlds/<level-name>/The world: db/, level.dat, levelname.txt, pack lists
behavior_packs/, resource_packs/Packs available to worlds
bedrock_server / .exeThe server binary

Updating BDS means downloading the new zip and copying it over the install while keeping server.properties, allowlist.json, permissions.json and worlds/. Updates are frequent, and a server that falls behind locks out every client that updated. Back up worlds/ before every update.

server.properties: the keys that matter#

The file is plain key=value, one per line, and the server ships it fully commented. The keys you will actually change:

KeyDefaultWhat it does
server-nameDedicated ServerName shown in the LAN list and server info
gamemodesurvivalsurvival, creative or adventure
force-gamemodefalseForce the server's game mode on players who join
difficultyeasypeaceful, easy, normal, hard
allow-cheatsfalseWhether commands can be used in game
max-players10Concurrent player limit
online-modetrueRequire Xbox Live authentication
allow-listfalseOnly players in allowlist.json can join
server-port19132IPv4 UDP port
server-portv619133IPv6 UDP port
view-distance32Maximum view distance in chunks
tick-distance4Simulation radius in chunks (4-12)
player-idle-timeout30Minutes before idle players are kicked, 0 disables
max-threads8Worker threads, 0 for as many as possible
level-nameBedrock levelWorld folder name under worlds/
level-seedemptySeed for a new world
default-player-permission-levelmembervisitor, member or operator for new players
texturepack-requiredfalseForce clients to use the world's resource packs
content-log-file-enabledfalseWrite add-on errors to a log file

Notes from running it:

  • `view-distance=32` is far too high for most servers. It is a maximum; clients request less, but a phone on a 32-chunk view is generating a lot of work. 10-16 is plenty for a busy server.
  • `tick-distance` is the real performance lever. It decides how far around each player the world simulates - crops, mobs, redstone. The default 4 is already lean; raising it to 8 or more for farms has a large cost.
  • `allow-cheats=true` is needed for commands in game, including for operators. It also disables achievements in that world. Decide before players care.
  • `online-mode=true` must stay on for any server reachable from the internet. Off, anyone can join as any name.
  • Movement and anti-cheat keys - server-authoritative-movement and the player-movement-* thresholds - change name and accepted values between versions. Leave them at the defaults your version ships unless you are dealing with a specific movement-cheating problem, and check the comments in your own file before editing.
  • `compression-threshold` and `compression-algorithm` trade bandwidth for CPU. Defaults are fine.

The Java side of the file is covered in server.properties explained; copying keys between the two does nothing useful.

Port 19132 and connecting#

PortProtocolPurpose
19132UDPIPv4 gameplay and LAN discovery
19133UDPIPv6 gameplay

Bedrock runs over RakNet on UDP. A TCP firewall rule does nothing for it - the most common reason a BDS server runs fine and cannot be reached. If the host has no IPv6, the second port can be ignored. Game server ports explained covers the general case.

Phones, Windows and other PC clients join through Play, then Servers, then Add Server: a name, an address and the port. Bedrock clients do not follow SRV records the way Java does, so the address is an IP or a hostname with an A record, and the port must be typed unless it is 19132.

Xbox, PlayStation and Switch cannot add custom servers from the menu; they only show the featured servers. Communities work around it in two ways. One is a DNS redirect: the console's DNS is pointed at a service (BedrockConnect is the known one) that intercepts a featured-server hostname and shows a menu where any address can be entered. The other is friend-list broadcasting: a separate tool signs in to an Xbox account and makes the server appear as a joinable friend's world. Both work, both are unofficial, and both can break when Microsoft changes something. Be honest with console players about this before you promise them a server.

Allowlist and operators#

Allowlist entries are managed from the console; the server writes allowlist.json for you:

code
allowlist onallowlist add Steve_Playsallowlist remove Griefer123allowlist listallowlist reload

Players are added by gamertag, and the server fills in their XUID on first join. With allow-list=true, anyone not in the file is refused.

Operator status lives in permissions.json, keyed by XUID, not gamertag:

permissions.json
[  { "permission": "operator", "xuid": "2535412345678901" },  { "permission": "member", "xuid": "2535498765432109" }]

The easiest route is op <gamertag> in the console once the player has joined, which writes the file. If you edit it by hand, run permission reload afterwards. The XUID appears in the console when the player connects.

Useful console commands:

CommandEffect
op <name> / deop <name>Grant or remove operator
kick <name> <reason>Remove a player
listPlayers online
allowlist ...As above
permission list / permission reloadShow or reload permissions.json
changesetting allow-cheats trueChange some settings without a restart
save hold / save query / save resumePrepare a consistent backup
stopSave and shut down

In-game commands available to operators are the standard Bedrock command set (/gamerule, /tp, /give and so on), and need allow-cheats=true.

Add-ons: behaviour packs and resource packs#

Bedrock's equivalent of mods and plugins is the add-on: a behaviour pack (entities, items, recipes, loot, scripts) and often a resource pack (textures, models, sounds). An .mcpack or .mcaddon file is a zip.

  1. Unzip the pack. Each pack has a manifest.json with a header containing a uuid and a version.
  2. Copy behaviour packs into behavior_packs/ and resource packs into resource_packs/.
  3. Attach them to the world. In worlds/<level-name>/, create or edit world_behavior_packs.json and world_resource_packs.json:
worlds/Bedrock level/world_behavior_packs.json
[  { "pack_id": "5b1d4a8e-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "version": [1, 0, 0] }]

pack_id is the header uuid from the pack's manifest, and version is its header version as an array. Do the same for the resource pack in its own file.

  1. Set texturepack-required=true if clients must download the resource pack to join correctly.
  2. Restart and watch the console. Enable content-log-file-enabled=true while testing; pack errors are written there rather than to the main output.

Many add-ons rely on experimental features, which are world settings, not server settings. The reliable way to enable them is to create the world on a client with the experiments switched on and the packs applied, then upload that world to the server. Note that experiments can change or vanish between versions and can break a world on update.

The Marketplace is a separate matter: Marketplace content is licensed to the buyer's account and is not meant to be put on a server, and is encrypted in a way BDS does not handle for third parties.

Moving a world onto the server#

A Bedrock world is a folder with a random-looking name, containing db/ (the LevelDB database holding chunks), level.dat and levelname.txt. On Windows, client worlds are in the com.mojang folder under games/com.mojang/minecraftWorlds/; the exact parent location has moved between versions of the Windows client, so search for minecraftWorlds if the old path is empty. On phones, use the game's export to produce a .mcworld file - a zip of the same folder.

  1. Stop the server.
  2. Upload the world folder into worlds/ over SFTP. Rename the folder to something readable.
  3. Set level-name to exactly that folder name.
  4. Start the server and check that it loads rather than creating a fresh world.

One BDS process runs one world. There is no equivalent of Java's Multiverse and no proxy that moves players between Bedrock servers the way Velocity does for Java, so a community that wants a survival world and a creative world runs two servers on two ports and players add both to their list. Switching level-name to another folder and restarting does swap worlds, but everyone on the server goes with it.

Check what the uploaded world carries with it. Game rules, the cheats flag, experimental toggles and the world's own pack lists are stored in the world, not the server. A world that had cheats on in single player keeps achievements disabled regardless of allow-cheats on the server, and a world built with an add-on needs that add-on's packs present in the server's pack folders, or entities and blocks from it will be missing.

Backups and updates#

The world is a LevelDB database, written continuously. Copying it while the server writes can produce a broken copy. BDS has a built-in procedure for this:

  1. save hold - pause writes.
  2. save query - repeat until the server reports the files are ready and lists them with lengths.
  3. Copy the listed files, truncating each to the length given.
  4. save resume - writes continue.

That is fiddly by hand. The simple safe alternative is to stop the server, copy worlds/, start it again - at an hour when nobody plays. Backups that actually restore explains why proving a restore works matters more than taking the backup.

Troubleshooting#

Players cannot connect at all. The port is not open for UDP, or the server is bound to a different port than the one players are typing. Check the startup line that reports the port.

"Outdated server" or "Outdated client". Version mismatch. Update the server, or wait for players to update.

"You need to authenticate to Microsoft services." The client is not signed in to a Microsoft account, which online-mode=true requires.

The server ignores `server.properties` changes. Most settings are read at startup. Restart after edits; changesetting handles only a few.

Add-on does nothing. The pack_id or version does not match the manifest, the JSON has a syntax error, or the pack needs experiments that the world does not have. Check the content log.

Console players cannot find the server. Consoles cannot add servers without a workaround. See the connecting section.

FAQ#

Is Bedrock Dedicated Server free?

Yes, it is a free download from minecraft.net under Mojang's licence terms. Players still need their own copy of Minecraft Bedrock.

Can I run plugins on Bedrock Dedicated Server?

Not natively. BDS has add-ons and Mojang's Script API instead. Third-party projects add plugin layers, and alternative server software such as PocketMine-MP has its own plugins, but none of that is vanilla BDS.

Which port does a Bedrock server use?

UDP 19132 for IPv4 and UDP 19133 for IPv6 by default, set by server-port and server-portv6.

Can Java players join a Bedrock server?

No. The reverse is possible: Bedrock players can join a Java server through Geyser. For a mixed group, that is usually the arrangement to choose.

How do Xbox and PlayStation players join?

Not directly, since console versions only show featured servers. Community workarounds use a DNS redirect or friend-list broadcasting. They work, but they are unofficial and can break.


Comments

Completely anonymous: no account, no email, no cookie. We store the name you type, the text and the time - nothing else. Links are limited and markup is not rendered.

0/2000