Operations guide
Keep the world
safe and playable.
The practical runbook for operating, updating and recovering the WPH Bedrock server. Commands assume an SSH session with administrative access.
This page is deliberately public-safe: it contains no passwords, private keys or API tokens. Keep credentials out of the web root and use temporary SSH keys for outside assistance.
01 · Routine checks
Prove the server is healthy
A green systemd status alone is not enough. A healthy server starts cleanly, listens on the Bedrock UDP ports and does not spin at high CPU.
systemctl status bedrock --no-pager
ss -ulnp | grep -E '19132|19133'
journalctl -u bedrock -n 100 --no-pager
ps -C bedrock_server -o pid,etime,%cpu,%mem,cmdLook for Server started in the journal and listeners on UDP 19132 and 19133. If systemd says active but neither is true, treat the service as unhealthy.
Service controls
systemctl start bedrock
systemctl stop bedrock
systemctl restart bedrock
systemctl is-active bedrock02 · Player access
Manage the allowlist carefully
The server uses allow-list=true. Player records live in /opt/bedrock/allowlist.json; permissions are in /opt/bedrock/permissions.json.
/opt/bedrock/addplayer.sh "Exact Gamertag" "PLAYER-XUID" false- Use the exact Gamertag from the player’s signed-in Microsoft account.
- Only grant operator access when it is genuinely needed.
- Back up JSON files before manual edits and validate the JSON afterward.
- Restart the service after an offline edit so the new state is loaded.
03 · Backups
Protect the live world before change
The live world is /opt/bedrock/worlds/world. Daily backups are run by /etc/cron.daily/mc-backup and written beneath /opt/backups.
/etc/cron.daily/mc-backup
ls -lh /opt/backups
tar -tzf /opt/backups/NAME.tar.gz | grep 'level.dat'The backup job briefly stops the service for a consistent snapshot, verifies that the archive contains level.dat, and starts the service again. A tiny archive is a warning sign; the validated post-repair archive was approximately 18.4 MB.
Stop the service and make one more copy of the current world—even when it looks broken. Restore into a staging directory, verify level.dat and the database files, then swap directories.
04 · Updates
Deploy complete releases
The updater runs each Sunday at 04:00. Its script is /opt/bedrock/auto_update_bds.sh; output is recorded in /var/log/bds-update.log.
tail -n 150 /var/log/bds-update.log
systemctl list-timers --all | grep -i bedrock
/opt/bedrock/auto_update_bds.shThe safe update pattern is: download the complete official release, stage and validate it, stop the service, preserve the world and local configuration, atomically swap releases, start, and run real health checks. Roll back automatically when health checks fail.
Bedrock releases include registries and supporting files that must match the executable. A binary-only update previously caused missing VoxelShape registries, high CPU and a server that appeared active but was not playable.
05 · Website & TLS
Serve the guide over HTTPS
The static site is in /var/www/mcsite. NGINX configuration is enabled from /etc/nginx/sites-enabled/mc. Both the host firewall and the attached Vultr firewall must allow inbound TCP 80 and 443.
nginx -t
systemctl reload nginx
curl -I http://127.0.0.1/
curl -kI https://127.0.0.1/ -H 'Host: minecraft.candilo.ro'
certbot renewPort 80 is required for normal Let’s Encrypt HTTP validation even when visitors are redirected to HTTPS. After renewal, verify the certificate dates and test from a device outside the VPS network.
06 · Troubleshooting
Follow the signal
Service active, game unreachable
Check the journal, UDP listeners and CPU. No listener or sustained high CPU points to a failed or mismatched release, not a firewall alone.
Website times out externally
If local curl works and UFW’s 80/443 counters stay at zero during an external test, packets are being dropped before reaching the VPS. Check the Vultr firewall attachment and rules.
Certificate warning
Inspect the certificate expiry, confirm public ports 80/443 are reachable, run Certbot, reload NGINX and test again externally.
Backup is suspiciously small
List its contents and find level.dat. Do not overwrite the current world with an empty or incomplete archive.
07 · Recovery
Preserve evidence, then roll back
- Stop writes. Stop
bedrockbefore moving or restoring world data. - Snapshot first. Archive the current configuration and world even if they appear damaged.
- Stage separately. Never extract a release or backup directly over the live directory.
- Validate. Confirm required release files,
level.dat, database contents, ownership and permissions. - Swap atomically. Rename directories on the same filesystem, start the service, and check logs plus UDP listeners.
- Keep rollback material. Remove old artifacts only after players have confirmed the world is correct.
Current recovery artifacts
The 2026-08-27 repair retained the failed installation at /opt/bedrock.broken-20260827-170203 and a pre-repair persistent-state archive at /opt/backups/pre-repair-persistent-20260827-170203.tar.gz. Do not delete them until the restored world has had a suitable confidence period.
Quick checklist
Before you close the terminal
- Service is active, CPU is normal and the log says
Server started. - UDP 19132 and 19133 are listening.
- A recent backup exists, is plausibly sized and contains
level.dat. - NGINX configuration passes and local HTTP/HTTPS requests succeed.
- A real player or external network test confirms the result.
- Temporary SSH access has been removed.