Node.js and Python apps
Run an Express, Next.js, Nuxt, Flask, Django or FastAPI site on a domain. The app runs in the background as the hosting account. It restarts when it crashes and when the server boots. nginx passes the domain's visitors to it over HTTPS, with websockets.
reqad app on the command line, and the REST API. An app serves a whole domain: the main domain of an account or one of its addon domains. Apps need nginx in front.deployments=1 in /usr/local/reqad/etc/server-software.ini; the Deployments page then appears under Accounts & Domains. While it is off, apps that already run keep running, but the page, reqad deploy, reqad app, their API endpoints and push webhooks are turned off.Runtimes
Install the versions your apps need under Runtimes on the Deployments page, or with reqad app runtime install. Every app on the server can use them.
| Runtime | Where it comes from |
|---|---|
| Node.js | The official Linux build of a major version (22, 24, ...), downloaded from nodejs.org and checked against its published SHA-256 checksums before it is installed, into /opt/reqad/node/<major>. Several majors can be installed side by side. Update moves a major to its latest release and restarts the apps that use it. |
| Python | Python 3.11 or 3.12 from the operating system's packages, updated with the rest of the system. Each app has its own virtualenv (.venv) in its folder. |
Creating an app
- New deployment (or Settings of a site already there): choose the site, set Runtime to Node.js or Python, and give the start command. Start from: Node.js app / Python app fills in a typical setup with Git; switch Code from Git off to upload the files yourself.
- The app must listen on
127.0.0.1and the port in thePORTenvironment variable (HOSTis set too). Each app gets its own port. - Put the code in the app folder:
- for a site deployed from Git, the deployment's current release;
- otherwise
~/apps/<domain>/app, uploaded over SFTP; - or any folder of the account you choose.
From then on every request to the domain goes to the app, and PHP is off for that domain. When you remove the app, the domain serves its document root with PHP again. The app's files are kept.
Serve files from the document root first: nginx answers requests for files that exist in the document root itself, without asking the app. Use it for a built public folder such as public or dist. Do not use it when the document root holds the app's source code.
With Git deployments
An app and a Git deployment on the same domain work together:
- The build commands run with the app's Node.js or Python first in
PATH. For example:npm ci+npm run build, orpython -m venv .venv+.venv/bin/pip install -r requirements.txt. - After the switch the app restarts on the new release.
- If the app does not start, or does not listen on its port within 30 seconds, the deploy goes back to the previous release and restarts the app there.
# a Flask site from Git
reqad deploy create shop.example.com --repo=git@github.com:you/shop.git \
--build="python -m venv .venv
.venv/bin/pip install -r requirements.txt"
reqad app create shop.example.com --runtime=python:3.12 \
--start='.venv/bin/gunicorn -w 2 -b 127.0.0.1:$PORT app:app' --no-start
reqad deploy run shop.example.com --waitEnvironment
Environment edits the app's variables, one KEY=value per line: database passwords, API keys, NODE_ENV. They are kept in ~/apps/<domain>/app.env, readable only by the account, and saving restarts the app. Node.js apps start with NODE_ENV=production. In Python apps, .venv/bin of the app folder comes first in PATH.
Limits and isolation
- The app runs as the hosting account, in its own service (
reqad-app-<id>), with a memory limit you choose (512 MB by default), one CPU and 256 processes. - It sees only its own account's home folder. Other accounts' homes and the panel's files are hidden from it, and the system folders are read-only.
- Its port is reachable only by its own account and the web server. Other accounts on the server cannot connect to it and bypass nginx.
- A crash restarts it after 3 seconds. If it crashes 5 times within 2 minutes it stays stopped, the site shows a "Temporarily unavailable" page, and the dashboard's Needs attention card says so.
Running apps
The Deployments page shows each app's state: running, not listening (the process runs but nothing answers on its port), stopped or failed. It also shows the memory used and the number of restarts. App log shows what the app printed, newest last. Stop keeps the app from starting again at boot, until you press Start.
On the command line
reqad app runtimes --available # Node.js majors you can install reqad app runtime install node 24 reqad app runtime install python 3.12 reqad app create api.example.com --runtime=node:24 --start="node server.js" reqad app list reqad app logs api.example.com --lines=200 reqad app env api.example.com --file=production.env reqad app restart api.example.com reqad app delete api.example.com
See Command line (CLI) for every option.
Need a hand? Create a free account or contact us.