4ccccc6fe2
Self-hostable game server control panel: Go controller + agent, 26 game modules, embedded web UI. One-line install via install.sh / install.ps1. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
143 lines
6.0 KiB
YAML
143 lines
6.0 KiB
YAML
# Minecraft Bedrock Edition module.
|
|
#
|
|
# itzg/minecraft-bedrock-server is the de-facto community image for the
|
|
# Mojang-shipped Linux Bedrock binary. It auto-downloads the binary on
|
|
# first container start (license-accepted via EULA=TRUE) and re-pulls on
|
|
# version bumps via the VERSION env var.
|
|
#
|
|
# Bedrock is the iOS / Android / Console / Win10-Edition flavor of
|
|
# Minecraft. It speaks RakNet over UDP — TOTALLY DIFFERENT wire protocol
|
|
# from Java Edition. Bedrock clients cannot connect to Java servers and
|
|
# vice-versa. Run BOTH if your players are mixed-platform; or use the
|
|
# GeyserMC translation proxy (out of scope for this module).
|
|
#
|
|
# No RCON — Bedrock servers don't ship a remote-admin protocol. Admin
|
|
# commands go through the in-process console only. Players tab will be
|
|
# empty; state tracker has nothing to poll.
|
|
#
|
|
# Verified scaffolding pattern:
|
|
# - same `auto_update_on_create: false` + placeholder update_providers
|
|
# combination as minecraft-java (see panel/memory/gotchas.md
|
|
# "image-managed module" entry).
|
|
# - `env: SERVER_PORT` / `env: SERVER_PORT_V6` on each port wires the
|
|
# panel-allocated host ports through to the container env, then
|
|
# itzg's entrypoint passes them to the binary. Combined with
|
|
# `network_mode: host`, two Bedrock instances on the same agent
|
|
# allocate unique ports and bind them directly.
|
|
|
|
id: minecraft-bedrock
|
|
name: "Minecraft Bedrock Edition"
|
|
version: 0.1.0
|
|
authors:
|
|
- panel contributors
|
|
|
|
supported_modes:
|
|
- docker
|
|
|
|
runtime:
|
|
docker:
|
|
image: itzg/minecraft-bedrock-server:latest
|
|
# Host networking — Bedrock's UDP RakNet protocol relies on the
|
|
# client speaking directly to the server's published port. Port
|
|
# publishing through Docker's bridge would NAT every Bedrock packet,
|
|
# which RakNet doesn't tolerate well. AMP-like host-net model keeps
|
|
# the packets clean. Multi-instance safety is the panel allocator
|
|
# picking distinct SERVER_PORT values per instance.
|
|
network_mode: host
|
|
browseable_root: /data
|
|
browseable_roots:
|
|
- name: "Server data"
|
|
path: /data
|
|
hint: "worlds/, allowlist.json, permissions.json, server.properties"
|
|
env:
|
|
EULA: "TRUE"
|
|
SERVER_NAME: "Refuge Bedrock"
|
|
GAMEMODE: "survival" # survival | creative | adventure
|
|
DIFFICULTY: "easy" # peaceful | easy | normal | hard
|
|
LEVEL_NAME: "level"
|
|
LEVEL_TYPE: "DEFAULT" # DEFAULT | FLAT | LEGACY
|
|
MAX_PLAYERS: "10"
|
|
ONLINE_MODE: "true"
|
|
ALLOW_CHEATS: "false"
|
|
VIEW_DISTANCE: "10"
|
|
TICK_DISTANCE: "4"
|
|
DEFAULT_PLAYER_PERMISSION_LEVEL: "member"
|
|
TEXTUREPACK_REQUIRED: "false"
|
|
VERSION: "LATEST"
|
|
# Pre-declared so the agent's resolve.go filter lets allocator-derived
|
|
# ports flow through to the container env. itzg honors both SERVER_PORT
|
|
# (IPv4) and SERVER_PORT_V6 (IPv6) — defaults match the manifest port
|
|
# defaults below; agent overrides at create time.
|
|
SERVER_PORT: "19132"
|
|
SERVER_PORT_V6: "19133"
|
|
volumes:
|
|
- { type: volume, name: "panel-$INSTANCE_ID-bedrock", container: "/data" }
|
|
- { target: "$DATA_PATH/logs", container: "/data/logs" }
|
|
|
|
# Bedrock binds two UDP ports — IPv4 and IPv6. Both are required for
|
|
# proper dual-stack listing in Bedrock's server browser. itzg defaults
|
|
# 19132 / 19133. The panel allocator picks unique ports from the agent's
|
|
# window (e.g. 7000-7999 on princess); the agent injects them as
|
|
# SERVER_PORT / SERVER_PORT_V6 env at container-create time.
|
|
ports:
|
|
- { name: game, proto: udp, default: 19132, required: true, env: SERVER_PORT }
|
|
- { name: game-v6, proto: udp, default: 19133, required: true, env: SERVER_PORT_V6 }
|
|
|
|
resources:
|
|
min_ram_mb: 1024
|
|
recommended_ram_mb: 2048
|
|
|
|
# itzg/minecraft-bedrock-server handles install + version pinning via the
|
|
# VERSION env var on first container start — no SteamCMD / GitHub / direct
|
|
# flow the panel needs to drive. Same shape as minecraft-java: keep a
|
|
# placeholder update_providers entry to satisfy the manifest validator,
|
|
# pair with auto_update_on_create:false so the agent doesn't actually run
|
|
# it (which would crash on the missing target_path — see
|
|
# panel/memory/gotchas.md "image-managed module" pattern).
|
|
auto_update_on_create: false
|
|
update_providers:
|
|
- id: image-managed
|
|
kind: direct
|
|
url: "https://hub.docker.com/r/itzg/minecraft-bedrock-server"
|
|
target_path: ".panel-image-managed-marker" # never written; auto-update is suppressed above
|
|
|
|
# itzg's bedrock image streams the server log to stdout. The format depends
|
|
# on the bundled binary's version — in 1.21+ the ready signal is
|
|
# "Server started." and join/leave use "Player connected/disconnected".
|
|
# Older builds use slightly different phrasing. We grep the broad shape;
|
|
# tighten once we observe the live format.
|
|
state_sources:
|
|
- type: log_tail
|
|
files:
|
|
- "$DATA_PATH/logs/*.log"
|
|
- "/data/logs/*.log"
|
|
|
|
events:
|
|
join:
|
|
pattern: 'Player connected: (?P<name>[^,]+), xuid: (?P<xuid>\S+)'
|
|
kind: join
|
|
leave:
|
|
pattern: 'Player disconnected: (?P<name>[^,]+), xuid: (?P<xuid>\S+)'
|
|
kind: leave
|
|
|
|
# Backup what's recoverable; everything else (binary, libs) is fetched
|
|
# fresh on next start.
|
|
backup:
|
|
include:
|
|
- "worlds" # world saves (one dir per LEVEL_NAME)
|
|
- "*.properties" # server.properties
|
|
- "*.json" # permissions.json, allowlist.json, etc.
|
|
exclude:
|
|
- "logs" # rotates infinitely
|
|
- "premium_cache" # auto-restored
|
|
- "behavior_packs" # auto-fetched (mods landing here are operator-managed via Files tab)
|
|
- "resource_packs" # same
|
|
notes: "World saves + permissions + server.properties (~10-100 MB typical). Bedrock binary fetched fresh by itzg on next start."
|
|
|
|
# --- Manifest-driven UI metadata (WI-07) --------------------------
|
|
# Consumed by the CONTROLLER/dashboard only (the controller loads its
|
|
# own ./modules copy at startup); the agent ignores these at runtime.
|
|
appearance:
|
|
emoji: "🧱"
|
|
grad: "linear-gradient(135deg,#2d6929,#5a9d56)"
|