PanelicaDocs
panelica.com
Docs / App Hosting / Node.js Apps

Node.js Apps

Panelica 1.0.375 Verified 2026-07-23 App Hosting

Panelica runs Node.js apps the grown-up way: every app is a real systemd service running as its owner's Linux user inside their cgroup limits, wired to a domain through an automatically managed Nginx reverse proxy. No PM2, no Docker, no port juggling.

Panel locationNode.js → Applicationshttps://YOUR-SERVER-IP:8443/nodejs/apps
 Node.js Applications
Installed: Node 22 ★ Node 20
api-server Node 22owner: john
https://api.example.com · /home/john/api-server
CPU 3.2% · RAM 84 MB / 256M · Uptime 5d 2h
StopRestartLogsDomainnpm installDelete

The apps page

A strip at the top shows the installed Node versions (the default marked with a star), followed by app cards: status dot (running, errored, stopped), name, Node version, owner, the bound domain or local 127.0.0.1:port address, and live CPU, RAM and uptime with sparkline history. A processes table below lists every app with its port, resource usage and quick kill/start/log actions, and the page ends with a how-it-works walkthrough and a troubleshooting FAQ.

One card detail deserves a highlight: if an app is running but not listening on the port the panel assigned, the card says so. The number one Node hosting mistake (hardcoding a port instead of reading process.env.PORT) is diagnosed for you at a glance.

Creating an app

The deploy form, field by field: owner (ROOT/ADMIN/RESELLER pick one; ROOT can create ownerless system apps), app name, Node version, production/development mode, the app's folder (locked inside the owner's home; only ROOT's system apps may live elsewhere), the code source (a starter scaffold, a public Git repository with branch, or a ZIP upload), the startup file (app.js) or a custom start command (npm run start), an optional domain or subdomain binding, a memory limit (256 MB default) and CPU limit, environment variables as KEY=VALUE lines, and autostart. A run-as-root switch exists for ROOT only. There is no port field: ports are assigned automatically from a private pool.

An Example App button opens the form pre-filled with a ready-made demo (read-only) so one more click on Deploy shows you the whole pipeline working.

Behind the scenes: each app becomes a systemd unit running as the owner's Linux user, attached to that account's cgroup slice with its MemoryMax and CPUQuota, hardened with NoNewPrivileges and a private /tmp, and set to restart automatically (a crash-looping app is parked as "errored" instead of hammering the server). The panel assigns a port from the 21000-21999 pool, points the app at it via PORT and HOST=127.0.0.1, and, when a domain is bound, backs up the domain's existing vhost and replaces it with a WebSocket-ready reverse proxy; a failed nginx test rolls the change back. Unbinding restores the original vhost from the backup. Git clones and npm installs run as the owner too, and after a Git or ZIP deploy the panel runs npm install automatically when the package.json declares dependencies.
Deploy example: point the form at a public GitHub repo with branch main, set the start command to npm run start, bind api.example.com, and give it 512 MB. The panel clones, installs dependencies, starts the service and serves it on the domain over the existing SSL, all in one submit.

Day-two operations: Logs opens a live WebSocket log stream (pause, copy, download, auto-scroll, colorized error/warn lines), Domain rebinds or unbinds without recreating the app, npm install reruns dependency installation, and Files jumps into the app folder in the File Manager. Environment variables and limits are set at creation; to change them, recreate the app (only the domain is editable afterwards).

Node versions

The versions page lists upstream Node releases (LTS and Current channels, majors 18 and up) next to what is installed. Installing downloads the official build from nodejs.org, verifies its SHA-256 checksum, and unpacks it atomically under the panel's isolated services tree; removing a version refuses while apps still use it and names them. The newest installed major automatically serves as the default for new apps.

Panel locationNode.js → Versionshttps://YOUR-SERVER-IP:8443/nodejs/versions

Access

Node.js hosting is a licensed feature (nodejs, Pro plans and up) with granular permissions per operation: viewing, creating, starting, stopping, restarting, deleting, npm, logs, stats, uploads and version management each have their own key, and Git/ZIP deploy buttons appear only with theirs. Role-wise (roles and permissions): a USER sees and manages only their own apps, always under /home/<user>/; ADMIN and RESELLER must pick an owner when creating and see the apps in their chain; only ROOT can leave an app ownerless (a system app) or flip the run-as-root switch. Plans can cap how many Node apps an account may run. App deletion and version removal are the only confirmed dialogs; lifecycle actions apply instantly.

Panelica Documentation · Written and verified against the live panel. · Last verified 2026-07-23 on Panelica 1.0.375