How a Node.js site runs
The panel creates a systemd unit, aurapanel-site-<domain>.service, that starts your application as the site's Linux user on a loopback port, and an nginx server block that proxies the domain to that port with HTTPS. You never write the unit or the server block; you deploy code and the panel starts it.
Node versions are installed under Services → Node Versions from nodejs.org release tarballs into /opt/aurapanel/node/<version>/, with node, npm, npx and corepack available on the PATH. Each site pins a version; change it in the site's settings.
Create the site
- Install a Node version under Services if none is present.
- Sites → Add site → Node.js. Enter the domain, choose the Node version, accept the suggested app port (the next free loopback port) and pick a supervisor: systemd runs your start command directly; PM2 runs it under
pm2-runtimeinside the same unit. - Create. The unit exists but has nothing to run yet, so the site shows the panel's placeholder until you deploy.
Deploy your code
Put the application in the document root, /home/<user>/htdocs/<domain>/, by any means: the File Browser, SFTP, git clone as the site user, rsync from CI. Then either press Install dependencies on the site, or do it from a shell:
sudo -u <site-user> -i
cd ~/htdocs/example.com
npm ci --omit=dev # or pnpm / yarn — the panel detects the lockfile
npm run build # if your app has a build step
exit
sudo systemctl restart aurapanel-site-example.com Install dependencies does the same: it installs with the package manager your lockfile implies (npm, pnpm or yarn), runs the build script if there is one, re-applies the unit and server block, restarts the service and probes it. A tick box does a clean install first.
How the start command is chosen
The command is resolved every time the unit starts, in this order, so the first deploy and every later one are treated the same:
- An explicit start file set in the site's settings.
- The
startscript inpackage.json, run with the detected package manager. - The
mainfield inpackage.json. server.js,index.jsorapp.jsin the document root.
Environment your app receives
| Variable | Value |
|---|---|
PORT | The site's loopback port. Your server must listen on it. The panel's value always wins over one in .env. |
HOST | 127.0.0.1. Never bind to a public address; nginx is the public face. |
NODE_ENV | production |
TZ | The site's time zone, when set. |
PATH | The chosen Node version's bin directory first. |
REDIS_URL, REDIS_HOST, REDIS_PORT, REDIS_KEY_PREFIX | Only when package.json declares a Redis client and Redis is installed. Your app has to read them. |
A .env file in the document root is loaded first, so your own variables go there. PORT and HOST are reserved.
After a restart the domain serves your application over HTTPS. The site's overview shows the service as running; systemctl status aurapanel-site-example.com says the same.
Restarts and crashes
The unit has Restart=always with a 3-second delay that backs off to 5 minutes. If the process fails to start more than five times in a minute, systemd parks it as failed so a crash loop does not consume the server; fix the cause, then restart from the site or with systemctl restart aurapanel-site-<domain>. Stops are given 10 seconds before the process is killed.
Logs
Your application's stdout and stderr go to the journal, shown on the site's Logs tab and available on the server for about seven days:
journalctl -u aurapanel-site-example.com -f nginx's access and error logs for the domain are in /home/<user>/logs/. See Logs and monitoring.
Common messages
"no Node app found in … — deploy code with a package.json `start` script (or a server.js/index.js/app.js entry file), then restart"
The resolver found nothing to run. Add a start script or an entry file in the document root and restart the service.
"no package.json in the document root — upload your app first"
Install dependencies was pressed on an empty site. Deploy the code first.
"node runtime … is not installed at … — install it under Settings → Node Versions before deploying"
The site is pinned to a version that is no longer installed. Install it, or change the site's Node version.
A lockfile warning after Install dependencies
The lockfile did not match package.json; the panel retried once without the strict mode and continued. Regenerate the lockfile locally and commit it.
502 from nginx
The process is not listening on PORT. Check the journal for the crash, and make sure the server reads process.env.PORT rather than a hard-coded port.
Bun is not bundled; use npm, pnpm or yarn.