Приложению на Node.js нужен сервер, где можно держать постоянно работающий процесс и самому решать, какой порт он слушает. Такие условия даёт только виртуальный сервер (VPS) — арендованная часть физической машины с полным доступом к системе; в каталоге это раздел VPS для сайтов и приложений. Обычный виртуальный хостинг для этого не годится по самому своему устройству, и ниже разберём почему.
Материал для тех, кто написал первый сервис на Express, Fastify или Telegraf и упёрся в вопрос, куда его положить. Разберём, сколько памяти реально ест приложение, что такое процесс-менеджер и обратный прокси, сколько стоит подходящий сервер и как запустить проект на чистой Ubuntu по шагам.
Чем приложение на Node.js отличается от сайта на PHP
Сайт на PHP живёт короткими вспышками. Пришёл запрос — веб-сервер запустил интерпретатор, тот собрал HTML, отдал его и умер. Между запросами на сервере не крутится ничего, что относится к вашему сайту.
Node.js устроен наоборот. Вы запускаете процесс командой node app.js, и он живёт непрерывно: сам слушает TCP-порт (номер «двери», через которую в сервер стучатся запросы), сам держит соединения, сам хранит состояние в оперативной памяти. Если процесс убить — сайт перестаёт отвечать целиком, а не «одна страница отвалилась».
Отсюда три следствия, которые определяют выбор площадки. Приложению нужно право открыть порт. Нужен кто-то, кто перезапустит процесс после падения или перезагрузки машины. И нужна гарантированная оперативная память, потому что процесс держит её всё время, а не по секунде на запрос. Термины разбираются в глоссарии — например, хостинг с поддержкой Node.js.
Почему виртуальный хостинг не запускает Node.js
На виртуальном хостинге вы получаете папку на общей машине и настроенный владельцем веб-сервер. Ваш код там — это файлы, которые кто-то другой исполняет по запросу. Собственный долгоживущий процесс в такую схему не вписывается: панель не даёт запустить его вручную, а если он и стартует, сторожевой скрипт провайдера (watchdog) прибьёт его через несколько минут как «зависший».
Вторая преграда — порты. Наружу с общего сервера смотрят только 80/TCP и 443/TCP, и они заняты общим Nginx или Apache, который обслуживает сотни чужих сайтов. Открыть свой порт 3000/TCP вам не дадут: это дырка в общей изоляции.
Некоторые провайдеры продают «хостинг с Node.js», но под этим обычно понимают Passenger или похожий менеджер: он запускает приложение по своим правилам, с ограничением по памяти в 256–512 МБ и без доступа к системным службам. WebSocket-соединения там часто рвутся по таймауту — что это такое, объясняет статья про WebSocket. Разница между схемами подробно разобрана в сравнении виртуального хостинга и VPS.

