What is this
A Minecraft Bedrock Edition survival server running at home, based on Endstone 0.11.12 + BDS 1.26.51.1, with LAN address 192.168.50.223:19132. The world is ourwould, imported from elsewhere, and 16 plugins are installed in total. Plugin selection basically revolves around one goal: a few people playing together comfortably over the long term. Examples include a basic command suite, sidebar, container lock, dynamic lighting, chunk pre-generation, plus self-made death enhancements and a Wither exclusion zone.
Why run it yourself
Public servers either have high latency, rules that don't suit your taste, or simply disappear one day. The biggest advantage of running your own server is that the world is yours: roll back whenever you want, add a custom plugin whenever you want, and the logs and data are all on your own disk.
Pitfalls encountered
Running bedrock_server directly has several annoyances: stdin cannot be written to reliably, so console commands can't be sent in; if you forget to release save hold, it can also wedge the save. So I wrote a bds_wrapper.py to sit in between: it keeps input.fifo open with O_RDWR, forwards each line written in to the server's stdin, and mirrors stdout to the journal and console.log; it also recognizes a few control lines beginning with __dsh__:, letting the panel stop and restart the game process without root. The service itself is managed by systemd.
Current status
Running. The map is viewed with AmberMap, hot backups rely on EasyBackuper, and when performance seems off I pull up spark to look at flame graphs. Bedrock Edition uses UDP 19132; ports and tunneling are trickier than with TCP, which was also a lesson picked up along the way.
Features
- Endstone + BDS 底座,承载 16 个插件的基岩版生存服
- bds_wrapper.py 用 FIFO 打通控制台 stdin,支持面板免 root 重启游戏进程
- stdout 同时镜像到 journal 与 console.log,方便事后排查
- 插件覆盖体验优化、容器锁、附魔增强、实体清理与服务器优化
- AmberMap 世界地图 + EasyBackuper 热备份 + spark 性能分析
Stack: Endstone · Bedrock Dedicated Server · Python · systemd · FIFO · spark
Deployment Steps
- Prepare the base
Download BDS and the matching version of Endstone, and extract them to /home/xiejun/minecraft. First run bedrock_server manually once to confirm it can generate/load the world normally before proceeding.
- Tune
server.properties
At minimum, confirm gamemode=survival and difficulty=easy; keep force-gamemode as false, so that after the world is created, changing the configuration will not forcibly override the player's existing mode. Set server-name to any name, but make sure it does not contain a semicolon.
- Use a wrapper to take over startup
Do not run the server directly; use bds_wrapper.py instead:
- Create an
input.fifo; - The wrapper keeps it open persistently and forwards each written line to the server's stdin;
- The server's stdout goes to both the journal and
console.log.
Control lines start with __dsh__:, for example __dsh__:down stops the game but keeps the wrapper, and __dsh__:up brings it back up. These lines will not be sent into the game.
- Hand it over to systemd
Write a unit, set ExecStart to point to the wrapper (not bedrock_server), set Restart=always, and view logs with journalctl -u.
- Install plugins
Place them one by one according to the directories in 插件使用手册.md, and after restarting, confirm the loaded count matches (currently 16). Each plugin has its own configuration file; for locations, see the "配置文件位置总表" at the end of the manual.
- Backup and observation
Enable EasyBackuper for hot backups, and periodically check whether the backup files can actually be extracted; when lag occurs, use spark sampling to see whether it is caused by too many entities or chunk loading issues.
Notes
- Bedrock Edition uses UDP 19132; the firewall and port mapping must allow UDP. Do not configure it following a TCP mindset.
- Stop the server before modifying
server.propertiesto avoid it being overwritten by runtime write-back. - Back up saves before upgrading plugins; when adding a new plugin, verify it in a small scope first.