{
    "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY trinityadmin/egg/build-egg.js",
    "meta": {
        "version": "PTDL_v1",
        "update_url": null
    },
    "exported_at": "2026-11-09T00:29:27.963Z",
    "name": "Garry's Mod + Trinity Admin",
    "author": "admin@tr-community.com",
    "description": "Garry's Mod Dedicated Server mit dem Trinity-Admin-Webpanel und dem Standard-Admin-Addon (Ränge, Bans, Verwarnungen, Menü im Spiel). Das Panel läuft im selben Container und läuft über den Spielport (TCP), eine zweite Port-Zuweisung ist nicht nötig.",
    "features": null,
    "docker_images": {
        "Source (Debian)": "ghcr.io/parkervcp/games:source"
    },
    "images": [
        "ghcr.io/parkervcp/games:source"
    ],
    "file_denylist": [],
    "startup": "./trinityadmin/egg-start.sh ./srcds_run -game garrysmod -console -condebug -port {{SERVER_PORT}} +ip 0.0.0.0 +map {{SRCDS_MAP}} +gamemode {{GAMEMODE}} +maxplayers {{MAX_PLAYERS}} -tickrate {{TICKRATE}} -strictportbind -norestart $( [ -z \"${STEAM_ACC}\" ] || printf %s \"+sv_setsteamaccount ${STEAM_ACC}\" ) $( [ -z \"${WORKSHOP_ID}\" ] || printf %s \"+host_workshop_collection ${WORKSHOP_ID} -authkey ${STEAM_WEB_API_KEY}\" ) $( [ \"${LUA_REFRESH}\" = \"1\" ] || printf %s \"-disableluarefresh\" )",
    "config": {
        "files": "{}",
        "startup": "{\n    \"done\": \"gameserver Steam ID\",\n    \"userInteraction\": []\n}",
        "logs": "{}",
        "stop": "quit"
    },
    "scripts": {
        "installation": {
            "script": "#!/bin/bash\n# Installationsskript des Eggs (läuft im Installer-Container, Zielordner ist /mnt/server)\n# Wird von build-egg.js in die Egg-Datei eingebettet.\nset -u\ncd /tmp\nexport DEBIAN_FRONTEND=noninteractive\napt-get -y update\napt-get -y --no-install-recommends install curl ca-certificates lib32gcc-s1 xz-utils tar file\n\n# ───── 1) Garry's Mod Server (SteamCMD, App 4020) ─────\nif [ \"${SKIP_STEAM:-0}\" != \"1\" ]; then\n  mkdir -p /mnt/server/steam /mnt/server/.steam/sdk32 /mnt/server/.steam/sdk64\n  curl -fsSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\n  tar -xzf steamcmd.tar.gz -C /mnt/server/steam\n  cd /mnt/server/steam\n  export HOME=/mnt/server\n  for try in 1 2 3; do\n    ./steamcmd.sh +force_install_dir /mnt/server +login anonymous +app_update 4020 validate +quit && break\n    echo \"SteamCMD Versuch $try fehlgeschlagen, wiederhole ...\"\n  done\n  cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so || true\n  cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so || true\n  # srcds braucht diese Links, sonst fehlt steamclient.so im Container\n  mkdir -p /mnt/server/garrysmod/bin\n  cp -v /mnt/server/.steam/sdk32/steamclient.so /mnt/server/garrysmod/bin/ 2>/dev/null || true\n  mkdir -p /mnt/server/garrysmod/cfg\n  [ -f /mnt/server/garrysmod/cfg/server.cfg ] || printf 'hostname \"Garrys Mod Server\"\\nsv_password \"\"\\nsv_lan 0\\nlog on\\n' > /mnt/server/garrysmod/cfg/server.cfg\nfi\n\n# ───── 2) Trinity Admin: Panel + Standard-Admin-Addon ─────\ncd /tmp\nif [ -z \"${PACKAGE_URL:-}\" ]; then\n  echo \"WARNUNG: PACKAGE_URL ist leer - Panel und Admin-Addon werden NICHT installiert (nur der GMod-Server).\"\n  mkdir -p /mnt/server/trinityadmin\n  printf '#!/bin/bash\nexec \"$@\"\n' > /mnt/server/trinityadmin/egg-start.sh; chmod +x /mnt/server/trinityadmin/egg-start.sh\n  exit 0\nfi\necho \"Lade Trinity Admin von $PACKAGE_URL\"\nif ! curl -fsSL \"$PACKAGE_URL\" -o ta-package.tgz; then\n  echo \"FEHLER: Das Trinity-Admin-Paket konnte nicht geladen werden. Prüfe die Variable PACKAGE_URL.\"\n  exit 1\nfi\nrm -rf /tmp/ta && mkdir -p /tmp/ta && tar xzf ta-package.tgz -C /tmp/ta || { echo \"FEHLER: Paket ist beschädigt.\"; exit 1; }\n\nTA=/mnt/server/trinityadmin\nmkdir -p \"$TA\"\n# Node.js (nur in den Serverordner, portable)\ncase \"$(uname -m)\" in x86_64|amd64) A=x64;; aarch64|arm64) A=arm64;; *) echo \"Unbekannte CPU\"; exit 1;; esac\nNV=22.11.0\nif [ ! -x \"$TA/node/bin/node\" ]; then\n  curl -fsSL \"https://nodejs.org/dist/v$NV/node-v$NV-linux-$A.tar.xz\" -o node.tar.xz\n  mkdir -p \"$TA/node\" && tar xJf node.tar.xz -C \"$TA/node\" --strip-components=1\nfi\nexport PATH=\"$TA/node/bin:$PATH\"\n\n# Programmdateien (Daten und Schlüssel des Panels bleiben bei einer Neuinstallation erhalten)\nrm -rf \"$TA/app\" \"$TA/addon\"\nmkdir -p \"$TA/app\" \"$TA/data\"\ncp -r /tmp/ta/app/. \"$TA/app/\"\ncp -r /tmp/ta/addon \"$TA/addon\"\ncp /tmp/ta/egg-start.sh \"$TA/egg-start.sh\"; chmod +x \"$TA/egg-start.sh\"\n( cd \"$TA/app\" && npm install --omit=dev --no-audit --no-fund --loglevel=error ) || {\n  echo \"npm install schlug fehl, versuche mit Build-Werkzeugen ...\"\n  apt-get -y --no-install-recommends install build-essential python3\n  ( cd \"$TA/app\" && npm install --omit=dev --no-audit --no-fund --loglevel=error ) || { echo \"FEHLER: Abhängigkeiten konnten nicht installiert werden.\"; exit 1; }\n}\n# Standard-Admin-Addon sofort an die richtige Stelle (egg-start.sh aktualisiert es bei jedem Start)\nmkdir -p /mnt/server/garrysmod/addons\nrm -rf /mnt/server/garrysmod/addons/trinity_admin\ncp -r \"$TA/addon/trinity_admin\" /mnt/server/garrysmod/addons/trinity_admin\necho \"Trinity Admin installiert.\"\n",
            "container": "ghcr.io/parkervcp/installers:debian",
            "entrypoint": "bash"
        }
    },
    "variables": [
        {
            "name": "Karte",
            "description": "Startkarte",
            "env_variable": "SRCDS_MAP",
            "default_value": "gm_flatgrass",
            "user_viewable": true,
            "user_editable": true,
            "rules": "required|string|max:64",
            "field_type": "text"
        },
        {
            "name": "Gamemode",
            "description": "Spielmodus (Ordnername in garrysmod/gamemodes)",
            "env_variable": "GAMEMODE",
            "default_value": "sandbox",
            "user_viewable": true,
            "user_editable": true,
            "rules": "required|string|max:64",
            "field_type": "text"
        },
        {
            "name": "Max. Spieler",
            "description": "Maximale Spielerzahl",
            "env_variable": "MAX_PLAYERS",
            "default_value": "16",
            "user_viewable": true,
            "user_editable": true,
            "rules": "required|integer|between:1,128",
            "field_type": "text"
        },
        {
            "name": "Tickrate",
            "description": "Server-Tickrate",
            "env_variable": "TICKRATE",
            "default_value": "22",
            "user_viewable": true,
            "user_editable": true,
            "rules": "required|integer|between:10,100",
            "field_type": "text"
        },
        {
            "name": "Steam-Server-Token",
            "description": "Game-Server-Login-Token (steamcommunity.com/dev/managegameservers), optional",
            "env_variable": "STEAM_ACC",
            "default_value": "",
            "user_viewable": true,
            "user_editable": true,
            "rules": "nullable|string|max:64",
            "field_type": "text"
        },
        {
            "name": "Workshop-Kollektion",
            "description": "ID einer Workshop-Kollektion, optional (braucht den Web-API-Schlüssel)",
            "env_variable": "WORKSHOP_ID",
            "default_value": "",
            "user_viewable": true,
            "user_editable": true,
            "rules": "nullable|string|max:32",
            "field_type": "text"
        },
        {
            "name": "Steam-Web-API-Schlüssel",
            "description": "Für die Workshop-Kollektion, optional",
            "env_variable": "STEAM_WEB_API_KEY",
            "default_value": "",
            "user_viewable": true,
            "user_editable": true,
            "rules": "nullable|string|max:64",
            "field_type": "text"
        },
        {
            "name": "Lua-Refresh",
            "description": "1 = Lua-Refresh erlauben (nur für Entwicklung)",
            "env_variable": "LUA_REFRESH",
            "default_value": "0",
            "user_viewable": true,
            "user_editable": true,
            "rules": "required|in:0,1",
            "field_type": "text"
        },
        {
            "name": "Panel-Port",
            "description": "Leer = das Panel läuft über den Spielport (TCP), es wird keine zweite Port-Zuweisung gebraucht. Nur ausfüllen, wenn das Panel einen eigenen Port bekommen soll.",
            "env_variable": "PANEL_PORT",
            "default_value": "",
            "user_viewable": true,
            "user_editable": true,
            "rules": "nullable|integer|between:1024,65535",
            "field_type": "text"
        },
        {
            "name": "Panel-Adresse",
            "description": "Öffentliche Adresse des Panels, z.B. https://admin.meinedomain.de (leer = http://SERVER-IP:Panel-Port)",
            "env_variable": "PANEL_URL",
            "default_value": "",
            "user_viewable": true,
            "user_editable": true,
            "rules": "nullable|string|max:200",
            "field_type": "text"
        },
        {
            "name": "Panel-Benutzer",
            "description": "Name des ersten Panel-Kontos (leer = admin)",
            "env_variable": "PANEL_USER",
            "default_value": "",
            "user_viewable": true,
            "user_editable": true,
            "rules": "nullable|string|max:32",
            "field_type": "text"
        },
        {
            "name": "Panel-Startpasswort",
            "description": "Passwort des ersten Panel-Kontos (leer = wird erzeugt und steht in trinityadmin/panel.log)",
            "env_variable": "PANEL_PASSWORD",
            "default_value": "",
            "user_viewable": true,
            "user_editable": true,
            "rules": "nullable|string|max:64",
            "field_type": "text"
        },
        {
            "name": "Admin-Besitzer (SteamID)",
            "description": "SteamIDs (STEAM_0:x:y oder 7656...), getrennt mit Komma. Sie werden bei jedem Start Besitzer im Ingame-Admin-System.",
            "env_variable": "OWNER_STEAMID",
            "default_value": "",
            "user_viewable": true,
            "user_editable": true,
            "rules": "nullable|string|max:300",
            "field_type": "text"
        },
        {
            "name": "Admin-Addon aktualisieren",
            "description": "1 = das Standard-Admin-Addon wird bei jedem Start auf den Stand des Pakets gebracht",
            "env_variable": "TA_UPDATE_ADDON",
            "default_value": "1",
            "user_viewable": true,
            "user_editable": true,
            "rules": "required|in:0,1",
            "field_type": "text"
        },
        {
            "name": "Paket-URL",
            "description": "Download-Adresse des Trinity-Admin-Pakets (nur bei der Installation)",
            "env_variable": "PACKAGE_URL",
            "default_value": "https://admin.tr-community.com/download/trinityadmin-package.tar.gz",
            "user_viewable": true,
            "user_editable": false,
            "rules": "nullable|string|max:300",
            "field_type": "text"
        },
        {
            "name": "App-ID",
            "description": "Steam-App-ID von Garry's Mod",
            "env_variable": "SRCDS_APPID",
            "default_value": "4020",
            "user_viewable": false,
            "user_editable": false,
            "rules": "required|string|max:20",
            "field_type": "text"
        }
    ]
}