Сколько памяти и ядер нужно приложению
Главный ресурс для Node.js — оперативная память. Один процесс V8 (движок, на котором работает Node.js) в покое занимает примерно 40–70 МБ, дальше всё зависит от того, что вы в него положили: кеши, очереди, буферы загружаемых файлов.
Ориентир по практике такой. Голому API на Express хватает 512 МБ. Как только на том же сервере появляется база данных и сборка фронтенда, планка поднимается до 2 ГБ. Процессор при этом почти не нужен: одно ядро держит десятки запросов в секунду, потому что Node.js обрабатывает их в одном потоке и не тратит время на ожидание. Что именно измеряется в гигабайтах, поясняет справка про оперативную память.
| Что запускаете | Память | Ядра | Диск |
|---|---|---|---|
| Telegram-бот, небольшой webhook-приёмник | 512 МБ | 1 | 10 ГБ |
| API на Express без фронтенда | 512 МБ–1 ГБ | 1 | 10 ГБ |
| Приложение + PostgreSQL на той же машине | 2 ГБ | 1–2 | 20 ГБ |
| Next.js со сборкой прямо на сервере | 2 ГБ и выше | 2 | 30 ГБ |
| Два-три сервиса под PM2 плюс Redis | 4 ГБ | 2 | 40 ГБ |
Сколько стоит VPS под Node.js
В каталоге раздела 44 провайдера, и стартовые тарифы у них расходятся почти в десять раз. Нижняя граница — 59 ₽/мес, у крупных площадок стартовый тариф доходит до 600 ₽/мес за формально ту же конфигурацию. Разница — в качестве дисков, скорости ядра и в том, сколько соседей сидит на одной физической машине.
Для первого проекта разумно смотреть на связку «1 ядро, 1–2 ГБ памяти, NVMe-диск». Подборка стартовых предложений собрана в разделе недорогих VPS, а конфигурации с запасом по памяти — в серверах с преднастроенным Nginx.
| Провайдер | Цена от | Стартовая конфигурация | Тарифов |
|---|---|---|---|
| Cloudcore | 59 ₽/мес | 1 ядро, 1 ГБ, 10 ГБ NVMe | 12 |
| Hosting-Russia | 99 ₽/мес | стартовый VPS | — |
| HostVDS | 127 ₽/мес | 1 ядро, 1 ГБ, 10 ГБ NVMe | 12 |
| RuVDS | 139 ₽/мес | 1 ядро, 0,5 ГБ, 10 ГБ HDD | 440 |
| 4VPS | 150 ₽/мес | 1 ядро, 1 ГБ, 10 ГБ NVMe | 487 |
| Selectel | 200 ₽/мес | 1 ядро, 1 ГБ, 10 ГБ NVMe | 69 |
| Aéza | 593 ₽/мес | 1 ядро, 2 ГБ, 30 ГБ NVMe | 151 |
Данные проверены 04.09.2026.
На тарифе с 0,5 ГБ памяти Node.js стартует, но сборка проекта на нём почти наверняка упадёт. Если бюджет позволяет только такой вариант, собирайте фронтенд на своём компьютере и заливайте на сервер готовые файлы.
Процесс-менеджер: PM2 или systemd
Запустить приложение командой node app.js в терминале можно, но при закрытии SSH-сессии процесс умрёт вместе с ней. Нужен процесс-менеджер — программа, которая держит ваш сервис живым: стартует его при загрузке машины и поднимает заново после падения.
Выбор сводится к двум вариантам. PM2 — утилита из мира Node.js, ставится через npm, умеет запускать несколько копий приложения на разных ядрах и показывать потребление памяти командой pm2 monit. systemd — штатный менеджер служб Linux, он уже стоит в системе и ничего дополнительно есть не будет.
| Критерий | PM2 | systemd |
|---|---|---|
| Установка | npm i -g pm2 |
уже в системе |
| Расход памяти самим менеджером | около 40 МБ | 0 МБ дополнительно |
| Перезапуск по лимиту памяти | есть, флаг --max-memory-restart |
через MemoryMax |
| Просмотр логов | pm2 logs |
journalctl -u имя |
| Кому подойдёт | первый проект, несколько сервисов | один сервис, минимум лишнего |
Для старта проще PM2: одна команда pm2 start app.js и одна pm2 startup, чтобы приложение поднималось после перезагрузки сервера. На машине с 512 МБ памяти сорок мегабайт под сам менеджер уже заметны — там честнее systemd.
Nginx перед приложением: порт, SSL и статика
Отдавать приложение наружу напрямую с порта 3000 неудобно и небезопасно. Стандартная схема — поставить перед ним Nginx в роли обратного прокси: он принимает запросы на портах 80/TCP и 443/TCP, а внутрь машины передаёт их вашему процессу на localhost (это адрес «сам себе», доступный только изнутри сервера). Механика описана в справке про обратный прокси.
Такая прослойка снимает с Node.js сразу три задачи. Nginx завершает на себе HTTPS-шифрование, отдаёт картинки, шрифты и собранные JS-файлы напрямую с диска и держит медленных клиентов, не занимая ими единственный рабочий поток приложения. Раздача статики через Nginx экономит десятки мегабайт памяти на буферах.
Минимальный конфиг умещается в одну секцию: слушаем порт 443/TCP, ставим proxy_pass http://127.0.0.1:3000; и обязательно добавляем заголовки Upgrade и Connection, иначе WebSocket-соединения работать не будут. Пошаговая настройка с готовыми файлами разобрана в гайде по настройке Nginx.
Сборка фронтенда съедает память пиками
Самая частая причина падений на маленьком сервере — не рабочая нагрузка, а сборка. Webpack, Vite или встроенный сборщик Next.js на несколько минут разворачивают в памяти дерево модулей целиком, и потребление подскакивает в три-четыре раза относительно обычной работы приложения.
Выглядит это так: на 1 ГБ памяти сервис месяцами держит 200 МБ, а первая же команда npm run build упирается в потолок, ядро Linux убивает процесс и в логах остаётся строка про OOM killer. Приложение при этом тоже перезапускается, потому что памяти не хватило всей машине.
Лечится это тремя способами. Первый и самый дешёвый — включить файл подкачки на 2 ГБ, тогда пик уйдёт на диск и сборка доедет до конца, пусть и медленнее; что это за механизм, объясняет статья про swap. Второй — собирать проект на своём компьютере и отправлять на сервер готовую папку. Третий — взять тариф с 2 ГБ памяти сразу.

