HTTP Client
1
Total requests
0
HTTP errors
Clients
http_client 1
Requests
| GET | http://panel.frogwebservices.com/api/application/nests | |
|---|---|---|
| Request options | [ "headers" => [ "Authorization" => "Bearer ptla_GK1X83IfGJ3JVCpTU9g9J81B3g4IFcP0SShCSnTCVad" "Content-Type" => "application/json" "Accept" => "application/json" ] "query" => [ "include" => "eggs" "per_page" => 100 ] ] |
|
| Response |
200
[ "info" => [ "header_size" => 328 "request_size" => 290 "total_time" => 0.053878 "namelookup_time" => 0.000494 "connect_time" => 0.000701 "pretransfer_time" => 0.00079 "size_download" => 181070.0 "speed_download" => 3360740.0 "starttransfer_time" => 0.05353 "primary_ip" => "127.0.0.1" "primary_port" => 80 "local_ip" => "127.0.0.1" "local_port" => 55874 "http_version" => 2 "protocol" => 1 "scheme" => "HTTP" "connect_time_us" => 701 "namelookup_time_us" => 494 "pretransfer_time_us" => 790 "starttransfer_time_us" => 53530 "total_time_us" => 53878 "effective_method" => "GET" "capath" => "/etc/ssl/certs" "cainfo" => "/etc/ssl/certs/ca-certificates.crt" "start_time" => 1780693539.9079 "original_url" => "http://panel.frogwebservices.com/api/application/nests?include=eggs&per_page=100" "pause_handler" => Closure(float $duration) {#1323 : "Symfony\Component\HttpClient\Response\CurlResponse" : { : CurlHandle {#1316 …} : Symfony\Component\HttpClient\Internal\CurlClientState {#279 …} : -9223372036854775808 } } "debug" => """ * WARNING: failed to open cookie file ""\n * Host panel.frogwebservices.com:80 was resolved.\n * IPv6: (none)\n * IPv4: 127.0.0.1\n * Trying 127.0.0.1:80...\n * Connected to panel.frogwebservices.com (127.0.0.1) port 80\n > GET /api/application/nests?include=eggs&per_page=100 HTTP/1.1\r\n Host: panel.frogwebservices.com\r\n Authorization: Bearer ptla_GK1X83IfGJ3JVCpTU9g9J81B3g4IFcP0SShCSnTCVad\r\n Content-Type: application/json\r\n Accept: application/json\r\n User-Agent: Symfony HttpClient (Curl)\r\n Accept-Encoding: gzip\r\n \r\n < HTTP/1.1 200 OK\r\n < Server: nginx/1.24.0 (Ubuntu)\r\n < Content-Type: application/json\r\n < Transfer-Encoding: chunked\r\n < Connection: keep-alive\r\n < Cache-Control: no-cache, private\r\n < Date: Fri, 05 Jun 2026 21:05:39 GMT\r\n < X-RateLimit-Limit: 240\r\n < X-RateLimit-Remaining: 239\r\n < Access-Control-Allow-Origin: \r\n < Access-Control-Allow-Credentials: true\r\n < \r\n """ ] "url" => "http://panel.frogwebservices.com/api/application/nests?include=eggs&per_page=100" "response_headers" => [ "HTTP/1.1 200 OK" "Server: nginx/1.24.0 (Ubuntu)" "Content-Type: application/json" "Transfer-Encoding: chunked" "Connection: keep-alive" "Cache-Control: no-cache, private" "Date: Fri, 05 Jun 2026 21:05:39 GMT" "X-RateLimit-Limit: 240" "X-RateLimit-Remaining: 239" "Access-Control-Allow-Origin: " "Access-Control-Allow-Credentials: true" ] "response_json" => [ "object" => "list" "data" => [ [ "object" => "nest" "attributes" => [ "id" => 1 "uuid" => "943a49fd-2ec3-4566-87ac-68059448dd7a" "author" => "[email protected]" "name" => "Minecraft" "description" => "Minecraft - the classic game from Mojang. With support for Vanilla MC, Spigot, and many others!" "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 1 "uuid" => "bbee6493-3c7e-48d0-9f78-b532a23c05d2" "name" => "Vanilla Minecraft" "nest" => 1 "author" => "[email protected]" "description" => "Minecraft is a game about placing blocks and going on adventures. Explore randomly generated worlds and build amazing things from the simplest of homes to the grandest of castles. Play in Creative Mode with unlimited resources or mine deep in Survival Mode, crafting weapons and armor to fend off dangerous mobs. Do all this alone or with friends." "docker_image" => "ghcr.io/pterodactyl/yolks:java_21" "docker_images" => [ "Java 21" => "ghcr.io/pterodactyl/yolks:java_21" "Java 17" => "ghcr.io/pterodactyl/yolks:java_17" "Java 16" => "ghcr.io/pterodactyl/yolks:java_16" "Java 11" => "ghcr.io/pterodactyl/yolks:java_11" "Java 8" => "ghcr.io/pterodactyl/yolks:java_8" ] "config" => [ "files" => [ "server.properties" => [ "parser" => "properties" "find" => [ "server-ip" => "0.0.0.0" "server-port" => "{{server.build.default.port}}" "query.port" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => ")! For help, type " ] "stop" => "stop" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/ash\r\n # Vanilla MC Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n LATEST_VERSION=`curl https://launchermeta.mojang.com/mc/game/version_manifest.json | jq -r '.latest.release'`\r\n LATEST_SNAPSHOT_VERSION=`curl https://launchermeta.mojang.com/mc/game/version_manifest.json | jq -r '.latest.snapshot'`\r\n \r\n echo -e "latest version is $LATEST_VERSION"\r\n echo -e "latest snapshot is $LATEST_SNAPSHOT_VERSION"\r\n \r\n if [ -z "$VANILLA_VERSION" ] || [ "$VANILLA_VERSION" == "latest" ]; then\r\n MANIFEST_URL=$(curl -sSL https://launchermeta.mojang.com/mc/game/version_manifest.json | jq --arg VERSION $LATEST_VERSION -r '.versions | .[] | select(.id== $VERSION )|.url')\r\n elif [ "$VANILLA_VERSION" == "snapshot" ]; then\r\n MANIFEST_URL=$(curl -sSL https://launchermeta.mojang.com/mc/game/version_manifest.json | jq --arg VERSION $LATEST_SNAPSHOT_VERSION -r '.versions | .[] | select(.id== $VERSION )|.url')\r\n else\r\n MANIFEST_URL=$(curl -sSL https://launchermeta.mojang.com/mc/game/version_manifest.json | jq --arg VERSION $VANILLA_VERSION -r '.versions | .[] | select(.id== $VERSION )|.url')\r\n fi\r\n \r\n DOWNLOAD_URL=$(curl ${MANIFEST_URL} | jq .downloads.server | jq -r '. | .url')\r\n \r\n echo -e "running: curl -o ${SERVER_JARFILE} $DOWNLOAD_URL"\r\n curl -o ${SERVER_JARFILE} $DOWNLOAD_URL\r\n \r\n echo -e "Install Complete" """ "entry" => "ash" "container" => "ghcr.io/pterodactyl/installers:alpine" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 2 "uuid" => "03ee6f03-1ab4-4daa-9244-d392e7c7e006" "name" => "Sponge (SpongeVanilla)" "nest" => 1 "author" => "[email protected]" "description" => "SpongeVanilla is the SpongeAPI implementation for Vanilla Minecraft." "docker_image" => "ghcr.io/pterodactyl/yolks:java_21" "docker_images" => [ "Java 21" => "ghcr.io/pterodactyl/yolks:java_21" "Java 16" => "ghcr.io/pterodactyl/yolks:java_16" "Java 11" => "ghcr.io/pterodactyl/yolks:java_11" "Java 8" => "ghcr.io/pterodactyl/yolks:java_8" ] "config" => [ "files" => [ "server.properties" => [ "parser" => "properties" "find" => [ "server-ip" => "0.0.0.0" "server-port" => "{{server.build.default.port}}" "query.port" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => ")! For help, type " ] "stop" => "stop" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/ash\r\n # Sponge Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n cd /mnt/server\r\n \r\n curl -sSL "https://repo.spongepowered.org/maven/org/spongepowered/spongevanilla/${SPONGE_VERSION}/spongevanilla-${SPONGE_VERSION}.jar" -o ${SERVER_JARFILE} """ "entry" => "ash" "container" => "ghcr.io/pterodactyl/installers:alpine" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 3 "uuid" => "2302a597-ee47-4c0e-bbee-eb288868c99e" "name" => "Bungeecord" "nest" => 1 "author" => "[email protected]" "description" => "For a long time, Minecraft server owners have had a dream that encompasses a free, easy, and reliable way to connect multiple Minecraft servers together. BungeeCord is the answer to said dream. Whether you are a small server wishing to string multiple game-modes together, or the owner of the ShotBow Network, BungeeCord is the ideal solution for you. With the help of BungeeCord, you will be able to unlock your community's full potential." "docker_image" => "ghcr.io/pterodactyl/yolks:java_21" "docker_images" => [ "Java 21" => "ghcr.io/pterodactyl/yolks:java_21" "Java 17" => "ghcr.io/pterodactyl/yolks:java_17" "Java 16" => "ghcr.io/pterodactyl/yolks:java_16" "Java 11" => "ghcr.io/pterodactyl/yolks:java_11" "Java 8" => "ghcr.io/pterodactyl/yolks:java_8" ] "config" => [ "files" => [ "config.yml" => [ "parser" => "yaml" "find" => [ "listeners[0].query_port" => "{{server.build.default.port}}" "listeners[0].host" => "0.0.0.0:{{server.build.default.port}}" "servers.*.address" => [ "regex:^(127\.0\.0\.1|localhost)(:\d{1,5})?$" => "{{config.docker.interface}}$2" ] ] ] ] "startup" => [ "done" => "Listening on " ] "stop" => "end" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "java -Xms128M -XX:MaxRAMPercentage=95.0 -jar {{SERVER_JARFILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/ash\r\n # Bungeecord Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n cd /mnt/server\r\n \r\n if [ -z "${BUNGEE_VERSION}" ] || [ "${BUNGEE_VERSION}" == "latest" ]; then\r\n BUNGEE_VERSION="lastStableBuild"\r\n fi\r\n \r\n curl -o ${SERVER_JARFILE} https://ci.md-5.net/job/BungeeCord/${BUNGEE_VERSION}/artifact/bootstrap/target/BungeeCord.jar """ "entry" => "ash" "container" => "ghcr.io/pterodactyl/installers:alpine" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 4 "uuid" => "7c7b0193-fee4-4d79-9a37-415c9f8c712b" "name" => "Forge Minecraft" "nest" => 1 "author" => "[email protected]" "description" => "Minecraft Forge Server. Minecraft Forge is a modding API (Application Programming Interface), which makes it easier to create mods, and also make sure mods are compatible with each other." "docker_image" => "ghcr.io/pterodactyl/yolks:java_21" "docker_images" => [ "Java 21" => "ghcr.io/pterodactyl/yolks:java_21" "Java 17" => "ghcr.io/pterodactyl/yolks:java_17" "Java 16" => "ghcr.io/pterodactyl/yolks:java_16" "Java 11" => "ghcr.io/pterodactyl/yolks:java_11" "Java 8" => "ghcr.io/pterodactyl/yolks:java_8" ] "config" => [ "files" => [ "server.properties" => [ "parser" => "properties" "find" => [ "server-ip" => "0.0.0.0" "server-port" => "{{server.build.default.port}}" "query.port" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => ")! For help, type " ] "stop" => "stop" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true $( [[ ! -f unix_args.txt ]] && printf %s "-jar {{SERVER_JARFILE}}" || printf %s "@unix_args.txt" )" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n sudo apt update\r\n sudo apt install jq\r\n \r\n if [ "$MC_VERSION" = "latest" ]; then\r\n echo "Latest selected"\r\n \tMC_VERSION="1.21.11"\r\n fi\r\n \r\n if [ -k "$FORGE_VERSION" ]; then\r\n echo "Latest selected"\r\n \tcurl -s https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json -o promotions_slim.json\r\n \tFORGE_VERSION=$(jq -r ".promos.\"$MC_VERSION-recommended\"" promotions_slim.json)\r\n fi\r\n \r\n URL="https://maven.minecraftforge.net/net/minecraftforge/forge/${MC_VERSION}-${FORGE_VERSION}/forge-${MC_VERSION}-${FORGE_VERSION}-installer.jar"\r\n \r\n echo "Installing..."\r\n wget $URL -O forge-installer.jar\r\n java -jar forge-installer.jar """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/yolks:java_21" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2026-03-05T02:31:33+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 5 "uuid" => "666faf08-f0de-407d-a095-74b3b467a24e" "name" => "Paper" "nest" => 1 "author" => "[email protected]" "description" => "High performance Spigot fork that aims to fix gameplay and mechanics inconsistencies." "docker_image" => "ghcr.io/pterodactyl/yolks:java_8" "docker_images" => [ "Java 8" => "ghcr.io/pterodactyl/yolks:java_8" "Java 11" => "ghcr.io/pterodactyl/yolks:java_11" "Java 16" => "ghcr.io/pterodactyl/yolks:java_16" "Java 17" => "ghcr.io/pterodactyl/yolks:java_17" "Java 18" => "ghcr.io/pterodactyl/yolks:java_18" "Java 21" => "ghcr.io/pterodactyl/yolks:java_21" ] "config" => [ "files" => [ "server.properties" => [ "parser" => "properties" "find" => [ "server-ip" => "0.0.0.0" "server-port" => "{{server.build.default.port}}" "query.port" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => ")! For help, type " ] "stop" => "stop" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/ash\r\n # Paper Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n PROJECT=paper\r\n \r\n if [ -n "${DL_PATH}" ]; then\r\n \techo -e "Using supplied download url: ${DL_PATH}"\r\n \tDOWNLOAD_URL=`eval echo $(echo ${DL_PATH} | sed -e 's/{{/${/g' -e 's/}}/}/g')`\r\n else\r\n \tVER_EXISTS=`curl -s https://api.papermc.io/v2/projects/${PROJECT} | jq -r --arg VERSION $MINECRAFT_VERSION '.versions[] | contains($VERSION)' | grep -m1 true`\r\n \tLATEST_VERSION=`curl -s https://api.papermc.io/v2/projects/${PROJECT} | jq -r '.versions' | jq -r '.[-1]'`\r\n \r\n \tif [ "${VER_EXISTS}" == "true" ]; then\r\n \t\techo -e "Version is valid. Using version ${MINECRAFT_VERSION}"\r\n \telse\r\n \t\techo -e "Specified version not found. Defaulting to the latest ${PROJECT} version"\r\n \t\tMINECRAFT_VERSION=${LATEST_VERSION}\r\n \tfi\r\n \r\n \tBUILD_EXISTS=`curl -s https://api.papermc.io/v2/projects/${PROJECT}/versions/${MINECRAFT_VERSION} | jq -r --arg BUILD ${BUILD_NUMBER} '.builds[] | tostring | contains($BUILD)' | grep -m1 true`\r\n \tLATEST_BUILD=`curl -s https://api.papermc.io/v2/projects/${PROJECT}/versions/${MINECRAFT_VERSION} | jq -r '.builds' | jq -r '.[-1]'`\r\n \r\n \tif [ "${BUILD_EXISTS}" == "true" ]; then\r\n \t\techo -e "Build is valid for version ${MINECRAFT_VERSION}. Using build ${BUILD_NUMBER}"\r\n \telse\r\n \t\techo -e "Using the latest ${PROJECT} build for version ${MINECRAFT_VERSION}"\r\n \t\tBUILD_NUMBER=${LATEST_BUILD}\r\n \tfi\r\n \r\n \tJAR_NAME=${PROJECT}-${MINECRAFT_VERSION}-${BUILD_NUMBER}.jar\r\n \r\n \techo "Version being downloaded"\r\n \techo -e "MC Version: ${MINECRAFT_VERSION}"\r\n \techo -e "Build: ${BUILD_NUMBER}"\r\n \techo -e "JAR Name of Build: ${JAR_NAME}"\r\n \tDOWNLOAD_URL=https://api.papermc.io/v2/projects/${PROJECT}/versions/${MINECRAFT_VERSION}/builds/${BUILD_NUMBER}/downloads/${JAR_NAME}\r\n fi\r\n \r\n cd /mnt/server\r\n \r\n echo -e "Running curl -o ${SERVER_JARFILE} ${DOWNLOAD_URL}"\r\n \r\n if [ -f ${SERVER_JARFILE} ]; then\r\n \tmv ${SERVER_JARFILE} ${SERVER_JARFILE}.old\r\n fi\r\n \r\n curl -o ${SERVER_JARFILE} ${DOWNLOAD_URL}\r\n \r\n if [ ! -f server.properties ]; then\r\n echo -e "Downloading MC server.properties"\r\n curl -o server.properties https://raw.githubusercontent.com/parkervcp/eggs/master/minecraft/java/server.properties\r\n fi """ "entry" => "ash" "container" => "ghcr.io/parkervcp/installers:alpine" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-08T23:53:39+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 54 "uuid" => "b9e10a36-f6a0-43dc-bd3a-50976ab5ee2c" "name" => "Fabric" "nest" => 1 "author" => "[email protected]" "description" => "Fabric is a modular modding toolchain targeting Minecraft 1.14 and above, including snapshots." "docker_image" => "ghcr.io/pterodactyl/yolks:java_21" "docker_images" => [ "Java 21" => "ghcr.io/pterodactyl/yolks:java_21" ] "config" => [ "files" => [ "server.properties" => [ "parser" => "properties" "find" => [ "server-ip" => "0.0.0.0" "enable-query" => "true" "server-port" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => ")! For help, type " "userInteraction" => [ "Go to eula.txt for more info." ] ] "stop" => "stop" "logs" => [ "custom" => false "location" => "logs/latest.log" ] "file_denylist" => [] "extends" => null ] "startup" => "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Fabric MC Installation Script\r\n # Server Files: /mnt/server\r\n \r\n apt update\r\n apt install -y curl jq wget\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n if [ -z "$MC_VERSION" ] || [ "$MC_VERSION" == "latest" ]; then\r\n MC_VERSION=$(curl -sSL https://meta.fabricmc.net/v2/versions/game | jq -r '[.[] | select(.stable==true)][0].version')\r\n fi\r\n \r\n if [ -z "$LOADER_VERSION" ] || [ "$LOADER_VERSION" == "latest" ]; then\r\n LOADER_VERSION=$(curl -sSL https://meta.fabricmc.net/v2/versions/loader | jq -r '[.[] | select(.stable==true)][0].version')\r\n fi\r\n \r\n INSTALLER_VERSION=$(curl -sSL https://meta.fabricmc.net/v2/versions/installer | jq -r '.[0].version')\r\n \r\n echo "MC: $MC_VERSION | Loader: $LOADER_VERSION | Installer: $INSTALLER_VERSION"\r\n \r\n wget -O server.jar "https://meta.fabricmc.net/v2/versions/loader/${MC_VERSION}/${LOADER_VERSION}/${INSTALLER_VERSION}/server/jar"\r\n \r\n echo "eula=true" > eula.txt\r\n \r\n echo "Install complete" """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/installers:debian" "extends" => null ] "created_at" => "2025-12-14T02:07:36+00:00" "updated_at" => "2026-03-20T19:35:18+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 57 "uuid" => "5c4ed198-ff96-47cb-a2ee-6a0c9b684c15" "name" => "NeoForge" "nest" => 1 "author" => "[email protected]" "description" => "NeoForge Server. NeoForge is a modding API (Application Programming Interface), which makes it easier to create mods, and also make sure mods are compatible with each other. NeoForge is a fork of Minecraft Forge." "docker_image" => "ghcr.io/ptero-eggs/yolks:java_17" "docker_images" => [ "Java 17" => "ghcr.io/ptero-eggs/yolks:java_17" "java 21" => "ghcr.io/ptero-eggs/yolks:java_21" "java 22" => "ghcr.io/ptero-eggs/yolks:java_22" ] "config" => [ "files" => [ "server.properties" => [ "parser" => "properties" "find" => [ "server-ip" => "0.0.0.0" "server-port" => "{{server.build.default.port}}" "query.port" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => ")! For help, type " ] "stop" => "stop" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true @unix_args.txt" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # NeoForge Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n apt-get update\r\n apt-get install -y curl xq openjdk-17-jdk\r\n \r\n if [[ ! -d /mnt/server ]]; then\r\n mkdir /mnt/server\r\n fi\r\n \r\n cd /mnt/server\r\n \r\n # Remove spaces from the version number to avoid issues with curl\r\n NEOFORGE_VERSION="$(echo "$NEOFORGE_VERSION" | tr -d ' ')"\r\n MC_VERSION="$(echo "$MC_VERSION" | tr -d ' ')"\r\n \r\n # If we have a specific NeoForge version set, use that\r\n if [[ ! -z ${NEOFORGE_VERSION} ]]; then\r\n if [[ "${NEOFORGE_VERSION}" =~ "1.20.1-" ]]; then\r\n ARTIFACT_NAME="forge"\r\n else\r\n ARTIFACT_NAME="neoforge"\r\n fi\r\n \r\n BASE_URL="https://maven.neoforged.net/releases/net/neoforged/${ARTIFACT_NAME}/${NEOFORGE_VERSION}/"\r\n echo "Fetching file list from: ${BASE_URL}"\r\n FILE_LIST=$(curl -s "${BASE_URL}" | grep -oP 'href="[^"]+"' | cut -d'"' -f2)\r\n \r\n INSTALLER_JAR=$(echo "$FILE_LIST" | grep -E "${ARTIFACT_NAME}-${NEOFORGE_VERSION}.*installer.*\.jar$" | head -n1)\r\n if [[ -z "$INSTALLER_JAR" ]]; then\r\n INSTALLER_JAR=$(echo "$FILE_LIST" | grep -E "${ARTIFACT_NAME}-${NEOFORGE_VERSION}.*universal.*\.jar$" | head -n1)\r\n fi\r\n if [[ -z "$INSTALLER_JAR" ]]; then\r\n echo "Could not find a valid JAR file for NeoForge version ${NEOFORGE_VERSION}."\r\n exit 1\r\n fi\r\n \r\n echo "Downloading ${INSTALLER_JAR}..."\r\n curl -o "${INSTALLER_JAR}" "${BASE_URL}${INSTALLER_JAR}"\r\n else\r\n if [[ "${MC_VERSION}" == "1.20.1" ]]; then\r\n XML_DATA=$(curl -sSL https://maven.neoforged.net/releases/net/neoforged/forge/maven-metadata.xml)\r\n ARTIFACT_NAME="forge"\r\n NEOFORGE_OLD=1\r\n else\r\n XML_DATA=$(curl -sSL https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml)\r\n ARTIFACT_NAME="neoforge"\r\n fi\r\n \r\n REPO_URL="https://maven.neoforged.net/releases/net/neoforged/${ARTIFACT_NAME}/"\r\n \r\n if [[ "${MC_VERSION}" == "latest" ]] || [[ "${MC_VERSION}" == "" ]]; then\r\n echo "Getting latest version of NeoForge."\r\n MC_VERSION="1.$(echo -e ${XML_DATA} | xq -x '/metadata/versioning/release' | cut -d'.' -f1-2)"\r\n fi\r\n \r\n echo "Minecraft version: ${MC_VERSION}"\r\n \r\n if [[ -z "${NEOFORGE_OLD}" ]]; then\r\n if [[ "${MC_VERSION}" == *.*.* ]]; then\r\n VERSION_KEY="$(echo -n ${MC_VERSION} | cut -d'.' -f2-)."\r\n else\r\n VERSION_KEY=$(echo -n ${MC_VERSION} | cut -d'.' -f2-)\r\n fi\r\n else\r\n VERSION_KEY="${MC_VERSION}-"\r\n fi\r\n \r\n NEOFORGE_VERSION=$(echo -e ${XML_DATA} | xq -x "(/metadata/versioning/versions/*[starts-with(text(), '${VERSION_KEY}')])" | tail -n1)\r\n if [[ -z "${NEOFORGE_VERSION}" ]]; then\r\n echo "The install failed, because there is no valid version of NeoForge for Minecraft version ${MC_VERSION}."\r\n exit 1\r\n fi\r\n \r\n BASE_URL="${REPO_URL}${NEOFORGE_VERSION}/"\r\n echo "Resolved NeoForge version: ${NEOFORGE_VERSION}"\r\n FILE_LIST=$(curl -s "${BASE_URL}" | grep -oP 'href="[^"]+"' | cut -d'"' -f2)\r\n \r\n INSTALLER_JAR=$(echo "$FILE_LIST" | grep -E "${ARTIFACT_NAME}-${NEOFORGE_VERSION}.*installer.*\.jar$" | head -n1)\r\n if [[ -z "$INSTALLER_JAR" ]]; then\r\n INSTALLER_JAR=$(echo "$FILE_LIST" | grep -E "${ARTIFACT_NAME}-${NEOFORGE_VERSION}.*universal.*\.jar$" | head -n1)\r\n fi\r\n if [[ -z "$INSTALLER_JAR" ]]; then\r\n echo "Could not find a valid JAR file for NeoForge version ${NEOFORGE_VERSION}."\r\n exit 1\r\n fi\r\n \r\n echo "Downloading ${INSTALLER_JAR}..."\r\n curl -o "${INSTALLER_JAR}" "${BASE_URL}${INSTALLER_JAR}"\r\n fi\r\n \r\n # Clean previous install (for downgrade/upgrade support)\r\n rm -rf libraries/net/neoforged/${ARTIFACT_NAME}\r\n \r\n # Run the installer to generate startup arguments\r\n echo "Running installer..."\r\n java -jar "${INSTALLER_JAR}" --installServer\r\n \r\n # Symlink unix_args.txt if it exists\r\n if [[ -f "libraries/net/neoforged/${ARTIFACT_NAME}/${NEOFORGE_VERSION}/unix_args.txt" ]]; then\r\n ln -sf "libraries/net/neoforged/${ARTIFACT_NAME}/${NEOFORGE_VERSION}/unix_args.txt" unix_args.txt\r\n fi\r\n \r\n if [[ ! -f unix_args.txt ]]; then\r\n echo "Installer did not generate unix_args.txt. Installation failed."\r\n exit 1\r\n fi\r\n \r\n # Removal of unnecessary files\r\n rm run.bat\r\n rm run.sh\r\n \r\n echo "Installation complete." """ "entry" => "bash" "container" => "ghcr.io/ptero-eggs/installers:debian" "extends" => null ] "created_at" => "2025-12-20T00:10:02+00:00" "updated_at" => "2025-12-20T00:10:02+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 2 "uuid" => "9dce2ca4-f223-4476-822f-9b517e0cd3f9" "author" => "[email protected]" "name" => "Source Engine" "description" => "Includes support for most Source Dedicated Server games." "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 6 "uuid" => "81ec74cc-c206-422b-b9b9-79ddbeda13c3" "name" => "Insurgency" "nest" => 2 "author" => "[email protected]" "description" => "Take to the streets for intense close quarters combat, where a team's survival depends upon securing crucial strongholds and destroying enemy supply in this multiplayer and cooperative Source Engine based experience." "docker_image" => "ghcr.io/pterodactyl/games:source" "docker_images" => [ "ghcr.io/pterodactyl/games:source" => "ghcr.io/pterodactyl/games:source" ] "config" => [ "files" => [] "startup" => [ "done" => "gameserver Steam ID" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./srcds_run -game insurgency -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login anonymous +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} +quit\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/installers:debian" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 7 "uuid" => "89a7df10-002a-4e2c-980f-760bdfad1cda" "name" => "Garrys Mod" "nest" => 2 "author" => "[email protected]" "description" => "Garrys Mod, is a sandbox physics game created by Garry Newman, and developed by his company, Facepunch Studios." "docker_image" => "ghcr.io/pterodactyl/games:source" "docker_images" => [ "ghcr.io/pterodactyl/games:source" => "ghcr.io/pterodactyl/games:source" ] "config" => [ "files" => [] "startup" => [ "done" => "gameserver Steam ID" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./srcds_run -game garrysmod -console -port {{SERVER_PORT}} +ip 0.0.0.0 +host_workshop_collection {{WORKSHOP_ID}} +map {{SRCDS_MAP}} +gamemode {{GAMEMODE}} -strictportbind -norestart +sv_setsteamaccount {{STEAM_ACC}} +maxplayers {{MAX_PLAYERS}} -tickrate {{TICKRATE}} $( [ "$LUA_REFRESH" == "1" ] || printf %s '-disableluarefresh' )" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n ## just in case someone removed the defaults.\r\n if [ "${STEAM_USER}" == "" ]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so\r\n \r\n # Creating needed default files for the game\r\n cd /mnt/server/garrysmod/lua/autorun/server\r\n echo '\r\n -- Docs: https://wiki.garrysmod.com/page/resource/AddWorkshop\r\n -- Place the ID of the workshop addon you want to be downloaded to people who join your server, not the collection ID\r\n -- Use https://beta.configcreator.com/create/gmod/resources.lua to easily create a list based on your collection ID\r\n \r\n resource.AddWorkshop( "" )\r\n ' > workshop.lua\r\n \r\n cd /mnt/server/garrysmod/cfg\r\n echo '\r\n // Please do not set RCon in here, use the startup parameters.\r\n \r\n hostname\t\t"New Gmod Server"\r\n sv_password\t\t""\r\n sv_loadingurl ""\r\n sv_downloadurl ""\r\n \r\n // Steam Server List Settings\r\n // sv_location "eu"\r\n sv_region "255"\r\n sv_lan "0"\r\n sv_max_queries_sec_global "30000"\r\n sv_max_queries_window "45"\r\n sv_max_queries_sec "5"\r\n \r\n // Server Limits\r\n sbox_maxprops\t\t100\r\n sbox_maxragdolls\t5\r\n sbox_maxnpcs\t\t10\r\n sbox_maxballoons\t10\r\n sbox_maxeffects\t\t10\r\n sbox_maxdynamite\t10\r\n sbox_maxlamps\t\t10\r\n sbox_maxthrusters\t10\r\n sbox_maxwheels\t\t10\r\n sbox_maxhoverballs\t10\r\n sbox_maxvehicles\t20\r\n sbox_maxbuttons\t\t10\r\n sbox_maxsents\t\t20\r\n sbox_maxemitters\t5\r\n sbox_godmode\t\t0\r\n sbox_noclip\t\t 0\r\n \r\n // Network Settings - Please keep these set to default.\r\n \r\n sv_minrate\t\t75000\r\n sv_maxrate\t\t0\r\n gmod_physiterations\t2\r\n net_splitpacket_maxrate\t45000\r\n decalfrequency\t\t12 \r\n \r\n // Execute Ban Files - Please do not edit\r\n exec banned_ip.cfg \r\n exec banned_user.cfg \r\n \r\n // Add custom lines under here\r\n ' > server.cfg """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/installers:debian" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 8 "uuid" => "b498cbc3-3dfb-4b88-8fc6-ff93e7d2f763" "name" => "Custom Source Engine Game" "nest" => 2 "author" => "[email protected]" "description" => "This option allows modifying the startup arguments and other details to run a custom SRCDS based game on the panel." "docker_image" => "ghcr.io/pterodactyl/games:source" "docker_images" => [ "ghcr.io/pterodactyl/games:source" => "ghcr.io/pterodactyl/games:source" ] "config" => [ "files" => [] "startup" => [ "done" => "gameserver Steam ID" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./srcds_run -game {{SRCDS_GAME}} -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n ##\r\n #\r\n # Variables\r\n # STEAM_USER, STEAM_PASS, STEAM_AUTH - Steam user setup. If a user has 2fa enabled it will most likely fail due to timeout. Leave blank for anon install.\r\n # WINDOWS_INSTALL - if it's a windows server you want to install set to 1\r\n # SRCDS_APPID - steam app id ffound here - https://developer.valvesoftware.com/wiki/Dedicated_Servers_List\r\n # EXTRA_FLAGS - when a server has extra glas for things like beta installs or updates.\r\n #\r\n ##\r\n \r\n \r\n ## just in case someone removed the defaults.\r\n if [ "${STEAM_USER}" == "" ]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/installers:debian" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 9 "uuid" => "154f42c7-2d50-45fe-93f6-87cafe780c7c" "name" => "Team Fortress 2" "nest" => 2 "author" => "[email protected]" "description" => "Team Fortress 2 is a team-based first-person shooter multiplayer video game developed and published by Valve Corporation. It is the sequel to the 1996 mod Team Fortress for Quake and its 1999 remake." "docker_image" => "ghcr.io/pterodactyl/games:source" "docker_images" => [ "ghcr.io/pterodactyl/games:source" => "ghcr.io/pterodactyl/games:source" ] "config" => [ "files" => [] "startup" => [ "done" => "gameserver Steam ID" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./srcds_run -game tf -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart +sv_setsteamaccount {{STEAM_ACC}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n # Image to install with is 'debian:buster-slim'\r\n \r\n ##\r\n #\r\n # Variables\r\n # STEAM_USER, STEAM_PASS, STEAM_AUTH - Steam user setup. If a user has 2fa enabled it will most likely fail due to timeout. Leave blank for anon install.\r\n # WINDOWS_INSTALL - if it's a windows server you want to install set to 1\r\n # SRCDS_APPID - steam app id ffound here - https://developer.valvesoftware.com/wiki/Dedicated_Servers_List\r\n # EXTRA_FLAGS - when a server has extra glas for things like beta installs or updates.\r\n #\r\n ##\r\n \r\n ## just in case someone removed the defaults.\r\n if [ "${STEAM_USER}" == "" ]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/installers:debian" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 10 "uuid" => "57bd70ad-5505-4b0b-bdf3-c603106cdf59" "name" => "Ark: Survival Evolved" "nest" => 2 "author" => "[email protected]" "description" => "As a man or woman stranded, naked, freezing, and starving on the unforgiving shores of a mysterious island called ARK, use your skill and cunning to kill or tame and ride the plethora of leviathan dinosaurs and other primeval creatures roaming the land. Hunt, harvest resources, craft items, grow crops, research technologies, and build shelters to withstand the elements and store valuables, all while teaming up with (or preying upon) hundreds of other players to survive, dominate... and escape! — Gamepedia: ARK" "docker_image" => "quay.io/parkervcp/pterodactyl-images:debian_source" "docker_images" => [ "quay.io/parkervcp/pterodactyl-images:debian_source" => "quay.io/parkervcp/pterodactyl-images:debian_source" ] "config" => [ "files" => [] "startup" => [ "done" => "Waiting commands for 127.0.0.1:" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "rmv() { echo -e "stopping server"; rcon -t rcon -a 127.0.0.1:${RCON_PORT} -p ${ARK_ADMIN_PASSWORD} -c saveworld && rcon -a 127.0.0.1:${RCON_PORT} -p ${ARK_ADMIN_PASSWORD} -c DoExit; }; trap rmv 15; cd ShooterGame/Binaries/Linux && ./ShooterGameServer {{SERVER_MAP}}?listen?SessionName="{{SESSION_NAME}}"?ServerPassword={{ARK_PASSWORD}}?ServerAdminPassword={{ARK_ADMIN_PASSWORD}}?Port={{SERVER_PORT}}?RCONPort={{RCON_PORT}}?QueryPort={{QUERY_PORT}}?RCONEnabled=True$( [ "$BATTLE_EYE" == "1" ] || printf %s ' -NoBattlEye' ) -server {{ARGS}} -log & until echo "waiting for rcon connection..."; rcon -t rcon -a 127.0.0.1:${RCON_PORT} -p ${ARK_ADMIN_PASSWORD}; do sleep 5; done" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n # Image to install with is 'ubuntu:18.04'\r\n \r\n ## just in case someone removed the defaults.\r\n if [ "${STEAM_USER}" == "" ]; then\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n \r\n mkdir -p /mnt/server/Engine/Binaries/ThirdParty/SteamCMD/Linux\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/Engine/Binaries/ThirdParty/SteamCMD/Linux\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so\r\n \r\n ## create a symbolic link for loading mods\r\n cd /mnt/server/Engine/Binaries/ThirdParty/SteamCMD/Linux\r\n ln -sf ../../../../../Steam/steamapps steamapps\r\n cd /mnt/server """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/installers:debian" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 11 "uuid" => "5fac0ce8-0e21-43c0-9a34-e36a4b58174f" "name" => "Counter-Strike: Global Offensive" "nest" => 2 "author" => "[email protected]" "description" => "Counter-Strike: Global Offensive is a multiplayer first-person shooter video game developed by Hidden Path Entertainment and Valve Corporation." "docker_image" => "ghcr.io/pterodactyl/games:source" "docker_images" => [ "ghcr.io/pterodactyl/games:source" => "ghcr.io/pterodactyl/games:source" ] "config" => [ "files" => [] "startup" => [ "done" => "Connection to Steam servers successful" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./srcds_run -game csgo -console -port {{SERVER_PORT}} +ip 0.0.0.0 +map {{SRCDS_MAP}} -strictportbind -norestart +sv_setsteamaccount {{STEAM_ACC}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n ## just in case someone removed the defaults.\r\n if [ "${STEAM_USER}" == "" ]; then\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/installers:debian" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 3 "uuid" => "9f177480-5085-45e4-bda3-d493767ed4a8" "author" => "[email protected]" "name" => "Voice Servers" "description" => "Voice servers such as Mumble and Teamspeak 3." "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 12 "uuid" => "3a567bc4-1877-41c6-bc6d-36b99a161304" "name" => "Teamspeak3 Server" "nest" => 3 "author" => "[email protected]" "description" => "VoIP software designed with security in mind, featuring crystal clear voice quality, endless customization options, and scalabilty up to thousands of simultaneous users." "docker_image" => "ghcr.io/pterodactyl/yolks:debian" "docker_images" => [ "ghcr.io/pterodactyl/yolks:debian" => "ghcr.io/pterodactyl/yolks:debian" ] "config" => [ "files" => [] "startup" => [ "done" => "listening on 0.0.0.0:" ] "stop" => "^C" "logs" => [ "custom" => true "location" => "logs/ts3.log" ] "file_denylist" => [] "extends" => null ] "startup" => "./ts3server default_voice_port={{SERVER_PORT}} query_port={{QUERY_PORT}} filetransfer_ip=0.0.0.0 filetransfer_port={{FILE_TRANSFER}} query_http_port={{QUERY_HTTP}} query_ssh_port={{QUERY_SSH}} query_protocols={{QUERY_PROTOCOLS_VAR}} license_accepted=1" "script" => [ "privileged" => true "install" => """ #!/bin/ash\r\n # TS3 Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n if [ -z ${TS_VERSION} ] || [ ${TS_VERSION} == latest ]; then\r\n TS_VERSION=$(curl -sSL https://teamspeak.com/versions/server.json | jq -r '.linux.x86_64.version')\r\n fi\r\n \r\n cd /mnt/server\r\n \r\n echo -e "getting files from http://files.teamspeak-services.com/releases/server/${TS_VERSION}/teamspeak3-server_linux_amd64-${TS_VERSION}.tar.bz2" \r\n curl -L http://files.teamspeak-services.com/releases/server/${TS_VERSION}/teamspeak3-server_linux_amd64-${TS_VERSION}.tar.bz2 | tar -xvj --strip-components=1\r\n cp ./redist/libmariadb.so.2 ./ """ "entry" => "ash" "container" => "ghcr.io/pterodactyl/installers:alpine" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 13 "uuid" => "a9a3f8dd-4257-4dcd-9378-3c46553885d7" "name" => "Mumble Server" "nest" => 3 "author" => "[email protected]" "description" => "Mumble is an open source, low-latency, high quality voice chat software primarily intended for use while gaming." "docker_image" => "ghcr.io/parkervcp/yolks:voice_mumble" "docker_images" => [ "Mumble" => "ghcr.io/parkervcp/yolks:voice_mumble" ] "config" => [ "files" => [ "murmur.ini" => [ "parser" => "ini" "find" => [ "database" => "/home/container/murmur.sqlite" "logfile" => "/home/container/murmur.log" "port" => "{{server.build.default.port}}" "host" => "0.0.0.0" "users" => "{{server.build.env.MAX_USERS}}" ] ] ] "startup" => [ "done" => "Server listening on" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "mumble-server -fg -ini murmur.ini" "script" => [ "privileged" => true "install" => """ #!/bin/ash\r\n \r\n if [ ! -d /mnt/server/ ]; then\r\n mkdir /mnt/server/\r\n fi\r\n \r\n cd /mnt/server\r\n \r\n FILE=/mnt/server/murmur.ini\r\n if [ -f "$FILE" ]; then\r\n echo "Config file already exists."\r\n else \r\n echo "Downloading the config file."\r\n apk add --no-cache murmur\r\n cp /etc/murmur.ini /mnt/server/murmur.ini\r\n apk del murmur\r\n fi\r\n echo "done" """ "entry" => "ash" "container" => "ghcr.io/pterodactyl/installers:alpine" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 4 "uuid" => "f15b2eca-14fb-4400-bc77-938840b66203" "author" => "[email protected]" "name" => "Rust" "description" => "Rust - A game where you must fight to survive." "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 14 "uuid" => "15c8eda0-e72d-48e9-8f5b-39efc2d426f4" "name" => "Rust" "nest" => 4 "author" => "[email protected]" "description" => "The only aim in Rust is to survive. To do this you will need to overcome struggles such as hunger, thirst and cold. Build a fire. Build a shelter. Kill animals for meat. Protect yourself from other players, and kill them for meat. Create alliances with other players and form a town. Do whatever it takes to survive." "docker_image" => "ghcr.io/pterodactyl/games:rust" "docker_images" => [ "ghcr.io/pterodactyl/games:rust" => "ghcr.io/pterodactyl/games:rust" ] "config" => [ "files" => [] "startup" => [ "done" => "Server startup complete" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./RustDedicated -batchmode +server.port {{SERVER_PORT}} +server.queryport {{QUERY_PORT}} +server.identity "rust" +rcon.port {{RCON_PORT}} +rcon.web true +server.hostname \"{{HOSTNAME}}\" +server.level \"{{LEVEL}}\" +server.description \"{{DESCRIPTION}}\" +server.url \"{{SERVER_URL}}\" +server.headerimage \"{{SERVER_IMG}}\" +server.logoimage \"{{SERVER_LOGO}}\" +server.maxplayers {{MAX_PLAYERS}} +rcon.password \"{{RCON_PASS}}\" +server.saveinterval {{SAVEINTERVAL}} +app.port {{APP_PORT}} $( [ -z ${MAP_URL} ] && printf %s "+server.worldsize \"{{WORLD_SIZE}}\" +server.seed \"{{WORLD_SEED}}\"" || printf %s "+server.levelurl {{MAP_URL}}" ) {{ADDITIONAL_ARGS}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n SRCDS_APPID=258550\r\n \r\n ## just in case someone removed the defaults.\r\n if [ "${STEAM_USER}" == "" ]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/installers:debian" "extends" => null ] "created_at" => "2025-12-06T01:08:37+00:00" "updated_at" => "2025-12-06T01:08:37+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 5 "uuid" => "48d40129-18fd-458c-a540-216885896d69" "author" => "[email protected]" "name" => "Terraria" "description" => "Dig, fight, explore, build! Nothing is impossible in this action-packed adventure game." "created_at" => "2025-12-06T23:06:17+00:00" "updated_at" => "2025-12-06T23:15:11+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 15 "uuid" => "1d41cec9-ecf2-43be-92ac-0c45b1cc0054" "name" => "Terraria Vanilla" "nest" => 5 "author" => "[email protected]" "description" => "Dig, fight, explore, build! Nothing is impossible in this action-packed adventure game." "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "Debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [ "serverconfig.txt" => [ "parser" => "properties" "find" => [ "worldpath" => "/home/container/saves/Worlds" "worldname" => "{{server.build.env.WORLD_NAME}}" "world" => "/home/container/saves/Worlds/{{server.build.env.WORLD_NAME}}.wld" "difficulty" => "{{server.build.env.WORLD_DIFFICULTY}}" "autocreate" => "{{server.build.env.WORLD_SIZE}}" "port" => "{{server.build.default.port}}" "maxplayers" => "{{server.build.env.MAX_PLAYERS}}" "motd" => "{{server.build.env.SERVER_MOTD}}" "seed" => "{{server.build.env.WORLD_SEED}}" "password" => "{{server.build.env.PASSWORD}}" "npcstream" => "{{server.build.env.NPCSTREAM}}" ] ] ] "startup" => [ "done" => "Type 'help' for a list of commands" ] "stop" => "exit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./TerrariaServer.bin.x86_64 -config serverconfig.txt" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Vanilla Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n ## install packages to get version and download links\r\n apt update\r\n apt install -y curl wget file unzip jq\r\n \r\n DOWNLOAD_LINK=invalid\r\n \r\n mkdir -p /mnt/server/\r\n cd /mnt/server/\r\n \r\n if [ "${TERRARIA_VERSION}" == "latest" ] || [ "${TERRARIA_VERSION}" == "" ] ; then\r\n V=$(curl -sSL https://terraria.org/api/get/dedicated-servers-names | jq -r .[] | head -1)\r\n DOWNLOAD_LINK="https://terraria.org/api/download/pc-dedicated-server/${V}"\r\n else\r\n CLEAN_VERSION=$(echo ${TERRARIA_VERSION} | sed 's/\.//g')\r\n echo -e "Downloading terraria server files"\r\n DOWNLOAD_LINK=$(curl -sSL https://terraria.wiki.gg/wiki/Server#Downloads | grep '>Terraria Server ' | grep -Eoi '<a [^>]+>' | grep -Eo 'href=\"[^\\\"]+\"' | grep -Eo '(http|https):\/\/[^\"]+' | grep "${CLEAN_VERSION}" | cut -d'?' -f1)\r\n fi \r\n \r\n ## this is a simple script to validate a download url actaully exists\r\n echo ${DOWNLOAD_LINK}\r\n \r\n if [ ! -z "${DOWNLOAD_LINK}" ]; then \r\n if curl --output /dev/null --silent --head --fail ${DOWNLOAD_LINK}; then\r\n echo -e "link is valid."\r\n else \r\n echo -e "link is invalid closing out"\r\n exit 2\r\n fi\r\n fi\r\n \r\n CLEAN_VERSION=$(echo ${DOWNLOAD_LINK##*/} | cut -d'-' -f3 | cut -d'.' -f1)\r\n \r\n \r\n echo -e "running 'curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*/}'" \r\n curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*/}\r\n \r\n echo -e "Unpacking server files"\r\n unzip ${DOWNLOAD_LINK##*/}\r\n \r\n echo -e ""\r\n cp -R ${CLEAN_VERSION}/Linux/* ./\r\n chmod +x TerrariaServer.bin.x86_64\r\n \r\n echo -e "Cleaning up extra files."\r\n rm -rf ${CLEAN_VERSION}\r\n \r\n echo -e "Generating config file"\r\n cat <<EOF > serverconfig.txt\r\n worldpath=/home/container/saves/Worlds\r\n worldname=default\r\n world=/home/container/saves/Worlds/default.wld\r\n difficulty=3\r\n autocreate=1\r\n port=7777\r\n maxplayers=8\r\n EOF\r\n \r\n mkdir -p /mnt/server/saves/Worlds\r\n \r\n echo -e "Install complete" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:06:46+00:00" "updated_at" => "2025-12-06T23:06:46+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 16 "uuid" => "19ee1b72-463f-408a-9d42-32af1bb6bc33" "name" => "tshock" "nest" => 5 "author" => "[email protected]" "description" => """ The t-shock modded terraria server.\r\n \r\n https://tshock.co/ """ "docker_image" => "ghcr.io/parkervcp/yolks:dotnet_6" "docker_images" => [ "Dotnet 6" => "ghcr.io/parkervcp/yolks:dotnet_6" ] "config" => [ "files" => [] "startup" => [ "done" => "Type 'help' for a list of commands" ] "stop" => "exit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./TShock.Server -ip 0.0.0.0 -port {{SERVER_PORT}} -maxplayers {{MAX_PLAYERS}} -world {{WORLD_NAME}}.wld -autocreate {{WORLD_SIZE}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Vanilla tModloader Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n ## install packages to get version and download links\r\n apt update\r\n apt install -y curl wget jq file unzip\r\n \r\n ## get release info and download links\r\n LATEST_JSON=$(curl --silent "https://api.github.com/repos/Pryaxis/TShock/releases/latest")\r\n RELEASES=$(curl --silent "https://api.github.com/repos/Pryaxis/TShock/releases")\r\n MATCH=$([[ "$(uname -m)" == "x86_64" ]] && echo "linux-x64" || echo "linux-arm64")\r\n \r\n echo ${MATCH}\r\n \r\n if [ -z "$TSHOCK_VERSION" ] || [ "$TSHOCK_VERSION" == "latest" ]; then\r\n DOWNLOAD_LINK=$(echo $LATEST_JSON | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH} | head -1 )\r\n else\r\n VERSION_CHECK=$(echo $RELEASES | jq -r --arg VERSION "$TSHOCK_VERSION" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ "$TSHOCK_VERSION" == "$VERSION_CHECK" ]; then\r\n DOWNLOAD_LINK=$(echo $RELEASES | jq -r --arg VERSION "$TSHOCK_VERSION" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH} | head -1 )\r\n else\r\n echo -e "defaulting to latest release"\r\n DOWNLOAD_LINK=$(echo $LATEST_JSON | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH} | head -1)\r\n fi\r\n fi\r\n \r\n ## mkdir and cd to /mnt/server/\r\n mkdir -p /mnt/server\r\n \r\n cd /mnt/server\r\n \r\n ## download release\r\n echo -e "running: wget $DOWNLOAD_LINK"\r\n wget $DOWNLOAD_LINK -O TShock.zip\r\n \r\n unzip -o TShock.zip\r\n \r\n tar xvf TShock-*.tar\r\n \r\n rm TShock.zip TShock-*.tar\r\n \r\n chmod +x TShock.Server\r\n \r\n echo -e "install complete" """ "entry" => "/bin/bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:07:02+00:00" "updated_at" => "2025-12-06T23:07:02+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 17 "uuid" => "4da2d900-ac03-49e6-9b0d-a4da9a563303" "name" => "tModloader" "nest" => 5 "author" => "[email protected]" "description" => "tModLoader is essentially a mod that provides a way to load your own mods without having to work directly with Terraria's source code itself. This means you can easily make mods that are compatible with other people's mods, save yourself the trouble of having to decompile and recompile Terraria.exe, and escape from having to understand all of the obscure "intricacies" of Terraria's source code. It is made to work for Terraria 1.3+." "docker_image" => "ghcr.io/parkervcp/yolks:dotnet_8" "docker_images" => [ "Dotnet 8" => "ghcr.io/parkervcp/yolks:dotnet_8" ] "config" => [ "files" => [ "serverconfig.txt" => [ "parser" => "file" "find" => [ "difficulty" => "difficulty={{server.build.env.DIFFICULTY}}" ] ] ] "startup" => [ "done" => "Type 'help' for a list of commands" ] "stop" => "exit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./tModLoaderServer -ip 0.0.0.0 -port {{SERVER_PORT}} -maxplayers {{MAX_PLAYERS}} -password "{{SERVER_PASSWORD}}" -motd "{{MOTD}}" -lang {{LANGUAGE}} -world ~/saves/Worlds/{{WORLD_NAME}}.wld -worldname {{WORLD_NAME}} -autocreate {{WORLD_SIZE}} -config serverconfig.txt -savedirectory ~/ -tmlsavedirectory ~/saves -modpath ~/mods" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Vanilla tModloader Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n ## install packages to get version and download links\r\n apt update\r\n apt install -y file \r\n \r\n if [ -z "$GITHUB_USER" ] && [ -z "$GITHUB_OAUTH_TOKEN" ] ; then\r\n echo -e "using anon api call"\r\n else\r\n echo -e "user and oauth token set"\r\n alias curl='curl -u $GITHUB_USER:$GITHUB_OAUTH_TOKEN '\r\n fi\r\n \r\n ## get release info and download links\r\n LATEST_JSON=$(curl --silent "https://api.github.com/repos/tmodloader/tmodloader/releases" | jq -c '.[]' | head -1)\r\n RELEASES=$(curl --silent "https://api.github.com/repos/tmodloader/tmodloader/releases" | jq '.[]')\r\n \r\n \r\n if [ -z "$VERSION" ] || [ "$VERSION" == "latest" ]; then\r\n echo -e "defaulting to latest release"\r\n DOWNLOAD_LINK=$(echo $LATEST_JSON | jq .assets | jq -r .[].browser_download_url | grep -i tmodloader.zip)\r\n else\r\n VERSION_CHECK=$(echo $RELEASES | jq -r --arg VERSION "$VERSION" '. | select(.tag_name==$VERSION) | .tag_name')\r\n if [ "$VERSION" == "$VERSION_CHECK" ]; then\r\n if [[ "$VERSION" == v0* ]]; then\r\n DOWNLOAD_LINK=$(echo $RELEASES | jq -r --arg VERSION "$VERSION" '. | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i linux | grep -i zip)\r\n else\r\n DOWNLOAD_LINK=$(echo $RELEASES | jq -r --arg VERSION "$VERSION" '. | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i tmodloader.zip)\r\n fi\r\n else\r\n echo -e "defaulting to latest release"\r\n DOWNLOAD_LINK=$(echo $LATEST_JSON | jq .assets | jq -r .[].browser_download_url | grep -i tmodloader.zip)\r\n fi\r\n fi\r\n \r\n ## mkdir and cd to /mnt/server/\r\n mkdir -p /mnt/server\r\n \r\n cd /mnt/server || exit 5\r\n \r\n ## download release\r\n echo -e "running: curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*/}"\r\n curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*/}\r\n \r\n FILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*/} | cut -d',' -f2 | cut -d' ' -f2)\r\n if [ "$FILETYPE" == "gzip" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*/}\r\n elif [ "$FILETYPE" == "Zip" ]; then\r\n unzip -o ${DOWNLOAD_LINK##*/}\r\n else\r\n echo -e "unknown filetype. Exiting"\r\n exit 2\r\n fi\r\n \r\n if [[ "$VERSION" == v0* ]]; then\r\n chmod +x tModLoaderServer.bin.x86_64\r\n chmod +x tModLoaderServer\r\n else\r\n #tiny startup script for backward compatibility\r\n echo 'dotnet tModLoader.dll -server "$@"' > tModLoaderServer\r\n chmod +x tModLoaderServer\r\n fi\r\n \r\n echo -e "Cleaning up extra files."\r\n rm -rf terraria-server-*.zip rm ${DOWNLOAD_LINK##*/}\r\n if [[ "$VERSION" != v0* ]]; then\r\n rm -rf DedicatedServerUtils LaunchUtils PlatformVariantLibs tModPorter RecentGitHubCommits.txt *.bat *.sh\r\n fi\r\n \r\n ## using config for difficulty as the startup parameter does not work -> config parser\r\n mv /mnt/server/serverconfig.txt /mnt/server/config.txt\r\n sed 's/#difficulty/difficulty/' /mnt/server/config.txt > /mnt/server/serverconfig.txt\r\n rm /mnt/server/config.txt\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:07:09+00:00" "updated_at" => "2025-12-07T03:38:13+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 6 "uuid" => "1ed12d04-9eb6-4e26-acc7-d83e978c5c87" "author" => "[email protected]" "name" => "Assetto Corsa" "description" => "Assetto Corsa (Italian for "Race Setup") is a sim racing video game developed by the Italian video game developer Kunos Simulazioni. It is designed with an emphasis on a realistic racing experience with support for extensive customization and moddability" "created_at" => "2025-12-06T23:13:09+00:00" "updated_at" => "2025-12-06T23:14:54+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 18 "uuid" => "5b1bd62e-7514-4ebd-976b-e03d52d74958" "name" => "Assetto Corsa" "nest" => 6 "author" => "[email protected]" "description" => "Assetto Corsa (Italian for "Race Setup") is a sim racing video game developed by the Italian video game developer Kunos Simulazioni. It is designed with an emphasis on a realistic racing experience with support for extensive customization and moddability" "docker_image" => "ghcr.io/parkervcp/steamcmd:debian" "docker_images" => [ "ghcr.io/parkervcp/steamcmd:debian" => "ghcr.io/parkervcp/steamcmd:debian" ] "config" => [ "files" => [ "cfg/server_cfg.ini" => [ "parser" => "file" "find" => [ "NAME" => "NAME={{server.build.env.HOSTNAME}}" "PASSWORD" => "PASSWORD={{server.build.env.PASSWORD}}" "ADMIN_PASSWORD" => "ADMIN_PASSWORD={{server.build.env.ADM_PASSWORD}}" "UDP_PORT" => "UDP_PORT={{server.build.default.port}}" "TCP_PORT" => "TCP_PORT={{server.build.default.port}}" "HTTP_PORT" => "HTTP_PORT={{server.build.env.HTTP_PORT}}" ] ] ] "startup" => [ "done" => "Server started" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./acServer" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n ## just in case someone removed the defaults.\r\n if [[ "${STEAM_USER}" == "" ]] || [[ "${STEAM_PASS}" == "" ]]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) ${INSTALL_FLAGS} validate +quit\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so\r\n \r\n if [ "${STEAM_USER}" == "anonymous" ]; then\r\n echo -e "ERROR - STEAM USER NOT SET\n"\r\n echo -e "Steam account must have the dedicated server in library to install and host the game\n"\r\n echo -e "You must configure Steam account in the server startup variables, after that reinstall the server\n"\r\n fi\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:14:02+00:00" "updated_at" => "2025-12-06T23:14:02+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 19 "uuid" => "6a72bee7-8c9a-4e0b-8538-7b40731be33d" "name" => "Assetto Corsa (Freeroam + AI)" "nest" => 6 "author" => "[email protected]" "description" => "Custom Assetto Corsa server with focus on freeroam" "docker_image" => "ghcr.io/parkervcp/yolks:dotnet_8" "docker_images" => [ "Dotnet_8" => "ghcr.io/parkervcp/yolks:dotnet_8" ] "config" => [ "files" => [ "cfg/server_cfg.ini" => [ "parser" => "ini" "find" => [ "SERVER.NAME" => "{{server.build.env.SERVER_NAME}}" "SERVER.PASSWORD" => "{{server.build.env.SERVER_PASSWORD}}" "SERVER.ADMIN_PASSWORD" => "{{server.build.env.ADMIN_PASSWORD}}" "SERVER.HTTP_PORT" => "{{server.build.env.HTTP_PORT}}" "SERVER.MAX_CLIENTS" => "{{server.build.env.MAX_CLIENTS}}" "SERVER.UDP_PORT" => "{{server.build.default.port}}" "SERVER.TCP_PORT" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => "Starting update loop with an update rate of" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./AssettoServer" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n apt update\r\n apt -y install curl git jq tar\r\n \r\n ## get release info and download links\r\n LATEST_JSON=$(curl --silent "https://api.github.com/repos/compujuckel/AssettoServer/releases/latest")\r\n RELEASES=$(curl --silent "https://api.github.com/repos/compujuckel/AssettoServer/releases")\r\n MATCH=$([[ "$(uname -m)" == "x86_64" ]] && echo "linux-x64" || echo "linux-arm64")\r\n VERSION=latest\r\n \r\n if [ -z "${VERSION}" ] || [ "${VERSION}" == "latest" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ "${VERSION}" == "${VERSION_CHECK}" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e "defaulting to latest release"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i linux | head -1)\r\n fi\r\n fi\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n curl -sSL -o assetto-server-linux.tar.gz ${DOWNLOAD_URL}\r\n \r\n tar xvf assetto-server-linux.tar.gz\r\n rm assetto-server-linux.tar.gz\r\n chmod +x AssettoServer\r\n \r\n mkdir cfg/\r\n cd cfg/\r\n [ -f "server_cfg.ini" ] || curl -sSL -o "server_cfg.ini" "https://pteropaste.com/plk8mjfcqt4m"\r\n [ -f "extra_cfg.yml" ] || curl -sSL -o "extra_cfg.yml" "https://pteropaste.com/ocd58cq39z0z"\r\n [ -f "entry_list.ini" ] || touch entry_list.ini\r\n \r\n \r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:14:18+00:00" "updated_at" => "2025-12-06T23:14:18+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 7 "uuid" => "dfeb1326-766d-4a1f-af60-549a83f93250" "author" => "[email protected]" "name" => "Ark" "description" => "As a man or woman stranded, naked, freezing, and starving on the unforgiving shores of a mysterious island called ARK, use your skill and cunning to kill or tame and ride the plethora of leviathan dinosaurs and other primeval creatures roaming the land. Hunt, harvest resources, craft items, grow crops, research technologies, and build shelters to withstand the elements and store valuables, all while teaming up with (or preying upon) hundreds of other players to survive, dominate... and escape! — Gamepedia: ARK" "created_at" => "2025-12-06T23:18:35+00:00" "updated_at" => "2025-12-06T23:19:22+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 20 "uuid" => "7bc12317-0d0c-4687-bf03-b848d7382a76" "name" => "Ark: Survival Evolved" "nest" => 7 "author" => "[email protected]" "description" => "As a man or woman stranded, naked, freezing, and starving on the unforgiving shores of a mysterious island called ARK, use your skill and cunning to kill or tame and ride the plethora of leviathan dinosaurs and other primeval creatures roaming the land. Hunt, harvest resources, craft items, grow crops, research technologies, and build shelters to withstand the elements and store valuables, all while teaming up with (or preying upon) hundreds of other players to survive, dominate... and escape! — Gamepedia: ARK" "docker_image" => "ghcr.io/parkervcp/games:source" "docker_images" => [ "ghcr.io/parkervcp/games:source" => "ghcr.io/parkervcp/games:source" ] "config" => [ "files" => [] "startup" => [ "done" => "Waiting commands for 127.0.0.1:" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "rmv() { echo "stopping server"; rcon -t rcon -a 127.0.0.1:${RCON_PORT} -p ${ARK_ADMIN_PASSWORD} saveworld &&rcon -t rcon -a 127.0.0.1:${RCON_PORT} -p ${ARK_ADMIN_PASSWORD} DoExit && wait ${ARK_PID}; echo "Server Closed"; exit; }; trap rmv 15 2; cd ShooterGame/Binaries/Linux && ./ShooterGameServer {{SERVER_MAP}}?listen?SessionName="{{SESSION_NAME}}"?ServerPassword={{ARK_PASSWORD}}?ServerAdminPassword={{ARK_ADMIN_PASSWORD}}?Port={{SERVER_PORT}}?RCONPort={{RCON_PORT}}?QueryPort={{QUERY_PORT}}?RCONEnabled=True?MaxPlayers={{MAX_PLAYERS}}?GameModIds={{MOD_ID}}$( [ "$BATTLE_EYE" == "1" ] || printf %s ' -NoBattlEye' ) -server -automanagedmods {{ARGS}} -log & ARK_PID=$! ; until echo "waiting for rcon connection..."; (rcon -t rcon -a 127.0.0.1:${RCON_PORT} -p ${ARK_ADMIN_PASSWORD})<&0 & wait $!; do sleep 5; done" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n # Image to install with is 'ubuntu:18.04'\r\n apt -y update\r\n apt -y --no-install-recommends --no-install-suggests install curl lib32gcc-s1 ca-certificates\r\n \r\n ## just in case someone removed the defaults.\r\n if [ "${STEAM_USER}" == "" ]; then\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n \r\n mkdir -p /mnt/server/Engine/Binaries/ThirdParty/SteamCMD/Linux\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/Engine/Binaries/ThirdParty/SteamCMD/Linux\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +force_install_dir /mnt/server +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so\r\n \r\n ## create a symbolic link for loading mods\r\n cd /mnt/server/Engine/Binaries/ThirdParty/SteamCMD/Linux\r\n ln -sf ../../../../../Steam/steamapps steamapps\r\n cd /mnt/server """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:18:45+00:00" "updated_at" => "2025-12-06T23:18:45+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 21 "uuid" => "b3762453-8e16-40e9-90ec-9088e1ea206e" "name" => "ARK: Survival Ascended" "nest" => 7 "author" => "[email protected]" "description" => "ARK is reimagined from the ground-up into the next-generation of video game technology with Unreal Engine 5! Form a tribe, tame & breed hundreds of unique dinosaurs and primeval creatures, explore, craft, build, and fight your way to the top of the food-chain. Your new world awaits!" "docker_image" => "ghcr.io/parkervcp/steamcmd:proton" "docker_images" => [ "Proton" => "ghcr.io/parkervcp/steamcmd:proton" ] "config" => [ "files" => [ "ShooterGame/Saved/Config/WindowsServer/GameUserSettings.ini" => [ "parser" => "file" "find" => [ "MaxPlayers=" => "MaxPlayers={{server.build.env.MAX_PLAYERS}}" "ServerAdminPassword=" => "ServerAdminPassword={{server.build.env.ARK_ADMIN_PASSWORD}}" ] ] ] "startup" => [ "done" => "Waiting commands for 127.0.0.1:" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "rmv() { echo "stopping server"; rcon -t rcon -a 127.0.0.1:${RCON_PORT} -p ${ARK_ADMIN_PASSWORD} KeepAlive && rcon -t rcon -a 127.0.0.1:${RCON_PORT} -p ${ARK_ADMIN_PASSWORD} DoExit && wait ${ARK_PID}; echo "Server Closed"; exit; }; trap rmv 15 2; proton run ./ShooterGame/Binaries/Win64/ArkAscendedServer.exe {{SERVER_MAP}}?listen?MaxPlayers={{MAX_PLAYERS}}?SessionName=\"{{SESSION_NAME}}\"?Port={{SERVER_PORT}}?QueryPort={{QUERY_PORT}}?RCONPort={{RCON_PORT}}?RCONEnabled=True$( [ "$SERVER_PVE" == "0" ] || printf %s '?ServerPVE=True' )?ServerPassword="{{SERVER_PASSWORD}}"{{ARGS_PARAMS}}?ServerAdminPassword="{{ARK_ADMIN_PASSWORD}}" -WinLiveMaxPlayers={{MAX_PLAYERS}} -oldconsole -servergamelog$( [ -z "$MOD_IDS" ] || printf %s ' -mods=' $MOD_IDS )$( [ "$BATTLE_EYE" == "1" ] || printf %s ' -NoBattlEye' ) -Port={{SERVER_PORT}} {{ARGS_FLAGS}} & ARK_PID=$! ; tail -c0 -F ./ShooterGame/Saved/Logs/ShooterGame.log --pid=$ARK_PID & until echo "waiting for rcon connection..."; (rcon -t rcon -a 127.0.0.1:${RCON_PORT} -p ${ARK_ADMIN_PASSWORD})<&0 & wait $!; do sleep 5; done" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n # Image to install with is 'ghcr.io/parkervcp/installers:debian'\r\n \r\n ##\r\n #\r\n # Variables\r\n # STEAM_USER, STEAM_PASS, STEAM_AUTH - Steam user setup. If a user has 2fa enabled it will most likely fail due to timeout. Leave blank for anon install.\r\n # WINDOWS_INSTALL - if it's a windows server you want to install set to 1\r\n # SRCDS_APPID - steam app id found here - https://developer.valvesoftware.com/wiki/Dedicated_Servers_List\r\n # SRCDS_BETAID - beta branch of a steam app. Leave blank to install normal branch\r\n # SRCDS_BETAPASS - password for a beta branch should one be required during private or closed testing phases.. Leave blank for no password.\r\n # INSTALL_FLAGS - Any additional SteamCMD flags to pass during install.. Keep in mind that steamcmd auto update process in the docker image might overwrite or ignore these when it performs update on server boot.\r\n # AUTO_UPDATE - Adding this variable to the egg allows disabling or enabling automated updates on boot. Boolean value. 0 to disable and 1 to enable.\r\n #\r\n ##\r\n \r\n # Install packages. Default packages below are not required if using our existing install image thus speeding up the install process.\r\n #apt -y update\r\n #apt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates\r\n \r\n ## just in case someone removed the defaults.\r\n if [[ "${STEAM_USER}" == "" ]] || [[ "${STEAM_PASS}" == "" ]]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) ${INSTALL_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so\r\n \r\n ## add below your custom commands if needed\r\n ## cleanup movies?\r\n rm -rf /mnt/server/ShooterGame/Content/Movies\r\n \r\n ## touch log file\r\n mkdir -p /mnt/server/ShooterGame/Saved/Logs\r\n echo "--fresh install--" >> /mnt/server/ShooterGame/Saved/Logs/ShooterGame.log\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:18:53+00:00" "updated_at" => "2025-12-06T23:18:53+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 8 "uuid" => "1b2b6eb7-bb94-4d2e-8d4c-1481e0eab2f0" "author" => "[email protected]" "name" => "Among Us" "description" => "A game based on a spaceship with crew mates, and impostors. The goal of the crew mates are to find the impostors, and the goal of the impostor is to kill the crew mates." "created_at" => "2025-12-06T23:23:20+00:00" "updated_at" => "2025-12-06T23:25:20+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 22 "uuid" => "d09696d4-8749-41ac-b19b-095e146dcebb" "name" => "Among Us - Impostor Server" "nest" => 8 "author" => "[email protected]" "description" => """ Impostor is one of the first Among Us private servers, written in C#.\r\n \r\n There are no special features at this moment, the goal is aiming to be as close as possible to the real server, for now. In a later stage, making modifications to game logic by modifying GameData packets can be looked at. """ "docker_image" => "ghcr.io/parkervcp/yolks:dotnet_7" "docker_images" => [ "Dotnet_7" => "ghcr.io/parkervcp/yolks:dotnet_7" "Dotnet_6" => "ghcr.io/parkervcp/yolks:dotnet_6" ] "config" => [ "files" => [ "config.json" => [ "parser" => "json" "find" => [ "Server.PublicPort" => "{{server.build.default.port}}" "Server.ListenPort" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => "Matchmaker is listening on" ] "stop" => "^^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./Impostor.Server" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n apt update\r\n apt -y install curl jq tar\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n ## get release info and download links\r\n LATEST_JSON=$(curl --silent "https://api.github.com/repos/Impostor/Impostor/releases/latest")\r\n RELEASES=$(curl --silent "https://api.github.com/repos/Impostor/Impostor/releases")\r\n MATCH=$([[ "$(uname -m)" == "x86_64" ]] && echo "linux-x64" || echo "linux-arm64")\r\n \r\n if [ -z "${VERSION}" ] || [ "${VERSION}" == "latest" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ "${VERSION}" == "${VERSION_CHECK}" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e "defaulting to latest release"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\n fi\r\n \r\n echo -e "\nDownloading from $DOWNLOAD_URL"\r\n curl -sSL -o imposter-server.tar.gz $DOWNLOAD_URL\r\n \r\n \r\n echo -e "\nUnpacking .tar.gz"\r\n tar xvf imposter-server.tar.gz\r\n \r\n rm imposter-server.tar.gz\r\n chmod +x Impostor.Server\r\n \r\n echo -e "\nInstall completed" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:23:32+00:00" "updated_at" => "2025-12-06T23:23:32+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 23 "uuid" => "1a044835-2325-46d7-a285-e4c24bb5cc4c" "name" => "Crewlink server" "nest" => 8 "author" => "[email protected]" "description" => "An egg designed to allow support for Proximity Chat in Among Us using CrewLink Server" "docker_image" => "ghcr.io/parkervcp/yolks:nodejs_16" "docker_images" => [ "ghcr.io/parkervcp/yolks:nodejs_16" => "ghcr.io/parkervcp/yolks:nodejs_16" ] "config" => [ "files" => [] "startup" => [ "done" => "<info> CrewLink Server started" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "yarn start" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Server Files: /mnt/server\r\n apt update\r\n apt install -y git\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n INSTALL_REPO="https://github.com/ottomated/crewlink-server.git"\r\n echo -e Install repo set to ${INSTALL_REPO}\r\n echo -e "/mnt/server is empty.\ncloning files from repo"\r\n echo -e "running 'git clone --single-branch --branch ${BRANCH} ${INSTALL_REPO} .'"\r\n git clone --single-branch --branch ${BRANCH} ${INSTALL_REPO} .\r\n \r\n if [ -f /mnt/server/package.json ]; then\r\n /usr/local/bin/yarn install\r\n fi\r\n \r\n echo -e "install complete"\r\n exit 0 """ "entry" => "bash" "container" => "node:16-bookworm" "extends" => null ] "created_at" => "2025-12-06T23:23:39+00:00" "updated_at" => "2025-12-06T23:23:39+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 24 "uuid" => "6fd922df-cf50-4e49-8f9c-b3ef956e3111" "name" => "BetterCrewlink Server" "nest" => 8 "author" => "[email protected]" "description" => "An egg designed to allow support for Proximity Chat in Among Us using BetterCrewLink Server" "docker_image" => "ghcr.io/parkervcp/yolks:nodejs_16" "docker_images" => [ "ghcr.io/parkervcp/yolks:nodejs_16" => "ghcr.io/parkervcp/yolks:nodejs_16" ] "config" => [ "files" => [] "startup" => [ "done" => "<info> BetterCrewLink Server started" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "yarn start" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Server Files: /mnt/server\r\n apt update\r\n apt install -y git python3 python3-pip build-essential\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n INSTALL_REPO="https://github.com/OhMyGuus/BetterCrewLink-server.git"\r\n echo -e Install repo set to ${INSTALL_REPO}\r\n echo -e "/mnt/server is empty.\ncloning files from repo"\r\n echo -e "running 'git clone --single-branch --branch ${BRANCH} ${INSTALL_REPO} .'"\r\n git clone --single-branch --branch ${BRANCH} ${INSTALL_REPO} .\r\n \r\n if [ -f /mnt/server/package.json ]; then\r\n /usr/local/bin/yarn install\r\n fi\r\n \r\n echo -e "install complete"\r\n exit 0 """ "entry" => "bash" "container" => "node:16-bookworm" "extends" => null ] "created_at" => "2025-12-06T23:23:47+00:00" "updated_at" => "2025-12-06T23:23:47+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 9 "uuid" => "baa64764-020e-4a13-aa02-62d14aab020d" "author" => "[email protected]" "name" => "BeamNG Drive" "description" => "A soft body driving game." "created_at" => "2025-12-06T23:28:15+00:00" "updated_at" => "2025-12-06T23:28:52+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 25 "uuid" => "a3d69621-9a23-4529-9e9f-c2d931755d2f" "name" => "BeamMP Servers" "nest" => 9 "author" => "[email protected]" "description" => "This is the server for the multiplayer mod BeamMP for the game BeamNG.drive. The server is the point through which all clients communicate. You can write lua mods for the server, detailed instructions on the BeamMP Wiki." "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "Debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [ "ServerConfig.toml" => [ "parser" => "file" "find" => [ "Name =" => "Name = "{{env.NAME}}"" "Port =" => "Port = {{server.build.default.port}}" "AuthKey =" => "AuthKey = "{{env.AUTHKEY}}"" "Private =" => "Private = {{env.PRIVATE}}" "MaxPlayers =" => "MaxPlayers = {{server.build.env.MAX_PLAYERS}}" "Description =" => "Description = "{{env.DESCRIPTION}}"" "MaxCars =" => "MaxCars = {{env.MAX_CARS}}" "Map =" => "Map = "{{env.MAP}}"" "LogChat =" => "LogChat = {{env.LOGCHAT}}" ] ] ] "startup" => [ "done" => "[INFO] Vehicle data network online" ] "stop" => "exit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./BeamMP-Server" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n #Create the server directory\r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n #Remove any old versions\r\n rm -f BeamMP-Server\r\n \r\n #Check for latest release & download URLs\r\n LATEST_JSON=$(curl --silent "https://api.github.com/repos/BeamMP/BeamMP-Server/releases/latest")\r\n RELEASES=$(curl --silent "https://api.github.com/repos/BeamMP/BeamMP-Server/releases")\r\n MATCH=$([[ "$(uname -m)" == "x86_64" ]] && echo "Server.debian.12.x86_64" || echo "Server.debian.12.arm64")\r\n \r\n if [ -z "${VERSION}" ] || [ "${VERSION}" == "latest" ]; then\r\n echo -e "Using latest BeamMP server version"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i "${MATCH}" | head -1)\r\n else\r\n echo -e "Chosen version :${VERSION}. Verifying version from releases"\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ "${VERSION}" == "${VERSION_CHECK}" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i "${MATCH}" | head -1)\r\n else\r\n echo -e "No valid versions found. Defaulting to the latest release"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i "Server" | grep -i "debian" | grep -i "12" | grep -i "x" | grep -i "64" | head -1)\r\n fi\r\n fi\r\n \r\n #Download the BeamMP server binary\r\n echo -e "Running curl -sSL ${DOWNLOAD_URL} -o BeamMP-Server"\r\n curl -sSL ${DOWNLOAD_URL} -o BeamMP-Server\r\n chmod +x BeamMP-Server\r\n \r\n #Create a default configuration file\r\n echo "# This is the BeamMP-Server config file.\r\n # Help & Documentation: `https://wiki.beammp.com/en/home/server-maintenance`\r\n # IMPORTANT: Fill in the AuthKey with the key you got from `https://keymaster.beammp.com/` on the left under 'Keys'\r\n \r\n [General]\r\n Name = 'BeamMP Server'\r\n Port = 30814\r\n # AuthKey has to be filled out in order to run the server\r\n AuthKey = ''\r\n # Whether to log chat messages in the console / log\r\n LogChat = true\r\n # Add custom identifying tags to your server to make it easier to find. Format should be TagA,TagB,TagC. Note the comma seperation.\r\n Tags = 'Freeroam'\r\n Debug = false\r\n Private = true\r\n MaxCars = 1\r\n MaxPlayers = 8\r\n Map = '/levels/gridmap_v2/info.json'\r\n Description = 'BeamMP Default Description'\r\n ResourceFolder = 'Resources'\r\n \r\n [Misc]\r\n # Hides the periodic update message which notifies you of a new server version. You should really keep this on and always update as soon as possible. For more information visit https://wiki.beammp.com/en/home/server-maintenance#updating-the-server. An update message will always appear at startup regardless.\r\n ImScaredOfUpdates = false\r\n # You can turn on/off the SendErrors message you get on startup here\r\n SendErrorsShowMessage = true\r\n # If SendErrors is 'true', the server will send helpful info about crashes and other issues back to the BeamMP developers. This info may include your config, who is on your server at the time of the error, and similar general information. This kind of data is vital in helping us diagnose and fix issues faster. This has no impact on server performance. You can opt-out of this system by setting this to 'false'\r\n SendErrors = true" > ServerConfig.toml\r\n \r\n \r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:28:25+00:00" "updated_at" => "2025-12-06T23:28:25+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 26 "uuid" => "94d2e4a9-7d91-4b75-83f8-3437c6b54fbc" "name" => "KissMP Server" "nest" => 9 "author" => "[email protected]" "description" => "Server for the KISS Multiplayer BeamNG.drive mod" "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "ghcr.io/parkervcp/yolks:debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [ "config.json" => [ "parser" => "json" "find" => [ "port" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => "Server is running!" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./kissmp-server" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Server Files: /mnt/server\r\n apt update \r\n apt install -y wget unzip \r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n LATEST_RELEASE=$(wget -qO- https://api.github.com/repos/TheHellBox/KISS-multiplayer/releases/latest | grep browser_download_url | cut -d '"' -f 4)\r\n echo -e Install repo set to ${INSTALL_REPO}\r\n echo -e "/mnt/server is empty.\nDownloading latest release ${LATEST_RELEASE}"\r\n \r\n wget $LATEST_RELEASE -O kissmp.zip\r\n unzip -j kissmp.zip '*/kissmp-server'\r\n \r\n rm -rf kissmp.zip\r\n \r\n if [ -f /mnt/server/kissmp-server ]; then\r\n echo -e "Install complete"\r\n chmod +x /mnt/server/kissmp-server\r\n \r\n # Generate config\r\n ./kissmp-server & serverpid=$! \r\n sleep 1\r\n kill $serverpid\r\n \r\n exit 0\r\n else \r\n echo -e "Install failed (no /mnt/server/kissmp-server file present)"\r\n exit 1\r\n fi """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-06T23:28:31+00:00" "updated_at" => "2025-12-06T23:28:31+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 10 "uuid" => "a716787e-c8e3-492d-80f2-ba989caff61b" "author" => "[email protected]" "name" => "Satisfactory" "description" => "Satisfactory is a first-person open-world factory building game with a dash of exploration and combat. Play alone or with friends, explore an alien planet, create multi-story factories, and enter conveyor belt heaven!" "created_at" => "2025-12-07T00:18:25+00:00" "updated_at" => "2025-12-07T00:18:40+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 27 "uuid" => "aa024f0d-e5b9-4cab-b293-2d3a953a00cf" "name" => "Satisfactory" "nest" => 10 "author" => "[email protected]" "description" => "Satisfactory is a first-person open-world factory building game with a dash of exploration and combat. Play alone or with friends, explore an alien planet, create multi-story factories, and enter conveyor belt heaven!" "docker_image" => "ghcr.io/parkervcp/games:source" "docker_images" => [ "ghcr.io/parkervcp/games:source" => "ghcr.io/parkervcp/games:source" ] "config" => [ "files" => [ "FactoryGame/Saved/Config/LinuxServer/Game.ini" => [ "parser" => "file" "find" => [ "MaxPlayers" => "MaxPlayers={{server.build.env.MAX_PLAYERS}}" ] ] "FactoryGame/Saved/Config/LinuxServer/Engine.ini" => [ "parser" => "file" "find" => [ "mNumRotatingAutosaves" => "mNumRotatingAutosaves={{server.build.env.NUM_AUTOSAVES}}" "bImplicitSend" => "bImplicitSend={{server.build.env.UPLOAD_CRASH_REPORT}}" "InitialConnectTimeout" => "InitialConnectTimeout={{server.build.env.INIT_CONNECT_TIMEOUT}}" "ConnectionTimeout" => "ConnectionTimeout={{server.build.env.CONNECT_TIMEOUT}}" ] ] "FactoryGame/Saved/Config/LinuxServer/GameUserSettings.ini" => [ "parser" => "file" "find" => [ "mFloatValues" => "mFloatValues=(("FG.AutosaveInterval", {{server.build.env.AUTOSAVE_INTERVAL}}))" "mIntValues" => "mIntValues=(("FG.NetworkQuality", {{server.build.env.NETWORK_QUALITY}}))" ] ] ] "startup" => [ "done" => "Engine Initialization" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./Engine/Binaries/Linux/*-Linux-Shipping FactoryGame ?listen -Port={{SERVER_PORT}} -ServerQueryPort={{QUERY_PORT}} -BeaconPort={{BEACON_PORT}} -multihome=0.0.0.0 $(if {{DISABLE_SEASONAL}}; then echo "-DisableSeasonalEvents"; fi)" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n # File: Pterodactyl Satisfactory Egg - egg-satisfactory.json\r\n # Authors: Red-Thirten, Kubi, matthewp, Software-Noob, and Zarklord\r\n # Date: 2023/06/13\r\n # License: MIT License\r\n \r\n ## Download and install SteamCMD\r\n cd /tmp\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n mkdir -p /mnt/server/steamcmd\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n # Install game server using SteamCMD\r\n ./steamcmd.sh +force_install_dir /mnt/server +login anonymous +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) validate +exit\r\n \r\n # Set up 32 and 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk{32,64}\r\n cp -v linux32/steamclient.so /mnt/server/.steam/sdk32/steamclient.so\r\n cp -v linux64/steamclient.so /mnt/server/.steam/sdk64/steamclient.so\r\n \r\n ## Satisfactory setup\r\n # Check for successful installation and make the server binary executable.\r\n # Use `find` to see if a valid server binary exists using a wildcard, because\r\n # the binary name can differ between UE4 and UE5.\r\n cd /mnt/server/Engine/Binaries/Linux\r\n count=$(find . -maxdepth 1 -name '*-Linux-Shipping' -type f -executable | wc -l)\r\n if [[ $count -eq 0 ]]; then\r\n echo -e "\n\nSteamCMD failed to install the Satisfactory Dedicated Server!"\r\n echo -e "\tTry reinstalling the server again.\n"\r\n exit 1\r\n else\r\n chmod +x *-Linux-Shipping\r\n fi\r\n \r\n # Make Config directory and default .ini files (since they are not initially present before first server start)\r\n mkdir -p /mnt/server/FactoryGame/Saved/Config/LinuxServer/ && cd "$_"\r\n # Currently, this will delete & re-create certain .ini files during a re-install if they are already present.\r\n # While undesirable, this is required due to a current Pterodactyl ini config parser limitation.\r\n # When the patch to this limitation hits the production branch, this will be updated.\r\n rm -f Engine.ini Game.ini GameUserSettings.ini\r\n \r\n echo -e '\nCreating default "Engine.ini" configuration file...'\r\n cat > Engine.ini << EOF\r\n [/Script/FactoryGame.FGSaveSession]\r\n mNumRotatingAutosaves=${NUM_AUTOSAVES}\r\n \r\n [CrashReportClient]\r\n bImplicitSend=${UPLOAD_CRASH_REPORT}\r\n \r\n [/Script/OnlineSubsystemUtils.IpNetDriver]\r\n InitialConnectTimeout=${INIT_CONNECT_TIMEOUT}\r\n ConnectionTimeout=${CONNECT_TIMEOUT}\r\n EOF\r\n \r\n echo -e 'Creating default "Game.ini" configuration file...'\r\n cat > Game.ini << EOF\r\n [/Script/Engine.GameSession]\r\n MaxPlayers=${MAX_PLAYERS}\r\n EOF\r\n \r\n echo -e 'Creating default "GameUserSettings.ini" configuration file...'\r\n cat > GameUserSettings.ini << EOF\r\n [/Script/FactoryGame.FGGameUserSettings]\r\n mIntValues=(("FG.NetworkQuality", ${NETWORK_QUALITY}))\r\n mFloatValues=(("FG.AutosaveInterval", ${AUTOSAVE_INTERVAL}))\r\n mAutoDetectSettingsHandled=False\r\n mPrimaryLanguage=\r\n CurrentFGGameUserSettingsVersion=0\r\n bUseVSync=False\r\n bUseDynamicResolution=False\r\n ResolutionSizeX=1280\r\n ResolutionSizeY=720\r\n LastUserConfirmedResolutionSizeX=1280\r\n LastUserConfirmedResolutionSizeY=720\r\n WindowPosX=-1\r\n WindowPosY=-1\r\n FullscreenMode=1\r\n LastConfirmedFullscreenMode=1\r\n PreferredFullscreenMode=1\r\n Version=5\r\n AudioQualityLevel=0\r\n LastConfirmedAudioQualityLevel=0\r\n FrameRateLimit=0.000000\r\n DesiredScreenWidth=1280\r\n DesiredScreenHeight=720\r\n LastUserConfirmedDesiredScreenWidth=1280\r\n LastUserConfirmedDesiredScreenHeight=720\r\n LastRecommendedScreenWidth=-1.000000\r\n LastRecommendedScreenHeight=-1.000000\r\n LastCPUBenchmarkResult=-1.000000\r\n LastGPUBenchmarkResult=-1.000000\r\n LastGPUBenchmarkMultiplier=1.000000\r\n bUseHDRDisplayOutput=False\r\n HDRDisplayOutputNits=1000\r\n \r\n [ScalabilityGroups]\r\n sg.ResolutionQuality=100.000000\r\n sg.ViewDistanceQuality=3\r\n sg.AntiAliasingQuality=3\r\n sg.ShadowQuality=3\r\n sg.PostProcessQuality=3\r\n sg.TextureQuality=3\r\n sg.EffectsQuality=3\r\n sg.FoliageQuality=3\r\n sg.ShadingQuality=3\r\n \r\n [/Script/Engine.GameUserSettings]\r\n bUseDesiredScreenHeight=False\r\n \r\n \r\n EOF\r\n \r\n echo -e "\nSatisfactory Dedicated Server successfully installed!\n" """ "entry" => "/bin/bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:18:33+00:00" "updated_at" => "2025-12-07T00:18:33+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 11 "uuid" => "508a3e16-b20d-4130-a844-b61a6a459906" "author" => "[email protected]" "name" => "GTA" "description" => null "created_at" => "2025-12-07T00:20:16+00:00" "updated_at" => "2025-12-07T00:20:16+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 28 "uuid" => "bd720dfc-2c38-4afc-a430-da2632efe6f9" "name" => "SA-MP" "nest" => 11 "author" => "[email protected]" "description" => "SA-MP is a free Massively Multiplayer Online game mod for the PC version of Rockstar Games Grand Theft Auto: San Andreas (tm)." "docker_image" => "ghcr.io/parkervcp/games:samp" "docker_images" => [ "Samp" => "ghcr.io/parkervcp/games:samp" ] "config" => [ "files" => [ "server.cfg" => [ "parser" => "file" "find" => [ "port" => "port {{server.build.default.port}}" "rcon_password" => "rcon_password {{server.build.env.RCON_PASS}}" ] ] ] "startup" => [ "done" => "Started server on " ] "stop" => "^^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./samp03svr" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n # Check if VERSION is set and starts with an uppercase "R"\r\n if [[ -n "$VERSION" && "$VERSION" == R* ]]; then\r\n VERSION="0.3.7"\r\n echo "Updated VERSION: $VERSION"\r\n fi\r\n \r\n cd /tmp || exit\r\n echo "running: curl -sSL -o samp.tar.gz https://sampcenter.com/download/server/linux/${VERSION}.tar.gz"\r\n curl -sSL -o samp.tar.gz https://sampcenter.com/download/server/linux/${VERSION}.tar.gz\r\n \r\n mkdir -p /mnt/server\r\n tar -xzvf samp.tar.gz --strip-components=1 -C /mnt/server/\r\n \r\n cd /mnt/server || exit\r\n \r\n sed -i '3d' /mnt/server/server.cfg\r\n echo "rcon_password ${RCON_PASS}" >> /mnt/server/server.cfg\r\n \r\n chown -R root:root /mnt\r\n \r\n export HOME=/mnt/server\r\n \r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:20:27+00:00" "updated_at" => "2025-12-07T00:20:27+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 29 "uuid" => "b5fc21ec-af20-479d-b3eb-8580d7509d83" "name" => "Rage.MP" "nest" => 11 "author" => "[email protected]" "description" => """ https://rage.mp/\r\n \r\n Modified to work with the latest version of RAGE:MP\r\n Will automatically install linux bridge.\r\n **This server requires 2 ports to be added for the server. the main port and the next (port+1) as ports for the server. """ "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "ghcr.io/parkervcp/yolks:debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [ "conf.json" => [ "parser" => "json" "find" => [ "port" => "{{server.build.default.port}}" "bind" => "0.0.0.0" "name" => "{{server.build.env.SERVER_NAME}}" "maxplayers" => "{{server.build.env.MAX_PLAYERS}}" ] ] ] "startup" => [ "done" => "The server is ready to accept connections" ] "stop" => "^X" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./ragemp-server" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n mkdir -p /mnt/server/tmp\r\n cd /mnt/server\r\n \r\n rm -rf bin/\r\n rm -rf dotnet/\r\n rm ragemp-server\r\n \r\n cd /mnt/server/tmp\r\n echo "Downloading rage.mp"\r\n curl -sSL -o linux_x64.tar.gz https://cdn.rage.mp/updater/prerelease/server-files/linux_x64.tar.gz\r\n tar -xzvf linux_x64.tar.gz\r\n rm linux_x64.tar.gz\r\n cd /mnt/server/tmp/ragemp-srv/\r\n mv * /mnt/server\r\n \r\n cd /mnt/server\r\n chmod +x ./ragemp-server\r\n rm -rf /mnt/server/tmp\r\n \r\n if [ -e conf.json ]; then\r\n echo "server config file exists"\r\n else\r\n echo "Downloading default rage.mp config"\r\n curl https://raw.githubusercontent.com/parkervcp/eggs/master/game_eggs/gta/ragemp/conf.json >> conf.json\r\n fi\r\n \r\n echo "install complete"\r\n \r\n exit 0 """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:20:38+00:00" "updated_at" => "2025-12-07T00:20:38+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 30 "uuid" => "b10577ed-0769-4c5c-8a50-eee7b9a3c27d" "name" => "RageCOOP" "nest" => 11 "author" => "[email protected]" "description" => "Drive around the interstate with your buddy, enjoy GTAs environment, make own missions and events or just chill in Grove Street! 🌐" "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "ghcr.io/parkervcp/yolks:debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [ "Settings.xml" => [ "parser" => "xml" "find" => [ "Settings.Port" => "{{server.build.default.port}}" ] ] ] "startup" => [ "done" => "Listening for clients" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./RageCoop.Server" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n apt update\r\n apt -y install curl wget git zip unzip jq\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n ## get release info and download links\r\n LATEST_JSON=$(curl --silent "https://api.github.com/repos/RAGECOOP/RAGECOOP-V/releases/latest")\r\n RELEASES=$(curl --silent "https://api.github.com/repos/RAGECOOP/RAGECOOP-V/releases")\r\n \r\n if [ -z "${VERSION}" ] || [ "${VERSION}" == "latest" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i RageCoop.Server-linux-x64.zip)\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ "${VERSION}" == "${VERSION_CHECK}" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i RageCoop.Server-linux-x64.zip)\r\n else\r\n echo -e "defaulting to latest release"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i RageCoop.Server-linux-x64.zip)\r\n fi\r\n fi\r\n \r\n echo ${DOWNLOAD_URL}\r\n wget ${DOWNLOAD_URL} -O RageCoop.Server-linux.zip\r\n RageCoop.Server-linux.zip\r\n \r\n unzip RageCoop.Server-linux.zip\r\n \r\n rm RageCoop.Server-linux.zip\r\n \r\n chmod +x RageCoop.Server\r\n \r\n cat <<EOF > Settings.xml\r\n <Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">\r\n \t<Port>4499</Port>\r\n \t<MaxPlayers>32</MaxPlayers>\r\n \t<MaxLatency>500</MaxLatency>\r\n \t<Name>RAGECOOP server</Name>\r\n \t<Website>https://ragecoop.online/</Website>\r\n \t<Description>RAGECOOP server</Description>\r\n \t<GameMode>FreeRoam</GameMode>\r\n \t<Language>English</Language>\r\n \t<WelcomeMessage>Welcome on this server :)</WelcomeMessage>\r\n \t<AnnounceSelf>false</AnnounceSelf>\r\n \t<MasterServer>https://masterserver.ragecoop.online/</MasterServer>\r\n \t<LogLevel>0</LogLevel>\r\n \t<NpcStreamingDistance>500</NpcStreamingDistance>\r\n \t<PlayerStreamingDistance>-1</PlayerStreamingDistance>\r\n \t<WeatherTimeSync>true</WeatherTimeSync>\r\n \t<AllowedUsernameChars>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_</AllowedUsernameChars>\r\n \t<UseP2P>false</UseP2P>\r\n \t<UseZeroTier>false</UseZeroTier>\r\n \t<UseVoice>false</UseVoice>\r\n \t<ZeroTierNetworkID>8056c2e21c000001</ZeroTierNetworkID>\r\n \t<AutoUpdate>false</AutoUpdate>\r\n \t<KickGodMode>false</KickGodMode>\r\n \t<KickSpamming>true</KickSpamming>\r\n </Settings>\r\n EOF\r\n \r\n echo "done" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:20:46+00:00" "updated_at" => "2025-12-07T00:20:46+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 31 "uuid" => "92b0a01d-27d5-4153-9486-1e246a711bbc" "name" => "OpenMP" "nest" => 11 "author" => "[email protected]" "description" => "A multiplayer mod for Grand Theft Auto: San Andreas that is fully backwards compatible with San Andreas Multiplayer." "docker_image" => "ghcr.io/parkervcp/games:samp" "docker_images" => [ "Samp" => "ghcr.io/parkervcp/games:samp" ] "config" => [ "files" => [ "config.json" => [ "parser" => "json" "find" => [ "network.port" => "{{server.build.default.port}}" "rcon.password" => "{{server.build.env.RCON_PASSWORD}}" ] ] ] "startup" => [ "done" => "started on port" ] "stop" => "exit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./omp-server" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n apt -y install curl git jq tar\r\n \r\n ## get release info and download links\r\n LATEST_JSON=$(curl --silent "https://api.github.com/repos/openmultiplayer/open.mp/releases/latest")\r\n RELEASES=$(curl --silent "https://api.github.com/repos/openmultiplayer/open.mp/releases")\r\n MATCH=open.mp-linux-x86-dynssl\r\n \r\n if [ -z "${VERSION}" ] || [ "${VERSION}" == "latest" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ "${VERSION}" == "${VERSION_CHECK}" ]; then\r\n DOWNLOAD_URL=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e "defaulting to latest release"\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -linux-x86 | head -1)\r\n fi\r\n fi\r\n \r\n echo "running: curl -sSL -o openmp.tar.gz ${DOWNLOAD_URL}"\r\n curl -sSL -o openmp.tar.gz ${DOWNLOAD_URL}\r\n \r\n mkdir -p /mnt/server\r\n tar -xzvf openmp.tar.gz --strip-components=1 -C /mnt/server/\r\n \r\n cd /mnt/server || exit\r\n \r\n echo "creating default config"\r\n \r\n if [ -e config.json ]; then\r\n echo "server config file exists"\r\n else\r\n echo "Downloading default OpenMp config"\r\n curl https://raw.githubusercontent.com/parkervcp/eggs/master/game_eggs/gta/openmp/config.json >> config.json\r\n fi\r\n \r\n \r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:20:53+00:00" "updated_at" => "2025-12-07T00:20:53+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 32 "uuid" => "66da8154-8ed9-4532-a8da-bd8384bef798" "name" => "Multi Theft Auto" "nest" => 11 "author" => "[email protected]" "description" => "What more could you want? Multi Theft Auto provides the best online Grand Theft Auto experience there is. Read on to find out more." "docker_image" => "ghcr.io/parkervcp/games:mta" "docker_images" => [ "ghcr.io/parkervcp/games:mta" => "ghcr.io/parkervcp/games:mta" ] "config" => [ "files" => [] "startup" => [ "done" => "Server started and is ready to accept connections" ] "stop" => "shutdown" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./mta-server64 --port {{SERVER_PORT}} --httpport {{SERVER_WEBPORT}} -n" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n cd /tmp\r\n curl -sSL -o multitheftauto_linux_x64.tar.gz https://linux.multitheftauto.com/dl/multitheftauto_linux_x64.tar.gz\r\n curl -sSL -o mta-baseconfig.tar.gz https://linux.multitheftauto.com/dl/baseconfig.tar.gz\r\n curl -sSL -o mtasa-resources-latest.zip https://mirror.multitheftauto.com/mtasa/resources/mtasa-resources-latest.zip\r\n \r\n mkdir -p /mnt/server\r\n tar -xvf multitheftauto_linux_x64.tar.gz\r\n cp -rf multitheftauto_linux_x64/* /mnt/server\r\n \r\n if [ ! -f /mnt/server/x64/libmysqlclient.so.16 ]; then\r\n curl -L http://nightly.mtasa.com/files/libmysqlclient.so.16 -o /mnt/server/x64/libmysqlclient.so.16\r\n fi\r\n \r\n mkdir -p /mnt/server/mods/deathmatch/resources\r\n unzip -o -d /mnt/server/mods/deathmatch/resources mtasa-resources-latest.zip\r\n \r\n tar -xvf mta-baseconfig.tar.gz\r\n cp -rf baseconfig/* /mnt/server/mods/deathmatch\r\n \r\n chown -R root:root /mnt\r\n \r\n export HOME=/mnt/server\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:ubuntu" "extends" => null ] "created_at" => "2025-12-07T00:21:02+00:00" "updated_at" => "2025-12-07T00:21:02+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 33 "uuid" => "9d418f92-2b73-4484-a2d8-8f260c846bad" "name" => "Grand Theft Auto Connected" "nest" => 11 "author" => "[email protected]" "description" => "Grand Theft Auto Connected is a custom scriptable multiplayer modification for multiple Grand Theft Auto games." "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "ghcr.io/parkervcp/yolks:debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [ "server.xml" => [ "parser" => "xml" "find" => [ "server.servername" => "{{server.build.env.SERVERNAME}}" "server.port" => "{{server.build.default.port}}" "server.httpport" => "{{server.build.default.port}}" "server.game" => "{{server.build.env.GAMETYPE}}" "server.serverbrowser" => "{{server.build.env.SERVERBROWSER}}" ] ] ] "startup" => [ "done" => "Successfully added server" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./Server" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n cd /mnt/server\r\n \r\n \r\n if [ "${DL_VERSION}" == "latest" ]; then\r\n DOWNLOAD_LINK=https://gtaconnected.com/downloads/server/latest/linux\r\n else\r\n DOWNLOAD_LINK=https://gtaconnected.com/downloads/GTAC-Server-Linux-${DL_VERSION}.tar.gz\r\n fi\r\n \r\n if [ ! -z "${DOWNLOAD_LINK}" ]; then \r\n if curl --output /dev/null --silent --head --fail --location ${DOWNLOAD_LINK}; then\r\n echo -e "Chosen server version is valid."\r\n else\r\n echo -e "Chosen server version is invalid, tried $DOWNLOAD_LINK. Exiting installation"\r\n exit 2\r\n fi\r\n else\r\n echo -e "no download link, stopping installation"\r\n exit 3\r\n fi\r\n \r\n echo -e "Downloading ${DL_VERSION} version of the server"\r\n curl -sSL ${DOWNLOAD_LINK} -o GTAC.tar.gz\r\n echo "Extracting files"\r\n tar -xf GTAC.tar.gz\r\n \r\n chmod +x Server\r\n rm GTAC.tar.gz\r\n \r\n echo "Install complete" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:21:10+00:00" "updated_at" => "2025-12-07T00:21:10+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 34 "uuid" => "df8abe72-9668-4326-bd88-577b99522075" "name" => "FiveM" "nest" => 11 "author" => "[email protected]" "description" => "A new FiveM egg for the latest builds due to recent changes in FiveM" "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "ghcr.io/parkervcp/yolks:debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [ "server.cfg" => [ "parser" => "file" "find" => [ "endpoint_add_tcp" => "endpoint_add_tcp "0.0.0.0:{{server.build.default.port}}"" "endpoint_add_udp" => "endpoint_add_udp "0.0.0.0:{{server.build.default.port}}"" "sv_hostname" => "sv_hostname "{{server.build.env.SERVER_HOSTNAME}}"" "set sv_licenseKey" => "set sv_licenseKey {{server.build.env.FIVEM_LICENSE}}" "set steam_webApiKey" => "set steam_webApiKey {{server.build.env.STEAM_WEBAPIKEY}}" "sv_maxclients" => "sv_maxclients {{server.build.env.MAX_PLAYERS}}" ] ] ] "startup" => [ "done" => "succeeded. Welcome!" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "$(pwd)/alpine/opt/cfx-server/ld-musl-x86_64.so.1 --library-path "$(pwd)/alpine/usr/lib/v8/:$(pwd)/alpine/lib/:$(pwd)/alpine/usr/lib/" -- $(pwd)/alpine/opt/cfx-server/FXServer +set citizen_dir $(pwd)/alpine/opt/cfx-server/citizen/ +set sv_licenseKey {{FIVEM_LICENSE}} +set steam_webApiKey {{STEAM_WEBAPIKEY}} +set sv_maxplayers {{MAX_PLAYERS}} +set serverProfile default +set txAdminPort {{TXADMIN_PORT}} $( [ "$TXADMIN_ENABLE" == "1" ] || printf %s '+exec server.cfg' )" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # FiveM Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n apt update -y\r\n apt install -y tar xz-utils file jq\r\n \r\n mkdir -p /mnt/server/resources\r\n \r\n cd /mnt/server\r\n \r\n echo "updating citizenfx resource files"\r\n git clone https://github.com/citizenfx/cfx-server-data.git /tmp\r\n cp -Rf /tmp/resources/* resources/\r\n \r\n RELEASE_PAGE=$(curl -sSL https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/)\r\n CHANGELOGS_PAGE=$(curl -sSL https://changelogs-live.fivem.net/api/changelog/versions/linux/server)\r\n \r\n if [[ "${FIVEM_VERSION}" == "recommended" ]] || [[ -z ${FIVEM_VERSION} ]]; then\r\n DOWNLOAD_LINK=$(echo $CHANGELOGS_PAGE | jq -r '.recommended_download')\r\n elif [[ "${FIVEM_VERSION}" == "latest" ]]; then\r\n DOWNLOAD_LINK=$(echo $CHANGELOGS_PAGE | jq -r '.latest_download')\r\n else\r\n VERSION_LINK=$(echo -e "${RELEASE_PAGE}" | grep -Eo '".*/*.tar.xz"' | grep -Eo '".*/*.tar.xz"' | sed 's/\"//g' | sed 's/\.\///1' | grep -i "${FIVEM_VERSION}" | grep -o =.* | tr -d '=')\r\n if [[ "${VERSION_LINK}" == "" ]]; then\r\n echo -e "defaulting to recommedned as the version requested was invalid."\r\n DOWNLOAD_LINK=$(echo $CHANGELOGS_PAGE | jq -r '.recommended_download')\r\n else\r\n DOWNLOAD_LINK=$(echo https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/${VERSION_LINK})\r\n fi\r\n fi\r\n \r\n if [ ! -z "${DOWNLOAD_URL}" ]; then\r\n if curl --output /dev/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e "link is valid. setting download link to ${DOWNLOAD_URL}"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else\r\n echo -e "link is invalid closing out"\r\n exit 2\r\n fi\r\n fi\r\n \r\n echo -e "Running curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*/}"\r\n \r\n curl -sSL ${DOWNLOAD_LINK} -o ${DOWNLOAD_LINK##*/}\r\n \r\n echo "Extracting fivem files"\r\n \r\n FILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*/} | cut -d',' -f2 | cut -d' ' -f2)\r\n if [ "$FILETYPE" == "gzip" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*/}\r\n elif [ "$FILETYPE" == "Zip" ]; then\r\n unzip ${DOWNLOAD_LINK##*/}\r\n elif [ "$FILETYPE" == "XZ" ]; then\r\n tar xvf ${DOWNLOAD_LINK##*/}\r\n else\r\n echo -e "unknown filetype. Exiting"\r\n exit 2\r\n fi\r\n \r\n rm -rf ${DOWNLOAD_LINK##*/} run.sh\r\n \r\n if [ -e server.cfg ]; then\r\n echo "Skipping downloading default server config file as one already exists"\r\n else\r\n echo "Downloading default fivem config"\r\n curl https://raw.githubusercontent.com/parkervcp/eggs/master/game_eggs/gta/fivem/server.cfg >>server.cfg\r\n fi\r\n \r\n mkdir -p logs/\r\n \r\n echo "install complete" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:21:17+00:00" "updated_at" => "2025-12-07T00:21:17+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 35 "uuid" => "7caec5e2-53e2-49f9-9d0e-44044e4cb075" "name" => "alt:V" "nest" => 11 "author" => "[email protected]" "description" => "alt:V Multiplayer a third-party multiplayer modification for Grand Theft Auto: V" "docker_image" => "ghcr.io/parkervcp/games:altv" "docker_images" => [ "ALT:V" => "ghcr.io/parkervcp/games:altv" ] "config" => [ "files" => [ "server.toml" => [ "parser" => "file" "find" => [ "host:" => "host: 0.0.0.0" "port:" => "port: {{server.build.default.port}}" "password:" => "password: {{server.build.env.PASSWORD}}" "description:" => "description: {{server.build.env.SERVER_DESC}}" ] ] ] "startup" => [ "done" => "Server started" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./altv-server" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n #\r\n \r\n apt update\r\n apt install -y wget jq curl \r\n \r\n cd /mnt/server\r\n NEWVERSION=$(curl -sSL https://cdn.alt-mp.com/server/${BUILD}/x64_linux/update.json | jq -r .version)\r\n \r\n \r\n if [ -f "/mnt/server/altv-server" ]; then\r\n CURRENTVERSION=$(cat update.json | jq -r .version)\r\n if [[ "${CURRENTVERSION}" == "${NEWVERSION}" ]]; then\r\n echo "No update found"\r\n exit 0\r\n fi\r\n echo "Backing up version ${CURRENTVERSION}"\r\n mkdir -p /mnt/server/backup/${CURRENTVERSION}/data\r\n mv altv-server /mnt/server/backup/${CURRENTVERSION}/\r\n cd /mnt/server/data\r\n mv clothes.bin /mnt/server/backup/${CURRENTVERSION}/data\r\n mv vehmodels.bin /mnt/server/backup/${CURRENTVERSION}/data\r\n mv vehmods.bin /mnt/server/backup/${CURRENTVERSION}/data\r\n mv pedmodels.bin /mnt/server/backup/${CURRENTVERSION}/data\r\n mv weaponmodels.bin /mnt/server/backup/${CURRENTVERSION}/data\r\n mv rpfdata.bin /mnt/server/backup/${CURRENTVERSION}/data\r\n rm /mnt/server/update.json\r\n fi\r\n \r\n \r\n cd /mnt/server\r\n \r\n \r\n echo "Installing version: ${NEWVERSION}"\r\n wget -q https://cdn.alt-mp.com/server/${BUILD}/x64_linux/altv-server\r\n wget -q https://cdn.alt-mp.com/server/${BUILD}/x64_linux/update.json\r\n chmod +x ./altv-server\r\n \r\n \r\n mkdir -p /mnt/server/data\r\n cd /mnt/server/data\r\n \r\n wget -q https://cdn.alt-mp.com/data/${BUILD}/data/vehmodels.bin\r\n wget -q https://cdn.alt-mp.com/data/${BUILD}/data/vehmods.bin\r\n wget -q https://cdn.alt-mp.com/data/${BUILD}/data/clothes.bin\r\n wget -q https://cdn.alt-mp.com/data/${BUILD}/data/pedmodels.bin\r\n wget -q https://cdn.alt-mp.com/data/${BUILD}/data/weaponmodels.bin\r\n wget -q https://cdn.alt-mp.com/data/${BUILD}/data/rpfdata.bin\r\n \r\n \r\n \r\n \r\n cd /mnt/server\r\n if [ ! -f "/mnt/server/server.toml" ]; then\r\n cat << EOF >> server.toml\r\n name = 'alt:V Server'\r\n host = '0.0.0.0'\r\n port = ${SERVER_PORT}\r\n players = 128\r\n password = '${PASSWORD}'\r\n announce = false\r\n token = 'YOUR_TOKEN'\r\n gamemode = 'Freeroam'\r\n website = 'example.com'\r\n language = 'en'\r\n description = '${SERVER_DESC}'\r\n modules = []\r\n resources = []\r\n EOF\r\n fi\r\n \r\n mkdir -p resources/\r\n \r\n echo -e "install complete" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:21:28+00:00" "updated_at" => "2025-12-07T00:21:28+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 12 "uuid" => "7285946c-e0c1-46b4-88c3-ec696b011c83" "author" => "[email protected]" "name" => "Valheim" "description" => "A brutal exploration and survival game for 1-10 players, set in a procedurally-generated purgatory inspired by viking culture." "created_at" => "2025-12-07T00:22:25+00:00" "updated_at" => "2025-12-07T00:23:16+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 36 "uuid" => "7dc888ad-2a5d-45b6-8f3d-71b1ddf4b5d4" "name" => "Valheim" "nest" => 12 "author" => "[email protected]" "description" => "A brutal exploration and survival game for 1-10 players, set in a procedurally-generated purgatory inspired by viking culture." "docker_image" => "ghcr.io/parkervcp/games:valheim" "docker_images" => [ "ghcr.io/parkervcp/games:valheim" => "ghcr.io/parkervcp/games:valheim" ] "config" => [ "files" => [] "startup" => [ "done" => "DungeonDB Start" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./valheim_server.x86_64 -nographics -batchmode -name "{{SERVER_NAME}}" -port {{SERVER_PORT}} -world "{{WORLD}}" -password "{{PASSWORD}}" -public {{PUBLIC_SERVER}} -saveinterval {{BACKUP_INTERVAL}} -backups {{BACKUP_COUNT}} -backupshort {{BACKUP_SHORTTIME}} -backuplong {{BACKUP_LONGTIME}} $( [[ {{ENABLE_CROSSPLAY}} -eq 1 ]] && echo " -crossplay ") > >(sed -uE "{{CONSOLE_FILTER}}") & trap "{{STOP}}" 15; wait $!" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n # Image to install with is 'ghcr.io/parkervcp/installers:debian'\r\n \r\n ##\r\n #\r\n # Variables\r\n # STEAM_USER, STEAM_PASS, STEAM_AUTH - Steam user setup. If a user has 2fa enabled it will most likely fail due to timeout. Leave blank for anon install.\r\n # WINDOWS_INSTALL - if it's a windows server you want to install set to 1\r\n # SRCDS_APPID - steam app id found here - https://developer.valvesoftware.com/wiki/Dedicated_Servers_List\r\n # SRCDS_BETAID - beta branch of a steam app. Leave blank to install normal branch\r\n # SRCDS_BETAPASS - password for a beta branch should one be required during private or closed testing phases.. Leave blank for no password.\r\n # INSTALL_FLAGS - Any additional SteamCMD flags to pass during install.. Keep in mind that steamcmd auto update process in the docker image might overwrite or ignore these when it performs update on server boot.\r\n # AUTO_UPDATE - Adding this variable to the egg allows disabling or enabling automated updates on boot. Boolean value. 0 to disable and 1 to enable.\r\n #\r\n ##\r\n \r\n # Install packages. Default packages below are not required if using our existing install image thus speeding up the install process.\r\n apt -y update\r\n apt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates\r\n \r\n ## just in case someone removed the defaults.\r\n if [[ "${STEAM_USER}" == "" ]] || [[ "${STEAM_PASS}" == "" ]]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) ${INSTALL_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:22:31+00:00" "updated_at" => "2025-12-07T00:22:31+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 37 "uuid" => "64c35359-b543-4e05-a23d-e2564e9ca6e1" "name" => "Valheim Plus Mod" "nest" => 12 "author" => "[email protected]" "description" => "A brutal exploration and survival game for 1-10 players, set in a procedurally-generated purgatory inspired by viking culture." "docker_image" => "ghcr.io/parkervcp/games:valheim" "docker_images" => [ "ghcr.io/parkervcp/games:valheim" => "ghcr.io/parkervcp/games:valheim" ] "config" => [ "files" => [] "startup" => [ "done" => "DungeonDB Start" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "export DOORSTOP_ENABLE=TRUE; export DOORSTOP_INVOKE_DLL_PATH=./BepInEx/core/BepInEx.Preloader.dll; export DOORSTOP_CORLIB_OVERRIDE_PATH=./unstripped_corlib; export LD_LIBRARY_PATH="./doorstop_libs:$LD_LIBRARY_PATH"; export LD_PRELOAD="libdoorstop_x64.so:$LD_PRELOAD"; export templdpath=$LD_LIBRARY_PATH; export LD_LIBRARY_PATH="./linux64:$LD_LIBRARY_PATH"; export SteamAppId=892970; export LD_LIBRARY_PATH=$templdpath; ./valheim_server.x86_64 -nographics -batchmode -name "{{SERVER_NAME}}" -port {{SERVER_PORT}} -world "{{WORLD}}" -password "{{PASSWORD}}" -public {{PUBLIC_SERVER}} -saveinterval {{BACKUP_INTERVAL}} -backups {{BACKUP_COUNT}} -backupshort {{BACKUP_SHORTTIME}} -backuplong {{BACKUP_LONGTIME}} $( [[ {{ENABLE_CROSSPLAY}} -eq 1 ]] && echo " -crossplay ") > >(sed -uE "{{CONSOLE_FILTER}}") & trap "{{STOP}}" 15; wait $!" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n \r\n clear\r\n RED='\033[0;31m'\r\n GREEN='\033[0;32m'\r\n YELLOW='\033[1;33m'\r\n BLUE='\033[0;34m'\r\n NC='\033[0m'\r\n echo -e "${BLUE}-------------------------------------------------${NC}"\r\n echo -e "${YELLOW}Valheim+ Installscript${NC}"\r\n echo -e "${BLUE}-------------------------------------------------${NC}"\r\n \r\n # Install packages. Default packages below are not required if using our existing install image thus speeding up the install process.\r\n apt -y update\r\n apt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates jq wget\r\n \r\n ## just in case someone removed the defaults.\r\n if [[ "${STEAM_USER}" == "" ]] || [[ "${STEAM_PASS}" == "" ]]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n echo -e "${BLUE}-------------------------------------------------${NC}"\r\n echo -e "${YELLOW}download and install steamcmd${NC}"\r\n echo -e "${BLUE}-------------------------------------------------${NC}"\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n echo -e "${GREEN}...done${NC}"\r\n \r\n echo -e "${BLUE}-------------------------------------------------${NC}"\r\n echo -e "${YELLOW}install Valheim with SteamCMD${NC}"\r\n echo -e "${BLUE}-------------------------------------------------${NC}"\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) ${INSTALL_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so\r\n echo -e "${GREEN}...done${NC}"\r\n \r\n echo -e "${BLUE}-------------------------------------------------${NC}"\r\n echo -e "${YELLOW}downloading V+ from Github${NC}"\r\n echo -e "${BLUE}-------------------------------------------------${NC}"\r\n \r\n ## get release info and download links\r\n LATEST_JSON=$(curl --silent "https://api.github.com/repos/${GITHUB_PACKAGE}/releases/latest")\r\n RELEASES=$(curl --silent "https://api.github.com/repos/${GITHUB_PACKAGE}/releases")\r\n \r\n if [ -z "${VERSION}" ] || [ "${VERSION}" == "latest" ]; then\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ "${VERSION}" == "${VERSION_CHECK}" ]; then\r\n DOWNLOAD_LINK=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e "defaulting to latest release"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\n fi\r\n \r\n cd /mnt/server\r\n wget -N $DOWNLOAD_LINK\r\n unzip -o $MATCH\r\n rm -fR $MATCH\r\n echo -e "${GREEN}...done${NC}"\r\n \r\n echo -e "${BLUE}-------------------------------------------------${NC}"\r\n echo -e "${GREEN}Installation completed${NC}"\r\n echo -e "${BLUE}-------------------------------------------------${NC}" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:22:37+00:00" "updated_at" => "2025-12-07T00:22:37+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 39 "uuid" => "7d698756-bb07-4984-8b92-d9c8cd1d84c1" "name" => "Valheim BepINex" "nest" => 12 "author" => "[email protected]" "description" => "A brutal exploration and survival game for 1-10 players, set in a procedurally-generated purgatory inspired by viking culture incl the Plugin Framework BepInEx" "docker_image" => "ghcr.io/parkervcp/games:valheim" "docker_images" => [ "ghcr.io/parkervcp/games:valheim" => "ghcr.io/parkervcp/games:valheim" ] "config" => [ "files" => [] "startup" => [ "done" => "DungeonDB Start" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "export DOORSTOP_ENABLE=TRUE; export DOORSTOP_INVOKE_DLL_PATH=./BepInEx/core/BepInEx.Preloader.dll; export LD_LIBRARY_PATH="./doorstop_libs:$LD_LIBRARY_PATH"; export LD_PRELOAD="libdoorstop_x64.so:$LD_PRELOAD"; export templdpath=$LD_LIBRARY_PATH; export LD_LIBRARY_PATH="./linux64:$LD_LIBRARY_PATH"; export SteamAppId=892970; export LD_LIBRARY_PATH=$templdpath; ./valheim_server.x86_64 -nographics -batchmode -name "{{SERVER_NAME}}" -port {{SERVER_PORT}} -world "{{WORLD}}" -password "{{PASSWORD}}" -public {{PUBLIC_SERVER}} -saveinterval {{BACKUP_INTERVAL}} -backups {{BACKUP_COUNT}} -backupshort {{BACKUP_SHORTTIME}} -backuplong {{BACKUP_LONGTIME}} $( [[ {{ENABLE_CROSSPLAY}} -eq 1 ]] && echo " -crossplay ") > >(sed -uE "{{CONSOLE_FILTER}}") & trap "{{STOP}}" 15; wait $!" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Valheim Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n # Image to install with is 'debian:buster-slim'\r\n apt -y update\r\n apt -y --no-install-recommends --no-install-suggests install wget\r\n \r\n ## just in case someone removed the defaults.\r\n if [ "${STEAM_USER}" == "" ]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} +app_update ${SRCDS_APPID} ${EXTRA_FLAGS} +quit\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so\r\n \r\n echo "-------------------------------------------------------"\r\n echo "installing BepInEx and Selected ModPacks..."\r\n echo "-------------------------------------------------------"\r\n if ! api_response=$(curl -sfSL -H "accept: application/json" "https://thunderstore.io/api/experimental/package/denikson/BepInExPack_Valheim/"); then\r\n fatal "Error: could not retrieve BepInEx release info from Thunderstore.io API"\r\n fi\r\n \r\n download_url=$(jq -r ".latest.download_url" <<< "$api_response" )\r\n version_number=$(jq -r ".latest.version_number" <<< "$api_response" )\r\n \r\n if [ ! -z "$V_MODPACK" ]\r\n then\r\n #Modpack Name dashes to slashes for URL\r\n V_MODPACK=$(echo "$V_MODPACK" | sed 's/-/\//g')\r\n \r\n #Extract dependencies from ModPack JSON data\r\n V_MODPACK_DEPENDENCIES=$(curl -sfSL -H "accept: application/json" "https://thunderstore.io/api/experimental/package/${V_MODPACK}" | jq -r '.dependencies[]')\r\n fi\r\n \r\n cd /mnt/server\r\n #echo $download_url\r\n wget --content-disposition $download_url\r\n unzip -o denikson-BepInExPack_Valheim-${version_number}.zip\r\n cp -r /mnt/server/BepInExPack_Valheim/* /mnt/server\r\n \r\n if [ ! -z "$V_MODPACK" ]\r\n then\r\n #Delete Old Mods\r\n rm -rf /mnt/server/BepInEx/plugins/*\r\n \r\n #Download and extract the modpack dlls files\r\n for V_MODPACK_DEPENDENCY in $V_MODPACK_DEPENDENCIES; do\r\n #ignore bepinex\r\n if [[ "$V_MODPACK_DEPENDENCY" == *"denikson-BepInExPack_Valheim"* ]]; then\r\n continue # Skip this dependency\r\n fi\r\n \r\n #replace dashes with slashes for url\r\n V_MODPACK_DEPENDENCY_WITH_SLASH=$(echo "$V_MODPACK_DEPENDENCY" | sed 's/-/\//g')\r\n \r\n #download dependencies\r\n wget -O "$V_MODPACK_DEPENDENCY.zip" "https://thunderstore.io/package/download/$V_MODPACK_DEPENDENCY_WITH_SLASH"\r\n \r\n #Set the destination directory and ensure it exists\r\n destination_directory="/mnt/server/BepInEx/plugins"\r\n if [ ! -d "$destination_directory" ]; then\r\n mkdir -p "$destination_directory"\r\n fi\r\n \r\n #Extract DLL files from the ZIP and delete the zip file\r\n unzip -j "$V_MODPACK_DEPENDENCY.zip" "*.dll" -d "$destination_directory"\r\n \r\n #Cleanup\r\n rm $V_MODPACK_DEPENDENCY.zip\r\n done\r\n fi\r\n \r\n ##cleanup\r\n echo "-------------------------------------------------------"\r\n echo "cleanup files..."\r\n echo "-------------------------------------------------------"\r\n rm -fR BepInExPack_Valheim\r\n rm -fR icon.png\r\n rm -fR denikson-BepInExPack_Valheim-*\r\n rm -fR manifest.json\r\n rm -fR README.m\r\n \r\n #rm -fR start_*\r\n \r\n echo "-------------------------------------------------------"\r\n echo "Installation completed"\r\n echo "-------------------------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:23:02+00:00" "updated_at" => "2025-12-07T00:23:02+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 13 "uuid" => "c1b5e425-ca14-4a2d-b9c8-f56ff7e0da0d" "author" => "[email protected]" "name" => "7 Days to Die" "description" => null "created_at" => "2025-12-07T00:24:32+00:00" "updated_at" => "2025-12-07T00:24:32+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 40 "uuid" => "517c7772-c5a2-48f2-92cf-a0d28845024c" "name" => "7 Days To Die" "nest" => 13 "author" => "[email protected]" "description" => "7 days to die server" "docker_image" => "ghcr.io/parkervcp/steamcmd:debian" "docker_images" => [ "ghcr.io/parkervcp/steamcmd:debian" => "ghcr.io/parkervcp/steamcmd:debian" ] "config" => [ "files" => [] "startup" => [ "done" => "Connected with 7DTD server" ] "stop" => "shutdown" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./7DaysToDieServer.x86_64 -configfile=serverconfig.xml -quit -batchmode -nographics -dedicated -ServerPort=${SERVER_PORT} -ServerDisabledNetworkProtocols=${SERVER_DISABLED_NETWORK_PROTOCOLS} -ServerMaxPlayerCount=${MAX_PLAYERS} -GameDifficulty=${GAME_DIFFICULTY} -ControlPanelEnabled=false -TelnetEnabled=true -TelnetPort=${TELNET_PORT} -TelnetPassword=${PASSWORD} -logfile logs/latest.log & echo -e "Checking on telnet connection" && until nc -z -v -w5 127.0.0.1 ${TELNET_PORT}; do echo "Waiting for telnet connection..."; sleep 5; done && $( [[ -z ${PASSWORD} ]] && printf %s "telnet -E 127.0.0.1 ${TELNET_PORT}" || printf %s "rcon -t telnet -a 127.0.0.1:${TELNET_PORT} -p {{PASSWORD}}" )" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n # Image to install with is 'ghcr.io/parkervcp/installers:debian'\r\n \r\n ##\r\n #\r\n # Variables\r\n # STEAM_USER, STEAM_PASS, STEAM_AUTH - Steam user setup. If a user has 2fa enabled it will most likely fail due to timeout. Leave blank for anon install.\r\n # WINDOWS_INSTALL - if it's a windows server you want to install set to 1\r\n # SRCDS_APPID - steam app id found here - https://developer.valvesoftware.com/wiki/Dedicated_Servers_List\r\n # SRCDS_BETAID - beta branch of a steam app. Leave blank to install normal branch\r\n # SRCDS_BETAPASS - password for a beta branch should one be required during private or closed testing phases.. Leave blank for no password.\r\n # INSTALL_FLAGS - Any additional SteamCMD flags to pass during install.. Keep in mind that steamcmd auto update process in the docker image might overwrite or ignore these when it performs update on server boot.\r\n # AUTO_UPDATE - Adding this variable to the egg allows disabling or enabling automated updates on boot. Boolean value. 0 to disable and 1 to enable.\r\n #\r\n ##\r\n \r\n # Install packages. Default packages below are not required if using our existing install image thus speeding up the install process.\r\n #apt -y update\r\n #apt -y --no-install-recommends install curl lib32gcc-s1 ca-certificates\r\n \r\n ## just in case someone removed the defaults.\r\n if [[ "${STEAM_USER}" == "" ]] || [[ "${STEAM_PASS}" == "" ]]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) ${INSTALL_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so\r\n \r\n ## add below your custom commands if needed\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:24:39+00:00" "updated_at" => "2025-12-07T00:24:39+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 14 "uuid" => "02fc0adb-8211-4e18-ab34-f7c71d107d9e" "author" => "[email protected]" "name" => "Team Fortress 2" "description" => null "created_at" => "2025-12-07T00:25:18+00:00" "updated_at" => "2025-12-07T00:25:18+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 41 "uuid" => "55536cf0-9e32-40fa-8052-2388a0dbb577" "name" => "Team Fortress 2 Classic" "nest" => 14 "author" => "[email protected]" "description" => "Team Fortress 2 Classic is a free mod of the 2007 game Team Fortress 2, developed by Eminoma and utilizing the Source engine." "docker_image" => "ghcr.io/parkervcp/steamcmd:debian" "docker_images" => [ "ghcr.io/parkervcp/steamcmd:debian" => "ghcr.io/parkervcp/steamcmd:debian" ] "config" => [ "files" => [] "startup" => [ "done" => "gameserver Steam ID" ] "stop" => "quit" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./srcds_run -game {{SRCDS_GAME}} -console -port {{SERVER_PORT}} +map {{SRCDS_MAP}} +ip 0.0.0.0 -strictportbind -norestart -debug +maxplayers {{MAXPLAYERS}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # steamcmd Base Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n apt update\r\n apt install -y zstd\r\n ## just in case someone removed the defaults.\r\n if [[ "${STEAM_USER}" == "" ]] || [[ "${STEAM_PASS}" == "" ]]; then\r\n echo -e "steam user is not set.\n"\r\n echo -e "Using anonymous user.\n"\r\n STEAM_USER=anonymous\r\n STEAM_PASS=""\r\n STEAM_AUTH=""\r\n else\r\n echo -e "user set to ${STEAM_USER}"\r\n fi\r\n \r\n ## download and install steamcmd\r\n cd /tmp\r\n mkdir -p /mnt/server/steamcmd\r\n curl -sSL -o steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz\r\n tar -xzvf steamcmd.tar.gz -C /mnt/server/steamcmd\r\n mkdir -p /mnt/server/steamapps # Fix steamcmd disk write error when this folder is missing\r\n cd /mnt/server/steamcmd\r\n \r\n # SteamCMD fails otherwise for some reason, even running as root.\r\n # This is changed at the end of the install process anyways.\r\n chown -R root:root /mnt\r\n export HOME=/mnt/server\r\n \r\n ## install game using steamcmd\r\n ./steamcmd.sh +force_install_dir /mnt/server +login ${STEAM_USER} ${STEAM_PASS} ${STEAM_AUTH} $( [[ "${WINDOWS_INSTALL}" == "1" ]] && printf %s '+@sSteamCmdForcePlatformType windows' ) +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s "-beta ${SRCDS_BETAID}" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s "-betapassword ${SRCDS_BETAPASS}" ) ${INSTALL_FLAGS} validate +quit ## other flags may be needed depending on install. looking at you cs 1.6\r\n \r\n ## set up 32 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk32\r\n cp -v linux32/steamclient.so ../.steam/sdk32/steamclient.so\r\n \r\n ## set up 64 bit libraries\r\n mkdir -p /mnt/server/.steam/sdk64\r\n cp -v linux64/steamclient.so ../.steam/sdk64/steamclient.so\r\n \r\n ## download TF2C from website\r\n cd /mnt/server\r\n which unzip\r\n L_V=$(curl -s https://wiki.tf2classic.com/kachemak/versions.json | jq -r '.versions | to_entries | max_by(.key | tonumber) | .value.file') # tf2classic-2.1.3.tar.zst\r\n \r\n if [ -z "${GAMEVERSION}" ] || [ "${GAMEVERSION}" == "latest" ]; then\r\n DOWNLOAD_URL="https://wiki.tf2classic.com/kachemak/$L_V"\r\n else\r\n DOWNLOAD_URL="https://wiki.tf2classic.com/kachemak/tf2classic-${GAMEVERSION}.tar.zst"\r\n fi\r\n \r\n \r\n # Check if the URL returns a 404 status code\r\n if curl -s --head "$DOWNLOAD_URL" | head -n 1 | grep "404 Not Found" > /dev/null; then\r\n echo "URL returned 404. Setting to alternative URL."\r\n DOWNLOAD_URL="https://wiki.tf2classic.com/kachemak/$L_V"\r\n fi\r\n \r\n echo "Downloading tf2classic, This will take some time" \r\n echo "Download URL is: ${DOWNLOAD_URL}"\r\n curl -sSL -o tf2classic.tar.zst ${DOWNLOAD_URL}\r\n \r\n #tar -xf tf2classic.tar.zst\r\n \r\n tar --use-compress-program=unzstd -xvf tf2classic.tar.zst\r\n rm -rf tf2classic.tar.zst\r\n ## fix issue /w symlink\r\n cd /mnt/server/bin\r\n ln -s vphysics_srv.so vphysics.so\r\n ln -s studiorender_srv.so studiorender.so\r\n ln -s soundemittersystem_srv.so soundemittersystem.so\r\n ln -s shaderapiempty_srv.so shaderapiempty.so\r\n ln -s scenefilecache_srv.so scenefilecache.so\r\n ln -s replay_srv.so replay.so\r\n ln -s materialsystem_srv.so materialsystem.so\r\n \r\n cd /mnt/server/tf2classic/bin\r\n ## fix server as of 2.0.4 crashing on start\r\n rm -rf server_srv.so\r\n ln -s server.so server_srv.so\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-07T00:25:25+00:00" "updated_at" => "2025-12-07T00:25:25+00:00" ] ] ] ] ] ] ] [ "object" => "nest" "attributes" => [ "id" => 15 "uuid" => "e24b71b0-90ce-45e8-bc03-61999d4e305a" "author" => "[email protected]" "name" => "Generic" "description" => null "created_at" => "2025-12-07T00:38:02+00:00" "updated_at" => "2025-12-13T18:37:32+00:00" "relationships" => [ "eggs" => [ "object" => "list" "data" => [ [ "object" => "egg" "attributes" => [ "id" => 42 "uuid" => "efeeb0bc-1242-4327-9960-c96ee27c9b2f" "name" => "Generic C#" "nest" => 15 "author" => "[email protected]" "description" => "A generic C# (dotnet) egg that runs your C# project." "docker_image" => "ghcr.io/parkervcp/yolks:dotnet_8" "docker_images" => [ "Dotnet_8" => "ghcr.io/parkervcp/yolks:dotnet_8" "Dotnet_7" => "ghcr.io/parkervcp/yolks:dotnet_7" "Dotnet_6" => "ghcr.io/parkervcp/yolks:dotnet_6" "Dotnet_5" => "ghcr.io/parkervcp/yolks:dotnet_5" "Dotnet_3.1" => "ghcr.io/parkervcp/yolks:dotnet_3.1" "Dotnet_2.1" => "ghcr.io/parkervcp/yolks:dotnet_2.1" ] "config" => [ "files" => [] "startup" => [ "done" => [ "change this text 1" "change this text 2" ] ] "stop" => "^^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "if [[ -d .git ]] && [[ {{AUTO_UPDATE}} == "1" ]]; then git pull; fi; cd {{PROJECT_DIR}}; dotnet restore; dotnet run --project {{PROJECT_FILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n \r\n apt update\r\n apt install -y git curl jq file unzip\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n if [ "${USER_UPLOAD}" == "true" ] || [ "${USER_UPLOAD}" == "1" ]; then\r\n echo -e "assuming user knows what they are doing have a good day."\r\n exit 0\r\n fi\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${USERNAME}" ] && [ -z "${ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git js bot repo\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${BRANCH}'"\r\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n fi\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-13T18:38:02+00:00" "updated_at" => "2025-12-13T18:38:02+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 43 "uuid" => "abcc1327-23f4-4214-8128-9799e11fe59c" "name" => "Bun" "nest" => 15 "author" => "[email protected]" "description" => "Bun is an incredibly fast JavaScript runtime, transpiler bundler, and npm package manager all-in-one." "docker_image" => "ghcr.io/parkervcp/yolks:bun_latest" "docker_images" => [ "Bun Latest" => "ghcr.io/parkervcp/yolks:bun_latest" "Bun Canary" => "ghcr.io/parkervcp/yolks:bun_canary" ] "config" => [ "files" => [] "startup" => [ "done" => [ "change this text 1" "change this text 2" ] ] "stop" => "^^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "if [[ -d .git ]] && [[ {{AUTO_UPDATE}} == "1" ]]; then git pull; fi; if [[ ! -z ${BUN_PACKAGES} ]]; then bun install ${BUN_PACKAGES}; fi; if [[ ! -z ${RMBUN_PACKAGES} ]]; then bun remove ${RMBUN_PACKAGES}; fi; if [ -f /home/container/package.json ]; then bun install; fi; bun run {{MAIN_FILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Bun App Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n apt update\r\n apt install -y git curl jq file unzip make gcc g++ python python-dev libtool\r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n if [ "${USER_UPLOAD}" == "true" ] || [ "${USER_UPLOAD}" == "1" ]; then\r\n echo -e "assuming user knows what they are doing have a good day."\r\n exit 0\r\n fi\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${USERNAME}" ] && [ -z "${ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git js bot repo\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${BRANCH}'"\r\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n fi\r\n \r\n \r\n echo "Installing bun packages"\r\n if [[ ! -z ${BUN_PACKAGES} ]]; then\r\n bun install ${BUN_PACKAGES}\r\n fi\r\n \r\n if [ -f /mnt/server/package.json ]; then\r\n bun install --production\r\n fi\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-13T18:38:23+00:00" "updated_at" => "2025-12-13T18:38:23+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 44 "uuid" => "66cb29c5-2795-4327-b942-4713c9bb46f8" "name" => "dart generic" "nest" => 15 "author" => "[email protected]" "description" => """ A generic dart CLI egg.\r\n \r\n This will clone a dart CLI application. it defaults to master if no branch is specified.\r\n \r\n Installs the pubspec.yaml packages on run. If you set user_upload then I assume you know what you are doing. """ "docker_image" => "ghcr.io/parkervcp/yolks:dart_stable" "docker_images" => [ "Dart_stable" => "ghcr.io/parkervcp/yolks:dart_stable" "Dart_3.3" => "ghcr.io/parkervcp/yolks:dart_3.3" "Dart_2.19" => "ghcr.io/parkervcp/yolks:dart_2.19" "Dart_2.18" => "ghcr.io/parkervcp/yolks:dart_2.18" "Dart_2.17" => "ghcr.io/parkervcp/yolks:dart_2.17" ] "config" => [ "files" => [] "startup" => [ "done" => "change this part" ] "stop" => "^^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "if [[ -d .git ]] && [[ {{AUTO_RESET}} == "1" ]]; then git reset --hard; fi; if [[ -d .git ]] && [[ {{AUTO_UPDATE}} == "1" ]]; then git pull; fi; dart pub get; dart run" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Dart CLI Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n apt update\r\n apt install -y git curl file unzip\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n if [ "${USER_UPLOAD}" == "true" ] || [ "${USER_UPLOAD}" == "1" ]; then\r\n echo -e "assuming user knows what they are doing have a good day."\r\n exit 0\r\n fi\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${USERNAME}" ] && [ -z "${ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git dart cli repo\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${BRANCH}'"\r\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n \r\n fi\r\n \r\n echo -e "install complete"\r\n exit 0 """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-13T18:38:31+00:00" "updated_at" => "2025-12-13T18:38:31+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 45 "uuid" => "5d68faed-56d1-46f3-b018-ed3c0fcbc546" "name" => "Deno Generic" "nest" => 15 "author" => "[email protected]" "description" => "A generic egg to run deno code." "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "ghcr.io/parkervcp/yolks:debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [] "startup" => [ "done" => "change this part" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./deno run {{JS_FILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Deno Bot Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n \r\n apt update\r\n apt install -y git curl jq file unzip\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n if [ "${USER_UPLOAD}" == "true" ] || [ "${USER_UPLOAD}" == "1" ]; then\r\n echo -e "assuming user knows what they are doing have a good day."\r\n exit 0\r\n fi\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${USERNAME}" ] && [ -z "${ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git js bot repo\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${BRANCH}'"\r\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n \r\n fi\r\n \r\n ## get deno\r\n GITHUB_PACKAGE=denoland/deno\r\n MATCH=linux\r\n \r\n ## get release info and download links\r\n LATEST_JSON=$(curl --silent "https://api.github.com/repos/${GITHUB_PACKAGE}/releases/latest")\r\n RELEASES=$(curl --silent "https://api.github.com/repos/${GITHUB_PACKAGE}/releases")\r\n \r\n if [ -z "${VERSION}" ] || [ "${VERSION}" == "latest" ]; then\r\n DOWNLOAD_URL=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url | grep -i ${MATCH})\r\n else\r\n VERSION_CHECK=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .tag_name')\r\n if [ "${VERSION}" == "${VERSION_CHECK}" ]; then\r\n DOWNLOAD_LINK=$(echo ${RELEASES} | jq -r --arg VERSION "${VERSION}" '.[] | select(.tag_name==$VERSION) | .assets[].browser_download_url' | grep -i ${MATCH})\r\n else\r\n echo -e "defaulting to latest release"\r\n DOWNLOAD_LINK=$(echo ${LATEST_JSON} | jq .assets | jq -r .[].browser_download_url)\r\n fi\r\n fi\r\n \r\n if [ ! -z "${DOWNLOAD_URL}" ]; then\r\n if curl --output /dev/null --silent --head --fail ${DOWNLOAD_URL}; then\r\n echo -e "link is valid. setting download link to ${DOWNLOAD_URL}"\r\n DOWNLOAD_LINK=${DOWNLOAD_URL}\r\n else\r\n echo -e "link is invalid closing out"\r\n exit 2\r\n fi\r\n fi\r\n \r\n curl -sSL $DOWNLOAD_LINK -o ${DOWNLOAD_LINK##*/}\r\n \r\n FILETYPE=$(file -F ',' ${DOWNLOAD_LINK##*/} | cut -d',' -f2 | cut -d' ' -f2)\r\n if [ "$FILETYPE" == "gzip" ]; then\r\n tar xzvf ${DOWNLOAD_LINK##*/}\r\n elif [ "$FILETYPE" == "Zip" ]; then\r\n unzip -o ${DOWNLOAD_LINK##*/}\r\n elif [ "$FILETYPE" == "XZ" ]; then\r\n tar xvf ${DOWNLOAD_LINK##*/}\r\n else\r\n echo -e "unknown filetype. Exiting"\r\n exit 2\r\n fi\r\n \r\n ## cleaning up downloaded file\r\n rm -f ${DOWNLOAD_LINK##*/}\r\n \r\n echo -e "install complete"\r\n exit 0 """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-13T18:38:40+00:00" "updated_at" => "2025-12-13T18:38:40+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 46 "uuid" => "c71d2099-dd33-4059-8b84-d7898647f53d" "name" => "Elixir" "nest" => 15 "author" => "[email protected]" "description" => "Elixir is a functional, concurrent, high-level general-purpose programming language that runs on the BEAM virtual machine, which is also used to implement the Erlang programming language." "docker_image" => "ghcr.io/parkervcp/yolks:elixir_latest" "docker_images" => [ "Elixir Latest" => "ghcr.io/parkervcp/yolks:elixir_latest" "Elixir 1.15" => "ghcr.io/parkervcp/yolks:elixir_1.15" "Elixir 1.14" => "ghcr.io/parkervcp/yolks:elixir_1.14" "Elixir 1.13" => "ghcr.io/parkervcp/yolks:elixir_1.13" "Elixir 1.12" => "ghcr.io/parkervcp/yolks:elixir_1.12" ] "config" => [ "files" => [] "startup" => [ "done" => [ "change this text 1" "change this text 2" ] ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "if [[ -d .git ]] && [[ {{AUTO_UPDATE}} == "1" ]]; then git pull; fi; mix deps.get; mix run --no-halt" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Elixir App Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n \r\n if [ "${USER_UPLOAD}" == "true" ] || [ "${USER_UPLOAD}" == "1" ]; then\r\n echo -e "assuming user knows what they are doing have a good day."\r\n exit 0\r\n fi\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${GIT_USERNAME}" ] && [ -z "${GIT_ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${GIT_USERNAME}:${GIT_ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git elixir repository\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${GIT_BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${GIT_BRANCH}'"\r\n git clone --single-branch --branch ${GIT_BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n fi\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-13T18:38:47+00:00" "updated_at" => "2025-12-13T18:38:47+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 47 "uuid" => "a9473af0-6b15-473c-b73d-d4467de703e4" "name" => "golang generic" "nest" => 15 "author" => "[email protected]" "description" => """ A generic golang egg that compiles the application and saves an executable\r\n \r\n Meant to be customized before it is used. """ "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "ghcr.io/parkervcp/yolks:debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [] "startup" => [ "done" => "change this part" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./${EXECUTABLE}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # golang generic package\r\n \r\n \r\n if [ ! -d /mnt/server/ ]; then\r\n mkdir -p /mnt/server/\r\n fi\r\n \r\n go get ${GO_PACKAGE}\r\n \r\n cd src/${GO_PACKAGE}\r\n \r\n go get\r\n \r\n go build\r\n \r\n cp -f ${EXECUTABLE} /mnt/server/ """ "entry" => "bash" "container" => "golang:1.15-buster" "extends" => null ] "created_at" => "2025-12-13T18:38:58+00:00" "updated_at" => "2025-12-13T18:38:58+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 48 "uuid" => "9519f686-b8fb-4612-836a-448dc8b86f6d" "name" => "Generic Java" "nest" => 15 "author" => "[email protected]" "description" => "Creates a container that runs java." "docker_image" => "ghcr.io/parkervcp/yolks:java_8" "docker_images" => [ "ghcr.io/parkervcp/yolks:java_8" => "ghcr.io/parkervcp/yolks:java_8" "ghcr.io/parkervcp/yolks:java_11" => "ghcr.io/parkervcp/yolks:java_11" "ghcr.io/parkervcp/yolks:java_16" => "ghcr.io/parkervcp/yolks:java_16" "ghcr.io/parkervcp/yolks:java_17" => "ghcr.io/parkervcp/yolks:java_17" "ghcr.io/parkervcp/yolks:java_19" => "ghcr.io/parkervcp/yolks:java_19" "ghcr.io/parkervcp/yolks:java_21" => "ghcr.io/parkervcp/yolks:java_21" ] "config" => [ "files" => [] "startup" => [ "done" => "change this text" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "java -Dterminal.jline=false -Dterminal.ansi=true -jar {{JARFILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Java Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n PROJECT=java\r\n \r\n apt update\r\n apt install -y curl jq\r\n \r\n cd /mnt/server """ "entry" => "bash" "container" => "ghcr.io/parkervcp/yolks:debian" "extends" => null ] "created_at" => "2025-12-13T18:39:05+00:00" "updated_at" => "2025-12-13T18:39:05+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 49 "uuid" => "8ea48c65-80c2-4c09-b0fd-53a5dc5501d6" "name" => "luvit generic" "nest" => 15 "author" => "[email protected]" "description" => """ A generic luvit egg This will clone a git repo. It defaults to master if no branch is specified.\r\n \r\n Supports the discordia lua framework. """ "docker_image" => "ghcr.io/parkervcp/yolks:debian" "docker_images" => [ "ghcr.io/parkervcp/yolks:debian" => "ghcr.io/parkervcp/yolks:debian" ] "config" => [ "files" => [] "startup" => [ "done" => "change me" ] "stop" => "^c" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "./luvit {{LUA_FILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n ## luvit generic install script\r\n \r\n apt update\r\n apt install -y git curl jq file unzip\r\n \r\n ## get git files\r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n if [ "${USER_UPLOAD}" == "true" ] || [ "${USER_UPLOAD}" == "1" ]; then\r\n echo -e "assuming user knows what they are doing have a good day."\r\n exit 0\r\n fi\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${USERNAME}" ] && [ -z "${ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git repo\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${BRANCH}'"\r\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n fi\r\n \r\n ## install luvit for install time\r\n curl -L https://github.com/luvit/lit/raw/master/get-lit.sh | sh\r\n \r\n ## Install luvit packages\r\n ./lit install ${LIT_PACKAGES}\r\n \r\n ## install end\r\n echo "-----------------------------------------"\r\n echo "Installation completed..."\r\n echo "-----------------------------------------" """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-13T18:39:12+00:00" "updated_at" => "2025-12-13T18:39:12+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 50 "uuid" => "e8b53356-f4a6-421c-b03c-ee0fb04298f5" "name" => "node.js generic" "nest" => 15 "author" => "[email protected]" "description" => """ a generic node.js egg\r\n \r\n This will clone a git repo. it defaults to master if no branch is specified.\r\n \r\n Installs the node_modules on install. If you set user_upload then I assume you know what you are doing. """ "docker_image" => "ghcr.io/parkervcp/yolks:nodejs_21" "docker_images" => [ "Nodejs 21" => "ghcr.io/parkervcp/yolks:nodejs_21" "Nodejs 20" => "ghcr.io/parkervcp/yolks:nodejs_20" "Nodejs 19" => "ghcr.io/parkervcp/yolks:nodejs_19" "Nodejs 18" => "ghcr.io/parkervcp/yolks:nodejs_18" "Nodejs 17" => "ghcr.io/parkervcp/yolks:nodejs_17" "Nodejs 16" => "ghcr.io/parkervcp/yolks:nodejs_16" "Nodejs 14" => "ghcr.io/parkervcp/yolks:nodejs_14" "Nodejs 12" => "ghcr.io/parkervcp/yolks:nodejs_12" ] "config" => [ "files" => [] "startup" => [ "done" => [ "change this text 1" "change this text 2" ] ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "if [[ -d .git ]] && [[ {{AUTO_UPDATE}} == "1" ]]; then git pull; fi; if [[ ! -z ${NODE_PACKAGES} ]]; then /usr/local/bin/npm install ${NODE_PACKAGES}; fi; if [[ ! -z ${UNNODE_PACKAGES} ]]; then /usr/local/bin/npm uninstall ${UNNODE_PACKAGES}; fi; if [ -f /home/container/package.json ]; then /usr/local/bin/npm install; fi; if [[ "${MAIN_FILE}" == "*.js" ]]; then /usr/local/bin/node "/home/container/${MAIN_FILE}" ${NODE_ARGS}; else /usr/local/bin/ts-node --esm "/home/container/${MAIN_FILE}" ${NODE_ARGS}; fi" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # NodeJS App Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n apt update\r\n apt install -y git curl jq file unzip make gcc g++ python3 python3-dev python3-pip libtool\r\n \r\n echo -e "updating npm. please wait..."\r\n npm install npm@latest --location=global\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n if [ "${USER_UPLOAD}" == "true" ] || [ "${USER_UPLOAD}" == "1" ]; then\r\n echo -e "assuming user knows what they are doing have a good day."\r\n exit 0\r\n fi\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${USERNAME}" ] && [ -z "${ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git js repo\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${BRANCH}'"\r\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n \r\n fi\r\n \r\n echo "Installing nodejs packages"\r\n if [[ ! -z ${NODE_PACKAGES} ]]; then\r\n /usr/local/bin/npm install ${NODE_PACKAGES}\r\n fi\r\n \r\n if [ -f /mnt/server/package.json ]; then\r\n /usr/local/bin/npm install --production\r\n fi\r\n \r\n echo -e "install complete"\r\n exit 0 """ "entry" => "bash" "container" => "node:18-bookworm-slim" "extends" => null ] "created_at" => "2025-12-13T18:39:20+00:00" "updated_at" => "2025-12-13T18:39:20+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 51 "uuid" => "322d9a81-7254-4dcc-9b94-cde740d8e099" "name" => "nodemon" "nest" => 15 "author" => "[email protected]" "description" => """ Nodemon javascript egg that automatically restarts the node application when file changes in the directory are detected\r\n \r\n This will clone a git repo for a bot. it defaults to master if no branch is specified.\r\n \r\n Installs the node_modules on install. If you set user_upload, then I assume you know what you are doing. """ "docker_image" => "ghcr.io/parkervcp/yolks:nodejs_21" "docker_images" => [ "ghcr.io/parkervcp/yolks:nodejs_21" => "ghcr.io/parkervcp/yolks:nodejs_21" "ghcr.io/parkervcp/yolks:nodejs_20" => "ghcr.io/parkervcp/yolks:nodejs_20" "ghcr.io/parkervcp/yolks:nodejs_19" => "ghcr.io/parkervcp/yolks:nodejs_19" "ghcr.io/parkervcp/yolks:nodejs_18" => "ghcr.io/parkervcp/yolks:nodejs_18" "ghcr.io/parkervcp/yolks:nodejs_17" => "ghcr.io/parkervcp/yolks:nodejs_17" "ghcr.io/parkervcp/yolks:nodejs_16" => "ghcr.io/parkervcp/yolks:nodejs_16" "ghcr.io/parkervcp/yolks:nodejs_15" => "ghcr.io/parkervcp/yolks:nodejs_15" "ghcr.io/parkervcp/yolks:nodejs_14" => "ghcr.io/parkervcp/yolks:nodejs_14" "ghcr.io/parkervcp/yolks:nodejs_12" => "ghcr.io/parkervcp/yolks:nodejs_12" ] "config" => [ "files" => [] "startup" => [ "done" => "change this text" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "npm install nodemon; if [[ -d .git ]] && [[ {{AUTO_UPDATE}} == "1" ]]; then git pull; fi; if [[ ! -z ${NODE_PACKAGES} ]]; then /usr/local/bin/npm install ${NODE_PACKAGES}; fi; if [[ ! -z ${UNNODE_PACKAGES} ]]; then /usr/local/bin/npm uninstall ${UNNODE_PACKAGES}; fi; if [ -f /home/container/package.json ]; then /usr/local/bin/npm install --production; fi; /home/container/node_modules/nodemon/bin/nodemon.js /home/container/{{BOT_JS_FILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # NodeJS Bot Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n apt update\r\n apt install -y git curl jq file unzip make gcc g++ python python-dev libtool\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n if [ "${USER_UPLOAD}" == "true" ] || [ "${USER_UPLOAD}" == "1" ]; then\r\n echo -e "assuming user knows what they are doing have a good day."\r\n exit 0\r\n fi\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${USERNAME}" ] && [ -z "${ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git js bot repo\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${BRANCH}'"\r\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n \r\n fi\r\n \r\n echo "Installing nodejs packages"\r\n if [[ ! -z ${NODE_PACKAGES} ]]; then\r\n /usr/local/bin/npm install ${NODE_PACKAGES}\r\n fi\r\n \r\n if [ -f /mnt/server/package.json ]; then\r\n /usr/local/bin/npm install --production\r\n fi\r\n \r\n echo -e "install complete"\r\n exit 0 """ "entry" => "bash" "container" => "node:lts-bookworm" "extends" => null ] "created_at" => "2025-12-13T18:39:27+00:00" "updated_at" => "2025-12-13T18:39:27+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 52 "uuid" => "e22a9d14-3861-4a12-9018-478535a629df" "name" => "python generic" "nest" => 15 "author" => "[email protected]" "description" => """ A Generic Python Egg for Pterodactyl\r\n \r\n Tested with: https://github.com/Ispira/pixel-bot """ "docker_image" => "ghcr.io/parkervcp/yolks:python_3.12" "docker_images" => [ "Python 3.12" => "ghcr.io/parkervcp/yolks:python_3.12" "Python 3.11" => "ghcr.io/parkervcp/yolks:python_3.11" "Python 3.10" => "ghcr.io/parkervcp/yolks:python_3.10" "Python 3.9" => "ghcr.io/parkervcp/yolks:python_3.9" "Python 3.8" => "ghcr.io/parkervcp/yolks:python_3.8" "Python 3.7" => "ghcr.io/parkervcp/yolks:python_3.7" "Python 2.7" => "ghcr.io/parkervcp/yolks:python_2.7" ] "config" => [ "files" => [] "startup" => [ "done" => "change this part" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "if [[ -d .git ]] && [[ "{{AUTO_UPDATE}}" == "1" ]]; then git pull; fi; if [[ ! -z "{{PY_PACKAGES}}" ]]; then pip install -U --prefix .local {{PY_PACKAGES}}; fi; if [[ -f /home/container/${REQUIREMENTS_FILE} ]]; then pip install -U --prefix .local -r ${REQUIREMENTS_FILE}; fi; /usr/local/bin/python /home/container/{{PY_FILE}}" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Python App Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n apt update\r\n apt install -y git curl jq file unzip make gcc g++ libtool\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n if [ "${USER_UPLOAD}" == "true" ] || [ "${USER_UPLOAD}" == "1" ]; then\r\n echo -e "assuming user knows what they are doing have a good day."\r\n exit 0\r\n fi\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${USERNAME}" ] && [ -z "${ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git python repo\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${BRANCH}'"\r\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n \r\n fi\r\n \r\n export HOME=/mnt/server\r\n \r\n echo "Installing python requirements into folder"\r\n if [[ ! -z ${PY_PACKAGES} ]]; then\r\n pip install -U --prefix .local ${PY_PACKAGES}\r\n fi\r\n \r\n if [ -f /mnt/server/requirements.txt ]; then\r\n pip install -U --prefix .local -r ${REQUIREMENTS_FILE}\r\n fi\r\n \r\n echo -e "install complete"\r\n exit 0 """ "entry" => "bash" "container" => "python:3.8-slim-bookworm" "extends" => null ] "created_at" => "2025-12-13T18:39:36+00:00" "updated_at" => "2025-12-13T18:39:36+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 53 "uuid" => "ecc810c0-9089-4faf-95f4-b18b04c12ea4" "name" => "rust generic" "nest" => 15 "author" => "[email protected]" "description" => "Creates a container that runs rust with cargo." "docker_image" => "ghcr.io/parkervcp/yolks:rust_latest" "docker_images" => [ "ghcr.io/parkervcp/yolks:rust_latest" => "ghcr.io/parkervcp/yolks:rust_latest" "ghcr.io/parkervcp/yolks:rust_1.60" => "ghcr.io/parkervcp/yolks:rust_1.60" "ghcr.io/parkervcp/yolks:rust_1.56" => "ghcr.io/parkervcp/yolks:rust_1.56" "ghcr.io/parkervcp/yolks:rust_1.31" => "ghcr.io/parkervcp/yolks:rust_1.31" ] "config" => [ "files" => [] "startup" => [ "done" => [ "change this part" ] ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "if [[ -d .git ]] && [[ {{AUTO_UPDATE}} == "1" ]]; then git pull; fi; cargo run --release" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Rust Bot Installation Script\r\n #\r\n # Server Files: /mnt/server\r\n apt update\r\n apt install -y git\r\n \r\n mkdir -p /mnt/server\r\n cd /mnt/server\r\n \r\n ## add git ending if it's not on the address\r\n if [[ ${GIT_ADDRESS} != *.git ]]; then\r\n GIT_ADDRESS=${GIT_ADDRESS}.git\r\n fi\r\n \r\n if [ -z "${USERNAME}" ] && [ -z "${ACCESS_TOKEN}" ]; then\r\n echo -e "using anon api call"\r\n else\r\n GIT_ADDRESS="https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)"\r\n fi\r\n \r\n ## pull git js bot repo\r\n if [ "$(ls -A /mnt/server)" ]; then\r\n echo -e "/mnt/server directory is not empty."\r\n if [ -d .git ]; then\r\n echo -e ".git directory exists"\r\n if [ -f .git/config ]; then\r\n echo -e "loading info from git config"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e "files found with no git config"\r\n echo -e "closing out without touching things to not break anything"\r\n exit 10\r\n fi\r\n fi\r\n \r\n if [ "${ORIGIN}" == "${GIT_ADDRESS}" ]; then\r\n echo "pulling latest from github"\r\n git pull\r\n fi\r\n else\r\n echo -e "/mnt/server is empty.\ncloning files into repo"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e "cloning default branch"\r\n git clone ${GIT_ADDRESS} .\r\n else\r\n echo -e "cloning ${BRANCH}'"\r\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\r\n fi\r\n \r\n fi\r\n \r\n export HOME=/mnt/server\r\n \r\n echo -e "install complete"\r\n exit 0 """ "entry" => "bash" "container" => "ghcr.io/parkervcp/installers:debian" "extends" => null ] "created_at" => "2025-12-13T18:39:58+00:00" "updated_at" => "2025-12-13T18:39:58+00:00" ] ] [ "object" => "egg" "attributes" => [ "id" => 56 "uuid" => "8c7832b0-e6e6-4d9e-82a8-381ed25ede54" "name" => "Docker Image Runner" "nest" => 15 "author" => "[email protected]" "description" => "Run any Docker image with its default configuration." "docker_image" => "ghcr.io/pterodactyl/yolks:debian" "docker_images" => [ "ghcr.io/pterodactyl/yolks:debian" => "ghcr.io/pterodactyl/yolks:debian" ] "config" => [ "files" => [] "startup" => [ "done" => "Container started" ] "stop" => "^C" "logs" => [] "file_denylist" => [] "extends" => null ] "startup" => "/bin/bash -c 'tail -f /dev/null'" "script" => [ "privileged" => true "install" => """ #!/bin/bash\r\n # Installation Script\r\n set -e\r\n \r\n cd /mnt/server\r\n \r\n echo "======================================"\r\n echo "Docker Image Runner Installation"\r\n echo "======================================"\r\n echo "Docker Image: ${DOCKER_IMAGE}"\r\n echo "======================================"\r\n echo "Installation complete!"\r\n echo "Upload files via SFTP if needed." """ "entry" => "bash" "container" => "ghcr.io/pterodactyl/installers:debian" "extends" => null ] "created_at" => "2025-12-16T02:03:15+00:00" "updated_at" => "2025-12-16T02:03:15+00:00" ] ] ] ] ] ] ] ] "meta" => [ "pagination" => [ "total" => 15 "count" => 15 "per_page" => 100 "current_page" => 1 "total_pages" => 1 "links" => [] ] ] ] ] |
|