{
  "meta": {
    "version": "PTDL_v2",
    "update_url": null
  },
  "exported_at": "2026-08-14T17:36:04+00:00",
  "name": "Forge",
  "author": "panel@example.com",
  "description": "Servidor de Minecraft Forge. Forge es una API de modding para Minecraft que facilita la instalación y gestión de mods. Este egg permite configurar un servidor con Forge eligiendo versiones de Minecraft y tipo de compilación.",
  "features": [
    "eula",
    "java_version",
    "pid_limit"
  ],
  "container_version_map": [
    {
      "version": "latest",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.11",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.10",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.9",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.8",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.7",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.6",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.5",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.21",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.20.6",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_21"
    },
    {
      "version": "1.20.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.20.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.20.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.20.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.20",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.19",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.18.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.18.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.18",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_17"
    },
    {
      "version": "1.17.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_16"
    },
    {
      "version": "1.16.5",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.16",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.15.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.15.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.15",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.14.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.14.3",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.14.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.13.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.12.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.12.1",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.12",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.11.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.11",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.10.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.10",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.9.4",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.9",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.8.9",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.8.8",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.8",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.7.10",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    },
    {
      "version": "1.7.2",
      "docker_image": "ghcr.io/pelican-eggs/yolks:java_8"
    }
  ],
  "file_denylist": [],
  "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\" )",
  "config": {
    "files": "{\n    \"server.properties\": {\n        \"parser\": \"properties\",\n        \"find\": {\n            \"server-ip\": \"\",\n            \"server-port\": \"{{server.build.default.port}}\",\n            \"query.port\": \"{{server.build.default.port}}\"\n        }\n    }\n}",
    "startup": "{\"done\":\")! For help, type\"}",
    "logs": "{}",
    "stop": "stop"
  },
  "scripts": {
    "installation": {
      "script": "#!/bin/bash\n# Forge Installation Script\n# Server Files: /mnt/server\n\nset -euo pipefail\n\napt update\napt install -y curl jq\n\nmkdir -p /mnt/server\ncd /mnt/server\n\n# Remove spaces from input values to avoid malformed URLs.\nFORGE_VERSION=\"$(echo \"$FORGE_VERSION\" | tr -d ' ')\"\nMC_VERSION=\"$(echo \"$MC_VERSION\" | tr -d ' ')\"\n\nif [[ -n \"$FORGE_VERSION\" ]]; then\n\tDOWNLOAD_LINK=\"https://maven.minecraftforge.net/net/minecraftforge/forge/${FORGE_VERSION}/forge-${FORGE_VERSION}\"\n\tFORGE_JAR=\"forge-${FORGE_VERSION}*.jar\"\nelse\n\tJSON_DATA=$(curl -sSL https://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json)\n\n\tif [[ \"$MC_VERSION\" == \"latest\" || -z \"$MC_VERSION\" ]]; then\n\t\techo \"Getting latest version of Forge.\"\n\t\tMC_VERSION=$(echo \"$JSON_DATA\" | jq -r '.promos | del(.\"latest-1.7.10\") | del(.\"1.7.10-latest-1.7.10\") | to_entries[] | .key | select(contains(\"latest\")) | split(\"-\")[0]' | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -1)\n\t\tBUILD_TYPE=latest\n\tfi\n\n\tif [[ \"$BUILD_TYPE\" != \"recommended\" && \"$BUILD_TYPE\" != \"latest\" ]]; then\n\t\tBUILD_TYPE=recommended\n\tfi\n\n\techo \"Minecraft version: ${MC_VERSION}\"\n\techo \"Build type: ${BUILD_TYPE}\"\n\n\tFILE_SITE=https://maven.minecraftforge.net/net/minecraftforge/forge/\n\tVERSION_KEY=$(echo \"$JSON_DATA\" | jq -r --arg MC_VERSION \"$MC_VERSION\" --arg BUILD_TYPE \"$BUILD_TYPE\" '.promos | to_entries[] | select(.key | split(\"-\")[0] == $MC_VERSION) | select(.key | contains($BUILD_TYPE)) | .key')\n\n\tif [[ -z \"$VERSION_KEY\" && \"$BUILD_TYPE\" == \"recommended\" ]]; then\n\t\techo \"No recommended build found, falling back to latest.\"\n\t\tVERSION_KEY=$(echo \"$JSON_DATA\" | jq -r --arg MC_VERSION \"$MC_VERSION\" '.promos | del(.\"latest-1.7.10\") | del(.\"1.7.10-latest-1.7.10\") | to_entries[] | .key | select(contains($MC_VERSION)) | select(contains(\"latest\"))')\n\tfi\n\n\tif [[ -z \"$VERSION_KEY\" || \"$VERSION_KEY\" == \"null\" ]]; then\n\t\techo \"Install failed: no valid Forge version found for the requested Minecraft version.\"\n\t\texit 1\n\tfi\n\n\tFORGE_VERSION=$(echo \"$JSON_DATA\" | jq -r --arg VERSION_KEY \"$VERSION_KEY\" '.promos | .[$VERSION_KEY]')\n\n\tif [[ \"$MC_VERSION\" == \"1.7.10\" || \"$MC_VERSION\" == \"1.8.9\" ]]; then\n\t\tDOWNLOAD_LINK=\"${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}/forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}\"\n\t\tFORGE_JAR=\"forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}.jar\"\n\t\tif [[ \"$MC_VERSION\" == \"1.7.10\" ]]; then\n\t\t\tFORGE_JAR=\"forge-${MC_VERSION}-${FORGE_VERSION}-${MC_VERSION}-universal.jar\"\n\t\tfi\n\telse\n\t\tDOWNLOAD_LINK=\"${FILE_SITE}${MC_VERSION}-${FORGE_VERSION}/forge-${MC_VERSION}-${FORGE_VERSION}\"\n\t\tFORGE_JAR=\"forge-${MC_VERSION}-${FORGE_VERSION}.jar\"\n\tfi\nfi\n\nif [[ \"$SERVER_JARFILE\" != *.jar ]]; then\n\tSERVER_JARFILE=\"${SERVER_JARFILE}.jar\"\nfi\n\necho \"Downloading Forge version ${FORGE_VERSION}\"\necho \"Download link is ${DOWNLOAD_LINK}\"\n\nif [[ -z \"${DOWNLOAD_LINK:-}\" ]]; then\n\techo \"No download link provided. Exiting.\"\n\texit 3\nfi\n\nif ! curl --output /dev/null --silent --head --fail \"${DOWNLOAD_LINK}-installer.jar\"; then\n\techo \"Installer jar URL is invalid.\"\n\texit 2\nfi\n\ncurl -sSL -o installer.jar \"${DOWNLOAD_LINK}-installer.jar\"\n\nif [[ ! -f ./installer.jar ]]; then\n\techo \"Error downloading Forge version ${FORGE_VERSION}.\"\n\texit 1\nfi\n\nunix_args() {\n\techo \"Detected Forge 1.17+; setting up unix args symlink.\"\n\tln -sf libraries/net/minecraftforge/forge/*/unix_args.txt unix_args.txt\n}\n\n# Delete args to support downgrading/upgrading\nrm -rf libraries/net/minecraftforge/forge\nrm -f unix_args.txt\n\necho \"Installing Forge server...\"\njava -jar installer.jar --installServer || {\n\techo\n\techo \"Install failed using Forge version ${FORGE_VERSION} and Minecraft version ${MC_VERSION}.\"\n\techo \"If memory is unlimited (0), set explicit install memory limits so the installer can run.\"\n\texit 4\n}\n\nif [[ \"$MC_VERSION\" =~ ^1\\.(17|18|19|20|21|22|23) || \"$FORGE_VERSION\" =~ ^1\\.(17|18|19|20|21|22|23) ]]; then\n\tunix_args\nelif [[ \"$MC_VERSION\" == \"latest\" && \"$FORGE_VERSION\" =~ ^1\\.(17|18|19|20|21|22|23) ]]; then\n\tunix_args\nelse\n\tmv \"$FORGE_JAR\" \"$SERVER_JARFILE\"\nfi\n\necho \"Deleting installer.jar\"\nrm -f installer.jar\necho \"Installation process completed\"\n",
      "container": "ghcr.io/pelican-eggs/installers:java_8",
      "entrypoint": "bash"
    }
  },
  "variables": [
    {
      "name": "Build Type",
      "description": "Tipo de JAR del servidor a descargar desde Forge. Los valores válidos son \"recommended\" y \"latest\".",
      "env_variable": "BUILD_TYPE",
      "default_value": "recommended",
      "user_viewable": false,
      "user_editable": false,
      "rules": "required|string|in:recommended,latest",
      "field_type": "select",
      "source": "user"
    },
    {
      "name": "Minecraft Version",
      "description": "Versión de Minecraft a instalar. Elige una versión compatible con tu entorno de Java.",
      "env_variable": "MC_VERSION",
      "default_value": "latest",
      "user_viewable": true,
      "user_editable": true,
      "rules": "required|string|in:latest,1.21.11,1.21.10,1.21.9,1.21.8,1.21.7,1.21.6,1.21.5,1.21.4,1.21.3,1.21.1,1.21,1.20.6,1.20.4,1.20.3,1.20.2,1.20.1,1.20,1.19.4,1.19.3,1.19.2,1.19.1,1.19,1.18.2,1.18.1,1.18,1.17.1,1.16.5,1.16.4,1.16.3,1.16.2,1.16.1,1.16,1.15.2,1.15.1,1.15,1.14.4,1.14.3,1.14.2,1.13.2,1.12.2,1.12.1,1.12,1.11.2,1.11,1.10.2,1.10,1.9.4,1.9,1.8.9,1.8.8,1.8,1.7.10,1.7.2",
      "field_type": "select",
      "source": "user",
      "defines_version": true
    },
    {
      "name": "Server Jar File",
      "description": "Nombre del archivo JAR usado al ejecutar versiones de Forge anteriores a 1.17.",
      "env_variable": "SERVER_JARFILE",
      "default_value": "server.jar",
      "user_viewable": false,
      "user_editable": false,
      "rules": "required|regex:/^([\\w\\d._-]+)(\\.jar)$/",
      "field_type": "text",
      "source": "user"
    },
    {
      "name": "Forge Version",
      "description": "Versión exacta completa, por ejemplo 1.15.2-31.2.4. Sobrescribe MC_VERSION y BUILD_TYPE.",
      "env_variable": "FORGE_VERSION",
      "default_value": "",
      "user_viewable": true,
      "user_editable": true,
      "rules": "nullable|regex:/^[0-9.\\-]+$/",
      "field_type": "text",
      "source": "user"
    }
  ]
}