Запуск приложения на чистой Ubuntu по шагам
Дальше — рабочая последовательность для свежего сервера с Ubuntu 24.04. Она рассчитана на один сервис, который слушает порт 3000/TCP и должен открываться по домену с сертификатом. Все команды выполняются от пользователя с правами sudo — то есть с возможностью выполнять административные действия.
Перед началом убедитесь, что у вас на руках IP-адрес машины и пароль или SSH-ключ от неё — провайдер присылает их письмом через 1–3 минуты после оплаты. Домен лучше направить на этот IP заранее: A-запись — строка в настройках домена, которая связывает имя сайта с IP-адресом, — расходится по DNS-серверам от 15 минут до нескольких часов, и ждать её на седьмом шаге обидно.
- Подключитесь по SSH и обновите пакеты:
apt update && apt upgrade -y— это подтянет свежие версии и закроет известные уязвимости. - Поставьте Node.js LTS-версии из официального репозитория NodeSource. LTS означает долгую поддержку: такие версии получают исправления около 30 месяцев.
- Создайте отдельного пользователя для приложения командой
adduser --system app, чтобы код не работал от root. - Залейте проект и выполните
npm ci --omit=dev— установятся только рабочие зависимости, без инструментов разработчика. - Запустите сервис под процесс-менеджером и закрепите автозапуск:
pm2 start app.js --name api, затемpm2 saveиpm2 startup. - Настройте Nginx на проксирование с порта 443/TCP на
127.0.0.1:3000и закройте порт 3000/TCP снаружи в файрволе — программе, которая решает, какие порты видны из интернета. - Выпустите бесплатный сертификат Let’s Encrypt — он действует 90 дней и продлевается автоматически; порядок описан в гайде про установку SSL от Let’s Encrypt.
На всё уходит около 30–40 минут, если домен уже направлен A-записью на IP сервера. Проверить результат просто: остановите процесс командой pm2 stop api, убедитесь, что сайт отдаёт ошибку 502 (Nginx не достучался до приложения), и запустите обратно.
База данных: на том же сервере или отдельно
Пока проект маленький, PostgreSQL или MySQL спокойно живут рядом с приложением. Экономия очевидна: один сервер вместо двух и нулевая задержка между кодом и базой, потому что запросы идут через localhost.
Считать память при этом надо на двоих. PostgreSQL со стандартными настройками резервирует около 128 МБ под общие буферы плюс по 4 МБ на соединение. На машине с 1 ГБ памяти после этого приложению остаётся немного, и первая же тяжёлая выборка положит обоих.
Разносить базу на отдельный сервер стоит, когда данные важнее скорости разработки: так падение приложения не тянет за собой СУБД, а бэкап базы делается независимо от кода. Ориентир для разделения — 4 ГБ памяти или момент, когда база перевалила за 5 ГБ на диске.
Логи и мониторинг: как понять, что приложение упало
Node.js по умолчанию пишет всё в стандартный вывод, и без процесс-менеджера эти строки просто исчезают. PM2 складывает их в файлы в домашней папке, systemd — в общий журнал, откуда они достаются командой journalctl -u api -n 200, показывающей последние 200 строк.
Логи растут быстро: болтливое приложение легко пишет 100–300 МБ в месяц и однажды забивает диск целиком. Ротация решает вопрос — модуль pm2-logrotate режет файлы по 10 МБ и хранит последние семь штук.
Отдельно стоит следить за памятью и живостью процесса. Команда ps и её разбор есть в материале про просмотр процессов в Linux, а внешняя проверка по HTTP каждые 60 секунд сообщит о падении раньше, чем это заметят пользователи.
Частые ошибки
Большинство проблем на первом сервере повторяются от проекта к проекту и стоят нескольких часов отладки. Объединяет их одно: приложение работает у автора на ноутбуке и отказывается работать на сервере, хотя код тот же самый.
Проверять список стоит сразу после первого запуска, пока проектом никто не пользуется. Половина пунктов чинится одной командой, а вторая половина через месяц обернётся ночным восстановлением из бэкапа, которого нет.
- Запуск через
node app.jsв SSH-сессии без процесс-менеджера: сервис умирает, как только закрывается терминал. - Приложение слушает
0.0.0.0:3000при открытом файрволе — порт торчит наружу в обход Nginx и HTTPS. - Работа от root: любая уязвимость в зависимостях сразу даёт полный доступ к машине.
- Пароли и токены прямо в коде вместо переменных окружения (настроек, которые задаются рядом с приложением, а не внутри него) — они утекают вместе с репозиторием.
- Тариф с 0,5 ГБ памяти под проект со сборкой: сборка падает из-за нехватки памяти, а причину ищут в коде.
- Отсутствие бэкапа базы: диск виртуального сервера ломается редко, но восстанавливать нечего.
Частые вопросы
Можно ли запустить Node.js на обычном виртуальном хостинге? В большинстве случаев нет: там нельзя держать свой долгоживущий процесс и открывать порты. Некоторые провайдеры дают ограниченный режим через Passenger с лимитом 256–512 МБ, но WebSocket и фоновые задачи в нём работают ненадёжно.
Сколько памяти взять под первый проект? Для бота или небольшого API достаточно 512 МБ, для приложения с базой данных или сборкой фронтенда берите 2 ГБ. Разница в цене между этими тарифами обычно 100–200 ₽/мес, а нервов экономит заметно больше.
PM2 или systemd — что выбрать новичку? PM2 проще: две команды, и приложение уже перезапускается после падения и перезагрузки. Он сам занимает около 40 МБ памяти, поэтому на тарифе с 512 МБ логичнее описать сервис в systemd.
Обязательно ли ставить Nginx перед приложением? Технически нет, Node.js умеет слушать порт 443/TCP сам. Но тогда на нём же оказываются SSL, раздача статики и защита от медленных клиентов, а перевыпуск сертификата придётся встраивать в код.
Почему приложение падает во время npm run build? Сборщик разворачивает в памяти всё дерево модулей и даёт пик в три-четыре раза выше обычного потребления. Включите файл подкачки на 2 ГБ или собирайте проект локально и заливайте готовые файлы.
Нужен ли отдельный сервер под базу данных? На старте нет: PostgreSQL рядом с приложением работает быстрее за счёт localhost. Разносить стоит от 4 ГБ памяти или когда база выросла за 5 ГБ и её бэкап начал мешать работе приложения.
Что дешевле — VPS в России или за рубежом? Стартовые цены сопоставимы: 59–200 ₽/мес и там, и там. Для проекта с российской аудиторией выбирайте площадку в Москве или Санкт-Петербурге, разница в задержке между российским и европейским дата-центром составляет 25–45 мс.
Итог
Node.js требует от площадки трёх вещей: права держать свой процесс, свободного порта и предсказуемой памяти. Виртуальный хостинг ни одного из этих условий не даёт, а VPS с 1–2 ГБ и NVMe-диском закрывает всё сразу и стоит от 59 до 200 ₽/мес у большинства провайдеров каталога.
Дальше остаётся техника: PM2 или systemd держат приложение живым, Nginx закрывает HTTPS и статику, файл подкачки спасает сборку. Подобрать конфигурацию под конкретный сервис удобно в разделе VPS для ботов и небольших приложений — там собраны тарифы, на которых такие проекты и живут.