В статье я бы просто хотел поделиться всеми набитыми шишками, которые поймал пока впервые разворачивал проект CPanel+Node+Sequelize. Так как заняло это простое действие у меня не много не мало почти полный день, надеюсь изложенное ниже кому-то да пригодится.

Матерые волки скорее всего увидят здесь в основном скрытую рекламу Docker`а, но делаем скидку на опыт.

Среда, среда и еще раз среда

При разработке нужно обязательно выносить "за скобки" все данные, которые могут различаться на реальном хостинге и во время разработки. Самые очевидные места

  • URLы запросов. Оказывается в проекте созданном через create-react-app (возможно и в других обрешетках типа Vite,пока не проверял) существует очень удобный способ определения переменных среды. Создаем файлы .env.development, в котором храним данные для разработки, и env.production который сборщик использует при билде проекта. Записываем туда данные, не забывая префикс REACT_APP : в разработке это к примеру REACT_APP_BASE_API_URL=http://localhost:4000, в билде REACT_APP_BASE_API_URL=вашдомен . В проекте указываем process.env.REACT_APP_BASE_API_URL + "/адрес роута". При использовании ТС добавляем (process.env.REACT_APP_BASE_API_URL as string). Для разработки сервера на ноде - всем известная библиотека dotenv.

  • Тип БД. На самом деле не совсем очевидная вещь. Тут я нашел себе приключения на пару часов, причем по собственной глупости. При настройке Sequelize ORM нужно скачать и указать в конфиге соответствующий адаптер под свою БД. У меня локально стоит mysql. На сервере - mariaDB. В итоге после установки и попытке обращения по АПИ ты получаешь ответ с очень размытой ошибкой о том что запрос к бд не выполнен. Поиск ошибки в интернете само собой не дает абсолютно ничего. И даже если вы не используете ОРМ - вполне можно получить такие размытые ошибки, когда на удаленном сервере будет выполняться написанный вами специфический для вашей бд запрос, к примеру сравнение по датам.

  • dependencies/devdependencies . Очень важно уяснить для себя разницу. Я по глупости скопировал со стаковерфлоу команду с неверным флагом, в итоге во время деплоя ловил ошибки на хосте. Очевидное, легко лечится, но знать надо.

  • Если на сервере фронт работает не так как запланировано, не забывайте о разнице в скорости получения ответов от БД. Самое очевидное - проверить использования useEffect. В моем случае при первом деплое не вешался обработчик события из-за неверно указанной зависимости.

CPanel+node. Пара слов.

Сейчас уже "с коробки" есть возможность разворачивать свои приложения используя стандартное меню. О чем стоит сказать:

  • Для корректной работы приложения обязательно нужно выделить субдомен.

  • По умолчанию сервер упорно пытается на каждый запрос найти index.html.Заходим в папку domains/названиеВашегоСубдоменаСПриложением/publichtml и в файл .htaccess вносим правки - вставляем в конец файла "RewriteEngine On" и "RewriteBase / "

  • Если возникают проблемы с даунгрейдом версии установленного npm пакета или пакет не хочет устанавливаться , можно удалить свое приложение, предварительно остановив его, удалить папки .npm и .nodeenv в корне файловой системы. После этого локально сделать даунгрейд/необходимые действия и заново залить проект.

  • Хорошая привычка перезапускать приложение после любых действий в файловой системе хостинга.

  • Обязательно при создании приложения укажите файл для логирования и после установки (да, даже прошедшей успешно) проверьте его.

Вместо итога

Ранее я задавался вопросом - в чем сакральный смысл использования докера? И задеплоив несколько проектов, кажется, нашел ответ. Хотя паучье чутье подсказывает, что вторая моя статья вполне возможно будет называться «О чем нужно помнить начинающему веб‑разработчику перед использованием Docker»...