From 22da9fd0ac0bdcfa4bc08fd94dd44b571edb89a5 Mon Sep 17 00:00:00 2001 From: MaxPtg Date: Fri, 19 Sep 2025 16:24:29 +0200 Subject: [PATCH 1/4] Rename files and update startup, installation script and variables --- java/ftb/egg-f-t-b-modpacks-ch-server.json | 85 ------------------- java/ftb/egg-ftb-server.json | 79 +++++++++++++++++ ...-pterodactyl-f-t-b-modpacks-ch-server.json | 80 ----------------- java/ftb/egg-pterodactyl-ftb-server.json | 78 +++++++++++++++++ 4 files changed, 157 insertions(+), 165 deletions(-) delete mode 100644 java/ftb/egg-f-t-b-modpacks-ch-server.json create mode 100644 java/ftb/egg-ftb-server.json delete mode 100644 java/ftb/egg-pterodactyl-f-t-b-modpacks-ch-server.json create mode 100644 java/ftb/egg-pterodactyl-ftb-server.json diff --git a/java/ftb/egg-f-t-b-modpacks-ch-server.json b/java/ftb/egg-f-t-b-modpacks-ch-server.json deleted file mode 100644 index f92ac4ce..00000000 --- a/java/ftb/egg-f-t-b-modpacks-ch-server.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "version": "PTDL_v2", - "update_url": null - }, - "exported_at": "2024-06-01T19:39:44+00:00", - "name": "FTB-modpacks.ch Server", - "author": "runemaster580@gmail.com", - "uuid": "e60a9de8-a0b1-4d97-b4e2-6568f048668d", - "description": "Since the release of the FTB APP, FTB modpacks are now distributed through modpacks.ch. This egg was developed for support for modpacks that are distributed through this.", - "features": [ - "eula", - "java_version", - "pid_limit" - ], - "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" - }, - "file_denylist": [], - "startup": "java -javaagent:log4jfix\/Log4jPatcher-1.0.0.jar -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true $( [[ ! -f unix_args.txt ]] && printf %s \"-jar start-server.jar\" || printf %s \"@unix_args.txt\" )", - "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.build.default.port}}\",\r\n \"query.port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}", - "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", - "logs": "{}", - "stop": "stop" - }, - "scripts": { - "installation": { - "script": "#!\/bin\/bash\r\n# FTB Pack Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\nif [ ! -d \/mnt\/server ]; then\r\n mkdir -p \/mnt\/server\r\nfi\r\ncd \/mnt\/server\r\n\r\n\r\n# Download needed software.\r\nfunction install_required {\r\n apt update\r\n apt install -y curl jq\r\n}\r\n\r\nfunction get_modpack_id {\r\n urlencode() {\r\n local string=\"${1\/\/ \/%20}\"\r\n echo \"$string\"\r\n }\r\n \r\n # if no modpack id is set and modpack search term is set.\r\n if [ -z ${FTB_MODPACK_ID} ] && [ ! -z \"${FTB_SEARCH_TERM}\" ]; then\r\n encoded_search_term=$(urlencode \"$FTB_SEARCH_TERM\")\r\n JSON_DATA=$(curl -sSL https:\/\/api.modpacks.ch\/public\/modpack\/search\/8?term=\"${encoded_search_term}\")\r\n \r\n # grabs the first modpack in array.\r\n FTB_MODPACK_ID=$(echo -e ${JSON_DATA} | jq -r \".packs[0]\")\r\n fi\r\n \r\n if [ -z ${FTB_MODPACK_VERSION_ID} ] && [ ! -z ${FTB_VERSION_STRING} ]; then\r\n # grabs the correct version id matching the string.\r\n FTB_MODPACK_VERSION_ID=$(curl -sSL https:\/\/api.modpacks.ch\/public\/modpack\/${FTB_MODPACK_ID} | jq -r --arg VSTRING ${FTB_VERSION_STRING} '.versions[] | select(.name == $VSTRING) | .id')\r\n fi\r\n}\r\n\r\nfunction run_installer {\r\n # get architecture for installer\r\n INSTALLER_TYPE=$([ \"$(uname -m)\" == \"x86_64\" ] && echo \"linux\" || echo \"arm\/linux\")\r\n echo \"ModpackID: ${FTB_MODPACK_ID} VersionID: ${FTB_MODPACK_VERSION_ID} InstallerType: ${INSTALLER_TYPE}\"\r\n\r\n # download installer\r\n curl -L https:\/\/api.modpacks.ch\/public\/modpack\/0\/0\/server\/${INSTALLER_TYPE} --output serversetup\r\n chmod +x .\/serversetup\r\n \r\n # remove old forge files (to allow updating)\r\n rm -rf libraries\/net\/minecraftforge\/forge\r\n rm -rf libraries\/net\/neoforged\/forge\r\n rm -f unix_args.txt\r\n \r\n # run installer\r\n .\/serversetup ${FTB_MODPACK_ID} ${FTB_MODPACK_VERSION_ID} --auto --noscript --nojava\r\n}\r\n\r\n# allows startup command to work\r\nfunction move_startup_files {\r\n # create symlink for forge unix_args.txt if exists\r\n if compgen -G \"libraries\/net\/minecraftforge\/forge\/*\/unix_args.txt\"; then\r\n ln -sf libraries\/net\/minecraftforge\/forge\/*\/unix_args.txt unix_args.txt\r\n fi\r\n \r\n # create symlink for neoforge unix_args.txt if exists\r\n if compgen -G \"libraries\/net\/neoforged\/forge\/*\/unix_args.txt\"; then\r\n ln -sf libraries\/net\/neoforged\/forge\/*\/unix_args.txt unix_args.txt\r\n fi\r\n \r\n # move forge\/neoforge\/fabric jar file to start-server.jar if exists\r\n if compgen -G \"forge-*.jar\"; then\r\n mv -f forge-*.jar start-server.jar\r\n elif compgen -G \"fabric-*.jar\"; then\r\n mv -f fabric-*.jar start-server.jar\r\n fi\r\n}\r\n\r\n# installer cleanup\r\nfunction installer_cleanup {\r\n rm serversetup\r\n rm -f run.bat\r\n rm -f run.sh\r\n}\r\n\r\n# run installation steps\r\ninstall_required\r\nget_modpack_id\r\nrun_installer\r\nmove_startup_files\r\ninstaller_cleanup\r\n\r\necho \"Finished installing FTB modpack\"", - "container": "openjdk:8-jdk-slim", - "entrypoint": "bash" - } - }, - "variables": [ - { - "name": "FTB Pack search term", - "description": "the search term for finding the modpack. needs to be at least 4 characters long.\r\nFind out what term is needed by using the ftb app and searching with the term. make sure it only returns 1 result.\r\ncan also be searched for via: https:\/\/api.modpacks.ch\/public\/modpack\/search\/8?term={SEARCHTERM}\r\n\r\nonly needed if the modpack id and modpack version id is unknown.", - "env_variable": "FTB_SEARCH_TERM", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": "nullable|string", - "sort": null, - "field_type": "text" - }, - { - "name": "FTB modpack ID", - "description": "The FTB Api modpack ID.\r\nNeeded if not using the search variable\r\n\r\nExample: FTB Interactions ID is 5.\r\nhttps:\/\/api.modpacks.ch\/public\/modpack\/5", - "env_variable": "FTB_MODPACK_ID", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": "nullable|integer", - "sort": null, - "field_type": "text" - }, - { - "name": "FTB Pack Version", - "description": "what version of the modpack to install. leave empty if using the modpack version id variable.", - "env_variable": "FTB_VERSION_STRING", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": "nullable|string", - "sort": null, - "field_type": "text" - }, - { - "name": "FTB Pack Version ID", - "description": "The modpack api version ID.\r\nneeded if not using the string for the version.\r\n\r\nExample FTB Revelations version id for version \"2.0.2\" is 86.\r\nwhich would come out as: https:\/\/api.modpacks.ch\/public\/modpack\/5\/86", - "env_variable": "FTB_MODPACK_VERSION_ID", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": "nullable|integer", - "sort": null, - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/java/ftb/egg-ftb-server.json b/java/ftb/egg-ftb-server.json new file mode 100644 index 00000000..b76a8165 --- /dev/null +++ b/java/ftb/egg-ftb-server.json @@ -0,0 +1,79 @@ +{ + "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", + "meta": { + "version": "PLCN_v2", + "update_url": null + }, + "exported_at": "2025-09-19T13:34:51+00:00", + "name": "FTB", + "author": "m.patecky@cesp-server.de", + "uuid": "283ef0f7-dae7-4621-8056-9496864727bc", + "description": "Deploy FTB modpack servers using the official FTB API. Supports installation by modpack name/version or direct API IDs. See README.md for detailed examples and configuration options.", + "tags": [], + "features": ["eula", "java_version", "pid_limit"], + "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" + }, + "file_denylist": [], + "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true $( [[ ! -f unix_args.txt ]] && printf %s \"-jar start-server.jar\" || printf %s \"@unix_args.txt\" ) nogui", + "config": { + "files": "{\n \"server.properties\": {\n \"parser\": \"properties\",\n \"find\": {\n \"server-ip\": \"0.0.0.0\",\n \"server-port\": \"{{server.allocations.default.port}}\",\n \"query.port\": \"{{server.allocations.default.port}}\"\n }\n }\n}", + "startup": "{\n \"done\": \")! For help, type \"\n}", + "logs": "{}", + "stop": "stop" + }, + "scripts": { + "installation": { + "script": "#!/bin/bash\r\n# FTB Modpack Installation Script\r\n\r\nset -e\r\n\r\n#\r\nreadonly SERVERFILE_DIR=\"/mnt/server\"\r\nreadonly FTB_API_URL=\"https://api.feed-the-beast.com/v1/modpacks/public/modpack\"\r\n\r\n# Ensure server directory exists\r\nmkdir -p \"${SERVERFILE_DIR}\"\r\ncd \"${SERVERFILE_DIR}\"\r\n\r\necho \"Starting FTB modpack installation...\"\r\n\r\n# Install required dependencies\r\ninstall_dependencies() {\r\n echo \"Installing dependencies...\"\r\n apt-get update -qq\r\n apt-get install -y curl jq\r\n}\r\n\r\n# URL encode function for search terms\r\nurl_encode() {\r\n local string=\"${1// /%20}\"\r\n echo \"$string\"\r\n}\r\n\r\n# Resolve modpack ID from search term\r\nresolve_modpack_id() {\r\n if [[ -z \"${FTB_MODPACK_ID}\" && -n \"${FTB_SEARCH_TERM}\" ]]; then\r\n echo \"Resolving modpack ID from search term: ${FTB_SEARCH_TERM}\"\r\n local encoded_term=$(url_encode \"$FTB_SEARCH_TERM\")\r\n local search_url=\"https://api.modpacks.ch/public/modpack/search/8?term=${encoded_term}\"\r\n \r\n FTB_MODPACK_ID=$(curl -sSL \"$search_url\" | jq -r \".packs[0]\")\r\n \r\n if [[ \"${FTB_MODPACK_ID}\" == \"null\" || -z \"${FTB_MODPACK_ID}\" ]]; then\r\n echo \"Error: Could not find modpack with search term '${FTB_SEARCH_TERM}'\"\r\n exit 1\r\n fi\r\n \r\n echo \"Found modpack ID: ${FTB_MODPACK_ID}\"\r\n fi\r\n}\r\n\r\n# Resolve version ID from version string\r\nresolve_version_id() {\r\n if [[ -z \"${FTB_MODPACK_VERSION_ID}\" && -n \"${FTB_VERSION_STRING}\" ]]; then\r\n echo \"Resolving version ID from version string: ${FTB_VERSION_STRING}\"\r\n \r\n local api_url=\"${FTB_API_URL}/${FTB_MODPACK_ID}\"\r\n local api_data=$(curl -sSL \"$api_url\" 2>/dev/null || echo \"null\")\r\n \r\n if [[ \"$api_data\" != \"null\" ]] && echo \"$api_data\" | jq -e '.status == \"success\"' >/dev/null 2>&1; then\r\n FTB_MODPACK_VERSION_ID=$(echo \"$api_data\" | jq -r --arg version \"${FTB_VERSION_STRING}\" '.versions[] | select(.name == $version) | .id')\r\n fi\r\n \r\n if [[ \"${FTB_MODPACK_VERSION_ID}\" == \"null\" || -z \"${FTB_MODPACK_VERSION_ID}\" ]]; then\r\n echo \"Error: Could not find version '${FTB_VERSION_STRING}' for modpack ID ${FTB_MODPACK_ID}\"\r\n exit 1\r\n fi\r\n \r\n echo \"Found version ID: ${FTB_MODPACK_VERSION_ID}\"\r\n fi\r\n}\r\n\r\n# Download and execute modpack installer\r\ninstall_modpack() {\r\n local installer_arch=$([ \"$(uname -m)\" == \"x86_64\" ] && echo \"linux\" || echo \"arm/linux\")\r\n \r\n echo \"Installing modpack...\"\r\n echo \"Modpack ID: ${FTB_MODPACK_ID}\"\r\n echo \"Version ID: ${FTB_MODPACK_VERSION_ID}\"\r\n echo \"Architecture: ${installer_arch}\"\r\n \r\n # Clean up old forge/neoforge files\r\n rm -rf libraries/net/minecraftforge/forge\r\n rm -rf libraries/net/neoforged/forge\r\n rm -f unix_args.txt\r\n \r\n # Download and run installer using FTB API\r\n local api_url=\"${FTB_API_URL}/${FTB_MODPACK_ID}/${FTB_MODPACK_VERSION_ID}/server/${installer_arch}\"\r\n local http_code=$(curl -o /dev/null -s -w \"%{http_code}\" \"$api_url\")\r\n \r\n if [[ \"$http_code\" == \"200\" ]]; then\r\n echo \"Downloading installer from FTB API\"\r\n curl -L \"$api_url\" --output serversetup\r\n chmod +x ./serversetup\r\n ./serversetup -pack \"${FTB_MODPACK_ID}\" -version \"${FTB_MODPACK_VERSION_ID}\" -auto -force\r\n else\r\n echo \"Error: FTB API returned HTTP $http_code for installer download\"\r\n echo \"URL: $api_url\"\r\n exit 1\r\n fi\r\n}\r\n\r\n# Setup startup files and symlinks for Pelican Panel startup command\r\nsetup_startup_files() {\r\n echo \"Setting up startup files...\"\r\n \r\n # Create symlinks for unix_args.txt (priority order)\r\n for path in \"libraries/net/minecraftforge/forge/*/unix_args.txt\" \\\r\n \"libraries/net/neoforged/neoforge/*/unix_args.txt\" \\\r\n \"libraries/net/fabricmc/fabric-loader/*/unix_args.txt\"; do\r\n if compgen -G \"$path\" >/dev/null; then\r\n ln -sf $path unix_args.txt\r\n break\r\n fi\r\n done\r\n \r\n # Move modloader jar to standard name (priority order)\r\n for pattern in \"forge-*.jar\" \"neoforge-*.jar\" \"fabric-*.jar\"; do\r\n if compgen -G \"$pattern\" >/dev/null; then\r\n mv $pattern start-server.jar\r\n break\r\n fi\r\n done\r\n}\r\n\r\n# Clean up installation files\r\ncleanup_installation() {\r\n echo \"Cleaning up installation files...\"\r\n rm -f serversetup run.bat\r\n}\r\n\r\n# Main installation flow\r\nmain() {\r\n echo \"=== FTB Modpack Installation ===\"\r\n echo \"Modpack ID: ${FTB_MODPACK_ID:-'(to be resolved)'}\"\r\n echo \"Version ID: ${FTB_MODPACK_VERSION_ID:-'(to be resolved)'}\"\r\n echo \"Search Term: ${FTB_SEARCH_TERM:-'(not set)'}\"\r\n echo \"Version String: ${FTB_VERSION_STRING:-'(not set)'}\"\r\n echo \"================================\"\r\n \r\n install_dependencies\r\n resolve_modpack_id\r\n resolve_version_id\r\n install_modpack\r\n setup_startup_files\r\n cleanup_installation\r\n \r\n echo \"=== Installation Complete ===\"\r\n}\r\n\r\n# Execute main function\r\nmain", + "container": "openjdk:8-jdk-slim", + "entrypoint": "bash" + } + }, + "variables": [ + { + "name": "FTB ModPack Version ID", + "description": "The numeric version ID from the FTB API. Required if not using version string method.", + "env_variable": "FTB_MODPACK_VERSION_ID", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": ["nullable", "integer"], + "sort": 2 + }, + { + "name": "FTB Modpack ID", + "description": "The numeric modpack ID from the FTB API. Required if not using search term method.", + "env_variable": "FTB_MODPACK_ID", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": ["nullable", "integer"], + "sort": 1 + }, + { + "name": "FTB Pack Search Term", + "description": "The modpack name to search for (minimum 4 characters). Recommended method.", + "env_variable": "FTB_SEARCH_TERM", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": ["nullable", "string"], + "sort": 4 + }, + { + "name": "FTB Pack Version String", + "description": "The exact version string of the modpack (e.g., \"2.12.2\").", + "env_variable": "FTB_VERSION_STRING", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": ["nullable", "string"], + "sort": 3 + } + ] +} diff --git a/java/ftb/egg-pterodactyl-f-t-b-modpacks-ch-server.json b/java/ftb/egg-pterodactyl-f-t-b-modpacks-ch-server.json deleted file mode 100644 index e1066b6f..00000000 --- a/java/ftb/egg-pterodactyl-f-t-b-modpacks-ch-server.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", - "meta": { - "update_url": null, - "version": "PTDL_v2" - }, - "exported_at": "2024-06-01T19:39:44+00:00", - "name": "FTB-modpacks.ch Server", - "author": "runemaster580@gmail.com", - "description": "Since the release of the FTB APP, FTB modpacks are now distributed through modpacks.ch. This egg was developed for support for modpacks that are distributed through this.", - "features": [ - "eula", - "java_version", - "pid_limit" - ], - "docker_images": { - "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 8": "ghcr.io/pterodactyl/yolks:java_8" - }, - "file_denylist": [], - "startup": "java -javaagent:log4jfix/Log4jPatcher-1.0.0.jar -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true $( [[ ! -f unix_args.txt ]] \u0026\u0026 printf %s \"-jar start-server.jar\" || printf %s \"@unix_args.txt\" )", - "config": { - "files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.build.default.port}}\",\r\n \"query.port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}", - "logs": "{}", - "startup": "{\r\n \"done\": \")! For help, type \"\r\n}", - "stop": "stop" - }, - "scripts": { - "installation": { - "container": "openjdk:8-jdk-slim", - "entrypoint": "bash", - "script": "#!/bin/bash\r\n# FTB Pack Installation Script\r\n#\r\n# Server Files: /mnt/server\r\nif [ ! -d /mnt/server ]; then\r\n mkdir -p /mnt/server\r\nfi\r\ncd /mnt/server\r\n\r\n\r\n# Download needed software.\r\nfunction install_required {\r\n apt update\r\n apt install -y curl jq\r\n}\r\n\r\nfunction get_modpack_id {\r\n urlencode() {\r\n local string=\"${1// /%20}\"\r\n echo \"$string\"\r\n }\r\n \r\n # if no modpack id is set and modpack search term is set.\r\n if [ -z ${FTB_MODPACK_ID} ] \u0026\u0026 [ ! -z \"${FTB_SEARCH_TERM}\" ]; then\r\n encoded_search_term=$(urlencode \"$FTB_SEARCH_TERM\")\r\n JSON_DATA=$(curl -sSL https://api.modpacks.ch/public/modpack/search/8?term=\"${encoded_search_term}\")\r\n \r\n # grabs the first modpack in array.\r\n FTB_MODPACK_ID=$(echo -e ${JSON_DATA} | jq -r \".packs[0]\")\r\n fi\r\n \r\n if [ -z ${FTB_MODPACK_VERSION_ID} ] \u0026\u0026 [ ! -z ${FTB_VERSION_STRING} ]; then\r\n # grabs the correct version id matching the string.\r\n FTB_MODPACK_VERSION_ID=$(curl -sSL https://api.modpacks.ch/public/modpack/${FTB_MODPACK_ID} | jq -r --arg VSTRING ${FTB_VERSION_STRING} '.versions[] | select(.name == $VSTRING) | .id')\r\n fi\r\n}\r\n\r\nfunction run_installer {\r\n # get architecture for installer\r\n INSTALLER_TYPE=$([ \"$(uname -m)\" == \"x86_64\" ] \u0026\u0026 echo \"linux\" || echo \"arm/linux\")\r\n echo \"ModpackID: ${FTB_MODPACK_ID} VersionID: ${FTB_MODPACK_VERSION_ID} InstallerType: ${INSTALLER_TYPE}\"\r\n\r\n # download installer\r\n curl -L https://api.modpacks.ch/public/modpack/0/0/server/${INSTALLER_TYPE} --output serversetup\r\n chmod +x ./serversetup\r\n \r\n # remove old forge files (to allow updating)\r\n rm -rf libraries/net/minecraftforge/forge\r\n rm -rf libraries/net/neoforged/forge\r\n rm -f unix_args.txt\r\n \r\n # run installer\r\n ./serversetup ${FTB_MODPACK_ID} ${FTB_MODPACK_VERSION_ID} --auto --noscript --nojava\r\n}\r\n\r\n# allows startup command to work\r\nfunction move_startup_files {\r\n # create symlink for forge unix_args.txt if exists\r\n if compgen -G \"libraries/net/minecraftforge/forge/*/unix_args.txt\"; then\r\n ln -sf libraries/net/minecraftforge/forge/*/unix_args.txt unix_args.txt\r\n fi\r\n \r\n # create symlink for neoforge unix_args.txt if exists\r\n if compgen -G \"libraries/net/neoforged/forge/*/unix_args.txt\"; then\r\n ln -sf libraries/net/neoforged/forge/*/unix_args.txt unix_args.txt\r\n fi\r\n \r\n # move forge/neoforge/fabric jar file to start-server.jar if exists\r\n if compgen -G \"forge-*.jar\"; then\r\n mv -f forge-*.jar start-server.jar\r\n elif compgen -G \"fabric-*.jar\"; then\r\n mv -f fabric-*.jar start-server.jar\r\n fi\r\n}\r\n\r\n# installer cleanup\r\nfunction installer_cleanup {\r\n rm serversetup\r\n rm -f run.bat\r\n rm -f run.sh\r\n}\r\n\r\n# run installation steps\r\ninstall_required\r\nget_modpack_id\r\nrun_installer\r\nmove_startup_files\r\ninstaller_cleanup\r\n\r\necho \"Finished installing FTB modpack\"" - } - }, - "variables": [ - { - "name": "FTB Pack search term", - "description": "the search term for finding the modpack. needs to be at least 4 characters long.\r\nFind out what term is needed by using the ftb app and searching with the term. make sure it only returns 1 result.\r\ncan also be searched for via: https://api.modpacks.ch/public/modpack/search/8?term={SEARCHTERM}\r\n\r\nonly needed if the modpack id and modpack version id is unknown.", - "env_variable": "FTB_SEARCH_TERM", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": "nullable|string", - "field_type": "text" - }, - { - "name": "FTB modpack ID", - "description": "The FTB Api modpack ID.\r\nNeeded if not using the search variable\r\n\r\nExample: FTB Interactions ID is 5.\r\nhttps://api.modpacks.ch/public/modpack/5", - "env_variable": "FTB_MODPACK_ID", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": "nullable|integer", - "field_type": "text" - }, - { - "name": "FTB Pack Version", - "description": "what version of the modpack to install. leave empty if using the modpack version id variable.", - "env_variable": "FTB_VERSION_STRING", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": "nullable|string", - "field_type": "text" - }, - { - "name": "FTB Pack Version ID", - "description": "The modpack api version ID.\r\nneeded if not using the string for the version.\r\n\r\nExample FTB Revelations version id for version \"2.0.2\" is 86.\r\nwhich would come out as: https://api.modpacks.ch/public/modpack/5/86", - "env_variable": "FTB_MODPACK_VERSION_ID", - "default_value": "", - "user_viewable": true, - "user_editable": true, - "rules": "nullable|integer", - "field_type": "text" - } - ] -} \ No newline at end of file diff --git a/java/ftb/egg-pterodactyl-ftb-server.json b/java/ftb/egg-pterodactyl-ftb-server.json new file mode 100644 index 00000000..b7b7955f --- /dev/null +++ b/java/ftb/egg-pterodactyl-ftb-server.json @@ -0,0 +1,78 @@ +{ + "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", + "meta": { + "version": "PTDL_v2", + "update_url": null + }, + "exported_at": "2025-09-19T13:34:51+00:00", + "name": "FTB", + "author": "m.patecky@cesp-server.de", + "uuid": "283ef0f7-dae7-4621-8056-9496864727bc", + "description": "Deploy FTB modpack servers using the official FTB API. Supports installation by modpack name/version or direct API IDs. See README.md for detailed examples and configuration options.", + "features": ["eula", "java_version", "pid_limit"], + "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" + }, + "file_denylist": [], + "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true $( [[ ! -f unix_args.txt ]] && printf %s \"-jar start-server.jar\" || printf %s \"@unix_args.txt\" ) nogui", + "config": { + "files": "{\n \"server.properties\": {\n \"parser\": \"properties\",\n \"find\": {\n \"server-ip\": \"0.0.0.0\",\n \"server-port\": \"{{server.build.default.port}}\",\n \"query.port\": \"{{server.build.default.port}}\"\n }\n }\n}", + "startup": "{\n \"done\": \")! For help, type \"\n}", + "logs": "{}", + "stop": "stop" + }, + "scripts": { + "installation": { + "script": "#!/bin/bash\r\n# FTB Modpack Installation Script\r\n\r\nset -e\r\n\r\n#\r\nreadonly SERVERFILE_DIR=\"/mnt/server\"\r\nreadonly FTB_API_URL=\"https://api.feed-the-beast.com/v1/modpacks/public/modpack\"\r\n\r\n# Ensure server directory exists\r\nmkdir -p \"${SERVERFILE_DIR}\"\r\ncd \"${SERVERFILE_DIR}\"\r\n\r\necho \"Starting FTB modpack installation...\"\r\n\r\n# Install required dependencies\r\ninstall_dependencies() {\r\n echo \"Installing dependencies...\"\r\n apt-get update -qq\r\n apt-get install -y curl jq\r\n}\r\n\r\n# URL encode function for search terms\r\nurl_encode() {\r\n local string=\"${1// /%20}\"\r\n echo \"$string\"\r\n}\r\n\r\n# Resolve modpack ID from search term\r\nresolve_modpack_id() {\r\n if [[ -z \"${FTB_MODPACK_ID}\" && -n \"${FTB_SEARCH_TERM}\" ]]; then\r\n echo \"Resolving modpack ID from search term: ${FTB_SEARCH_TERM}\"\r\n local encoded_term=$(url_encode \"$FTB_SEARCH_TERM\")\r\n local search_url=\"https://api.modpacks.ch/public/modpack/search/8?term=${encoded_term}\"\r\n \r\n FTB_MODPACK_ID=$(curl -sSL \"$search_url\" | jq -r \".packs[0]\")\r\n \r\n if [[ \"${FTB_MODPACK_ID}\" == \"null\" || -z \"${FTB_MODPACK_ID}\" ]]; then\r\n echo \"Error: Could not find modpack with search term '${FTB_SEARCH_TERM}'\"\r\n exit 1\r\n fi\r\n \r\n echo \"Found modpack ID: ${FTB_MODPACK_ID}\"\r\n fi\r\n}\r\n\r\n# Resolve version ID from version string\r\nresolve_version_id() {\r\n if [[ -z \"${FTB_MODPACK_VERSION_ID}\" && -n \"${FTB_VERSION_STRING}\" ]]; then\r\n echo \"Resolving version ID from version string: ${FTB_VERSION_STRING}\"\r\n \r\n local api_url=\"${FTB_API_URL}/${FTB_MODPACK_ID}\"\r\n local api_data=$(curl -sSL \"$api_url\" 2>/dev/null || echo \"null\")\r\n \r\n if [[ \"$api_data\" != \"null\" ]] && echo \"$api_data\" | jq -e '.status == \"success\"' >/dev/null 2>&1; then\r\n FTB_MODPACK_VERSION_ID=$(echo \"$api_data\" | jq -r --arg version \"${FTB_VERSION_STRING}\" '.versions[] | select(.name == $version) | .id')\r\n fi\r\n \r\n if [[ \"${FTB_MODPACK_VERSION_ID}\" == \"null\" || -z \"${FTB_MODPACK_VERSION_ID}\" ]]; then\r\n echo \"Error: Could not find version '${FTB_VERSION_STRING}' for modpack ID ${FTB_MODPACK_ID}\"\r\n exit 1\r\n fi\r\n \r\n echo \"Found version ID: ${FTB_MODPACK_VERSION_ID}\"\r\n fi\r\n}\r\n\r\n# Download and execute modpack installer\r\ninstall_modpack() {\r\n local installer_arch=$([ \"$(uname -m)\" == \"x86_64\" ] && echo \"linux\" || echo \"arm/linux\")\r\n \r\n echo \"Installing modpack...\"\r\n echo \"Modpack ID: ${FTB_MODPACK_ID}\"\r\n echo \"Version ID: ${FTB_MODPACK_VERSION_ID}\"\r\n echo \"Architecture: ${installer_arch}\"\r\n \r\n # Clean up old forge/neoforge files\r\n rm -rf libraries/net/minecraftforge/forge\r\n rm -rf libraries/net/neoforged/forge\r\n rm -f unix_args.txt\r\n \r\n # Download and run installer using FTB API\r\n local api_url=\"${FTB_API_URL}/${FTB_MODPACK_ID}/${FTB_MODPACK_VERSION_ID}/server/${installer_arch}\"\r\n local http_code=$(curl -o /dev/null -s -w \"%{http_code}\" \"$api_url\")\r\n \r\n if [[ \"$http_code\" == \"200\" ]]; then\r\n echo \"Downloading installer from FTB API\"\r\n curl -L \"$api_url\" --output serversetup\r\n chmod +x ./serversetup\r\n ./serversetup -pack \"${FTB_MODPACK_ID}\" -version \"${FTB_MODPACK_VERSION_ID}\" -auto -force\r\n else\r\n echo \"Error: FTB API returned HTTP $http_code for installer download\"\r\n echo \"URL: $api_url\"\r\n exit 1\r\n fi\r\n}\r\n\r\n# Setup startup files and symlinks for Pterodactyl Panel startup command\r\nsetup_startup_files() {\r\n echo \"Setting up startup files...\"\r\n \r\n # Create symlinks for unix_args.txt (priority order)\r\n for path in \"libraries/net/minecraftforge/forge/*/unix_args.txt\" \\\r\n \"libraries/net/neoforged/neoforge/*/unix_args.txt\" \\\r\n \"libraries/net/fabricmc/fabric-loader/*/unix_args.txt\"; do\r\n if compgen -G \"$path\" >/dev/null; then\r\n ln -sf $path unix_args.txt\r\n break\r\n fi\r\n done\r\n \r\n # Move modloader jar to standard name (priority order)\r\n for pattern in \"forge-*.jar\" \"neoforge-*.jar\" \"fabric-*.jar\"; do\r\n if compgen -G \"$pattern\" >/dev/null; then\r\n mv $pattern start-server.jar\r\n break\r\n fi\r\n done\r\n}\r\n\r\n# Clean up installation files\r\ncleanup_installation() {\r\n echo \"Cleaning up installation files...\"\r\n rm -f serversetup run.bat\r\n}\r\n\r\n# Main installation flow\r\nmain() {\r\n echo \"=== FTB Modpack Installation ===\"\r\n echo \"Modpack ID: ${FTB_MODPACK_ID:-'(to be resolved)'}\"\r\n echo \"Version ID: ${FTB_MODPACK_VERSION_ID:-'(to be resolved)'}\"\r\n echo \"Search Term: ${FTB_SEARCH_TERM:-'(not set)'}\"\r\n echo \"Version String: ${FTB_VERSION_STRING:-'(not set)'}\"\r\n echo \"================================\"\r\n \r\n install_dependencies\r\n resolve_modpack_id\r\n resolve_version_id\r\n install_modpack\r\n setup_startup_files\r\n cleanup_installation\r\n \r\n echo \"=== Installation Complete ===\"\r\n}\r\n\r\n# Execute main function\r\nmain", + "container": "openjdk:8-jdk-slim", + "entrypoint": "bash" + } + }, + "variables": [ + { + "name": "FTB Modpack ID", + "description": "The numeric modpack ID from the FTB API. Required if not using search term method.", + "env_variable": "FTB_MODPACK_ID", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "nullable|integer", + "field_type": "text" + }, + { + "name": "FTB ModPack Version ID", + "description": "The numeric version ID from the FTB API. Required if not using version string method.", + "env_variable": "FTB_MODPACK_VERSION_ID", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "nullable|integer", + "field_type": "text" + }, + { + "name": "FTB Pack Version String", + "description": "The exact version string of the modpack (e.g., \"2.12.2\").", + "env_variable": "FTB_VERSION_STRING", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "nullable|string", + "field_type": "text" + }, + { + "name": "FTB Pack Search Term", + "description": "The modpack name to search for (minimum 4 characters). Recommended method.", + "env_variable": "FTB_SEARCH_TERM", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "nullable|string", + "field_type": "text" + } + ] +} From ff4a9af6b432f76bd8192cbf9630aeb86afc9ca9 Mon Sep 17 00:00:00 2001 From: MaxPtg Date: Fri, 19 Sep 2025 16:24:37 +0200 Subject: [PATCH 2/4] Update README --- java/ftb/README.md | 89 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 21 deletions(-) diff --git a/java/ftb/README.md b/java/ftb/README.md index 385b0e0c..d428e1ce 100644 --- a/java/ftb/README.md +++ b/java/ftb/README.md @@ -1,36 +1,83 @@ # FTB Modpacks -A generic service to pull FTB modpacks from api.modpacks.ch. +A generic service to pull FTB modpacks from the official FTB API at api.feed-the-beast.com. There are 2 ways to install a server through this service. The first method only requires you to know the modpacks name and version. The second method requires you to know the id for both the modpack and version in the api. -## Method 1 (Recommended) +## Method 1 (Recommended) - Search by Name -- FTB_SEARCH_TERM: the modpack name to query for, must be at least 4 characters long. - EX: for FTB: Interactions you would do "interactions". -- FTB_VERSION_STRING: the string version that you want to install. - EX: for FTB: Interactions 2.0.2, you would put "2.0.2". +Use this method when you know the modpack name and version string. This is the easiest approach for most users. -## Method 2 +*NOTE*: If the search term contains a space (to avoid multiple entries), you may want to use Method 2 instead to avoid issues. -- FTB_MODPACK_ID: the id that directs to the modpack in the api. - EX: for FTB: Interactions the id would be "5". `https://api.modpacks.ch/public/modpack/5` -- FTB_MODPACK_VERSION_ID: the version id in the api. - EX: for FTB: Interactions 2.0.2 the id is "86". `https://api.modpacks.ch/public/modpack/5/86` +### Required Variables: -**NOTE** -**Not all FTB packs come with a server.properties file, due to this the server.properties file -may not get updated with the correct ip address and port at first launch. -Please restart the server after first launch to fix this.** +- `FTB_SEARCH_TERM`: The modpack name to search for (minimum 4 characters!) +- `FTB_VERSION_STRING`: The exact version string you want to install -## Neoforged -If you have trouble using an neoforge pack, make sure to select the latest java. +### Examples: + +**FTB Evolution:** +- Search Term: `evolution` +- Version String: `1.22.0` + +**FTB Revelation:** +- Search Term: `revelations` +- Version String: `3.7.0` + +## Method 2 (Safe Approach) - Direct API IDs + +Use this method if you know the exact API IDs. You can find these IDs through the official FTB website in the "Developer/Server Admin" section or by inspecting the API directly. + +### Required Variables: + +- `FTB_MODPACK_ID`: The numeric ID of the modpack in the API +- `FTB_MODPACK_VERSION_ID`: The numeric ID of the specific version + +### Examples: + +**FTB Evolution (ID: 125):** +- Modpack ID: `125` +- Version 1.22.0 ID: `100130` +- API URL: `https://api.feed-the-beast.com/v1/modpacks/public/modpack/125/100130` + +**FTB Revelation (ID: 35):** +- Modpack ID: `35` +- Version 3.7.0 ID: `12180` +- API URL: `https://api.feed-the-beast.com/v1/modpacks/public/modpack/35/12180` + +### Finding API IDs: + +1. Visit the FTB website and navigate to your desired modpack +2. Look for the "Developer/Server Admin" section in the sidebar +3. The modpack ID and version IDs will be listed there +4. Alternatively, you can inspect the API directly at `https://api.feed-the-beast.com/v1/modpacks/public/modpack/{ID}` ## Server Ports -The minecraft server requires a single port for access (default 25565) but plugins may require extra ports to enabled for the server. +The Minecraft server requires a single port for access (default 25565) but plugins may require extra ports to enabled for the server. + +| Port | default | +| ---- | ------- | +| Game | 25565 | + +## Troubleshooting + +### Problem with server.properties + +Not all FTB packs come with a `server.properties` file. This results in the server not being able to set the server-ip and server-port automatically. +If this happens, restart the server once after the first launch to generate a new `server.properties` file. + +### Neoforge + +If you have trouble using a Neoforge modpack, make sure to select the latest Java yolk. + +### Java Version + +The required Java version is also listed on the modpack page under the "Requirements" section. Configure the yolk accordingly. + + +## Credits -| Port | default | -|-------|---------| -| Game | 25565 | +This egg was originally created by [Runemaster580](mailto:runemaster580@gmail.com) and has been modified to improve functionality and implement the new official FTB API. From 09ee150173a04d7d5d1812105ab76a3f6753522f Mon Sep 17 00:00:00 2001 From: MaxPtg Date: Fri, 19 Sep 2025 16:33:41 +0200 Subject: [PATCH 3/4] Update pelican yolks --- java/ftb/egg-ftb-server.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/java/ftb/egg-ftb-server.json b/java/ftb/egg-ftb-server.json index b76a8165..6eb920d5 100644 --- a/java/ftb/egg-ftb-server.json +++ b/java/ftb/egg-ftb-server.json @@ -12,12 +12,12 @@ "tags": [], "features": ["eula", "java_version", "pid_limit"], "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" + "Java 8": "ghcr.io/parkervcp/yolks:java_8", + "Java 11": "ghcr.io/parkervcp/yolks:java_11", + "Java 16": "ghcr.io/parkervcp/yolks:java_16", + "Java 17": "ghcr.io/parkervcp/yolks:java_17", + "Java 18": "ghcr.io/parkervcp/yolks:java_18", + "Java 21": "ghcr.io/parkervcp/yolks:java_21" }, "file_denylist": [], "startup": "java -Xms128M -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true $( [[ ! -f unix_args.txt ]] && printf %s \"-jar start-server.jar\" || printf %s \"@unix_args.txt\" ) nogui", From 7ebb9c2fccc0391f7e064b11c619415e431a092c Mon Sep 17 00:00:00 2001 From: MaxPtg Date: Fri, 19 Sep 2025 18:37:16 +0200 Subject: [PATCH 4/4] Revert author change --- java/ftb/README.md | 4 ---- java/ftb/egg-ftb-server.json | 2 +- java/ftb/egg-pterodactyl-ftb-server.json | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/java/ftb/README.md b/java/ftb/README.md index d428e1ce..9161b36c 100644 --- a/java/ftb/README.md +++ b/java/ftb/README.md @@ -77,7 +77,3 @@ If you have trouble using a Neoforge modpack, make sure to select the latest Jav The required Java version is also listed on the modpack page under the "Requirements" section. Configure the yolk accordingly. - -## Credits - -This egg was originally created by [Runemaster580](mailto:runemaster580@gmail.com) and has been modified to improve functionality and implement the new official FTB API. diff --git a/java/ftb/egg-ftb-server.json b/java/ftb/egg-ftb-server.json index 6eb920d5..19931b6e 100644 --- a/java/ftb/egg-ftb-server.json +++ b/java/ftb/egg-ftb-server.json @@ -6,7 +6,7 @@ }, "exported_at": "2025-09-19T13:34:51+00:00", "name": "FTB", - "author": "m.patecky@cesp-server.de", + "author": "runemaster580@gmail.com", "uuid": "283ef0f7-dae7-4621-8056-9496864727bc", "description": "Deploy FTB modpack servers using the official FTB API. Supports installation by modpack name/version or direct API IDs. See README.md for detailed examples and configuration options.", "tags": [], diff --git a/java/ftb/egg-pterodactyl-ftb-server.json b/java/ftb/egg-pterodactyl-ftb-server.json index b7b7955f..0367622e 100644 --- a/java/ftb/egg-pterodactyl-ftb-server.json +++ b/java/ftb/egg-pterodactyl-ftb-server.json @@ -6,7 +6,7 @@ }, "exported_at": "2025-09-19T13:34:51+00:00", "name": "FTB", - "author": "m.patecky@cesp-server.de", + "author": "runemaster580@gmail.com", "uuid": "283ef0f7-dae7-4621-8056-9496864727bc", "description": "Deploy FTB modpack servers using the official FTB API. Supports installation by modpack name/version or direct API IDs. See README.md for detailed examples and configuration options.", "features": ["eula", "java_version", "pid_limit"],