Node.js
Обработчик Node.js запускает ваше приложение (Express, Fastify, Next.js, Nuxt, API-сервер или что угодно ещё, что слушает порт) и передаёт ему запросы к сайту. Среду выполнения Node.js, менеджер процессов PM2, песочницу systemd, HTTPS, проверки защиты и раздачу статических файлов обеспечивает WardPane.
Как всё устроено
посетитель -> WardPane на 80/443 -> проверки защиты -> файл есть в public/? -> отдаётся напрямую
-> иначе -> ваше приложение на 127.0.0.1:<port>
- Каждому сайту Node.js панель назначает свой порт из диапазона от 10000 до 19999. Приложение слушает его на
127.0.0.1, так что снаружи до него можно добраться только через WardPane. - Приложения работают под PM2. У каждого владельца один демон PM2 в юните systemd
wardpane-pm2@<owner>.service, и каждый сайт Node.js этого владельца работает в нём отдельным приложением PM2. - Приложение работает от имени владельца сайта (по умолчанию
www-root) внутри песочницы systemd.
Структура папок
Папка сайта и есть папка приложения. Положите туда package.json рядом с папкой public/:
/var/www/www-root/data/www/example.com/
package.json
package-lock.json
server.js
node_modules/
public/ отдаются напрямую как файлы
favicon.ico
css/app.css
Напрямую WardPane отдаёт только файлы из public/. Ваш код, node_modules и файлы .env лежат в папке сайта, и скачать их посетитель не может.
У сайта, созданного до версии 2.0, папка приложения находится в /var/www/<domain>, а package.json лежит рядом с её public/.
Настройка приложения
- Создайте сайт с обработчиком Node.js (или переключите существующий сайт на его вкладке Обработчик). В окне создания можно сразу выбрать версию Node.js.
- Загрузите приложение в папку сайта по SFTP или через
git cloneиз терминала. - На вкладке Обработчик выберите, как запускается приложение, и добавьте переменные окружения.
- Нажмите Сохранить изменения. Панель назначит порт, при необходимости скачает Node.js и запустит приложение.
- Нажмите npm install, чтобы установить зависимости, затем Перезапустить.
Карточка «Приложение Node.js» вверху вкладки Обработчик показывает состояние приложения (работает, остановлено, сбой, запускается), точную версию Node.js и порт.
Настройки
Все они находятся на вкладке Обработчик сайта.
Версия Node.js
Выберите мажорную версию Node.js. WardPane 2.0 предлагает 20, 22, 24 и 26; новые сайты получают 24. Поддержка Node.js 20 закончилась в апреле 2026 года, поэтому для новых приложений берите 22 или новее.
Свежий выпуск выбранной ветки скачивается, когда он впервые понадобится какому-то сайту, см. Среды выполнения. Ветка задаётся для каждого сайта отдельно, так что два приложения одного владельца могут работать на разных версиях Node.js.
Команда запуска
Запустить приложение можно двумя способами:
- Скрипт npm: скрипт из
package.json, напримерstart. Нажмите Прочитать package.json, чтобы увидеть скрипты приложения и выбрать один. - Файл запуска: файл JavaScript, который запускает сервер, например
server.js, путь относительно папки сайта. Подходят файлы.js,.mjsи.cjs.
Переменные окружения
Можно добавить до 20 переменных. Имена состоят из букв, цифр и _ и начинаются с буквы или _; значение может быть длиной до 4096 символов.
Некоторые переменные панель задаёт сама:
| Переменная | Значение |
|---|---|
PORT |
Порт, который панель назначила сайту. Ваше приложение должно слушать его. |
HOST |
127.0.0.1. Ваше приложение должно слушать этот адрес. |
NODE_ENV |
production, если вы не задали другое значение. |
PORT, HOST, PATH, HOME и PM2_HOME переопределить нельзя. Панель хранит значения открытым текстом, и прочитать их может любой, у кого есть доступ к настройкам сайта.
Порт
Панель назначает порт, когда сайт впервые становится сайтом Node.js. Ни у одного другого сайта такого порта не будет, и он не меняется, даже если переключить сайт на другой обработчик и обратно. Поле доступно только для чтения.
Отдавать файлы из public/ напрямую
По умолчанию включено. Файлы, которые есть в public/, отдаёт сам WardPane (с ETag и докачкой, как на статическом сайте), а всё остальное уходит в приложение. Выключите, если приложение должно видеть каждый запрос, включая запросы к статическим файлам.
Ограничения
| Настройка | По умолчанию | Диапазон |
|---|---|---|
| Лимит памяти, МБ | 512 | от 64 до 16384 |
| Лимит CPU, % | 100 (одно ядро) | от 10 до 800 |
Когда приложение выходит за лимит памяти, PM2 его перезапускает. Юниту PM2 владельца systemd выставляет лимит памяти и квоту CPU, равные сумме лимитов его приложений (плюс немного для самого PM2).
Запретить исходящие соединения
С этой настройкой приложение может обращаться только к этому серверу. Запросы к внешним API, отправка почты и скачивание работать не будут. Все приложения Node.js одного владельца работают в одном демоне PM2, поэтому запрет действует, только когда он включён у всех приложений Node.js этого владельца.
PM2 из терминала
PM2 хранит своё состояние в домашней папке владельца (/var/www/<owner>/data/.pm2), поэтому обычные команды работают из терминала этого владельца, например в терминале в браузере:
pm2 list # приложения владельца, названные по их доменам
pm2 restart example.com # перезапустить одно приложение
pm2 logs example.com # следить за его выводом
Версию, команду запуска, окружение и лимиты меняйте в панели. Панель собирает конфигурацию PM2 заново из своих настроек и затрёт правки, сделанные вручную.
Прокси
Запросы, которые не отдаются из public/, уходят на http://127.0.0.1:<port>:
- Сначала они проходят все проверки защиты сайта (Bot Fight, гео, лимиты запросов, обязательные параметры ссылки, пароль сайта), в том же месте, где сайт на PHP передал бы запрос в PHP.
- Тела запросов и ответов передаются потоком.
X-Forwarded-For,X-Real-IP,X-Forwarded-ProtoиX-Forwarded-Hostпередают настоящий адрес посетителя, схему и хост, в том числе за Cloudflare. Если клиент сам присылает эти заголовки (илиForwarded), они отбрасываются. В Express включите доверие к локальному прокси черезapp.set('trust proxy', 'loopback'), и IP посетителя окажется вreq.ip.- WebSocket работают. Запрос на upgrade проходит те же проверки защиты, что и любой другой запрос, прежде чем дойти до приложения.
- Hop-by-hop заголовки удаляются, а
X-Powered-Byубирается из ответов приложения. - Если приложение упало или не слушает свой порт, посетители видят простую страницу 502 Bad Gateway без сведений о сервере. Если приложение не начало отвечать за 2 минуты, ответ будет 504. Причина попадает в журнал панели не чаще раза в минуту на сайт.
- Тела запросов до 100 МБ передаются приложению; на запросы крупнее приходит 413.
Перезапуск и npm install
В карточке «Приложение Node.js» две кнопки:
- Перезапустить перезапускает приложение в PM2.
- npm install ставит зависимости:
npm ci, если в папке естьpackage-lock.json, иначеnpm install. Команда выполняется от имени владельца, в песочнице, с версией Node.js этого сайта и прерывается через 10 минут. Вывод попадает вnpm-install.logсайта.
Журналы
Карточка Журналы на вкладке Обработчик показывает три файла: Вывод (node-out.log), Ошибки (node-error.log) и npm install (npm-install.log).
| Структура | Где журналы |
|---|---|
| Новые сайты (2.0) | /var/www/<owner>/data/logs/<domain>-node-out.log, <domain>-node-error.log, <domain>-npm-install.log |
| Сайты до версии 2.0 | /var/www/<domain>/logs/node-out.log, node-error.log, npm-install.log |
Среды выполнения и безопасность
- Сборки Node.js скачиваются с
https://nodejs.org/dist/(linux-x64 или linux-arm64) и перед распаковкой сверяются с опубликованнымSHASUMS256.txt. Хранятся они в/opt/wardpane-runtimes. Версию, которой больше не пользуется ни один сайт, панель удаляет. - PM2 ставит
install.sh, версия зафиксирована. - Код из среды выполнения никогда не запускается от root. Root-помощник только скачивает и распаковывает её, а приложения и
npmработают от имени владельца. - Юнит PM2 работает в песочнице systemd: система доступна только для чтения, записывать можно только в папки владельца, новые привилегии запрещены,
/tmpсвой.
Развёртывание приложения на Express
-
Создайте сайт
api.example.comс обработчиком Node.js и версией 24. Сначала направьте его DNS на сервер, тогда сертификат выпустится сразу. -
В приложении слушайте порт и адрес, которые даёт панель:
const express = require('express'); const app = express(); app.set('trust proxy', 'loopback'); app.get('/api/hello', (req, res) => res.json({ hello: req.ip })); app.listen(process.env.PORT, process.env.HOST); -
Добавьте скрипт запуска в
package.json:{ "name": "api", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.21.0" } } -
Загрузите
package.json,package-lock.json,server.jsи папкуpublic/в папку сайта (для владельца по умолчанию:/var/www/www-root/data/www/api.example.com). -
На вкладке Обработчик выберите Скрипт npm и
start(или нажмите Прочитать package.json и выберите его), затем Сохранить изменения. -
Нажмите npm install и дождитесь завершения (следите за журналом npm install).
-
Нажмите Перезапустить. Карточка состояния должна показать, что приложение работает; откройте
https://api.example.com/api/hello.
Если сайт показывает 502, загляните в журнал Ошибки. Чаще всего не хватает зависимости, в скрипте запуска опечатка или приложение слушает фиксированный порт вместо PORT.