Сучасний shared хостинг із cPanel підтримує Node.js через Apache Passenger. Це дозволяє запускати Express, Next.js та інші застосунки Node.js без оренди VPS — Passenger сам керує процесом Node.js так само, як зазвичай керує воркерами PHP-FPM. Головна відмінність від класичного деплою на VPS у тому, що вам не потрібно самостійно налаштовувати reverse proxy чи systemd-сервіс — увесь життєвий цикл процесу (запуск, перезапуск при падінні, зупинка при простої) бере на себе Apache через модуль mod_passenger.
Запуск Node.js через cPanel
Крок 1: Setup Node.js App
cPanel → Software → Setup Node.js App → Create Application.
| Поле | Приклад |
|---|---|
| Node.js version | 20.x LTS |
| Application mode | Production |
| Application root | myapp |
| Application URL | example.com/app або subdomain |
| Application startup file | app.js |
Крок 2: Завантажити файли
# Структура застосунку в ~/myapp/
myapp/
├── app.js (точка входу)
├── package.json
└── node_modules/ (створиться під час npm install)
Крок 3: Встановити залежності
У Setup Node.js App натисніть «Run NPM Install» або через SSH:
cd ~/myapp
npm install
Крок 4: Мінімальний app.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.send('Hello from Node.js on cPanel!');
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
Типова помилка запуску
Якщо залежності не встановлені або вказано неправильний стартовий файл, під час звернення до сайту з'являється стандартна сторінка Passenger із текстом:
Web application could not be started
Error: Cannot find module 'express'
Require stack:
- /home/user/myapp/app.js
Це означає, що npm install не виконувався в тій самій версії Node.js, що вказана в Setup Node.js App, або папка node_modules була скопійована з іншого сервера — нативні модулі з бінарними залежностями (наприклад, bcrypt, sharp) збираються під конкретну версію Node.js і архітектуру і не переносяться між середовищами. Рішення — видалити node_modules і виконати npm install заново через інтерфейс Setup Node.js App, який активує потрібне середовище автоматично.
Змінні середовища
В інтерфейсі Setup Node.js App → Add Variable:
NODE_ENV=production
DATABASE_URL=mysql://user:pass@localhost/dbname
API_KEY=your_secret_key
Passenger автоматично керує процесом — перезапускає при збої, не потрібен PM2. Порт призначається автоматично через змінну process.env.PORT — не хардкодьте 3000 чи будь-який інший порт у production, інакше застосунок не запуститься, якщо цей порт вже зайнятий іншим сайтом на сервері.
Проксування через .htaccess для нестандартного шляху
# Якщо Application URL вказує на підпапку, а не корінь домену,
# Setup Node.js App створює .htaccess автоматично:
PassengerAppRoot "/home/user/myapp"
PassengerBaseURI "/app"
PassengerAppType node
PassengerStartupFile app.js
Ці директиви прописуються в .htaccess кореня домену чи підпапки — редагувати їх вручну зазвичай не потрібно, але якщо файл випадково видалено чи перезаписано іншим деплоєм, застосунок перестане відкриватися з помилкою 404, хоча процес Node.js продовжує працювати у фоні. У такому разі допомагає повторне збереження налаштувань у Setup Node.js App — інтерфейс перезаписує .htaccess із правильними директивами без потреби чіпати файл вручну.
Коли Node.js на shared-хостингу не підходить
- Застосунку потрібні постійні WebSocket-з'єднання з великою кількістю одночасних клієнтів — Passenger на shared-тарифах обмежує кількість процесів і не розрахований на тисячі довгоживучих сокетів
- Потрібні фонові завдання і черги (cron-воркери, обробка відео) — LVE обмежує CPU і пам'ять процесу, тривалі обчислення будуть примусово зупинені
- Потрібен root-доступ для встановлення системних залежностей нативних модулів — на shared-хостингу немає sudo, компіляція деяких пакетів із C++ біндингами може не пройти
- Проєкт використовує Docker або потребує конкретну версію інфраструктури (Redis, RabbitMQ) на тому самому сервері — shared-хостинг із cPanel таких сервісів не надає, потрібен VPS
Перевірка результату
curl -I https://example.com/app/
# Очікуємо: HTTP/1.1 200 OK
# Логи застосунку знаходяться в:
~/nodevenv/myapp/20/logs/
Якщо curl повертає 502 Bad Gateway, значить процес Node.js впав одразу після старту — дивіться вивід в інтерфейсі Setup Node.js App або в логах Passenger, там буде точний stack trace помилки, а не лише загальне повідомлення «application could not be started», яке бачить відвідувач сайту. Детальніше про розбір логів помилок у cPanel — у статті логи помилок у cPanel, а про SSH-доступ для налагодження — у статті SSH-доступ на хостингу cPanel.