a00bd620a1
Self-hostable game-server control panel: controller + agent + 26 game modules. One-line install (prebuilt release, no Go required): curl -fsSL https://git.pdxtechs.com/dbledeez/panel/raw/branch/main/install.sh | sudo bash Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
153 lines
6.9 KiB
YAML
153 lines
6.9 KiB
YAML
# Empyrion — Galactic Survival dedicated server module.
|
|
#
|
|
# Same panel-native pattern as 7dtd: a minimal image we own
|
|
# (panel-empyrion:latest, Debian 12 + Wine + tini), with game files
|
|
# populated by the generic SteamCMD updater sidecar into a named volume.
|
|
#
|
|
# Empyrion's dedicated server is shipped as a Windows binary only, so the
|
|
# updater is told to pretend SteamCMD is running on Windows
|
|
# (`platform: windows` → +@sSteamCmdForcePlatformType windows), and the
|
|
# entrypoint runs the exe under Wine under Xvfb (Unity server still touches
|
|
# X even in -batchmode).
|
|
#
|
|
# First-run flow:
|
|
# - Create instance → container spec + empty volumes
|
|
# - Click "Update" → SteamCMD downloads ~3.5 GB Windows build
|
|
# - Click "Start" → entrypoint boots Wine + EmpyrionDedicated.exe
|
|
#
|
|
# Notes for operators:
|
|
# - The game server ports must be UDP; Empyrion uses a handful of them.
|
|
# - Main config file is dedicated.yaml, lives under /game-saves after
|
|
# first boot (entrypoint copies the shipped default on first run).
|
|
# - No in-game RCON: Empyrion's admin console is in-process only. The
|
|
# "Empyrion Web Admin" (EWA) third-party tool can be layered on top
|
|
# later via a plugin; not wired for v1.
|
|
|
|
id: empyrion
|
|
name: "Empyrion - Galactic Survival"
|
|
version: 0.1.0
|
|
authors:
|
|
- panel contributors
|
|
|
|
supported_modes:
|
|
- docker
|
|
|
|
runtime:
|
|
docker:
|
|
# Built locally from ./Dockerfile. Rebuild with:
|
|
# docker build -t panel-empyrion:latest modules/empyrion
|
|
image: panel-empyrion:latest
|
|
# Host networking -- container shares the host net namespace, so
|
|
# any port the game/mod binds is directly on the LAN. AMP-like
|
|
# model. Multi-instance safety comes from env-driven per-instance
|
|
# ports (panel allocator + env: mapping on each ports entry).
|
|
network_mode: host
|
|
browseable_root: /game-saves
|
|
browseable_roots:
|
|
- name: "Saves & Configs"
|
|
path: /game-saves
|
|
hint: "Saves/, dedicated.yaml, admin files"
|
|
- name: "Game Files"
|
|
path: /game
|
|
hint: "Binaries, Content/, Mods/ — drop mod folders here"
|
|
# Pre-declare the port env keys so the agent's resolve filter lets the
|
|
# panel-allocated values flow through to the container env (resolve.go
|
|
# only overrides keys already present in docker.env). Defaults match
|
|
# the manifest port defaults below; agent overrides at create time.
|
|
env:
|
|
SRV_PORT: "30000"
|
|
QUERY_PORT: "30001"
|
|
CLIENT_PORT: "30002"
|
|
EAC_PORT: "30003"
|
|
CSW_PORT: "30004"
|
|
EAH_API_PORT: "30007" # Empyrion's Mod API TCP port (used by EAH/EPM and our future bridge)
|
|
# SCENARIO is declared empty here so the agent's resolver passes the
|
|
# config_values.SCENARIO override into the container env. Without
|
|
# this pre-declaration, resolve.go would silently drop the value
|
|
# (it only overrides keys already in docker.env), the entrypoint
|
|
# would see SCENARIO="" and skip the dedicated.yaml patch, and
|
|
# Empyrion would fall back to "Default Multiplayer" no matter what
|
|
# the operator picked in the dropdown.
|
|
SCENARIO: ""
|
|
volumes:
|
|
- { type: volume, name: "panel-$INSTANCE_ID-saves", container: "/game-saves" }
|
|
- { type: volume, name: "panel-$INSTANCE_ID-game", container: "/game" }
|
|
- { target: "$DATA_PATH/logs", container: "/game-saves/logs" }
|
|
|
|
# Empyrion port reference:
|
|
# Srv_Port (UDP) — main game traffic default 30000
|
|
# Srv_Port+1 (UDP) — Steam query default 30001
|
|
# Srv_Port+2 (UDP) — client connect default 30002
|
|
# EAC_Port (UDP) — EasyAntiCheat default 30003
|
|
# CSWApi_Port (TCP) — CSW API (remote admin) default 30004 (internal)
|
|
ports:
|
|
- { name: game, proto: udp, default: 30000, required: true, env: SRV_PORT }
|
|
- { name: query, proto: udp, default: 30001, required: true, env: QUERY_PORT } # Empyrion derives query from Srv_Port + 1; we still allocate it for tracking
|
|
- { name: client, proto: udp, default: 30002, required: true, env: CLIENT_PORT } # Srv_Port + 2 by convention
|
|
- { name: eac, proto: udp, default: 30003, required: true, env: EAC_PORT }
|
|
- { name: csw, proto: tcp, default: 30004, internal: true, env: CSW_PORT }
|
|
# Empyrion's native Mod API TCP port. EPM mod listens on this; EAH GUI
|
|
# and our future panel-empyrion-bridge will connect here. Public so
|
|
# remote EAH GUIs work; auth model not yet validated, see
|
|
# panel/memory/research_eah_integration.md before exposing externally.
|
|
- { name: eah-api, proto: tcp, default: 30007, required: true, env: EAH_API_PORT }
|
|
|
|
resources:
|
|
min_ram_mb: 4096
|
|
recommended_ram_mb: 8192
|
|
|
|
# Operator-tunable knobs. Panel renders these as a config form; the entrypoint
|
|
# reads them from env on every boot.
|
|
config_values:
|
|
- key: SCENARIO
|
|
label: "Scenario"
|
|
description: "Folder name under Content/Scenarios/. Leave blank for game default. Reforged Eden 2 needs the workshop content (ID 3041847672) dropped into Content/Scenarios/Reforged Eden 2/ first — use the Files tab."
|
|
default: ""
|
|
options:
|
|
- { value: "", label: "Default Random (vanilla)" }
|
|
- { value: "Reforged Eden 2", label: "Reforged Eden 2 (workshop)" }
|
|
- { value: "Reforged Eden", label: "Reforged Eden (legacy)" }
|
|
- { value: "Default Akua", label: "Default Akua (vanilla)" }
|
|
- { value: "Default Multiplayer Survival", label: "Default Multiplayer Survival" }
|
|
- key: EAH_API_PORT
|
|
label: "EAH/Mod API port"
|
|
description: "TCP port the EPM mod listens on for the panel-empyrion-bridge sidecar. Auto-allocated by panel; rarely needs manual override."
|
|
default: ""
|
|
advanced: true
|
|
# Log-derived player events. Regexes converted from CubeCoders'
|
|
# AMPTemplates (empyrion-galactic-survival.kvp) — .NET (?<n>) syntax -> Go (?P<n>).
|
|
# Sourced-from-template; not yet exercised against a live client.
|
|
events:
|
|
join:
|
|
pattern: '-LOG-.*Player (?P<id>.+?)/''(?P<name>[^'']+)'' login ok'
|
|
kind: join
|
|
leave:
|
|
pattern: '-LOG-.*, (?P<id>.+?)/=/''(?P<name>[^'']+)'' disconnected$'
|
|
kind: leave
|
|
|
|
|
|
update_providers:
|
|
- id: stable
|
|
kind: steamcmd
|
|
app_id: "530870"
|
|
platform: windows # force Windows depot on Linux hosts — server is Windows-only
|
|
install_path: /game
|
|
- id: experimental
|
|
kind: steamcmd
|
|
app_id: "530870"
|
|
beta: experimental
|
|
platform: windows
|
|
install_path: /game
|
|
|
|
# --- 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.
|
|
# ready_pattern is a JavaScript regex (slash-delimited when it needs
|
|
# flags) moved verbatim from the dashboard's READY_PATTERNS map.
|
|
ready_pattern: '/Server started listening on port|Dedi is ready|Ready for connections/i'
|
|
appearance:
|
|
emoji: "🚀"
|
|
grad: "linear-gradient(135deg,#0b2545,#5c7cfa)"
|
|
art: "/game-art/empyrion.jpg"
|
|
steam: "383120"
|