Skip to content

[Bug]: Uptime Kuma egg uses unsupported Node.js 18 and outdated startup detection #95

Description

@drakonash

Panel Version

1.12.4

Wings Version

v1.12.3

Service

uptime-kuma

Modified

Yes, I modified the egg (will provide details below)

Expected Behavior

The Uptime Kuma egg should install and run using a supported Node.js version for Uptime Kuma v2.

For Uptime Kuma v2, the runtime should use Node.js >= 20.4.0. The egg should also correctly detect when Uptime Kuma has finished starting and mark the server as running in Pterodactyl.

Actual Behavior

The current Uptime Kuma egg uses an outdated Node.js 18 based environment.

With Uptime Kuma v2, npm reports unsupported engine warnings because Uptime Kuma requires Node.js >= 20.4.0. The server may still start, but it is running on an unsupported Node.js version.

The current startup done string also appears to be unreliable:

{
  "done": "[SERVER] INFO: Listening on "
}

In my logs, Uptime Kuma outputs:

[SERVER] INFO: Listening on:

Because of this, Pterodactyl can keep the server in the orange “starting” state even though Uptime Kuma is already working correctly.

Steps To Reproduce

  1. Create or reinstall a server using the current Uptime Kuma egg.
  2. Start the server.
  3. Check the console logs.
  4. Notice that the egg runs with Node.js 18 while Uptime Kuma v2 requires Node.js >= 20.4.0.
  5. Notice that Pterodactyl may not detect startup completion correctly with the current done string.

Proposed updated egg

I also send the modified egg that I tested successfully on my Pterodactyl instance.

{
    "_comment": "UPDATED: Uptime Kuma egg adjusted for Node.js 20, Uptime Kuma 2.4.0 and reliable startup detection.",
    "meta": {
        "update_url": null,
        "version": "PTDL_v2"
    },
    "exported_at": "2026-06-03T21:03:35+00:00",
    "name": "Uptime Kuma",
    "author": "eggs@goover.dev",
    "description": "Uptime Kuma is an easy-to-use self-hosted monitoring tool.",
    "features": null,
    "docker_images": {
        "Nodejs 20": "ghcr.io/ptero-eggs/yolks:nodejs_20",
        "Nodejs 22": "ghcr.io/ptero-eggs/yolks:nodejs_22"
    },
    "file_denylist": [],
    "startup": "if [[ -d .git ]] && [[ {{AUTO_UPDATE}} == \"1\" ]]; then git fetch --all --tags --force && git checkout \"{{UPTIME_KUMA_VERSION}}\" && npm ci --omit=dev --no-audit && npm run download-dist; fi; /usr/local/bin/node /home/container/server/server.js --port={{SERVER_PORT}}",
    "config": {
        "files": "{}",
        "logs": "{}",
        "startup": "{\n    \"done\": \"Listening on:\"\n}",
        "stop": "^^C"
    },
    "scripts": {
        "installation": {
            "container": "node:20-trixie-slim",
            "entrypoint": "bash",
            "script": "#!/bin/bash\n# Uptime Kuma App Installation Script\n#\n# Server Files: /mnt/server\nset -e\n\napt update\napt install -y git curl jq file unzip make gcc g++ python3 python3-dev python3-pip libtool ca-certificates\nrm -rf /var/lib/apt/lists/*\n\necho -e \"Updating npm to latest....\\n\"\nnpm install -g npm@latest\n\nmkdir -p /mnt/server\ncd /mnt/server\ngit config --global --add safe.directory /mnt/server\n\nif [ -z \"${GIT_ADDRESS}\" ]; then\n    GIT_ADDRESS=\"https://github.com/louislam/uptime-kuma\"\nfi\n\nif [ -z \"${UPTIME_KUMA_VERSION}\" ]; then\n    UPTIME_KUMA_VERSION=\"2.4.0\"\nfi\n\nif [ -d .git ]; then\n    echo -e \"Updating Uptime Kuma source....\\n\"\n    git remote set-url origin \"${GIT_ADDRESS}\"\n    git fetch --all --tags --force\nelse\n    echo -e \"Downloading and installing Uptime Kuma....\\n\"\n    git clone \"${GIT_ADDRESS}\" .\n    git fetch --all --tags --force\nfi\n\necho -e \"Checking out Uptime Kuma ${UPTIME_KUMA_VERSION}....\\n\"\ngit checkout \"${UPTIME_KUMA_VERSION}\"\n\necho -e \"Installing dependencies....\\n\"\nrm -rf node_modules\nnpm cache verify\nnpm ci --omit=dev --no-audit\nnpm run download-dist\n\nmkdir -p /mnt/server/data\n\nif [ ! -f \"/mnt/server/data/kuma.db\" ] && [ -f \"/mnt/server/db/kuma.db\" ]; then\n    cp /mnt/server/db/kuma.db /mnt/server/data/kuma.db\nfi\n\necho -e \"-----------------------------------------\"\necho -e \"Installation completed...\"\necho -e \"Uptime Kuma version: ${UPTIME_KUMA_VERSION}\"\necho -e \"-----------------------------------------\"\nexit 0\n"
        }
    },
    "variables": [
        {
            "name": "Git Repo Address",
            "description": "GitHub repository to clone.",
            "env_variable": "GIT_ADDRESS",
            "default_value": "https://github.com/louislam/uptime-kuma",
            "user_viewable": false,
            "user_editable": false,
            "rules": "nullable|string",
            "field_type": "text"
        },
        {
            "name": "JS file",
            "description": "The file that starts the app",
            "env_variable": "JS_FILE",
            "default_value": "server/server.js",
            "user_viewable": false,
            "user_editable": false,
            "rules": "required|string",
            "field_type": "text"
        },
        {
            "name": "Auto Update",
            "description": "If enabled, the server will fetch the selected Uptime Kuma tag and reinstall dependencies on startup.",
            "env_variable": "AUTO_UPDATE",
            "default_value": "1",
            "user_viewable": true,
            "user_editable": true,
            "rules": "required|boolean",
            "field_type": "text"
        },
        {
            "name": "Uptime Kuma Version",
            "description": "Uptime Kuma git tag to install/update. Example: 2.4.0",
            "env_variable": "UPTIME_KUMA_VERSION",
            "default_value": "2.4.0",
            "user_viewable": true,
            "user_editable": true,
            "rules": "required|string",
            "field_type": "text"
        }
    ]
}

Main changes in the attached egg:

  • Runtime image changed to ghcr.io/ptero-eggs/yolks:nodejs_22
  • Installation container changed away from node:18-alpine
  • Uptime Kuma version updated to 2.4.0
  • Startup done string changed to:
{
  "done": "Listening on:"
}

With this modified egg, the server starts successfully with:

Node.js Version: v22.22.3
Uptime Kuma Version: 2.4.0
[SERVER] INFO: Connected to the database
[SERVER] INFO: Listening on:
container@pterodactyl~ Server marked as running...

The original egg I used was still using node:18-alpine for installation and had the startup done string set to [SERVER] INFO: Listening on , while the tested updated egg runs correctly with Node.js 22 and Uptime Kuma 2.4.0.

After this change, the server starts correctly and Pterodactyl marks it as running.

Install logs

https://ptero.co/dz73bi

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions